diff options
author | Magnus Damm <magnus.damm@gmail.com> | 2008-01-23 01:58:35 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-02-01 17:35:05 -0500 |
commit | b3476675320eda83cf061a686cdc80b76f2bfdc4 (patch) | |
tree | 11d31a0ade5c961fd5738a67b99ccb411325607d /drivers/usb/core/buffer.c | |
parent | 0915f490d81c1a5098b399ec6c0be45bd421ee1d (diff) |
usb: dma bounce buffer support
usb: dma bounce buffer support V4
This patch adds dma bounce buffer support to the usb core. These buffers
can be enabled with the HCD_LOCAL_MEM flag, and they make sure that all data
passed to the host controller is allocated using dma_alloc_coherent().
Signed-off-by: Magnus Damm <damm@igel.co.jp>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Acked-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/core/buffer.c')
-rw-r--r-- | drivers/usb/core/buffer.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/usb/core/buffer.c b/drivers/usb/core/buffer.c index 28d4972f7ad5..acd9f00a0b76 100644 --- a/drivers/usb/core/buffer.c +++ b/drivers/usb/core/buffer.c | |||
@@ -53,7 +53,8 @@ int hcd_buffer_create(struct usb_hcd *hcd) | |||
53 | char name[16]; | 53 | char name[16]; |
54 | int i, size; | 54 | int i, size; |
55 | 55 | ||
56 | if (!hcd->self.controller->dma_mask) | 56 | if (!hcd->self.controller->dma_mask && |
57 | !(hcd->driver->flags & HCD_LOCAL_MEM)) | ||
57 | return 0; | 58 | return 0; |
58 | 59 | ||
59 | for (i = 0; i < HCD_BUFFER_POOLS; i++) { | 60 | for (i = 0; i < HCD_BUFFER_POOLS; i++) { |
@@ -107,7 +108,8 @@ void *hcd_buffer_alloc( | |||
107 | int i; | 108 | int i; |
108 | 109 | ||
109 | /* some USB hosts just use PIO */ | 110 | /* some USB hosts just use PIO */ |
110 | if (!bus->controller->dma_mask) { | 111 | if (!bus->controller->dma_mask && |
112 | !(hcd->driver->flags & HCD_LOCAL_MEM)) { | ||
111 | *dma = ~(dma_addr_t) 0; | 113 | *dma = ~(dma_addr_t) 0; |
112 | return kmalloc(size, mem_flags); | 114 | return kmalloc(size, mem_flags); |
113 | } | 115 | } |
@@ -132,7 +134,8 @@ void hcd_buffer_free( | |||
132 | if (!addr) | 134 | if (!addr) |
133 | return; | 135 | return; |
134 | 136 | ||
135 | if (!bus->controller->dma_mask) { | 137 | if (!bus->controller->dma_mask && |
138 | !(hcd->driver->flags & HCD_LOCAL_MEM)) { | ||
136 | kfree(addr); | 139 | kfree(addr); |
137 | return; | 140 | return; |
138 | } | 141 | } |