Skip to content

Commit

Permalink
[MMC] sdhci: Avoid sdhci DMA boundaries
Browse files Browse the repository at this point in the history
The sdhci controllers will issue an interrupt when a configurable number of
bytes have been transfered using DMA. The purpose is to handle multiple,
scattered memory pages.

Unfortunately, it requires that all transfers are completely aligned to
memory pages, which we cannot guarantee. So we just disable the function.

Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Pierre Ossman authored and Russell King committed Jul 2, 2006
1 parent a406f5a commit bab7696
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 4 deletions.
13 changes: 9 additions & 4 deletions drivers/mmc/sdhci.c
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,9 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
DBG("tsac %d ms nsac %d clk\n",
data->timeout_ns / 1000000, data->timeout_clks);

/* Sanity checks */
BUG_ON(data->blksz * data->blocks > 524288);

/* timeout in us */
target_timeout = data->timeout_ns / 1000 +
data->timeout_clks / host->clock;
Expand Down Expand Up @@ -375,7 +378,9 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
host->remain = host->cur_sg->length;
}

writew(data->blksz, host->ioaddr + SDHCI_BLOCK_SIZE);
/* We do not handle DMA boundaries, so set it to max (512 KiB) */
writew(SDHCI_MAKE_BLKSZ(7, data->blksz),
host->ioaddr + SDHCI_BLOCK_SIZE);
writew(data->blocks, host->ioaddr + SDHCI_BLOCK_COUNT);
}

Expand Down Expand Up @@ -1188,10 +1193,10 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
mmc->max_phys_segs = 16;

/*
* Maximum number of sectors in one transfer. Limited by sector
* count register.
* Maximum number of sectors in one transfer. Limited by DMA boundary
* size (512KiB), which means (512 KiB/512=) 1024 entries.
*/
mmc->max_sectors = 0x3FFF;
mmc->max_sectors = 1024;

/*
* Maximum segment size. Could be one segment with the maximum number
Expand Down
1 change: 1 addition & 0 deletions drivers/mmc/sdhci.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#define SDHCI_DMA_ADDRESS 0x00

#define SDHCI_BLOCK_SIZE 0x04
#define SDHCI_MAKE_BLKSZ(dma, blksz) (((dma & 0x7) << 12) | (blksz & 0xFFF))

#define SDHCI_BLOCK_COUNT 0x06

Expand Down

0 comments on commit bab7696

Please sign in to comment.