mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/UsbBus: reduce the port status polling before port reset
This change is used to remove the port status polling in port reset functions. Why it's needed is because: 1) The same polling on same port has taken place prior to this removed one. See UsbEnumeratePort()->GetPortStatus(). So this polling in UsbEnumerateNewDev()->ResetPort() is redundant. 2) EDKII Xhci driver hooks all GetPortStatus() operations. If we don't remove this one, XHCI driver's XhcPollPortStatusChange() may enter twice in reset process and wrongly think the device is unplugged. Cc: Star Zeng <star.zeng@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Feng Tian <feng.tian@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com>
This commit is contained in:
parent
698554923f
commit
bf4808d644
|
@ -643,6 +643,7 @@ UsbFindChild (
|
||||||
|
|
||||||
@param HubIf The HUB that has the device connected.
|
@param HubIf The HUB that has the device connected.
|
||||||
@param Port The port index of the hub (started with zero).
|
@param Port The port index of the hub (started with zero).
|
||||||
|
@param ResetIsNeeded The boolean to control whether skip the reset of the port.
|
||||||
|
|
||||||
@retval EFI_SUCCESS The device is enumerated (added or removed).
|
@retval EFI_SUCCESS The device is enumerated (added or removed).
|
||||||
@retval EFI_OUT_OF_RESOURCES Failed to allocate resource for the device.
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate resource for the device.
|
||||||
|
@ -652,7 +653,8 @@ UsbFindChild (
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
UsbEnumerateNewDev (
|
UsbEnumerateNewDev (
|
||||||
IN USB_INTERFACE *HubIf,
|
IN USB_INTERFACE *HubIf,
|
||||||
IN UINT8 Port
|
IN UINT8 Port,
|
||||||
|
IN BOOLEAN ResetIsNeeded
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
USB_BUS *Bus;
|
USB_BUS *Bus;
|
||||||
|
@ -677,16 +679,18 @@ UsbEnumerateNewDev (
|
||||||
// and the hub is a EHCI root hub, ResetPort will release
|
// and the hub is a EHCI root hub, ResetPort will release
|
||||||
// the device to its companion UHCI and return an error.
|
// the device to its companion UHCI and return an error.
|
||||||
//
|
//
|
||||||
Status = HubApi->ResetPort (HubIf, Port);
|
if (ResetIsNeeded) {
|
||||||
|
Status = HubApi->ResetPort (HubIf, Port);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((EFI_D_ERROR, "UsbEnumerateNewDev: failed to reset port %d - %r\n", Port, Status));
|
DEBUG ((EFI_D_ERROR, "UsbEnumerateNewDev: failed to reset port %d - %r\n", Port, Status));
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
}
|
||||||
|
DEBUG (( EFI_D_INFO, "UsbEnumerateNewDev: hub port %d is reset\n", Port));
|
||||||
|
} else {
|
||||||
|
DEBUG (( EFI_D_INFO, "UsbEnumerateNewDev: hub port %d reset is skipped\n", Port));
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG (( EFI_D_INFO, "UsbEnumerateNewDev: hub port %d is reset\n", Port));
|
|
||||||
|
|
||||||
Child = UsbCreateDevice (HubIf, Port);
|
Child = UsbCreateDevice (HubIf, Port);
|
||||||
|
|
||||||
if (Child == NULL) {
|
if (Child == NULL) {
|
||||||
|
@ -964,7 +968,11 @@ UsbEnumeratePort (
|
||||||
// Now, new device connected, enumerate and configure the device
|
// Now, new device connected, enumerate and configure the device
|
||||||
//
|
//
|
||||||
DEBUG (( EFI_D_INFO, "UsbEnumeratePort: new device connected at port %d\n", Port));
|
DEBUG (( EFI_D_INFO, "UsbEnumeratePort: new device connected at port %d\n", Port));
|
||||||
Status = UsbEnumerateNewDev (HubIf, Port);
|
if (USB_BIT_IS_SET (PortState.PortChangeStatus, USB_PORT_STAT_C_RESET)) {
|
||||||
|
Status = UsbEnumerateNewDev (HubIf, Port, FALSE);
|
||||||
|
} else {
|
||||||
|
Status = UsbEnumerateNewDev (HubIf, Port, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
DEBUG (( EFI_D_INFO, "UsbEnumeratePort: device disconnected event on port %d\n", Port));
|
DEBUG (( EFI_D_INFO, "UsbEnumeratePort: device disconnected event on port %d\n", Port));
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
Unified interface for RootHub and Hub.
|
Unified interface for RootHub and Hub.
|
||||||
|
|
||||||
Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -968,15 +968,6 @@ UsbHubResetPort (
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = UsbHubGetPortStatus (HubIf, Port, &PortState);
|
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
return Status;
|
|
||||||
} else if (USB_BIT_IS_SET (PortState.PortChangeStatus, USB_PORT_STAT_C_RESET)) {
|
|
||||||
DEBUG (( EFI_D_INFO, "UsbHubResetPort: skip reset on hub %p port %d\n", HubIf, Port));
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = UsbHubSetPortFeature (HubIf, Port, (EFI_USB_PORT_FEATURE) USB_HUB_PORT_RESET);
|
Status = UsbHubSetPortFeature (HubIf, Port, (EFI_USB_PORT_FEATURE) USB_HUB_PORT_RESET);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
|
@ -1282,15 +1273,6 @@ UsbRootHubResetPort (
|
||||||
//
|
//
|
||||||
Bus = RootIf->Device->Bus;
|
Bus = RootIf->Device->Bus;
|
||||||
|
|
||||||
Status = UsbHcGetRootHubPortStatus (Bus, Port, &PortState);
|
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
return Status;
|
|
||||||
} else if (USB_BIT_IS_SET (PortState.PortChangeStatus, USB_PORT_STAT_C_RESET)) {
|
|
||||||
DEBUG (( EFI_D_INFO, "UsbRootHubResetPort: skip reset on root port %d\n", Port));
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = UsbHcSetRootHubPortFeature (Bus, Port, EfiUsbPortReset);
|
Status = UsbHcSetRootHubPortFeature (Bus, Port, EfiUsbPortReset);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
|
|
Loading…
Reference in New Issue