[U-Boot] [PATCH 1/3] mmc: dw_mmc: change the read/write order under fifo mode

Ziyuan Xu xzy.xu at rock-chips.com
Tue Aug 30 16:11:11 CEST 2016



On 2016年08月30日 21:56, 陈豪 wrote:
> Hi jaehoon,
>
>
> 2016-08-30 17:54 GMT+08:00 Jaehoon Chung <jh80.chung at samsung.com>:
>> Hi Jacob,
>>
>> On 08/30/2016 02:26 AM, Jacob Chen wrote:
>>> From: "jacob2.chen" <jacob2.chen at rock-chips.com>
>>>
>>> The former implement have a bug.
>>> It will cause wrong data reading sometimes.
>> Could you explain what bug is there?
> This bug affects data reading and make board fail to boot.
> There will be some errors like,
> "Warning - bad CRC, using the default environmen"

It's not cause by mmc device, U-Boot will read env from media device, 
and do CRC checking.

> "ERROR: Can 't read GPT header"

Which board do you use? RK3288 use DMA-mode for dw_mmc, not pio. I'm 
interest in it, show me more information.

>
> Actually I am not very familiar with the MMC hardware and i don't know
> why former implemen will cause this bug.....
> I just rewrite it according to the driver in kernel.
>
>>>
>>> Signed-off-by: jacob2.chen <jacob2.chen at rock-chips.com>
>> Could you change from jacob2.chen to your name?
>>
>>> ---
>>>
>>>   drivers/mmc/dw_mmc.c | 32 +++++++++++++++++---------------
>>>   1 file changed, 17 insertions(+), 15 deletions(-)
>>>
>>> diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c
>>> index afc674d..f072739 100644
>>> --- a/drivers/mmc/dw_mmc.c
>>> +++ b/drivers/mmc/dw_mmc.c
>>> @@ -120,35 +120,37 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data)
>>>
>>>                if (host->fifo_mode && size) {
>>>                        len = 0;
>>> -                     if (data->flags == MMC_DATA_READ) {
>>> -                             if ((dwmci_readl(host, DWMCI_RINTSTS) &
>>> -                                  DWMCI_INTMSK_RXDR)) {
>>> +                     if (data->flags == MMC_DATA_READ &&
>>> +                         (mask & DWMCI_INTMSK_RXDR)) {
>>> +                             while (size) {
>>>                                        len = dwmci_readl(host, DWMCI_STATUS);
>>>                                        len = (len >> DWMCI_FIFO_SHIFT) &
>>> -                                                 DWMCI_FIFO_MASK;
>>> +                                         DWMCI_FIFO_MASK;
>> this changing is related with bug?
>>
>>>                                        len = min(size, len);
>>>                                        for (i = 0; i < len; i++)
>>>                                                *buf++ =
>>> -                                             dwmci_readl(host, DWMCI_DATA);
>>> -                                     dwmci_writel(host, DWMCI_RINTSTS,
>>> -                                                  DWMCI_INTMSK_RXDR);
>>> +                                                 dwmci_readl(host,
>>> +                                                             DWMCI_DATA);
>>> +                                     size = size > len ? (size - len) : 0;
>>>                                }
>>> -                     } else {
>>> -                             if ((dwmci_readl(host, DWMCI_RINTSTS) &
>>> -                                  DWMCI_INTMSK_TXDR)) {
>>> +                             dwmci_writel(host, DWMCI_RINTSTS,
>>> +                                          DWMCI_INTMSK_RXDR);
>>> +                     } else if (data->flags == MMC_DATA_WRITE &&
>>> +                                (mask & DWMCI_INTMSK_TXDR)) {
>> data->flags == MMC_DATA_WRITE doesn't need..flags are only two..
>> one is MMC_DATA_READ, otherwise it's MMC_DATA_WRITE.
> The reason why i write it so strange is that it warning "Too many
> leading tabs"....
>
>>> +                             while (size) {
>>>                                        len = dwmci_readl(host, DWMCI_STATUS);
>>>                                        len = fifo_depth - ((len >>
>>> -                                                DWMCI_FIFO_SHIFT) &
>>> -                                                DWMCI_FIFO_MASK);
>>> +                                                          DWMCI_FIFO_SHIFT) &
>>> +                                                         DWMCI_FIFO_MASK);
>> ditto.
>>
>> Best Regards,
>> Jaehoon Chung
>>
>>>                                        len = min(size, len);
>>>                                        for (i = 0; i < len; i++)
>>>                                                dwmci_writel(host, DWMCI_DATA,
>>>                                                             *buf++);
>>> -                                     dwmci_writel(host, DWMCI_RINTSTS,
>>> -                                                  DWMCI_INTMSK_TXDR);
>>> +                                     size = size > len ? (size - len) : 0;
>>>                                }
>>> +                             dwmci_writel(host, DWMCI_RINTSTS,
>>> +                                          DWMCI_INTMSK_TXDR);
>>>                        }
>>> -                     size = size > len ? (size - len) : 0;
>>>                }
>>>
>>>                /* Data arrived correctly. */
>>>
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot at lists.denx.de
>> http://lists.denx.de/mailman/listinfo/u-boot
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>
>
>




More information about the U-Boot mailing list