mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-25 03:55:09 +08:00
USB: cdc-wdm: no need to use usb_alloc_coherent
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>
This commit is contained in:
parent
cafbe85fb0
commit
8457d99cab
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user