Patchwork [U-Boot,08/11] usb: Clean up newly allocated device nodes in case of configuration failure

login
register
mail settings
Submitter Simon Glass
Date Dec. 13, 2012, 1:55 a.m.
Message ID <1355363731-10103-9-git-send-email-sjg@chromium.org>
Download mbox | patch
Permalink /patch/205709/
State Superseded, archived
Delegated to: Marek Vasut
Headers show

Comments

Simon Glass - Dec. 13, 2012, 1:55 a.m.
From: Milind Choudhary <milindc@codeaurora.org>

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     |   12 ++++++++++++
 common/usb_hub.c |    2 ++
 include/usb.h    |    1 +
 3 files changed, 15 insertions(+), 0 deletions(-)
Marek Vasut - Dec. 13, 2012, 5:36 p.m.
Dear Simon Glass,

> From: Milind Choudhary <milindc@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@codeaurora.org>
> Signed-off-by: Simon Glass <sjg@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

Patch

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_ */