Browse Source

mwifiex: fix power state out of sync problem

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>
Shengzhen Li 9 years ago
parent
commit
dc896b15fe
1 changed files with 5 additions and 5 deletions
  1. 5 5
      drivers/net/wireless/marvell/mwifiex/pcie.c

+ 5 - 5
drivers/net/wireless/marvell/mwifiex/pcie.c

@@ -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);
 }
 
 /*