summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/SERVICES/HIF/PCIe/if_pci.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.c b/CORE/SERVICES/HIF/PCIe/if_pci.c
index b538909abf41..15ec3dfad2b0 100644
--- a/CORE/SERVICES/HIF/PCIe/if_pci.c
+++ b/CORE/SERVICES/HIF/PCIe/if_pci.c
@@ -70,7 +70,13 @@
#define AR6320_FW_2_0 (0x20)
#define AR6320_FW_3_0 (0x30)
+#ifdef CONFIG_SLUB_DEBUG_ON
+#define MAX_NUM_OF_RECEIVES 400 /* Maximum number of Rx buf to process before*
+ break out in SLUB debug builds */
+#else
#define MAX_NUM_OF_RECEIVES 1000 /* Maximum number of Rx buf to process before break out */
+#endif
+
#define PCIE_WAKE_TIMEOUT 1000 /* Maximum ms timeout for host to wake up target */
#define RAMDUMP_EVENT_TIMEOUT 2500
@@ -539,6 +545,36 @@ CE_per_engine_handler(int irq, void *arg)
return IRQ_HANDLED;
}
+#ifdef CONFIG_SLUB_DEBUG_ON
+
+/* worker thread to schedule wlan_tasklet in SLUB debug build */
+static void reschedule_tasklet_work_handler(struct work_struct *recovery)
+{
+ void *vos_context = vos_get_global_context(VOS_MODULE_ID_HIF, NULL);
+ struct ol_softc *scn = vos_get_context(VOS_MODULE_ID_HIF, vos_context);
+ struct hif_pci_softc *sc;
+
+ if (NULL == scn){
+ printk(KERN_ERR "%s: tasklet scn is null\n", __func__);
+ return;
+ }
+
+ sc = scn->hif_sc;
+
+ if (sc->hif_init_done == FALSE) {
+ printk(KERN_ERR "%s: wlan driver is unloaded\n", __func__);
+ return;
+ }
+
+ tasklet_schedule(&sc->intr_tq);
+ return;
+}
+
+static DECLARE_WORK(reschedule_tasklet_work, reschedule_tasklet_work_handler);
+
+#endif
+
+
static void
wlan_tasklet(unsigned long data)
{
@@ -568,7 +604,11 @@ wlan_tasklet(unsigned long data)
* any of the Copy Engine pipes.
*/
adf_os_atomic_set(&sc->ce_suspend, 1);
+#ifdef CONFIG_SLUB_DEBUG_ON
+ schedule_work(&reschedule_tasklet_work);
+#else
tasklet_schedule(&sc->intr_tq);
+#endif
return;
}
irq_handled: