diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/pcie/rx.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/rx.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c index 8389cd38338b..4e6591d24e61 100644 --- a/drivers/net/wireless/iwlwifi/pcie/rx.c +++ b/drivers/net/wireless/iwlwifi/pcie/rx.c | |||
@@ -436,7 +436,7 @@ static int iwl_pcie_rx_alloc(struct iwl_trans *trans) | |||
436 | err_rb_stts: | 436 | err_rb_stts: |
437 | dma_free_coherent(dev, sizeof(__le32) * RX_QUEUE_SIZE, | 437 | dma_free_coherent(dev, sizeof(__le32) * RX_QUEUE_SIZE, |
438 | rxq->bd, rxq->bd_dma); | 438 | rxq->bd, rxq->bd_dma); |
439 | memset(&rxq->bd_dma, 0, sizeof(rxq->bd_dma)); | 439 | rxq->bd_dma = 0; |
440 | rxq->bd = NULL; | 440 | rxq->bd = NULL; |
441 | err_bd: | 441 | err_bd: |
442 | return -ENOMEM; | 442 | return -ENOMEM; |
@@ -455,6 +455,10 @@ static void iwl_pcie_rx_hw_init(struct iwl_trans *trans, struct iwl_rxq *rxq) | |||
455 | 455 | ||
456 | /* Stop Rx DMA */ | 456 | /* Stop Rx DMA */ |
457 | iwl_write_direct32(trans, FH_MEM_RCSR_CHNL0_CONFIG_REG, 0); | 457 | iwl_write_direct32(trans, FH_MEM_RCSR_CHNL0_CONFIG_REG, 0); |
458 | /* reset and flush pointers */ | ||
459 | iwl_write_direct32(trans, FH_MEM_RCSR_CHNL0_RBDCB_WPTR, 0); | ||
460 | iwl_write_direct32(trans, FH_MEM_RCSR_CHNL0_FLUSH_RB_REQ, 0); | ||
461 | iwl_write_direct32(trans, FH_RSCSR_CHNL0_RDPTR, 0); | ||
458 | 462 | ||
459 | /* Reset driver's Rx queue write index */ | 463 | /* Reset driver's Rx queue write index */ |
460 | iwl_write_direct32(trans, FH_RSCSR_CHNL0_RBDCB_WPTR_REG, 0); | 464 | iwl_write_direct32(trans, FH_RSCSR_CHNL0_RBDCB_WPTR_REG, 0); |
@@ -491,7 +495,6 @@ int iwl_pcie_rx_init(struct iwl_trans *trans) | |||
491 | { | 495 | { |
492 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | 496 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
493 | struct iwl_rxq *rxq = &trans_pcie->rxq; | 497 | struct iwl_rxq *rxq = &trans_pcie->rxq; |
494 | |||
495 | int i, err; | 498 | int i, err; |
496 | unsigned long flags; | 499 | unsigned long flags; |
497 | 500 | ||
@@ -518,6 +521,7 @@ int iwl_pcie_rx_init(struct iwl_trans *trans) | |||
518 | rxq->read = rxq->write = 0; | 521 | rxq->read = rxq->write = 0; |
519 | rxq->write_actual = 0; | 522 | rxq->write_actual = 0; |
520 | rxq->free_count = 0; | 523 | rxq->free_count = 0; |
524 | memset(rxq->rb_stts, 0, sizeof(*rxq->rb_stts)); | ||
521 | spin_unlock_irqrestore(&rxq->lock, flags); | 525 | spin_unlock_irqrestore(&rxq->lock, flags); |
522 | 526 | ||
523 | iwl_pcie_rx_replenish(trans); | 527 | iwl_pcie_rx_replenish(trans); |
@@ -545,13 +549,15 @@ void iwl_pcie_rx_free(struct iwl_trans *trans) | |||
545 | return; | 549 | return; |
546 | } | 550 | } |
547 | 551 | ||
552 | cancel_work_sync(&trans_pcie->rx_replenish); | ||
553 | |||
548 | spin_lock_irqsave(&rxq->lock, flags); | 554 | spin_lock_irqsave(&rxq->lock, flags); |
549 | iwl_pcie_rxq_free_rbs(trans); | 555 | iwl_pcie_rxq_free_rbs(trans); |
550 | spin_unlock_irqrestore(&rxq->lock, flags); | 556 | spin_unlock_irqrestore(&rxq->lock, flags); |
551 | 557 | ||
552 | dma_free_coherent(trans->dev, sizeof(__le32) * RX_QUEUE_SIZE, | 558 | dma_free_coherent(trans->dev, sizeof(__le32) * RX_QUEUE_SIZE, |
553 | rxq->bd, rxq->bd_dma); | 559 | rxq->bd, rxq->bd_dma); |
554 | memset(&rxq->bd_dma, 0, sizeof(rxq->bd_dma)); | 560 | rxq->bd_dma = 0; |
555 | rxq->bd = NULL; | 561 | rxq->bd = NULL; |
556 | 562 | ||
557 | if (rxq->rb_stts) | 563 | if (rxq->rb_stts) |
@@ -560,7 +566,7 @@ void iwl_pcie_rx_free(struct iwl_trans *trans) | |||
560 | rxq->rb_stts, rxq->rb_stts_dma); | 566 | rxq->rb_stts, rxq->rb_stts_dma); |
561 | else | 567 | else |
562 | IWL_DEBUG_INFO(trans, "Free rxq->rb_stts which is NULL\n"); | 568 | IWL_DEBUG_INFO(trans, "Free rxq->rb_stts which is NULL\n"); |
563 | memset(&rxq->rb_stts_dma, 0, sizeof(rxq->rb_stts_dma)); | 569 | rxq->rb_stts_dma = 0; |
564 | rxq->rb_stts = NULL; | 570 | rxq->rb_stts = NULL; |
565 | } | 571 | } |
566 | 572 | ||