]> www.infradead.org Git - users/hch/configfs.git/commitdiff
wifi: wilc1000: disable power sequencer
authorAjay Singh <ajay.kathat@microchip.com>
Thu, 13 Jun 2024 14:06:40 +0000 (16:06 +0200)
committerKalle Valo <kvalo@kernel.org>
Tue, 18 Jun 2024 10:23:15 +0000 (13:23 +0300)
Driver systematically disables some power mechanism each time it starts the
chip firmware (so mostly when interface is brought up). This has a negative
impact on some specific scenarios when the chip is exposed as a
hotpluggable SDIO card (eg: WILC1000 SD):
- when executing suspend/resume sequence while interface has been brought
  up
- rebooting the platform while module is plugged and interface has been
  brought up
Those scenarios lead to mmc core trying to initialize again the chip which
is now unresponsive (because of the power sequencer setting), so it fails
in mmc_rescan->mmc_attach_sdio and enter a failure loop while trying to
send CMD5:
mmc0: error -110 whilst initialising SDIO card
mmc0: error -110 whilst initialising SDIO card
mmc0: error -110 whilst initialising SDIO card
[...]

Preventing the driver from disabling this "power sequencer" fixes those
enumeration issues without affecting nominal operations.

Signed-off-by: Ajay Singh <ajay.kathat@microchip.com>
Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20240613-wilc_suspend-v1-1-c2f766d0988c@bootlin.com
drivers/net/wireless/microchip/wilc1000/sdio.c
drivers/net/wireless/microchip/wilc1000/wlan.h

index e6e20c86b791731ad908c5781dc5518c5a203d17..6461a3ec0120e62b2c350544b9473830ca5c17e1 100644 (file)
@@ -907,27 +907,12 @@ static int wilc_sdio_sync_ext(struct wilc *wilc, int nint)
 {
        struct sdio_func *func = dev_to_sdio_func(wilc->dev);
        struct wilc_sdio *sdio_priv = wilc->bus_data;
-       u32 reg;
 
        if (nint > MAX_NUM_INT) {
                dev_err(&func->dev, "Too many interrupts (%d)...\n", nint);
                return -EINVAL;
        }
 
-       /**
-        *      Disable power sequencer
-        **/
-       if (wilc_sdio_read_reg(wilc, WILC_MISC, &reg)) {
-               dev_err(&func->dev, "Failed read misc reg...\n");
-               return -EINVAL;
-       }
-
-       reg &= ~BIT(8);
-       if (wilc_sdio_write_reg(wilc, WILC_MISC, reg)) {
-               dev_err(&func->dev, "Failed write misc reg...\n");
-               return -EINVAL;
-       }
-
        if (sdio_priv->irq_gpio) {
                u32 reg;
                int ret, i;
index d72a0a81bbda2cd8cbd61eee0bf49af070ceb8da..dd2fb3c2f06a238cfedc4b4e954e453ae6c56563 100644 (file)
@@ -56,7 +56,6 @@
 #define WILC_HOST_RX_CTRL              (WILC_PERIPH_REG_BASE + 0x80)
 #define WILC_HOST_RX_EXTRA_SIZE                (WILC_PERIPH_REG_BASE + 0x84)
 #define WILC_HOST_TX_CTRL_1            (WILC_PERIPH_REG_BASE + 0x88)
-#define WILC_MISC                      (WILC_PERIPH_REG_BASE + 0x428)
 #define WILC_INTR_REG_BASE             (WILC_PERIPH_REG_BASE + 0xa00)
 #define WILC_INTR_ENABLE               WILC_INTR_REG_BASE
 #define WILC_INTR2_ENABLE              (WILC_INTR_REG_BASE + 4)