+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- cbi1.c\r
-\r
-Abstract:\r
- cbi1 transportation protocol implementation files\r
-\r
---*/\r
-\r
-#include "cbi.h"\r
-\r
-//\r
-// CBI Function prototypes\r
-//\r
-STATIC\r
-EFI_STATUS\r
-CBI1CommandPhase (\r
- IN USB_CBI_DEVICE *UsbCbiDev,\r
- IN VOID *Command,\r
- IN UINT8 CommandSize,\r
- OUT UINT32 *Result\r
- );\r
-\r
-STATIC\r
-EFI_STATUS\r
-CBI1DataPhase (\r
- IN USB_CBI_DEVICE *UsbCbiDev,\r
- IN UINT32 DataSize,\r
- IN OUT VOID *DataBuffer,\r
- IN EFI_USB_DATA_DIRECTION Direction,\r
- IN UINT16 Timeout,\r
- OUT UINT32 *Result\r
- );\r
-\r
-//\r
-// USB Atapi implementation\r
-//\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-CBI1AtapiCommand (\r
- IN EFI_USB_ATAPI_PROTOCOL *This,\r
- IN VOID *Command,\r
- IN UINT8 CommandSize,\r
- IN VOID *DataBuffer,\r
- IN UINT32 BufferLength,\r
- IN EFI_USB_DATA_DIRECTION Direction,\r
- IN UINT16 TimeOutInMilliSeconds\r
- );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-CBI1MassStorageReset (\r
- IN EFI_USB_ATAPI_PROTOCOL *This,\r
- IN BOOLEAN ExtendedVerification\r
- );\r
-\r
-//\r
-// CBI1 Driver Binding Protocol\r
-//\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-CBI1DriverBindingSupported (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
- );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-CBI1DriverBindingStart (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
- );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-CBI1DriverBindingStop (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer\r
- );\r
-\r
-STATIC\r
-VOID\r
-Cbi1ReportStatusCode (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
- IN EFI_STATUS_CODE_TYPE CodeType,\r
- IN EFI_STATUS_CODE_VALUE Value\r
- );\r
-\r
-\r
-EFI_DRIVER_BINDING_PROTOCOL gUsbCbi1DriverBinding = {\r
- CBI1DriverBindingSupported,\r
- CBI1DriverBindingStart,\r
- CBI1DriverBindingStop,\r
- 0xa,\r
- NULL,\r
- NULL\r
-};\r
-\r
-STATIC EFI_USB_ATAPI_PROTOCOL CBI1AtapiProtocol = {\r
- CBI1AtapiCommand,\r
- CBI1MassStorageReset,\r
- 0\r
-};\r
-\r
-//\r
-// CBI1 Driver Binding implementation\r
-//\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-CBI1DriverBindingSupported (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Test to see if this driver supports ControllerHandle. Any ControllerHandle \r
- than contains a BlockIo and DiskIo protocol can be supported.\r
-\r
- Arguments:\r
- This - Protocol instance pointer.\r
- ControllerHandle - Handle of device to test\r
- RemainingDevicePath - Not used\r
-\r
- Returns:\r
- EFI_SUCCESS - This driver supports this device\r
- EFI_ALREADY_STARTED - This driver is already running on this device\r
- other - This driver does not support this device\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_USB_IO_PROTOCOL *UsbIo;\r
- EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;\r
-\r
- //\r
- // Check if the Controller supports USB IO protocol\r
- //\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiUsbIoProtocolGuid,\r
- (VOID **) &UsbIo,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- //\r
- // Get the Controller interface descriptor\r
- //\r
- Status = UsbIo->UsbGetInterfaceDescriptor (\r
- UsbIo,\r
- &InterfaceDescriptor\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Exit;\r
- }\r
- //\r
- // Bug here: just let Vendor specific CBI protocol get supported\r
- //\r
- if (!((InterfaceDescriptor.InterfaceClass == 0xFF) &&\r
- (InterfaceDescriptor.InterfaceProtocol == 0))) {\r
- Status = EFI_UNSUPPORTED;\r
- goto Exit;\r
- }\r
-\r
-Exit:\r
- gBS->CloseProtocol (\r
- ControllerHandle,\r
- &gEfiUsbIoProtocolGuid,\r
- This->DriverBindingHandle,\r
- ControllerHandle\r
- );\r
- return Status;\r
-\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-CBI1DriverBindingStart (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Start this driver on ControllerHandle by opening a Block IO and Disk IO \r
- protocol, reading Device Path, and creating a child handle with a \r
- Disk IO and device path protocol.\r
-\r
- Arguments:\r
- This - Protocol instance pointer.\r
- ControllerHandle - Handle of device to bind driver to\r
- RemainingDevicePath - Not used\r
-\r
- Returns:\r
- EFI_SUCCESS - This driver is added to DeviceHandle\r
- EFI_ALREADY_STARTED - This driver is already running on DeviceHandle\r
- other - This driver does not support this device\r
-\r
---*/\r
-{\r
- USB_CBI_DEVICE *UsbCbiDev;\r
- UINT8 Index;\r
- EFI_USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;\r
- EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;\r
- EFI_STATUS Status;\r
- EFI_USB_IO_PROTOCOL *UsbIo;\r
- BOOLEAN Found;\r
-\r
- Found = FALSE;\r
- //\r
- // Check if the Controller supports USB IO protocol\r
- //\r
- UsbCbiDev = NULL;\r
-\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiUsbIoProtocolGuid,\r
- (VOID **) &UsbIo,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- //\r
- // Get the controller interface descriptor\r
- //\r
- Status = UsbIo->UsbGetInterfaceDescriptor (\r
- UsbIo,\r
- &InterfaceDescriptor\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ErrorExit;\r
- }\r
-\r
- CBI1AtapiProtocol.CommandProtocol = InterfaceDescriptor.InterfaceSubClass;\r
-\r
- UsbCbiDev = AllocateZeroPool (sizeof (USB_CBI_DEVICE));\r
- if (UsbCbiDev == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto ErrorExit;\r
- }\r
-\r
- UsbCbiDev->Signature = USB_CBI_DEVICE_SIGNATURE;\r
- UsbCbiDev->UsbIo = UsbIo;\r
- CopyMem (&UsbCbiDev->InterfaceDescriptor, &InterfaceDescriptor, sizeof (InterfaceDescriptor));\r
- CopyMem (&UsbCbiDev->UsbAtapiProtocol , &CBI1AtapiProtocol, sizeof (CBI1AtapiProtocol));\r
-\r
- //\r
- // Get the Device Path Protocol on Controller's handle\r
- //\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiDevicePathProtocolGuid,\r
- (VOID **) &UsbCbiDev->DevicePath,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- goto ErrorExit;\r
- }\r
-\r
- for (Index = 0; Index < InterfaceDescriptor.NumEndpoints; Index++) {\r
- UsbIo->UsbGetEndpointDescriptor (\r
- UsbIo,\r
- Index,\r
- &EndpointDescriptor\r
- );\r
-\r
- //\r
- // We parse bulk endpoint\r
- //\r
- if (EndpointDescriptor.Attributes == 0x02) {\r
- if (EndpointDescriptor.EndpointAddress & 0x80) {\r
- CopyMem (&UsbCbiDev->BulkInEndpointDescriptor, &EndpointDescriptor, sizeof (EndpointDescriptor));\r
- } else {\r
- CopyMem (&UsbCbiDev->BulkOutEndpointDescriptor, &EndpointDescriptor, sizeof (EndpointDescriptor));\r
- }\r
-\r
- Found = TRUE;\r
- }\r
- //\r
- // We parse interrupt endpoint\r
- //\r
- if (EndpointDescriptor.Attributes == 0x03) {\r
- CopyMem (&UsbCbiDev->InterruptEndpointDescriptor, &EndpointDescriptor, sizeof (EndpointDescriptor));\r
- Found = TRUE;\r
- }\r
-\r
- }\r
- //\r
- // Double check we have these\r
- //\r
- if (!Found) {\r
- goto ErrorExit;\r
- }\r
- //\r
- // After installing Usb-Atapi protocol onto this handle\r
- // it will be called by upper layer drivers such as Fat\r
- //\r
- Cbi1ReportStatusCode (\r
- UsbCbiDev->DevicePath,\r
- EFI_PROGRESS_CODE,\r
- (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_ENABLE)\r
- );\r
-\r
- Status = gBS->InstallProtocolInterface (\r
- &ControllerHandle,\r
- &gEfiUsbAtapiProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &UsbCbiDev->UsbAtapiProtocol\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- goto ErrorExit;\r
- }\r
-\r
- UsbCbiDev->ControllerNameTable = NULL;\r
- AddUnicodeString (\r
- "eng",\r
- gUsbCbi1ComponentName.SupportedLanguages,\r
- &UsbCbiDev->ControllerNameTable,\r
- (CHAR16 *) L"Usb Cbi1 Mass Storage"\r
- );\r
-\r
- return EFI_SUCCESS;\r
-\r
-ErrorExit:\r
- gBS->CloseProtocol (\r
- ControllerHandle,\r
- &gEfiUsbIoProtocolGuid,\r
- This->DriverBindingHandle,\r
- ControllerHandle\r
- );\r
- if (UsbCbiDev != NULL) {\r
- gBS->FreePool (UsbCbiDev);\r
- }\r
-\r
- return Status;\r
-\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-CBI1DriverBindingStop (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Stop this driver on ControllerHandle. Support stoping any child handles \r
- created by this driver.\r
-\r
- Arguments:\r
- This - Protocol instance pointer.\r
- ControllerHandle - Handle of device to stop driver on \r
- NumberOfChildren - Number of Children in the ChildHandleBuffer\r
- ChildHandleBuffer - List of handles for the children we need to stop.\r
-\r
- Returns:\r
- EFI_SUCCESS - This driver is removed DeviceHandle\r
- EFI_UNSUPPORTED - Can't open the gEfiUsbAtapiProtocolGuid protocol \r
- other - This driver was not removed from this device\r
- \r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_USB_ATAPI_PROTOCOL *CBI1AtapiProtocol;\r
- USB_CBI_DEVICE *UsbCbiDev;\r
-\r
- //\r
- // Get our context back.\r
- //\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiUsbAtapiProtocolGuid,\r
- (VOID **) &CBI1AtapiProtocol,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- UsbCbiDev = USB_CBI_DEVICE_FROM_THIS (CBI1AtapiProtocol);\r
-\r
- Cbi1ReportStatusCode (\r
- UsbCbiDev->DevicePath,\r
- EFI_PROGRESS_CODE,\r
- (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_DISABLE)\r
- );\r
-\r
- Status = gBS->UninstallProtocolInterface (\r
- ControllerHandle,\r
- &gEfiUsbAtapiProtocolGuid,\r
- &UsbCbiDev->UsbAtapiProtocol\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Status = gBS->CloseProtocol (\r
- ControllerHandle,\r
- &gEfiUsbIoProtocolGuid,\r
- This->DriverBindingHandle,\r
- ControllerHandle\r
- );\r
- gBS->FreePool (UsbCbiDev);\r
-\r
- return Status;\r
-\r
-}\r
-//\r
-// CBI1 command\r
-//\r
-STATIC\r
-EFI_STATUS\r
-CBI1CommandPhase (\r
- IN USB_CBI_DEVICE *UsbCbiDev,\r
- IN VOID *Command,\r
- IN UINT8 CommandSize,\r
- OUT UINT32 *Result\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- In order to make consistence, CBI transportation protocol does only use\r
- the first 3 parameters. Other parameters are not used here.\r
-\r
- Arguments:\r
- UsbCbiDev - USB_CBI_DEVICE\r
- Command - Command to send \r
- CommandSize - Command Size\r
- Result - Result to return\r
-\r
- Returns:\r
- EFI_SUCCESS - This driver is removed DeviceHandle\r
- other - This driver was not removed from this device \r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_USB_IO_PROTOCOL *UsbIo;\r
- EFI_USB_DEVICE_REQUEST Request;\r
- UINT32 TimeOutInMilliSeconds;\r
-\r
- UsbIo = UsbCbiDev->UsbIo;\r
-\r
- ZeroMem (&Request, sizeof (EFI_USB_DEVICE_REQUEST));\r
-\r
- //\r
- // Device request see CBI specification\r
- //\r
- Request.RequestType = 0x21;\r
- Request.Length = CommandSize;\r
-\r
- TimeOutInMilliSeconds = 1000;\r
-\r
- Status = UsbIo->UsbControlTransfer (\r
- UsbIo,\r
- &Request,\r
- EfiUsbDataOut,\r
- TimeOutInMilliSeconds,\r
- Command,\r
- CommandSize,\r
- Result\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-CBI1DataPhase (\r
- IN USB_CBI_DEVICE *UsbCbiDev,\r
- IN UINT32 DataSize,\r
- IN OUT VOID *DataBuffer,\r
- IN EFI_USB_DATA_DIRECTION Direction,\r
- IN UINT16 Timeout,\r
- OUT UINT32 *Result\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- CBI1 Data Phase\r
-\r
-Arguments:\r
-\r
- UsbCbiDev - USB_CBI_DEVICE\r
- DataSize - Data Size\r
- DataBuffer - Data Buffer\r
- Direction - IN/OUT/NODATA\r
- Timeout - Time out value in milliseconds\r
- Result - Transfer result\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Success\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_USB_IO_PROTOCOL *UsbIo;\r
- UINT8 EndpointAddr;\r
- UINTN Remain;\r
- UINTN Increment;\r
- UINT32 MaxPacketLen;\r
- UINT8 *BufferPtr;\r
-\r
- UsbIo = UsbCbiDev->UsbIo;\r
-\r
- Remain = DataSize;\r
- BufferPtr = (UINT8 *) DataBuffer;\r
-\r
- //\r
- // retrieve the the max packet length of the given endpoint\r
- //\r
- if (Direction == EfiUsbDataIn) {\r
- MaxPacketLen = (UsbCbiDev->BulkInEndpointDescriptor).MaxPacketSize;\r
- EndpointAddr = (UsbCbiDev->BulkInEndpointDescriptor).EndpointAddress;\r
- } else {\r
- MaxPacketLen = (UsbCbiDev->BulkOutEndpointDescriptor).MaxPacketSize;\r
- EndpointAddr = (UsbCbiDev->BulkOutEndpointDescriptor).EndpointAddress;\r
- }\r
-\r
- while (Remain > 0) {\r
- //\r
- // Using 15 packets to aVOID Bitstuff error\r
- //\r
- if (Remain > 15 * MaxPacketLen) {\r
- Increment = 15 * MaxPacketLen;\r
- } else {\r
- Increment = Remain;\r
- }\r
-\r
- Status = UsbIo->UsbBulkTransfer (\r
- UsbIo,\r
- EndpointAddr,\r
- BufferPtr,\r
- &Increment,\r
- Timeout,\r
- Result\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- goto ErrorExit;\r
- }\r
-\r
- BufferPtr += Increment;\r
- Remain -= Increment;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-\r
-ErrorExit:\r
-\r
- if (Direction == EfiUsbDataIn) {\r
- Cbi1ReportStatusCode (\r
- UsbCbiDev->DevicePath,\r
- EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
- (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_EC_INPUT_ERROR)\r
- );\r
- } else {\r
- Cbi1ReportStatusCode (\r
- UsbCbiDev->DevicePath,\r
- EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
- (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_EC_OUTPUT_ERROR)\r
- );\r
- }\r
-\r
- if (((*Result) & EFI_USB_ERR_STALL) == EFI_USB_ERR_STALL) {\r
- //\r
- // just endpoint stall happens\r
- //\r
- UsbClearEndpointHalt (\r
- UsbIo,\r
- EndpointAddr,\r
- Result\r
- );\r
- }\r
-\r
- return Status;\r
-}\r
-//\r
-// CBI1 USB ATAPI Protocol\r
-//\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-CBI1MassStorageReset (\r
- IN EFI_USB_ATAPI_PROTOCOL *This,\r
- IN BOOLEAN ExtendedVerification\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Reset CBI Devices\r
- \r
- Arguments:\r
- This - Protocol instance pointer.\r
- ExtendedVerification - TRUE if we need to do strictly reset.\r
-\r
- Returns:\r
- EFI_SUCCESS - Command succeeded.\r
- EFI_DEVICE_ERROR - Command failed.\r
-\r
---*/\r
-{\r
- UINT8 ResetCommand[12];\r
- EFI_USB_IO_PROTOCOL *UsbIo;\r
- USB_CBI_DEVICE *UsbCbiDev;\r
- UINT8 EndpointAddr;\r
- UINT32 Result;\r
-\r
- UsbCbiDev = USB_CBI_DEVICE_FROM_THIS (This);\r
- UsbIo = UsbCbiDev->UsbIo;\r
-\r
- Cbi1ReportStatusCode (\r
- UsbCbiDev->DevicePath,\r
- EFI_PROGRESS_CODE,\r
- (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_RESET)\r
- );\r
-\r
- if (ExtendedVerification) {\r
- UsbIo->UsbPortReset (UsbIo);\r
- }\r
- //\r
- // CBI reset command protocol\r
- //\r
- SetMem (ResetCommand, sizeof (ResetCommand), 0xff);\r
- ResetCommand[0] = 0x1d;\r
- ResetCommand[1] = 0x04;\r
-\r
- CBI1CommandPhase (\r
- UsbCbiDev,\r
- ResetCommand,\r
- 12,\r
- &Result\r
- );\r
-\r
- //\r
- // clear bulk in endpoint stall feature\r
- //\r
- EndpointAddr = UsbCbiDev->BulkInEndpointDescriptor.EndpointAddress;\r
- UsbClearEndpointHalt (\r
- UsbIo,\r
- EndpointAddr,\r
- &Result\r
- );\r
-\r
- //\r
- // clear bulk out endpoint stall feature\r
- //\r
- EndpointAddr = UsbCbiDev->BulkOutEndpointDescriptor.EndpointAddress;\r
- UsbClearEndpointHalt (\r
- UsbIo,\r
- EndpointAddr,\r
- &Result\r
- );\r
-\r
- return EFI_SUCCESS;\r
-\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-CBI1AtapiCommand (\r
- IN EFI_USB_ATAPI_PROTOCOL *This,\r
- IN VOID *Command,\r
- IN UINT8 CommandSize,\r
- IN VOID *DataBuffer,\r
- IN UINT32 BufferLength,\r
- IN EFI_USB_DATA_DIRECTION Direction,\r
- IN UINT16 TimeOutInMilliSeconds\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Send ATAPI command using CBI1 protocol.\r
- \r
- Arguments:\r
- This - Protocol instance pointer.\r
- Command - Command buffer \r
- CommandSize - Size of Command Buffer\r
- DataBuffer - Data buffer\r
- BufferLength - Length of Data buffer\r
- Direction - Data direction of this command\r
- TimeOutInMilliSeconds - Timeout value in ms\r
-\r
- Returns:\r
- EFI_SUCCESS - Command succeeded.\r
- EFI_DEVICE_ERROR - Command failed.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- USB_CBI_DEVICE *UsbCbiDev;\r
- UINT32 Result;\r
- UINT8 Index;\r
- UINT8 MaxRetryNum;\r
-\r
- UsbCbiDev = USB_CBI_DEVICE_FROM_THIS (This);\r
-\r
- MaxRetryNum = 3;\r
-\r
- for (Index = 0; Index < MaxRetryNum; Index++) {\r
- \r
- //\r
- // First send ATAPI command through CBI1\r
- //\r
- Status = CBI1CommandPhase (\r
- UsbCbiDev,\r
- Command,\r
- CommandSize,\r
- &Result\r
- );\r
- if (EFI_ERROR (Status)) {\r
-\r
- switch (Result) {\r
-\r
- case EFI_USB_NOERROR:\r
- case EFI_USB_ERR_STALL:\r
- case EFI_USB_ERR_SYSTEM:\r
- return EFI_DEVICE_ERROR;\r
-\r
- default:\r
- continue;\r
- break;\r
- }\r
- } else {\r
- break;\r
- }\r
- }\r
-\r
- if (Index == MaxRetryNum) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- for (Index = 0; Index < MaxRetryNum; Index++) {\r
- //\r
- // Send/Get Data if there is a Data Stage\r
- //\r
- switch (Direction) {\r
-\r
- case EfiUsbDataIn:\r
- case EfiUsbDataOut:\r
- Status = CBI1DataPhase (\r
- UsbCbiDev,\r
- BufferLength,\r
- DataBuffer,\r
- Direction,\r
- TimeOutInMilliSeconds,\r
- &Result\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- switch (Result) {\r
-\r
- case EFI_USB_NOERROR:\r
- case EFI_USB_ERR_STALL:\r
- case EFI_USB_ERR_SYSTEM:\r
- return EFI_DEVICE_ERROR;\r
-\r
- default:\r
- continue;\r
- break;\r
- }\r
-\r
- } else {\r
-\r
- return EFI_SUCCESS;\r
- }\r
- break;\r
-\r
- case EfiUsbNoData:\r
- return EFI_SUCCESS;\r
- }\r
- }\r
- //\r
- // If goes here, means met error.\r
- //\r
- return EFI_DEVICE_ERROR;\r
-}\r
-\r
-STATIC\r
-VOID\r
-Cbi1ReportStatusCode (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
- IN EFI_STATUS_CODE_TYPE CodeType,\r
- IN EFI_STATUS_CODE_VALUE Value\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Report Status Code in Usb Cbi1 Driver\r
-\r
- Arguments:\r
- DevicePath - Use this to get Device Path\r
- CodeType - Status Code Type\r
- CodeValue - Status Code Value\r
-\r
- Returns:\r
- None\r
-\r
---*/\r
-{\r
- REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
- CodeType,\r
- Value,\r
- DevicePath\r
- );\r
-\r
-}\r