diff options
author | Juuso Oikarinen <juuso.oikarinen@nokia.com> | 2010-09-28 07:39:32 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-09-28 15:47:58 -0400 |
commit | f2176d7240e4f455a6e007703c7512fbde926dc8 (patch) | |
tree | 76c42bde578332499d3fb77f5cdd110041476cee /net/mac80211/mlme.c | |
parent | 93b05238027420978d785569f8c1aa4a6867bc13 (diff) |
mac80211: Fix WMM driver queue configuration
The WMM parameter configuration function (ieee80211_sta_wmm_params) only
configures the WMM parameters to the driver is the wmm_last_param_set
counter value is changed by the AP.
The wmm_last_param_set is initialized to -1 on association in order to ensure
the configuration is made to the driver at least once on association, but
currently this initialization is done *after* the WMM parameter configuration
function was called.
This leads to unreliability in the driver getting properly configured on first
association (depending on what counter value the AP happens to use.) When
disassociating (the wmm default parameters are configured to the driver) and
then reassociating, due to the above the WMM configuration is not set to the
driver at all.
On drivers without beacon filtering the problem is corrected by later beacons,
but on drivers with beacon filtering the WMM will remain permanently incorrectly
configured.
Fix this by moving the initialization of wmm_last_param_set to -1 before
ieee80211_sta_wmm_params is called on association.
Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/mlme.c')
-rw-r--r-- | net/mac80211/mlme.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 8b733cf6f3ea..77913a15f537 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -880,14 +880,6 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, | |||
880 | sdata->u.mgd.flags &= ~(IEEE80211_STA_CONNECTION_POLL | | 880 | sdata->u.mgd.flags &= ~(IEEE80211_STA_CONNECTION_POLL | |
881 | IEEE80211_STA_BEACON_POLL); | 881 | IEEE80211_STA_BEACON_POLL); |
882 | 882 | ||
883 | /* | ||
884 | * Always handle WMM once after association regardless | ||
885 | * of the first value the AP uses. Setting -1 here has | ||
886 | * that effect because the AP values is an unsigned | ||
887 | * 4-bit value. | ||
888 | */ | ||
889 | sdata->u.mgd.wmm_last_param_set = -1; | ||
890 | |||
891 | ieee80211_led_assoc(local, 1); | 883 | ieee80211_led_assoc(local, 1); |
892 | 884 | ||
893 | if (local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD) | 885 | if (local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD) |
@@ -1367,6 +1359,14 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk, | |||
1367 | return false; | 1359 | return false; |
1368 | } | 1360 | } |
1369 | 1361 | ||
1362 | /* | ||
1363 | * Always handle WMM once after association regardless | ||
1364 | * of the first value the AP uses. Setting -1 here has | ||
1365 | * that effect because the AP values is an unsigned | ||
1366 | * 4-bit value. | ||
1367 | */ | ||
1368 | ifmgd->wmm_last_param_set = -1; | ||
1369 | |||
1370 | if (elems.wmm_param) | 1370 | if (elems.wmm_param) |
1371 | ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, | 1371 | ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, |
1372 | elems.wmm_param_len); | 1372 | elems.wmm_param_len); |