Skip to content

Commit

Permalink
staging: brcm80211: Fix for suspend issue in brcmfmac driver
Browse files Browse the repository at this point in the history
Issue with disconnect at the time of suspend is fixed by properly setting
connection status bits maintained by brcmfmac driver.

Signed-off-by: Sukesh Srikakula <sukeshs@broadcom.com>
Reviewed-by: Roland Vossen <rvossen@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Reviewed-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Sukesh Srikakula authored and Greg Kroah-Hartman committed Jun 28, 2011
1 parent c4daa84 commit f212595
Showing 1 changed file with 24 additions and 8 deletions.
32 changes: 24 additions & 8 deletions drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -2110,8 +2110,9 @@ static s32 wl_cfg80211_suspend(struct wiphy *wiphy)
* While going to suspend if associated with AP disassociate
* from AP to save power while system is in suspended state
*/
if (test_bit(WL_STATUS_CONNECTED, &wl->status) &&
test_bit(WL_STATUS_READY, &wl->status)) {
if ((test_bit(WL_STATUS_CONNECTED, &wl->status) ||
test_bit(WL_STATUS_CONNECTING, &wl->status)) &&
test_bit(WL_STATUS_READY, &wl->status)) {
WL_INFO("Disassociating from AP"
" while entering suspend state\n");
wl_link_down(wl);
Expand All @@ -2138,8 +2139,6 @@ static s32 wl_cfg80211_suspend(struct wiphy *wiphy)
}
clear_bit(WL_STATUS_SCANNING, &wl->status);
clear_bit(WL_STATUS_SCAN_ABORTING, &wl->status);
clear_bit(WL_STATUS_CONNECTING, &wl->status);
clear_bit(WL_STATUS_CONNECTED, &wl->status);

/* Inform SDIO stack not to switch off power to the chip */
sdioh_sdio_set_host_pm_flags(MMC_PM_KEEP_POWER);
Expand Down Expand Up @@ -2620,10 +2619,12 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev,
} else if (wl_is_linkdown(wl, e)) {
WL_CONN("Linkdown\n");
if (wl_is_ibssmode(wl)) {
clear_bit(WL_STATUS_CONNECTING, &wl->status);
if (test_and_clear_bit(WL_STATUS_CONNECTED,
&wl->status))
wl_link_down(wl);
} else {
wl_bss_connect_done(wl, ndev, e, data, false);
if (test_and_clear_bit(WL_STATUS_CONNECTED,
&wl->status)) {
cfg80211_disconnected(ndev, 0, NULL, 0,
Expand Down Expand Up @@ -4099,6 +4100,25 @@ static s32 __wl_cfg80211_up(struct wl_priv *wl)

static s32 __wl_cfg80211_down(struct wl_priv *wl)
{
/*
* While going down, if associated with AP disassociate
* from AP to save power
*/
if ((test_bit(WL_STATUS_CONNECTED, &wl->status) ||
test_bit(WL_STATUS_CONNECTING, &wl->status)) &&
test_bit(WL_STATUS_READY, &wl->status)) {
WL_INFO("Disassociating from AP");
wl_link_down(wl);

/* Make sure WPA_Supplicant receives all the event
generated due to DISASSOC call to the fw to keep
the state fw and WPA_Supplicant state consistent
*/
rtnl_unlock();
wl_delay(500);
rtnl_lock();
}

set_bit(WL_STATUS_SCAN_ABORTING, &wl->status);
wl_term_iscan(wl);
if (wl->scan_request) {
Expand All @@ -4110,8 +4130,6 @@ static s32 __wl_cfg80211_down(struct wl_priv *wl)
clear_bit(WL_STATUS_READY, &wl->status);
clear_bit(WL_STATUS_SCANNING, &wl->status);
clear_bit(WL_STATUS_SCAN_ABORTING, &wl->status);
clear_bit(WL_STATUS_CONNECTING, &wl->status);
clear_bit(WL_STATUS_CONNECTED, &wl->status);

wl_debugfs_remove_netdev(wl);

Expand Down Expand Up @@ -4230,14 +4248,12 @@ static __used s32 wl_add_ie(struct wl_priv *wl, u8 t, u8 l, u8 *v)
return err;
}


static void wl_link_down(struct wl_priv *wl)
{
struct net_device *dev = NULL;
s32 err = 0;

WL_TRACE("Enter\n");
clear_bit(WL_STATUS_CONNECTED, &wl->status);

if (wl->link_up) {
dev = wl_to_ndev(wl);
Expand Down

0 comments on commit f212595

Please sign in to comment.