diff options
| author | Lukasz Majewski <l.majewski@samsung.com> | 2013-10-08 14:30:40 +0200 | 
|---|---|---|
| committer | Marek Vasut <marex@denx.de> | 2013-10-20 23:42:40 +0200 | 
| commit | 7b412ab31fe7957eabbfa86c131679fb244d7079 (patch) | |
| tree | 5b39b7cc22a92e8ef80ca6cf536c811392bc2878 | |
| parent | d42782631d59ea12251629bb827f725ef4dfddf6 (diff) | |
| download | olio-uboot-2014.01-7b412ab31fe7957eabbfa86c131679fb244d7079.tar.xz olio-uboot-2014.01-7b412ab31fe7957eabbfa86c131679fb244d7079.zip | |
usb:g_dnl: Replace static usb_configuration structure with dynamically allocated one
When the usb_configuration structure is declared as static, it is very
hard to assure, that relevant fields (as e.g. config->interfaces[]) are
cleared out before new call to g_dnl related functions.
Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
| -rw-r--r-- | drivers/usb/gadget/g_dnl.c | 24 | 
1 files changed, 16 insertions, 8 deletions
| diff --git a/drivers/usb/gadget/g_dnl.c b/drivers/usb/gadget/g_dnl.c index 40868c034..1aaf78f51 100644 --- a/drivers/usb/gadget/g_dnl.c +++ b/drivers/usb/gadget/g_dnl.c @@ -79,6 +79,8 @@ static int g_dnl_unbind(struct usb_composite_dev *cdev)  {  	struct usb_gadget *gadget = cdev->gadget; +	free(cdev->config); +	cdev->config = NULL;  	debug("%s: calling usb_gadget_disconnect for "  			"controller '%s'\n", shortname, gadget->name);  	usb_gadget_disconnect(gadget); @@ -105,16 +107,22 @@ static int g_dnl_do_config(struct usb_configuration *c)  static int g_dnl_config_register(struct usb_composite_dev *cdev)  { -	static struct usb_configuration config = { -		.label = "usb_dnload", -		.bmAttributes =	USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, -		.bConfigurationValue =	CONFIGURATION_NUMBER, -		.iConfiguration =	STRING_USBDOWN, +	struct usb_configuration *config; +	const char *name = "usb_dnload"; -		.bind = g_dnl_do_config, -	}; +	config = memalign(CONFIG_SYS_CACHELINE_SIZE, sizeof(*config)); +	if (!config) +		return -ENOMEM; -	return usb_add_config(cdev, &config); +	memset(config, 0, sizeof(*config)); + +	config->label = name; +	config->bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER; +	config->bConfigurationValue = CONFIGURATION_NUMBER; +	config->iConfiguration = STRING_USBDOWN; +	config->bind = g_dnl_do_config; + +	return usb_add_config(cdev, config);  }  __weak |