lkml.org 
[lkml]   [2005]   [Sep]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [MMC] wbsd: use dma_alloc insted of kmalloc
    Date
    x86_64 doesn't seem to like being passed pointers allocated using
    kmalloc to the DMA mapping API. Change allocation to use
    dma_alloc_coherent() instead.

    Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
    ---

    drivers/mmc/wbsd.c | 26 +++++++++++---------------
    1 files changed, 11 insertions(+), 15 deletions(-)

    diff --git a/drivers/mmc/wbsd.c b/drivers/mmc/wbsd.c
    --- a/drivers/mmc/wbsd.c
    +++ b/drivers/mmc/wbsd.c
    @@ -1543,18 +1543,17 @@ static void __devinit wbsd_request_dma(s
    * We need to allocate a special buffer in
    * order for ISA to be able to DMA to it.
    */
    - host->dma_buffer = kmalloc(WBSD_DMA_SIZE,
    +
    + mmc_dev(host->mmc)->coherent_dma_mask = 0xffffff;
    + mmc_dev(host->mmc)->dma_mask = &mmc_dev(host->mmc)->coherent_dma_mask;
    +
    + host->dma_buffer = dma_alloc_coherent(mmc_dev(host->mmc),
    + WBSD_DMA_SIZE, &host->dma_addr,
    GFP_NOIO | GFP_DMA | __GFP_REPEAT | __GFP_NOWARN);
    if (!host->dma_buffer)
    goto free;

    /*
    - * Translate the address to a physical address.
    - */
    - host->dma_addr = dma_map_single(host->mmc->dev, host->dma_buffer,
    - WBSD_DMA_SIZE, DMA_BIDIRECTIONAL);
    -
    - /*
    * ISA DMA must be aligned on a 64k basis.
    */
    if ((host->dma_addr & 0xffff) != 0)
    @@ -1575,12 +1574,11 @@ kfree:
    */
    BUG_ON(1);

    - dma_unmap_single(host->mmc->dev, host->dma_addr, WBSD_DMA_SIZE,
    - DMA_BIDIRECTIONAL);
    - host->dma_addr = (dma_addr_t)NULL;
    + dma_free_coherent(mmc_dev(host->mmc), WBSD_DMA_SIZE,
    + host->dma_buffer, host->dma_addr);

    - kfree(host->dma_buffer);
    host->dma_buffer = NULL;
    + host->dma_addr = (dma_addr_t)NULL;

    free:
    free_dma(dma);
    @@ -1592,11 +1590,9 @@ err:

    static void __devexit wbsd_release_dma(struct wbsd_host* host)
    {
    - if (host->dma_addr)
    - dma_unmap_single(host->mmc->dev, host->dma_addr, WBSD_DMA_SIZE,
    - DMA_BIDIRECTIONAL);
    if (host->dma_buffer)
    - kfree(host->dma_buffer);
    + dma_free_coherent(mmc_dev(host->mmc), WBSD_DMA_SIZE,
    + host->dma_buffer, host->dma_addr);
    if (host->dma >= 0)
    free_dma(host->dma);

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-09-25 21:18    [W:0.024 / U:156.352 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site