From 992d5451d19b93635d52db293bab680e32142776 Mon Sep 17 00:00:00 2001 From: Sean Rhodes Date: Fri, 16 Dec 2022 12:24:18 +0000 Subject: MdeModulePkg/Bus/Pci/XhciDxe: Reset port if status change returns an error Force resetting the port by clearing the USB_PORT_STAT_C_RESET bit in PortChangeStatus when XhcPollPortStatusChange fails Signed-off-by: Sean Rhodes Reviewed-by: Hao A Wu --- MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'MdeModulePkg') diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c index 461b2cd9b5..d8fa41f68f 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c @@ -471,7 +471,16 @@ XhcGetRootHubPortStatus ( // For those devices behind hub, we get its attach/detach event by hooking Get_Port_Status request at control transfer for those hub. // ParentRouteChart.Dword = 0; - XhcPollPortStatusChange (Xhc, ParentRouteChart, PortNumber, PortStatus); + Status = XhcPollPortStatusChange (Xhc, ParentRouteChart, PortNumber, PortStatus); + + // + // Force resetting the port by clearing the USB_PORT_STAT_C_RESET bit in PortChangeStatus + // when XhcPollPortStatusChange fails + // + if (EFI_ERROR (Status)) { + PortStatus->PortChangeStatus &= ~(USB_PORT_STAT_C_RESET); + Status = EFI_SUCCESS; + } ON_EXIT: gBS->RestoreTPL (OldTpl); -- cgit v1.2.3