Commit 5bbe754d authored by Johannes Berg's avatar Johannes Berg

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: default avatarChaitanya <chaitanya.mgit@gmail.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 89afe614
...@@ -137,7 +137,10 @@ static int ieee80211_assign_vif_chanctx(struct ieee80211_sub_if_data *sdata, ...@@ -137,7 +137,10 @@ static int ieee80211_assign_vif_chanctx(struct ieee80211_sub_if_data *sdata,
ieee80211_recalc_txpower(sdata); ieee80211_recalc_txpower(sdata);
sdata->vif.bss_conf.idle = false; sdata->vif.bss_conf.idle = false;
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IDLE);
if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
sdata->vif.type != NL80211_IFTYPE_MONITOR)
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IDLE);
return 0; return 0;
} }
...@@ -186,7 +189,10 @@ static void ieee80211_unassign_vif_chanctx(struct ieee80211_sub_if_data *sdata, ...@@ -186,7 +189,10 @@ static void ieee80211_unassign_vif_chanctx(struct ieee80211_sub_if_data *sdata,
rcu_assign_pointer(sdata->vif.chanctx_conf, NULL); rcu_assign_pointer(sdata->vif.chanctx_conf, NULL);
sdata->vif.bss_conf.idle = true; sdata->vif.bss_conf.idle = true;
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IDLE);
if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
sdata->vif.type != NL80211_IFTYPE_MONITOR)
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IDLE);
drv_unassign_vif_chanctx(local, sdata, ctx); drv_unassign_vif_chanctx(local, sdata, ctx);
......
...@@ -207,13 +207,16 @@ static inline void drv_bss_info_changed(struct ieee80211_local *local, ...@@ -207,13 +207,16 @@ static inline void drv_bss_info_changed(struct ieee80211_local *local,
{ {
might_sleep(); might_sleep();
WARN_ON_ONCE(changed & (BSS_CHANGED_BEACON | if (WARN_ON_ONCE(changed & (BSS_CHANGED_BEACON |
BSS_CHANGED_BEACON_ENABLED) && BSS_CHANGED_BEACON_ENABLED) &&
sdata->vif.type != NL80211_IFTYPE_AP && sdata->vif.type != NL80211_IFTYPE_AP &&
sdata->vif.type != NL80211_IFTYPE_ADHOC && sdata->vif.type != NL80211_IFTYPE_ADHOC &&
sdata->vif.type != NL80211_IFTYPE_MESH_POINT); sdata->vif.type != NL80211_IFTYPE_MESH_POINT))
WARN_ON_ONCE(sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE && return;
changed & ~BSS_CHANGED_IDLE);
if (WARN_ON_ONCE(sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE ||
sdata->vif.type == NL80211_IFTYPE_MONITOR))
return;
check_sdata_in_driver(sdata); check_sdata_in_driver(sdata);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment