Skip to content

Commit

Permalink
USB: cdc-wdm: no need to use usb_alloc_coherent
Browse files Browse the repository at this point in the history
As Documentation/usb/dma.txt states:

  Most drivers should *NOT* be using these primitives; they don't need
  to use this type of memory (dma-coherent), and memory returned from
  kmalloc() will work just fine.

This driver handle only very low bandwith transfers.  It is not an
obvious candidate for usb_alloc_coherent().

Using these calls only serves to complicate the code for no gain,
as has been shown by multiple bugs related to this allocation path.

Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Bjørn Mork authored and Greg Kroah-Hartman committed Jan 24, 2012
1 parent cafbe85 commit 8457d99
Showing 1 changed file with 9 additions and 30 deletions.
39 changes: 9 additions & 30 deletions drivers/usb/class/cdc-wdm.c
Original file line number Diff line number Diff line change
Expand Up @@ -256,14 +256,8 @@ static void free_urbs(struct wdm_device *desc)

static void cleanup(struct wdm_device *desc)
{
usb_free_coherent(interface_to_usbdev(desc->intf),
desc->wMaxPacketSize,
desc->sbuf,
desc->validity->transfer_dma);
usb_free_coherent(interface_to_usbdev(desc->intf),
desc->bMaxPacketSize0,
desc->inbuf,
desc->response->transfer_dma);
kfree(desc->sbuf);
kfree(desc->inbuf);
kfree(desc->orq);
kfree(desc->irq);
kfree(desc->ubuf);
Expand Down Expand Up @@ -688,19 +682,13 @@ static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
if (!desc->ubuf)
goto err;

desc->sbuf = usb_alloc_coherent(interface_to_usbdev(intf),
desc->wMaxPacketSize,
GFP_KERNEL,
&desc->validity->transfer_dma);
desc->sbuf = kmalloc(desc->wMaxPacketSize, GFP_KERNEL);
if (!desc->sbuf)
goto err;

desc->inbuf = usb_alloc_coherent(interface_to_usbdev(intf),
desc->wMaxCommand,
GFP_KERNEL,
&desc->response->transfer_dma);
desc->inbuf = kmalloc(desc->wMaxCommand, GFP_KERNEL);
if (!desc->inbuf)
goto err2;
goto err;

usb_fill_int_urb(
desc->validity,
Expand All @@ -712,7 +700,6 @@ static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
desc,
ep->bInterval
);
desc->validity->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

desc->irq->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE);
desc->irq->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
Expand All @@ -731,30 +718,22 @@ static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
wdm_in_callback,
desc
);
desc->response->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

usb_set_intfdata(intf, desc);
rv = usb_register_dev(intf, &wdm_class);
if (rv < 0)
goto err3;
goto err2;
else
dev_info(&intf->dev, "cdc-wdm%d: USB WDM device\n",
intf->minor - WDM_MINOR_BASE);
out:
return rv;
err3:
usb_set_intfdata(intf, NULL);
usb_free_coherent(interface_to_usbdev(desc->intf),
desc->bMaxPacketSize0,
desc->inbuf,
desc->response->transfer_dma);
err2:
usb_free_coherent(interface_to_usbdev(desc->intf),
desc->wMaxPacketSize,
desc->sbuf,
desc->validity->transfer_dma);
usb_set_intfdata(intf, NULL);
err:
free_urbs(desc);
kfree(desc->inbuf);
kfree(desc->sbuf);
kfree(desc->ubuf);
kfree(desc->orq);
kfree(desc->irq);
Expand Down

0 comments on commit 8457d99

Please sign in to comment.