diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2016-04-07 09:44:42 -0400 |
---|---|---|
committer | Luca Coelho <luciano.coelho@intel.com> | 2016-07-01 09:51:22 -0400 |
commit | 4bdd4dfe7a893594a75ca324057f7010b1762bd2 (patch) | |
tree | f6406d257235bac887dbfcde16c88c5c5a2b752f | |
parent | af5e964f3045b66f1cd720b9c5abd37e47e613e2 (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>
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"); |
1656 | module_param_named(amsdu_size, iwlwifi_mod_params.amsdu_size, | 1656 | module_param_named(amsdu_size, iwlwifi_mod_params.amsdu_size, |
1657 | int, S_IRUGO); | 1657 | int, S_IRUGO); |
1658 | MODULE_PARM_DESC(amsdu_size, "amsdu size 0:4K 1:8K 2:12K (default 0)"); | 1658 | MODULE_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)"); | ||
1659 | module_param_named(fw_restart, iwlwifi_mod_params.restart_fw, bool, S_IRUGO); | 1660 | module_param_named(fw_restart, iwlwifi_mod_params.restart_fw, bool, S_IRUGO); |
1660 | MODULE_PARM_DESC(fw_restart, "restart firmware in case of error (default true)"); | 1661 | MODULE_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 | ||
89 | enum iwl_amsdu_size { | 89 | enum 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 | ||
95 | enum iwl_uapsd_disable { | 96 | enum 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 | ||