USB: remove uses of URB_NO_SETUP_DMA_MAP
This patch (as1350) removes all usages of coherent buffers for USB control-request setup-packet buffers. There's no good reason to reserve coherent memory for these things; control requests are hardly ever used in large quantity (the major exception is firmware transfers, and they aren't time-critical). Furthermore, only seven drivers used it. We might as well always use streaming DMA mappings for setup-packet buffers, and remove some extra complexity from usbcore. The DMA-mapping portion of hcd.c is currently in flux. A separate patch will be submitted to remove support for URB_NO_SETUP_DMA_MAP after everything else settles down. The removal should go smoothly, as by then nobody will be using it. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:

committed by
Greg Kroah-Hartman

父節點
749da5f82f
當前提交
0ede76fcec
@@ -147,11 +147,9 @@ static int usb_stor_msg_common(struct us_data *us, int timeout)
|
||||
* hasn't been mapped for DMA. Yes, this is clunky, but it's
|
||||
* easier than always having the caller tell us whether the
|
||||
* transfer buffer has already been mapped. */
|
||||
us->current_urb->transfer_flags = URB_NO_SETUP_DMA_MAP;
|
||||
if (us->current_urb->transfer_buffer == us->iobuf)
|
||||
us->current_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
us->current_urb->transfer_dma = us->iobuf_dma;
|
||||
us->current_urb->setup_dma = us->cr_dma;
|
||||
|
||||
/* submit the URB */
|
||||
status = usb_submit_urb(us->current_urb, GFP_NOIO);
|
||||
|
@@ -407,9 +407,8 @@ static int associate_dev(struct us_data *us, struct usb_interface *intf)
|
||||
/* Store our private data in the interface */
|
||||
usb_set_intfdata(intf, us);
|
||||
|
||||
/* Allocate the device-related DMA-mapped buffers */
|
||||
us->cr = usb_buffer_alloc(us->pusb_dev, sizeof(*us->cr),
|
||||
GFP_KERNEL, &us->cr_dma);
|
||||
/* Allocate the control/setup and DMA-mapped buffers */
|
||||
us->cr = kmalloc(sizeof(*us->cr), GFP_KERNEL);
|
||||
if (!us->cr) {
|
||||
US_DEBUGP("usb_ctrlrequest allocation failed\n");
|
||||
return -ENOMEM;
|
||||
@@ -757,13 +756,9 @@ static void dissociate_dev(struct us_data *us)
|
||||
{
|
||||
US_DEBUGP("-- %s\n", __func__);
|
||||
|
||||
/* Free the device-related DMA-mapped buffers */
|
||||
if (us->cr)
|
||||
usb_buffer_free(us->pusb_dev, sizeof(*us->cr), us->cr,
|
||||
us->cr_dma);
|
||||
if (us->iobuf)
|
||||
usb_buffer_free(us->pusb_dev, US_IOBUF_SIZE, us->iobuf,
|
||||
us->iobuf_dma);
|
||||
/* Free the buffers */
|
||||
kfree(us->cr);
|
||||
usb_buffer_free(us->pusb_dev, US_IOBUF_SIZE, us->iobuf, us->iobuf_dma);
|
||||
|
||||
/* Remove our private data from the interface */
|
||||
usb_set_intfdata(us->pusb_intf, NULL);
|
||||
|
@@ -139,8 +139,7 @@ struct us_data {
|
||||
struct usb_ctrlrequest *cr; /* control requests */
|
||||
struct usb_sg_request current_sg; /* scatter-gather req. */
|
||||
unsigned char *iobuf; /* I/O buffer */
|
||||
dma_addr_t cr_dma; /* buffer DMA addresses */
|
||||
dma_addr_t iobuf_dma;
|
||||
dma_addr_t iobuf_dma; /* buffer DMA addresses */
|
||||
struct task_struct *ctl_thread; /* the control thread */
|
||||
|
||||
/* mutual exclusion and synchronization structures */
|
||||
|
Reference in New Issue
Block a user