Hi again (fixed your address, I hope it will not bounce this time...)
Please test the patch attached.
On Sun, 2015-02-22 at 14:19 +0200, Emmanuel Grumbach wrote:
Hi,
On Sun, 2015-02-22 at 14:15 +0200, Valentin Manea wrote:
Hi,
Recently I started using kernel 3.19 from Ubuntu ppa and I noticed a
big drop in Wifi throughput. After some investigation I found that my
router was reporting the AMPDU factor changed from 3(in 3.18) to 0(in 3.19):
cat
/sys/kernel/debug/ieee80211/phy1/netdev:wlan1/stations/c4:xx:xx:xx:xx:xx/ht_capa:
ht supported
cap: 0x1066
HT20/HT40
Dynamic SM Power Save
RX HT20 SGI
RX HT40 SGI
No RX STBC
Max AMSDU length: 3839 bytes
DSSS/CCK HT40
ampdu factor/density: 3/5
MCS mask: ff ff 00 00 00 00 00 00 00 00
MCS tx params: 1
ht supported
cap: 0x1066
HT20/HT40
Dynamic SM Power Save
RX HT20 SGI
RX HT40 SGI
No RX STBC
Max AMSDU length: 3839 bytes
DSSS/CCK HT40
ampdu factor/density: 0/5
MCS mask: ff ff 00 00 00 00 00 00 00 00
MCS tx params: 1
In my setup this means a 50% drop in downstream throughput(from
160Mbit/s to 80Mbit/s)
I tracked down the offending commit and it seems this is it:
iwlwifi: change max HT and VHT A-MPDU exponent
c064ddf318aa51647a30108f7cd151c208c62eef
A new mechanism was created to have per device ampd_factor:
- ht_info-ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
+ ht_info-ampdu_factor = cfg-max_ht_ampdu_exponent;
however the max_ht_ampdu_exponent is not set for any of the iwl-6000
devices(including mine Intel Corporation Centrino Advanced-N 6235)
#define IWL_DEVICE_6035 \
.fw_name_pre = IWL6030_FW_PRE, \
.ucode_api_max = IWL6035_UCODE_API_MAX, \
.ucode_api_ok = IWL6035_UCODE_API_OK, \
.ucode_api_min = IWL6035_UCODE_API_MIN, \
.device_family = IWL_DEVICE_FAMILY_6030,\
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.nvm_ver = EEPROM_6030_EEPROM_VERSION, \
.nvm_calib_ver = EEPROM_6030_TX_POWER_VERSION, \
.base_params = iwl6000_g2_base_params, \
.eeprom_params = iwl6000_eeprom_params,\
.led_mode = IWL_LED_RF_STATE
Since the original value of IEEE80211_HT_MAX_AMPDU_64K I would
suggest adding it to some iwl-6000 devices.
I did not submit any patches because I have no idea if there are
device which would not support this feature, however it worked before
with default value set to IEEE80211_HT_MAX_AMPDU_64K so I guess it must
be supported.
Thank you for your report and analysis. You saved us a lot of time.
I'll send a fix.
From bb6f89bc21b1ebc93018bbddd5935f4badc6a12d Mon Sep 17 00:00:00 2001
From: Emmanuel Grumbach emmanuel.grumb...@intel.com
Date: Sun, 22 Feb 2015 22:10:35 +0200
Subject: [PATCH] iwlwifi: fix max_ht_ampdu_exponent for older devices
The commit below didn't update the max_ht_ampdu_exponent
for the devices listed in iwl-[1-6]000.c
This had an impact in the Rx throughput. One user reported
that because of this, his downstream throughput by a half.
Fix that.
CC: sta...@vger.kernel.org [3.19]
Fixes: c064ddf318aa (iwlwifi: change max HT and VHT A-MPDU exponent)
Signed-off-by: Emmanuel Grumbach emmanuel.grumb...@intel.com
---
drivers/net/wireless/iwlwifi/iwl-1000.c | 6 --
drivers/net/wireless/iwlwifi/iwl-2000.c | 13 +
drivers/net/wireless/iwlwifi/iwl-5000.c | 6 --
drivers/net/wireless/iwlwifi/iwl-6000.c | 18 --
4 files changed, 29 insertions(+), 14 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
index c3817fa..06f6cc0 100644
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
@@ -95,7 +95,8 @@ static const struct iwl_eeprom_params iwl1000_eeprom_params = {
.nvm_calib_ver = EEPROM_1000_TX_POWER_VERSION, \
.base_params = iwl1000_base_params, \
.eeprom_params = iwl1000_eeprom_params, \
- .led_mode = IWL_LED_BLINK
+ .led_mode = IWL_LED_BLINK,\
+ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
const struct iwl_cfg iwl1000_bgn_cfg = {
.name = Intel(R) Centrino(R) Wireless-N 1000 BGN,
@@ -121,7 +122,8 @@ const struct iwl_cfg iwl1000_bg_cfg = {
.base_params = iwl1000_base_params, \
.eeprom_params = iwl1000_eeprom_params, \
.led_mode = IWL_LED_RF_STATE,\
- .rx_with_siso_diversity = true
+ .rx_with_siso_diversity = true,\
+ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
const struct iwl_cfg iwl100_bgn_cfg = {
.name = Intel(R) Centrino(R) Wireless-N 100 BGN,
diff --git