aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSara Sharon <sara.sharon@intel.com>2017-01-01 11:42:23 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-05-14 08:00:17 -0400
commit495f91630205b441ead5461580703575c18324ec (patch)
tree3b6805825802bddd472a8c8a554093e67b61540e
parent4d6f2ac95bc55bd78c415006a67c03e787d79989 (diff)
iwlwifi: mvm: fix references to first_agg_queue in DQA mode
commit c56108b58ab870892277940a1def0d6b153f3e26 upstream. In DQA mode, first_agg_queue is initialized to IWL_MVM_DQA_MIN_DATA_QUEUE. This causes two bugs in the tx response flow: 1. When TX fails, we set IEEE80211_TX_STAT_AMPDU_NO_BACK regardless if we actually have aggregation open on the queue. This causes mac80211 to send a BAR frame even though there is no aggregation open. Fix that by simply checking the AMPDU flag that is set on by mac80211 for AMPDU packets. 2. When reclaiming frames in aggregation mode, we reclaim based on scheduler ssn and not the SN. The reason is that scheduler ssn may be ahead of SN due to a hole in the BA window that was filled. However, if we have aggregations open on IWL_MVM_DQA_BSS_CLIENT_QUEUE the reclaim flow will still go to the code of non-aggregation instead of the aggregation code since IWL_MVM_DQA_BSS_CLIENT_QUEUE is smaller than IWL_MVM_DQA_MIN_DATA_QUEUE, although it is a valid aggregation queue. Fix that by always using the aggregation reclaim code by default in DQA mode (currently it is implicitly used by default for all queues except the reserved BSS queue). Fixes: cf961e16620f ("iwlwifi: mvm: support dqa-mode agg on non-shared queue") Signed-off-by: Sara Sharon <sara.sharon@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/tx.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
index 4cb839ae3e22..0556d139b719 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
@@ -1278,8 +1278,6 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
1278 1278
1279 memset(&info->status, 0, sizeof(info->status)); 1279 memset(&info->status, 0, sizeof(info->status));
1280 1280
1281 info->flags &= ~IEEE80211_TX_CTL_AMPDU;
1282
1283 /* inform mac80211 about what happened with the frame */ 1281 /* inform mac80211 about what happened with the frame */
1284 switch (status & TX_STATUS_MSK) { 1282 switch (status & TX_STATUS_MSK) {
1285 case TX_STATUS_SUCCESS: 1283 case TX_STATUS_SUCCESS:
@@ -1302,10 +1300,11 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
1302 (void *)(uintptr_t)le32_to_cpu(tx_resp->initial_rate); 1300 (void *)(uintptr_t)le32_to_cpu(tx_resp->initial_rate);
1303 1301
1304 /* Single frame failure in an AMPDU queue => send BAR */ 1302 /* Single frame failure in an AMPDU queue => send BAR */
1305 if (txq_id >= mvm->first_agg_queue && 1303 if (info->flags & IEEE80211_TX_CTL_AMPDU &&
1306 !(info->flags & IEEE80211_TX_STAT_ACK) && 1304 !(info->flags & IEEE80211_TX_STAT_ACK) &&
1307 !(info->flags & IEEE80211_TX_STAT_TX_FILTERED)) 1305 !(info->flags & IEEE80211_TX_STAT_TX_FILTERED))
1308 info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK; 1306 info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK;
1307 info->flags &= ~IEEE80211_TX_CTL_AMPDU;
1309 1308
1310 /* W/A FW bug: seq_ctl is wrong when the status isn't success */ 1309 /* W/A FW bug: seq_ctl is wrong when the status isn't success */
1311 if (status != TX_STATUS_SUCCESS) { 1310 if (status != TX_STATUS_SUCCESS) {
@@ -1340,7 +1339,7 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
1340 ieee80211_tx_status(mvm->hw, skb); 1339 ieee80211_tx_status(mvm->hw, skb);
1341 } 1340 }
1342 1341
1343 if (txq_id >= mvm->first_agg_queue) { 1342 if (iwl_mvm_is_dqa_supported(mvm) || txq_id >= mvm->first_agg_queue) {
1344 /* If this is an aggregation queue, we use the ssn since: 1343 /* If this is an aggregation queue, we use the ssn since:
1345 * ssn = wifi seq_num % 256. 1344 * ssn = wifi seq_num % 256.
1346 * The seq_ctl is the sequence control of the packet to which 1345 * The seq_ctl is the sequence control of the packet to which