mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 13:53:33 +00:00
mmc: meson-mx-sdhc: Set MANUAL_STOP for multi-block SDIO commands
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: e4bf1b0970
("mmc: host: meson-mx-sdhc: new driver for the Amlogic Meson SDHC host")
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20211219153442.463863-2-martin.blumenstingl@googlemail.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
66c915d09b
commit
f89b548ca6
1 changed files with 16 additions and 0 deletions
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue