]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
tegra: usb: host: dma buffer sync while mapping
authorVinayak Pane <vpane@nvidia.com>
Fri, 23 Mar 2012 23:52:56 +0000 (16:52 -0700)
committerDan Willemsen <dwillemsen@nvidia.com>
Sat, 14 Sep 2013 08:15:12 +0000 (01:15 -0700)
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>
Rebase-Id: R748429845b96ade350ed668487cf91c67ef8512d

drivers/usb/host/ehci-tegra.c

index aa8f2d6b82e31d1145be615df5e598c87fabc488..317646cb7e7caca6fca086b5e0637fa78007f286 100644 (file)
@@ -640,6 +640,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);
 
@@ -658,6 +674,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);
 }