mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-10 22:40:54 -04:00
mmc: sdhci: avoid walking SG list for writes
If we are writing data to the card, there is no point in walking the scatterlist to find out if there are any unaligned entries; this is a needless waste of CPU cycles. Avoid this by checking for a non-read tranfer first. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Tested-by: Gregory CLEMENT <gregory.clement@free-electrons.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
acc3ad1383
commit
47fa961340
1 changed files with 22 additions and 20 deletions
|
|
@ -559,37 +559,39 @@ static void sdhci_adma_table_post(struct sdhci_host *host,
|
|||
void *align;
|
||||
char *buffer;
|
||||
unsigned long flags;
|
||||
bool has_unaligned;
|
||||
|
||||
if (data->flags & MMC_DATA_READ)
|
||||
direction = DMA_FROM_DEVICE;
|
||||
else
|
||||
direction = DMA_TO_DEVICE;
|
||||
|
||||
/* Do a quick scan of the SG list for any unaligned mappings */
|
||||
has_unaligned = false;
|
||||
for_each_sg(data->sg, sg, host->sg_count, i)
|
||||
if (sg_dma_address(sg) & SDHCI_ADMA2_MASK) {
|
||||
has_unaligned = true;
|
||||
break;
|
||||
}
|
||||
if (data->flags & MMC_DATA_READ) {
|
||||
bool has_unaligned = false;
|
||||
|
||||
if (has_unaligned && data->flags & MMC_DATA_READ) {
|
||||
dma_sync_sg_for_cpu(mmc_dev(host->mmc), data->sg,
|
||||
data->sg_len, direction);
|
||||
|
||||
align = host->align_buffer;
|
||||
|
||||
for_each_sg(data->sg, sg, host->sg_count, i) {
|
||||
/* Do a quick scan of the SG list for any unaligned mappings */
|
||||
for_each_sg(data->sg, sg, host->sg_count, i)
|
||||
if (sg_dma_address(sg) & SDHCI_ADMA2_MASK) {
|
||||
size = SDHCI_ADMA2_ALIGN -
|
||||
(sg_dma_address(sg) & SDHCI_ADMA2_MASK);
|
||||
has_unaligned = true;
|
||||
break;
|
||||
}
|
||||
|
||||
buffer = sdhci_kmap_atomic(sg, &flags);
|
||||
memcpy(buffer, align, size);
|
||||
sdhci_kunmap_atomic(buffer, &flags);
|
||||
if (has_unaligned) {
|
||||
dma_sync_sg_for_cpu(mmc_dev(host->mmc), data->sg,
|
||||
data->sg_len, direction);
|
||||
|
||||
align += SDHCI_ADMA2_ALIGN;
|
||||
align = host->align_buffer;
|
||||
|
||||
for_each_sg(data->sg, sg, host->sg_count, i) {
|
||||
if (sg_dma_address(sg) & SDHCI_ADMA2_MASK) {
|
||||
size = SDHCI_ADMA2_ALIGN -
|
||||
(sg_dma_address(sg) & SDHCI_ADMA2_MASK);
|
||||
|
||||
buffer = sdhci_kmap_atomic(sg, &flags);
|
||||
memcpy(buffer, align, size);
|
||||
sdhci_kunmap_atomic(buffer, &flags);
|
||||
|
||||
align += SDHCI_ADMA2_ALIGN;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue