Commit f3b0bbb3 authored by Johannes Berg's avatar Johannes Berg

mac80211: refactor drop connection/unlock in CSA processing

The schedule_work()/mutex unlocking code is duplicated many times,
refactor that to a common place in the function.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent dc5a1ad7
...@@ -1157,11 +1157,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, ...@@ -1157,11 +1157,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
if (!conf) { if (!conf) {
sdata_info(sdata, sdata_info(sdata,
"no channel context assigned to vif?, disconnecting\n"); "no channel context assigned to vif?, disconnecting\n");
ieee80211_queue_work(&local->hw, goto drop_connection;
&ifmgd->csa_connection_drop_work);
mutex_unlock(&local->chanctx_mtx);
mutex_unlock(&local->mtx);
return;
} }
chanctx = container_of(conf, struct ieee80211_chanctx, conf); chanctx = container_of(conf, struct ieee80211_chanctx, conf);
...@@ -1170,11 +1166,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, ...@@ -1170,11 +1166,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
!(local->hw.flags & IEEE80211_HW_CHANCTX_STA_CSA)) { !(local->hw.flags & IEEE80211_HW_CHANCTX_STA_CSA)) {
sdata_info(sdata, sdata_info(sdata,
"driver doesn't support chan-switch with channel contexts\n"); "driver doesn't support chan-switch with channel contexts\n");
ieee80211_queue_work(&local->hw, goto drop_connection;
&ifmgd->csa_connection_drop_work);
mutex_unlock(&local->chanctx_mtx);
mutex_unlock(&local->mtx);
return;
} }
ch_switch.timestamp = timestamp; ch_switch.timestamp = timestamp;
...@@ -1186,11 +1178,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, ...@@ -1186,11 +1178,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
if (drv_pre_channel_switch(sdata, &ch_switch)) { if (drv_pre_channel_switch(sdata, &ch_switch)) {
sdata_info(sdata, sdata_info(sdata,
"preparing for channel switch failed, disconnecting\n"); "preparing for channel switch failed, disconnecting\n");
ieee80211_queue_work(&local->hw, goto drop_connection;
&ifmgd->csa_connection_drop_work);
mutex_unlock(&local->chanctx_mtx);
mutex_unlock(&local->mtx);
return;
} }
res = ieee80211_vif_reserve_chanctx(sdata, &csa_ie.chandef, res = ieee80211_vif_reserve_chanctx(sdata, &csa_ie.chandef,
...@@ -1199,11 +1187,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, ...@@ -1199,11 +1187,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
sdata_info(sdata, sdata_info(sdata,
"failed to reserve channel context for channel switch, disconnecting (err=%d)\n", "failed to reserve channel context for channel switch, disconnecting (err=%d)\n",
res); res);
ieee80211_queue_work(&local->hw, goto drop_connection;
&ifmgd->csa_connection_drop_work);
mutex_unlock(&local->chanctx_mtx);
mutex_unlock(&local->mtx);
return;
} }
mutex_unlock(&local->chanctx_mtx); mutex_unlock(&local->chanctx_mtx);
...@@ -1232,6 +1216,11 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, ...@@ -1232,6 +1216,11 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
mod_timer(&ifmgd->chswitch_timer, mod_timer(&ifmgd->chswitch_timer,
TU_TO_EXP_TIME((csa_ie.count - 1) * TU_TO_EXP_TIME((csa_ie.count - 1) *
cbss->beacon_interval)); cbss->beacon_interval));
return;
drop_connection:
ieee80211_queue_work(&local->hw, &ifmgd->csa_connection_drop_work);
mutex_unlock(&local->chanctx_mtx);
mutex_unlock(&local->mtx);
} }
static bool static bool
......
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