rsi: Optimise sdio claim and release host
SDIO host is already claimed in our interrupt handler. Some lower level APIs claims host while performing SDIO read or write operations. Let's use sdio_irq_task variable to check if we are in interrupt context and claim/release the host accordingly. Signed-off-by: Karun Eagalapati <karun256@gmail.com> Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com> Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
5f6ae7cae2
commit
72bccf51d4
|
@ -138,12 +138,15 @@ static int rsi_issue_sdiocommand(struct sdio_func *func,
|
|||
static void rsi_handle_interrupt(struct sdio_func *function)
|
||||
{
|
||||
struct rsi_hw *adapter = sdio_get_drvdata(function);
|
||||
struct rsi_91x_sdiodev *dev =
|
||||
(struct rsi_91x_sdiodev *)adapter->rsi_dev;
|
||||
|
||||
if (adapter->priv->fsm_state == FSM_FW_NOT_LOADED)
|
||||
return;
|
||||
sdio_release_host(function);
|
||||
|
||||
dev->sdio_irq_task = current;
|
||||
rsi_interrupt_handler(adapter);
|
||||
sdio_claim_host(function);
|
||||
dev->sdio_irq_task = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -407,14 +410,16 @@ int rsi_sdio_read_register(struct rsi_hw *adapter,
|
|||
u8 fun_num = 0;
|
||||
int status;
|
||||
|
||||
sdio_claim_host(dev->pfunction);
|
||||
if (likely(dev->sdio_irq_task != current))
|
||||
sdio_claim_host(dev->pfunction);
|
||||
|
||||
if (fun_num == 0)
|
||||
*data = sdio_f0_readb(dev->pfunction, addr, &status);
|
||||
else
|
||||
*data = sdio_readb(dev->pfunction, addr, &status);
|
||||
|
||||
sdio_release_host(dev->pfunction);
|
||||
if (likely(dev->sdio_irq_task != current))
|
||||
sdio_release_host(dev->pfunction);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -438,14 +443,16 @@ int rsi_sdio_write_register(struct rsi_hw *adapter,
|
|||
(struct rsi_91x_sdiodev *)adapter->rsi_dev;
|
||||
int status = 0;
|
||||
|
||||
sdio_claim_host(dev->pfunction);
|
||||
if (likely(dev->sdio_irq_task != current))
|
||||
sdio_claim_host(dev->pfunction);
|
||||
|
||||
if (function == 0)
|
||||
sdio_f0_writeb(dev->pfunction, *data, addr, &status);
|
||||
else
|
||||
sdio_writeb(dev->pfunction, *data, addr, &status);
|
||||
|
||||
sdio_release_host(dev->pfunction);
|
||||
if (likely(dev->sdio_irq_task != current))
|
||||
sdio_release_host(dev->pfunction);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -490,11 +497,13 @@ static int rsi_sdio_read_register_multiple(struct rsi_hw *adapter,
|
|||
(struct rsi_91x_sdiodev *)adapter->rsi_dev;
|
||||
u32 status;
|
||||
|
||||
sdio_claim_host(dev->pfunction);
|
||||
if (likely(dev->sdio_irq_task != current))
|
||||
sdio_claim_host(dev->pfunction);
|
||||
|
||||
status = sdio_readsb(dev->pfunction, data, addr, count);
|
||||
|
||||
sdio_release_host(dev->pfunction);
|
||||
if (likely(dev->sdio_irq_task != current))
|
||||
sdio_release_host(dev->pfunction);
|
||||
|
||||
if (status != 0)
|
||||
rsi_dbg(ERR_ZONE, "%s: Synch Cmd53 read failed\n", __func__);
|
||||
|
@ -532,11 +541,13 @@ int rsi_sdio_write_register_multiple(struct rsi_hw *adapter,
|
|||
dev->write_fail++;
|
||||
}
|
||||
|
||||
sdio_claim_host(dev->pfunction);
|
||||
if (likely(dev->sdio_irq_task != current))
|
||||
sdio_claim_host(dev->pfunction);
|
||||
|
||||
status = sdio_writesb(dev->pfunction, addr, data, count);
|
||||
|
||||
sdio_release_host(dev->pfunction);
|
||||
if (likely(dev->sdio_irq_task != current))
|
||||
sdio_release_host(dev->pfunction);
|
||||
|
||||
if (status) {
|
||||
rsi_dbg(ERR_ZONE, "%s: Synch Cmd53 write failed %d\n",
|
||||
|
|
Loading…
Reference in New Issue