USB: cdc-wdm: no need to fill the in request URB every time it's submitted
authorBjørn Mork <bjorn@mork.no>
Mon, 16 Jan 2012 14:11:58 +0000 (15:11 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 24 Jan 2012 22:32:21 +0000 (14:32 -0800)
Filling the same URB with the exact same data is pointless.  It can be filled
once and resubmitted.  And not doing buffer allocation and URB filling at the
same place only serves to hide size mismatch bugs

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 1c50baff7725ec2d8e368b3c34f50925a76f3804..9734863a3a49fa110a666b0f60dbf77e4d6267e7 100644 (file)
@@ -159,11 +159,9 @@ static void wdm_int_callback(struct urb *urb)
        int rv = 0;
        int status = urb->status;
        struct wdm_device *desc;
-       struct usb_ctrlrequest *req;
        struct usb_cdc_notification *dr;
 
        desc = urb->context;
-       req = desc->irq;
        dr = (struct usb_cdc_notification *)desc->sbuf;
 
        if (status) {
@@ -210,24 +208,6 @@ static void wdm_int_callback(struct urb *urb)
                goto exit;
        }
 
-       req->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE);
-       req->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
-       req->wValue = 0;
-       req->wIndex = desc->inum;
-       req->wLength = cpu_to_le16(desc->wMaxCommand);
-
-       usb_fill_control_urb(
-               desc->response,
-               interface_to_usbdev(desc->intf),
-               /* using common endpoint 0 */
-               usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0),
-               (unsigned char *)req,
-               desc->inbuf,
-               desc->wMaxCommand,
-               wdm_in_callback,
-               desc
-       );
-       desc->response->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
        spin_lock(&desc->iuspin);
        clear_bit(WDM_READ, &desc->flags);
        set_bit(WDM_RESPONDING, &desc->flags);
@@ -734,6 +714,25 @@ next_desc:
        );
        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;
+       desc->irq->wValue = 0;
+       desc->irq->wIndex = desc->inum;
+       desc->irq->wLength = cpu_to_le16(desc->wMaxCommand);
+
+       usb_fill_control_urb(
+               desc->response,
+               interface_to_usbdev(desc->intf),
+               /* using common endpoint 0 */
+               usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0),
+               (unsigned char *)desc->irq,
+               desc->inbuf,
+               desc->wMaxCommand,
+               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)