diff options
| -rw-r--r-- | drivers/usb/host/ohci-dbg.c | 14 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-hcd.c | 6 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-pci.c | 8 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-q.c | 17 |
4 files changed, 29 insertions, 16 deletions
diff --git a/drivers/usb/host/ohci-dbg.c b/drivers/usb/host/ohci-dbg.c index 8d2a7526ab9c..3918eb3f2bbf 100644 --- a/drivers/usb/host/ohci-dbg.c +++ b/drivers/usb/host/ohci-dbg.c @@ -617,7 +617,17 @@ show_registers (struct class_device *class_dev, char *buf) /* dump driver info, then registers in spec order */ ohci_dbg_sw (ohci, &next, &size, - "%s version " DRIVER_VERSION "\n", hcd_name); + "bus %s, device %s\n" + "%s version " DRIVER_VERSION "\n", + hcd->self.controller->bus->name, + hcd->self.controller->bus_id, + hcd_name); + + if (bus->controller->power.power_state) { + size -= scnprintf (next, size, + "SUSPENDED (no register access)\n"); + goto done; + } ohci_dump_status(ohci, &next, &size); @@ -657,8 +667,8 @@ show_registers (struct class_device *class_dev, char *buf) /* roothub */ ohci_dump_roothub (ohci, 1, &next, &size); +done: spin_unlock_irqrestore (&ohci->lock, flags); - return PAGE_SIZE - size; } static CLASS_DEVICE_ATTR (registers, S_IRUGO, show_registers, NULL); diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 6cc15e1acf0f..ace3b321ee5f 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c @@ -611,11 +611,13 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd, struct pt_regs *ptregs) ohci_dump (ohci, 1); hc_reset (ohci); } - + if (ints & OHCI_INTR_WDH) { if (HCD_IS_RUNNING(hcd->state)) writel (OHCI_INTR_WDH, ®s->intrdisable); - dl_done_list (ohci, dl_reverse_done_list (ohci), ptregs); + spin_lock (&ohci->lock); + dl_done_list (ohci, ptregs); + spin_unlock (&ohci->lock); if (HCD_IS_RUNNING(hcd->state)) writel (OHCI_INTR_WDH, ®s->intrenable); } diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c index ec22fbc2e46a..3a3003422c04 100644 --- a/drivers/usb/host/ohci-pci.c +++ b/drivers/usb/host/ohci-pci.c @@ -281,6 +281,11 @@ restart: writel (OHCI_INTR_WDH, &ohci->regs->intrdisable); (void) readl (&ohci->regs->intrdisable); + + /* Check for a pending done list */ + if (ohci->hcca->done_head) + dl_done_list (ohci, NULL); + spin_unlock_irq (&ohci->lock); #ifdef CONFIG_PMAC_PBOOK @@ -288,9 +293,6 @@ restart: enable_irq (to_pci_dev(hcd->self.controller)->irq); #endif - /* Check for a pending done list */ - if (ohci->hcca->done_head) - dl_done_list (ohci, dl_reverse_done_list (ohci), NULL); writel (OHCI_INTR_WDH, &ohci->regs->intrenable); /* assume there are TDs on the bulk and control lists */ diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c index 518f7419c652..f103b15b50aa 100644 --- a/drivers/usb/host/ohci-q.c +++ b/drivers/usb/host/ohci-q.c @@ -170,6 +170,9 @@ static int ed_schedule (struct ohci_hcd *ohci, struct ed *ed) { int branch; + if (ohci->hcd.state == USB_STATE_QUIESCING) + return -EAGAIN; + ed->state = ED_OPER; ed->ed_prev = 0; ed->ed_next = 0; @@ -867,9 +870,6 @@ static struct td *dl_reverse_done_list (struct ohci_hcd *ohci) u32 td_dma; struct td *td_rev = NULL; struct td *td = NULL; - unsigned long flags; - - spin_lock_irqsave (&ohci->lock, flags); td_dma = le32_to_cpup (&ohci->hcca->done_head); ohci->hcca->done_head = 0; @@ -901,7 +901,6 @@ static struct td *dl_reverse_done_list (struct ohci_hcd *ohci) td_rev = td; td_dma = le32_to_cpup (&td->hwNextTD); } - spin_unlock_irqrestore (&ohci->lock, flags); return td_rev; } @@ -1015,7 +1014,9 @@ rescan_this: } /* maybe reenable control and bulk lists */ - if (HCD_IS_RUNNING(ohci->hcd.state) && !ohci->ed_rm_list) { + if (HCD_IS_RUNNING(ohci->hcd.state) + && ohci->hcd.state != USB_STATE_QUIESCING + && !ohci->ed_rm_list) { u32 command = 0, control = 0; if (ohci->ed_controltail) { @@ -1055,11 +1056,10 @@ rescan_this: * scanning the (re-reversed) donelist as this does. */ static void -dl_done_list (struct ohci_hcd *ohci, struct td *td, struct pt_regs *regs) +dl_done_list (struct ohci_hcd *ohci, struct pt_regs *regs) { - unsigned long flags; + struct td *td = dl_reverse_done_list (ohci); - spin_lock_irqsave (&ohci->lock, flags); while (td) { struct td *td_next = td->next_dl_td; struct urb *urb = td->urb; @@ -1100,5 +1100,4 @@ dl_done_list (struct ohci_hcd *ohci, struct td *td, struct pt_regs *regs) td = td_next; } - spin_unlock_irqrestore (&ohci->lock, flags); } |
