[U-Boot] [PATCH 1/2] mmc: dw_mmc: transfer proper bytes to FIFO

The former implement, dw_mmc will push and pop the redundant data to FIFO, we should transfer it according to the real size.
Signed-off-by: Ziyuan Xu xzy.xu@rock-chips.com ---
drivers/mmc/dw_mmc.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c index 2cf7bae..38d4a64 100644 --- a/drivers/mmc/dw_mmc.c +++ b/drivers/mmc/dw_mmc.c @@ -126,6 +126,7 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data) len = dwmci_readl(host, DWMCI_STATUS); len = (len >> DWMCI_FIFO_SHIFT) & DWMCI_FIFO_MASK; + len = min(size, len); for (i = 0; i < len; i++) *buf++ = dwmci_readl(host, DWMCI_DATA); @@ -139,6 +140,7 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data) len = fifo_depth - ((len >> DWMCI_FIFO_SHIFT) & DWMCI_FIFO_MASK); + len = min(size, len); for (i = 0; i < len; i++) dwmci_writel(host, DWMCI_DATA, *buf++);

This patch fixes data starvation by host timeout(HTO) error interrupt which occurred under FIFO mode transfer on rk3036 board.
The former implement, the actual bytes were transmitted may be less than should be. The size will still subtract value of len in case of there is no receive/transmit FIFO data request interrupt.
Signed-off-by: Ziyuan Xu xzy.xu@rock-chips.com ---
drivers/mmc/dw_mmc.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c index 38d4a64..41b7035 100644 --- a/drivers/mmc/dw_mmc.c +++ b/drivers/mmc/dw_mmc.c @@ -120,6 +120,7 @@ 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)) {

Hi Ziyuan,
On 07/28/2016 11:25 AM, Ziyuan Xu wrote:
This patch fixes data starvation by host timeout(HTO) error interrupt which occurred under FIFO mode transfer on rk3036 board.
The former implement, the actual bytes were transmitted may be less than should be. The size will still subtract value of len in case of there is no receive/transmit FIFO data request interrupt.
Looks good to me.
Acked-by: Jaehoon Chung jh80.chung@samsung.com
Best Regards, Jaehoon Chung
Signed-off-by: Ziyuan Xu xzy.xu@rock-chips.com
drivers/mmc/dw_mmc.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c index 38d4a64..41b7035 100644 --- a/drivers/mmc/dw_mmc.c +++ b/drivers/mmc/dw_mmc.c @@ -120,6 +120,7 @@ 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)) {

On 27 July 2016 at 20:25, Ziyuan Xu xzy.xu@rock-chips.com wrote:
This patch fixes data starvation by host timeout(HTO) error interrupt which occurred under FIFO mode transfer on rk3036 board.
The former implement, the actual bytes were transmitted may be less than should be. The size will still subtract value of len in case of there is no receive/transmit FIFO data request interrupt.
Signed-off-by: Ziyuan Xu xzy.xu@rock-chips.com
drivers/mmc/dw_mmc.c | 1 + 1 file changed, 1 insertion(+)
Reviewed-by: Simon Glass sjg@chromium.org

On 07/28/2016 11:25 AM, Xu Ziyuan wrote:
This patch fixes data starvation by host timeout(HTO) error interrupt which occurred under FIFO mode transfer on rk3036 board.
The former implement, the actual bytes were transmitted may be less than should be. The size will still subtract value of len in case of there is no receive/transmit FIFO data request interrupt.
Signed-off-by: Ziyuan Xu xzy.xu@rock-chips.com Acked-by: Jaehoon Chung jh80.chung@samsung.com Reviewed-by: Simon Glass sjg@chromium.org
Applied on u-boot-mmc. Thanks!
Best Regards, Jaehoon Chung
drivers/mmc/dw_mmc.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c index 38d4a64..41b7035 100644 --- a/drivers/mmc/dw_mmc.c +++ b/drivers/mmc/dw_mmc.c @@ -120,6 +120,7 @@ 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)) {

Hi Ziyuan,
On 07/28/2016 11:25 AM, Ziyuan Xu wrote:
The former implement, dw_mmc will push and pop the redundant data to FIFO, we should transfer it according to the real size.
Looks good to me.
Acked-by: Jaehoon Chung jh80.chung@samsung.com
Best Regards, Jaehoon Chung
Signed-off-by: Ziyuan Xu xzy.xu@rock-chips.com
drivers/mmc/dw_mmc.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c index 2cf7bae..38d4a64 100644 --- a/drivers/mmc/dw_mmc.c +++ b/drivers/mmc/dw_mmc.c @@ -126,6 +126,7 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data) len = dwmci_readl(host, DWMCI_STATUS); len = (len >> DWMCI_FIFO_SHIFT) & DWMCI_FIFO_MASK;
len = min(size, len); for (i = 0; i < len; i++) *buf++ = dwmci_readl(host, DWMCI_DATA);
@@ -139,6 +140,7 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data) len = fifo_depth - ((len >> DWMCI_FIFO_SHIFT) & DWMCI_FIFO_MASK);
len = min(size, len); for (i = 0; i < len; i++) dwmci_writel(host, DWMCI_DATA, *buf++);

On 27 July 2016 at 20:25, Ziyuan Xu xzy.xu@rock-chips.com wrote:
The former implement, dw_mmc will push and pop the redundant data to FIFO, we should transfer it according to the real size.
Signed-off-by: Ziyuan Xu xzy.xu@rock-chips.com
drivers/mmc/dw_mmc.c | 2 ++ 1 file changed, 2 insertions(+)
Reviewed-by: Simon Glass sjg@chromium.org

在 2016/7/28 10:25, Ziyuan Xu 写道:
The former implement, dw_mmc will push and pop the redundant data to FIFO, we should transfer it according to the real size.
Bascially I never checked any bootloader code, but I get dw_mmc of uboot to check your patch. Obviously it should be the case you mentioned.
Feel free to add
Reviewed-by: Shawn Lin shawn.lin@rock-chips.com
Signed-off-by: Ziyuan Xu xzy.xu@rock-chips.com
drivers/mmc/dw_mmc.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c index 2cf7bae..38d4a64 100644 --- a/drivers/mmc/dw_mmc.c +++ b/drivers/mmc/dw_mmc.c @@ -126,6 +126,7 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data) len = dwmci_readl(host, DWMCI_STATUS); len = (len >> DWMCI_FIFO_SHIFT) & DWMCI_FIFO_MASK;
len = min(size, len); for (i = 0; i < len; i++) *buf++ = dwmci_readl(host, DWMCI_DATA);
@@ -139,6 +140,7 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data) len = fifo_depth - ((len >> DWMCI_FIFO_SHIFT) & DWMCI_FIFO_MASK);
len = min(size, len); for (i = 0; i < len; i++) dwmci_writel(host, DWMCI_DATA, *buf++);

On 07/28/2016 11:25 AM, Xu Ziyuan wrote:
The former implement, dw_mmc will push and pop the redundant data to FIFO, we should transfer it according to the real size.
Signed-off-by: Ziyuan Xu xzy.xu@rock-chips.com Acked-by: Jaehoon Chung jh80.chung@samsung.com Reviewed-by: Simon Glass sjg@chromium.org Reviewed-by: Shawn Lin shawn.lin@rock-chips.com
Applied on u-boot-mmc. Thanks!
Best Regards, Jaehoon Chung
drivers/mmc/dw_mmc.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c index 2cf7bae..38d4a64 100644 --- a/drivers/mmc/dw_mmc.c +++ b/drivers/mmc/dw_mmc.c @@ -126,6 +126,7 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data) len = dwmci_readl(host, DWMCI_STATUS); len = (len >> DWMCI_FIFO_SHIFT) & DWMCI_FIFO_MASK;
len = min(size, len); for (i = 0; i < len; i++) *buf++ = dwmci_readl(host, DWMCI_DATA);
@@ -139,6 +140,7 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data) len = fifo_depth - ((len >> DWMCI_FIFO_SHIFT) & DWMCI_FIFO_MASK);
len = min(size, len); for (i = 0; i < len; i++) dwmci_writel(host, DWMCI_DATA, *buf++);
participants (4)
-
Jaehoon Chung
-
Shawn Lin
-
Simon Glass
-
Ziyuan Xu