forked from Minki/linux
rsi: Register interrupt handler before firmware load
Before firmware load, sometimes false interrupts are received. System hang is observed if interrupt handler is not registered to receive these interrupts. Hence interrupt handler registration is moved before firmware load. We will drop these false interrupts as these are not from the device. Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com> Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
4833c953fd
commit
015e367494
@ -733,6 +733,7 @@ int rsi_hal_device_init(struct rsi_hw *adapter)
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
common->fsm_state = FSM_CARD_NOT_READY;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -139,6 +139,8 @@ static void rsi_handle_interrupt(struct sdio_func *function)
|
||||
{
|
||||
struct rsi_hw *adapter = sdio_get_drvdata(function);
|
||||
|
||||
if (adapter->priv->fsm_state == FSM_FW_NOT_LOADED)
|
||||
return;
|
||||
sdio_release_host(function);
|
||||
rsi_interrupt_handler(adapter);
|
||||
sdio_claim_host(function);
|
||||
@ -908,10 +910,19 @@ static int rsi_probe(struct sdio_func *pfunction,
|
||||
__func__);
|
||||
goto fail;
|
||||
}
|
||||
sdio_claim_host(pfunction);
|
||||
if (sdio_claim_irq(pfunction, rsi_handle_interrupt)) {
|
||||
rsi_dbg(ERR_ZONE, "%s: Failed to request IRQ\n", __func__);
|
||||
sdio_release_host(pfunction);
|
||||
goto fail;
|
||||
}
|
||||
sdio_release_host(pfunction);
|
||||
rsi_dbg(INIT_ZONE, "%s: Registered Interrupt handler\n", __func__);
|
||||
|
||||
if (rsi_hal_device_init(adapter)) {
|
||||
rsi_dbg(ERR_ZONE, "%s: Failed in device init\n", __func__);
|
||||
sdio_claim_host(pfunction);
|
||||
sdio_release_irq(pfunction);
|
||||
sdio_disable_func(pfunction);
|
||||
sdio_release_host(pfunction);
|
||||
goto fail;
|
||||
@ -923,16 +934,6 @@ static int rsi_probe(struct sdio_func *pfunction,
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
sdio_claim_host(pfunction);
|
||||
if (sdio_claim_irq(pfunction, rsi_handle_interrupt)) {
|
||||
rsi_dbg(ERR_ZONE, "%s: Failed to request IRQ\n", __func__);
|
||||
sdio_release_host(pfunction);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
sdio_release_host(pfunction);
|
||||
rsi_dbg(INIT_ZONE, "%s: Registered Interrupt handler\n", __func__);
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
rsi_91x_deinit(adapter);
|
||||
|
@ -32,6 +32,7 @@
|
||||
#define ISR_ZONE BIT(8) /* For Interrupt Msgs */
|
||||
|
||||
enum RSI_FSM_STATES {
|
||||
FSM_FW_NOT_LOADED,
|
||||
FSM_CARD_NOT_READY,
|
||||
FSM_BOOT_PARAMS_SENT,
|
||||
FSM_EEPROM_READ_MAC_ADDR,
|
||||
|
Loading…
Reference in New Issue
Block a user