wl12xx: avoid bug_on_recovery during fw switch
authorEliad Peller <eliad@wizery.com>
Sun, 4 Mar 2012 08:55:54 +0000 (10:55 +0200)
committerLuciano Coelho <coelho@ti.com>
Mon, 5 Mar 2012 13:45:26 +0000 (15:45 +0200)
Add a flag to indicate we initiated a recovery work
on purpose, in order to avoid triggering BUG() (when
the bug_on_recovery module param was set).

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

index 89bf9eadc840b4f266734a47e30c72cba7bf9143..3c966f2e00d0ce2944f75d7bbf176e14faa1f858 100644 (file)
@@ -1154,7 +1154,8 @@ static void wl1271_recovery_work(struct work_struct *work)
        wl1271_info("Hardware recovery in progress. FW ver: %s pc: 0x%x",
                    wl->chip.fw_ver_str, wl1271_read32(wl, SCR_PAD4));
 
-       BUG_ON(bug_on_recovery);
+       BUG_ON(bug_on_recovery &&
+              !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags));
 
        /*
         * Advance security sequence number to overcome potential progress
@@ -2133,6 +2134,7 @@ static int wl1271_op_add_interface(struct ieee80211_hw *hw,
 
        if (wl12xx_need_fw_change(wl, vif_count, true)) {
                wl12xx_force_active_psm(wl);
+               set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
                mutex_unlock(&wl->mutex);
                wl1271_recovery_work(&wl->recovery_work);
                return 0;
@@ -2317,6 +2319,7 @@ static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
        WARN_ON(iter != wlvif);
        if (wl12xx_need_fw_change(wl, vif_count, false)) {
                wl12xx_force_active_psm(wl);
+               set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
                wl12xx_queue_recovery_work(wl);
                cancel_recovery = false;
        }
index b26b1be9a98b539a0dec2aed4b12532b658bc73a..6e13a3073e9fcc9d1fa40eefa55e54c4fb9df40d 100644 (file)
@@ -260,6 +260,7 @@ enum wl12xx_flags {
        WL1271_FLAG_SOFT_GEMINI,
        WL1271_FLAG_RECOVERY_IN_PROGRESS,
        WL1271_FLAG_VIF_CHANGE_IN_PROGRESS,
+       WL1271_FLAG_INTENDED_FW_RECOVERY,
 };
 
 enum wl12xx_vif_flags {