aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorDaniel Halperin <dhalperi@cs.washington.edu>2010-01-22 17:22:58 -0500
committerJohn W. Linville <linville@tuxdriver.com>2010-01-25 16:36:27 -0500
commitff27fabe62d288038b36f41ac6a2190ed7d15993 (patch)
tree083eaf304695dd346b2e0c6a50d2ed9d2b0b91f3 /drivers/net
parent81963d68575d497d626ce13e42c84518a931cc12 (diff)
iwlwifi: fix throughput degradation in aggregation mode
The following commit commit e4da8c37af626001ff704fb29ea14eb58f5f7208 Author: Johannes Berg <johannes@sipsolutions.net> Date: Wed Dec 23 13:15:43 2009 +0100 mac80211: make off-channel work generic triggered a bug in iwlwifi where HT parameters would not be correctly set in some mac80211 pathways. The aggregation (and possibly other) station flags were not being set, which limited the size of aggregation blocks and reduced throughput at high rates. >From Johannes: """ Due to Wey-Yi's patch to use the set-channel command when the channel changes while associated, we don't get a full new RXON. Therefore, we don't re-set the rxon-station either. However, under some circumstances that apparently have gotten more likely mac80211 will first set up the BSS info, then add the station and then switch to an HT channel type. Therefore, the check for "priv->current_ht_config.is_ht" in iwl_rxon_add_station() will hit false and not fill in the HT information. However, that check can just be removed, which is the easiest fix for all this, because the HT capa struct is always there, just could possibly have the ht_supported member set to false. """ A sample good link in my 3x3 network improves by approximately 25% TCP throughput. This fixes Bug 2144 (http://bugzilla.intellinuxwireless.org/show_bug.cgi?id=2144). Signed-off-by: Daniel Halperin <dhalperi@cs.washington.edu> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-sta.c23
1 files changed, 9 insertions, 14 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c
index fcac73cf82bc..e0b13fb78653 100644
--- a/drivers/net/wireless/iwlwifi/iwl-sta.c
+++ b/drivers/net/wireless/iwlwifi/iwl-sta.c
@@ -1045,24 +1045,19 @@ int iwl_rxon_add_station(struct iwl_priv *priv, const u8 *addr, bool is_ap)
1045 struct ieee80211_sta_ht_cap *cur_ht_config = NULL; 1045 struct ieee80211_sta_ht_cap *cur_ht_config = NULL;
1046 u8 sta_id; 1046 u8 sta_id;
1047 1047
1048 /* Add station to device's station table */
1049
1050 /* 1048 /*
1051 * XXX: This check is definitely not correct, if we're an AP 1049 * Set HT capabilities. It is ok to set this struct even if not using
1052 * it'll always be false which is not what we want, but 1050 * HT config: the priv->current_ht_config.is_ht flag will just be false
1053 * it doesn't look like iwlagn is prepared to be an HT
1054 * AP anyway.
1055 */ 1051 */
1056 if (priv->current_ht_config.is_ht) { 1052 rcu_read_lock();
1057 rcu_read_lock(); 1053 sta = ieee80211_find_sta(priv->vif, addr);
1058 sta = ieee80211_find_sta(priv->vif, addr); 1054 if (sta) {
1059 if (sta) { 1055 memcpy(&ht_config, &sta->ht_cap, sizeof(ht_config));
1060 memcpy(&ht_config, &sta->ht_cap, sizeof(ht_config)); 1056 cur_ht_config = &ht_config;
1061 cur_ht_config = &ht_config;
1062 }
1063 rcu_read_unlock();
1064 } 1057 }
1058 rcu_read_unlock();
1065 1059
1060 /* Add station to device's station table */
1066 sta_id = iwl_add_station(priv, addr, is_ap, CMD_SYNC, cur_ht_config); 1061 sta_id = iwl_add_station(priv, addr, is_ap, CMD_SYNC, cur_ht_config);
1067 1062
1068 /* Set up default rate scaling table in device's station table */ 1063 /* Set up default rate scaling table in device's station table */