Commit 015e3674 authored by Prameela Rani Garnepudi's avatar Prameela Rani Garnepudi Committed by Kalle Valo

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: default avatarPrameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: default avatarAmitkumar Karwar <amit.karwar@redpinesignals.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 4833c953
...@@ -733,6 +733,7 @@ int rsi_hal_device_init(struct rsi_hw *adapter) ...@@ -733,6 +733,7 @@ int rsi_hal_device_init(struct rsi_hw *adapter)
default: default:
return -EINVAL; return -EINVAL;
} }
common->fsm_state = FSM_CARD_NOT_READY;
return 0; return 0;
} }
......
...@@ -139,6 +139,8 @@ static void rsi_handle_interrupt(struct sdio_func *function) ...@@ -139,6 +139,8 @@ static void rsi_handle_interrupt(struct sdio_func *function)
{ {
struct rsi_hw *adapter = sdio_get_drvdata(function); struct rsi_hw *adapter = sdio_get_drvdata(function);
if (adapter->priv->fsm_state == FSM_FW_NOT_LOADED)
return;
sdio_release_host(function); sdio_release_host(function);
rsi_interrupt_handler(adapter); rsi_interrupt_handler(adapter);
sdio_claim_host(function); sdio_claim_host(function);
...@@ -908,10 +910,19 @@ static int rsi_probe(struct sdio_func *pfunction, ...@@ -908,10 +910,19 @@ static int rsi_probe(struct sdio_func *pfunction,
__func__); __func__);
goto fail; 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)) { 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__);
sdio_claim_host(pfunction); sdio_claim_host(pfunction);
sdio_release_irq(pfunction);
sdio_disable_func(pfunction); sdio_disable_func(pfunction);
sdio_release_host(pfunction); sdio_release_host(pfunction);
goto fail; goto fail;
...@@ -923,16 +934,6 @@ static int rsi_probe(struct sdio_func *pfunction, ...@@ -923,16 +934,6 @@ static int rsi_probe(struct sdio_func *pfunction,
return -EIO; 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; return 0;
fail: fail:
rsi_91x_deinit(adapter); rsi_91x_deinit(adapter);
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#define ISR_ZONE BIT(8) /* For Interrupt Msgs */ #define ISR_ZONE BIT(8) /* For Interrupt Msgs */
enum RSI_FSM_STATES { enum RSI_FSM_STATES {
FSM_FW_NOT_LOADED,
FSM_CARD_NOT_READY, FSM_CARD_NOT_READY,
FSM_BOOT_PARAMS_SENT, FSM_BOOT_PARAMS_SENT,
FSM_EEPROM_READ_MAC_ADDR, FSM_EEPROM_READ_MAC_ADDR,
......
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