|
@@ -958,9 +958,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
|
|
|
struct cfg80211_bss *cbss = ifmgd->associated;
|
|
|
struct ieee80211_chanctx *chanctx;
|
|
|
enum ieee80211_band current_band;
|
|
|
- u8 count;
|
|
|
- u8 mode;
|
|
|
- struct cfg80211_chan_def new_chandef = {};
|
|
|
+ struct ieee80211_csa_ie csa_ie;
|
|
|
int res;
|
|
|
|
|
|
sdata_assert_lock(sdata);
|
|
@@ -976,24 +974,24 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
|
|
|
return;
|
|
|
|
|
|
current_band = cbss->channel->band;
|
|
|
+ memset(&csa_ie, 0, sizeof(csa_ie));
|
|
|
res = ieee80211_parse_ch_switch_ie(sdata, elems, beacon, current_band,
|
|
|
ifmgd->flags,
|
|
|
- ifmgd->associated->bssid, &count,
|
|
|
- &mode, &new_chandef);
|
|
|
+ ifmgd->associated->bssid, &csa_ie);
|
|
|
if (res < 0)
|
|
|
ieee80211_queue_work(&local->hw,
|
|
|
&ifmgd->csa_connection_drop_work);
|
|
|
if (res)
|
|
|
return;
|
|
|
|
|
|
- if (!cfg80211_chandef_usable(local->hw.wiphy, &new_chandef,
|
|
|
+ if (!cfg80211_chandef_usable(local->hw.wiphy, &csa_ie.chandef,
|
|
|
IEEE80211_CHAN_DISABLED)) {
|
|
|
sdata_info(sdata,
|
|
|
"AP %pM switches to unsupported channel (%d MHz, width:%d, CF1/2: %d/%d MHz), disconnecting\n",
|
|
|
ifmgd->associated->bssid,
|
|
|
- new_chandef.chan->center_freq,
|
|
|
- new_chandef.width, new_chandef.center_freq1,
|
|
|
- new_chandef.center_freq2);
|
|
|
+ csa_ie.chandef.chan->center_freq,
|
|
|
+ csa_ie.chandef.width, csa_ie.chandef.center_freq1,
|
|
|
+ csa_ie.chandef.center_freq2);
|
|
|
ieee80211_queue_work(&local->hw,
|
|
|
&ifmgd->csa_connection_drop_work);
|
|
|
return;
|
|
@@ -1037,9 +1035,9 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
|
|
|
}
|
|
|
mutex_unlock(&local->chanctx_mtx);
|
|
|
|
|
|
- local->csa_chandef = new_chandef;
|
|
|
+ local->csa_chandef = csa_ie.chandef;
|
|
|
|
|
|
- if (mode)
|
|
|
+ if (csa_ie.mode)
|
|
|
ieee80211_stop_queues_by_reason(&local->hw,
|
|
|
IEEE80211_MAX_QUEUE_MAP,
|
|
|
IEEE80211_QUEUE_STOP_REASON_CSA);
|
|
@@ -1048,9 +1046,9 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
|
|
|
/* use driver's channel switch callback */
|
|
|
struct ieee80211_channel_switch ch_switch = {
|
|
|
.timestamp = timestamp,
|
|
|
- .block_tx = mode,
|
|
|
- .chandef = new_chandef,
|
|
|
- .count = count,
|
|
|
+ .block_tx = csa_ie.mode,
|
|
|
+ .chandef = csa_ie.chandef,
|
|
|
+ .count = csa_ie.count,
|
|
|
};
|
|
|
|
|
|
drv_channel_switch(local, &ch_switch);
|
|
@@ -1058,11 +1056,11 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
|
|
|
}
|
|
|
|
|
|
/* channel switch handled in software */
|
|
|
- if (count <= 1)
|
|
|
+ if (csa_ie.count <= 1)
|
|
|
ieee80211_queue_work(&local->hw, &ifmgd->chswitch_work);
|
|
|
else
|
|
|
mod_timer(&ifmgd->chswitch_timer,
|
|
|
- TU_TO_EXP_TIME(count * cbss->beacon_interval));
|
|
|
+ TU_TO_EXP_TIME(csa_ie.count * cbss->beacon_interval));
|
|
|
}
|
|
|
|
|
|
static u32 ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata,
|
|
@@ -3994,7 +3992,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
|
|
}
|
|
|
|
|
|
/* prepare assoc data */
|
|
|
-
|
|
|
+
|
|
|
ifmgd->beacon_crc_valid = false;
|
|
|
|
|
|
/*
|