[...]
@@ -3713,6 +3751,43 @@ int sdhci_setup_host(struct sdhci_host *host) */ mmc->max_blk_count = (host->quirks & SDHCI_QUIRK_NO_MULTIBLOCK) ? 1 : 65535;
if (mmc->max_segs == 1) {unsigned int max_blocks;unsigned int max_seg_size;max_seg_size = mmc->max_req_size;max_blocks = max_seg_size / 512;dev_info(mmc->parent, "host only supports SDMA, activate bounce buffer\n");/** When we just support one segment, we can get significant speedups* by the help of a bounce buffer to group scattered reads/writes* together.** TODO: is this too big? Stealing too much memory? The old bounce* buffer is max 64K. This should be the 512K that SDMA can handle* if I read the code above right. Anyways let's try this.* FIXME: use devm_**/host->bounce_buffer = dma_alloc_coherent(mmc->parent, max_seg_size,&host->bounce_addr, GFP_KERNEL);
Why do you need dma_alloc_coherent() - allocated bounce buffer? Isn't a regular kmalloc-ed buffer fine as a bounce buffer?
I am worried, also according to your above comment, that it's not always going to work to request a large buffer like this, especially with dma_alloc_coherent().
if (!host->bounce_buffer) {dev_err(mmc->parent,"failed to allocate %u bytes for bounce buffer\n",max_seg_size);return -ENOMEM;
Why not fall back to use the max_segs = 1 here. It may be slow, as reported, but it works.
}host->bounce_buffer_size = max_seg_size;/* Lie about this since we're bouncing */mmc->max_segs = max_blocks;mmc->max_seg_size = max_seg_size;dev_info(mmc->parent,"bounce buffer: bounce up to %u segments into one, max segment size %u bytes\n",max_blocks, max_seg_size);}return 0;
[...]
Kind regards Uffe