diff options
author | Maulik Mankad <x0082077@ti.com> | 2010-09-24 06:44:06 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-10-22 13:21:53 -0400 |
commit | 496dda704bca1208e08773ba39b29a69536f5381 (patch) | |
tree | 9b6e445625b8c40b526bef271e29df77b1cd8761 /drivers/usb | |
parent | 6587cc0f30cd2f27cf0677e470f18792925a23a4 (diff) |
usb: musb: host: unmap the buffer for PIO data transfers
The USB stack maps the buffer for DMA if the controller supports DMA.
MUSB controller can perform DMA as well as PIO transfers.
The buffer needs to be unmapped before CPU can perform
PIO data transfers.
Export unmap_urb_for_dma() so that drivers can perform
the DMA unmapping in a sane way.
Signed-off-by: Maulik Mankad <x0082077@ti.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/core/hcd.c | 3 | ||||
-rw-r--r-- | drivers/usb/musb/musb_host.c | 5 |
2 files changed, 7 insertions, 1 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 5cca00a6d09d..cb2d894321da 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -1263,7 +1263,7 @@ static void hcd_free_coherent(struct usb_bus *bus, dma_addr_t *dma_handle, | |||
1263 | *dma_handle = 0; | 1263 | *dma_handle = 0; |
1264 | } | 1264 | } |
1265 | 1265 | ||
1266 | static void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb) | 1266 | void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb) |
1267 | { | 1267 | { |
1268 | enum dma_data_direction dir; | 1268 | enum dma_data_direction dir; |
1269 | 1269 | ||
@@ -1307,6 +1307,7 @@ static void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb) | |||
1307 | URB_DMA_MAP_SG | URB_DMA_MAP_PAGE | | 1307 | URB_DMA_MAP_SG | URB_DMA_MAP_PAGE | |
1308 | URB_DMA_MAP_SINGLE | URB_MAP_LOCAL); | 1308 | URB_DMA_MAP_SINGLE | URB_MAP_LOCAL); |
1309 | } | 1309 | } |
1310 | EXPORT_SYMBOL_GPL(unmap_urb_for_dma); | ||
1310 | 1311 | ||
1311 | static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, | 1312 | static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, |
1312 | gfp_t mem_flags) | 1313 | gfp_t mem_flags) |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 9e65c47cc98b..62e39fc57211 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/errno.h> | 41 | #include <linux/errno.h> |
42 | #include <linux/init.h> | 42 | #include <linux/init.h> |
43 | #include <linux/list.h> | 43 | #include <linux/list.h> |
44 | #include <linux/dma-mapping.h> | ||
44 | 45 | ||
45 | #include "musb_core.h" | 46 | #include "musb_core.h" |
46 | #include "musb_host.h" | 47 | #include "musb_host.h" |
@@ -1332,6 +1333,8 @@ void musb_host_tx(struct musb *musb, u8 epnum) | |||
1332 | */ | 1333 | */ |
1333 | if (length > qh->maxpacket) | 1334 | if (length > qh->maxpacket) |
1334 | length = qh->maxpacket; | 1335 | length = qh->maxpacket; |
1336 | /* Unmap the buffer so that CPU can use it */ | ||
1337 | unmap_urb_for_dma(musb_to_hcd(musb), urb); | ||
1335 | musb_write_fifo(hw_ep, length, urb->transfer_buffer + offset); | 1338 | musb_write_fifo(hw_ep, length, urb->transfer_buffer + offset); |
1336 | qh->segsize = length; | 1339 | qh->segsize = length; |
1337 | 1340 | ||
@@ -1752,6 +1755,8 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
1752 | #endif /* Mentor DMA */ | 1755 | #endif /* Mentor DMA */ |
1753 | 1756 | ||
1754 | if (!dma) { | 1757 | if (!dma) { |
1758 | /* Unmap the buffer so that CPU can use it */ | ||
1759 | unmap_urb_for_dma(musb_to_hcd(musb), urb); | ||
1755 | done = musb_host_packet_rx(musb, urb, | 1760 | done = musb_host_packet_rx(musb, urb, |
1756 | epnum, iso_err); | 1761 | epnum, iso_err); |
1757 | DBG(6, "read %spacket\n", done ? "last " : ""); | 1762 | DBG(6, "read %spacket\n", done ? "last " : ""); |