USB: EHCI hooks for high speed electrical tests
EHCI hooks for high speed electrical tests of the root hub ports. The expectation is that a usermode program actually triggers the test, making the same control request it would make for an external hub. Tests for peripheral upstream ports would issue a different request. In all cases, the hardware needs re-initialization before it could be used "normally" again (e.g. unplug/replug, rmmod/modprobe). Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
1f26e28d3e
commit
f0d7f27351
@@ -319,6 +319,7 @@ static int ehci_hub_control (
|
|||||||
u32 temp, status;
|
u32 temp, status;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
unsigned selector;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR.
|
* FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR.
|
||||||
@@ -506,6 +507,8 @@ static int ehci_hub_control (
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SetPortFeature:
|
case SetPortFeature:
|
||||||
|
selector = wIndex >> 8;
|
||||||
|
wIndex &= 0xff;
|
||||||
if (!wIndex || wIndex > ports)
|
if (!wIndex || wIndex > ports)
|
||||||
goto error;
|
goto error;
|
||||||
wIndex--;
|
wIndex--;
|
||||||
@@ -559,6 +562,22 @@ static int ehci_hub_control (
|
|||||||
}
|
}
|
||||||
writel (temp, &ehci->regs->port_status [wIndex]);
|
writel (temp, &ehci->regs->port_status [wIndex]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* For downstream facing ports (these): one hub port is put
|
||||||
|
* into test mode according to USB2 11.24.2.13, then the hub
|
||||||
|
* must be reset (which for root hub now means rmmod+modprobe,
|
||||||
|
* or else system reboot). See EHCI 2.3.9 and 4.14 for info
|
||||||
|
* about the EHCI-specific stuff.
|
||||||
|
*/
|
||||||
|
case USB_PORT_FEAT_TEST:
|
||||||
|
if (!selector || selector > 5)
|
||||||
|
goto error;
|
||||||
|
ehci_quiesce(ehci);
|
||||||
|
ehci_halt(ehci);
|
||||||
|
temp |= selector << 16;
|
||||||
|
writel (temp, &ehci->regs->port_status [wIndex]);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user