lkml.org 
[lkml]   [2010]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/2] USB: Add driver hooks for (un)?map_urb_for_dma
    Date
    These are useful in case your device has quirks involving what memory
    is and is not DMAable.

    Signed-off-by: Robert Morell <rmorell@nvidia.com>
    Reviewed-by: Scott Williams <scwilliams@nvidia.com>
    Reviewed-by: Janne Hellsten <jhellsten@nvidia.com>
    ---
    drivers/usb/core/hcd.c | 19 ++++++++++++++++++-
    include/linux/usb/hcd.h | 8 ++++++++
    2 files changed, 26 insertions(+), 1 deletions(-)

    diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
    index 5cca00a..84fee0f 100644
    --- a/drivers/usb/core/hcd.c
    +++ b/drivers/usb/core/hcd.c
    @@ -1265,6 +1265,14 @@ static void hcd_free_coherent(struct usb_bus *bus, dma_addr_t *dma_handle,

    static void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
    {
    + if (hcd->driver->unmap_urb_for_dma)
    + hcd->driver->unmap_urb_for_dma(hcd, urb);
    + else
    + usb_hcd_unmap_urb_for_dma(hcd, urb);
    +}
    +
    +void usb_hcd_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
    +{
    enum dma_data_direction dir;

    if (urb->transfer_flags & URB_SETUP_MAP_SINGLE)
    @@ -1311,6 +1319,15 @@ static void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
    static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
    gfp_t mem_flags)
    {
    + if (hcd->driver->map_urb_for_dma)
    + return hcd->driver->map_urb_for_dma(hcd, urb, mem_flags);
    + else
    + return usb_hcd_map_urb_for_dma(hcd, urb, mem_flags);
    +}
    +
    +int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
    + gfp_t mem_flags)
    +{
    enum dma_data_direction dir;
    int ret = 0;

    @@ -1400,7 +1417,7 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
    }
    if (ret && (urb->transfer_flags & (URB_SETUP_MAP_SINGLE |
    URB_SETUP_MAP_LOCAL)))
    - unmap_urb_for_dma(hcd, urb);
    + usb_hcd_unmap_urb_for_dma(hcd, urb);
    }
    return ret;
    }
    diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
    index 3b571f1..8aaf687 100644
    --- a/include/linux/usb/hcd.h
    +++ b/include/linux/usb/hcd.h
    @@ -233,6 +233,11 @@ struct hc_driver {
    int (*urb_dequeue)(struct usb_hcd *hcd,
    struct urb *urb, int status);

    + /* dma support */
    + int (*map_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb,
    + gfp_t mem_flags);
    + void (*unmap_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb);
    +
    /* hw synch, freeing endpoint resources that urb_dequeue can't */
    void (*endpoint_disable)(struct usb_hcd *hcd,
    struct usb_host_endpoint *ep);
    @@ -327,6 +332,9 @@ extern void usb_hcd_unlink_urb_from_ep(struct usb_hcd *hcd, struct urb *urb);

    extern int usb_hcd_submit_urb(struct urb *urb, gfp_t mem_flags);
    extern int usb_hcd_unlink_urb(struct urb *urb, int status);
    +extern int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
    + gfp_t mem_flags);
    +extern void usb_hcd_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb);
    extern void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb,
    int status);
    extern void usb_hcd_flush_endpoint(struct usb_device *udev,
    --
    1.7.2.2


    \
     
     \ /
      Last update: 2010-12-17 23:03    [W:0.026 / U:0.508 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site