diff options
author | Johannes Berg <johannes.berg@intel.com> | 2013-02-13 07:50:51 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-02-15 03:41:11 -0500 |
commit | 5bbe754d9ecc4a09994ecd0cf3b167224e114da5 (patch) | |
tree | b2fd84fbc650352f9d042c073b35768489d9e02a /net | |
parent | 89afe614c0c737fd40eda1f8c8ef686246cf3cb6 (diff) |
mac80211: don't call bss_info_changed on p2p-device/monitor
Since the idle decision rework, mac80211 started calling
bss_info_changed() for the driver's monitor interface,
which causes a crash for iwlwifi, but drivers generally
don't expect this to happen. Therefore, avoid it.
While at it, also prevent calling it in such cases and
only print a warning. For the P2P Device interface the
idle will no longer be called (no channel context), so
also prevent that and warn on it.
Reported-by: Chaitanya <chaitanya.mgit@gmail.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/chan.c | 10 | ||||
-rw-r--r-- | net/mac80211/driver-ops.h | 17 |
2 files changed, 18 insertions, 9 deletions
diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c index 2e6faeda22ad..d91ccfcaa6d1 100644 --- a/net/mac80211/chan.c +++ b/net/mac80211/chan.c | |||
@@ -137,7 +137,10 @@ static int ieee80211_assign_vif_chanctx(struct ieee80211_sub_if_data *sdata, | |||
137 | 137 | ||
138 | ieee80211_recalc_txpower(sdata); | 138 | ieee80211_recalc_txpower(sdata); |
139 | sdata->vif.bss_conf.idle = false; | 139 | sdata->vif.bss_conf.idle = false; |
140 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IDLE); | 140 | |
141 | if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && | ||
142 | sdata->vif.type != NL80211_IFTYPE_MONITOR) | ||
143 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IDLE); | ||
141 | 144 | ||
142 | return 0; | 145 | return 0; |
143 | } | 146 | } |
@@ -186,7 +189,10 @@ static void ieee80211_unassign_vif_chanctx(struct ieee80211_sub_if_data *sdata, | |||
186 | rcu_assign_pointer(sdata->vif.chanctx_conf, NULL); | 189 | rcu_assign_pointer(sdata->vif.chanctx_conf, NULL); |
187 | 190 | ||
188 | sdata->vif.bss_conf.idle = true; | 191 | sdata->vif.bss_conf.idle = true; |
189 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IDLE); | 192 | |
193 | if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && | ||
194 | sdata->vif.type != NL80211_IFTYPE_MONITOR) | ||
195 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IDLE); | ||
190 | 196 | ||
191 | drv_unassign_vif_chanctx(local, sdata, ctx); | 197 | drv_unassign_vif_chanctx(local, sdata, ctx); |
192 | 198 | ||
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index 2b08b9982d06..ee56d0779d8b 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h | |||
@@ -207,13 +207,16 @@ static inline void drv_bss_info_changed(struct ieee80211_local *local, | |||
207 | { | 207 | { |
208 | might_sleep(); | 208 | might_sleep(); |
209 | 209 | ||
210 | WARN_ON_ONCE(changed & (BSS_CHANGED_BEACON | | 210 | if (WARN_ON_ONCE(changed & (BSS_CHANGED_BEACON | |
211 | BSS_CHANGED_BEACON_ENABLED) && | 211 | BSS_CHANGED_BEACON_ENABLED) && |
212 | sdata->vif.type != NL80211_IFTYPE_AP && | 212 | sdata->vif.type != NL80211_IFTYPE_AP && |
213 | sdata->vif.type != NL80211_IFTYPE_ADHOC && | 213 | sdata->vif.type != NL80211_IFTYPE_ADHOC && |
214 | sdata->vif.type != NL80211_IFTYPE_MESH_POINT); | 214 | sdata->vif.type != NL80211_IFTYPE_MESH_POINT)) |
215 | WARN_ON_ONCE(sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE && | 215 | return; |
216 | changed & ~BSS_CHANGED_IDLE); | 216 | |
217 | if (WARN_ON_ONCE(sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE || | ||
218 | sdata->vif.type == NL80211_IFTYPE_MONITOR)) | ||
219 | return; | ||
217 | 220 | ||
218 | check_sdata_in_driver(sdata); | 221 | check_sdata_in_driver(sdata); |
219 | 222 | ||