aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/class
diff options
context:
space:
mode:
authorBjørn Mork <bjorn@mork.no>2012-01-16 09:11:58 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2012-01-24 17:32:21 -0500
commit19b85b3b87fd1388df1f4a35969823521d35d243 (patch)
treef206d2512557be7b3a86453a1bead66f417cdff2 /drivers/usb/class
parent0b238583ac8db66762bba021de1b7c60b6bc29ad (diff)
USB: cdc-wdm: no need to fill the in request URB every time it's submitted
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>
Diffstat (limited to 'drivers/usb/class')
-rw-r--r--drivers/usb/class/cdc-wdm.c39
1 files changed, 19 insertions, 20 deletions
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
index 1c50baff7725..9734863a3a49 100644
--- a/drivers/usb/class/cdc-wdm.c
+++ b/drivers/usb/class/cdc-wdm.c
@@ -159,11 +159,9 @@ static void wdm_int_callback(struct urb *urb)
159 int rv = 0; 159 int rv = 0;
160 int status = urb->status; 160 int status = urb->status;
161 struct wdm_device *desc; 161 struct wdm_device *desc;
162 struct usb_ctrlrequest *req;
163 struct usb_cdc_notification *dr; 162 struct usb_cdc_notification *dr;
164 163
165 desc = urb->context; 164 desc = urb->context;
166 req = desc->irq;
167 dr = (struct usb_cdc_notification *)desc->sbuf; 165 dr = (struct usb_cdc_notification *)desc->sbuf;
168 166
169 if (status) { 167 if (status) {
@@ -210,24 +208,6 @@ static void wdm_int_callback(struct urb *urb)
210 goto exit; 208 goto exit;
211 } 209 }
212 210
213 req->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE);
214 req->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
215 req->wValue = 0;
216 req->wIndex = desc->inum;
217 req->wLength = cpu_to_le16(desc->wMaxCommand);
218
219 usb_fill_control_urb(
220 desc->response,
221 interface_to_usbdev(desc->intf),
222 /* using common endpoint 0 */
223 usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0),
224 (unsigned char *)req,
225 desc->inbuf,
226 desc->wMaxCommand,
227 wdm_in_callback,
228 desc
229 );
230 desc->response->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
231 spin_lock(&desc->iuspin); 211 spin_lock(&desc->iuspin);
232 clear_bit(WDM_READ, &desc->flags); 212 clear_bit(WDM_READ, &desc->flags);
233 set_bit(WDM_RESPONDING, &desc->flags); 213 set_bit(WDM_RESPONDING, &desc->flags);
@@ -734,6 +714,25 @@ next_desc:
734 ); 714 );
735 desc->validity->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 715 desc->validity->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
736 716
717 desc->irq->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE);
718 desc->irq->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
719 desc->irq->wValue = 0;
720 desc->irq->wIndex = desc->inum;
721 desc->irq->wLength = cpu_to_le16(desc->wMaxCommand);
722
723 usb_fill_control_urb(
724 desc->response,
725 interface_to_usbdev(desc->intf),
726 /* using common endpoint 0 */
727 usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0),
728 (unsigned char *)desc->irq,
729 desc->inbuf,
730 desc->wMaxCommand,
731 wdm_in_callback,
732 desc
733 );
734 desc->response->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
735
737 usb_set_intfdata(intf, desc); 736 usb_set_intfdata(intf, desc);
738 rv = usb_register_dev(intf, &wdm_class); 737 rv = usb_register_dev(intf, &wdm_class);
739 if (rv < 0) 738 if (rv < 0)