aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-rx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-rx.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-rx.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
index b3c35c64d042..48d55741b769 100644
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
@@ -317,7 +317,10 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
317 317
318 pci_free_consistent(priv->pci_dev, 4 * RX_QUEUE_SIZE, rxq->bd, 318 pci_free_consistent(priv->pci_dev, 4 * RX_QUEUE_SIZE, rxq->bd,
319 rxq->dma_addr); 319 rxq->dma_addr);
320 pci_free_consistent(priv->pci_dev, sizeof(struct iwl_rb_status),
321 rxq->rb_stts, rxq->rb_stts_dma);
320 rxq->bd = NULL; 322 rxq->bd = NULL;
323 rxq->rb_stts = NULL;
321} 324}
322EXPORT_SYMBOL(iwl_rx_queue_free); 325EXPORT_SYMBOL(iwl_rx_queue_free);
323 326
@@ -334,7 +337,12 @@ int iwl_rx_queue_alloc(struct iwl_priv *priv)
334 /* Alloc the circular buffer of Read Buffer Descriptors (RBDs) */ 337 /* Alloc the circular buffer of Read Buffer Descriptors (RBDs) */
335 rxq->bd = pci_alloc_consistent(dev, 4 * RX_QUEUE_SIZE, &rxq->dma_addr); 338 rxq->bd = pci_alloc_consistent(dev, 4 * RX_QUEUE_SIZE, &rxq->dma_addr);
336 if (!rxq->bd) 339 if (!rxq->bd)
337 return -ENOMEM; 340 goto err_bd;
341
342 rxq->rb_stts = pci_alloc_consistent(dev, sizeof(struct iwl_rb_status),
343 &rxq->rb_stts_dma);
344 if (!rxq->rb_stts)
345 goto err_rb;
338 346
339 /* Fill the rx_used queue with _all_ of the Rx buffers */ 347 /* Fill the rx_used queue with _all_ of the Rx buffers */
340 for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++) 348 for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++)
@@ -346,6 +354,12 @@ int iwl_rx_queue_alloc(struct iwl_priv *priv)
346 rxq->free_count = 0; 354 rxq->free_count = 0;
347 rxq->need_update = 0; 355 rxq->need_update = 0;
348 return 0; 356 return 0;
357
358err_rb:
359 pci_free_consistent(priv->pci_dev, 4 * RX_QUEUE_SIZE, rxq->bd,
360 rxq->dma_addr);
361err_bd:
362 return -ENOMEM;
349} 363}
350EXPORT_SYMBOL(iwl_rx_queue_alloc); 364EXPORT_SYMBOL(iwl_rx_queue_alloc);
351 365
@@ -412,7 +426,7 @@ int iwl_rx_init(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
412 426
413 /* Tell device where in DRAM to update its Rx status */ 427 /* Tell device where in DRAM to update its Rx status */
414 iwl_write_direct32(priv, FH_RSCSR_CHNL0_STTS_WPTR_REG, 428 iwl_write_direct32(priv, FH_RSCSR_CHNL0_STTS_WPTR_REG,
415 (priv->shared_phys + priv->rb_closed_offset) >> 4); 429 rxq->rb_stts_dma >> 4);
416 430
417 /* Enable Rx DMA 431 /* Enable Rx DMA
418 * FH_RCSR_CHNL0_RX_IGNORE_RXF_EMPTY is set because of HW bug in 432 * FH_RCSR_CHNL0_RX_IGNORE_RXF_EMPTY is set because of HW bug in