Commit be3cbc5f authored by David Brownell's avatar David Brownell Committed by Greg Kroah-Hartman

[PATCH] UHCI: various updates

This patch (as705) contains a small set of updates for uhci-hcd written
mostly by Dave Brownell:

  * Root hub suspend messages come out labeled as root hub messages;
    PCI messages should only come out when the pci device suspends.

  * Rename the reset() method to better match its init() role

  * Behave more like the other HCDs by returning -ESHUTDOWN for root-hub
    suspend/resume errors.

  * When an URB fails, associate the message with the usb device not
    the host controller (it still hides endpoint and direction)

From: David Brownell <david-b@pacbell.net>
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent ae671813
...@@ -124,8 +124,9 @@ static void hc_died(struct uhci_hcd *uhci) ...@@ -124,8 +124,9 @@ static void hc_died(struct uhci_hcd *uhci)
} }
/* /*
* Initialize a controller that was newly discovered or has just been * Initialize a controller that was newly discovered or has lost power
* resumed. In either case we can't be sure of its previous state. * or otherwise been reset while it was suspended. In none of these cases
* can we be sure of its previous state.
*/ */
static void check_and_reset_hc(struct uhci_hcd *uhci) static void check_and_reset_hc(struct uhci_hcd *uhci)
{ {
...@@ -198,7 +199,8 @@ __acquires(uhci->lock) ...@@ -198,7 +199,8 @@ __acquires(uhci->lock)
int int_enable; int int_enable;
auto_stop = (new_state == UHCI_RH_AUTO_STOPPED); auto_stop = (new_state == UHCI_RH_AUTO_STOPPED);
dev_dbg(uhci_dev(uhci), "%s%s\n", __FUNCTION__, dev_dbg(&uhci_to_hcd(uhci)->self.root_hub->dev,
"%s%s\n", __FUNCTION__,
(auto_stop ? " (auto-stop)" : "")); (auto_stop ? " (auto-stop)" : ""));
/* If we get a suspend request when we're already auto-stopped /* If we get a suspend request when we're already auto-stopped
...@@ -236,7 +238,8 @@ __acquires(uhci->lock) ...@@ -236,7 +238,8 @@ __acquires(uhci->lock)
return; return;
} }
if (!(inw(uhci->io_addr + USBSTS) & USBSTS_HCH)) if (!(inw(uhci->io_addr + USBSTS) & USBSTS_HCH))
dev_warn(uhci_dev(uhci), "Controller not stopped yet!\n"); dev_warn(&uhci_to_hcd(uhci)->self.root_hub->dev,
"Controller not stopped yet!\n");
uhci_get_current_frame_number(uhci); uhci_get_current_frame_number(uhci);
...@@ -268,7 +271,8 @@ static void wakeup_rh(struct uhci_hcd *uhci) ...@@ -268,7 +271,8 @@ static void wakeup_rh(struct uhci_hcd *uhci)
__releases(uhci->lock) __releases(uhci->lock)
__acquires(uhci->lock) __acquires(uhci->lock)
{ {
dev_dbg(uhci_dev(uhci), "%s%s\n", __FUNCTION__, dev_dbg(&uhci_to_hcd(uhci)->self.root_hub->dev,
"%s%s\n", __FUNCTION__,
uhci->rh_state == UHCI_RH_AUTO_STOPPED ? uhci->rh_state == UHCI_RH_AUTO_STOPPED ?
" (auto-start)" : ""); " (auto-start)" : "");
...@@ -406,7 +410,7 @@ static void release_uhci(struct uhci_hcd *uhci) ...@@ -406,7 +410,7 @@ static void release_uhci(struct uhci_hcd *uhci)
uhci->frame, uhci->frame_dma_handle); uhci->frame, uhci->frame_dma_handle);
} }
static int uhci_reset(struct usb_hcd *hcd) static int uhci_init(struct usb_hcd *hcd)
{ {
struct uhci_hcd *uhci = hcd_to_uhci(hcd); struct uhci_hcd *uhci = hcd_to_uhci(hcd);
unsigned io_size = (unsigned) hcd->rsrc_len; unsigned io_size = (unsigned) hcd->rsrc_len;
...@@ -672,12 +676,15 @@ static void uhci_stop(struct usb_hcd *hcd) ...@@ -672,12 +676,15 @@ static void uhci_stop(struct usb_hcd *hcd)
static int uhci_rh_suspend(struct usb_hcd *hcd) static int uhci_rh_suspend(struct usb_hcd *hcd)
{ {
struct uhci_hcd *uhci = hcd_to_uhci(hcd); struct uhci_hcd *uhci = hcd_to_uhci(hcd);
int rc = 0;
spin_lock_irq(&uhci->lock); spin_lock_irq(&uhci->lock);
if (!uhci->hc_inaccessible) /* Not dead */ if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))
rc = -ESHUTDOWN;
else if (!uhci->hc_inaccessible)
suspend_rh(uhci, UHCI_RH_SUSPENDED); suspend_rh(uhci, UHCI_RH_SUSPENDED);
spin_unlock_irq(&uhci->lock); spin_unlock_irq(&uhci->lock);
return 0; return rc;
} }
static int uhci_rh_resume(struct usb_hcd *hcd) static int uhci_rh_resume(struct usb_hcd *hcd)
...@@ -686,13 +693,10 @@ static int uhci_rh_resume(struct usb_hcd *hcd) ...@@ -686,13 +693,10 @@ static int uhci_rh_resume(struct usb_hcd *hcd)
int rc = 0; int rc = 0;
spin_lock_irq(&uhci->lock); spin_lock_irq(&uhci->lock);
if (uhci->hc_inaccessible) { if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
if (uhci->rh_state == UHCI_RH_SUSPENDED) { dev_warn(&hcd->self.root_hub->dev, "HC isn't running!\n");
dev_warn(uhci_dev(uhci), "HC isn't running!\n"); rc = -ESHUTDOWN;
rc = -ENODEV; } else if (!uhci->hc_inaccessible)
}
/* Otherwise the HC is dead */
} else
wakeup_rh(uhci); wakeup_rh(uhci);
spin_unlock_irq(&uhci->lock); spin_unlock_irq(&uhci->lock);
return rc; return rc;
...@@ -746,6 +750,7 @@ static int uhci_resume(struct usb_hcd *hcd) ...@@ -746,6 +750,7 @@ static int uhci_resume(struct usb_hcd *hcd)
if (uhci->rh_state == UHCI_RH_RESET) /* Dead */ if (uhci->rh_state == UHCI_RH_RESET) /* Dead */
return 0; return 0;
spin_lock_irq(&uhci->lock); spin_lock_irq(&uhci->lock);
/* FIXME: Disable non-PME# remote wakeup? */ /* FIXME: Disable non-PME# remote wakeup? */
...@@ -828,7 +833,7 @@ static const struct hc_driver uhci_driver = { ...@@ -828,7 +833,7 @@ static const struct hc_driver uhci_driver = {
.flags = HCD_USB11, .flags = HCD_USB11,
/* Basic lifecycle operations */ /* Basic lifecycle operations */
.reset = uhci_reset, .reset = uhci_init,
.start = uhci_start, .start = uhci_start,
#ifdef CONFIG_PM #ifdef CONFIG_PM
.suspend = uhci_suspend, .suspend = uhci_suspend,
......
...@@ -910,7 +910,7 @@ static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) ...@@ -910,7 +910,7 @@ static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb)
uhci_packetout(td_token(td))); uhci_packetout(td_token(td)));
if ((debug == 1 && ret != -EPIPE) || debug > 1) { if ((debug == 1 && ret != -EPIPE) || debug > 1) {
/* Some debugging code */ /* Some debugging code */
dev_dbg(uhci_dev(uhci), dev_dbg(&urb->dev->dev,
"%s: failed with status %x\n", "%s: failed with status %x\n",
__FUNCTION__, status); __FUNCTION__, status);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment