]> Pileus Git - ~andy/linux/blobdiff - drivers/usb/core/hcd.c
Merge 2.6.38-rc5 into usb-next
[~andy/linux] / drivers / usb / core / hcd.c
index e935f71d7a346a71b05872030103fac93cbb9f8b..24765fd6cf127bd520a2cdf0f323d82bdbd952c3 100644 (file)
@@ -1262,7 +1262,7 @@ static void hcd_free_coherent(struct usb_bus *bus, dma_addr_t *dma_handle,
        *dma_handle = 0;
 }
 
-void unmap_urb_setup_for_dma(struct usb_hcd *hcd, struct urb *urb)
+void usb_hcd_unmap_urb_setup_for_dma(struct usb_hcd *hcd, struct urb *urb)
 {
        if (urb->transfer_flags & URB_SETUP_MAP_SINGLE)
                dma_unmap_single(hcd->self.controller,
@@ -1279,13 +1279,21 @@ void unmap_urb_setup_for_dma(struct usb_hcd *hcd, struct urb *urb)
        /* Make it safe to call this routine more than once */
        urb->transfer_flags &= ~(URB_SETUP_MAP_SINGLE | URB_SETUP_MAP_LOCAL);
 }
-EXPORT_SYMBOL_GPL(unmap_urb_setup_for_dma);
+EXPORT_SYMBOL_GPL(usb_hcd_unmap_urb_setup_for_dma);
 
-void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
+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;
 
-       unmap_urb_setup_for_dma(hcd, urb);
+       usb_hcd_unmap_urb_setup_for_dma(hcd, urb);
 
        dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
        if (urb->transfer_flags & URB_DMA_MAP_SG)
@@ -1314,10 +1322,19 @@ void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
        urb->transfer_flags &= ~(URB_DMA_MAP_SG | URB_DMA_MAP_PAGE |
                        URB_DMA_MAP_SINGLE | URB_MAP_LOCAL);
 }
-EXPORT_SYMBOL_GPL(unmap_urb_for_dma);
+EXPORT_SYMBOL_GPL(usb_hcd_unmap_urb_for_dma);
 
 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;
@@ -1410,10 +1427,11 @@ 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;
 }
+EXPORT_SYMBOL_GPL(usb_hcd_map_urb_for_dma);
 
 /*-------------------------------------------------------------------------*/