[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20190224140426.3267-4-marc.zyngier@arm.com>
Date: Sun, 24 Feb 2019 14:04:25 +0000
From: Marc Zyngier <marc.zyngier@....com>
To: Amitkumar Karwar <amitkarwar@...il.com>,
Enric Balletbo i Serra <enric.balletbo@...labora.com>,
Ganapathi Bhat <gbhat@...vell.com>,
Heiko Stuebner <heiko@...ech.de>,
Kalle Valo <kvalo@...eaurora.org>,
Nishant Sarmukadam <nishants@...vell.com>,
Rob Herring <robh+dt@...nel.org>,
Xinming Hu <huxinming820@...il.com>
Cc: "David S. Miller" <davem@...emloft.net>,
devicetree@...r.kernel.org, linux-arm-kernel@...ts.infradead.org,
linux-kernel@...r.kernel.org, linux-rockchip@...ts.infradead.org,
linux-wireless@...r.kernel.org, netdev@...r.kernel.org
Subject: [PATCH 3/4] mwifiex: Flag wake-up interrupt as IRQ_NOAUTOEN rather than disabling it too late
The mwifiex driver makes unsafe assumptions about the state of the
wake-up interrupt. It requests it and only then disable it. Of
course, the interrupt may be screaming for whatever reason at that
time, and the handler will then be called without the interrupt
having been registered with the PM/wakeup subsystem. Oops.
The right way to handle this kind of situation is to flag the
interrupt with IRQ_NOAUTOEN before requesting it. It will then
stay disabled until someone (the wake-up subsystem) enables it.
Signed-off-by: Marc Zyngier <marc.zyngier@....com>
---
drivers/net/wireless/marvell/mwifiex/main.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
index 2105c2b7c627..82cf35e50579 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.c
+++ b/drivers/net/wireless/marvell/mwifiex/main.c
@@ -1610,6 +1610,7 @@ static void mwifiex_probe_of(struct mwifiex_adapter *adapter)
"wake-up interrupt outside 'wake-up' subnode of %pOF\n",
adapter->dt_node);
+ irq_set_status_flags(adapter->irq_wakeup, IRQ_NOAUTOEN);
ret = devm_request_irq(dev, adapter->irq_wakeup,
mwifiex_irq_wakeup_handler, IRQF_TRIGGER_LOW,
"wifi_wake", adapter);
@@ -1619,7 +1620,6 @@ static void mwifiex_probe_of(struct mwifiex_adapter *adapter)
goto err_exit;
}
- disable_irq(adapter->irq_wakeup);
if (device_init_wakeup(dev, true)) {
dev_err(dev, "fail to init wakeup for mwifiex\n");
goto err_exit;
--
2.20.1
Powered by blists - more mailing lists