diff options
Diffstat (limited to 'drivers/usb/core')
-rw-r--r-- | drivers/usb/core/hcd-pci.c | 13 | ||||
-rw-r--r-- | drivers/usb/core/hcd.c | 55 |
2 files changed, 47 insertions, 21 deletions
diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c index f71e8e307e0..d37088591d9 100644 --- a/drivers/usb/core/hcd-pci.c +++ b/drivers/usb/core/hcd-pci.c | |||
@@ -363,8 +363,7 @@ static int check_root_hub_suspended(struct device *dev) | |||
363 | struct pci_dev *pci_dev = to_pci_dev(dev); | 363 | struct pci_dev *pci_dev = to_pci_dev(dev); |
364 | struct usb_hcd *hcd = pci_get_drvdata(pci_dev); | 364 | struct usb_hcd *hcd = pci_get_drvdata(pci_dev); |
365 | 365 | ||
366 | if (!(hcd->state == HC_STATE_SUSPENDED || | 366 | if (HCD_RH_RUNNING(hcd)) { |
367 | hcd->state == HC_STATE_HALT)) { | ||
368 | dev_warn(dev, "Root hub is not suspended\n"); | 367 | dev_warn(dev, "Root hub is not suspended\n"); |
369 | return -EBUSY; | 368 | return -EBUSY; |
370 | } | 369 | } |
@@ -386,7 +385,7 @@ static int suspend_common(struct device *dev, bool do_wakeup) | |||
386 | if (retval) | 385 | if (retval) |
387 | return retval; | 386 | return retval; |
388 | 387 | ||
389 | if (hcd->driver->pci_suspend) { | 388 | if (hcd->driver->pci_suspend && !HCD_DEAD(hcd)) { |
390 | /* Optimization: Don't suspend if a root-hub wakeup is | 389 | /* Optimization: Don't suspend if a root-hub wakeup is |
391 | * pending and it would cause the HCD to wake up anyway. | 390 | * pending and it would cause the HCD to wake up anyway. |
392 | */ | 391 | */ |
@@ -427,7 +426,7 @@ static int resume_common(struct device *dev, int event) | |||
427 | struct usb_hcd *hcd = pci_get_drvdata(pci_dev); | 426 | struct usb_hcd *hcd = pci_get_drvdata(pci_dev); |
428 | int retval; | 427 | int retval; |
429 | 428 | ||
430 | if (hcd->state != HC_STATE_SUSPENDED) { | 429 | if (HCD_RH_RUNNING(hcd)) { |
431 | dev_dbg(dev, "can't resume, not suspended!\n"); | 430 | dev_dbg(dev, "can't resume, not suspended!\n"); |
432 | return 0; | 431 | return 0; |
433 | } | 432 | } |
@@ -442,7 +441,7 @@ static int resume_common(struct device *dev, int event) | |||
442 | 441 | ||
443 | clear_bit(HCD_FLAG_SAW_IRQ, &hcd->flags); | 442 | clear_bit(HCD_FLAG_SAW_IRQ, &hcd->flags); |
444 | 443 | ||
445 | if (hcd->driver->pci_resume) { | 444 | if (hcd->driver->pci_resume && !HCD_DEAD(hcd)) { |
446 | if (event != PM_EVENT_AUTO_RESUME) | 445 | if (event != PM_EVENT_AUTO_RESUME) |
447 | wait_for_companions(pci_dev, hcd); | 446 | wait_for_companions(pci_dev, hcd); |
448 | 447 | ||
@@ -475,10 +474,10 @@ static int hcd_pci_suspend_noirq(struct device *dev) | |||
475 | 474 | ||
476 | pci_save_state(pci_dev); | 475 | pci_save_state(pci_dev); |
477 | 476 | ||
478 | /* If the root hub is HALTed rather than SUSPENDed, | 477 | /* If the root hub is dead rather than suspended, |
479 | * disallow remote wakeup. | 478 | * disallow remote wakeup. |
480 | */ | 479 | */ |
481 | if (hcd->state == HC_STATE_HALT) | 480 | if (HCD_DEAD(hcd)) |
482 | device_set_wakeup_enable(dev, 0); | 481 | device_set_wakeup_enable(dev, 0); |
483 | dev_dbg(dev, "wakeup: %d\n", device_may_wakeup(dev)); | 482 | dev_dbg(dev, "wakeup: %d\n", device_may_wakeup(dev)); |
484 | 483 | ||
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 24765fd6cf1..e7d0c4571bb 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -983,7 +983,7 @@ static int register_root_hub(struct usb_hcd *hcd) | |||
983 | spin_unlock_irq (&hcd_root_hub_lock); | 983 | spin_unlock_irq (&hcd_root_hub_lock); |
984 | 984 | ||
985 | /* Did the HC die before the root hub was registered? */ | 985 | /* Did the HC die before the root hub was registered? */ |
986 | if (hcd->state == HC_STATE_HALT) | 986 | if (HCD_DEAD(hcd) || hcd->state == HC_STATE_HALT) |
987 | usb_hc_died (hcd); /* This time clean up */ | 987 | usb_hc_died (hcd); /* This time clean up */ |
988 | } | 988 | } |
989 | 989 | ||
@@ -1089,13 +1089,10 @@ int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb) | |||
1089 | * Check the host controller's state and add the URB to the | 1089 | * Check the host controller's state and add the URB to the |
1090 | * endpoint's queue. | 1090 | * endpoint's queue. |
1091 | */ | 1091 | */ |
1092 | switch (hcd->state) { | 1092 | if (HCD_RH_RUNNING(hcd)) { |
1093 | case HC_STATE_RUNNING: | ||
1094 | case HC_STATE_RESUMING: | ||
1095 | urb->unlinked = 0; | 1093 | urb->unlinked = 0; |
1096 | list_add_tail(&urb->urb_list, &urb->ep->urb_list); | 1094 | list_add_tail(&urb->urb_list, &urb->ep->urb_list); |
1097 | break; | 1095 | } else { |
1098 | default: | ||
1099 | rc = -ESHUTDOWN; | 1096 | rc = -ESHUTDOWN; |
1100 | goto done; | 1097 | goto done; |
1101 | } | 1098 | } |
@@ -1931,7 +1928,7 @@ int usb_hcd_get_frame_number (struct usb_device *udev) | |||
1931 | { | 1928 | { |
1932 | struct usb_hcd *hcd = bus_to_hcd(udev->bus); | 1929 | struct usb_hcd *hcd = bus_to_hcd(udev->bus); |
1933 | 1930 | ||
1934 | if (!HC_IS_RUNNING (hcd->state)) | 1931 | if (!HCD_RH_RUNNING(hcd)) |
1935 | return -ESHUTDOWN; | 1932 | return -ESHUTDOWN; |
1936 | return hcd->driver->get_frame_number (hcd); | 1933 | return hcd->driver->get_frame_number (hcd); |
1937 | } | 1934 | } |
@@ -1948,9 +1945,15 @@ int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg) | |||
1948 | 1945 | ||
1949 | dev_dbg(&rhdev->dev, "bus %s%s\n", | 1946 | dev_dbg(&rhdev->dev, "bus %s%s\n", |
1950 | (msg.event & PM_EVENT_AUTO ? "auto-" : ""), "suspend"); | 1947 | (msg.event & PM_EVENT_AUTO ? "auto-" : ""), "suspend"); |
1948 | if (HCD_DEAD(hcd)) { | ||
1949 | dev_dbg(&rhdev->dev, "skipped %s of dead bus\n", "suspend"); | ||
1950 | return 0; | ||
1951 | } | ||
1952 | |||
1951 | if (!hcd->driver->bus_suspend) { | 1953 | if (!hcd->driver->bus_suspend) { |
1952 | status = -ENOENT; | 1954 | status = -ENOENT; |
1953 | } else { | 1955 | } else { |
1956 | clear_bit(HCD_FLAG_RH_RUNNING, &hcd->flags); | ||
1954 | hcd->state = HC_STATE_QUIESCING; | 1957 | hcd->state = HC_STATE_QUIESCING; |
1955 | status = hcd->driver->bus_suspend(hcd); | 1958 | status = hcd->driver->bus_suspend(hcd); |
1956 | } | 1959 | } |
@@ -1958,7 +1961,12 @@ int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg) | |||
1958 | usb_set_device_state(rhdev, USB_STATE_SUSPENDED); | 1961 | usb_set_device_state(rhdev, USB_STATE_SUSPENDED); |
1959 | hcd->state = HC_STATE_SUSPENDED; | 1962 | hcd->state = HC_STATE_SUSPENDED; |
1960 | } else { | 1963 | } else { |
1961 | hcd->state = old_state; | 1964 | spin_lock_irq(&hcd_root_hub_lock); |
1965 | if (!HCD_DEAD(hcd)) { | ||
1966 | set_bit(HCD_FLAG_RH_RUNNING, &hcd->flags); | ||
1967 | hcd->state = old_state; | ||
1968 | } | ||
1969 | spin_unlock_irq(&hcd_root_hub_lock); | ||
1962 | dev_dbg(&rhdev->dev, "bus %s fail, err %d\n", | 1970 | dev_dbg(&rhdev->dev, "bus %s fail, err %d\n", |
1963 | "suspend", status); | 1971 | "suspend", status); |
1964 | } | 1972 | } |
@@ -1973,9 +1981,13 @@ int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg) | |||
1973 | 1981 | ||
1974 | dev_dbg(&rhdev->dev, "usb %s%s\n", | 1982 | dev_dbg(&rhdev->dev, "usb %s%s\n", |
1975 | (msg.event & PM_EVENT_AUTO ? "auto-" : ""), "resume"); | 1983 | (msg.event & PM_EVENT_AUTO ? "auto-" : ""), "resume"); |
1984 | if (HCD_DEAD(hcd)) { | ||
1985 | dev_dbg(&rhdev->dev, "skipped %s of dead bus\n", "resume"); | ||
1986 | return 0; | ||
1987 | } | ||
1976 | if (!hcd->driver->bus_resume) | 1988 | if (!hcd->driver->bus_resume) |
1977 | return -ENOENT; | 1989 | return -ENOENT; |
1978 | if (hcd->state == HC_STATE_RUNNING) | 1990 | if (HCD_RH_RUNNING(hcd)) |
1979 | return 0; | 1991 | return 0; |
1980 | 1992 | ||
1981 | hcd->state = HC_STATE_RESUMING; | 1993 | hcd->state = HC_STATE_RESUMING; |
@@ -1984,10 +1996,15 @@ int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg) | |||
1984 | if (status == 0) { | 1996 | if (status == 0) { |
1985 | /* TRSMRCY = 10 msec */ | 1997 | /* TRSMRCY = 10 msec */ |
1986 | msleep(10); | 1998 | msleep(10); |
1987 | usb_set_device_state(rhdev, rhdev->actconfig | 1999 | spin_lock_irq(&hcd_root_hub_lock); |
1988 | ? USB_STATE_CONFIGURED | 2000 | if (!HCD_DEAD(hcd)) { |
1989 | : USB_STATE_ADDRESS); | 2001 | usb_set_device_state(rhdev, rhdev->actconfig |
1990 | hcd->state = HC_STATE_RUNNING; | 2002 | ? USB_STATE_CONFIGURED |
2003 | : USB_STATE_ADDRESS); | ||
2004 | set_bit(HCD_FLAG_RH_RUNNING, &hcd->flags); | ||
2005 | hcd->state = HC_STATE_RUNNING; | ||
2006 | } | ||
2007 | spin_unlock_irq(&hcd_root_hub_lock); | ||
1991 | } else { | 2008 | } else { |
1992 | hcd->state = old_state; | 2009 | hcd->state = old_state; |
1993 | dev_dbg(&rhdev->dev, "bus %s fail, err %d\n", | 2010 | dev_dbg(&rhdev->dev, "bus %s fail, err %d\n", |
@@ -2098,7 +2115,7 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd) | |||
2098 | */ | 2115 | */ |
2099 | local_irq_save(flags); | 2116 | local_irq_save(flags); |
2100 | 2117 | ||
2101 | if (unlikely(hcd->state == HC_STATE_HALT || !HCD_HW_ACCESSIBLE(hcd))) { | 2118 | if (unlikely(HCD_DEAD(hcd) || !HCD_HW_ACCESSIBLE(hcd))) { |
2102 | rc = IRQ_NONE; | 2119 | rc = IRQ_NONE; |
2103 | } else if (hcd->driver->irq(hcd) == IRQ_NONE) { | 2120 | } else if (hcd->driver->irq(hcd) == IRQ_NONE) { |
2104 | rc = IRQ_NONE; | 2121 | rc = IRQ_NONE; |
@@ -2132,6 +2149,8 @@ void usb_hc_died (struct usb_hcd *hcd) | |||
2132 | dev_err (hcd->self.controller, "HC died; cleaning up\n"); | 2149 | dev_err (hcd->self.controller, "HC died; cleaning up\n"); |
2133 | 2150 | ||
2134 | spin_lock_irqsave (&hcd_root_hub_lock, flags); | 2151 | spin_lock_irqsave (&hcd_root_hub_lock, flags); |
2152 | clear_bit(HCD_FLAG_RH_RUNNING, &hcd->flags); | ||
2153 | set_bit(HCD_FLAG_DEAD, &hcd->flags); | ||
2135 | if (hcd->rh_registered) { | 2154 | if (hcd->rh_registered) { |
2136 | clear_bit(HCD_FLAG_POLL_RH, &hcd->flags); | 2155 | clear_bit(HCD_FLAG_POLL_RH, &hcd->flags); |
2137 | 2156 | ||
@@ -2274,6 +2293,12 @@ int usb_add_hcd(struct usb_hcd *hcd, | |||
2274 | */ | 2293 | */ |
2275 | device_init_wakeup(&rhdev->dev, 1); | 2294 | device_init_wakeup(&rhdev->dev, 1); |
2276 | 2295 | ||
2296 | /* HCD_FLAG_RH_RUNNING doesn't matter until the root hub is | ||
2297 | * registered. But since the controller can die at any time, | ||
2298 | * let's initialize the flag before touching the hardware. | ||
2299 | */ | ||
2300 | set_bit(HCD_FLAG_RH_RUNNING, &hcd->flags); | ||
2301 | |||
2277 | /* "reset" is misnamed; its role is now one-time init. the controller | 2302 | /* "reset" is misnamed; its role is now one-time init. the controller |
2278 | * should already have been reset (and boot firmware kicked off etc). | 2303 | * should already have been reset (and boot firmware kicked off etc). |
2279 | */ | 2304 | */ |
@@ -2341,6 +2366,7 @@ int usb_add_hcd(struct usb_hcd *hcd, | |||
2341 | return retval; | 2366 | return retval; |
2342 | 2367 | ||
2343 | error_create_attr_group: | 2368 | error_create_attr_group: |
2369 | clear_bit(HCD_FLAG_RH_RUNNING, &hcd->flags); | ||
2344 | if (HC_IS_RUNNING(hcd->state)) | 2370 | if (HC_IS_RUNNING(hcd->state)) |
2345 | hcd->state = HC_STATE_QUIESCING; | 2371 | hcd->state = HC_STATE_QUIESCING; |
2346 | spin_lock_irq(&hcd_root_hub_lock); | 2372 | spin_lock_irq(&hcd_root_hub_lock); |
@@ -2393,6 +2419,7 @@ void usb_remove_hcd(struct usb_hcd *hcd) | |||
2393 | usb_get_dev(rhdev); | 2419 | usb_get_dev(rhdev); |
2394 | sysfs_remove_group(&rhdev->dev.kobj, &usb_bus_attr_group); | 2420 | sysfs_remove_group(&rhdev->dev.kobj, &usb_bus_attr_group); |
2395 | 2421 | ||
2422 | clear_bit(HCD_FLAG_RH_RUNNING, &hcd->flags); | ||
2396 | if (HC_IS_RUNNING (hcd->state)) | 2423 | if (HC_IS_RUNNING (hcd->state)) |
2397 | hcd->state = HC_STATE_QUIESCING; | 2424 | hcd->state = HC_STATE_QUIESCING; |
2398 | 2425 | ||