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 28d4972f7a..acd9f00a0b 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 | } |
