USB: cdc-wdm: no need to use usb_alloc_coherent
authorBjørn Mork <bjorn@mork.no>
Mon, 16 Jan 2012 14:12:00 +0000 (15:12 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 24 Jan 2012 22:34:09 +0000 (14:34 -0800)
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>
drivers/usb/class/cdc-wdm.c

index 846dfa6034472db2fd4cbb303e96904b0bfebdf6..8909058b1bb1f5af4e85357a4fa6dd92e82ca8ca 100644 (file)
@@ -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);
@@ -688,19 +682,13 @@ next_desc:
        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,
@@ -712,7 +700,6 @@ next_desc:
                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;
@@ -731,30 +718,22 @@ next_desc:
                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);