diff --git a/MdeModulePkg/Bus/Pci/XhciPei/XhciSched.c b/MdeModulePkg/Bus/Pci/XhciPei/XhciSched.c index dde31e0f1a..8e768bc470 100644 --- a/MdeModulePkg/Bus/Pci/XhciPei/XhciSched.c +++ b/MdeModulePkg/Bus/Pci/XhciPei/XhciSched.c @@ -1706,7 +1706,12 @@ XhcPeiSetConfigCmd ( InputContext->EP[Dci-1].CErr = 0; InputContext->EP[Dci-1].EPType = ED_ISOCH_OUT; } - break; + // + // Do not support isochronous transfer now. + // + DEBUG ((EFI_D_INFO, "XhcPeiSetConfigCmd: Unsupport ISO EP found, Transfer ring is not allocated.\n")); + EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)EpDesc + EpDesc->Length); + continue; case USB_ENDPOINT_INTERRUPT: if (Direction == EfiUsbDataIn) { InputContext->EP[Dci-1].CErr = 3; @@ -1744,9 +1749,14 @@ XhcPeiSetConfigCmd ( break; case USB_ENDPOINT_CONTROL: + // + // Do not support control transfer now. + // + DEBUG ((EFI_D_INFO, "XhcPeiSetConfigCmd: Unsupport Control EP found, Transfer ring is not allocated.\n")); default: - ASSERT (FALSE); - break; + DEBUG ((EFI_D_INFO, "XhcPeiSetConfigCmd: Unknown EP found, Transfer ring is not allocated.\n")); + EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)EpDesc + EpDesc->Length); + continue; } PhyAddr = UsbHcGetPciAddrForHostAddr ( @@ -1899,7 +1909,12 @@ XhcPeiSetConfigCmd64 ( InputContext->EP[Dci-1].CErr = 0; InputContext->EP[Dci-1].EPType = ED_ISOCH_OUT; } - break; + // + // Do not support isochronous transfer now. + // + DEBUG ((EFI_D_INFO, "XhcPeiSetConfigCmd64: Unsupport ISO EP found, Transfer ring is not allocated.\n")); + EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)EpDesc + EpDesc->Length); + continue; case USB_ENDPOINT_INTERRUPT: if (Direction == EfiUsbDataIn) { InputContext->EP[Dci-1].CErr = 3; @@ -1937,9 +1952,14 @@ XhcPeiSetConfigCmd64 ( break; case USB_ENDPOINT_CONTROL: + // + // Do not support control transfer now. + // + DEBUG ((EFI_D_INFO, "XhcPeiSetConfigCmd64: Unsupport Control EP found, Transfer ring is not allocated.\n")); default: - ASSERT (0); - break; + DEBUG ((EFI_D_INFO, "XhcPeiSetConfigCmd64: Unknown EP found, Transfer ring is not allocated.\n")); + EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)EpDesc + EpDesc->Length); + continue; } PhyAddr = UsbHcGetPciAddrForHostAddr ( diff --git a/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.c b/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.c index 947864bd27..f350021862 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.c +++ b/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.c @@ -720,6 +720,7 @@ PeiConfigureUsbDevice ( DEBUG ((EFI_D_ERROR, "PeiUsbSetDeviceAddress Failed: %r\n", Status)); return Status; } + MicroSecondDelay (USB_SET_DEVICE_ADDRESS_STALL); PeiUsbDevice->DeviceAddress = *DeviceAddress; @@ -750,6 +751,7 @@ PeiConfigureUsbDevice ( if (EFI_ERROR (Status)) { return Status; } + MicroSecondDelay (USB_GET_CONFIG_DESCRIPTOR_STALL); Status = PeiUsbSetConfiguration ( PeiServices, @@ -809,6 +811,7 @@ PeiUsbGetAllConfiguration ( DEBUG ((EFI_D_ERROR, "PeiUsbGet Config Descriptor First Failed\n")); return Status; } + MicroSecondDelay (USB_GET_CONFIG_DESCRIPTOR_STALL); ConfigDesc = (EFI_USB_CONFIG_DESCRIPTOR *) PeiUsbDevice->ConfigurationData; ConfigDescLength = ConfigDesc->TotalLength; diff --git a/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.h b/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.h index df459e7a6e..dff8eeb202 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.h +++ b/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.h @@ -99,6 +99,17 @@ typedef struct { // #define USB_SET_PORT_POWER_STALL (2 * USB_BUS_1_MILLISECOND) +// +// Wait for set device address, refers to specification +// [USB20-9.2.6.3, it says 2ms] +// +#define USB_SET_DEVICE_ADDRESS_STALL (2 * USB_BUS_1_MILLISECOND) + +// +// Wait for get configuration descriptor, set by experience +// +#define USB_GET_CONFIG_DESCRIPTOR_STALL (1 * USB_BUS_1_MILLISECOND) + /** Submits control transfer to a target USB device.