usb: gadget: midi: make FS and HS available
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Mon, 22 Oct 2012 20:15:03 +0000 (22:15 +0200)
committerFelipe Balbi <balbi@ti.com>
Wed, 31 Oct 2012 13:05:37 +0000 (15:05 +0200)
This function works only on FS or HS. If the gadget is HS capable only
HS descriptors are assigned. If we plug it to an 1.1 host it won't work
because we have only 2.0 descriptors. This patch changes the behavior to
provide both sets.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/f_midi.c

index b978c5d15cb492d92b93283675ab147c6e501317..b265ee8fa5aabc4faeddb6a00ad82cf603aa1f95 100644 (file)
@@ -882,18 +882,24 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f)
         * both speeds
         */
        /* copy descriptors, and track endpoint copies */
+       f->descriptors = usb_copy_descriptors(midi_function);
+       if (!f->descriptors)
+               goto fail_f_midi;
        if (gadget_is_dualspeed(c->cdev->gadget)) {
                bulk_in_desc.wMaxPacketSize = cpu_to_le16(512);
                bulk_out_desc.wMaxPacketSize = cpu_to_le16(512);
                f->hs_descriptors = usb_copy_descriptors(midi_function);
-       } else {
-               f->descriptors = usb_copy_descriptors(midi_function);
+               if (!f->hs_descriptors)
+                       goto fail_f_midi;
        }
 
        kfree(midi_function);
 
        return 0;
 
+fail_f_midi:
+       kfree(midi_function);
+       usb_free_descriptors(f->hs_descriptors);
 fail:
        /* we might as well release our claims on endpoints */
        if (midi->out_ep)