[...] > @@ -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