Re: Self-detected stall on CPU when using SD card

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dong Aisheng,

Maybe you can shed some light on the issue below?


On 26.06.2018 16:45, Stefan Agner wrote:
> On 26.06.2018 12:53, Stefan Agner wrote:
>> Hi,
>>
>> On our Colibri iMX6 (arch/arm/boot/dts/imx6qdl-colibri.dtsi) we
>> experience the following stack trace when a SD card is plugged in:
>>
> 
> [...]
> 
>> [<c08396f4>] (esdhc_pltfm_set_clock) from [<c083622c>]
>> (sdhci_set_ios+0xd8/0x584)
>>  r10:ffffe000 r9:c1105900 r8:00004097 r7:d818f2e8 r6:d818f480
>> r5:d818f2e8
>>  r4:d818f000
>> [<c0836154>] (sdhci_set_ios) from [<c0836070>]
>> (sdhci_runtime_resume_host+0xa0/0x184)
>>  r9:c1105900 r8:00004097 r7:d818f2e8 r6:d818f648 r5:d818f000 r4:d818f480
> 
> [...]
> 
>>
>> It used to work in v4.9, so I started a git bisect. It pointed me to
>> this commit:
>>
>> Commit d1e4f74f911d ("mmc: sdhci: Do not use spin lock in set_ios
>> paths").
>>
>> Reverting the commit on-top of v4.18-rc1 seems to fix the issue too.
>>
>> Any idea?
> 
> I figured out that the same platform had a GPIO Key which triggered all
> the time. This seems to exacerbate the MMC issue such that it triggers
> on very boot, about rootfs mount time.
> 
> This change seems to fix the issue as well, not sure though whether this
> is a proper fix:
> 
> --- a/drivers/mmc/host/sdhci-esdhc-imx.c
> +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
> @@ -697,6 +697,7 @@ static inline void esdhc_pltfm_set_clock(struct
> sdhci_host *host,
>         int ddr_pre_div = imx_data->is_ddr ? 2 : 1;
>         int pre_div = 1;
>         int div = 1;
> +       unsigned long flags;
>         u32 temp, val;
>  
>         if (clock == 0) {
> @@ -724,6 +725,7 @@ static inline void esdhc_pltfm_set_clock(struct
> sdhci_host *host,
>                         pre_div = 2;
>         }
>  
> +       spin_lock_irqsave(&host->lock, flags);
>         temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
>         temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN |
> ESDHC_CLOCK_PEREN
>                 | ESDHC_CLOCK_MASK);
> @@ -754,6 +756,7 @@ static inline void esdhc_pltfm_set_clock(struct
> sdhci_host *host,
>                 writel(val | ESDHC_VENDOR_SPEC_FRC_SDCLK_ON,
>                 host->ioaddr + ESDHC_VENDOR_SPEC);
>         }
> +       spin_unlock_irqrestore(&host->lock, flags);

The bits ESDHC_CLOCK_IPGEN, ESDHC_CLOCK_HCKEN, ESDHC_CLOCK_PEREN which
are cleared and written in that section are actually mentioned as
"Reserved. Always write as 1." in the reference manual...

--
Stefan

>  
>         mdelay(1);
>  }
> 
> --
> Stefan
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux