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 */ |