-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-Uhci2SetState (\r
- IN EFI_USB2_HC_PROTOCOL *This,\r
- IN EFI_USB_HC_STATE State\r
- )\r
-{\r
- USB_HC_DEV *Uhc;\r
-\r
- Uhc = UHC_FROM_USB2_HC_PROTO (This);\r
- return UhciSetState (&Uhc->UsbHc, State);\r
-}\r
-\r
-\r
-/**\r
- Retrieves capabilities of USB host controller according to UEFI 2.0 spec.\r
-\r
- @param This A pointer to the EFI_USB2_HC_PROTOCOL instance\r
- @param MaxSpeed A pointer to the max speed USB host controller\r
- supports.\r
- @param PortNumber A pointer to the number of root hub ports.\r
- @param Is64BitCapable A pointer to an integer to show whether USB host\r
- controller supports 64-bit memory addressing.\r
-\r
- @return EFI_SUCCESS : capabilities were retrieved successfully.\r
- @return EFI_INVALID_PARAMETER : MaxSpeed or PortNumber or Is64BitCapable is NULL.\r
- @return EFI_DEVICE_ERROR : An error was encountered\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-Uhci2GetCapability (\r
- IN EFI_USB2_HC_PROTOCOL *This,\r
- OUT UINT8 *MaxSpeed,\r
- OUT UINT8 *PortNumber,\r
- OUT UINT8 *Is64BitCapable\r
- )\r
-{\r
- USB_HC_DEV *Uhc;\r
-\r
- Uhc = UHC_FROM_USB2_HC_PROTO (This);\r
-\r
- if ((NULL == MaxSpeed) || (NULL == PortNumber) || (NULL == Is64BitCapable)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- *MaxSpeed = EFI_USB_SPEED_FULL;\r
- *Is64BitCapable = (UINT8) FALSE;\r
-\r
- return UhciGetRootHubPortNumber (&Uhc->UsbHc, PortNumber);\r
-}\r
-\r
-\r
-/**\r
- Retrieves the current status of a USB root hub port according to UEFI 2.0 spec.\r
-\r
- @param This A pointer to the EFI_USB2_HC_PROTOCOL.\r
- @param PortNumber The port to get status\r
- @param PortStatus A pointer to the current port status bits and port\r
- status change bits.\r
-\r
- @return EFI_SUCCESS : status of the USB root hub port was returned in PortStatus.\r
- @return EFI_INVALID_PARAMETER : PortNumber is invalid.\r
- @return EFI_DEVICE_ERROR : Can't read register\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-Uhci2GetRootHubPortStatus (\r
- IN CONST EFI_USB2_HC_PROTOCOL *This,\r
- IN CONST UINT8 PortNumber,\r
- OUT EFI_USB_PORT_STATUS *PortStatus\r
- )\r
-{\r
- USB_HC_DEV *Uhc;\r
-\r
- Uhc = UHC_FROM_USB2_HC_PROTO (This);\r
-\r
- return UhciGetRootHubPortStatus (&Uhc->UsbHc, PortNumber, PortStatus);\r
-}\r
-\r
-\r
-/**\r
- Sets a feature for the specified root hub port according to UEFI 2.0 spec.\r
-\r
- @param This A pointer to the EFI_USB2_HC_PROTOCOL.\r
- @param PortNumber Specifies the root hub port whose feature is\r
- requested to be set.\r
- @param PortFeature Indicates the feature selector associated with the\r
- feature set request.\r
-\r
- @return EFI_SUCCESS : PortFeature was set for the root port\r
- @return EFI_INVALID_PARAMETER : PortNumber is invalid or PortFeature is invalid.\r
- @return EFI_DEVICE_ERROR : Can't read register\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-Uhci2SetRootHubPortFeature (\r
- IN EFI_USB2_HC_PROTOCOL *This,\r
- IN UINT8 PortNumber,\r
- IN EFI_USB_PORT_FEATURE PortFeature\r
- )\r
-{\r
- USB_HC_DEV *Uhc;\r
-\r
- Uhc = UHC_FROM_USB2_HC_PROTO (This);\r
-\r
- return UhciSetRootHubPortFeature (&Uhc->UsbHc, PortNumber, PortFeature);\r
-}\r
-\r
-\r
-/**\r
- Clears a feature for the specified root hub port according to Uefi 2.0 spec.\r
-\r
- @param This A pointer to the EFI_USB2_HC_PROTOCOL instance.\r
- @param PortNumber Specifies the root hub port whose feature is\r
- requested to be cleared.\r
- @param PortFeature Indicates the feature selector associated with the\r
- feature clear request.\r
-\r
- @return EFI_SUCCESS : PortFeature was cleared for the USB root hub port\r
- @return EFI_INVALID_PARAMETER : PortNumber is invalid or PortFeature is invalid.\r
- @return EFI_DEVICE_ERROR : Can't read register\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-Uhci2ClearRootHubPortFeature (\r
- IN EFI_USB2_HC_PROTOCOL *This,\r
- IN UINT8 PortNumber,\r
- IN EFI_USB_PORT_FEATURE PortFeature\r
- )\r
-{\r
- USB_HC_DEV *Uhc;\r
-\r
- Uhc = UHC_FROM_USB2_HC_PROTO (This);\r
-\r
- return UhciClearRootHubPortFeature (&Uhc->UsbHc, PortNumber, PortFeature);\r
-}\r
-\r
-\r
-/**\r
- Submits control transfer to a target USB device accroding to UEFI 2.0 spec..\r
-\r
- This : A pointer to the EFI_USB2_HC_PROTOCOL instance.\r
- DeviceAddress : Target device address\r
- DeviceSpeed : Device speed\r
- MaximumPacketLength : Maximum packet size of the target endpoint\r
- Request : USB device request to send\r
- TransferDirection : Data direction of the Data stage in control transfer\r
- Data : Data to transmit/receive in data stage\r
- DataLength : Length of the data\r
- TimeOut : Maximum time, in microseconds, for transfer to complete.\r
- TransferResult : Variable to receive the transfer result\r
-\r
- @return EFI_SUCCESS : The control transfer was completed successfully.\r
- @return EFI_OUT_OF_RESOURCES : Failed due to lack of resource.\r
- @return EFI_INVALID_PARAMETER : Some parameters are invalid.\r
- @return EFI_TIMEOUT : Failed due to timeout.\r
- @return EFI_DEVICE_ERROR : Failed due to host controller or device error.\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-Uhci2ControlTransfer (\r
- IN EFI_USB2_HC_PROTOCOL *This,\r
- IN UINT8 DeviceAddress,\r
- IN UINT8 DeviceSpeed,\r
- IN UINTN MaximumPacketLength,\r
- IN EFI_USB_DEVICE_REQUEST *Request,\r
- IN EFI_USB_DATA_DIRECTION TransferDirection,\r
- IN OUT VOID *Data,\r
- IN OUT UINTN *DataLength,\r
- IN UINTN TimeOut,\r
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,\r
- OUT UINT32 *TransferResult\r
- )\r
-{\r
- USB_HC_DEV *Uhc;\r
- BOOLEAN IsSlow;\r
-\r
- Uhc = UHC_FROM_USB2_HC_PROTO (This);\r
- IsSlow = (EFI_USB_SPEED_LOW == DeviceSpeed) ? TRUE : FALSE;\r
-\r
- return UhciControlTransfer (\r
- &Uhc->UsbHc,\r
- DeviceAddress,\r
- IsSlow,\r
- (UINT8) MaximumPacketLength,\r
- Request,\r
- TransferDirection,\r
- Data,\r
- DataLength,\r
- TimeOut,\r
- TransferResult\r
- );\r
-}\r
-\r
-\r
-/**\r
- Submits bulk transfer to a bulk endpoint of a USB device\r
-\r
- This : A pointer to the EFI_USB2_HC_PROTOCOL instance.\r
- DeviceAddress : Target device address\r
- EndPointAddress : Endpoint number and direction\r
- DeviceSpeed : Device speed\r
- MaximumPacketLength : Maximum packet size of the target endpoint\r
- DataBuffersNumber : Number of data buffers prepared for the transfer.\r
- Data : Array of pointers to the buffers of data\r
- DataLength : On input, size of the data buffer, On output,\r
- actually transferred data size.\r
- DataToggle : On input, data toggle to use; On output, next data toggle\r
- Translator : A pointr to the transaction translator data.\r
- TimeOut : Maximum time out, in microseconds\r
- TransferResult : Variable to receive transfer result\r
-\r
- @return EFI_SUCCESS : The bulk transfer was completed successfully.\r
- @return EFI_OUT_OF_RESOURCES : Failed due to lack of resource.\r
- @return EFI_INVALID_PARAMETER : Some parameters are invalid.\r
- @return EFI_TIMEOUT : Failed due to timeout.\r
- @return EFI_DEVICE_ERROR : Failed due to host controller or device error.\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-Uhci2BulkTransfer (\r
- IN EFI_USB2_HC_PROTOCOL *This,\r
- IN UINT8 DeviceAddress,\r
- IN UINT8 EndPointAddress,\r
- IN UINT8 DeviceSpeed,\r
- IN UINTN MaximumPacketLength,\r
- IN UINT8 DataBuffersNumber,\r
- IN OUT VOID *Data[EFI_USB_MAX_BULK_BUFFER_NUM],\r
- IN OUT UINTN *DataLength,\r
- IN OUT UINT8 *DataToggle,\r
- IN UINTN TimeOut,\r
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,\r
- OUT UINT32 *TransferResult\r
- )\r
-{\r
- USB_HC_DEV *Uhc;\r
-\r
- Uhc = UHC_FROM_USB2_HC_PROTO (This);\r
-\r
- if (Data == NULL || DeviceSpeed == EFI_USB_SPEED_LOW) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // For full-speed bulk transfers only the data pointed by Data[0] shall be used\r
- //\r
- return UhciBulkTransfer (\r
- &Uhc->UsbHc,\r
- DeviceAddress,\r
- EndPointAddress,\r
- (UINT8) MaximumPacketLength,\r
- *Data,\r
- DataLength,\r
- DataToggle,\r
- TimeOut,\r
- TransferResult\r
- );\r
-}\r
-\r
-\r
-/**\r
- Submits an asynchronous interrupt transfer to an\r
- interrupt endpoint of a USB device according to UEFI 2.0 spec.\r
-\r
- This : A pointer to the EFI_USB2_HC_PROTOCOL instance.\r
- DeviceAddress : Target device address\r
- EndPointAddress : Endpoint number and direction\r
- DeviceSpeed : Device speed\r
- MaximumPacketLength : Maximum packet size of the target endpoint\r
- IsNewTransfer : If TRUE, submit a new transfer, if FALSE cancel old transfer\r
- DataToggle : On input, data toggle to use; On output, next data toggle\r
- PollingInterval : Interrupt poll rate in milliseconds\r
- DataLength : On input, size of the data buffer, On output,\r
- actually transferred data size.\r
- Translator : A pointr to the transaction translator data.\r
- CallBackFunction : Function to call periodically\r
- Context : User context\r
-\r
- @return EFI_SUCCESS : Transfer was submitted\r
- @return EFI_INVALID_PARAMETER : Some parameters are invalid.\r
- @return EFI_OUT_OF_RESOURCES : Failed due to a lack of resources.\r
- @return EFI_DEVICE_ERROR : Can't read register\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-Uhci2AsyncInterruptTransfer (\r
- IN EFI_USB2_HC_PROTOCOL *This,\r
- IN UINT8 DeviceAddress,\r
- IN UINT8 EndPointAddress,\r
- IN UINT8 DeviceSpeed,\r
- IN UINTN MaximumPacketLength,\r
- IN BOOLEAN IsNewTransfer,\r
- IN OUT UINT8 *DataToggle,\r
- IN UINTN PollingInterval,\r
- IN UINTN DataLength,\r
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,\r
- IN EFI_ASYNC_USB_TRANSFER_CALLBACK CallBackFunction,\r
- IN VOID *Context\r
- )\r
-{\r
- USB_HC_DEV *Uhc;\r
- BOOLEAN IsSlow;\r
-\r
- Uhc = UHC_FROM_USB2_HC_PROTO (This);\r
- IsSlow = (EFI_USB_SPEED_LOW == DeviceSpeed) ? TRUE : FALSE;\r
-\r
- return UhciAsyncInterruptTransfer (\r
- &Uhc->UsbHc,\r
- DeviceAddress,\r
- EndPointAddress,\r
- IsSlow,\r
- (UINT8) MaximumPacketLength,\r
- IsNewTransfer,\r
- DataToggle,\r
- PollingInterval,\r
- DataLength,\r
- CallBackFunction,\r
- Context\r
- );\r
-}\r
-\r
-\r
-/**\r
- Submits synchronous interrupt transfer to an interrupt endpoint\r
- of a USB device according to UEFI 2.0 spec.\r
-\r
- This : A pointer to the EFI_USB2_HC_PROTOCOL instance.\r
- DeviceAddress : Target device address\r
- EndPointAddress : Endpoint number and direction\r
- DeviceSpeed : Device speed\r
- MaximumPacketLength : Maximum packet size of the target endpoint\r
- DataBuffersNumber : Number of data buffers prepared for the transfer.\r
- Data : Array of pointers to the buffers of data\r
- DataLength : On input, size of the data buffer, On output,\r
- actually transferred data size.\r
- DataToggle : On input, data toggle to use; On output, next data toggle\r
- TimeOut : Maximum time out, in microseconds\r
- Translator : A pointr to the transaction translator data.\r
- TransferResult : Variable to receive transfer result\r
-\r
- @return EFI_SUCCESS : The transfer was completed successfully.\r
- @return EFI_OUT_OF_RESOURCES : Failed due to lack of resource.\r
- @return EFI_INVALID_PARAMETER : Some parameters are invalid.\r
- @return EFI_TIMEOUT : Failed due to timeout.\r
- @return EFI_DEVICE_ERROR : Failed due to host controller or device error.\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-Uhci2SyncInterruptTransfer (\r
- IN EFI_USB2_HC_PROTOCOL *This,\r
- IN UINT8 DeviceAddress,\r
- IN UINT8 EndPointAddress,\r
- IN UINT8 DeviceSpeed,\r
- IN UINTN MaximumPacketLength,\r
- IN OUT VOID *Data,\r
- IN OUT UINTN *DataLength,\r
- IN OUT UINT8 *DataToggle,\r
- IN UINTN TimeOut,\r
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,\r
- OUT UINT32 *TransferResult\r
- )\r
-{\r
- USB_HC_DEV *Uhc;\r
- BOOLEAN IsSlow;\r
-\r
- if (DeviceSpeed == EFI_USB_SPEED_HIGH) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Uhc = UHC_FROM_USB2_HC_PROTO (This);\r
- IsSlow = (EFI_USB_SPEED_LOW == DeviceSpeed) ? TRUE : FALSE;\r
-\r
- return UhciSyncInterruptTransfer (\r
- &Uhc->UsbHc,\r
- DeviceAddress,\r
- EndPointAddress,\r
- IsSlow,\r
- (UINT8) MaximumPacketLength,\r
- Data,\r
- DataLength,\r
- DataToggle,\r
- TimeOut,\r
- TransferResult\r
- );\r
-}\r
-\r
-\r
-/**\r
- Submits isochronous transfer to a target USB device according to UEFI 2.0 spec.\r
-\r
- This : A pointer to the EFI_USB2_HC_PROTOCOL instance.\r
- DeviceAddress : Target device address\r
- EndPointAddress : Endpoint number and direction\r
- DeviceSpeed : Device speed\r
- MaximumPacketLength : Maximum packet size of the target endpoint\r
- DataBuffersNumber : Number of data buffers prepared for the transfer.\r
- Data : Array of pointers to the buffers of data\r
- DataLength : On input, size of the data buffer, On output,\r
- actually transferred data size.\r
- Translator : A pointr to the transaction translator data.\r
- TransferResult : Variable to receive transfer result\r
-\r
- @return EFI_UNSUPPORTED\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-Uhci2IsochronousTransfer (\r
- IN EFI_USB2_HC_PROTOCOL *This,\r
- IN UINT8 DeviceAddress,\r
- IN UINT8 EndPointAddress,\r
- IN UINT8 DeviceSpeed,\r
- IN UINTN MaximumPacketLength,\r
- IN UINT8 DataBuffersNumber,\r
- IN OUT VOID *Data[EFI_USB_MAX_ISO_BUFFER_NUM],\r
- IN UINTN DataLength,\r
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,\r
- OUT UINT32 *TransferResult\r
- )\r
-{\r
- return EFI_UNSUPPORTED;\r
-}\r
-\r
-\r
-/**\r
- Submits Async isochronous transfer to a target USB device according to UEFI 2.0 spec.\r
-\r
- This : A pointer to the EFI_USB2_HC_PROTOCOL instance.\r
- DeviceAddress : Target device address\r
- EndPointAddress : Endpoint number and direction\r
- DeviceSpeed : Device speed\r
- MaximumPacketLength : Maximum packet size of the target endpoint\r
- DataBuffersNumber : Number of data buffers prepared for the transfer.\r
- Data : Array of pointers to the buffers of data\r
- Translator : A pointr to the transaction translator data.\r
- IsochronousCallBack : Function to call when the transfer complete\r
- Context : Pass to the call back function as parameter\r
-\r
- @return EFI_UNSUPPORTED\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-Uhci2AsyncIsochronousTransfer (\r
- IN EFI_USB2_HC_PROTOCOL *This,\r
- IN UINT8 DeviceAddress,\r
- IN UINT8 EndPointAddress,\r
- IN UINT8 DeviceSpeed,\r
- IN UINTN MaximumPacketLength,\r
- IN UINT8 DataBuffersNumber,\r
- IN OUT VOID *Data[EFI_USB_MAX_ISO_BUFFER_NUM],\r
- IN UINTN DataLength,\r
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator,\r
- IN EFI_ASYNC_USB_TRANSFER_CALLBACK IsochronousCallBack,\r
- IN VOID *Context\r
- )\r
-{\r
- return EFI_UNSUPPORTED;\r
-}\r
-\r
-//@MT: EFI_DRIVER_ENTRY_POINT (UhciDriverEntryPoint)\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-UhciDriverEntryPoint (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-/*++\r
-\r
- Routine Description:\r
-\r
- Entry point for EFI drivers.\r
-\r
- Arguments:\r
-\r
- ImageHandle - EFI_HANDLE\r
- SystemTable - EFI_SYSTEM_TABLE\r
-\r
- Returns:\r
-\r
- EFI_SUCCESS : Driver is successfully loaded\r
- Others : Failed\r
-\r
---*/\r
-{\r
- return EfiLibInstallAllDriverProtocols (\r
- ImageHandle,\r
- SystemTable,\r
- &gUhciDriverBinding,\r
- ImageHandle,\r
- &gUhciComponentName,\r
- NULL,\r
- NULL\r
- );\r
-}\r
-\r
-\r
-/**\r
- Test to see if this driver supports ControllerHandle. Any\r
- ControllerHandle that has UsbHcProtocol installed will be supported.\r
-\r
- @param This Protocol instance pointer.\r
- @param Controller Handle of device to test\r
- @param RemainingDevicePath Not used\r
-\r
- @return EFI_SUCCESS : This driver supports this device.\r
- @return EFI_UNSUPPORTED : This driver does not support this device.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-UhciDriverBindingSupported (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
- )\r
-{\r
- EFI_STATUS OpenStatus;\r
- EFI_STATUS Status;\r
- EFI_PCI_IO_PROTOCOL *PciIo;\r
- USB_CLASSC UsbClassCReg;\r
-\r
- //\r
- // Test whether there is PCI IO Protocol attached on the controller handle.\r
- //\r
- OpenStatus = gBS->OpenProtocol (\r
- Controller,\r
- &gEfiPciIoProtocolGuid,\r
- &PciIo,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
-\r
- if (EFI_ERROR (OpenStatus)) {\r
- return OpenStatus;\r
- }\r
-\r
- Status = PciIo->Pci.Read (\r
- PciIo,\r
- EfiPciIoWidthUint8,\r
- CLASSC_OFFSET,\r
- sizeof (USB_CLASSC) / sizeof (UINT8),\r
- &UsbClassCReg\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- Status = EFI_UNSUPPORTED;\r
- goto ON_EXIT;\r
- }\r
-\r
- //\r
- // Test whether the controller belongs to UHCI type\r
- //\r
- if ((UsbClassCReg.BaseCode != PCI_CLASS_SERIAL) ||\r
- (UsbClassCReg.SubClassCode != PCI_CLASS_SERIAL_USB) ||\r
- (UsbClassCReg.PI != PCI_CLASSC_PI_UHCI)\r
- ) {\r
-\r
- Status = EFI_UNSUPPORTED;\r
- }\r
-\r
-ON_EXIT:\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiPciIoProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
-\r
- return Status;\r
-\r
-}\r
-\r
-\r
-/**\r
- Allocate and initialize the empty UHCI device\r
-\r
- @param PciIo The PCIIO to use\r
-\r
- @return Allocated UHCI device\r
-\r
-**/\r
-STATIC\r