4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Definition for the USB mass storage Bulk-Only Transport protocol,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync based on the "Universal Serial Bus Mass Storage Class Bulk-Only
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Transport" Revision 1.0, September 31, 1999.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef _EFI_USBMASS_BOT_H_
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define _EFI_USBMASS_BOT_H_
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern USB_MASS_TRANSPORT mUsbBotTransport;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Usb Bulk-Only class specfic request
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_RESET_REQUEST 0xFF ///< Bulk-Only Mass Storage Reset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_GETLUN_REQUEST 0xFE ///< Get Max Lun
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_CBW_SIGNATURE 0x43425355 ///< dCBWSignature, tag the packet as CBW
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_CSW_SIGNATURE 0x53425355 ///< dCSWSignature, tag the packet as CSW
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_MAX_LUN 0x0F ///< Lun number is from 0 to 15
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_MAX_CMDLEN 16 ///< Maxium number of command from command set
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Usb BOT command block status values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_COMMAND_OK 0x00 ///< Command passed, good status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_COMMAND_FAILED 0x01 ///< Command failed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_COMMAND_ERROR 0x02 ///< Phase error, need to reset the device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Usb Bot retry to get CSW, refers to specification[BOT10-5.3, it says 2 times]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_RECV_CSW_RETRY 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Usb Bot wait device reset complete, set by experience
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_RESET_DEVICE_STALL (100 * USB_MASS_1_MILLISECOND)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Usb Bot transport timeout, set by experience
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_SEND_CBW_TIMEOUT (3 * USB_MASS_1_SECOND)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_RECV_CSW_TIMEOUT (3 * USB_MASS_1_SECOND)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define USB_BOT_RESET_DEVICE_TIMEOUT (3 * USB_MASS_1_SECOND)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#pragma pack(1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// The CBW (Command Block Wrapper) structures used by the USB BOT protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Signature;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Tag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 DataLen; ///< Length of data between CBW and CSW
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Flag; ///< Bit 7, 0 ~ Data-Out, 1 ~ Data-In
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Lun; ///< Lun number. Bits 0~3 are used
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 CmdLen; ///< Length of the command. Bits 0~4 are used
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 CmdBlock[USB_BOT_MAX_CMDLEN];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} USB_BOT_CBW;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// The and CSW (Command Status Wrapper) structures used by the USB BOT protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Signature;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Tag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 DataResidue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 CmdStatus;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} USB_BOT_CSW;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#pragma pack()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Put Interface at the first field to make it easy to distinguish BOT/CBI Protocol instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_INTERFACE_DESCRIPTOR Interface;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_ENDPOINT_DESCRIPTOR *BulkInEndpoint;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_ENDPOINT_DESCRIPTOR *BulkOutEndpoint;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 CbwTag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_USB_IO_PROTOCOL *UsbIo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} USB_BOT_PROTOCOL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Initializes USB BOT protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function initializes the USB mass storage class BOT protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It will save its context which is a USB_BOT_PROTOCOL structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync in the Context if Context isn't NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UsbIo The USB I/O Protocol instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Context The buffer to save the context to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The device is successfully initialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The transport protocol doesn't support the device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other The USB BOT initialization fails.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUsbBotInit (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_USB_IO_PROTOCOL *UsbIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID **Context OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Call the USB Mass Storage Class BOT protocol to issue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the command/data/status circle to execute the commands.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Context The context of the BOT protocol, that is,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync USB_BOT_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Cmd The high level command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CmdLen The command length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DataDir The direction of the data transfer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Data The buffer to hold data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DataLen The length of the data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Lun The number of logic unit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Timeout The time to wait command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CmdStatus The result of high level command execution
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The command is executed successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other Failed to excute command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUsbBotExecCommand (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Cmd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 CmdLen,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_USB_DATA_DIRECTION DataDir,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 DataLen,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Lun,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Timeout,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *CmdStatus
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reset the USB mass storage device by BOT protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Context The context of the BOT protocol, that is,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync USB_BOT_PROTOCOL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ExtendedVerification If FALSE, just issue Bulk-Only Mass Storage Reset request.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If TRUE, additionally reset parent hub port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The device is reset.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Failed to reset the device..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUsbBotResetDevice (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN ExtendedVerification
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the max LUN (Logical Unit Number) of USB mass storage device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Context The context of the BOT protocol, that is, USB_BOT_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MaxLun Return pointer to the max number of LUN. (e.g. MaxLun=1 means LUN0 and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LUN1 in all.)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Max LUN is got successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Fail to execute this request.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUsbBotGetMaxLun (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 *MaxLun
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Clean up the resource used by this BOT protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Context The context of the BOT protocol, that is, USB_BOT_PROTOCOL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The resource is cleaned up.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUsbBotCleanUp (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif