Message ID | 1521553241-12676-1-git-send-email-amitkarwar@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 90b12aebe54b9157a28f5131203f48ad943ba79a |
Delegated to: | Kalle Valo |
Headers | show |
Amitkumar Karwar <amitkarwar@gmail.com> wrote: > From: Amitkumar Karwar <amit.karwar@redpinesignals.com> > > 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@redpinesignals.com> 2 patches applied to wireless-drivers-next.git, thanks. 90b12aebe54b rsi: fix error path handling in SDIO probe 864db4d50853 rsi: fix kernel panic observed on 64bit machine
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c b/drivers/net/wireless/rsi/rsi_91x_sdio.c index 13705fc..9ce2edb 100644 --- a/drivers/net/wireless/rsi/rsi_91x_sdio.c +++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c @@ -967,7 +967,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; @@ -977,7 +977,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__); @@ -985,7 +985,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"); @@ -1002,10 +1002,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__);