usb: Clean up newly allocated device nodes in case of configuration failure
authorMilind Choudhary <milindc@codeaurora.org>
Thu, 13 Dec 2012 01:55:28 +0000 (17:55 -0800)
committerMarek Vasut <marex@denx.de>
Mon, 17 Dec 2012 14:38:15 +0000 (15:38 +0100)
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 <milindc@codeaurora.org>
Signed-off-by: Simon Glass <sjg@chromium.org>
common/usb.c
common/usb_hub.c
include/usb.h

index ac9b4ca8d58bfe8dd3cd941c7fb094a4b9d819e7..6fc0fc1c0ec75fe34f100cbfb03b207628b32885 100644 (file)
@@ -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
index 4d75b902ff5ada32a425699ebe14951035e7859b..b5eeb62fbe55ecab41fe74abd3dea5209695a01f 100644 (file)
@@ -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);
        }
index 8d8a2c9b9da63421b59a7eeb9e02c6a2be285c76..d79c865884031d33d7549bcddc322a9b937dbfcc 100644 (file)
@@ -392,5 +392,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_ */