wl12xx_sdio: enable wowlan only if enable_irq_wake() succeeded
authorEliad Peller <eliad@wizery.com>
Mon, 6 Jun 2011 09:21:55 +0000 (12:21 +0300)
committerLuciano Coelho <coelho@ti.com>
Mon, 27 Jun 2011 10:35:53 +0000 (13:35 +0300)
Some platforms don't support the wake_irq, so disable wowlan
in this case, and avoid the "Unbalanced IRQ wake disable"
warning on disable_irq_wake().

Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/wl12xx/sdio.c
drivers/net/wireless/wl12xx/wl12xx.h

index 25215199049f14edd2104a931f72b7a5cc081069..4dc4573b686175eacbf585bf12b54d95855ab6af 100644 (file)
@@ -272,17 +272,19 @@ static int __devinit wl1271_probe(struct sdio_func *func,
                goto out_free;
        }
 
-       enable_irq_wake(wl->irq);
-       device_init_wakeup(wl1271_sdio_wl_to_dev(wl), 1);
+       ret = enable_irq_wake(wl->irq);
+       if (!ret) {
+               wl->irq_wake_enabled = true;
+               device_init_wakeup(wl1271_sdio_wl_to_dev(wl), 1);
 
-       disable_irq(wl->irq);
-
-       /* if sdio can keep power while host is suspended, enable wow */
-       mmcflags = sdio_get_host_pm_caps(func);
-       wl1271_debug(DEBUG_SDIO, "sdio PM caps = 0x%x", mmcflags);
+               /* if sdio can keep power while host is suspended, enable wow */
+               mmcflags = sdio_get_host_pm_caps(func);
+               wl1271_debug(DEBUG_SDIO, "sdio PM caps = 0x%x", mmcflags);
 
-       if (mmcflags & MMC_PM_KEEP_POWER)
-               hw->wiphy->wowlan.flags = WIPHY_WOWLAN_ANY;
+               if (mmcflags & MMC_PM_KEEP_POWER)
+                       hw->wiphy->wowlan.flags = WIPHY_WOWLAN_ANY;
+       }
+       disable_irq(wl->irq);
 
        ret = wl1271_init_ieee80211(wl);
        if (ret)
@@ -316,8 +318,10 @@ static void __devexit wl1271_remove(struct sdio_func *func)
        pm_runtime_get_noresume(&func->dev);
 
        wl1271_unregister_hw(wl);
-       device_init_wakeup(wl1271_sdio_wl_to_dev(wl), 0);
-       disable_irq_wake(wl->irq);
+       if (wl->irq_wake_enabled) {
+               device_init_wakeup(wl1271_sdio_wl_to_dev(wl), 0);
+               disable_irq_wake(wl->irq);
+       }
        free_irq(wl->irq, wl);
        wl1271_free_hw(wl);
 }
index 8d6c8f2584136903e9769a201ba0ef9a509df2fe..145a14c22583fa1d36d27a13f4eac77b50763666 100644 (file)
@@ -580,6 +580,7 @@ struct wl1271 {
         * (currently, only "ANY" trigger is supported)
         */
        bool wow_enabled;
+       bool irq_wake_enabled;
 
        /*
         * AP-mode - links indexed by HLID. The global and broadcast links