wl1271: set wl->vif only if add_interface succeeded.
[pandora-kernel.git] / drivers / net / wireless / wl12xx / wl1271_main.c
index c54887c..a3a1ebc 100644 (file)
@@ -950,18 +950,19 @@ static int wl1271_op_add_interface(struct ieee80211_hw *hw,
        struct wiphy *wiphy = hw->wiphy;
        int retries = WL1271_BOOT_RETRIES;
        int ret = 0;
+       bool booted = false;
 
        wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
                     vif->type, vif->addr);
 
        mutex_lock(&wl->mutex);
        if (wl->vif) {
+               wl1271_debug(DEBUG_MAC80211,
+                            "multiple vifs are not supported yet");
                ret = -EBUSY;
                goto out;
        }
 
-       wl->vif = vif;
-
        switch (vif->type) {
        case NL80211_IFTYPE_STATION:
                wl->bss_type = BSS_TYPE_STA_BSS;
@@ -999,15 +1000,8 @@ static int wl1271_op_add_interface(struct ieee80211_hw *hw,
                if (ret < 0)
                        goto irq_disable;
 
-               wl->state = WL1271_STATE_ON;
-               wl1271_info("firmware booted (%s)", wl->chip.fw_ver);
-
-               /* update hw/fw version info in wiphy struct */
-               wiphy->hw_version = wl->chip.id;
-               strncpy(wiphy->fw_version, wl->chip.fw_ver,
-                       sizeof(wiphy->fw_version));
-
-               goto out;
+               booted = true;
+               break;
 
 irq_disable:
                wl1271_disable_interrupts(wl);
@@ -1025,8 +1019,21 @@ power_off:
                wl1271_power_off(wl);
        }
 
-       wl1271_error("firmware boot failed despite %d retries",
-                    WL1271_BOOT_RETRIES);
+       if (!booted) {
+               wl1271_error("firmware boot failed despite %d retries",
+                            WL1271_BOOT_RETRIES);
+               goto out;
+       }
+
+       wl->vif = vif;
+       wl->state = WL1271_STATE_ON;
+       wl1271_info("firmware booted (%s)", wl->chip.fw_ver);
+
+       /* update hw/fw version info in wiphy struct */
+       wiphy->hw_version = wl->chip.id;
+       strncpy(wiphy->fw_version, wl->chip.fw_ver,
+               sizeof(wiphy->fw_version));
+
 out:
        mutex_unlock(&wl->mutex);