aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core/buffer.c
diff options
context:
space:
mode:
authorMagnus Damm <magnus.damm@gmail.com>2008-01-23 01:58:35 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2008-02-01 17:35:05 -0500
commitb3476675320eda83cf061a686cdc80b76f2bfdc4 (patch)
tree11d31a0ade5c961fd5738a67b99ccb411325607d /drivers/usb/core/buffer.c
parent0915f490d81c1a5098b399ec6c0be45bd421ee1d (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.c9
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 }