|
@@ -69,12 +69,13 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
|
|
|
unsigned int datactrl, timeout, irqmask;
|
|
|
unsigned long long clks;
|
|
|
void __iomem *base;
|
|
|
+ int blksz_bits;
|
|
|
|
|
|
DBG(host, "blksz %04x blks %04x flags %08x\n",
|
|
|
- 1 << data->blksz_bits, data->blocks, data->flags);
|
|
|
+ data->blksz, data->blocks, data->flags);
|
|
|
|
|
|
host->data = data;
|
|
|
- host->size = data->blocks << data->blksz_bits;
|
|
|
+ host->size = data->blksz;
|
|
|
host->data_xfered = 0;
|
|
|
|
|
|
mmci_init_sg(host, data);
|
|
@@ -88,7 +89,10 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
|
|
|
writel(timeout, base + MMCIDATATIMER);
|
|
|
writel(host->size, base + MMCIDATALENGTH);
|
|
|
|
|
|
- datactrl = MCI_DPSM_ENABLE | data->blksz_bits << 4;
|
|
|
+ blksz_bits = ffs(data->blksz) - 1;
|
|
|
+ BUG_ON(1 << blksz_bits != data->blksz);
|
|
|
+
|
|
|
+ datactrl = MCI_DPSM_ENABLE | blksz_bits << 4;
|
|
|
if (data->flags & MMC_DATA_READ) {
|
|
|
datactrl |= MCI_DPSM_DIRECTION;
|
|
|
irqmask = MCI_RXFIFOHALFFULLMASK;
|
|
@@ -145,7 +149,7 @@ mmci_data_irq(struct mmci_host *host, struct mmc_data *data,
|
|
|
unsigned int status)
|
|
|
{
|
|
|
if (status & MCI_DATABLOCKEND) {
|
|
|
- host->data_xfered += 1 << data->blksz_bits;
|
|
|
+ host->data_xfered += data->blksz;
|
|
|
}
|
|
|
if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_TXUNDERRUN|MCI_RXOVERRUN)) {
|
|
|
if (status & MCI_DATACRCFAIL)
|