Skip to content

Commit f89b548

Browse files
xdarklightUlf Hansson
authored andcommitted
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: e4bf1b0 ("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>
1 parent 66c915d commit f89b548

1 file changed

Lines changed: 16 additions & 0 deletions

File tree

drivers/mmc/host/meson-mx-sdhc-mmc.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ static void meson_mx_sdhc_start_cmd(struct mmc_host *mmc,
135135
struct mmc_command *cmd)
136136
{
137137
struct meson_mx_sdhc_host *host = mmc_priv(mmc);
138+
bool manual_stop = false;
138139
u32 ictl, send;
139140
int pack_len;
140141

@@ -172,12 +173,27 @@ static void meson_mx_sdhc_start_cmd(struct mmc_host *mmc,
172173
else
173174
/* software flush: */
174175
ictl |= MESON_SDHC_ICTL_DATA_XFER_OK;
176+
177+
/*
178+
* Mimic the logic from the vendor driver where (only)
179+
* SD_IO_RW_EXTENDED commands with more than one block set the
180+
* MESON_SDHC_MISC_MANUAL_STOP bit. This fixes the firmware
181+
* download in the brcmfmac driver for a BCM43362/1 card.
182+
* Without this sdio_memcpy_toio() (with a size of 219557
183+
* bytes) times out if MESON_SDHC_MISC_MANUAL_STOP is not set.
184+
*/
185+
manual_stop = cmd->data->blocks > 1 &&
186+
cmd->opcode == SD_IO_RW_EXTENDED;
175187
} else {
176188
pack_len = 0;
177189

178190
ictl |= MESON_SDHC_ICTL_RESP_OK;
179191
}
180192

193+
regmap_update_bits(host->regmap, MESON_SDHC_MISC,
194+
MESON_SDHC_MISC_MANUAL_STOP,
195+
manual_stop ? MESON_SDHC_MISC_MANUAL_STOP : 0);
196+
181197
if (cmd->opcode == MMC_STOP_TRANSMISSION)
182198
send |= MESON_SDHC_SEND_DATA_STOP;
183199

0 commit comments

Comments
 (0)