[U-Boot] [PATCH] mmc: dw_mmc: push/pop all FIFO data if any data request

Ziyuan Xu xzy.xu at rock-chips.com
Mon Sep 19 08:48:50 CEST 2016


hi Jaehoon,


On 2016年09月19日 14:43, Jaehoon Chung wrote:
> Hi Ziyuan,
>
> On 09/19/2016 11:16 AM, Ziyuan Xu wrote:
>> From: "jacob2.chen" <jacob2.chen at rock-chips.com>
> As I remembered, I mentioned that changed to real name, not mail ID.
> likes "Jacob Chen <jacob2,chen at rock-chips.com>"
>
> If it's right and you're ok, i will change this when i apply this patch.
> How about?

Yup, it's ok.

>
> And Next Time, could you add the changelog for Patch Version, plz? :)

I'm sorry about it, I'll bear it in mind, thanks!

>
> Best Regards,
> Jaehoon Chung
>
>> 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, so is TX.
>>
>> It's responsibility of driver to read remaining bytes on seeing DTO
>> interrupt.
>>
>> Signed-off-by: jacob2.chen <jacob2.chen at rock-chips.com>
>> Signed-off-by: Ziyuan Xu <xzy.xu at rock-chips.com>
>> ---
>>
>>   drivers/mmc/dw_mmc.c | 23 ++++++++++++-----------
>>   1 file changed, 12 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c
>> index afc674d..074f86c 100644
>> --- a/drivers/mmc/dw_mmc.c
>> +++ b/drivers/mmc/dw_mmc.c
>> @@ -120,9 +120,9 @@ 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;
>> @@ -130,12 +130,13 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data)
>>   					for (i = 0; i < len; i++)
>>   						*buf++ =
>>   						dwmci_readl(host, DWMCI_DATA);
>> -					dwmci_writel(host, DWMCI_RINTSTS,
>> -						     DWMCI_INTMSK_RXDR);
>> +					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)) {
>> +				while (size) {
>>   					len = dwmci_readl(host, DWMCI_STATUS);
>>   					len = fifo_depth - ((len >>
>>   						   DWMCI_FIFO_SHIFT) &
>> @@ -144,11 +145,11 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data)
>>   					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. */
>>
>
>
>




More information about the U-Boot mailing list