| /** @file | |
| Definition for the USB mass storage Control/Bulk/Interrupt (CBI) transport, | |
| according to USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport, Revision 1.1. | |
| Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #pragma once | |
| extern USB_MASS_TRANSPORT mUsbCbi0Transport; | |
| extern USB_MASS_TRANSPORT mUsbCbi1Transport; | |
| #define USB_CBI_MAX_PACKET_NUM 16 | |
| #define USB_CBI_RESET_CMD_LEN 12 | |
| // | |
| // USB CBI retry C/B/I transport times, set by experience | |
| // | |
| #define USB_CBI_MAX_RETRY 3 | |
| // | |
| // Time to wait for USB CBI reset to complete, set by experience | |
| // | |
| #define USB_CBI_RESET_DEVICE_STALL (50 * USB_MASS_1_MILLISECOND) | |
| // | |
| // USB CBI transport timeout, set by experience | |
| // | |
| #define USB_CBI_RESET_DEVICE_TIMEOUT (1 * USB_MASS_1_SECOND) | |
| typedef struct { | |
| // | |
| // Put Interface at the first field to make it easy to distinguish BOT/CBI Protocol instance | |
| // | |
| EFI_USB_INTERFACE_DESCRIPTOR Interface; | |
| EFI_USB_ENDPOINT_DESCRIPTOR *BulkInEndpoint; | |
| EFI_USB_ENDPOINT_DESCRIPTOR *BulkOutEndpoint; | |
| EFI_USB_ENDPOINT_DESCRIPTOR *InterruptEndpoint; | |
| EFI_USB_IO_PROTOCOL *UsbIo; | |
| } USB_CBI_PROTOCOL; | |
| #pragma pack(1) | |
| typedef struct { | |
| UINT8 Type; | |
| UINT8 Value; | |
| } USB_CBI_STATUS; | |
| #pragma pack() | |
| /** | |
| Initializes USB CBI protocol. | |
| This function initializes the USB mass storage class CBI protocol. | |
| It will save its context which is a USB_CBI_PROTOCOL structure | |
| in the Context if Context isn't NULL. | |
| @param UsbIo The USB I/O Protocol instance | |
| @param Context The buffer to save the context to | |
| @retval EFI_SUCCESS The device is successfully initialized. | |
| @retval EFI_UNSUPPORTED The transport protocol doesn't support the device. | |
| @retval Other The USB CBI initialization fails. | |
| **/ | |
| EFI_STATUS | |
| UsbCbiInit ( | |
| IN EFI_USB_IO_PROTOCOL *UsbIo, | |
| OUT VOID **Context OPTIONAL | |
| ); | |
| /** | |
| Execute USB mass storage command through the CBI0/CBI1 transport protocol. | |
| @param Context The USB CBI Protocol. | |
| @param Cmd The command to transfer to device | |
| @param CmdLen The length of the command | |
| @param DataDir The direction of data transfer | |
| @param Data The buffer to hold the data | |
| @param DataLen The length of the buffer | |
| @param Lun Should be 0, this field for bot only | |
| @param Timeout The time to wait | |
| @param CmdStatus The result of the command execution | |
| @retval EFI_SUCCESS The command is executed successfully. | |
| @retval Other Failed to execute the command | |
| **/ | |
| EFI_STATUS | |
| UsbCbiExecCommand ( | |
| IN VOID *Context, | |
| IN VOID *Cmd, | |
| IN UINT8 CmdLen, | |
| IN EFI_USB_DATA_DIRECTION DataDir, | |
| IN VOID *Data, | |
| IN UINT32 DataLen, | |
| IN UINT8 Lun, | |
| IN UINT32 Timeout, | |
| OUT UINT32 *CmdStatus | |
| ); | |
| /** | |
| Reset the USB mass storage device by CBI protocol. | |
| This function resets the USB mass storage device by CBI protocol. | |
| The reset is defined as a non-data command. Don't use UsbCbiExecCommand | |
| to send the command to device because that may introduce recursive loop. | |
| @param Context The USB CBI protocol | |
| @param ExtendedVerification The flag controlling the rule of reset. | |
| Not used here. | |
| @retval EFI_SUCCESS The device is reset. | |
| @retval Others Failed to reset the device. | |
| **/ | |
| EFI_STATUS | |
| UsbCbiResetDevice ( | |
| IN VOID *Context, | |
| IN BOOLEAN ExtendedVerification | |
| ); | |
| /** | |
| Clean up the CBI protocol's resource. | |
| @param Context The instance of CBI protocol. | |
| @retval EFI_SUCCESS The resource is cleaned up. | |
| **/ | |
| EFI_STATUS | |
| UsbCbiCleanUp ( | |
| IN VOID *Context | |
| ); |