aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-3945.c12
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-4965.c26
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c60
-rw-r--r--drivers/net/wireless/iwlwifi/iwl4965-base.c64
-rw-r--r--drivers/net/wireless/iwlwifi/iwlwifi.h4
5 files changed, 83 insertions, 83 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c
index d6112816bada..b8d43436d35a 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945.c
+++ b/drivers/net/wireless/iwlwifi/iwl-3945.c
@@ -526,14 +526,14 @@ int iwl_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv, void *ptr,
526} 526}
527 527
528/** 528/**
529 * iwl_hw_txq_free_tfd - Free one TFD, those at index [txq->q.last_used] 529 * iwl_hw_txq_free_tfd - Free one TFD, those at index [txq->q.read_ptr]
530 * 530 *
531 * Does NOT advance any indexes 531 * Does NOT advance any indexes
532 */ 532 */
533int iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq) 533int iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq)
534{ 534{
535 struct iwl_tfd_frame *bd_tmp = (struct iwl_tfd_frame *)&txq->bd[0]; 535 struct iwl_tfd_frame *bd_tmp = (struct iwl_tfd_frame *)&txq->bd[0];
536 struct iwl_tfd_frame *bd = &bd_tmp[txq->q.last_used]; 536 struct iwl_tfd_frame *bd = &bd_tmp[txq->q.read_ptr];
537 struct pci_dev *dev = priv->pci_dev; 537 struct pci_dev *dev = priv->pci_dev;
538 int i; 538 int i;
539 int counter; 539 int counter;
@@ -556,12 +556,12 @@ int iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq)
556 for (i = 1; i < counter; i++) { 556 for (i = 1; i < counter; i++) {
557 pci_unmap_single(dev, le32_to_cpu(bd->pa[i].addr), 557 pci_unmap_single(dev, le32_to_cpu(bd->pa[i].addr),
558 le32_to_cpu(bd->pa[i].len), PCI_DMA_TODEVICE); 558 le32_to_cpu(bd->pa[i].len), PCI_DMA_TODEVICE);
559 if (txq->txb[txq->q.last_used].skb[0]) { 559 if (txq->txb[txq->q.read_ptr].skb[0]) {
560 struct sk_buff *skb = txq->txb[txq->q.last_used].skb[0]; 560 struct sk_buff *skb = txq->txb[txq->q.read_ptr].skb[0];
561 if (txq->txb[txq->q.last_used].skb[0]) { 561 if (txq->txb[txq->q.read_ptr].skb[0]) {
562 /* Can be called from interrupt context */ 562 /* Can be called from interrupt context */
563 dev_kfree_skb_any(skb); 563 dev_kfree_skb_any(skb);
564 txq->txb[txq->q.last_used].skb[0] = NULL; 564 txq->txb[txq->q.read_ptr].skb[0] = NULL;
565 } 565 }
566 } 566 }
567 } 567 }
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
index 7ff8f72d482d..d7e181f9ce80 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
@@ -1749,14 +1749,14 @@ void iwl_hw_txq_ctx_free(struct iwl_priv *priv)
1749} 1749}
1750 1750
1751/** 1751/**
1752 * iwl_hw_txq_free_tfd - Free one TFD, those at index [txq->q.last_used] 1752 * iwl_hw_txq_free_tfd - Free one TFD, those at index [txq->q.read_ptr]
1753 * 1753 *
1754 * Does NOT advance any indexes 1754 * Does NOT advance any indexes
1755 */ 1755 */
1756int iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq) 1756int iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq)
1757{ 1757{
1758 struct iwl_tfd_frame *bd_tmp = (struct iwl_tfd_frame *)&txq->bd[0]; 1758 struct iwl_tfd_frame *bd_tmp = (struct iwl_tfd_frame *)&txq->bd[0];
1759 struct iwl_tfd_frame *bd = &bd_tmp[txq->q.last_used]; 1759 struct iwl_tfd_frame *bd = &bd_tmp[txq->q.read_ptr];
1760 struct pci_dev *dev = priv->pci_dev; 1760 struct pci_dev *dev = priv->pci_dev;
1761 int i; 1761 int i;
1762 int counter = 0; 1762 int counter = 0;
@@ -1796,11 +1796,11 @@ int iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq)
1796 IWL_GET_BITS(bd->pa[index], tb1_len), 1796 IWL_GET_BITS(bd->pa[index], tb1_len),
1797 PCI_DMA_TODEVICE); 1797 PCI_DMA_TODEVICE);
1798 1798
1799 if (txq->txb[txq->q.last_used].skb[i]) { 1799 if (txq->txb[txq->q.read_ptr].skb[i]) {
1800 struct sk_buff *skb = txq->txb[txq->q.last_used].skb[i]; 1800 struct sk_buff *skb = txq->txb[txq->q.read_ptr].skb[i];
1801 1801
1802 dev_kfree_skb(skb); 1802 dev_kfree_skb(skb);
1803 txq->txb[txq->q.last_used].skb[i] = NULL; 1803 txq->txb[txq->q.read_ptr].skb[i] = NULL;
1804 } 1804 }
1805 } 1805 }
1806 return 0; 1806 return 0;
@@ -2776,11 +2776,11 @@ int iwl4965_tx_queue_update_wr_ptr(struct iwl_priv *priv,
2776 len = byte_cnt + IWL_TX_CRC_SIZE + IWL_TX_DELIMITER_SIZE; 2776 len = byte_cnt + IWL_TX_CRC_SIZE + IWL_TX_DELIMITER_SIZE;
2777 2777
2778 IWL_SET_BITS16(shared_data->queues_byte_cnt_tbls[txq_id]. 2778 IWL_SET_BITS16(shared_data->queues_byte_cnt_tbls[txq_id].
2779 tfd_offset[txq->q.first_empty], byte_cnt, len); 2779 tfd_offset[txq->q.write_ptr], byte_cnt, len);
2780 2780
2781 if (txq->q.first_empty < IWL4965_MAX_WIN_SIZE) 2781 if (txq->q.write_ptr < IWL4965_MAX_WIN_SIZE)
2782 IWL_SET_BITS16(shared_data->queues_byte_cnt_tbls[txq_id]. 2782 IWL_SET_BITS16(shared_data->queues_byte_cnt_tbls[txq_id].
2783 tfd_offset[IWL4965_QUEUE_SIZE + txq->q.first_empty], 2783 tfd_offset[IWL4965_QUEUE_SIZE + txq->q.write_ptr],
2784 byte_cnt, len); 2784 byte_cnt, len);
2785 2785
2786 return 0; 2786 return 0;
@@ -4134,7 +4134,7 @@ static void iwl4965_rx_reply_compressed_ba(struct iwl_priv *priv,
4134*/ 4134*/
4135 iwl4965_tx_status_reply_compressed_ba(priv, agg, ba_resp); 4135 iwl4965_tx_status_reply_compressed_ba(priv, agg, ba_resp);
4136 /* releases all the TFDs until the SSN */ 4136 /* releases all the TFDs until the SSN */
4137 if (txq->q.last_used != (ba_resp_scd_ssn & 0xff)) 4137 if (txq->q.read_ptr != (ba_resp_scd_ssn & 0xff))
4138 iwl_tx_queue_reclaim(priv, ba_resp_scd_flow, index); 4138 iwl_tx_queue_reclaim(priv, ba_resp_scd_flow, index);
4139 4139
4140} 4140}
@@ -4205,8 +4205,8 @@ static int iwl4965_tx_queue_agg_enable(struct iwl_priv *priv, int txq_id,
4205 4205
4206 iwl_set_bits_restricted_reg(priv, SCD_QUEUECHAIN_SEL, (1<<txq_id)); 4206 iwl_set_bits_restricted_reg(priv, SCD_QUEUECHAIN_SEL, (1<<txq_id));
4207 4207
4208 priv->txq[txq_id].q.last_used = (ssn_idx & 0xff); 4208 priv->txq[txq_id].q.read_ptr = (ssn_idx & 0xff);
4209 priv->txq[txq_id].q.first_empty = (ssn_idx & 0xff); 4209 priv->txq[txq_id].q.write_ptr = (ssn_idx & 0xff);
4210 4210
4211 /* supposes that ssn_idx is valid (!= 0xFFF) */ 4211 /* supposes that ssn_idx is valid (!= 0xFFF) */
4212 iwl4965_set_wr_ptrs(priv, txq_id, ssn_idx); 4212 iwl4965_set_wr_ptrs(priv, txq_id, ssn_idx);
@@ -4257,8 +4257,8 @@ static int iwl4965_tx_queue_agg_disable(struct iwl_priv *priv, u16 txq_id,
4257 4257
4258 iwl_clear_bits_restricted_reg(priv, SCD_QUEUECHAIN_SEL, (1 << txq_id)); 4258 iwl_clear_bits_restricted_reg(priv, SCD_QUEUECHAIN_SEL, (1 << txq_id));
4259 4259
4260 priv->txq[txq_id].q.last_used = (ssn_idx & 0xff); 4260 priv->txq[txq_id].q.read_ptr = (ssn_idx & 0xff);
4261 priv->txq[txq_id].q.first_empty = (ssn_idx & 0xff); 4261 priv->txq[txq_id].q.write_ptr = (ssn_idx & 0xff);
4262 /* supposes that ssn_idx is valid (!= 0xFFF) */ 4262 /* supposes that ssn_idx is valid (!= 0xFFF) */
4263 iwl4965_set_wr_ptrs(priv, txq_id, ssn_idx); 4263 iwl4965_set_wr_ptrs(priv, txq_id, ssn_idx);
4264 4264
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index 4fd9eac6516c..f6022649a6b7 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -209,9 +209,9 @@ static void iwl_print_hex_dump(int level, void *p, u32 len)
209 209
210static int iwl_queue_space(const struct iwl_queue *q) 210static int iwl_queue_space(const struct iwl_queue *q)
211{ 211{
212 int s = q->last_used - q->first_empty; 212 int s = q->read_ptr - q->write_ptr;
213 213
214 if (q->last_used > q->first_empty) 214 if (q->read_ptr > q->write_ptr)
215 s -= q->n_bd; 215 s -= q->n_bd;
216 216
217 if (s <= 0) 217 if (s <= 0)
@@ -237,9 +237,9 @@ static inline int iwl_queue_dec_wrap(int index, int n_bd)
237 237
238static inline int x2_queue_used(const struct iwl_queue *q, int i) 238static inline int x2_queue_used(const struct iwl_queue *q, int i)
239{ 239{
240 return q->first_empty > q->last_used ? 240 return q->write_ptr > q->read_ptr ?
241 (i >= q->last_used && i < q->first_empty) : 241 (i >= q->read_ptr && i < q->write_ptr) :
242 !(i < q->last_used && i >= q->first_empty); 242 !(i < q->read_ptr && i >= q->write_ptr);
243} 243}
244 244
245static inline u8 get_cmd_index(struct iwl_queue *q, u32 index, int is_huge) 245static inline u8 get_cmd_index(struct iwl_queue *q, u32 index, int is_huge)
@@ -273,7 +273,7 @@ static int iwl_queue_init(struct iwl_priv *priv, struct iwl_queue *q,
273 if (q->high_mark < 2) 273 if (q->high_mark < 2)
274 q->high_mark = 2; 274 q->high_mark = 2;
275 275
276 q->first_empty = q->last_used = 0; 276 q->write_ptr = q->read_ptr = 0;
277 277
278 return 0; 278 return 0;
279} 279}
@@ -369,8 +369,8 @@ void iwl_tx_queue_free(struct iwl_priv *priv, struct iwl_tx_queue *txq)
369 return; 369 return;
370 370
371 /* first, empty all BD's */ 371 /* first, empty all BD's */
372 for (; q->first_empty != q->last_used; 372 for (; q->write_ptr != q->read_ptr;
373 q->last_used = iwl_queue_inc_wrap(q->last_used, q->n_bd)) 373 q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd))
374 iwl_hw_txq_free_tfd(priv, txq); 374 iwl_hw_txq_free_tfd(priv, txq);
375 375
376 len = sizeof(struct iwl_cmd) * q->n_window; 376 len = sizeof(struct iwl_cmd) * q->n_window;
@@ -649,12 +649,12 @@ static int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
649 649
650 spin_lock_irqsave(&priv->hcmd_lock, flags); 650 spin_lock_irqsave(&priv->hcmd_lock, flags);
651 651
652 tfd = &txq->bd[q->first_empty]; 652 tfd = &txq->bd[q->write_ptr];
653 memset(tfd, 0, sizeof(*tfd)); 653 memset(tfd, 0, sizeof(*tfd));
654 654
655 control_flags = (u32 *) tfd; 655 control_flags = (u32 *) tfd;
656 656
657 idx = get_cmd_index(q, q->first_empty, cmd->meta.flags & CMD_SIZE_HUGE); 657 idx = get_cmd_index(q, q->write_ptr, cmd->meta.flags & CMD_SIZE_HUGE);
658 out_cmd = &txq->cmd[idx]; 658 out_cmd = &txq->cmd[idx];
659 659
660 out_cmd->hdr.cmd = cmd->id; 660 out_cmd->hdr.cmd = cmd->id;
@@ -666,7 +666,7 @@ static int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
666 666
667 out_cmd->hdr.flags = 0; 667 out_cmd->hdr.flags = 0;
668 out_cmd->hdr.sequence = cpu_to_le16(QUEUE_TO_SEQ(IWL_CMD_QUEUE_NUM) | 668 out_cmd->hdr.sequence = cpu_to_le16(QUEUE_TO_SEQ(IWL_CMD_QUEUE_NUM) |
669 INDEX_TO_SEQ(q->first_empty)); 669 INDEX_TO_SEQ(q->write_ptr));
670 if (out_cmd->meta.flags & CMD_SIZE_HUGE) 670 if (out_cmd->meta.flags & CMD_SIZE_HUGE)
671 out_cmd->hdr.sequence |= cpu_to_le16(SEQ_HUGE_FRAME); 671 out_cmd->hdr.sequence |= cpu_to_le16(SEQ_HUGE_FRAME);
672 672
@@ -682,10 +682,10 @@ static int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
682 "%d bytes at %d[%d]:%d\n", 682 "%d bytes at %d[%d]:%d\n",
683 get_cmd_string(out_cmd->hdr.cmd), 683 get_cmd_string(out_cmd->hdr.cmd),
684 out_cmd->hdr.cmd, le16_to_cpu(out_cmd->hdr.sequence), 684 out_cmd->hdr.cmd, le16_to_cpu(out_cmd->hdr.sequence),
685 fix_size, q->first_empty, idx, IWL_CMD_QUEUE_NUM); 685 fix_size, q->write_ptr, idx, IWL_CMD_QUEUE_NUM);
686 686
687 txq->need_update = 1; 687 txq->need_update = 1;
688 q->first_empty = iwl_queue_inc_wrap(q->first_empty, q->n_bd); 688 q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd);
689 ret = iwl_tx_queue_update_write_ptr(priv, txq); 689 ret = iwl_tx_queue_update_write_ptr(priv, txq);
690 690
691 spin_unlock_irqrestore(&priv->hcmd_lock, flags); 691 spin_unlock_irqrestore(&priv->hcmd_lock, flags);
@@ -2799,21 +2799,21 @@ static int iwl_tx_skb(struct iwl_priv *priv,
2799 2799
2800 spin_lock_irqsave(&priv->lock, flags); 2800 spin_lock_irqsave(&priv->lock, flags);
2801 2801
2802 tfd = &txq->bd[q->first_empty]; 2802 tfd = &txq->bd[q->write_ptr];
2803 memset(tfd, 0, sizeof(*tfd)); 2803 memset(tfd, 0, sizeof(*tfd));
2804 control_flags = (u32 *) tfd; 2804 control_flags = (u32 *) tfd;
2805 idx = get_cmd_index(q, q->first_empty, 0); 2805 idx = get_cmd_index(q, q->write_ptr, 0);
2806 2806
2807 memset(&(txq->txb[q->first_empty]), 0, sizeof(struct iwl_tx_info)); 2807 memset(&(txq->txb[q->write_ptr]), 0, sizeof(struct iwl_tx_info));
2808 txq->txb[q->first_empty].skb[0] = skb; 2808 txq->txb[q->write_ptr].skb[0] = skb;
2809 memcpy(&(txq->txb[q->first_empty].status.control), 2809 memcpy(&(txq->txb[q->write_ptr].status.control),
2810 ctl, sizeof(struct ieee80211_tx_control)); 2810 ctl, sizeof(struct ieee80211_tx_control));
2811 out_cmd = &txq->cmd[idx]; 2811 out_cmd = &txq->cmd[idx];
2812 memset(&out_cmd->hdr, 0, sizeof(out_cmd->hdr)); 2812 memset(&out_cmd->hdr, 0, sizeof(out_cmd->hdr));
2813 memset(&out_cmd->cmd.tx, 0, sizeof(out_cmd->cmd.tx)); 2813 memset(&out_cmd->cmd.tx, 0, sizeof(out_cmd->cmd.tx));
2814 out_cmd->hdr.cmd = REPLY_TX; 2814 out_cmd->hdr.cmd = REPLY_TX;
2815 out_cmd->hdr.sequence = cpu_to_le16((u16)(QUEUE_TO_SEQ(txq_id) | 2815 out_cmd->hdr.sequence = cpu_to_le16((u16)(QUEUE_TO_SEQ(txq_id) |
2816 INDEX_TO_SEQ(q->first_empty))); 2816 INDEX_TO_SEQ(q->write_ptr)));
2817 /* copy frags header */ 2817 /* copy frags header */
2818 memcpy(out_cmd->cmd.tx.hdr, hdr, hdr_len); 2818 memcpy(out_cmd->cmd.tx.hdr, hdr, hdr_len);
2819 2819
@@ -2881,7 +2881,7 @@ static int iwl_tx_skb(struct iwl_priv *priv,
2881 iwl_print_hex_dump(IWL_DL_TX, (u8 *)out_cmd->cmd.tx.hdr, 2881 iwl_print_hex_dump(IWL_DL_TX, (u8 *)out_cmd->cmd.tx.hdr,
2882 ieee80211_get_hdrlen(fc)); 2882 ieee80211_get_hdrlen(fc));
2883 2883
2884 q->first_empty = iwl_queue_inc_wrap(q->first_empty, q->n_bd); 2884 q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd);
2885 rc = iwl_tx_queue_update_write_ptr(priv, txq); 2885 rc = iwl_tx_queue_update_write_ptr(priv, txq);
2886 spin_unlock_irqrestore(&priv->lock, flags); 2886 spin_unlock_irqrestore(&priv->lock, flags);
2887 2887
@@ -3375,20 +3375,20 @@ int iwl_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index)
3375 if ((index >= q->n_bd) || (x2_queue_used(q, index) == 0)) { 3375 if ((index >= q->n_bd) || (x2_queue_used(q, index) == 0)) {
3376 IWL_ERROR("Read index for DMA queue txq id (%d), index %d, " 3376 IWL_ERROR("Read index for DMA queue txq id (%d), index %d, "
3377 "is out of range [0-%d] %d %d.\n", txq_id, 3377 "is out of range [0-%d] %d %d.\n", txq_id,
3378 index, q->n_bd, q->first_empty, q->last_used); 3378 index, q->n_bd, q->write_ptr, q->read_ptr);
3379 return 0; 3379 return 0;
3380 } 3380 }
3381 3381
3382 for (index = iwl_queue_inc_wrap(index, q->n_bd); 3382 for (index = iwl_queue_inc_wrap(index, q->n_bd);
3383 q->last_used != index; 3383 q->read_ptr != index;
3384 q->last_used = iwl_queue_inc_wrap(q->last_used, q->n_bd)) { 3384 q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) {
3385 if (txq_id != IWL_CMD_QUEUE_NUM) { 3385 if (txq_id != IWL_CMD_QUEUE_NUM) {
3386 iwl_txstatus_to_ieee(priv, 3386 iwl_txstatus_to_ieee(priv,
3387 &(txq->txb[txq->q.last_used])); 3387 &(txq->txb[txq->q.read_ptr]));
3388 iwl_hw_txq_free_tfd(priv, txq); 3388 iwl_hw_txq_free_tfd(priv, txq);
3389 } else if (nfreed > 1) { 3389 } else if (nfreed > 1) {
3390 IWL_ERROR("HCMD skipped: index (%d) %d %d\n", index, 3390 IWL_ERROR("HCMD skipped: index (%d) %d %d\n", index,
3391 q->first_empty, q->last_used); 3391 q->write_ptr, q->read_ptr);
3392 queue_work(priv->workqueue, &priv->restart); 3392 queue_work(priv->workqueue, &priv->restart);
3393 } 3393 }
3394 nfreed++; 3394 nfreed++;
@@ -3428,12 +3428,12 @@ static void iwl_rx_reply_tx(struct iwl_priv *priv,
3428 if ((index >= txq->q.n_bd) || (x2_queue_used(&txq->q, index) == 0)) { 3428 if ((index >= txq->q.n_bd) || (x2_queue_used(&txq->q, index) == 0)) {
3429 IWL_ERROR("Read index for DMA queue txq_id (%d) index %d " 3429 IWL_ERROR("Read index for DMA queue txq_id (%d) index %d "
3430 "is out of range [0-%d] %d %d\n", txq_id, 3430 "is out of range [0-%d] %d %d\n", txq_id,
3431 index, txq->q.n_bd, txq->q.first_empty, 3431 index, txq->q.n_bd, txq->q.write_ptr,
3432 txq->q.last_used); 3432 txq->q.read_ptr);
3433 return; 3433 return;
3434 } 3434 }
3435 3435
3436 tx_status = &(txq->txb[txq->q.last_used].status); 3436 tx_status = &(txq->txb[txq->q.read_ptr].status);
3437 3437
3438 tx_status->retry_count = tx_resp->failure_frame; 3438 tx_status->retry_count = tx_resp->failure_frame;
3439 tx_status->queue_number = status; 3439 tx_status->queue_number = status;
@@ -4368,14 +4368,14 @@ int iwl_tx_queue_update_write_ptr(struct iwl_priv *priv,
4368 if (rc) 4368 if (rc)
4369 return rc; 4369 return rc;
4370 iwl_write_restricted(priv, HBUS_TARG_WRPTR, 4370 iwl_write_restricted(priv, HBUS_TARG_WRPTR,
4371 txq->q.first_empty | (txq_id << 8)); 4371 txq->q.write_ptr | (txq_id << 8));
4372 iwl_release_restricted_access(priv); 4372 iwl_release_restricted_access(priv);
4373 4373
4374 /* else not in power-save mode, uCode will never sleep when we're 4374 /* else not in power-save mode, uCode will never sleep when we're
4375 * trying to tx (during RFKILL, we're not trying to tx). */ 4375 * trying to tx (during RFKILL, we're not trying to tx). */
4376 } else 4376 } else
4377 iwl_write32(priv, HBUS_TARG_WRPTR, 4377 iwl_write32(priv, HBUS_TARG_WRPTR,
4378 txq->q.first_empty | (txq_id << 8)); 4378 txq->q.write_ptr | (txq_id << 8));
4379 4379
4380 txq->need_update = 0; 4380 txq->need_update = 0;
4381 4381
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c
index eb2d7a555bbc..e0feca8acddb 100644
--- a/drivers/net/wireless/iwlwifi/iwl4965-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c
@@ -208,9 +208,9 @@ static void iwl_print_hex_dump(int level, void *p, u32 len)
208 208
209static int iwl_queue_space(const struct iwl_queue *q) 209static int iwl_queue_space(const struct iwl_queue *q)
210{ 210{
211 int s = q->last_used - q->first_empty; 211 int s = q->read_ptr - q->write_ptr;
212 212
213 if (q->last_used > q->first_empty) 213 if (q->read_ptr > q->write_ptr)
214 s -= q->n_bd; 214 s -= q->n_bd;
215 215
216 if (s <= 0) 216 if (s <= 0)
@@ -236,9 +236,9 @@ static inline int iwl_queue_dec_wrap(int index, int n_bd)
236 236
237static inline int x2_queue_used(const struct iwl_queue *q, int i) 237static inline int x2_queue_used(const struct iwl_queue *q, int i)
238{ 238{
239 return q->first_empty > q->last_used ? 239 return q->write_ptr > q->read_ptr ?
240 (i >= q->last_used && i < q->first_empty) : 240 (i >= q->read_ptr && i < q->write_ptr) :
241 !(i < q->last_used && i >= q->first_empty); 241 !(i < q->read_ptr && i >= q->write_ptr);
242} 242}
243 243
244static inline u8 get_cmd_index(struct iwl_queue *q, u32 index, int is_huge) 244static inline u8 get_cmd_index(struct iwl_queue *q, u32 index, int is_huge)
@@ -272,7 +272,7 @@ static int iwl_queue_init(struct iwl_priv *priv, struct iwl_queue *q,
272 if (q->high_mark < 2) 272 if (q->high_mark < 2)
273 q->high_mark = 2; 273 q->high_mark = 2;
274 274
275 q->first_empty = q->last_used = 0; 275 q->write_ptr = q->read_ptr = 0;
276 276
277 return 0; 277 return 0;
278} 278}
@@ -368,8 +368,8 @@ void iwl_tx_queue_free(struct iwl_priv *priv, struct iwl_tx_queue *txq)
368 return; 368 return;
369 369
370 /* first, empty all BD's */ 370 /* first, empty all BD's */
371 for (; q->first_empty != q->last_used; 371 for (; q->write_ptr != q->read_ptr;
372 q->last_used = iwl_queue_inc_wrap(q->last_used, q->n_bd)) 372 q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd))
373 iwl_hw_txq_free_tfd(priv, txq); 373 iwl_hw_txq_free_tfd(priv, txq);
374 374
375 len = sizeof(struct iwl_cmd) * q->n_window; 375 len = sizeof(struct iwl_cmd) * q->n_window;
@@ -652,12 +652,12 @@ static int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
652 652
653 spin_lock_irqsave(&priv->hcmd_lock, flags); 653 spin_lock_irqsave(&priv->hcmd_lock, flags);
654 654
655 tfd = &txq->bd[q->first_empty]; 655 tfd = &txq->bd[q->write_ptr];
656 memset(tfd, 0, sizeof(*tfd)); 656 memset(tfd, 0, sizeof(*tfd));
657 657
658 control_flags = (u32 *) tfd; 658 control_flags = (u32 *) tfd;
659 659
660 idx = get_cmd_index(q, q->first_empty, cmd->meta.flags & CMD_SIZE_HUGE); 660 idx = get_cmd_index(q, q->write_ptr, cmd->meta.flags & CMD_SIZE_HUGE);
661 out_cmd = &txq->cmd[idx]; 661 out_cmd = &txq->cmd[idx];
662 662
663 out_cmd->hdr.cmd = cmd->id; 663 out_cmd->hdr.cmd = cmd->id;
@@ -669,7 +669,7 @@ static int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
669 669
670 out_cmd->hdr.flags = 0; 670 out_cmd->hdr.flags = 0;
671 out_cmd->hdr.sequence = cpu_to_le16(QUEUE_TO_SEQ(IWL_CMD_QUEUE_NUM) | 671 out_cmd->hdr.sequence = cpu_to_le16(QUEUE_TO_SEQ(IWL_CMD_QUEUE_NUM) |
672 INDEX_TO_SEQ(q->first_empty)); 672 INDEX_TO_SEQ(q->write_ptr));
673 if (out_cmd->meta.flags & CMD_SIZE_HUGE) 673 if (out_cmd->meta.flags & CMD_SIZE_HUGE)
674 out_cmd->hdr.sequence |= cpu_to_le16(SEQ_HUGE_FRAME); 674 out_cmd->hdr.sequence |= cpu_to_le16(SEQ_HUGE_FRAME);
675 675
@@ -681,11 +681,11 @@ static int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
681 "%d bytes at %d[%d]:%d\n", 681 "%d bytes at %d[%d]:%d\n",
682 get_cmd_string(out_cmd->hdr.cmd), 682 get_cmd_string(out_cmd->hdr.cmd),
683 out_cmd->hdr.cmd, le16_to_cpu(out_cmd->hdr.sequence), 683 out_cmd->hdr.cmd, le16_to_cpu(out_cmd->hdr.sequence),
684 fix_size, q->first_empty, idx, IWL_CMD_QUEUE_NUM); 684 fix_size, q->write_ptr, idx, IWL_CMD_QUEUE_NUM);
685 685
686 txq->need_update = 1; 686 txq->need_update = 1;
687 ret = iwl4965_tx_queue_update_wr_ptr(priv, txq, 0); 687 ret = iwl4965_tx_queue_update_wr_ptr(priv, txq, 0);
688 q->first_empty = iwl_queue_inc_wrap(q->first_empty, q->n_bd); 688 q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd);
689 iwl_tx_queue_update_write_ptr(priv, txq); 689 iwl_tx_queue_update_write_ptr(priv, txq);
690 690
691 spin_unlock_irqrestore(&priv->hcmd_lock, flags); 691 spin_unlock_irqrestore(&priv->hcmd_lock, flags);
@@ -2889,21 +2889,21 @@ static int iwl_tx_skb(struct iwl_priv *priv,
2889 2889
2890 spin_lock_irqsave(&priv->lock, flags); 2890 spin_lock_irqsave(&priv->lock, flags);
2891 2891
2892 tfd = &txq->bd[q->first_empty]; 2892 tfd = &txq->bd[q->write_ptr];
2893 memset(tfd, 0, sizeof(*tfd)); 2893 memset(tfd, 0, sizeof(*tfd));
2894 control_flags = (u32 *) tfd; 2894 control_flags = (u32 *) tfd;
2895 idx = get_cmd_index(q, q->first_empty, 0); 2895 idx = get_cmd_index(q, q->write_ptr, 0);
2896 2896
2897 memset(&(txq->txb[q->first_empty]), 0, sizeof(struct iwl_tx_info)); 2897 memset(&(txq->txb[q->write_ptr]), 0, sizeof(struct iwl_tx_info));
2898 txq->txb[q->first_empty].skb[0] = skb; 2898 txq->txb[q->write_ptr].skb[0] = skb;
2899 memcpy(&(txq->txb[q->first_empty].status.control), 2899 memcpy(&(txq->txb[q->write_ptr].status.control),
2900 ctl, sizeof(struct ieee80211_tx_control)); 2900 ctl, sizeof(struct ieee80211_tx_control));
2901 out_cmd = &txq->cmd[idx]; 2901 out_cmd = &txq->cmd[idx];
2902 memset(&out_cmd->hdr, 0, sizeof(out_cmd->hdr)); 2902 memset(&out_cmd->hdr, 0, sizeof(out_cmd->hdr));
2903 memset(&out_cmd->cmd.tx, 0, sizeof(out_cmd->cmd.tx)); 2903 memset(&out_cmd->cmd.tx, 0, sizeof(out_cmd->cmd.tx));
2904 out_cmd->hdr.cmd = REPLY_TX; 2904 out_cmd->hdr.cmd = REPLY_TX;
2905 out_cmd->hdr.sequence = cpu_to_le16((u16)(QUEUE_TO_SEQ(txq_id) | 2905 out_cmd->hdr.sequence = cpu_to_le16((u16)(QUEUE_TO_SEQ(txq_id) |
2906 INDEX_TO_SEQ(q->first_empty))); 2906 INDEX_TO_SEQ(q->write_ptr)));
2907 /* copy frags header */ 2907 /* copy frags header */
2908 memcpy(out_cmd->cmd.tx.hdr, hdr, hdr_len); 2908 memcpy(out_cmd->cmd.tx.hdr, hdr, hdr_len);
2909 2909
@@ -2969,7 +2969,7 @@ static int iwl_tx_skb(struct iwl_priv *priv,
2969 2969
2970 iwl4965_tx_queue_update_wr_ptr(priv, txq, len); 2970 iwl4965_tx_queue_update_wr_ptr(priv, txq, len);
2971 2971
2972 q->first_empty = iwl_queue_inc_wrap(q->first_empty, q->n_bd); 2972 q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd);
2973 rc = iwl_tx_queue_update_write_ptr(priv, txq); 2973 rc = iwl_tx_queue_update_write_ptr(priv, txq);
2974 spin_unlock_irqrestore(&priv->lock, flags); 2974 spin_unlock_irqrestore(&priv->lock, flags);
2975 2975
@@ -3463,20 +3463,20 @@ int iwl_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index)
3463 if ((index >= q->n_bd) || (x2_queue_used(q, index) == 0)) { 3463 if ((index >= q->n_bd) || (x2_queue_used(q, index) == 0)) {
3464 IWL_ERROR("Read index for DMA queue txq id (%d), index %d, " 3464 IWL_ERROR("Read index for DMA queue txq id (%d), index %d, "
3465 "is out of range [0-%d] %d %d.\n", txq_id, 3465 "is out of range [0-%d] %d %d.\n", txq_id,
3466 index, q->n_bd, q->first_empty, q->last_used); 3466 index, q->n_bd, q->write_ptr, q->read_ptr);
3467 return 0; 3467 return 0;
3468 } 3468 }
3469 3469
3470 for (index = iwl_queue_inc_wrap(index, q->n_bd); 3470 for (index = iwl_queue_inc_wrap(index, q->n_bd);
3471 q->last_used != index; 3471 q->read_ptr != index;
3472 q->last_used = iwl_queue_inc_wrap(q->last_used, q->n_bd)) { 3472 q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) {
3473 if (txq_id != IWL_CMD_QUEUE_NUM) { 3473 if (txq_id != IWL_CMD_QUEUE_NUM) {
3474 iwl_txstatus_to_ieee(priv, 3474 iwl_txstatus_to_ieee(priv,
3475 &(txq->txb[txq->q.last_used])); 3475 &(txq->txb[txq->q.read_ptr]));
3476 iwl_hw_txq_free_tfd(priv, txq); 3476 iwl_hw_txq_free_tfd(priv, txq);
3477 } else if (nfreed > 1) { 3477 } else if (nfreed > 1) {
3478 IWL_ERROR("HCMD skipped: index (%d) %d %d\n", index, 3478 IWL_ERROR("HCMD skipped: index (%d) %d %d\n", index,
3479 q->first_empty, q->last_used); 3479 q->write_ptr, q->read_ptr);
3480 queue_work(priv->workqueue, &priv->restart); 3480 queue_work(priv->workqueue, &priv->restart);
3481 } 3481 }
3482 nfreed++; 3482 nfreed++;
@@ -3564,7 +3564,7 @@ static int iwl4965_tx_status_reply_tx(struct iwl_priv *priv,
3564 IWL_DEBUG_TX_REPLY("FrameCnt = %d, StartIdx=%d \n", 3564 IWL_DEBUG_TX_REPLY("FrameCnt = %d, StartIdx=%d \n",
3565 agg->frame_count, agg->start_idx); 3565 agg->frame_count, agg->start_idx);
3566 3566
3567 tx_status = &(priv->txq[txq_id].txb[txq->q.last_used].status); 3567 tx_status = &(priv->txq[txq_id].txb[txq->q.read_ptr].status);
3568 tx_status->retry_count = tx_resp->failure_frame; 3568 tx_status->retry_count = tx_resp->failure_frame;
3569 tx_status->queue_number = status & 0xff; 3569 tx_status->queue_number = status & 0xff;
3570 tx_status->queue_length = tx_resp->bt_kill_count; 3570 tx_status->queue_length = tx_resp->bt_kill_count;
@@ -3669,8 +3669,8 @@ static void iwl_rx_reply_tx(struct iwl_priv *priv,
3669 if ((index >= txq->q.n_bd) || (x2_queue_used(&txq->q, index) == 0)) { 3669 if ((index >= txq->q.n_bd) || (x2_queue_used(&txq->q, index) == 0)) {
3670 IWL_ERROR("Read index for DMA queue txq_id (%d) index %d " 3670 IWL_ERROR("Read index for DMA queue txq_id (%d) index %d "
3671 "is out of range [0-%d] %d %d\n", txq_id, 3671 "is out of range [0-%d] %d %d\n", txq_id,
3672 index, txq->q.n_bd, txq->q.first_empty, 3672 index, txq->q.n_bd, txq->q.write_ptr,
3673 txq->q.last_used); 3673 txq->q.read_ptr);
3674 return; 3674 return;
3675 } 3675 }
3676 3676
@@ -3705,7 +3705,7 @@ static void iwl_rx_reply_tx(struct iwl_priv *priv,
3705 /* TODO: send BAR */ 3705 /* TODO: send BAR */
3706 } 3706 }
3707 3707
3708 if ((txq->q.last_used != (scd_ssn & 0xff))) { 3708 if ((txq->q.read_ptr != (scd_ssn & 0xff))) {
3709 index = iwl_queue_dec_wrap(scd_ssn & 0xff, txq->q.n_bd); 3709 index = iwl_queue_dec_wrap(scd_ssn & 0xff, txq->q.n_bd);
3710 IWL_DEBUG_TX_REPLY("Retry scheduler reclaim scd_ssn " 3710 IWL_DEBUG_TX_REPLY("Retry scheduler reclaim scd_ssn "
3711 "%d index %d\n", scd_ssn , index); 3711 "%d index %d\n", scd_ssn , index);
@@ -3714,7 +3714,7 @@ static void iwl_rx_reply_tx(struct iwl_priv *priv,
3714 } else { 3714 } else {
3715#endif /* CONFIG_IWLWIFI_HT_AGG */ 3715#endif /* CONFIG_IWLWIFI_HT_AGG */
3716#endif /* CONFIG_IWLWIFI_HT */ 3716#endif /* CONFIG_IWLWIFI_HT */
3717 tx_status = &(txq->txb[txq->q.last_used].status); 3717 tx_status = &(txq->txb[txq->q.read_ptr].status);
3718 3718
3719 tx_status->retry_count = tx_resp->failure_frame; 3719 tx_status->retry_count = tx_resp->failure_frame;
3720 tx_status->queue_number = status; 3720 tx_status->queue_number = status;
@@ -4692,14 +4692,14 @@ int iwl_tx_queue_update_write_ptr(struct iwl_priv *priv,
4692 if (rc) 4692 if (rc)
4693 return rc; 4693 return rc;
4694 iwl_write_restricted(priv, HBUS_TARG_WRPTR, 4694 iwl_write_restricted(priv, HBUS_TARG_WRPTR,
4695 txq->q.first_empty | (txq_id << 8)); 4695 txq->q.write_ptr | (txq_id << 8));
4696 iwl_release_restricted_access(priv); 4696 iwl_release_restricted_access(priv);
4697 4697
4698 /* else not in power-save mode, uCode will never sleep when we're 4698 /* else not in power-save mode, uCode will never sleep when we're
4699 * trying to tx (during RFKILL, we're not trying to tx). */ 4699 * trying to tx (during RFKILL, we're not trying to tx). */
4700 } else 4700 } else
4701 iwl_write32(priv, HBUS_TARG_WRPTR, 4701 iwl_write32(priv, HBUS_TARG_WRPTR,
4702 txq->q.first_empty | (txq_id << 8)); 4702 txq->q.write_ptr | (txq_id << 8));
4703 4703
4704 txq->need_update = 0; 4704 txq->need_update = 0;
4705 4705
diff --git a/drivers/net/wireless/iwlwifi/iwlwifi.h b/drivers/net/wireless/iwlwifi/iwlwifi.h
index 8e52fef94916..bcff696937f1 100644
--- a/drivers/net/wireless/iwlwifi/iwlwifi.h
+++ b/drivers/net/wireless/iwlwifi/iwlwifi.h
@@ -144,8 +144,8 @@ struct iwl_rt_tx_hdr {
144 */ 144 */
145struct iwl_queue { 145struct iwl_queue {
146 int n_bd; /* number of BDs in this queue */ 146 int n_bd; /* number of BDs in this queue */
147 int first_empty; /* 1-st empty entry (index) host_w*/ 147 int write_ptr; /* 1-st empty entry (index) host_w*/
148 int last_used; /* last used entry (index) host_r*/ 148 int read_ptr; /* last used entry (index) host_r*/
149 dma_addr_t dma_addr; /* physical addr for BD's */ 149 dma_addr_t dma_addr; /* physical addr for BD's */
150 int n_window; /* safe queue window */ 150 int n_window; /* safe queue window */
151 u32 id; 151 u32 id;