Index: common/usb.c |
diff --git a/common/usb.c b/common/usb.c |
index 87fca70706519353561722fdb91a4eee8701085f..1fb760bb2e311e8bd1cbca8768cfc02224370495 100644 |
--- a/common/usb.c |
+++ b/common/usb.c |
@@ -754,6 +754,18 @@ struct usb_device *usb_alloc_new_device(void) |
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 |
@@ -1160,6 +1172,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); |
} |