Commit 90b12aeb authored by Amitkumar Karwar's avatar Amitkumar Karwar Committed by Kalle Valo

rsi: fix error path handling in SDIO probe

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: 50117605 ("rsi: improve RX handling in SDIO interface")
Signed-off-by: default avatarAmitkumar Karwar <amit.karwar@redpinesignals.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent a31f9314
...@@ -967,7 +967,7 @@ static int rsi_probe(struct sdio_func *pfunction, ...@@ -967,7 +967,7 @@ static int rsi_probe(struct sdio_func *pfunction,
rsi_sdio_rx_thread, "SDIO-RX-Thread"); rsi_sdio_rx_thread, "SDIO-RX-Thread");
if (status) { if (status) {
rsi_dbg(ERR_ZONE, "%s: Unable to init rx thrd\n", __func__); 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); skb_queue_head_init(&sdev->rx_q.head);
sdev->rx_q.num_rx_pkts = 0; sdev->rx_q.num_rx_pkts = 0;
...@@ -977,7 +977,7 @@ static int rsi_probe(struct sdio_func *pfunction, ...@@ -977,7 +977,7 @@ static int rsi_probe(struct sdio_func *pfunction,
rsi_dbg(ERR_ZONE, "%s: Failed to request IRQ\n", __func__); rsi_dbg(ERR_ZONE, "%s: Failed to request IRQ\n", __func__);
sdio_release_host(pfunction); sdio_release_host(pfunction);
status = -EIO; status = -EIO;
goto fail_kill_thread; goto fail_claim_irq;
} }
sdio_release_host(pfunction); sdio_release_host(pfunction);
rsi_dbg(INIT_ZONE, "%s: Registered Interrupt handler\n", __func__); rsi_dbg(INIT_ZONE, "%s: Registered Interrupt handler\n", __func__);
...@@ -985,7 +985,7 @@ static int rsi_probe(struct sdio_func *pfunction, ...@@ -985,7 +985,7 @@ static int rsi_probe(struct sdio_func *pfunction,
if (rsi_hal_device_init(adapter)) { if (rsi_hal_device_init(adapter)) {
rsi_dbg(ERR_ZONE, "%s: Failed in device init\n", __func__); rsi_dbg(ERR_ZONE, "%s: Failed in device init\n", __func__);
status = -EINVAL; status = -EINVAL;
goto fail_kill_thread; goto fail_dev_init;
} }
rsi_dbg(INFO_ZONE, "===> RSI Device Init Done <===\n"); rsi_dbg(INFO_ZONE, "===> RSI Device Init Done <===\n");
...@@ -1002,10 +1002,13 @@ static int rsi_probe(struct sdio_func *pfunction, ...@@ -1002,10 +1002,13 @@ static int rsi_probe(struct sdio_func *pfunction,
fail_dev_init: fail_dev_init:
sdio_claim_host(pfunction); sdio_claim_host(pfunction);
sdio_release_irq(pfunction); sdio_release_irq(pfunction);
sdio_disable_func(pfunction);
sdio_release_host(pfunction); sdio_release_host(pfunction);
fail_kill_thread: fail_claim_irq:
rsi_kill_thread(&sdev->rx_thread); rsi_kill_thread(&sdev->rx_thread);
fail_kill_thread:
sdio_claim_host(pfunction);
sdio_disable_func(pfunction);
sdio_release_host(pfunction);
fail_free_adapter: fail_free_adapter:
rsi_91x_deinit(adapter); rsi_91x_deinit(adapter);
rsi_dbg(ERR_ZONE, "%s: Failed in probe...Exiting\n", __func__); rsi_dbg(ERR_ZONE, "%s: Failed in probe...Exiting\n", __func__);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment