diff options
author | Vinayak Pane <vpane@nvidia.com> | 2012-03-23 16:52:56 -0700 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2012-05-18 08:11:12 -0700 |
commit | 77ffea90745ba3cf675cf350dc02cf1e84152a44 (patch) | |
tree | 29e47e7d12570b31f2bc74a6b1eb81aa9ad5758a /drivers/usb/host | |
parent | eb52a35e1cdb95bc426ef1d404bbf166a76111cc (diff) |
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 <vpane@nvidia.com>
Reviewed-on: http://git-master/r/102687
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>
Diffstat (limited to 'drivers/usb/host')
-rw-r--r-- | drivers/usb/host/ehci-tegra.c | 25 |
1 files changed, 25 insertions, 0 deletions
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); } |