wl12xx: make WL1271_FLAG_CS_PROGRESS flag per-vif
authorEliad Peller <eliad@wizery.com>
Mon, 10 Oct 2011 08:13:08 +0000 (10:13 +0200)
committerLuciano Coelho <coelho@ti.com>
Tue, 11 Oct 2011 12:12:12 +0000 (15:12 +0300)
This flag should be set per-vif, rather than globally.

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

index 1f60a1f6335ef3c331708c721c5c7b7b43e6a7d6..a47312db5a2a46aaca4ae05c780aa9d30acbf847 100644 (file)
@@ -345,16 +345,18 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
                 * 1) channel switch complete with status=0
                 * 2) channel switch failed status=1
                 */
-               if (test_and_clear_bit(WL1271_FLAG_CS_PROGRESS, &wl->flags)) {
-                       /* TODO: configure only the relevant vif */
-                       wl12xx_for_each_wlvif_sta(wl, wlvif) {
-                               struct ieee80211_vif *vif =
-                                       wl12xx_wlvif_to_vif(wlvif);
-                               bool success = mbox->channel_switch_status ?
-                                       false : true;
-
-                               ieee80211_chswitch_done(vif, success);
-                       }
+
+               /* TODO: configure only the relevant vif */
+               wl12xx_for_each_wlvif_sta(wl, wlvif) {
+                       struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
+                       bool success;
+
+                       if (!test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS,
+                                               &wl->flags))
+                               continue;
+
+                       success = mbox->channel_switch_status ? false : true;
+                       ieee80211_chswitch_done(vif, success);
                }
        }
 
index 73973b4fc57fa89f5243f22d489be43b2bb565ad..0647d460b698e42f652caab8adabdd53202d10e9 100644 (file)
@@ -2317,7 +2317,7 @@ static int wl1271_unjoin(struct wl1271 *wl, struct wl12xx_vif *wlvif)
 {
        int ret;
 
-       if (test_and_clear_bit(WL1271_FLAG_CS_PROGRESS, &wl->flags)) {
+       if (test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags)) {
                wl12xx_cmd_stop_channel_switch(wl);
                ieee80211_chswitch_done(wl->vif, false);
        }
@@ -4275,6 +4275,7 @@ static void wl12xx_op_channel_switch(struct ieee80211_hw *hw,
                                     struct ieee80211_channel_switch *ch_switch)
 {
        struct wl1271 *wl = hw->priv;
+       struct wl12xx_vif *wlvif;
        int ret;
 
        wl1271_debug(DEBUG_MAC80211, "mac80211 channel switch");
@@ -4291,10 +4292,13 @@ static void wl12xx_op_channel_switch(struct ieee80211_hw *hw,
        if (ret < 0)
                goto out;
 
-       ret = wl12xx_cmd_channel_switch(wl, ch_switch);
+       /* TODO: change mac80211 to pass vif as param */
+       wl12xx_for_each_wlvif_sta(wl, wlvif) {
+               ret = wl12xx_cmd_channel_switch(wl, ch_switch);
 
-       if (!ret)
-               set_bit(WL1271_FLAG_CS_PROGRESS, &wl->flags);
+               if (!ret)
+                       set_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags);
+       }
 
        wl1271_ps_elp_sleep(wl);
 
index bf410f8d01cb0ccc37bd235f73d218acda60dcf4..fc8c9758fc0c76b60150dff861f28c60960e12c6 100644 (file)
@@ -326,7 +326,6 @@ enum wl12xx_flags {
        WL1271_FLAG_PENDING_WORK,
        WL1271_FLAG_SOFT_GEMINI,
        WL1271_FLAG_RECOVERY_IN_PROGRESS,
-       WL1271_FLAG_CS_PROGRESS,
 };
 
 enum wl12xx_vif_flags {
@@ -339,6 +338,7 @@ enum wl12xx_vif_flags {
        WLVIF_FLAG_STA_STATE_SENT,
        WLVIF_FLAG_RX_STREAMING_STARTED,
        WLVIF_FLAG_PSPOLL_FAILURE,
+       WLVIF_FLAG_CS_PROGRESS,
 };
 
 struct wl1271_link {