wl1271: prevent power save entry while not associated
authorJuuso Oikarinen <juuso.oikarinen@nokia.com>
Fri, 11 Dec 2009 13:41:00 +0000 (15:41 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 28 Dec 2009 21:31:34 +0000 (16:31 -0500)
The mac80211 sometimes requests power save entry while not associated - this
will cause problems, so prevent it if not associated. Go to powersave once
association is complete.

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.h
drivers/net/wireless/wl12xx/wl1271_main.c

index 4b5ddba96f0b0f7263af4bc2ca4cfa90798fed3c..81e1c9531a3a434e53938fc0b955872b40f76fae 100644 (file)
@@ -416,6 +416,7 @@ struct wl1271 {
 
        /* PSM mode requested */
        bool psm_requested;
+       bool associated;
 
        /* retry counter for PSM entries */
        u8 psm_entry_retry;
index d507dae19e17a32b7d82d4566ae86148c2327159..d07f03565196c971e183adfc7ce0eec3f6c2821c 100644 (file)
@@ -978,6 +978,7 @@ static void wl1271_op_stop(struct ieee80211_hw *hw)
        wl->elp = false;
        wl->psm = 0;
        wl->psm_entry_retry = 0;
+       wl->associated = false;
        wl->tx_queue_stopped = false;
        wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
        wl->tx_blocks_available = 0;
@@ -1191,8 +1192,6 @@ static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
                wl1271_join_channel(wl, channel);
 
        if (conf->flags & IEEE80211_CONF_PS && !wl->psm_requested) {
-               wl1271_info("psm enabled");
-
                wl->psm_requested = true;
 
                /*
@@ -1200,7 +1199,10 @@ static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
                 * If we're not, we'll enter it when joining an SSID,
                 * through the bss_info_changed() hook.
                 */
-               ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE);
+               if (wl->associated) {
+                       wl1271_info("psm enabled");
+                       ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE);
+               }
        } else if (!(conf->flags & IEEE80211_CONF_PS) &&
                   wl->psm_requested) {
                wl1271_info("psm disabled");
@@ -1548,6 +1550,7 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
        if (changed & BSS_CHANGED_ASSOC) {
                if (bss_conf->assoc) {
                        wl->aid = bss_conf->aid;
+                       wl->associated = true;
 
                        /*
                         * with wl1271, we don't need to update the
@@ -1572,6 +1575,7 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
                        }
                } else {
                        /* use defaults when not associated */
+                       wl->associated = false;
                        wl->aid = 0;
                }
 
@@ -1898,6 +1902,7 @@ static int __devinit wl1271_probe(struct spi_device *spi)
        wl->psm = 0;
        wl->psm_requested = false;
        wl->psm_entry_retry = 0;
+       wl->associated = false;
        wl->tx_queue_stopped = false;
        wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
        wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;