[PATCH] mmc: dw_mmc: Fixes timeout issue for FIFO mode
Jaehoon Chung
jh80.chung at samsung.com
Wed Jan 12 12:15:29 CET 2022
Hi,
On 1/12/22 3:17 PM, gtXfined H. wrote:
> Hi,
>
> I switched back to master branch and only made the following changes.
>
> --- a/drivers/mmc/dw_mmc.c
> +++ b/drivers/mmc/dw_mmc.c
> @@ -167,6 +167,10 @@ static int dwmci_data_transfer(struct dwmci_host
> *host, struct mmc_data *data)
> len = 0;
> if (data->flags == MMC_DATA_READ &&
> (mask & (DWMCI_INTMSK_RXDR |
> DWMCI_INTMSK_DTO))) {
> + if (!(mask & DWMCI_INTMSK_DTO) &&
> + (dwmci_readl(host, DWMCI_RINTSTS) &
> DWMCI_INTMSK_DTO)) {
> + printf("warn: DTO changed to 1\n");
> + }
> dwmci_writel(host, DWMCI_RINTSTS,
> DWMCI_INTMSK_RXDR |
You need to set your email-client environment.
https://www.kernel.org/doc/html/v5.16/process/email-clients.html?highlight=email
> DWMCI_INTMSK_DTO);
> while (size) {
> @@ -224,6 +228,11 @@ static int dwmci_data_transfer(struct dwmci_host
> *host, struct mmc_data *data)
>
> dwmci_writel(host, DWMCI_RINTSTS, mask);
>
> +#ifdef CONFIG_SPL_BUILD
> + printf("mmc: transfer %8p, %5d, in %4ld (%d, %02x)\n",
> + buf, data->blocks, get_timer(start), size, mask);
> +#endif
> +
> return ret;
> }
>
> Then tried the same test and reproduced the timeout issue with the
> following logs.
>
> U-Boot SPL 2022.01-00373-gfe04d885fb-dirty (Jan 12 2022 - 13:52:15 +0800)
> Trying to boot from MMC1
> mmc: transfer 3fffac8, 1, in 0 (0, 0c)
> mmc: transfer 3fffb80, 1, in 2 (0, 0c)
> mmc: transfer 3fffd00, 1, in 1 (0, 0c)
> warn: DTO changed to 1
> mmc: transfer 2001c0, 1, in 1001 (0, 04)
> mmc_load_image_raw_sector: mmc block read error
> Trying to boot from MMC1
> warn: DTO changed to 1
> mmc: transfer 2001c0, 1, in 1001 (0, 04)
> mmc_load_image_raw_sector: mmc block read error
> SPL: failed to boot from all boot devices
> ### ERROR ### Please RESET the board ###
>
> According to the logs, you can see that the DTO interrupt was
> unintentionally cleared
I had been tested after set the fifo-mode. It's occurred timeout error.
But your patch doesn't work, too. It's not solution to solve this problem.
Well, I have checked some code. It seems that there are some bugs about fifo-mode.
Best Regards,
Jaehoon Chung
>
>
> BR,
> Jensen, Huang
>
>
> On Wed, Jan 12, 2022 at 7:04 AM Jaehoon Chung <jh80.chung at samsung.com>
> wrote:
>
>> On 1/11/22 8:05 PM, gtXfined H. wrote:
>>> Hi,
>>>
>>>> Which board did you test? When you do power-on, is it reproduced every
>>> time?
>>>
>>> I am using Rockchip RK3399 based board - NanoPi R4S for this test.
>>> It doesn't appear every time, but it should be encountered once about 20
>>> times.
>>> I have run "setenv bootcmd reset; saveenv; reset" for automated testing.
>>
>> This patch doesn't clarify.
>>
>> The below commit had been fixed that doesn't work when data read.
>> "mmc: dw_mmc: Fixes data read when receiving DTO interrupt in FIFO mode"
>>
>> It seems that not clearing during reset card.
>> (power glitch or other problem..?)
>>
>> Best Regards,
>> Jaehoon Chung
>>
>>>
>>>
>>>> Could you change from your ID to your name?
>>>
>>> This is my first time sending a patch, sorry I didn't notice this, do I
>>> need to resend this patch?
>>>
>>>
>>> BR,
>>> Jensen, Huang
>>>
>>>
>>> On Tue, Jan 11, 2022 at 6:38 PM Jaehoon Chung <jh80.chung at samsung.com>
>>> wrote:
>>>
>>>> Hi,
>>>>
>>>> On 1/11/22 7:24 PM, hmz007 wrote:
>>>>> Clearing the DTO interrupt should be unnecessary, and it would
>>>>> potentially result in never receiving this interrupt again.
>>>>>
>>>>> Do power-on or reset from uboot for a while can reproduce the issue:
>>>>> dwmci_data_transfer: Timeout waiting for data!
>>>>> mmc_load_image_raw_sector: mmc block read error
>>>>
>>>> Which board did you test? When you do power-on, is it reproduced every
>>>> time?
>>>>
>>>>>
>>>>> Tested on NanoPi R4S with SanDisk Extreme PRO 32GB.
>>>>>
>>>>> Fixes: 8cb9d3ed3a ("mmc: dw_mmc: Fixes data read when receiving DTO
>>>> interrupt in FIFO mode")
>>>>> Signed-off-by: hmz007 <hmz007 at gmail.com>
>>>>
>>>> Could you change from your ID to your name?
>>>>
>>>> Best Regards,
>>>> Jaehoon Chung
>>>>
>>>>> ---
>>>>> drivers/mmc/dw_mmc.c | 2 +-
>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c
>>>>> index a949dad574..8fa26b340b 100644
>>>>> --- a/drivers/mmc/dw_mmc.c
>>>>> +++ b/drivers/mmc/dw_mmc.c
>>>>> @@ -168,7 +168,7 @@ static int dwmci_data_transfer(struct dwmci_host
>>>> *host, struct mmc_data *data)
>>>>> if (data->flags == MMC_DATA_READ &&
>>>>> (mask & (DWMCI_INTMSK_RXDR |
>>>> DWMCI_INTMSK_DTO))) {
>>>>> dwmci_writel(host, DWMCI_RINTSTS,
>>>>> - DWMCI_INTMSK_RXDR |
>>>> DWMCI_INTMSK_DTO);
>>>>> + DWMCI_INTMSK_RXDR);
>>>>> while (size) {
>>>>> ret = dwmci_fifo_ready(host,
>>>>> DWMCI_FIFO_EMPTY,
>>>>>
>>>>
>>>>
>>>
>>
>>
>
More information about the U-Boot
mailing list