wl1271: Fix IRQ enable handling on FW init failure
authorJuuso Oikarinen <juuso.oikarinen@nokia.com>
Tue, 13 Oct 2009 09:47:45 +0000 (12:47 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 27 Oct 2009 20:48:09 +0000 (16:48 -0400)
Disable IRQ's after FW initialization failure - originally this was not
done in all cases, and it resulted in a kernel warning if firmware
initialization was tried again without reboot.

Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/wl12xx/wl1271_boot.c
drivers/net/wireless/wl12xx/wl1271_init.c
drivers/net/wireless/wl12xx/wl1271_main.c

index a27601dc9c0dc565bcaee6944340bc05727b5d10..b8a37a84842f9e21f75dc6ea9e847c7b9c205198 100644 (file)
@@ -400,9 +400,6 @@ static int wl1271_boot_run_firmware(struct wl1271 *wl)
         * ready to receive event from the command mailbox
         */
 
-       /* enable gpio interrupts */
-       wl1271_boot_enable_interrupts(wl);
-
        /* unmask required mbox events  */
        wl->event_mask = BSS_LOSE_EVENT_ID |
                SCAN_COMPLETE_EVENT_ID;
@@ -540,6 +537,9 @@ int wl1271_boot(struct wl1271 *wl)
        if (ret < 0)
                goto out;
 
+       /* Enable firmware interrupts now */
+       wl1271_boot_enable_interrupts(wl);
+
        /* set the wl1271 default filters */
        wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
        wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
index 5c2cf1e00ac7f1f5ad6f259b3ebc6681dc1ac669..6f21eeae5246ff9ae28a88f6a02309e6885e0d6a 100644 (file)
@@ -315,8 +315,8 @@ int wl1271_hw_init(struct wl1271 *wl)
 
        /* RX config */
        ret = wl1271_init_rx_config(wl,
-                                      RX_CFG_PROMISCUOUS | RX_CFG_TSF,
-                                      RX_FILTER_OPTION_DEF);
+                                   RX_CFG_PROMISCUOUS | RX_CFG_TSF,
+                                   RX_FILTER_OPTION_DEF);
        /* RX_CONFIG_OPTION_ANY_DST_ANY_BSS,
           RX_FILTER_OPTION_FILTER_ALL); */
        if (ret < 0)
index eba38dff871bf30b499b31439fb356ed7c8741ca..7f1093cd816c9b58c1d57646ba23ae086f8c91bb 100644 (file)
@@ -625,7 +625,7 @@ static int wl1271_chip_wakeup(struct wl1271 *wl)
 
                ret = wl1271_setup(wl);
                if (ret < 0)
-                       goto out;
+                       goto out_power_off;
                break;
        case CHIP_ID_1271_PG20:
                wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
@@ -633,27 +633,32 @@ static int wl1271_chip_wakeup(struct wl1271 *wl)
 
                ret = wl1271_setup(wl);
                if (ret < 0)
-                       goto out;
+                       goto out_power_off;
                break;
        default:
                wl1271_error("unsupported chip id: 0x%x", wl->chip.id);
                ret = -ENODEV;
-               goto out;
+               goto out_power_off;
        }
 
        if (wl->fw == NULL) {
                ret = wl1271_fetch_firmware(wl);
                if (ret < 0)
-                       goto out;
+                       goto out_power_off;
        }
 
        /* No NVS from netlink, try to get it from the filesystem */
        if (wl->nvs == NULL) {
                ret = wl1271_fetch_nvs(wl);
                if (ret < 0)
-                       goto out;
+                       goto out_power_off;
        }
 
+       goto out;
+
+out_power_off:
+       wl1271_power_off(wl);
+
 out:
        return ret;
 }
@@ -749,13 +754,21 @@ int wl1271_plt_start(struct wl1271 *wl)
 
        ret = wl1271_boot(wl);
        if (ret < 0)
-               goto out;
+               goto out_power_off;
 
        wl1271_notice("firmware booted in PLT mode (%s)", wl->chip.fw_ver);
 
        ret = wl1271_plt_init(wl);
        if (ret < 0)
-               goto out;
+               goto out_irq_disable;
+
+       goto out;
+
+out_irq_disable:
+       wl1271_disable_interrupts(wl);
+
+out_power_off:
+       wl1271_power_off(wl);
 
 out:
        mutex_unlock(&wl->mutex);
@@ -843,20 +856,25 @@ static int wl1271_op_start(struct ieee80211_hw *hw)
 
        ret = wl1271_boot(wl);
        if (ret < 0)
-               goto out;
+               goto out_power_off;
 
        ret = wl1271_hw_init(wl);
        if (ret < 0)
-               goto out;
+               goto out_irq_disable;
 
        wl->state = WL1271_STATE_ON;
 
        wl1271_info("firmware booted (%s)", wl->chip.fw_ver);
 
-out:
-       if (ret < 0)
-               wl1271_power_off(wl);
+       goto out;
+
+out_irq_disable:
+       wl1271_disable_interrupts(wl);
 
+out_power_off:
+       wl1271_power_off(wl);
+
+out:
        mutex_unlock(&wl->mutex);
 
        return ret;