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:
Johannes Berg
2013-02-07 11:47:44 +01:00
parent 4a34215ef7
commit e1a0c6b3a4
27 changed files with 184 additions and 158 deletions

View File

@@ -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];