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:
@@ -1196,6 +1196,24 @@ enum ieee80211_sta_state {
|
||||
IEEE80211_STA_AUTHORIZED,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ieee80211_sta_rx_bandwidth - station RX bandwidth
|
||||
* @IEEE80211_STA_RX_BW_20: station can only receive 20 MHz
|
||||
* @IEEE80211_STA_RX_BW_40: station can receive up to 40 MHz
|
||||
* @IEEE80211_STA_RX_BW_80: station can receive up to 80 MHz
|
||||
* @IEEE80211_STA_RX_BW_160: station can receive up to 160 MHz
|
||||
* (including 80+80 MHz)
|
||||
*
|
||||
* Implementation note: 20 must be zero to be initialized
|
||||
* correctly, the values must be sorted.
|
||||
*/
|
||||
enum ieee80211_sta_rx_bandwidth {
|
||||
IEEE80211_STA_RX_BW_20 = 0,
|
||||
IEEE80211_STA_RX_BW_40,
|
||||
IEEE80211_STA_RX_BW_80,
|
||||
IEEE80211_STA_RX_BW_160,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_sta - station table entry
|
||||
*
|
||||
@@ -1218,6 +1236,7 @@ enum ieee80211_sta_state {
|
||||
* @uapsd_queues: bitmap of queues configured for uapsd. Only valid
|
||||
* if wme is supported.
|
||||
* @max_sp: max Service Period. Only valid if wme is supported.
|
||||
* @bandwidth: current bandwidth the station can receive with
|
||||
*/
|
||||
struct ieee80211_sta {
|
||||
u32 supp_rates[IEEE80211_NUM_BANDS];
|
||||
@@ -1228,6 +1247,7 @@ struct ieee80211_sta {
|
||||
bool wme;
|
||||
u8 uapsd_queues;
|
||||
u8 max_sp;
|
||||
enum ieee80211_sta_rx_bandwidth bandwidth;
|
||||
|
||||
/* must be last */
|
||||
u8 drv_priv[0] __aligned(sizeof(void *));
|
||||
@@ -2086,7 +2106,9 @@ enum ieee80211_frame_release_type {
|
||||
* enum ieee80211_rate_control_changed - flags to indicate what changed
|
||||
*
|
||||
* @IEEE80211_RC_BW_CHANGED: The bandwidth that can be used to transmit
|
||||
* to this station changed.
|
||||
* to this station changed. The actual bandwidth is in the station
|
||||
* information -- for HT20/40 the IEEE80211_HT_CAP_SUP_WIDTH_20_40
|
||||
* flag changes, for HT and VHT the bandwidth field changes.
|
||||
* @IEEE80211_RC_SMPS_CHANGED: The SMPS state of the station changed.
|
||||
* @IEEE80211_RC_SUPP_RATES_CHANGED: The supported rate set of this peer
|
||||
* changed (in IBSS mode) due to discovering more information about
|
||||
|
Reference in New Issue
Block a user