static int tegra_ehci_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) { int ret; ret = alloc_align_buffer(urb, mem_flags); if (ret) return ret; ret = usb_hcd_map_urb_for_dma(hcd, urb, mem_flags); /* Control packets over dma */ if (urb->setup_dma) dma_sync_single_for_device(hcd->self.controller, urb->setup_dma, sizeof(struct usb_ctrlrequest), DMA_TO_DEVICE); /* urb buffers over dma */ if (urb->transfer_dma) { enum dma_data_direction dir; dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; dma_sync_single_for_device(hcd->self.controller, urb->transfer_dma, urb->transfer_buffer_length, dir); } if (ret) free_align_buffer(urb); return ret; }
static void tegra_ehci_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb) { usb_hcd_unmap_urb_for_dma(hcd, urb); free_align_buffer(urb); if (urb->transfer_dma) { enum dma_data_direction dir; dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; if (dir == DMA_FROM_DEVICE) dma_sync_single_for_cpu(hcd->self.controller, urb->transfer_dma, urb->transfer_buffer_length, DMA_FROM_DEVICE); } }
static int tegra_ehci_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) { int ret; ret = alloc_align_buffer(urb, mem_flags, hcd); if (ret) return ret; ret = usb_hcd_map_urb_for_dma(hcd, urb, mem_flags); if (ret) free_align_buffer(urb, hcd); return ret; }
static void tegra_ehci_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb) { usb_hcd_unmap_urb_for_dma(hcd, urb); free_align_buffer(urb, hcd); }