[OEM-B][SRU][PATCH 05/11] rsi: fix error path handling in SDIO probe
Shrirang Bagul
shrirang.bagul at canonical.com
Tue Jul 17 11:07:47 UTC 2018
From: Amitkumar Karwar <amit.karwar at redpinesignals.com>
BugLink: https://bugs.launchpad.net/bugs/1782070
We miss to release IRQ in certain error path in SDIO probe which
causes following kernel panic. This patch corrects error path
handling
BUG: unable to handle kernel NULL pointer dereference at (null)
IP: (null)
PGD 0 P4D 0
Oops: 0010 [#1] SMP PTI
Call Trace:
<IRQ>
? call_timer_fn+0x29/0x120
? run_timer_softirq+0x1da/0x420
? timer_interrupt+0x11/0x20
? __do_softirq+0xef/0x26e
? irq_exit+0xbe/0xd0
? do_IRQ+0x4a/0xc0
? common_interrupt+0xa2/0xa2
</IRQ>
? cpuidle_enter_state+0x118/0x250
? do_idle+0x186/0x1e0
? cpu_startup_entry+0x6f/0x80
? start_kernel+0x47c/0x49c
? secondary_startup_64+0xa5/0xb0
Fixes: 50117605770c ("rsi: improve RX handling in SDIO interface")
Signed-off-by: Amitkumar Karwar <amit.karwar at redpinesignals.com>
Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
(cherry picked from commit 90b12aebe54b9157a28f5131203f48ad943ba79a)
Signed-off-by: Shrirang Bagul <shrirang.bagul at canonical.com>
---
drivers/net/wireless/rsi/rsi_91x_sdio.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index a38580ef3c27..75f9b601cfd0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -988,7 +988,7 @@ static int rsi_probe(struct sdio_func *pfunction,
rsi_sdio_rx_thread, "SDIO-RX-Thread");
if (status) {
rsi_dbg(ERR_ZONE, "%s: Unable to init rx thrd\n", __func__);
- goto fail_free_adapter;
+ goto fail_kill_thread;
}
skb_queue_head_init(&sdev->rx_q.head);
sdev->rx_q.num_rx_pkts = 0;
@@ -998,7 +998,7 @@ static int rsi_probe(struct sdio_func *pfunction,
rsi_dbg(ERR_ZONE, "%s: Failed to request IRQ\n", __func__);
sdio_release_host(pfunction);
status = -EIO;
- goto fail_kill_thread;
+ goto fail_claim_irq;
}
sdio_release_host(pfunction);
rsi_dbg(INIT_ZONE, "%s: Registered Interrupt handler\n", __func__);
@@ -1006,7 +1006,7 @@ static int rsi_probe(struct sdio_func *pfunction,
if (rsi_hal_device_init(adapter)) {
rsi_dbg(ERR_ZONE, "%s: Failed in device init\n", __func__);
status = -EINVAL;
- goto fail_kill_thread;
+ goto fail_dev_init;
}
rsi_dbg(INFO_ZONE, "===> RSI Device Init Done <===\n");
@@ -1023,10 +1023,13 @@ static int rsi_probe(struct sdio_func *pfunction,
fail_dev_init:
sdio_claim_host(pfunction);
sdio_release_irq(pfunction);
- sdio_disable_func(pfunction);
sdio_release_host(pfunction);
-fail_kill_thread:
+fail_claim_irq:
rsi_kill_thread(&sdev->rx_thread);
+fail_kill_thread:
+ sdio_claim_host(pfunction);
+ sdio_disable_func(pfunction);
+ sdio_release_host(pfunction);
fail_free_adapter:
rsi_91x_deinit(adapter);
rsi_dbg(ERR_ZONE, "%s: Failed in probe...Exiting\n", __func__);
--
2.17.1
More information about the kernel-team
mailing list