aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/dvm/tx.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2012-12-27 15:43:48 -0500
committerJohannes Berg <johannes.berg@intel.com>2013-02-05 08:39:12 -0500
commit2bfb50924c7e92362ac937aef2ab56bc7bd3ca52 (patch)
tree26518070c19eb9cfb38ab48cda31fe16c1235433 /drivers/net/wireless/iwlwifi/dvm/tx.c
parentc9f7a8ab7792b48259af6e94706a5d02dd74caef (diff)
iwlwifi: use threaded interrupt handler
With new transports coming up, move to threaded interrupt handling now. This has the advantage that we can use the same locking scheme with all different transports we may need to implement. Note that the TX path obviously still runs in a tasklet, so some spin_lock() calls need to change to spin_lock_bh() calls to properly lock out the TX path. In my test on a Calpella platform this has no impact on throughput or latency. Also add lockdep annotations to avoid lockups due to catch sending synchronous commands or using locks that connect with them from the irq thread. Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/dvm/tx.c')
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/tx.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/net/wireless/iwlwifi/dvm/tx.c b/drivers/net/wireless/iwlwifi/dvm/tx.c
index 7b0550d35a91..4ece5ea81b86 100644
--- a/drivers/net/wireless/iwlwifi/dvm/tx.c
+++ b/drivers/net/wireless/iwlwifi/dvm/tx.c
@@ -1117,7 +1117,7 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
1117 sta_id = (tx_resp->ra_tid & IWLAGN_TX_RES_RA_MSK) >> 1117 sta_id = (tx_resp->ra_tid & IWLAGN_TX_RES_RA_MSK) >>
1118 IWLAGN_TX_RES_RA_POS; 1118 IWLAGN_TX_RES_RA_POS;
1119 1119
1120 spin_lock(&priv->sta_lock); 1120 spin_lock_bh(&priv->sta_lock);
1121 1121
1122 if (is_agg) 1122 if (is_agg)
1123 iwl_rx_reply_tx_agg(priv, tx_resp); 1123 iwl_rx_reply_tx_agg(priv, tx_resp);
@@ -1239,11 +1239,11 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
1239 le16_to_cpu(tx_resp->seq_ctl)); 1239 le16_to_cpu(tx_resp->seq_ctl));
1240 1240
1241 iwl_check_abort_status(priv, tx_resp->frame_count, status); 1241 iwl_check_abort_status(priv, tx_resp->frame_count, status);
1242 spin_unlock(&priv->sta_lock); 1242 spin_unlock_bh(&priv->sta_lock);
1243 1243
1244 while (!skb_queue_empty(&skbs)) { 1244 while (!skb_queue_empty(&skbs)) {
1245 skb = __skb_dequeue(&skbs); 1245 skb = __skb_dequeue(&skbs);
1246 ieee80211_tx_status(priv->hw, skb); 1246 ieee80211_tx_status_ni(priv->hw, skb);
1247 } 1247 }
1248 1248
1249 if (is_offchannel_skb) 1249 if (is_offchannel_skb)
@@ -1290,12 +1290,12 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
1290 tid = ba_resp->tid; 1290 tid = ba_resp->tid;
1291 agg = &priv->tid_data[sta_id][tid].agg; 1291 agg = &priv->tid_data[sta_id][tid].agg;
1292 1292
1293 spin_lock(&priv->sta_lock); 1293 spin_lock_bh(&priv->sta_lock);
1294 1294
1295 if (unlikely(!agg->wait_for_ba)) { 1295 if (unlikely(!agg->wait_for_ba)) {
1296 if (unlikely(ba_resp->bitmap)) 1296 if (unlikely(ba_resp->bitmap))
1297 IWL_ERR(priv, "Received BA when not expected\n"); 1297 IWL_ERR(priv, "Received BA when not expected\n");
1298 spin_unlock(&priv->sta_lock); 1298 spin_unlock_bh(&priv->sta_lock);
1299 return 0; 1299 return 0;
1300 } 1300 }
1301 1301
@@ -1309,7 +1309,7 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
1309 IWL_DEBUG_TX_QUEUES(priv, 1309 IWL_DEBUG_TX_QUEUES(priv,
1310 "Bad queue mapping txq_id=%d, agg_txq[sta:%d,tid:%d]=%d\n", 1310 "Bad queue mapping txq_id=%d, agg_txq[sta:%d,tid:%d]=%d\n",
1311 scd_flow, sta_id, tid, agg->txq_id); 1311 scd_flow, sta_id, tid, agg->txq_id);
1312 spin_unlock(&priv->sta_lock); 1312 spin_unlock_bh(&priv->sta_lock);
1313 return 0; 1313 return 0;
1314 } 1314 }
1315 1315
@@ -1378,11 +1378,11 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
1378 } 1378 }
1379 } 1379 }
1380 1380
1381 spin_unlock(&priv->sta_lock); 1381 spin_unlock_bh(&priv->sta_lock);
1382 1382
1383 while (!skb_queue_empty(&reclaimed_skbs)) { 1383 while (!skb_queue_empty(&reclaimed_skbs)) {
1384 skb = __skb_dequeue(&reclaimed_skbs); 1384 skb = __skb_dequeue(&reclaimed_skbs);
1385 ieee80211_tx_status(priv->hw, skb); 1385 ieee80211_tx_status_ni(priv->hw, skb);
1386 } 1386 }
1387 1387
1388 return 0; 1388 return 0;