wifi: wilc1000: add 'isinit' flag for SDIO bus similar to SPI
authorAjay Singh <ajay.kathat@microchip.com>
Wed, 20 Jul 2022 16:03:05 +0000 (16:03 +0000)
committerKalle Valo <kvalo@kernel.org>
Wed, 27 Jul 2022 12:58:10 +0000 (15:58 +0300)
Similar to SPI priv data, add 'isinit' variable in SDIO priv. Make use
of the state to invoke hif_init() once, and acquire the lock before
accessing hif function.

Signed-off-by: Ajay Singh <ajay.kathat@microchip.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220720160302.231516-7-ajay.kathat@microchip.com
drivers/net/wireless/microchip/wilc1000/sdio.c
drivers/net/wireless/microchip/wilc1000/spi.c
drivers/net/wireless/microchip/wilc1000/wlan.c
drivers/net/wireless/microchip/wilc1000/wlan.h

index 7962c11cfe8488b1d08836873d34b76e4ca3c9e3..600cc57e9da2031ef0e80754029cf75fb1a1fcf1 100644 (file)
@@ -26,6 +26,7 @@ static const struct sdio_device_id wilc_sdio_ids[] = {
 struct wilc_sdio {
        bool irq_gpio;
        u32 block_size;
+       bool isinit;
        int has_thrpt_enh3;
 };
 
@@ -193,6 +194,13 @@ static int wilc_sdio_reset(struct wilc *wilc)
        return 0;
 }
 
+static bool wilc_sdio_is_init(struct wilc *wilc)
+{
+       struct wilc_sdio *sdio_priv = wilc->bus_data;
+
+       return sdio_priv->isinit;
+}
+
 static int wilc_sdio_suspend(struct device *dev)
 {
        struct sdio_func *func = dev_to_sdio_func(dev);
@@ -581,6 +589,9 @@ static int wilc_sdio_read(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
 
 static int wilc_sdio_deinit(struct wilc *wilc)
 {
+       struct wilc_sdio *sdio_priv = wilc->bus_data;
+
+       sdio_priv->isinit = false;
        return 0;
 }
 
@@ -700,6 +711,7 @@ static int wilc_sdio_init(struct wilc *wilc, bool resume)
                         sdio_priv->has_thrpt_enh3);
        }
 
+       sdio_priv->isinit = true;
        return 0;
 }
 
@@ -981,6 +993,7 @@ static const struct wilc_hif_func wilc_hif_sdio = {
        .enable_interrupt = wilc_sdio_enable_interrupt,
        .disable_interrupt = wilc_sdio_disable_interrupt,
        .hif_reset = wilc_sdio_reset,
+       .hif_is_init = wilc_sdio_is_init,
 };
 
 static int wilc_sdio_resume(struct device *dev)
index 2ae8dd3411aca758c48d0f64e8a52777bcda1c73..b0fc5e68feeca5db355918acca1959d613f1f948 100644 (file)
@@ -1029,6 +1029,13 @@ static int wilc_spi_reset(struct wilc *wilc)
        return result;
 }
 
+static bool wilc_spi_is_init(struct wilc *wilc)
+{
+       struct wilc_spi *spi_priv = wilc->bus_data;
+
+       return spi_priv->isinit;
+}
+
 static int wilc_spi_deinit(struct wilc *wilc)
 {
        struct wilc_spi *spi_priv = wilc->bus_data;
@@ -1250,4 +1257,5 @@ static const struct wilc_hif_func wilc_hif_spi = {
        .hif_block_rx_ext = wilc_spi_read,
        .hif_sync_ext = wilc_spi_sync_ext,
        .hif_reset = wilc_spi_reset,
+       .hif_is_init = wilc_spi_is_init,
 };
index f3f504d12873ee96c707f4851a5e023ebeecd589..947d9a0a494ef4c30e9924f52b6947a9c067cf99 100644 (file)
@@ -1481,9 +1481,12 @@ int wilc_wlan_init(struct net_device *dev)
 
        wilc->quit = 0;
 
-       if (wilc->hif_func->hif_init(wilc, false)) {
-               ret = -EIO;
-               goto fail;
+       if (!wilc->hif_func->hif_is_init(wilc)) {
+               acquire_bus(wilc, WILC_BUS_ACQUIRE_ONLY);
+               ret = wilc->hif_func->hif_init(wilc, false);
+               release_bus(wilc, WILC_BUS_RELEASE_ONLY);
+               if (ret)
+                       goto fail;
        }
 
        if (!wilc->tx_buffer)
index b45e72789a0e03c33e5e0b5e1188641091a36836..a72cd5cac81d5fb3eaf16ade51acd84f49a53814 100644 (file)
@@ -373,6 +373,7 @@ struct wilc_hif_func {
        int (*enable_interrupt)(struct wilc *nic);
        void (*disable_interrupt)(struct wilc *nic);
        int (*hif_reset)(struct wilc *wilc);
+       bool (*hif_is_init)(struct wilc *wilc);
 };
 
 #define WILC_MAX_CFG_FRAME_SIZE                1468