]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/wireless/wl12xx/wl1271_event.c
Merge tag 'v2.6.37' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / net / wireless / wl12xx / wl1271_event.c
index 25ce2cd5e3f3fa406f1d7fb3aa574da9d5113631..7b3f503829631018630ca21e9faa67f840db10c8 100644 (file)
@@ -41,6 +41,9 @@ void wl1271_pspoll_work(struct work_struct *work)
 
        mutex_lock(&wl->mutex);
 
+       if (unlikely(wl->state == WL1271_STATE_OFF))
+               goto out;
+
        if (!test_and_clear_bit(WL1271_FLAG_PSPOLL_FAILURE, &wl->flags))
                goto out;
 
@@ -52,7 +55,7 @@ void wl1271_pspoll_work(struct work_struct *work)
         * delivery failure occurred, and no-one changed state since, so
         * we should go back to powersave.
         */
-       wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE, true);
+       wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE, wl->basic_rate, true);
 
 out:
        mutex_unlock(&wl->mutex);
@@ -70,7 +73,8 @@ static void wl1271_event_pspoll_delivery_fail(struct wl1271 *wl)
 
        /* force active mode receive data from the AP */
        if (test_bit(WL1271_FLAG_PSM, &wl->flags)) {
-               ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE, true);
+               ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
+                                        wl->basic_rate, true);
                if (ret < 0)
                        return;
                set_bit(WL1271_FLAG_PSPOLL_FAILURE, &wl->flags);
@@ -91,6 +95,7 @@ static int wl1271_event_ps_report(struct wl1271 *wl,
                                  bool *beacon_loss)
 {
        int ret = 0;
+       u32 total_retries = wl->conf.conn.psm_entry_retries;
 
        wl1271_debug(DEBUG_EVENT, "ps_status: 0x%x", mbox->ps_status);
 
@@ -104,10 +109,10 @@ static int wl1271_event_ps_report(struct wl1271 *wl,
                        break;
                }
 
-               if (wl->psm_entry_retry < wl->conf.conn.psm_entry_retries) {
+               if (wl->psm_entry_retry < total_retries) {
                        wl->psm_entry_retry++;
                        ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
-                                                true);
+                                                wl->basic_rate, true);
                } else {
                        wl1271_info("No ack to nullfunc from AP.");
                        wl->psm_entry_retry = 0;
@@ -143,7 +148,7 @@ static int wl1271_event_ps_report(struct wl1271 *wl,
                /* make sure the firmware goes to active mode - the frame to
                   be sent next will indicate to the AP, that we are active. */
                ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
-                                        false);
+                                        wl->basic_rate, false);
                break;
        case EVENT_EXIT_POWER_SAVE_SUCCESS:
        default: