提交 90b12aeb 编写于 作者: A Amitkumar Karwar 提交者: 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: NAmitkumar Karwar <amit.karwar@redpinesignals.com>
Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
上级 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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册