MdeModulePkg/XhciDxe/Xhci: Don't check for invalid PSIV

PSID matching relies on comparing the PSIV against the PortSpeed
value. This patch stops edk2 from checking for a PSIV of 0, as it
is not valid; this reduces the number of register access by
approximately 6 per second.

Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
Reviewed-by: Sean Rhodes <sean@starlabs.systems>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
This commit is contained in:
Matt DeVillier 2022-12-16 16:58:05 +08:00 committed by mergify[bot]
parent 3f378450df
commit 01c2fb0d22

View File

@ -371,6 +371,7 @@ XhcGetRootHubPortStatus (
UINT32 TotalPort; UINT32 TotalPort;
UINTN Index; UINTN Index;
UINTN MapSize; UINTN MapSize;
UINT8 PortSpeed;
EFI_STATUS Status; EFI_STATUS Status;
USB_DEV_ROUTE ParentRouteChart; USB_DEV_ROUTE ParentRouteChart;
EFI_TPL OldTpl; EFI_TPL OldTpl;
@ -397,32 +398,37 @@ XhcGetRootHubPortStatus (
State = XhcReadOpReg (Xhc, Offset); State = XhcReadOpReg (Xhc, Offset);
PortSpeed = (State & XHC_PORTSC_PS) >> 10;
// //
// According to XHCI 1.1 spec November 2017, // According to XHCI 1.1 spec November 2017,
// Section 7.2 xHCI Support Protocol Capability // Section 7.2 xHCI Support Protocol Capability
// //
PortStatus->PortStatus = XhcCheckUsbPortSpeedUsedPsic (Xhc, ((State & XHC_PORTSC_PS) >> 10)); if (PortSpeed > 0) {
if (PortStatus->PortStatus == 0) { PortStatus->PortStatus = XhcCheckUsbPortSpeedUsedPsic (Xhc, PortSpeed);
// // If no match found in ext cap reg, fall back to PORTSC
// According to XHCI 1.1 spec November 2017, if (PortStatus->PortStatus == 0) {
// bit 10~13 of the root port status register identifies the speed of the attached device. //
// // According to XHCI 1.1 spec November 2017,
switch ((State & XHC_PORTSC_PS) >> 10) { // bit 10~13 of the root port status register identifies the speed of the attached device.
case 2: //
PortStatus->PortStatus |= USB_PORT_STAT_LOW_SPEED; switch (PortSpeed) {
break; case 2:
PortStatus->PortStatus |= USB_PORT_STAT_LOW_SPEED;
break;
case 3: case 3:
PortStatus->PortStatus |= USB_PORT_STAT_HIGH_SPEED; PortStatus->PortStatus |= USB_PORT_STAT_HIGH_SPEED;
break; break;
case 4: case 4:
case 5: case 5:
PortStatus->PortStatus |= USB_PORT_STAT_SUPER_SPEED; PortStatus->PortStatus |= USB_PORT_STAT_SUPER_SPEED;
break; break;
default: default:
break; break;
}
} }
} }