From 77ffea90745ba3cf675cf350dc02cf1e84152a44 Mon Sep 17 00:00:00 2001 From: Vinayak Pane Date: Fri, 23 Mar 2012 16:52:56 -0700 Subject: tegra: usb: host: dma buffer sync while mapping Implementing dma_sync_* functions for usb transfer buffers when DMA is being used by ehci-hcd. Bug 953885 Change-Id: Ia772138752e3fe03bb45ee983dffa1b5d8d620f5 Signed-off-by: Vinayak Pane Reviewed-on: http://git-master/r/102687 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Venkat Moganty --- drivers/usb/host/ehci-tegra.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'drivers/usb/host') diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index 5e646b65b3f0..4e7277b2b889 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c @@ -938,6 +938,22 @@ static int tegra_ehci_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, 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_dma_aligned_buffer(urb); @@ -956,6 +972,15 @@ static void tegra_ehci_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb) else if (tegra->phy->instance == 2) readb(IO_ADDRESS(IO_PPCS_PHYS + USB3_PREFETCH_ID)); + 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); + } + usb_hcd_unmap_urb_for_dma(hcd, urb); free_dma_aligned_buffer(urb); } -- cgit v1.2.3