mwifiex: fix system freeze while reloading driver
authorAvinash Patil <patila@marvell.com>
Thu, 21 Feb 2013 05:12:58 +0000 (21:12 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 22 Feb 2013 19:50:46 +0000 (14:50 -0500)
Unload sequence for mwifiex PCIE driver is as follows:
1. Invoking cleanup module from kernel results into
   pci_unregister_driver
2. Kernel invokes PCIE remove() handler which disconnects all
   interfaces.
3. One step during disconnect is to clean PCIE TX rings.
   During this we read txbd_rdptr from FW.

While loading driver next time, we see pci_enable_device()
results into system freeze. This may have happened because we
accessed PCI device after unregistering from bus driver.
Removing this ioread() operation resolves this bug.

Signed-off-by: Avinash Patil <patila@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/mwifiex/pcie.c

index 22db934..35c7972 100644 (file)
@@ -908,17 +908,8 @@ static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
 {
        struct pcie_service_card *card = adapter->card;
-       const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
-       u32 rdptr;
-
-       /* Read the TX ring read pointer set by firmware */
-       if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
-               dev_err(adapter->dev,
-                       "Flush TXBD: failed to read reg->tx_rdptr\n");
-               return -1;
-       }
 
-       if (!mwifiex_pcie_txbd_empty(card, rdptr)) {
+       if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
                card->txbd_flush = 1;
                /* write pointer already set at last send
                 * send dnld-rdy intr again, wait for completion.