summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/microchip
diff options
context:
space:
mode:
authorAjay Singh <ajay.kathat@microchip.com>2020-12-08 10:38:00 +0000
committerKalle Valo <kvalo@codeaurora.org>2020-12-10 20:48:13 +0200
commit382726d134e3c59dc7f78dcd54d1990493489835 (patch)
tree0baf79e482fda109d21672d7b11e6db6617e3a77 /drivers/net/wireless/microchip
parent89b5d9b2215bc36baa0a974ad9c8a2bead8e836a (diff)
downloadlinux-next-382726d134e3c59dc7f78dcd54d1990493489835.tar.gz
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
Diffstat (limited to 'drivers/net/wireless/microchip')
-rw-r--r--drivers/net/wireless/microchip/wilc1000/spi.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/net/wireless/microchip/wilc1000/spi.c b/drivers/net/wireless/microchip/wilc1000/spi.c
index a18dac0aa6b6..be732929322c 100644
--- a/drivers/net/wireless/microchip/wilc1000/spi.c
+++ b/drivers/net/wireless/microchip/wilc1000/spi.c
@@ -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)