mac80211: stop toggling IEEE80211_HT_CAP_SUP_WIDTH_20_40
For VHT, many more bandwidth changes are possible. As a first step, stop toggling the IEEE80211_HT_CAP_SUP_WIDTH_20_40 flag in the HT capabilities and instead introduce a bandwidth field indicating the currently usable bandwidth to transmit to the station. Of course, make all drivers use it. To achieve this, make ieee80211_ht_cap_ie_to_sta_ht_cap() get the station as an argument, rather than the new capabilities, so it can set up the new bandwidth field. If the station is a VHT station and VHT bandwidth is in use, also set the bandwidth accordingly. Doing this allows us to get rid of the supports_40mhz flag as the HT capabilities now reflect the true capability instead of the current setting. While at it, also fix ieee80211_ht_cap_ie_to_sta_ht_cap() to not ignore HT cap overrides when MCS TX isn't supported (not that it really happens...) Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
@@ -2410,25 +2410,20 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
|
||||
case WLAN_HT_ACTION_NOTIFY_CHANWIDTH: {
|
||||
struct ieee80211_supported_band *sband;
|
||||
u8 chanwidth = mgmt->u.action.u.ht_notify_cw.chanwidth;
|
||||
bool old_40mhz, new_40mhz;
|
||||
enum ieee80211_sta_rx_bandwidth new_bw;
|
||||
|
||||
/* If it doesn't support 40 MHz it can't change ... */
|
||||
if (!rx->sta->supports_40mhz)
|
||||
if (!(rx->sta->sta.ht_cap.cap &
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40))
|
||||
goto handled;
|
||||
|
||||
old_40mhz = rx->sta->sta.ht_cap.cap &
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||
new_40mhz = chanwidth == IEEE80211_HT_CHANWIDTH_ANY;
|
||||
|
||||
if (old_40mhz == new_40mhz)
|
||||
goto handled;
|
||||
|
||||
if (new_40mhz)
|
||||
rx->sta->sta.ht_cap.cap |=
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||
if (chanwidth == IEEE80211_HT_CHANWIDTH_20MHZ)
|
||||
new_bw = IEEE80211_STA_RX_BW_20;
|
||||
else
|
||||
rx->sta->sta.ht_cap.cap &=
|
||||
~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||
new_bw = ieee80211_sta_cur_vht_bw(rx->sta);
|
||||
|
||||
if (rx->sta->sta.bandwidth == new_bw)
|
||||
goto handled;
|
||||
|
||||
sband = rx->local->hw.wiphy->bands[status->band];
|
||||
|
||||
|
Reference in New Issue
Block a user