/** Reset the port and re-configure the usb device. @param PeiServices General-purpose services that are available to every PEIM. @param This Indicates the PEI_USB_IO_PPI instance. @retval EFI_SUCCESS Usb device is reset and configured successfully. @retval Others Other failure occurs. **/ EFI_STATUS EFIAPI PeiUsbPortReset ( IN EFI_PEI_SERVICES **PeiServices, IN PEI_USB_IO_PPI *This ) { PEI_USB_DEVICE *PeiUsbDev; EFI_STATUS Status; UINT8 Address; PeiUsbDev = PEI_USB_DEVICE_FROM_THIS (This); ResetRootPort ( PeiServices, PeiUsbDev->UsbHcPpi, PeiUsbDev->Usb2HcPpi, PeiUsbDev->DeviceAddress, 0 ); // // Set address // Address = PeiUsbDev->DeviceAddress; PeiUsbDev->DeviceAddress = 0; Status = PeiUsbSetDeviceAddress ( PeiServices, This, Address ); if (EFI_ERROR (Status)) { return Status; } PeiUsbDev->DeviceAddress = Address; // // Set default configuration // Status = PeiUsbSetConfiguration ( PeiServices, This ); return Status; }
/** Configure new detected usb device. @param PeiServices Describes the list of possible PEI Services. @param PeiUsbDevice The pointer of PEI_USB_DEVICE instance. @param Port The port to be configured. @param DeviceAddress The device address to be configured. @retval EFI_SUCCESS The new detected usb device is configured successfully. @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. @retval Others Other failure occurs. **/ EFI_STATUS PeiConfigureUsbDevice ( IN EFI_PEI_SERVICES **PeiServices, IN PEI_USB_DEVICE *PeiUsbDevice, IN UINT8 Port, IN OUT UINT8 *DeviceAddress ) { EFI_USB_DEVICE_DESCRIPTOR DeviceDescriptor; EFI_STATUS Status; PEI_USB_IO_PPI *UsbIoPpi; UINT8 Retry; UsbIoPpi = &PeiUsbDevice->UsbIoPpi; Status = EFI_SUCCESS; ZeroMem (&DeviceDescriptor, sizeof (EFI_USB_DEVICE_DESCRIPTOR)); // // Get USB device descriptor // for (Retry = 0; Retry < 3; Retry ++) { Status = PeiUsbGetDescriptor ( PeiServices, UsbIoPpi, (USB_DT_DEVICE << 8), 0, 8, &DeviceDescriptor ); if (!EFI_ERROR (Status)) { DEBUG ((EFI_D_INFO, "PeiUsbGet Device Descriptor the %d time Success\n", Retry)); break; } } if (Retry == 3) { DEBUG ((EFI_D_ERROR, "PeiUsbGet Device Descriptor fail: %x %r\n", Retry, Status)); return Status; } if ((DeviceDescriptor.BcdUSB >= 0x0300) && (DeviceDescriptor.MaxPacketSize0 == 9)) { PeiUsbDevice->MaxPacketSize0 = 1 << 9; } else { PeiUsbDevice->MaxPacketSize0 = DeviceDescriptor.MaxPacketSize0; } (*DeviceAddress) ++; Status = PeiUsbSetDeviceAddress ( PeiServices, UsbIoPpi, *DeviceAddress ); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "PeiUsbSetDeviceAddress Failed: %r\n", Status)); return Status; } MicroSecondDelay (USB_SET_DEVICE_ADDRESS_STALL); PeiUsbDevice->DeviceAddress = *DeviceAddress; // // Get whole USB device descriptor // Status = PeiUsbGetDescriptor ( PeiServices, UsbIoPpi, (USB_DT_DEVICE << 8), 0, (UINT16) sizeof (EFI_USB_DEVICE_DESCRIPTOR), &DeviceDescriptor ); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "PeiUsbGetDescriptor First Failed\n")); return Status; } // // Get its default configuration and its first interface // Status = PeiUsbGetAllConfiguration ( PeiServices, PeiUsbDevice ); if (EFI_ERROR (Status)) { return Status; } MicroSecondDelay (USB_GET_CONFIG_DESCRIPTOR_STALL); Status = PeiUsbSetConfiguration ( PeiServices, UsbIoPpi ); if (EFI_ERROR (Status)) { return Status; } return EFI_SUCCESS; }