diff options
author | Zhu Yi <yi.zhu@intel.com> | 2010-03-22 22:33:41 -0400 |
---|---|---|
committer | Reinette Chatre <reinette.chatre@intel.com> | 2010-04-02 15:50:37 -0400 |
commit | 6aac74b40d5828c6f6b24974580aa43d7bee905c (patch) | |
tree | a2efa613963176e4e2e37e9031cf6be1f579a010 /drivers/net/wireless/iwlwifi/iwl-agn-lib.c | |
parent | bed2263feb10ea29b2696030cdec2eea611caf14 (diff) |
iwlwifi: clear rxq->queue in queue reset
In iwl_rx_queue_reset(), we didn't clear the rxq->queue[]. This might
cause the same rxb appears on multiple places in rxq->queue. Although
this won't cause any problem because of the read and write pointers
protection in rxq, we'd better clear it to avoid misleading.
Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-agn-lib.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-lib.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c index 1d2e84c1fad5..6fe1d937187b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c | |||
@@ -403,6 +403,9 @@ void iwlagn_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | |||
403 | list_add_tail(&rxq->pool[i].list, &rxq->rx_used); | 403 | list_add_tail(&rxq->pool[i].list, &rxq->rx_used); |
404 | } | 404 | } |
405 | 405 | ||
406 | for (i = 0; i < RX_QUEUE_SIZE; i++) | ||
407 | rxq->queue[i] = NULL; | ||
408 | |||
406 | /* Set us so that we have processed and used all buffers, but have | 409 | /* Set us so that we have processed and used all buffers, but have |
407 | * not restocked the Rx queue with fresh buffers */ | 410 | * not restocked the Rx queue with fresh buffers */ |
408 | rxq->read = rxq->write = 0; | 411 | rxq->read = rxq->write = 0; |
@@ -538,11 +541,13 @@ void iwlagn_rx_queue_restock(struct iwl_priv *priv) | |||
538 | struct list_head *element; | 541 | struct list_head *element; |
539 | struct iwl_rx_mem_buffer *rxb; | 542 | struct iwl_rx_mem_buffer *rxb; |
540 | unsigned long flags; | 543 | unsigned long flags; |
541 | int write; | ||
542 | 544 | ||
543 | spin_lock_irqsave(&rxq->lock, flags); | 545 | spin_lock_irqsave(&rxq->lock, flags); |
544 | write = rxq->write & ~0x7; | ||
545 | while ((iwl_rx_queue_space(rxq) > 0) && (rxq->free_count)) { | 546 | while ((iwl_rx_queue_space(rxq) > 0) && (rxq->free_count)) { |
547 | /* The overwritten rxb must be a used one */ | ||
548 | rxb = rxq->queue[rxq->write]; | ||
549 | BUG_ON(rxb && rxb->page); | ||
550 | |||
546 | /* Get next free Rx buffer, remove from free list */ | 551 | /* Get next free Rx buffer, remove from free list */ |
547 | element = rxq->rx_free.next; | 552 | element = rxq->rx_free.next; |
548 | rxb = list_entry(element, struct iwl_rx_mem_buffer, list); | 553 | rxb = list_entry(element, struct iwl_rx_mem_buffer, list); |
@@ -635,6 +640,7 @@ void iwlagn_rx_allocate(struct iwl_priv *priv, gfp_t priority) | |||
635 | 640 | ||
636 | spin_unlock_irqrestore(&rxq->lock, flags); | 641 | spin_unlock_irqrestore(&rxq->lock, flags); |
637 | 642 | ||
643 | BUG_ON(rxb->page); | ||
638 | rxb->page = page; | 644 | rxb->page = page; |
639 | /* Get physical address of the RB */ | 645 | /* Get physical address of the RB */ |
640 | rxb->page_dma = pci_map_page(priv->pci_dev, page, 0, | 646 | rxb->page_dma = pci_map_page(priv->pci_dev, page, 0, |