diff options
| author | Kai Liu <kaliu@codeaurora.org> | 2017-06-01 19:10:46 +0800 |
|---|---|---|
| committer | snandini <snandini@codeaurora.org> | 2017-06-15 17:43:02 -0700 |
| commit | 6f72a8be4352b47467001ce8974628cef523a265 (patch) | |
| tree | f04b1cd788e3992dbebe5326c85b6ebc80cf2b85 | |
| parent | 83dadd75844bcd5141cb5c568f4ff4f373329ef9 (diff) | |
qcacmn: add global record for sdio bus request
qcacld-2.0 to qcacmn propagation
If too many interruptions are issued in short time, alloc sdio bus request
may fail, then error log will be print which cause watchdog bite.
Change-Id: I723e859eef837bcaf34d73398f136a3312a39154
CRs-Fixed: 2058302
| -rw-r--r-- | hif/src/sdio/native_sdio/include/hif_internal.h | 14 | ||||
| -rw-r--r-- | hif/src/sdio/native_sdio/src/hif.c | 24 |
2 files changed, 35 insertions, 3 deletions
diff --git a/hif/src/sdio/native_sdio/include/hif_internal.h b/hif/src/sdio/native_sdio/include/hif_internal.h index e974d1b2e6d7..ae58503dcdb0 100644 --- a/hif/src/sdio/native_sdio/include/hif_internal.h +++ b/hif/src/sdio/native_sdio/include/hif_internal.h @@ -181,6 +181,20 @@ enum hif_sdio_device_state { HIF_DEVICE_STATE_WOW }; +/** + * struct bus_request_record - basic bus request struct + * @request: request info + * @address: address of sdio register + * @len: length of register that this request will read or write + * @time: record time + */ +struct bus_request_record { + u_int32_t request; + u_int32_t address; + u_int32_t len; + u_int64_t time; +}; + struct bus_request { struct bus_request *next; /* link list of available requests */ struct bus_request *inusenext; /* link list of in use requests */ diff --git a/hif/src/sdio/native_sdio/src/hif.c b/hif/src/sdio/native_sdio/src/hif.c index 0b544096af43..af8b78d6bbaa 100644 --- a/hif/src/sdio/native_sdio/src/hif.c +++ b/hif/src/sdio/native_sdio/src/hif.c @@ -55,6 +55,23 @@ #define ATH_MODULE_NAME hif #include "a_debug.h" +#define BUS_REQ_RECORD_SIZE 100 +u_int32_t g_bus_req_buf_idx = 0; +qdf_spinlock_t g_bus_request_record_lock; +struct bus_request_record bus_request_record_buf[BUS_REQ_RECORD_SIZE]; + +#define BUS_REQUEST_RECORD(r, a, l) { \ + qdf_spin_lock_irqsave(&g_bus_request_record_lock); \ + if (g_bus_req_buf_idx == BUS_REQ_RECORD_SIZE) \ + g_bus_req_buf_idx = 0; \ + bus_request_record_buf[g_bus_req_buf_idx].request = r; \ + bus_request_record_buf[g_bus_req_buf_idx].address = a; \ + bus_request_record_buf[g_bus_req_buf_idx].len = l; \ + bus_request_record_buf[g_bus_req_buf_idx].time = qdf_get_monotonic_boottime(); \ + g_bus_req_buf_idx++; \ + qdf_spin_unlock_irqrestore(&g_bus_request_record_lock); \ +} + #if HIF_USE_DMA_BOUNCE_BUFFER /* macro to check if DMA buffer is WORD-aligned and DMA-able. * Most host controllers assume the @@ -633,11 +650,12 @@ hif_read_write(struct hif_sdio_dev *device, : "Synch")); busrequest = hif_allocate_bus_request(device); if (busrequest == NULL) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, + AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("no async bus requests available (%s, addr:0x%X, len:%d)\n", request & HIF_SDIO_READ ? "READ" : "WRITE", address, length)); - return QDF_STATUS_E_FAILURE; + BUS_REQUEST_RECORD(request, address, length); + return QDF_STATUS_E_CANCELED; } busrequest->address = address; busrequest->buffer = buffer; @@ -1786,8 +1804,8 @@ static int hif_device_inserted(struct sdio_func *func, } qdf_spinlock_create(&device->lock); - qdf_spinlock_create(&device->asynclock); + qdf_spinlock_create(&g_bus_request_record_lock); DL_LIST_INIT(&device->scatter_req_head); |
