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

Jaehoon Chung jh80.chung at samsung.com
Mon Sep 19 08:43:38 CEST 2016


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?

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

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