Message ID | 20211219153442.463863-2-martin.blumenstingl@googlemail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | mmc: meson-mx-sdhc: two fixes | expand |
On Sun, 19 Dec 2021 at 16:34, Martin Blumenstingl <martin.blumenstingl@googlemail.com> wrote: > > The vendor driver implements special handling for multi-block > SD_IO_RW_EXTENDED (and SD_IO_RW_DIRECT) commands which have data > attached to them. It sets the MANUAL_STOP bit in the MESON_SDHC_MISC > register for these commands. In all other cases this bit is cleared. > Here we omit SD_IO_RW_DIRECT since that command never has any data > attached to it. > > This fixes SDIO wifi using the brcmfmac driver which reported the > following error without this change on a Netxeon S82 board using a > Meson8 (S802) SoC: > brcmf_fw_alloc_request: using brcm/brcmfmac43362-sdio for chip > BCM43362/1 > brcmf_sdiod_ramrw: membytes transfer failed > brcmf_sdio_download_code_file: error -110 on writing 219557 membytes > at 0x00000000 > brcmf_sdio_download_firmware: dongle image file download failed > > And with this change: > brcmf_fw_alloc_request: using brcm/brcmfmac43362-sdio for chip > BCM43362/1 > brcmf_c_process_clm_blob: no clm_blob available (err=-2), device may > have limited channels available > brcmf_c_preinit_dcmds: Firmware: BCM43362/1 wl0: Apr 22 2013 14:50:00 > version 5.90.195.89.6 FWID 01-b30a427d > > Fixes: e4bf1b0970ef96 ("mmc: host: meson-mx-sdhc: new driver for the Amlogic Meson SDHC host") > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Applied for fixes and by adding a stable tag, thanks! Kind regards Uffe > --- > drivers/mmc/host/meson-mx-sdhc-mmc.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/drivers/mmc/host/meson-mx-sdhc-mmc.c b/drivers/mmc/host/meson-mx-sdhc-mmc.c > index 7cd9c0ec2fcf..8fdd0bbbfa21 100644 > --- a/drivers/mmc/host/meson-mx-sdhc-mmc.c > +++ b/drivers/mmc/host/meson-mx-sdhc-mmc.c > @@ -135,6 +135,7 @@ static void meson_mx_sdhc_start_cmd(struct mmc_host *mmc, > struct mmc_command *cmd) > { > struct meson_mx_sdhc_host *host = mmc_priv(mmc); > + bool manual_stop = false; > u32 ictl, send; > int pack_len; > > @@ -172,12 +173,27 @@ static void meson_mx_sdhc_start_cmd(struct mmc_host *mmc, > else > /* software flush: */ > ictl |= MESON_SDHC_ICTL_DATA_XFER_OK; > + > + /* > + * Mimic the logic from the vendor driver where (only) > + * SD_IO_RW_EXTENDED commands with more than one block set the > + * MESON_SDHC_MISC_MANUAL_STOP bit. This fixes the firmware > + * download in the brcmfmac driver for a BCM43362/1 card. > + * Without this sdio_memcpy_toio() (with a size of 219557 > + * bytes) times out if MESON_SDHC_MISC_MANUAL_STOP is not set. > + */ > + manual_stop = cmd->data->blocks > 1 && > + cmd->opcode == SD_IO_RW_EXTENDED; > } else { > pack_len = 0; > > ictl |= MESON_SDHC_ICTL_RESP_OK; > } > > + regmap_update_bits(host->regmap, MESON_SDHC_MISC, > + MESON_SDHC_MISC_MANUAL_STOP, > + manual_stop ? MESON_SDHC_MISC_MANUAL_STOP : 0); > + > if (cmd->opcode == MMC_STOP_TRANSMISSION) > send |= MESON_SDHC_SEND_DATA_STOP; > > -- > 2.34.1 >
diff --git a/drivers/mmc/host/meson-mx-sdhc-mmc.c b/drivers/mmc/host/meson-mx-sdhc-mmc.c index 7cd9c0ec2fcf..8fdd0bbbfa21 100644 --- a/drivers/mmc/host/meson-mx-sdhc-mmc.c +++ b/drivers/mmc/host/meson-mx-sdhc-mmc.c @@ -135,6 +135,7 @@ static void meson_mx_sdhc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd) { struct meson_mx_sdhc_host *host = mmc_priv(mmc); + bool manual_stop = false; u32 ictl, send; int pack_len; @@ -172,12 +173,27 @@ static void meson_mx_sdhc_start_cmd(struct mmc_host *mmc, else /* software flush: */ ictl |= MESON_SDHC_ICTL_DATA_XFER_OK; + + /* + * Mimic the logic from the vendor driver where (only) + * SD_IO_RW_EXTENDED commands with more than one block set the + * MESON_SDHC_MISC_MANUAL_STOP bit. This fixes the firmware + * download in the brcmfmac driver for a BCM43362/1 card. + * Without this sdio_memcpy_toio() (with a size of 219557 + * bytes) times out if MESON_SDHC_MISC_MANUAL_STOP is not set. + */ + manual_stop = cmd->data->blocks > 1 && + cmd->opcode == SD_IO_RW_EXTENDED; } else { pack_len = 0; ictl |= MESON_SDHC_ICTL_RESP_OK; } + regmap_update_bits(host->regmap, MESON_SDHC_MISC, + MESON_SDHC_MISC_MANUAL_STOP, + manual_stop ? MESON_SDHC_MISC_MANUAL_STOP : 0); + if (cmd->opcode == MMC_STOP_TRANSMISSION) send |= MESON_SDHC_SEND_DATA_STOP;
The vendor driver implements special handling for multi-block SD_IO_RW_EXTENDED (and SD_IO_RW_DIRECT) commands which have data attached to them. It sets the MANUAL_STOP bit in the MESON_SDHC_MISC register for these commands. In all other cases this bit is cleared. Here we omit SD_IO_RW_DIRECT since that command never has any data attached to it. This fixes SDIO wifi using the brcmfmac driver which reported the following error without this change on a Netxeon S82 board using a Meson8 (S802) SoC: brcmf_fw_alloc_request: using brcm/brcmfmac43362-sdio for chip BCM43362/1 brcmf_sdiod_ramrw: membytes transfer failed brcmf_sdio_download_code_file: error -110 on writing 219557 membytes at 0x00000000 brcmf_sdio_download_firmware: dongle image file download failed And with this change: brcmf_fw_alloc_request: using brcm/brcmfmac43362-sdio for chip BCM43362/1 brcmf_c_process_clm_blob: no clm_blob available (err=-2), device may have limited channels available brcmf_c_preinit_dcmds: Firmware: BCM43362/1 wl0: Apr 22 2013 14:50:00 version 5.90.195.89.6 FWID 01-b30a427d Fixes: e4bf1b0970ef96 ("mmc: host: meson-mx-sdhc: new driver for the Amlogic Meson SDHC host") Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/mmc/host/meson-mx-sdhc-mmc.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)