diff options
| author | Dave Jones <davej@delerium.codemonkey.org.uk> | 2003-12-18 04:57:24 +0000 |
|---|---|---|
| committer | Dave Jones <davej@delerium.codemonkey.org.uk> | 2003-12-18 04:57:24 +0000 |
| commit | 93bc467d274f39059e2d15f93d53e89e1a00aae6 (patch) | |
| tree | 54aa6c984d7668eefefef4a495b8dd41aaf92bc6 /drivers/usb/core | |
| parent | 3cdecffe5561dd49cc2b203dc1475e43f87fbbe8 (diff) | |
| parent | 67e9bb60cdf60c3ead23020c96090e722895f47a (diff) | |
Merge delerium.codemonkey.org.uk:/mnt/nfs/sepia/bar/src/kernel/2.6/trees/bk-linus
into delerium.codemonkey.org.uk:/mnt/nfs/sepia/bar/src/kernel/2.6/trees/agpgart
Diffstat (limited to 'drivers/usb/core')
| -rw-r--r-- | drivers/usb/core/devio.c | 2 | ||||
| -rw-r--r-- | drivers/usb/core/hub.c | 10 | ||||
| -rw-r--r-- | drivers/usb/core/usb.c | 1 |
3 files changed, 9 insertions, 4 deletions
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index ecef33242859..68ca2b2abfee 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -261,7 +261,6 @@ static void async_completed(struct urb *urb, struct pt_regs *regs) spin_lock(&ps->lock); list_move_tail(&as->asynclist, &ps->async_completed); spin_unlock(&ps->lock); - wake_up(&ps->wait); if (as->signr) { sinfo.si_signo = as->signr; sinfo.si_errno = as->urb->status; @@ -269,6 +268,7 @@ static void async_completed(struct urb *urb, struct pt_regs *regs) sinfo.si_addr = (void *)as->userurb; send_sig_info(as->signr, &sinfo, as->task); } + wake_up(&ps->wait); } static void destroy_async (struct dev_state *ps, struct list_head *list) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index dc12ba0c9722..d019f21cec37 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -692,6 +692,9 @@ static int hub_port_status(struct usb_device *dev, int port, struct usb_hub *hub = usb_get_intfdata(dev->actconfig->interface[0]); int ret; + if (!hub) + return -ENODEV; + ret = get_port_status(dev, port + 1, &hub->status->port); if (ret < 0) dev_err (hubdev (dev), @@ -926,7 +929,6 @@ static void hub_port_connect_change(struct usb_hub *hubstate, int port, break; } - hub->children[port] = dev; dev->state = USB_STATE_POWERED; /* Reset the device, and detect its speed */ @@ -979,8 +981,10 @@ static void hub_port_connect_change(struct usb_hub *hubstate, int port, dev->dev.parent = dev->parent->dev.parent->parent; /* Run it through the hoops (find a driver, etc) */ - if (!usb_new_device(dev, &hub->dev)) + if (!usb_new_device(dev, &hub->dev)) { + hub->children[port] = dev; goto done; + } /* Free the configuration if there was an error */ usb_put_dev(dev); @@ -989,7 +993,6 @@ static void hub_port_connect_change(struct usb_hub *hubstate, int port, delay = HUB_LONG_RESET_TIME; } - hub->children[port] = NULL; hub_port_disable(hub, port); done: up(&usb_address0_sem); @@ -1342,6 +1345,7 @@ int usb_physical_reset_device(struct usb_device *dev) dev->devpath, ret); return ret; } + dev->state = USB_STATE_CONFIGURED; for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) { struct usb_interface *intf = dev->actconfig->interface[i]; diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 3fad1ec8b4a3..4bccdf023348 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -1120,6 +1120,7 @@ int usb_new_device(struct usb_device *dev, struct device *parent) if (err) { dev_err(&dev->dev, "can't set config #%d, error %d\n", dev->config[0].desc.bConfigurationValue, err); + device_del(&dev->dev); goto fail; } |
