mwifiex: fix power state out of sync problem
authorShengzhen Li <szli@marvell.com>
Tue, 12 Jan 2016 13:43:16 +0000 (05:43 -0800)
committerKalle Valo <kvalo@codeaurora.org>
Fri, 29 Jan 2016 09:18:22 +0000 (11:18 +0200)
It's been observed that driver's power state goes out
of sync with firmware in some corner cases. When this
happens, driver tries to download the data to firmware
assuming it's awake which causes Tx data timeout.

Main thread will process interrupt as soon as interrupt
handler fills 'int_status' variable.

This patch fixes the race issue by updating 'int_status'
at the end of mwifiex_interrupt_status().

Signed-off-by: Shengzhen Li <szli@marvell.com>
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/marvell/mwifiex/pcie.c

index 5e154649c6a2575090e330807ed5047d36f947c8..918e04954afec14c10e161f524dd0f7fcf151e4f 100644 (file)
@@ -2116,11 +2116,6 @@ static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter,
                }
        }
 
-       spin_lock_irqsave(&adapter->int_lock, flags);
-       adapter->int_status |= pcie_ireg;
-       spin_unlock_irqrestore(&adapter->int_lock, flags);
-       mwifiex_dbg(adapter, INTR, "ireg: 0x%08x\n", pcie_ireg);
-
        if (!adapter->pps_uapsd_mode &&
            adapter->ps_state == PS_STATE_SLEEP &&
            mwifiex_pcie_ok_to_access_hw(adapter)) {
@@ -2132,6 +2127,11 @@ static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter,
                adapter->pm_wakeup_fw_try = false;
                del_timer(&adapter->wakeup_timer);
        }
+
+       spin_lock_irqsave(&adapter->int_lock, flags);
+       adapter->int_status |= pcie_ireg;
+       spin_unlock_irqrestore(&adapter->int_lock, flags);
+       mwifiex_dbg(adapter, INTR, "ireg: 0x%08x\n", pcie_ireg);
 }
 
 /*