aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2016-04-07 09:44:42 -0400
committerLuca Coelho <luciano.coelho@intel.com>2016-07-01 09:51:22 -0400
commit4bdd4dfe7a893594a75ca324057f7010b1762bd2 (patch)
treef6406d257235bac887dbfcde16c88c5c5a2b752f
parentaf5e964f3045b66f1cd720b9c5abd37e47e613e2 (diff)
iwlwifi: advertise maximal MPDU length when Rx MQ is supported
The new hardware that supports multiple queue also de-aggregates A-MSDUs. This means that we can advertise the maximal size of A-MSDUs regardless of the receive buffer's size. In order to be able to forcefully use a lower A-MSDU size, add a default value for the module parameter. Pre-9000 will have a default of 4K, and 9000 will have 12K. Setting the amsdu_size module parameter to 4K will limit the A-MSDU on 9000 as well. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
-rw-r--r--drivers/net/wireless/intel/iwlwifi/dvm/main.c1
-rw-r--r--drivers/net/wireless/intel/iwlwifi/iwl-drv.c3
-rw-r--r--drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c4
-rw-r--r--drivers/net/wireless/intel/iwlwifi/iwl-modparams.h9
-rw-r--r--drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c7
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/ops.c5
6 files changed, 23 insertions, 6 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/main.c b/drivers/net/wireless/intel/iwlwifi/dvm/main.c
index 37b32a6f60fd..591591418316 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/main.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/main.c
@@ -1317,6 +1317,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1317 trans_cfg.n_no_reclaim_cmds = ARRAY_SIZE(no_reclaim_cmds); 1317 trans_cfg.n_no_reclaim_cmds = ARRAY_SIZE(no_reclaim_cmds);
1318 1318
1319 switch (iwlwifi_mod_params.amsdu_size) { 1319 switch (iwlwifi_mod_params.amsdu_size) {
1320 case IWL_AMSDU_DEF:
1320 case IWL_AMSDU_4K: 1321 case IWL_AMSDU_4K:
1321 trans_cfg.rx_buf_size = IWL_AMSDU_4K; 1322 trans_cfg.rx_buf_size = IWL_AMSDU_4K;
1322 break; 1323 break;
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
index 60a6c36904e4..5c5b9f228ac6 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
@@ -1655,7 +1655,8 @@ MODULE_PARM_DESC(11n_disable,
1655 "disable 11n functionality, bitmap: 1: full, 2: disable agg TX, 4: disable agg RX, 8 enable agg TX"); 1655 "disable 11n functionality, bitmap: 1: full, 2: disable agg TX, 4: disable agg RX, 8 enable agg TX");
1656module_param_named(amsdu_size, iwlwifi_mod_params.amsdu_size, 1656module_param_named(amsdu_size, iwlwifi_mod_params.amsdu_size,
1657 int, S_IRUGO); 1657 int, S_IRUGO);
1658MODULE_PARM_DESC(amsdu_size, "amsdu size 0:4K 1:8K 2:12K (default 0)"); 1658MODULE_PARM_DESC(amsdu_size,
1659 "amsdu size 0: 12K for multi Rx queue devices, 4K for other devices 1:4K 2:8K 3:12K (default 0)");
1659module_param_named(fw_restart, iwlwifi_mod_params.restart_fw, bool, S_IRUGO); 1660module_param_named(fw_restart, iwlwifi_mod_params.restart_fw, bool, S_IRUGO);
1660MODULE_PARM_DESC(fw_restart, "restart firmware in case of error (default true)"); 1661MODULE_PARM_DESC(fw_restart, "restart firmware in case of error (default true)");
1661 1662
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c
index bf1b69aec813..3199d345b427 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c
@@ -766,7 +766,9 @@ void iwl_init_ht_hw_capab(const struct iwl_cfg *cfg,
766 if (cfg->ht_params->ldpc) 766 if (cfg->ht_params->ldpc)
767 ht_info->cap |= IEEE80211_HT_CAP_LDPC_CODING; 767 ht_info->cap |= IEEE80211_HT_CAP_LDPC_CODING;
768 768
769 if (iwlwifi_mod_params.amsdu_size >= IWL_AMSDU_8K) 769 if ((cfg->mq_rx_supported &&
770 iwlwifi_mod_params.amsdu_size != IWL_AMSDU_4K) ||
771 iwlwifi_mod_params.amsdu_size >= IWL_AMSDU_8K)
770 ht_info->cap |= IEEE80211_HT_CAP_MAX_AMSDU; 772 ht_info->cap |= IEEE80211_HT_CAP_MAX_AMSDU;
771 773
772 ht_info->ampdu_factor = cfg->max_ht_ampdu_exponent; 774 ht_info->ampdu_factor = cfg->max_ht_ampdu_exponent;
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h b/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
index 6c5c2f9f73a2..0379899dc847 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
@@ -87,9 +87,10 @@ enum iwl_disable_11n {
87}; 87};
88 88
89enum iwl_amsdu_size { 89enum iwl_amsdu_size {
90 IWL_AMSDU_4K = 0, 90 IWL_AMSDU_DEF = 0,
91 IWL_AMSDU_8K = 1, 91 IWL_AMSDU_4K = 1,
92 IWL_AMSDU_12K = 2, 92 IWL_AMSDU_8K = 2,
93 IWL_AMSDU_12K = 3,
93}; 94};
94 95
95enum iwl_uapsd_disable { 96enum iwl_uapsd_disable {
@@ -105,7 +106,7 @@ enum iwl_uapsd_disable {
105 * @sw_crypto: using hardware encryption, default = 0 106 * @sw_crypto: using hardware encryption, default = 0
106 * @disable_11n: disable 11n capabilities, default = 0, 107 * @disable_11n: disable 11n capabilities, default = 0,
107 * use IWL_[DIS,EN]ABLE_HT_* constants 108 * use IWL_[DIS,EN]ABLE_HT_* constants
108 * @amsdu_size: enable 8K amsdu size, default = 4K. enum iwl_amsdu_size. 109 * @amsdu_size: See &enum iwl_amsdu_size.
109 * @restart_fw: restart firmware, default = 1 110 * @restart_fw: restart firmware, default = 1
110 * @bt_coex_active: enable bt coex, default = true 111 * @bt_coex_active: enable bt coex, default = true
111 * @led_mode: system default, default = 0 112 * @led_mode: system default, default = 0
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
index 21653fee806c..43f8f7d45ddb 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
@@ -397,6 +397,13 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
397 vht_cap->cap |= IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN; 397 vht_cap->cap |= IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN;
398 398
399 switch (iwlwifi_mod_params.amsdu_size) { 399 switch (iwlwifi_mod_params.amsdu_size) {
400 case IWL_AMSDU_DEF:
401 if (cfg->mq_rx_supported)
402 vht_cap->cap |=
403 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
404 else
405 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
406 break;
400 case IWL_AMSDU_4K: 407 case IWL_AMSDU_4K:
401 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895; 408 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
402 break; 409 break;
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index a68054f127fa..64d2b4f04ac2 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -603,6 +603,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
603 trans_cfg.no_reclaim_cmds = no_reclaim_cmds; 603 trans_cfg.no_reclaim_cmds = no_reclaim_cmds;
604 trans_cfg.n_no_reclaim_cmds = ARRAY_SIZE(no_reclaim_cmds); 604 trans_cfg.n_no_reclaim_cmds = ARRAY_SIZE(no_reclaim_cmds);
605 switch (iwlwifi_mod_params.amsdu_size) { 605 switch (iwlwifi_mod_params.amsdu_size) {
606 case IWL_AMSDU_DEF:
606 case IWL_AMSDU_4K: 607 case IWL_AMSDU_4K:
607 trans_cfg.rx_buf_size = IWL_AMSDU_4K; 608 trans_cfg.rx_buf_size = IWL_AMSDU_4K;
608 break; 609 break;
@@ -617,6 +618,10 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
617 iwlwifi_mod_params.amsdu_size); 618 iwlwifi_mod_params.amsdu_size);
618 trans_cfg.rx_buf_size = IWL_AMSDU_4K; 619 trans_cfg.rx_buf_size = IWL_AMSDU_4K;
619 } 620 }
621
622 /* the hardware splits the A-MSDU */
623 if (mvm->cfg->mq_rx_supported)
624 trans_cfg.rx_buf_size = IWL_AMSDU_4K;
620 trans_cfg.wide_cmd_header = fw_has_api(&mvm->fw->ucode_capa, 625 trans_cfg.wide_cmd_header = fw_has_api(&mvm->fw->ucode_capa,
621 IWL_UCODE_TLV_API_WIDE_CMD_HDR); 626 IWL_UCODE_TLV_API_WIDE_CMD_HDR);
622 627