diff options
Diffstat (limited to 'net/mac80211/pm.c')
| -rw-r--r-- | net/mac80211/pm.c | 18 |
1 files changed, 6 insertions, 12 deletions
diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c index e535f1c988fe..0e64484e861c 100644 --- a/net/mac80211/pm.c +++ b/net/mac80211/pm.c | |||
| @@ -10,9 +10,7 @@ int __ieee80211_suspend(struct ieee80211_hw *hw) | |||
| 10 | { | 10 | { |
| 11 | struct ieee80211_local *local = hw_to_local(hw); | 11 | struct ieee80211_local *local = hw_to_local(hw); |
| 12 | struct ieee80211_sub_if_data *sdata; | 12 | struct ieee80211_sub_if_data *sdata; |
| 13 | struct ieee80211_if_init_conf conf; | ||
| 14 | struct sta_info *sta; | 13 | struct sta_info *sta; |
| 15 | unsigned long flags; | ||
| 16 | 14 | ||
| 17 | ieee80211_scan_cancel(local); | 15 | ieee80211_scan_cancel(local); |
| 18 | 16 | ||
| @@ -56,22 +54,21 @@ int __ieee80211_suspend(struct ieee80211_hw *hw) | |||
| 56 | rcu_read_unlock(); | 54 | rcu_read_unlock(); |
| 57 | 55 | ||
| 58 | /* remove STAs */ | 56 | /* remove STAs */ |
| 59 | spin_lock_irqsave(&local->sta_lock, flags); | 57 | mutex_lock(&local->sta_mtx); |
| 60 | list_for_each_entry(sta, &local->sta_list, list) { | 58 | list_for_each_entry(sta, &local->sta_list, list) { |
| 61 | if (local->ops->sta_notify) { | 59 | if (sta->uploaded) { |
| 62 | sdata = sta->sdata; | 60 | sdata = sta->sdata; |
| 63 | if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | 61 | if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) |
| 64 | sdata = container_of(sdata->bss, | 62 | sdata = container_of(sdata->bss, |
| 65 | struct ieee80211_sub_if_data, | 63 | struct ieee80211_sub_if_data, |
| 66 | u.ap); | 64 | u.ap); |
| 67 | 65 | ||
| 68 | drv_sta_notify(local, &sdata->vif, STA_NOTIFY_REMOVE, | 66 | drv_sta_remove(local, sdata, &sta->sta); |
| 69 | &sta->sta); | ||
| 70 | } | 67 | } |
| 71 | 68 | ||
| 72 | mesh_plink_quiesce(sta); | 69 | mesh_plink_quiesce(sta); |
| 73 | } | 70 | } |
| 74 | spin_unlock_irqrestore(&local->sta_lock, flags); | 71 | mutex_unlock(&local->sta_mtx); |
| 75 | 72 | ||
| 76 | /* remove all interfaces */ | 73 | /* remove all interfaces */ |
| 77 | list_for_each_entry(sdata, &local->interfaces, list) { | 74 | list_for_each_entry(sdata, &local->interfaces, list) { |
| @@ -93,17 +90,14 @@ int __ieee80211_suspend(struct ieee80211_hw *hw) | |||
| 93 | break; | 90 | break; |
| 94 | } | 91 | } |
| 95 | 92 | ||
| 96 | if (!netif_running(sdata->dev)) | 93 | if (!ieee80211_sdata_running(sdata)) |
| 97 | continue; | 94 | continue; |
| 98 | 95 | ||
| 99 | /* disable beaconing */ | 96 | /* disable beaconing */ |
| 100 | ieee80211_bss_info_change_notify(sdata, | 97 | ieee80211_bss_info_change_notify(sdata, |
| 101 | BSS_CHANGED_BEACON_ENABLED); | 98 | BSS_CHANGED_BEACON_ENABLED); |
| 102 | 99 | ||
| 103 | conf.vif = &sdata->vif; | 100 | drv_remove_interface(local, &sdata->vif); |
| 104 | conf.type = sdata->vif.type; | ||
| 105 | conf.mac_addr = sdata->dev->dev_addr; | ||
| 106 | drv_remove_interface(local, &conf); | ||
| 107 | } | 101 | } |
| 108 | 102 | ||
| 109 | /* stop hardware - this must stop RX */ | 103 | /* stop hardware - this must stop RX */ |
