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 <milindc@codeaurora.org> Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
b6d7852cf8
commit
359439d288
12
common/usb.c
12
common/usb.c
|
@ -805,6 +805,18 @@ struct usb_device *usb_alloc_new_device(void *controller)
|
||||||
return &usb_dev[dev_index - 1];
|
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
|
* By the time we get here, the device has gotten a new device ID
|
||||||
|
|
|
@ -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) */
|
/* Run it through the hoops (find a driver, etc) */
|
||||||
if (usb_new_device(usb)) {
|
if (usb_new_device(usb)) {
|
||||||
/* Woops, disable the port */
|
/* Woops, disable the port */
|
||||||
|
usb_free_device();
|
||||||
|
dev->children[port] = NULL;
|
||||||
USB_HUB_PRINTF("hub: disabling port %d\n", port + 1);
|
USB_HUB_PRINTF("hub: disabling port %d\n", port + 1);
|
||||||
usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_ENABLE);
|
usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_ENABLE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -392,5 +392,6 @@ int hub_port_reset(struct usb_device *dev, int port,
|
||||||
struct usb_device *usb_alloc_new_device(void *controller);
|
struct usb_device *usb_alloc_new_device(void *controller);
|
||||||
|
|
||||||
int usb_new_device(struct usb_device *dev);
|
int usb_new_device(struct usb_device *dev);
|
||||||
|
void usb_free_device(void);
|
||||||
|
|
||||||
#endif /*_USB_H_ */
|
#endif /*_USB_H_ */
|
||||||
|
|
Loading…
Reference in New Issue