summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Liu <kaliu@codeaurora.org>2017-06-01 19:10:46 +0800
committersnandini <snandini@codeaurora.org>2017-06-15 17:43:02 -0700
commit6f72a8be4352b47467001ce8974628cef523a265 (patch)
treef04b1cd788e3992dbebe5326c85b6ebc80cf2b85
parent83dadd75844bcd5141cb5c568f4ff4f373329ef9 (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.h14
-rw-r--r--hif/src/sdio/native_sdio/src/hif.c24
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);