aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi
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
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')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-tx.c39
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans-pcie.c43
2 files changed, 39 insertions, 43 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
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
index 15bee2b97c02..5d44ec5f111c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
+++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
@@ -1275,47 +1275,6 @@ static int iwl_trans_pcie_request_irq(struct iwl_trans *trans)
1275 return 0; 1275 return 0;
1276} 1276}
1277 1277
1278static int iwlagn_txq_check_empty(struct iwl_trans *trans,
1279 int sta_id, u8 tid, int txq_id)
1280{
1281 struct iwl_tid_data *tid_data = &trans->shrd->tid_data[sta_id][tid];
1282
1283 lockdep_assert_held(&trans->shrd->sta_lock);
1284
1285 switch (trans->shrd->tid_data[sta_id][tid].agg.state) {
1286 case IWL_EMPTYING_HW_QUEUE_DELBA:
1287 /* There are no packets for this RA / TID in the HW any more */
1288 if ((txq_id == tid_data->agg.txq_id) &&
1289 (tid_data->agg.ssn == tid_data->next_reclaimed)) {
1290 IWL_DEBUG_TX_QUEUES(trans,
1291 "Can continue DELBA flow ssn = next_recl ="
1292 " %d", tid_data->next_reclaimed);
1293 iwl_trans_pcie_tx_agg_disable(trans, sta_id, tid);
1294 tid_data->agg.state = IWL_AGG_OFF;
1295 iwl_stop_tx_ba_trans_ready(priv(trans),
1296 NUM_IWL_RXON_CTX,
1297 sta_id, tid);
1298 }
1299 break;
1300 case IWL_EMPTYING_HW_QUEUE_ADDBA:
1301 /* There are no packets for this RA / TID in the HW any more */
1302 if (tid_data->agg.ssn == tid_data->next_reclaimed) {
1303 IWL_DEBUG_TX_QUEUES(trans,
1304 "Can continue ADDBA flow ssn = next_recl ="
1305 " %d", tid_data->next_reclaimed);
1306 tid_data->agg.state = IWL_AGG_ON;
1307 iwl_start_tx_ba_trans_ready(priv(trans),
1308 NUM_IWL_RXON_CTX,
1309 sta_id, tid);
1310 }
1311 break;
1312 default:
1313 break;
1314 }
1315
1316 return 0;
1317}
1318
1319static void iwl_trans_pcie_reclaim(struct iwl_trans *trans, int sta_id, int tid, 1278static void iwl_trans_pcie_reclaim(struct iwl_trans *trans, int sta_id, int tid,
1320 int txq_id, int ssn, u32 status, 1279 int txq_id, int ssn, u32 status,
1321 struct sk_buff_head *skbs) 1280 struct sk_buff_head *skbs)
@@ -1338,8 +1297,6 @@ static void iwl_trans_pcie_reclaim(struct iwl_trans *trans, int sta_id, int tid,
1338 status != TX_STATUS_FAIL_PASSIVE_NO_RX)) 1297 status != TX_STATUS_FAIL_PASSIVE_NO_RX))
1339 iwl_wake_queue(trans, txq, "Packets reclaimed"); 1298 iwl_wake_queue(trans, txq, "Packets reclaimed");
1340 } 1299 }
1341
1342 iwlagn_txq_check_empty(trans, sta_id, tid, txq_id);
1343} 1300}
1344 1301
1345static void iwl_trans_pcie_free(struct iwl_trans *trans) 1302static void iwl_trans_pcie_free(struct iwl_trans *trans)