From: Milind Choudhary Date: Thu, 13 Dec 2012 01:55:28 +0000 (-0800) Subject: usb: Clean up newly allocated device nodes in case of configuration failure X-Git-Tag: submit/tizen/20160318.071304~288 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0123ee9e7fc2cd8aa7c12f725616f54eca998adc;p=profile%2Fcommon%2Fplatform%2Fkernel%2Fu-boot-artik.git usb: Clean up newly allocated device nodes in case of configuration failure If probe of a newly connected device fails for some reason, clean up the allocated entry in usb_dev array. Signed-off-by: Milind Choudhary Signed-off-by: Simon Glass --- diff --git a/common/usb.c b/common/usb.c index ac9b4ca8d..6fc0fc1c0 100644 --- a/common/usb.c +++ b/common/usb.c @@ -805,6 +805,18 @@ struct usb_device *usb_alloc_new_device(void *controller) return &usb_dev[dev_index - 1]; } +/* + * Free the newly created device node. + * Called in error cases where configuring a newly attached + * device fails for some reason. + */ +void usb_free_device(void) +{ + dev_index--; + USB_PRINTF("Freeing device node: %d\n", dev_index); + memset(&usb_dev[dev_index], 0, sizeof(struct usb_device)); + usb_dev[dev_index].devnum = -1; +} /* * By the time we get here, the device has gotten a new device ID diff --git a/common/usb_hub.c b/common/usb_hub.c index e4a120120..a3c5f2281 100644 --- a/common/usb_hub.c +++ b/common/usb_hub.c @@ -259,6 +259,8 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port) /* Run it through the hoops (find a driver, etc) */ if (usb_new_device(usb)) { /* Woops, disable the port */ + usb_free_device(); + dev->children[port] = NULL; USB_HUB_PRINTF("hub: disabling port %d\n", port + 1); usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_ENABLE); } diff --git a/include/usb.h b/include/usb.h index 4689db624..601f56598 100644 --- a/include/usb.h +++ b/include/usb.h @@ -390,5 +390,6 @@ int hub_port_reset(struct usb_device *dev, int port, struct usb_device *usb_alloc_new_device(void *controller); int usb_new_device(struct usb_device *dev); +void usb_free_device(void); #endif /*_USB_H_ */