mwifiex: fix PCIe legacy interrupt problem
authorAmitkumar Karwar <akarwar@marvell.com>
Fri, 15 Jul 2016 13:37:04 +0000 (19:07 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 18 Jul 2016 19:42:56 +0000 (22:42 +0300)
In corner case, we may end up processing same interrupt twice.
We have a logic to read pending interrupts at the end of interrupt
processing routine. It has a race with interrupts read in interrupt
handler. This patch solves the problem by ORing the interrupt bitmap
in this case.

The symptom for this bug is below messages in dmesg log.

[   11.522123] mwifiex_pcie 0000:01:00.0: CMD_RESP: invalid cmd resp
[   11.680412] mwifiex_pcie 0000:01:00.0: There is no command but got cmdrsp

Link: https://bugzilla.kernel.org/show_bug.cgi?id=109681
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Cathy Luo <cluo@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/marvell/mwifiex/pcie.c

index 0faf4a2c006e88eb4b80982973c68b1fb1467aeb..12d0ee15df1f7be7dc9078c6ea251a25e349e6a2 100644 (file)
@@ -2300,6 +2300,12 @@ static int mwifiex_process_pcie_int(struct mwifiex_adapter *adapter)
                        }
 
                }
+               if (!card->msi_enable) {
+                       spin_lock_irqsave(&adapter->int_lock, flags);
+                       pcie_ireg |= adapter->int_status;
+                       adapter->int_status = 0;
+                       spin_unlock_irqrestore(&adapter->int_lock, flags);
+               }
        }
        mwifiex_dbg(adapter, INTR,
                    "info: cmd_sent=%d data_sent=%d\n",