|
@@ -178,6 +178,7 @@ struct atmel_mci {
|
|
|
void __iomem *regs;
|
|
|
|
|
|
struct scatterlist *sg;
|
|
|
+ unsigned int sg_len;
|
|
|
unsigned int pio_offset;
|
|
|
unsigned int *buffer;
|
|
|
unsigned int buf_size;
|
|
@@ -892,6 +893,7 @@ static u32 atmci_prepare_data(struct atmel_mci *host, struct mmc_data *data)
|
|
|
data->error = -EINPROGRESS;
|
|
|
|
|
|
host->sg = data->sg;
|
|
|
+ host->sg_len = data->sg_len;
|
|
|
host->data = data;
|
|
|
host->data_chan = NULL;
|
|
|
|
|
@@ -1826,7 +1828,8 @@ static void atmci_read_data_pio(struct atmel_mci *host)
|
|
|
if (offset == sg->length) {
|
|
|
flush_dcache_page(sg_page(sg));
|
|
|
host->sg = sg = sg_next(sg);
|
|
|
- if (!sg)
|
|
|
+ host->sg_len--;
|
|
|
+ if (!sg || !host->sg_len)
|
|
|
goto done;
|
|
|
|
|
|
offset = 0;
|
|
@@ -1839,7 +1842,8 @@ static void atmci_read_data_pio(struct atmel_mci *host)
|
|
|
|
|
|
flush_dcache_page(sg_page(sg));
|
|
|
host->sg = sg = sg_next(sg);
|
|
|
- if (!sg)
|
|
|
+ host->sg_len--;
|
|
|
+ if (!sg || !host->sg_len)
|
|
|
goto done;
|
|
|
|
|
|
offset = 4 - remaining;
|
|
@@ -1890,7 +1894,8 @@ static void atmci_write_data_pio(struct atmel_mci *host)
|
|
|
nbytes += 4;
|
|
|
if (offset == sg->length) {
|
|
|
host->sg = sg = sg_next(sg);
|
|
|
- if (!sg)
|
|
|
+ host->sg_len--;
|
|
|
+ if (!sg || !host->sg_len)
|
|
|
goto done;
|
|
|
|
|
|
offset = 0;
|
|
@@ -1904,7 +1909,8 @@ static void atmci_write_data_pio(struct atmel_mci *host)
|
|
|
nbytes += remaining;
|
|
|
|
|
|
host->sg = sg = sg_next(sg);
|
|
|
- if (!sg) {
|
|
|
+ host->sg_len--;
|
|
|
+ if (!sg || !host->sg_len) {
|
|
|
atmci_writel(host, ATMCI_TDR, value);
|
|
|
goto done;
|
|
|
}
|