From: Brian Norris <briannor...@chromium.org>

We have a race where the wakeup IRQ might be in flight while we're
calling mwifiex_disable_wake() from resume(). This can leave us
disabling the IRQ twice.

Let's disable the IRQ and enable it in case if we have double-disabled
it.

Signed-off-by: Brian Norris <briannor...@chromium.org>
Signed-off-by: Amitkumar Karwar <akar...@marvell.com>
---
 drivers/net/wireless/marvell/mwifiex/main.h | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/marvell/mwifiex/main.h 
b/drivers/net/wireless/marvell/mwifiex/main.h
index b8ef1c0..d501d03 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.h
+++ b/drivers/net/wireless/marvell/mwifiex/main.h
@@ -1419,8 +1419,13 @@ static inline void mwifiex_disable_wake(struct 
mwifiex_adapter *adapter)
 {
        if (adapter->irq_wakeup >= 0) {
                disable_irq_wake(adapter->irq_wakeup);
-               if (!adapter->wake_by_wifi)
-                       disable_irq(adapter->irq_wakeup);
+               disable_irq(adapter->irq_wakeup);
+               if (adapter->wake_by_wifi)
+                       /* Undo our disable, since interrupt handler already
+                        * did this.
+                        */
+                       enable_irq(adapter->irq_wakeup);
+
        }
 }
 
-- 
1.9.1

Reply via email to