net: wireless: bcm4329: Disable wake irq at driver stop
authorDmitry Shmidt <dimitrysh@google.com>
Thu, 10 Mar 2011 00:52:08 +0000 (16:52 -0800)
committermgross <mark.gross@intel.com>
Wed, 9 Nov 2011 20:07:23 +0000 (12:07 -0800)
Previously at driver stop interrupts were not disabled and
might cause never-ending waking up

Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
drivers/net/wireless/bcm4329/bcmsdh_linux.c
drivers/net/wireless/bcm4329/dhd_sdio.c

index 1e33555..94f19a1 100644 (file)
@@ -643,6 +643,20 @@ int bcmsdh_register_oob_intr(void * dhdp)
        return 0;
 }
 
+void bcmsdh_set_irq(int flag)
+{
+       if (sdhcinfo->oob_irq_registered) {
+               SDLX_MSG(("%s Flag = %d", __FUNCTION__, flag));
+               if (flag) {
+                       enable_irq(sdhcinfo->oob_irq);
+                       enable_irq_wake(sdhcinfo->oob_irq);
+               } else {
+                       disable_irq_wake(sdhcinfo->oob_irq);
+                       disable_irq(sdhcinfo->oob_irq);
+               }
+       }
+}
+
 void bcmsdh_unregister_oob_intr(void)
 {
        SDLX_MSG(("%s: Enter\n", __FUNCTION__));
index f9b9ece..1380dd3 100644 (file)
 DHD_SPINWAIT_SLEEP_INIT(sdioh_spinwait_sleep);
 extern int dhdcdc_set_ioctl(dhd_pub_t *dhd, int ifidx, uint cmd, void *buf, uint len);
 
+extern void bcmsdh_set_irq(int flag);
+
 #ifdef DHD_DEBUG
 /* Device console log buffer state */
 typedef struct dhd_console {
@@ -5749,7 +5751,9 @@ dhd_bus_devreset(dhd_pub_t *dhdp, uint8 flag)
                        /* Expect app to have torn down any connection before calling */
                        /* Stop the bus, disable F2 */
                        dhd_bus_stop(bus, FALSE);
-
+#if defined(OOB_INTR_ONLY)
+                       bcmsdh_set_irq(FALSE);
+#endif /* defined(OOB_INTR_ONLY) */
                        /* Clean tx/rx buffer pointers, detach from the dongle */
                        dhdsdio_release_dongle(bus, bus->dhd->osh, TRUE);
 
@@ -5785,6 +5789,7 @@ dhd_bus_devreset(dhd_pub_t *dhdp, uint8 flag)
                                        bcmerror = dhd_bus_init((dhd_pub_t *) bus->dhd, FALSE);
                                        if (bcmerror == BCME_OK) {
 #if defined(OOB_INTR_ONLY)
+                                               bcmsdh_set_irq(TRUE);
                                                dhd_enable_oob_intr(bus, TRUE);
 #endif /* defined(OOB_INTR_ONLY) */
                                                bus->dhd->dongle_reset = FALSE;