aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/ohci-hub.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/host/ohci-hub.c')
-rw-r--r--drivers/usb/host/ohci-hub.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c
index 2441642cb7b4..216c9c9d4d6d 100644
--- a/drivers/usb/host/ohci-hub.c
+++ b/drivers/usb/host/ohci-hub.c
@@ -1,9 +1,9 @@
1/* 1/*
2 * OHCI HCD (Host Controller Driver) for USB. 2 * OHCI HCD (Host Controller Driver) for USB.
3 * 3 *
4 * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> 4 * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
5 * (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net> 5 * (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net>
6 * 6 *
7 * This file is licenced under GPL 7 * This file is licenced under GPL
8 */ 8 */
9 9
@@ -23,13 +23,13 @@
23 (temp & RH_PS_PSSC) ? " PSSC" : "", \ 23 (temp & RH_PS_PSSC) ? " PSSC" : "", \
24 (temp & RH_PS_PESC) ? " PESC" : "", \ 24 (temp & RH_PS_PESC) ? " PESC" : "", \
25 (temp & RH_PS_CSC) ? " CSC" : "", \ 25 (temp & RH_PS_CSC) ? " CSC" : "", \
26 \ 26 \
27 (temp & RH_PS_LSDA) ? " LSDA" : "", \ 27 (temp & RH_PS_LSDA) ? " LSDA" : "", \
28 (temp & RH_PS_PPS) ? " PPS" : "", \ 28 (temp & RH_PS_PPS) ? " PPS" : "", \
29 (temp & RH_PS_PRS) ? " PRS" : "", \ 29 (temp & RH_PS_PRS) ? " PRS" : "", \
30 (temp & RH_PS_POCI) ? " POCI" : "", \ 30 (temp & RH_PS_POCI) ? " POCI" : "", \
31 (temp & RH_PS_PSS) ? " PSS" : "", \ 31 (temp & RH_PS_PSS) ? " PSS" : "", \
32 \ 32 \
33 (temp & RH_PS_PES) ? " PES" : "", \ 33 (temp & RH_PS_PES) ? " PES" : "", \
34 (temp & RH_PS_CCS) ? " CCS" : "" \ 34 (temp & RH_PS_CCS) ? " CCS" : "" \
35 ); 35 );
@@ -484,7 +484,7 @@ ohci_hub_descriptor (
484 temp = 0; 484 temp = 0;
485 if (rh & RH_A_NPS) /* no power switching? */ 485 if (rh & RH_A_NPS) /* no power switching? */
486 temp |= 0x0002; 486 temp |= 0x0002;
487 if (rh & RH_A_PSM) /* per-port power switching? */ 487 if (rh & RH_A_PSM) /* per-port power switching? */
488 temp |= 0x0001; 488 temp |= 0x0001;
489 if (rh & RH_A_NOCP) /* no overcurrent reporting? */ 489 if (rh & RH_A_NOCP) /* no overcurrent reporting? */
490 temp |= 0x0010; 490 temp |= 0x0010;
@@ -555,7 +555,7 @@ static void start_hnp(struct ohci_hcd *ohci);
555#define tick_before(t1,t2) ((s16)(((s16)(t1))-((s16)(t2))) < 0) 555#define tick_before(t1,t2) ((s16)(((s16)(t1))-((s16)(t2))) < 0)
556 556
557/* called from some task, normally khubd */ 557/* called from some task, normally khubd */
558static inline void root_port_reset (struct ohci_hcd *ohci, unsigned port) 558static inline int root_port_reset (struct ohci_hcd *ohci, unsigned port)
559{ 559{
560 __hc32 __iomem *portstat = &ohci->regs->roothub.portstatus [port]; 560 __hc32 __iomem *portstat = &ohci->regs->roothub.portstatus [port];
561 u32 temp; 561 u32 temp;
@@ -570,10 +570,13 @@ static inline void root_port_reset (struct ohci_hcd *ohci, unsigned port)
570 /* spin until any current reset finishes */ 570 /* spin until any current reset finishes */
571 for (;;) { 571 for (;;) {
572 temp = ohci_readl (ohci, portstat); 572 temp = ohci_readl (ohci, portstat);
573 /* handle e.g. CardBus eject */
574 if (temp == ~(u32)0)
575 return -ESHUTDOWN;
573 if (!(temp & RH_PS_PRS)) 576 if (!(temp & RH_PS_PRS))
574 break; 577 break;
575 udelay (500); 578 udelay (500);
576 } 579 }
577 580
578 if (!(temp & RH_PS_CCS)) 581 if (!(temp & RH_PS_CCS))
579 break; 582 break;
@@ -586,6 +589,8 @@ static inline void root_port_reset (struct ohci_hcd *ohci, unsigned port)
586 now = ohci_readl(ohci, &ohci->regs->fmnumber); 589 now = ohci_readl(ohci, &ohci->regs->fmnumber);
587 } while (tick_before(now, reset_done)); 590 } while (tick_before(now, reset_done));
588 /* caller synchronizes using PRSC */ 591 /* caller synchronizes using PRSC */
592
593 return 0;
589} 594}
590 595
591static int ohci_hub_control ( 596static int ohci_hub_control (
@@ -702,7 +707,7 @@ static int ohci_hub_control (
702 &ohci->regs->roothub.portstatus [wIndex]); 707 &ohci->regs->roothub.portstatus [wIndex]);
703 break; 708 break;
704 case USB_PORT_FEAT_RESET: 709 case USB_PORT_FEAT_RESET:
705 root_port_reset (ohci, wIndex); 710 retval = root_port_reset (ohci, wIndex);
706 break; 711 break;
707 default: 712 default:
708 goto error; 713 goto error;