* [PATCH v2 1/2] mmc: meson-mx-sdhc: Set MANUAL_STOP for multi-block SDIO commands
@ 2021-12-19 15:34 ` Martin Blumenstingl
0 siblings, 0 replies; 15+ messages in thread
From: Martin Blumenstingl @ 2021-12-19 15:34 UTC (permalink / raw)
To: linux-mmc, linux-amlogic
Cc: linux-kernel, linux-arm-kernel, ulf.hansson, Martin Blumenstingl
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(+)
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
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 1/2] mmc: meson-mx-sdhc: Set MANUAL_STOP for multi-block SDIO commands
@ 2021-12-19 15:34 ` Martin Blumenstingl
0 siblings, 0 replies; 15+ messages in thread
From: Martin Blumenstingl @ 2021-12-19 15:34 UTC (permalink / raw)
To: linux-mmc, linux-amlogic
Cc: linux-kernel, linux-arm-kernel, ulf.hansson, Martin Blumenstingl
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(+)
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
_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/2] mmc: meson-mx-sdhc: Set MANUAL_STOP for multi-block SDIO commands
2021-12-19 15:34 ` Martin Blumenstingl
(?)
@ 2021-12-21 13:02 ` Ulf Hansson
-1 siblings, 0 replies; 15+ messages in thread
From: Ulf Hansson @ 2021-12-21 13:02 UTC (permalink / raw)
To: Martin Blumenstingl
Cc: linux-mmc, linux-amlogic, linux-kernel, linux-arm-kernel
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
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/2] mmc: meson-mx-sdhc: Set MANUAL_STOP for multi-block SDIO commands
@ 2021-12-21 13:02 ` Ulf Hansson
0 siblings, 0 replies; 15+ messages in thread
From: Ulf Hansson @ 2021-12-21 13:02 UTC (permalink / raw)
To: Martin Blumenstingl
Cc: linux-mmc, linux-amlogic, linux-kernel, linux-arm-kernel
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
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/2] mmc: meson-mx-sdhc: Set MANUAL_STOP for multi-block SDIO commands
@ 2021-12-21 13:02 ` Ulf Hansson
0 siblings, 0 replies; 15+ messages in thread
From: Ulf Hansson @ 2021-12-21 13:02 UTC (permalink / raw)
To: Martin Blumenstingl
Cc: linux-mmc, linux-amlogic, linux-kernel, linux-arm-kernel
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
>
_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic
^ permalink raw reply [flat|nested] 15+ messages in thread