提交 3e4b0d8b 编写于 作者: M Markos Chandras 提交者: Chris Ball

mmc: dw_mmc: Avoid adding the number of transmitted bytes twice

Previously, it was possible to add either 0 bytes or add nbytes
twice if we broke out of the outer loop and then carry on to the
"done" label. This is now fixed by adding the transferred bytes
right after the pull/pop operation
Signed-off-by: NMarkos Chandras <markos.chandras@imgtec.com>
Acked-by: NJaehoon Chung <jh80.chung@samsung.com>
Acked-by: NSeungwon Jeon <tgih.jun@samsung.com>
Signed-off-by: NChris Ball <cjb@laptop.org>
上级 1fb5f68a
...@@ -1454,7 +1454,7 @@ static void dw_mci_read_data_pio(struct dw_mci *host, bool dto) ...@@ -1454,7 +1454,7 @@ static void dw_mci_read_data_pio(struct dw_mci *host, bool dto)
struct mmc_data *data = host->data; struct mmc_data *data = host->data;
int shift = host->data_shift; int shift = host->data_shift;
u32 status; u32 status;
unsigned int nbytes = 0, len; unsigned int len;
unsigned int remain, fcnt; unsigned int remain, fcnt;
do { do {
...@@ -1473,8 +1473,8 @@ static void dw_mci_read_data_pio(struct dw_mci *host, bool dto) ...@@ -1473,8 +1473,8 @@ static void dw_mci_read_data_pio(struct dw_mci *host, bool dto)
if (!len) if (!len)
break; break;
dw_mci_pull_data(host, (void *)(buf + offset), len); dw_mci_pull_data(host, (void *)(buf + offset), len);
data->bytes_xfered += len;
offset += len; offset += len;
nbytes += len;
remain -= len; remain -= len;
} while (remain); } while (remain);
...@@ -1484,7 +1484,6 @@ static void dw_mci_read_data_pio(struct dw_mci *host, bool dto) ...@@ -1484,7 +1484,6 @@ static void dw_mci_read_data_pio(struct dw_mci *host, bool dto)
/* if the RXDR is ready read again */ /* if the RXDR is ready read again */
} while ((status & SDMMC_INT_RXDR) || } while ((status & SDMMC_INT_RXDR) ||
(dto && SDMMC_GET_FCNT(mci_readl(host, STATUS)))); (dto && SDMMC_GET_FCNT(mci_readl(host, STATUS))));
data->bytes_xfered += nbytes;
if (!remain) { if (!remain) {
if (!sg_miter_next(sg_miter)) if (!sg_miter_next(sg_miter))
...@@ -1495,7 +1494,6 @@ static void dw_mci_read_data_pio(struct dw_mci *host, bool dto) ...@@ -1495,7 +1494,6 @@ static void dw_mci_read_data_pio(struct dw_mci *host, bool dto)
return; return;
done: done:
data->bytes_xfered += nbytes;
sg_miter_stop(sg_miter); sg_miter_stop(sg_miter);
host->sg = NULL; host->sg = NULL;
smp_wmb(); smp_wmb();
...@@ -1510,7 +1508,7 @@ static void dw_mci_write_data_pio(struct dw_mci *host) ...@@ -1510,7 +1508,7 @@ static void dw_mci_write_data_pio(struct dw_mci *host)
struct mmc_data *data = host->data; struct mmc_data *data = host->data;
int shift = host->data_shift; int shift = host->data_shift;
u32 status; u32 status;
unsigned int nbytes = 0, len; unsigned int len;
unsigned int fifo_depth = host->fifo_depth; unsigned int fifo_depth = host->fifo_depth;
unsigned int remain, fcnt; unsigned int remain, fcnt;
...@@ -1531,8 +1529,8 @@ static void dw_mci_write_data_pio(struct dw_mci *host) ...@@ -1531,8 +1529,8 @@ static void dw_mci_write_data_pio(struct dw_mci *host)
if (!len) if (!len)
break; break;
host->push_data(host, (void *)(buf + offset), len); host->push_data(host, (void *)(buf + offset), len);
data->bytes_xfered += len;
offset += len; offset += len;
nbytes += len;
remain -= len; remain -= len;
} while (remain); } while (remain);
...@@ -1540,7 +1538,6 @@ static void dw_mci_write_data_pio(struct dw_mci *host) ...@@ -1540,7 +1538,6 @@ static void dw_mci_write_data_pio(struct dw_mci *host)
status = mci_readl(host, MINTSTS); status = mci_readl(host, MINTSTS);
mci_writel(host, RINTSTS, SDMMC_INT_TXDR); mci_writel(host, RINTSTS, SDMMC_INT_TXDR);
} while (status & SDMMC_INT_TXDR); /* if TXDR write again */ } while (status & SDMMC_INT_TXDR); /* if TXDR write again */
data->bytes_xfered += nbytes;
if (!remain) { if (!remain) {
if (!sg_miter_next(sg_miter)) if (!sg_miter_next(sg_miter))
...@@ -1551,7 +1548,6 @@ static void dw_mci_write_data_pio(struct dw_mci *host) ...@@ -1551,7 +1548,6 @@ static void dw_mci_write_data_pio(struct dw_mci *host)
return; return;
done: done:
data->bytes_xfered += nbytes;
sg_miter_stop(sg_miter); sg_miter_stop(sg_miter);
host->sg = NULL; host->sg = NULL;
smp_wmb(); smp_wmb();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册