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