| From 4e841d3eb9294ce4137fdb5d0a88f1bceab9c212 Mon Sep 17 00:00:00 2001 |
| From: Brian Norris <briannorris@chromium.org> |
| Date: Fri, 10 Mar 2017 17:39:21 -0800 |
| Subject: [PATCH] mwifiex: pcie: don't leak DMA buffers when removing |
| |
| commit 4e841d3eb9294ce4137fdb5d0a88f1bceab9c212 upstream. |
| |
| When PCIe FLR support was added, much of the remove/release code for |
| PCIe was migrated to ->down_dev(), but ->down_dev() is never called for |
| device removal. Let's refactor the cleanup to be done in both cases. |
| |
| Also, drop the comments above mwifiex_cleanup_pcie(), because they were |
| clearly wrong, and it's better to have clear and obvious code than to |
| detail the code steps in comments anyway. |
| |
| Fixes: 4c5dae59d2e9 ("mwifiex: add PCIe function level reset support") |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Brian Norris <briannorris@chromium.org> |
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> |
| |
| diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c |
| index a0d918094889..b8c990d10d6e 100644 |
| --- a/drivers/net/wireless/marvell/mwifiex/pcie.c |
| +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c |
| @@ -2739,6 +2739,21 @@ static void mwifiex_pcie_device_dump(struct mwifiex_adapter *adapter) |
| schedule_work(&card->work); |
| } |
| |
| +static void mwifiex_pcie_free_buffers(struct mwifiex_adapter *adapter) |
| +{ |
| + struct pcie_service_card *card = adapter->card; |
| + const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; |
| + |
| + if (reg->sleep_cookie) |
| + mwifiex_pcie_delete_sleep_cookie_buf(adapter); |
| + |
| + mwifiex_pcie_delete_cmdrsp_buf(adapter); |
| + mwifiex_pcie_delete_evtbd_ring(adapter); |
| + mwifiex_pcie_delete_rxbd_ring(adapter); |
| + mwifiex_pcie_delete_txbd_ring(adapter); |
| + card->cmdrsp_buf = NULL; |
| +} |
| + |
| /* |
| * This function initializes the PCI-E host memory space, WCB rings, etc. |
| * |
| @@ -2850,13 +2865,6 @@ err_enable_dev: |
| |
| /* |
| * This function cleans up the allocated card buffers. |
| - * |
| - * The following are freed by this function - |
| - * - TXBD ring buffers |
| - * - RXBD ring buffers |
| - * - Event BD ring buffers |
| - * - Command response ring buffer |
| - * - Sleep cookie buffer |
| */ |
| static void mwifiex_cleanup_pcie(struct mwifiex_adapter *adapter) |
| { |
| @@ -2875,6 +2883,8 @@ static void mwifiex_cleanup_pcie(struct mwifiex_adapter *adapter) |
| "Failed to write driver not-ready signature\n"); |
| } |
| |
| + mwifiex_pcie_free_buffers(adapter); |
| + |
| if (pdev) { |
| pci_iounmap(pdev, card->pci_mmap); |
| pci_iounmap(pdev, card->pci_mmap1); |
| @@ -3126,10 +3136,7 @@ err_cre_txbd: |
| pci_iounmap(pdev, card->pci_mmap1); |
| } |
| |
| -/* This function cleans up the PCI-E host memory space. |
| - * Some code is extracted from mwifiex_unregister_dev() |
| - * |
| - */ |
| +/* This function cleans up the PCI-E host memory space. */ |
| static void mwifiex_pcie_down_dev(struct mwifiex_adapter *adapter) |
| { |
| struct pcie_service_card *card = adapter->card; |
| @@ -3140,14 +3147,7 @@ static void mwifiex_pcie_down_dev(struct mwifiex_adapter *adapter) |
| |
| adapter->seq_num = 0; |
| |
| - if (reg->sleep_cookie) |
| - mwifiex_pcie_delete_sleep_cookie_buf(adapter); |
| - |
| - mwifiex_pcie_delete_cmdrsp_buf(adapter); |
| - mwifiex_pcie_delete_evtbd_ring(adapter); |
| - mwifiex_pcie_delete_rxbd_ring(adapter); |
| - mwifiex_pcie_delete_txbd_ring(adapter); |
| - card->cmdrsp_buf = NULL; |
| + mwifiex_pcie_free_buffers(adapter); |
| } |
| |
| static struct mwifiex_if_ops pcie_ops = { |
| -- |
| 2.12.0 |
| |