diff options
author | Robert Morell <rmorell@nvidia.com> | 2010-12-15 14:54:13 -0800 |
---|---|---|
committer | Janne Hellsten <jhellsten@nvidia.com> | 2010-12-16 05:19:15 -0800 |
commit | 4bef0b03add4644b2ff3e53acc74366c60dbff87 (patch) | |
tree | 4e829468eb9e4ed86873a13c6e98890ce7fa53af /drivers/usb | |
parent | e4e5dd01b8df98f010c38a8bb74c78c79bfb048a (diff) |
USB: Add driver hooks for (un)?map_urb_for_dma
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>
Change-Id: I60b48ef8efd9f7f78eaba70d708d25b231f23d82
Reviewed-on: http://git-master/r/13381
Reviewed-by: Scott Williams <scwilliams@nvidia.com>
Reviewed-by: Janne Hellsten <jhellsten@nvidia.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/core/hcd.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 5cca00a6d09d..84fee0f5dc34 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; } |