aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/cfg.c61
1 files changed, 37 insertions, 24 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index f789c3198af4..0c87c8c47123 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -3053,25 +3053,11 @@ void ieee80211_csa_finish(struct ieee80211_vif *vif)
3053} 3053}
3054EXPORT_SYMBOL(ieee80211_csa_finish); 3054EXPORT_SYMBOL(ieee80211_csa_finish);
3055 3055
3056static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata) 3056static int ieee80211_set_after_csa_beacon(struct ieee80211_sub_if_data *sdata,
3057 u32 *changed)
3057{ 3058{
3058 struct ieee80211_local *local = sdata->local; 3059 int err;
3059 int err, changed = 0;
3060
3061 sdata_assert_lock(sdata);
3062 lockdep_assert_held(&local->mtx);
3063
3064 sdata->radar_required = sdata->csa_radar_required;
3065 err = ieee80211_vif_change_channel(sdata, &changed);
3066 if (WARN_ON(err < 0))
3067 return;
3068
3069 if (!local->use_chanctx) {
3070 local->_oper_chandef = sdata->csa_chandef;
3071 ieee80211_hw_config(local, 0);
3072 }
3073 3060
3074 sdata->vif.csa_active = false;
3075 switch (sdata->vif.type) { 3061 switch (sdata->vif.type) {
3076 case NL80211_IFTYPE_AP: 3062 case NL80211_IFTYPE_AP:
3077 err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon); 3063 err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon);
@@ -3079,30 +3065,57 @@ static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
3079 sdata->u.ap.next_beacon = NULL; 3065 sdata->u.ap.next_beacon = NULL;
3080 3066
3081 if (err < 0) 3067 if (err < 0)
3082 return; 3068 return err;
3083 changed |= err; 3069 *changed |= err;
3084 break; 3070 break;
3085 case NL80211_IFTYPE_ADHOC: 3071 case NL80211_IFTYPE_ADHOC:
3086 err = ieee80211_ibss_finish_csa(sdata); 3072 err = ieee80211_ibss_finish_csa(sdata);
3087 if (err < 0) 3073 if (err < 0)
3088 return; 3074 return err;
3089 changed |= err; 3075 *changed |= err;
3090 break; 3076 break;
3091#ifdef CONFIG_MAC80211_MESH 3077#ifdef CONFIG_MAC80211_MESH
3092 case NL80211_IFTYPE_MESH_POINT: 3078 case NL80211_IFTYPE_MESH_POINT:
3093 err = ieee80211_mesh_finish_csa(sdata); 3079 err = ieee80211_mesh_finish_csa(sdata);
3094 if (err < 0) 3080 if (err < 0)
3095 return; 3081 return err;
3096 changed |= err; 3082 *changed |= err;
3097 break; 3083 break;
3098#endif 3084#endif
3099 default: 3085 default:
3100 WARN_ON(1); 3086 WARN_ON(1);
3087 return -EINVAL;
3088 }
3089
3090 return 0;
3091}
3092
3093static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
3094{
3095 struct ieee80211_local *local = sdata->local;
3096 u32 changed = 0;
3097 int err;
3098
3099 sdata_assert_lock(sdata);
3100 lockdep_assert_held(&local->mtx);
3101
3102 sdata->radar_required = sdata->csa_radar_required;
3103 err = ieee80211_vif_change_channel(sdata, &changed);
3104 if (WARN_ON(err < 0))
3101 return; 3105 return;
3106
3107 if (!local->use_chanctx) {
3108 local->_oper_chandef = sdata->csa_chandef;
3109 ieee80211_hw_config(local, 0);
3102 } 3110 }
3103 3111
3104 ieee80211_bss_info_change_notify(sdata, changed); 3112 sdata->vif.csa_active = false;
3113
3114 err = ieee80211_set_after_csa_beacon(sdata, &changed);
3115 if (err)
3116 return;
3105 3117
3118 ieee80211_bss_info_change_notify(sdata, changed);
3106 cfg80211_ch_switch_notify(sdata->dev, &sdata->csa_chandef); 3119 cfg80211_ch_switch_notify(sdata->dev, &sdata->csa_chandef);
3107 3120
3108 if (!ieee80211_csa_needs_block_tx(local)) 3121 if (!ieee80211_csa_needs_block_tx(local))