Commit e9a21949 authored by Luciano Coelho's avatar Luciano Coelho Committed by Johannes Berg

mac80211: add extended channel switching capability if the driver supports CSA

The Extended Channel Switching capability bit in the extended
capabilities element must be set if the driver supports CSA on
non-beaconing interfaces.

Since this capability needs to be set during driver registration, the
extended_capabiliities global variable needs to be moved to the local
structure so that it can be modified.
Signed-off-by: default avatarLuciano Coelho <luciano.coelho@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 2ba45384
...@@ -1998,6 +1998,11 @@ enum ieee80211_tdls_actioncode { ...@@ -1998,6 +1998,11 @@ enum ieee80211_tdls_actioncode {
WLAN_TDLS_DISCOVERY_REQUEST = 10, WLAN_TDLS_DISCOVERY_REQUEST = 10,
}; };
/* Extended Channel Switching capability to be set in the 1st byte of
* the @WLAN_EID_EXT_CAPABILITY information element
*/
#define WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING BIT(2)
/* Interworking capabilities are set in 7th bit of 4th byte of the /* Interworking capabilities are set in 7th bit of 4th byte of the
* @WLAN_EID_EXT_CAPABILITY information element * @WLAN_EID_EXT_CAPABILITY information element
*/ */
......
...@@ -1307,6 +1307,9 @@ struct ieee80211_local { ...@@ -1307,6 +1307,9 @@ struct ieee80211_local {
/* virtual monitor interface */ /* virtual monitor interface */
struct ieee80211_sub_if_data __rcu *monitor_sdata; struct ieee80211_sub_if_data __rcu *monitor_sdata;
struct cfg80211_chan_def monitor_chandef; struct cfg80211_chan_def monitor_chandef;
/* extended capabilities provided by mac80211 */
u8 ext_capa[8];
}; };
static inline struct ieee80211_sub_if_data * static inline struct ieee80211_sub_if_data *
......
...@@ -478,11 +478,6 @@ static const struct ieee80211_vht_cap mac80211_vht_capa_mod_mask = { ...@@ -478,11 +478,6 @@ static const struct ieee80211_vht_cap mac80211_vht_capa_mod_mask = {
}, },
}; };
static const u8 extended_capabilities[] = {
0, 0, 0, 0, 0, 0, 0,
WLAN_EXT_CAPA8_OPMODE_NOTIF,
};
struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
const struct ieee80211_ops *ops) const struct ieee80211_ops *ops)
{ {
...@@ -539,10 +534,6 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, ...@@ -539,10 +534,6 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
WIPHY_FLAG_REPORTS_OBSS | WIPHY_FLAG_REPORTS_OBSS |
WIPHY_FLAG_OFFCHAN_TX; WIPHY_FLAG_OFFCHAN_TX;
wiphy->extended_capabilities = extended_capabilities;
wiphy->extended_capabilities_mask = extended_capabilities;
wiphy->extended_capabilities_len = ARRAY_SIZE(extended_capabilities);
if (ops->remain_on_channel) if (ops->remain_on_channel)
wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
...@@ -591,6 +582,13 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, ...@@ -591,6 +582,13 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
wiphy->ht_capa_mod_mask = &mac80211_ht_capa_mod_mask; wiphy->ht_capa_mod_mask = &mac80211_ht_capa_mod_mask;
wiphy->vht_capa_mod_mask = &mac80211_vht_capa_mod_mask; wiphy->vht_capa_mod_mask = &mac80211_vht_capa_mod_mask;
local->ext_capa[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF;
wiphy->extended_capabilities = local->ext_capa;
wiphy->extended_capabilities_mask = local->ext_capa;
wiphy->extended_capabilities_len =
ARRAY_SIZE(local->ext_capa);
INIT_LIST_HEAD(&local->interfaces); INIT_LIST_HEAD(&local->interfaces);
__hw_addr_init(&local->mc_list); __hw_addr_init(&local->mc_list);
...@@ -958,6 +956,10 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) ...@@ -958,6 +956,10 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
if (local->hw.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) if (local->hw.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS)
local->hw.wiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP; local->hw.wiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP;
/* mac80211 supports eCSA, if the driver supports STA CSA at all */
if (local->hw.flags & IEEE80211_HW_CHANCTX_STA_CSA)
local->ext_capa[0] |= WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING;
local->hw.wiphy->max_num_csa_counters = IEEE80211_MAX_CSA_COUNTERS_NUM; local->hw.wiphy->max_num_csa_counters = IEEE80211_MAX_CSA_COUNTERS_NUM;
result = wiphy_register(local->hw.wiphy); result = wiphy_register(local->hw.wiphy);
......
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