diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2012-06-07 06:44:14 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2012-06-13 03:01:03 -0400 |
commit | 5bf9a89d9a2eaa136a23d872db4195ca8cada4c8 (patch) | |
tree | 22ce7fcc538473df2f968e02ede530d02f188f53 /drivers/net | |
parent | 1ce8658c08f1c1baa72e3cdea43a9d715dad08a2 (diff) |
iwlwifi: remove lock around txq_enable
This locking isn't needed. The only locking we need is when
we access prph registers but there is already a separate
lock for that.
Since we haven't returned from the mac80211's
IEEE80211_AMPDU_TX_OPERATIONAL ampdu_action, we cannot
receive any Tx frame for that sta / tid while enabling the
queue.
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/internal.h | 5 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/trans.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/tx.c | 21 |
3 files changed, 5 insertions, 26 deletions
diff --git a/drivers/net/wireless/iwlwifi/pcie/internal.h b/drivers/net/wireless/iwlwifi/pcie/internal.h index 6c7b35530da..5024fb662bf 100644 --- a/drivers/net/wireless/iwlwifi/pcie/internal.h +++ b/drivers/net/wireless/iwlwifi/pcie/internal.h | |||
@@ -339,12 +339,9 @@ void iwl_tx_cmd_complete(struct iwl_trans *trans, | |||
339 | void iwl_trans_txq_update_byte_cnt_tbl(struct iwl_trans *trans, | 339 | void iwl_trans_txq_update_byte_cnt_tbl(struct iwl_trans *trans, |
340 | struct iwl_tx_queue *txq, | 340 | struct iwl_tx_queue *txq, |
341 | u16 byte_cnt); | 341 | u16 byte_cnt); |
342 | void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int queue); | ||
343 | void __iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, | ||
344 | int fifo, int sta_id, int tid, | ||
345 | int frame_limit, u16 ssn); | ||
346 | void iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, int fifo, | 342 | void iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, int fifo, |
347 | int sta_id, int tid, int frame_limit, u16 ssn); | 343 | int sta_id, int tid, int frame_limit, u16 ssn); |
344 | void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int queue); | ||
348 | void iwl_txq_free_tfd(struct iwl_trans *trans, struct iwl_tx_queue *txq, | 345 | void iwl_txq_free_tfd(struct iwl_trans *trans, struct iwl_tx_queue *txq, |
349 | enum dma_data_direction dma_dir); | 346 | enum dma_data_direction dma_dir); |
350 | int iwl_tx_queue_reclaim(struct iwl_trans *trans, int txq_id, int index, | 347 | int iwl_tx_queue_reclaim(struct iwl_trans *trans, int txq_id, int index, |
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c index 1904fdaf317..4d4cbae83a0 100644 --- a/drivers/net/wireless/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c | |||
@@ -1068,9 +1068,8 @@ static void iwl_tx_start(struct iwl_trans *trans) | |||
1068 | for (i = 0; i < trans_pcie->n_q_to_fifo; i++) { | 1068 | for (i = 0; i < trans_pcie->n_q_to_fifo; i++) { |
1069 | int fifo = trans_pcie->setup_q_to_fifo[i]; | 1069 | int fifo = trans_pcie->setup_q_to_fifo[i]; |
1070 | 1070 | ||
1071 | __iwl_trans_pcie_txq_enable(trans, i, fifo, IWL_INVALID_STATION, | 1071 | iwl_trans_pcie_txq_enable(trans, i, fifo, IWL_INVALID_STATION, |
1072 | IWL_TID_NON_QOS, | 1072 | IWL_TID_NON_QOS, SCD_FRAME_LIMIT, 0); |
1073 | SCD_FRAME_LIMIT, 0); | ||
1074 | } | 1073 | } |
1075 | 1074 | ||
1076 | /* Activate all Tx DMA/FIFO channels */ | 1075 | /* Activate all Tx DMA/FIFO channels */ |
diff --git a/drivers/net/wireless/iwlwifi/pcie/tx.c b/drivers/net/wireless/iwlwifi/pcie/tx.c index 4efdeb996e4..6baf8deef51 100644 --- a/drivers/net/wireless/iwlwifi/pcie/tx.c +++ b/drivers/net/wireless/iwlwifi/pcie/tx.c | |||
@@ -415,14 +415,11 @@ static inline void iwl_txq_set_inactive(struct iwl_trans *trans, u16 txq_id) | |||
415 | (1 << SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN)); | 415 | (1 << SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN)); |
416 | } | 416 | } |
417 | 417 | ||
418 | void __iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, | 418 | void iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, int fifo, |
419 | int fifo, int sta_id, int tid, | 419 | int sta_id, int tid, int frame_limit, u16 ssn) |
420 | int frame_limit, u16 ssn) | ||
421 | { | 420 | { |
422 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | 421 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
423 | 422 | ||
424 | lockdep_assert_held(&trans_pcie->irq_lock); | ||
425 | |||
426 | if (test_and_set_bit(txq_id, trans_pcie->queue_used)) | 423 | if (test_and_set_bit(txq_id, trans_pcie->queue_used)) |
427 | WARN_ONCE(1, "queue %d already used - expect issues", txq_id); | 424 | WARN_ONCE(1, "queue %d already used - expect issues", txq_id); |
428 | 425 | ||
@@ -480,20 +477,6 @@ void __iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, | |||
480 | txq_id, fifo, ssn & 0xff); | 477 | txq_id, fifo, ssn & 0xff); |
481 | } | 478 | } |
482 | 479 | ||
483 | void iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, int fifo, | ||
484 | int sta_id, int tid, int frame_limit, u16 ssn) | ||
485 | { | ||
486 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | ||
487 | unsigned long flags; | ||
488 | |||
489 | spin_lock_irqsave(&trans_pcie->irq_lock, flags); | ||
490 | |||
491 | __iwl_trans_pcie_txq_enable(trans, txq_id, fifo, sta_id, | ||
492 | tid, frame_limit, ssn); | ||
493 | |||
494 | spin_unlock_irqrestore(&trans_pcie->irq_lock, flags); | ||
495 | } | ||
496 | |||
497 | void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int txq_id) | 480 | void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int txq_id) |
498 | { | 481 | { |
499 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | 482 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |