On Tue, Jul 07, 2015 at 04:55:16PM +0300, Roger Quadros wrote: > > On 29/06/15 10:48, Li Jun wrote: > >Allocate and initialize usb otg descriptor according to gadget otg > >capabilities, add it for each usb configurations. If otg capability > >is not defined, keep its original otg descriptor unchanged. > > > >Signed-off-by: Li Jun <jun.li@xxxxxxxxxxxxx> > >--- > > drivers/usb/gadget/legacy/zero.c | 32 ++++++++++++++------------------ > > 1 file changed, 14 insertions(+), 18 deletions(-) > > > >diff --git a/drivers/usb/gadget/legacy/zero.c b/drivers/usb/gadget/legacy/zero.c > >index c986e8a..695c2cb 100644 > >--- a/drivers/usb/gadget/legacy/zero.c > >+++ b/drivers/usb/gadget/legacy/zero.c > >@@ -121,24 +121,7 @@ static struct usb_device_descriptor device_desc = { > > .bNumConfigurations = 2, > > }; > > > >-#ifdef CONFIG_USB_OTG > >-static struct usb_otg_descriptor otg_descriptor = { > >- .bLength = sizeof otg_descriptor, > >- .bDescriptorType = USB_DT_OTG, > >- > >- /* REVISIT SRP-only hardware is possible, although > >- * it would not be called "OTG" ... > >- */ > >- .bmAttributes = USB_OTG_SRP | USB_OTG_HNP, > >-}; > >- > >-static const struct usb_descriptor_header *otg_desc[] = { > >- (struct usb_descriptor_header *) &otg_descriptor, > >- NULL, > >-}; > >-#else > >-#define otg_desc NULL > >-#endif > >+static const struct usb_descriptor_header *otg_desc[2]; > > > > /* string IDs are assigned dynamically */ > > /* default serial number takes at least two packets */ > >@@ -341,6 +324,16 @@ static int zero_bind(struct usb_composite_dev *cdev) > > > > /* support OTG systems */ > > if (gadget_is_otg(cdev->gadget)) { > >+ if (!otg_desc[0]) { > >+ struct usb_descriptor_header *usb_desc; > >+ > >+ usb_desc = usb_otg_descriptor_alloc(cdev->gadget); > >+ if (!usb_desc) > >+ return -ENOMEM; > >+ usb_otg_descriptor_init(cdev->gadget, usb_desc); > >+ otg_desc[0] = usb_desc; > >+ otg_desc[1] = NULL; > >+ } > > There is an error condition in zero_bind(). You need to free the > otg_descriptor there. > Good catch, I will add error handling for the 3 patches you found this problem. Li Jun > > sourcesink_driver.descriptors = otg_desc; > > sourcesink_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP; > > loopback_driver.descriptors = otg_desc; > >@@ -397,6 +390,9 @@ static int zero_unbind(struct usb_composite_dev *cdev) > > if (!IS_ERR_OR_NULL(func_lb)) > > usb_put_function(func_lb); > > usb_put_function_instance(func_inst_lb); > >+ kfree(otg_desc[0]); > >+ otg_desc[0] = NULL; > >+ > > return 0; > > } > > > > > > cheers, > -roger -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html