wilc1000: changes for SPI communication stall issue found with Iperf

Added retry mechanism to ensure VMM enable bit is set during the
block transfer of data between host and WILC FW.

Signed-off-by: Ajay Singh <ajay.kathat@microchip.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20201208103739.28597-1-ajay.kathat@microchip.com
This commit is contained in:
Ajay Singh 2020-12-08 10:38:00 +00:00 committed by Kalle Valo
parent 89b5d9b221
commit 382726d134
1 changed files with 21 additions and 2 deletions

View File

@ -35,6 +35,7 @@ static const struct wilc_hif_func wilc_hif_spi;
#define CMD_SINGLE_READ 0xca
#define CMD_RESET 0xcf
#define SPI_ENABLE_VMM_RETRY_LIMIT 2
#define DATA_PKT_SZ_256 256
#define DATA_PKT_SZ_512 512
#define DATA_PKT_SZ_1K 1024
@ -856,8 +857,26 @@ static int wilc_spi_read_int(struct wilc *wilc, u32 *int_status)
static int wilc_spi_clear_int_ext(struct wilc *wilc, u32 val)
{
return spi_internal_write(wilc, WILC_SPI_INT_CLEAR - WILC_SPI_REG_BASE,
val);
int ret;
int retry = SPI_ENABLE_VMM_RETRY_LIMIT;
u32 check;
while (retry) {
ret = spi_internal_write(wilc,
WILC_SPI_INT_CLEAR - WILC_SPI_REG_BASE,
val);
if (ret)
break;
ret = spi_internal_read(wilc,
WILC_SPI_INT_CLEAR - WILC_SPI_REG_BASE,
&check);
if (ret || ((check & EN_VMM) == (val & EN_VMM)))
break;
retry--;
}
return ret;
}
static int wilc_spi_sync_ext(struct wilc *wilc, int nint)