mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 15:11:31 +00:00
iwlwifi: disable TX AMPDU by default for iwldvm
NICs supported by iwldvm don't handle well TX AMPDU. Disable it by default, still leave the possibility to the user to force enable it with a debug parameter. NICs supported by iwlmvm don't suffer from the same issue, leave TX AMPDU enabled by default for these. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
This commit is contained in:
parent
c512865446
commit
205e2210da
@ -696,6 +696,24 @@ static int iwlagn_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline bool iwl_enable_rx_ampdu(const struct iwl_cfg *cfg)
|
||||
{
|
||||
if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool iwl_enable_tx_ampdu(const struct iwl_cfg *cfg)
|
||||
{
|
||||
if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_TXAGG)
|
||||
return false;
|
||||
if (iwlwifi_mod_params.disable_11n & IWL_ENABLE_HT_TXAGG)
|
||||
return true;
|
||||
|
||||
/* disabled by default */
|
||||
return false;
|
||||
}
|
||||
|
||||
static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
enum ieee80211_ampdu_mlme_action action,
|
||||
@ -717,7 +735,7 @@ static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
|
||||
|
||||
switch (action) {
|
||||
case IEEE80211_AMPDU_RX_START:
|
||||
if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG)
|
||||
if (!iwl_enable_rx_ampdu(priv->cfg))
|
||||
break;
|
||||
IWL_DEBUG_HT(priv, "start Rx\n");
|
||||
ret = iwl_sta_rx_agg_start(priv, sta, tid, *ssn);
|
||||
@ -729,7 +747,7 @@ static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
|
||||
case IEEE80211_AMPDU_TX_START:
|
||||
if (!priv->trans->ops->txq_enable)
|
||||
break;
|
||||
if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_TXAGG)
|
||||
if (!iwl_enable_tx_ampdu(priv->cfg))
|
||||
break;
|
||||
IWL_DEBUG_HT(priv, "start Tx\n");
|
||||
ret = iwlagn_tx_agg_start(priv, vif, sta, tid, ssn);
|
||||
|
@ -1286,7 +1286,7 @@ module_param_named(swcrypto, iwlwifi_mod_params.sw_crypto, int, S_IRUGO);
|
||||
MODULE_PARM_DESC(swcrypto, "using crypto in software (default 0 [hardware])");
|
||||
module_param_named(11n_disable, iwlwifi_mod_params.disable_11n, uint, S_IRUGO);
|
||||
MODULE_PARM_DESC(11n_disable,
|
||||
"disable 11n functionality, bitmap: 1: full, 2: agg TX, 4: agg RX");
|
||||
"disable 11n functionality, bitmap: 1: full, 2: disable agg TX, 4: disable agg RX, 8 enable agg TX");
|
||||
module_param_named(amsdu_size_8K, iwlwifi_mod_params.amsdu_size_8K,
|
||||
int, S_IRUGO);
|
||||
MODULE_PARM_DESC(amsdu_size_8K, "enable 8K amsdu size (default 0)");
|
||||
|
@ -79,9 +79,12 @@ enum iwl_power_level {
|
||||
IWL_POWER_NUM
|
||||
};
|
||||
|
||||
#define IWL_DISABLE_HT_ALL BIT(0)
|
||||
#define IWL_DISABLE_HT_TXAGG BIT(1)
|
||||
#define IWL_DISABLE_HT_RXAGG BIT(2)
|
||||
enum iwl_disable_11n {
|
||||
IWL_DISABLE_HT_ALL = BIT(0),
|
||||
IWL_DISABLE_HT_TXAGG = BIT(1),
|
||||
IWL_DISABLE_HT_RXAGG = BIT(2),
|
||||
IWL_ENABLE_HT_TXAGG = BIT(3),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_mod_params
|
||||
@ -90,7 +93,7 @@ enum iwl_power_level {
|
||||
*
|
||||
* @sw_crypto: using hardware encryption, default = 0
|
||||
* @disable_11n: disable 11n capabilities, default = 0,
|
||||
* use IWL_DISABLE_HT_* constants
|
||||
* use IWL_[DIS,EN]ABLE_HT_* constants
|
||||
* @amsdu_size_8K: enable 8K amsdu size, default = 0
|
||||
* @restart_fw: restart firmware, default = 1
|
||||
* @wd_disable: enable stuck queue check, default = 0
|
||||
|
@ -328,6 +328,24 @@ static void iwl_mvm_mac_tx(struct ieee80211_hw *hw,
|
||||
ieee80211_free_txskb(hw, skb);
|
||||
}
|
||||
|
||||
static inline bool iwl_enable_rx_ampdu(const struct iwl_cfg *cfg)
|
||||
{
|
||||
if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool iwl_enable_tx_ampdu(const struct iwl_cfg *cfg)
|
||||
{
|
||||
if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_TXAGG)
|
||||
return false;
|
||||
if (iwlwifi_mod_params.disable_11n & IWL_ENABLE_HT_TXAGG)
|
||||
return true;
|
||||
|
||||
/* enabled by default */
|
||||
return true;
|
||||
}
|
||||
|
||||
static int iwl_mvm_mac_ampdu_action(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
enum ieee80211_ampdu_mlme_action action,
|
||||
@ -347,7 +365,7 @@ static int iwl_mvm_mac_ampdu_action(struct ieee80211_hw *hw,
|
||||
|
||||
switch (action) {
|
||||
case IEEE80211_AMPDU_RX_START:
|
||||
if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG) {
|
||||
if (!iwl_enable_rx_ampdu(mvm->cfg)) {
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
@ -357,7 +375,7 @@ static int iwl_mvm_mac_ampdu_action(struct ieee80211_hw *hw,
|
||||
ret = iwl_mvm_sta_rx_agg(mvm, sta, tid, 0, false);
|
||||
break;
|
||||
case IEEE80211_AMPDU_TX_START:
|
||||
if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_TXAGG) {
|
||||
if (!iwl_enable_tx_ampdu(mvm->cfg)) {
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user