Commit 2e249fc3 authored by Shaul Triebitz's avatar Shaul Triebitz Committed by Johannes Berg

mac80211: update driver when MU EDCA params change

Similar to WMM IE, if MU_EDCA IE parameters changed (or ceased to exist)
tell the Driver about it.
Signed-off-by: default avatarShaul Triebitz <shaul.triebitz@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent daa5b835
...@@ -500,6 +500,7 @@ struct ieee80211_if_managed { ...@@ -500,6 +500,7 @@ struct ieee80211_if_managed {
unsigned int uapsd_max_sp_len; unsigned int uapsd_max_sp_len;
int wmm_last_param_set; int wmm_last_param_set;
int mu_edca_last_param_set;
u8 use_4addr; u8 use_4addr;
......
...@@ -1869,7 +1869,7 @@ ieee80211_sta_wmm_params(struct ieee80211_local *local, ...@@ -1869,7 +1869,7 @@ ieee80211_sta_wmm_params(struct ieee80211_local *local,
struct ieee80211_tx_queue_params params[IEEE80211_NUM_ACS]; struct ieee80211_tx_queue_params params[IEEE80211_NUM_ACS];
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
size_t left; size_t left;
int count, ac; int count, mu_edca_count, ac;
const u8 *pos; const u8 *pos;
u8 uapsd_queues = 0; u8 uapsd_queues = 0;
...@@ -1889,9 +1889,16 @@ ieee80211_sta_wmm_params(struct ieee80211_local *local, ...@@ -1889,9 +1889,16 @@ ieee80211_sta_wmm_params(struct ieee80211_local *local,
uapsd_queues = ifmgd->uapsd_queues; uapsd_queues = ifmgd->uapsd_queues;
count = wmm_param[6] & 0x0f; count = wmm_param[6] & 0x0f;
if (count == ifmgd->wmm_last_param_set) /* -1 is the initial value of ifmgd->mu_edca_last_param_set.
* if mu_edca was preset before and now it disappeared tell
* the driver about it.
*/
mu_edca_count = mu_edca ? mu_edca->mu_qos_info & 0x0f : -1;
if (count == ifmgd->wmm_last_param_set &&
mu_edca_count == ifmgd->mu_edca_last_param_set)
return false; return false;
ifmgd->wmm_last_param_set = count; ifmgd->wmm_last_param_set = count;
ifmgd->mu_edca_last_param_set = mu_edca_count;
pos = wmm_param + 8; pos = wmm_param + 8;
left = wmm_param_len - 8; left = wmm_param_len - 8;
...@@ -3349,6 +3356,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, ...@@ -3349,6 +3356,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
* 4-bit value. * 4-bit value.
*/ */
ifmgd->wmm_last_param_set = -1; ifmgd->wmm_last_param_set = -1;
ifmgd->mu_edca_last_param_set = -1;
if (ifmgd->flags & IEEE80211_STA_DISABLE_WMM) { if (ifmgd->flags & IEEE80211_STA_DISABLE_WMM) {
ieee80211_set_wmm_default(sdata, false, false); ieee80211_set_wmm_default(sdata, false, false);
......
...@@ -1223,6 +1223,8 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, ...@@ -1223,6 +1223,8 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
if (pos[0] == WLAN_EID_EXT_HE_MU_EDCA && if (pos[0] == WLAN_EID_EXT_HE_MU_EDCA &&
elen >= (sizeof(*elems->mu_edca_param_set) + 1)) { elen >= (sizeof(*elems->mu_edca_param_set) + 1)) {
elems->mu_edca_param_set = (void *)&pos[1]; elems->mu_edca_param_set = (void *)&pos[1];
if (calc_crc)
crc = crc32_be(crc, pos - 2, elen + 2);
} else if (pos[0] == WLAN_EID_EXT_HE_CAPABILITY) { } else if (pos[0] == WLAN_EID_EXT_HE_CAPABILITY) {
elems->he_cap = (void *)&pos[1]; elems->he_cap = (void *)&pos[1];
elems->he_cap_len = elen - 1; elems->he_cap_len = elen - 1;
......
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