wl1271: Disconnect if PSM entry fails
authorJuuso Oikarinen <juuso.oikarinen@nokia.com>
Fri, 26 Mar 2010 10:53:29 +0000 (12:53 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 31 Mar 2010 18:39:15 +0000 (14:39 -0400)
If PSM entry fails despite of retries, assume that the AP has been lost,
and indicate connection loss to the mac80211. This is much safer than
remaining in active mode.

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_event.c

index 0e0808f..4fc212a 100644 (file)
@@ -82,15 +82,8 @@ static int wl1271_event_ps_report(struct wl1271 *wl,
                                                 true);
                } else {
                        wl1271_error("PSM entry failed, giving up.\n");
-                       /* FIXME: this may need to be reconsidered. for now it
-                          is not possible to indicate to the mac80211
-                          afterwards that PSM entry failed. To maximize
-                          functionality (receiving data and remaining
-                          associated) make sure that we are in sync with the
-                          AP in regard of PSM mode. */
-                       ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
-                                                false);
                        wl->psm_entry_retry = 0;
+                       *beacon_loss = true;
                }
                break;
        case EVENT_ENTER_POWER_SAVE_SUCCESS:
@@ -180,16 +173,8 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
                        return ret;
        }
 
-       if (wl->vif && beacon_loss) {
-               /* Obviously, it's dangerous to release the mutex while
-                  we are holding many of the variables in the wl struct.
-                  That's why it's done last in the function, and care must
-                  be taken that nothing more is done after this function
-                  returns. */
-               mutex_unlock(&wl->mutex);
-               ieee80211_beacon_loss(wl->vif);
-               mutex_lock(&wl->mutex);
-       }
+       if (wl->vif && beacon_loss)
+               ieee80211_connection_loss(wl->vif);
 
        return 0;
 }