aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2011-12-16 10:13:25 -0500
committerWey-Yi Guy <wey-yi.w.guy@intel.com>2011-12-16 10:23:01 -0500
commit20addec6ac77fbffa1c913f8d07d3a78a9e50321 (patch)
tree9952fb8bb300ea2208d84dda32bac77225f7099b /drivers/net/wireless/iwlwifi/iwl-agn-tx.c
parent822e8b2a2d708f99daf1ae4cd9b9e4c9d84069c6 (diff)
iwlwifi: tid_data logic move to upper layer - check_empty
The tid_data is not related to the transport layer, so move the logic that depends on it to the upper layer. This patch deals with the code that checks if there are still pending packets for an RA / TID. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-agn-tx.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-tx.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
index c46d50dfbc7c..6321ea2fffa9 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
@@ -588,6 +588,43 @@ int iwlagn_tx_agg_oper(struct iwl_priv *priv, struct ieee80211_vif *vif,
588 &sta_priv->lq_sta.lq, CMD_ASYNC, false); 588 &sta_priv->lq_sta.lq, CMD_ASYNC, false);
589} 589}
590 590
591static void iwlagn_check_ratid_empty(struct iwl_priv *priv, int sta_id, u8 tid)
592{
593 struct iwl_tid_data *tid_data = &priv->shrd->tid_data[sta_id][tid];
594
595 lockdep_assert_held(&priv->shrd->sta_lock);
596
597 switch (priv->shrd->tid_data[sta_id][tid].agg.state) {
598 case IWL_EMPTYING_HW_QUEUE_DELBA:
599 /* There are no packets for this RA / TID in the HW any more */
600 if (tid_data->agg.ssn == tid_data->next_reclaimed) {
601 IWL_DEBUG_TX_QUEUES(priv,
602 "Can continue DELBA flow ssn = next_recl ="
603 " %d", tid_data->next_reclaimed);
604 iwl_trans_tx_agg_disable(trans(priv), sta_id, tid);
605 tid_data->agg.state = IWL_AGG_OFF;
606 iwl_stop_tx_ba_trans_ready(priv,
607 NUM_IWL_RXON_CTX,
608 sta_id, tid);
609 }
610 break;
611 case IWL_EMPTYING_HW_QUEUE_ADDBA:
612 /* There are no packets for this RA / TID in the HW any more */
613 if (tid_data->agg.ssn == tid_data->next_reclaimed) {
614 IWL_DEBUG_TX_QUEUES(priv,
615 "Can continue ADDBA flow ssn = next_recl ="
616 " %d", tid_data->next_reclaimed);
617 tid_data->agg.state = IWL_AGG_ON;
618 iwl_start_tx_ba_trans_ready(priv,
619 NUM_IWL_RXON_CTX,
620 sta_id, tid);
621 }
622 break;
623 default:
624 break;
625 }
626}
627
591static void iwlagn_non_agg_tx_status(struct iwl_priv *priv, 628static void iwlagn_non_agg_tx_status(struct iwl_priv *priv,
592 struct iwl_rxon_context *ctx, 629 struct iwl_rxon_context *ctx,
593 const u8 *addr1) 630 const u8 *addr1)
@@ -965,6 +1002,7 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb,
965 /*we can free until ssn % q.n_bd not inclusive */ 1002 /*we can free until ssn % q.n_bd not inclusive */
966 iwl_trans_reclaim(trans(priv), sta_id, tid, txq_id, 1003 iwl_trans_reclaim(trans(priv), sta_id, tid, txq_id,
967 ssn, status, &skbs); 1004 ssn, status, &skbs);
1005 iwlagn_check_ratid_empty(priv, sta_id, tid);
968 freed = 0; 1006 freed = 0;
969 while (!skb_queue_empty(&skbs)) { 1007 while (!skb_queue_empty(&skbs)) {
970 skb = __skb_dequeue(&skbs); 1008 skb = __skb_dequeue(&skbs);
@@ -1120,6 +1158,7 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
1120 priv->shrd->tid_data[sta_id][tid].next_reclaimed = ba_resp_scd_ssn; 1158 priv->shrd->tid_data[sta_id][tid].next_reclaimed = ba_resp_scd_ssn;
1121 iwl_trans_reclaim(trans(priv), sta_id, tid, scd_flow, ba_resp_scd_ssn, 1159 iwl_trans_reclaim(trans(priv), sta_id, tid, scd_flow, ba_resp_scd_ssn,
1122 0, &reclaimed_skbs); 1160 0, &reclaimed_skbs);
1161 iwlagn_check_ratid_empty(priv, sta_id, tid);
1123 freed = 0; 1162 freed = 0;
1124 while (!skb_queue_empty(&reclaimed_skbs)) { 1163 while (!skb_queue_empty(&reclaimed_skbs)) {
1125 1164