|
@@ -7,7 +7,7 @@
|
|
*
|
|
*
|
|
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
|
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
|
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
|
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
|
- * Copyright(c) 2016 Intel Deutschland GmbH
|
|
|
|
|
|
+ * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
|
*
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of version 2 of the GNU General Public License as
|
|
* it under the terms of version 2 of the GNU General Public License as
|
|
@@ -34,6 +34,7 @@
|
|
*
|
|
*
|
|
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
|
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
|
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
|
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
|
|
|
+ * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
|
* All rights reserved.
|
|
* All rights reserved.
|
|
*
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* Redistribution and use in source and binary forms, with or without
|
|
@@ -628,8 +629,10 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb)
|
|
* values.
|
|
* values.
|
|
* Note that we don't need to make sure it isn't agg'd, since we're
|
|
* Note that we don't need to make sure it isn't agg'd, since we're
|
|
* TXing non-sta
|
|
* TXing non-sta
|
|
|
|
+ * For DQA mode - we shouldn't increase it though
|
|
*/
|
|
*/
|
|
- atomic_inc(&mvm->pending_frames[sta_id]);
|
|
|
|
|
|
+ if (!iwl_mvm_is_dqa_supported(mvm))
|
|
|
|
+ atomic_inc(&mvm->pending_frames[sta_id]);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -1005,11 +1008,8 @@ static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|
|
|
|
|
spin_unlock(&mvmsta->lock);
|
|
spin_unlock(&mvmsta->lock);
|
|
|
|
|
|
- /* Increase pending frames count if this isn't AMPDU */
|
|
|
|
- if ((iwl_mvm_is_dqa_supported(mvm) &&
|
|
|
|
- mvmsta->tid_data[tx_cmd->tid_tspec].state != IWL_AGG_ON &&
|
|
|
|
- mvmsta->tid_data[tx_cmd->tid_tspec].state != IWL_AGG_STARTING) ||
|
|
|
|
- (!iwl_mvm_is_dqa_supported(mvm) && !is_ampdu))
|
|
|
|
|
|
+ /* Increase pending frames count if this isn't AMPDU or DQA queue */
|
|
|
|
+ if (!iwl_mvm_is_dqa_supported(mvm) && !is_ampdu)
|
|
atomic_inc(&mvm->pending_frames[mvmsta->sta_id]);
|
|
atomic_inc(&mvm->pending_frames[mvmsta->sta_id]);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -1079,12 +1079,13 @@ static void iwl_mvm_check_ratid_empty(struct iwl_mvm *mvm,
|
|
lockdep_assert_held(&mvmsta->lock);
|
|
lockdep_assert_held(&mvmsta->lock);
|
|
|
|
|
|
if ((tid_data->state == IWL_AGG_ON ||
|
|
if ((tid_data->state == IWL_AGG_ON ||
|
|
- tid_data->state == IWL_EMPTYING_HW_QUEUE_DELBA) &&
|
|
|
|
|
|
+ tid_data->state == IWL_EMPTYING_HW_QUEUE_DELBA ||
|
|
|
|
+ iwl_mvm_is_dqa_supported(mvm)) &&
|
|
iwl_mvm_tid_queued(tid_data) == 0) {
|
|
iwl_mvm_tid_queued(tid_data) == 0) {
|
|
/*
|
|
/*
|
|
- * Now that this aggregation queue is empty tell mac80211 so it
|
|
|
|
- * knows we no longer have frames buffered for the station on
|
|
|
|
- * this TID (for the TIM bitmap calculation.)
|
|
|
|
|
|
+ * Now that this aggregation or DQA queue is empty tell
|
|
|
|
+ * mac80211 so it knows we no longer have frames buffered for
|
|
|
|
+ * the station on this TID (for the TIM bitmap calculation.)
|
|
*/
|
|
*/
|
|
ieee80211_sta_set_buffered(sta, tid, false);
|
|
ieee80211_sta_set_buffered(sta, tid, false);
|
|
}
|
|
}
|
|
@@ -1257,7 +1258,6 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
|
|
u8 skb_freed = 0;
|
|
u8 skb_freed = 0;
|
|
u16 next_reclaimed, seq_ctl;
|
|
u16 next_reclaimed, seq_ctl;
|
|
bool is_ndp = false;
|
|
bool is_ndp = false;
|
|
- bool txq_agg = false; /* Is this TXQ aggregated */
|
|
|
|
|
|
|
|
__skb_queue_head_init(&skbs);
|
|
__skb_queue_head_init(&skbs);
|
|
|
|
|
|
@@ -1283,6 +1283,10 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
|
|
info->flags |= IEEE80211_TX_STAT_ACK;
|
|
info->flags |= IEEE80211_TX_STAT_ACK;
|
|
break;
|
|
break;
|
|
case TX_STATUS_FAIL_DEST_PS:
|
|
case TX_STATUS_FAIL_DEST_PS:
|
|
|
|
+ /* In DQA, the FW should have stopped the queue and not
|
|
|
|
+ * return this status
|
|
|
|
+ */
|
|
|
|
+ WARN_ON(iwl_mvm_is_dqa_supported(mvm));
|
|
info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
|
|
info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
@@ -1387,15 +1391,6 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
|
|
bool send_eosp_ndp = false;
|
|
bool send_eosp_ndp = false;
|
|
|
|
|
|
spin_lock_bh(&mvmsta->lock);
|
|
spin_lock_bh(&mvmsta->lock);
|
|
- if (iwl_mvm_is_dqa_supported(mvm)) {
|
|
|
|
- enum iwl_mvm_agg_state state;
|
|
|
|
-
|
|
|
|
- state = mvmsta->tid_data[tid].state;
|
|
|
|
- txq_agg = (state == IWL_AGG_ON ||
|
|
|
|
- state == IWL_EMPTYING_HW_QUEUE_DELBA);
|
|
|
|
- } else {
|
|
|
|
- txq_agg = txq_id >= mvm->first_agg_queue;
|
|
|
|
- }
|
|
|
|
|
|
|
|
if (!is_ndp) {
|
|
if (!is_ndp) {
|
|
tid_data->next_reclaimed = next_reclaimed;
|
|
tid_data->next_reclaimed = next_reclaimed;
|
|
@@ -1452,11 +1447,11 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
|
|
* If the txq is not an AMPDU queue, there is no chance we freed
|
|
* If the txq is not an AMPDU queue, there is no chance we freed
|
|
* several skbs. Check that out...
|
|
* several skbs. Check that out...
|
|
*/
|
|
*/
|
|
- if (txq_agg)
|
|
|
|
|
|
+ if (iwl_mvm_is_dqa_supported(mvm) || txq_id >= mvm->first_agg_queue)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
/* We can't free more than one frame at once on a shared queue */
|
|
/* We can't free more than one frame at once on a shared queue */
|
|
- WARN_ON(!iwl_mvm_is_dqa_supported(mvm) && (skb_freed > 1));
|
|
|
|
|
|
+ WARN_ON(skb_freed > 1);
|
|
|
|
|
|
/* If we have still frames for this STA nothing to do here */
|
|
/* If we have still frames for this STA nothing to do here */
|
|
if (!atomic_sub_and_test(skb_freed, &mvm->pending_frames[sta_id]))
|
|
if (!atomic_sub_and_test(skb_freed, &mvm->pending_frames[sta_id]))
|