lkml.org 
[lkml]   [2010]   [Jun]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[BUG][PATCH]staging/dt3155v4l: correcting a pointer mismatch bug and cleanups
    Date
    Hi Greg,

    The third argument of dma_alloc_coherent() is of type dma_addr_t and is defined
    as u64 for x86_64, while the member 'device_base' of struct dma_coherent_mem is
    defined as u32.

    While at it, clean up the code. Now if dev->dma_mem != NULL all the fields/members
    are already properly initialized.

    Please apply.

    Thanks

    Marin Mitov

    Signed-off-by: Marin Mitov <mitov@issp.bas.bg>

    ===========================================================================
    --- a/drivers/staging/dt3155v4l/dt3155v4l.c 2010-06-06 08:52:06.000000000 +0300
    +++ b/drivers/staging/dt3155v4l/dt3155v4l.c 2010-06-06 12:05:32.000000000 +0300
    @@ -1008,6 +1008,8 @@
    static int __devinit
    dt3155_alloc_coherent(struct device *dev, size_t size, int flags)
    {
    + struct dma_coherent_mem *mem;
    + dma_addr_t dev_base;
    int pages = size >> PAGE_SHIFT;
    int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long);

    @@ -1018,25 +1020,28 @@
    if (dev->dma_mem)
    goto out;

    - dev->dma_mem = kzalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);
    - if (!dev->dma_mem)
    + mem = kzalloc(sizeof(*mem), GFP_KERNEL);
    + if (!mem)
    goto out;
    - dev->dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
    - if (!dev->dma_mem->bitmap)
    + mem->virt_base = dma_alloc_coherent(dev, size, &dev_base,
    + DT3155_COH_FLAGS);
    + if (!mem->virt_base)
    + goto err_alloc_coherent;
    + mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
    + if (!mem->bitmap)
    goto err_bitmap;

    - dev->dma_mem->virt_base = dma_alloc_coherent(dev, size,
    - &dev->dma_mem->device_base, DT3155_COH_FLAGS);
    - if (!dev->dma_mem->virt_base)
    - goto err_coherent;
    - dev->dma_mem->size = pages;
    - dev->dma_mem->flags = flags;
    + /* coherent_dma_mask is already set to 32 bits */
    + mem->device_base = dev_base;
    + mem->size = pages;
    + mem->flags = flags;
    + dev->dma_mem = mem;
    return DMA_MEMORY_MAP;

    -err_coherent:
    - kfree(dev->dma_mem->bitmap);
    err_bitmap:
    - kfree(dev->dma_mem);
    + dma_free_coherent(dev, size, mem->virt_base, dev_base);
    +err_alloc_coherent:
    + kfree(mem);
    out:
    return 0;
    }

    \
     
     \ /
      Last update: 2010-06-06 13:21    [W:0.023 / U:29.812 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site