On 09/07/2016 03:14 PM, Ziyuan Xu wrote:
> hi Jaehoon,
> 
> 
> On 2016年08月30日 17:54, Jaehoon Chung wrote:
>> Hi Jacob,
>>
>> On 08/30/2016 02:26 AM, Jacob Chen wrote:
>>> From: "jacob2.chen" <jacob2.c...@rock-chips.com>
>>>
>>> The former implement have a bug.
>>> It will cause wrong data reading sometimes.
>> Could you explain what bug is there?
>>>
>>> Signed-off-by: jacob2.chen <jacob2.c...@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?
> 
> I just hit this bug on rk3036 board.

This changing is just an indentation, isn't?
It looks like unnecessary modifying.

> 
> When DTO interrupt occurred, there are any remaining data still in FIFO due 
> to RX FIFO threshold is larger than remaining data. It also causes that dwmmc 
> didn't trigger RXDR interrupt.
> It's responsibility of driver to read remaining bytes on seeing DTO 
> interrupt. So we need rework dwmci_data_transfer w/ pio mode.

Sure, your bug is possible to occur..but my mean is that modified 
DWMCI_FIFO_MASK isn't related with your entire bug.

Best Regards,
Jaehoon Chung

> 
>>
>>>                       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.
>>
>>> +                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@lists.denx.de
>> http://lists.denx.de/mailman/listinfo/u-boot
>>
>>
>>
> 
> 
> 
> 
> 

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to