[U-Boot] [PATCH 08/11] usb: Clean up newly allocated device nodes in case of configuration failure
Marek Vasut
marex at denx.de
Thu Dec 13 18:36:09 CET 2012
Dear Simon Glass,
> From: Milind Choudhary <milindc at codeaurora.org>
>
> If probe of a newly connected device fails for some reason, clean up
> the allocated entry in usb_dev array.
Applied, thanks
> Signed-off-by: Milind Choudhary <milindc at codeaurora.org>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
> common/usb.c | 12 ++++++++++++
> common/usb_hub.c | 2 ++
> include/usb.h | 1 +
> 3 files changed, 15 insertions(+), 0 deletions(-)
>
> diff --git a/common/usb.c b/common/usb.c
> index ac9b4ca..6fc0fc1 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 e4a1201..a3c5f22 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 8d8a2c9..d79c865 100644
> --- a/include/usb.h
> +++ b/include/usb.h
> @@ -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_ */
Best regards,
Marek Vasut
More information about the U-Boot
mailing list