wl12xx: call stop() on recovery
authorEliad Peller <eliad@wizery.com>
Mon, 10 Oct 2011 08:13:14 +0000 (10:13 +0200)
committerLuciano Coelho <coelho@ti.com>
Tue, 11 Oct 2011 12:12:13 +0000 (15:12 +0300)
The recovery work should call stop() after it removed
all the existing interfaces.

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

index 08fc9d4642884ee1a147095b956d86aca99cc562..433a06fae40bac78bf037cb4cd3d8df0fd92c1be 100644 (file)
@@ -379,6 +379,7 @@ static bool bug_on_recovery;
 static void __wl1271_op_remove_interface(struct wl1271 *wl,
                                         struct ieee80211_vif *vif,
                                         bool reset_tx_queues);
+static void wl1271_op_stop(struct ieee80211_hw *hw);
 static void wl1271_free_ap_keys(struct wl1271 *wl, struct wl12xx_vif *wlvif);
 
 
@@ -1220,7 +1221,7 @@ static void wl1271_recovery_work(struct work_struct *work)
        mutex_lock(&wl->mutex);
 
        if (wl->state != WL1271_STATE_ON)
-               goto out;
+               goto out_unlock;
 
        /* Avoid a recursive recovery */
        set_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
@@ -1259,6 +1260,8 @@ static void wl1271_recovery_work(struct work_struct *work)
                vif = wl12xx_wlvif_to_vif(wlvif);
                __wl1271_op_remove_interface(wl, vif, false);
        }
+       mutex_unlock(&wl->mutex);
+       wl1271_op_stop(wl->hw);
 
        clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
 
@@ -1269,8 +1272,8 @@ static void wl1271_recovery_work(struct work_struct *work)
         * to restart the HW.
         */
        ieee80211_wake_queues(wl->hw);
-
-out:
+       return;
+out_unlock:
        mutex_unlock(&wl->mutex);
 }