1 /** @file
2   Definition for the USB mass storage Bulk-Only Transport protocol,
3   based on the "Universal Serial Bus Mass Storage Class Bulk-Only
4   Transport" Revision 1.0, September 31, 1999.
5 
6 Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution.  The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
11 
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 
15 **/
16 
17 #ifndef _EFI_USBMASS_BOT_H_
18 #define _EFI_USBMASS_BOT_H_
19 
20 extern USB_MASS_TRANSPORT mUsbBotTransport;
21 
22 //
23 // Usb Bulk-Only class specfic request
24 //
25 #define USB_BOT_RESET_REQUEST    0xFF       ///< Bulk-Only Mass Storage Reset
26 #define USB_BOT_GETLUN_REQUEST   0xFE       ///< Get Max Lun
27 #define USB_BOT_CBW_SIGNATURE    0x43425355 ///< dCBWSignature, tag the packet as CBW
28 #define USB_BOT_CSW_SIGNATURE    0x53425355 ///< dCSWSignature, tag the packet as CSW
29 #define USB_BOT_MAX_LUN          0x0F       ///< Lun number is from 0 to 15
30 #define USB_BOT_MAX_CMDLEN       16         ///< Maxium number of command from command set
31 
32 //
33 // Usb BOT command block status values
34 //
35 #define USB_BOT_COMMAND_OK       0x00 ///< Command passed, good status
36 #define USB_BOT_COMMAND_FAILED   0x01 ///< Command failed
37 #define USB_BOT_COMMAND_ERROR    0x02 ///< Phase error, need to reset the device
38 
39 //
40 // Usb Bot retry to get CSW, refers to specification[BOT10-5.3, it says 2 times]
41 //
42 #define USB_BOT_RECV_CSW_RETRY   3
43 
44 //
45 // Usb Bot wait device reset complete, set by experience
46 //
47 #define USB_BOT_RESET_DEVICE_STALL  (100 * USB_MASS_1_MILLISECOND)
48 
49 //
50 // Usb Bot transport timeout, set by experience
51 //
52 #define USB_BOT_SEND_CBW_TIMEOUT     (3 * USB_MASS_1_SECOND)
53 #define USB_BOT_RECV_CSW_TIMEOUT     (3 * USB_MASS_1_SECOND)
54 #define USB_BOT_RESET_DEVICE_TIMEOUT (3 * USB_MASS_1_SECOND)
55 
56 #pragma pack(1)
57 ///
58 /// The CBW (Command Block Wrapper) structures used by the USB BOT protocol.
59 ///
60 typedef struct {
61   UINT32              Signature;
62   UINT32              Tag;
63   UINT32              DataLen;  ///< Length of data between CBW and CSW
64   UINT8               Flag;     ///< Bit 7, 0 ~ Data-Out, 1 ~ Data-In
65   UINT8               Lun;      ///< Lun number. Bits 0~3 are used
66   UINT8               CmdLen;   ///< Length of the command. Bits 0~4 are used
67   UINT8               CmdBlock[USB_BOT_MAX_CMDLEN];
68 } USB_BOT_CBW;
69 
70 ///
71 /// The and CSW (Command Status Wrapper) structures used by the USB BOT protocol.
72 ///
73 typedef struct {
74   UINT32              Signature;
75   UINT32              Tag;
76   UINT32              DataResidue;
77   UINT8               CmdStatus;
78 } USB_BOT_CSW;
79 #pragma pack()
80 
81 typedef struct {
82   //
83   // Put Interface at the first field to make it easy to distinguish BOT/CBI Protocol instance
84   //
85   EFI_USB_INTERFACE_DESCRIPTOR  Interface;
86   EFI_USB_ENDPOINT_DESCRIPTOR   *BulkInEndpoint;
87   EFI_USB_ENDPOINT_DESCRIPTOR   *BulkOutEndpoint;
88   UINT32                        CbwTag;
89   EFI_USB_IO_PROTOCOL           *UsbIo;
90 } USB_BOT_PROTOCOL;
91 
92 /**
93   Initializes USB BOT protocol.
94 
95   This function initializes the USB mass storage class BOT protocol.
96   It will save its context which is a USB_BOT_PROTOCOL structure
97   in the Context if Context isn't NULL.
98 
99   @param  UsbIo                 The USB I/O Protocol instance
100   @param  Context               The buffer to save the context to
101 
102   @retval EFI_SUCCESS           The device is successfully initialized.
103   @retval EFI_UNSUPPORTED       The transport protocol doesn't support the device.
104   @retval Other                 The USB BOT initialization fails.
105 
106 **/
107 EFI_STATUS
108 UsbBotInit (
109   IN  EFI_USB_IO_PROTOCOL       *UsbIo,
110   OUT VOID                      **Context OPTIONAL
111   );
112 
113 /**
114   Call the USB Mass Storage Class BOT protocol to issue
115   the command/data/status circle to execute the commands.
116 
117   @param  Context               The context of the BOT protocol, that is,
118                                 USB_BOT_PROTOCOL
119   @param  Cmd                   The high level command
120   @param  CmdLen                The command length
121   @param  DataDir               The direction of the data transfer
122   @param  Data                  The buffer to hold data
123   @param  DataLen               The length of the data
124   @param  Lun                   The number of logic unit
125   @param  Timeout               The time to wait command
126   @param  CmdStatus             The result of high level command execution
127 
128   @retval EFI_SUCCESS           The command is executed successfully.
129   @retval Other                 Failed to excute command
130 
131 **/
132 EFI_STATUS
133 UsbBotExecCommand (
134   IN  VOID                    *Context,
135   IN  VOID                    *Cmd,
136   IN  UINT8                   CmdLen,
137   IN  EFI_USB_DATA_DIRECTION  DataDir,
138   IN  VOID                    *Data,
139   IN  UINT32                  DataLen,
140   IN  UINT8                   Lun,
141   IN  UINT32                  Timeout,
142   OUT UINT32                  *CmdStatus
143   );
144 
145 /**
146   Reset the USB mass storage device by BOT protocol.
147 
148   @param  Context               The context of the BOT protocol, that is,
149                                 USB_BOT_PROTOCOL.
150   @param  ExtendedVerification  If FALSE, just issue Bulk-Only Mass Storage Reset request.
151                                 If TRUE, additionally reset parent hub port.
152 
153   @retval EFI_SUCCESS           The device is reset.
154   @retval Others                Failed to reset the device..
155 
156 **/
157 EFI_STATUS
158 UsbBotResetDevice (
159   IN  VOID                    *Context,
160   IN  BOOLEAN                 ExtendedVerification
161   );
162 
163 /**
164   Get the max LUN (Logical Unit Number) of USB mass storage device.
165 
166   @param  Context          The context of the BOT protocol, that is, USB_BOT_PROTOCOL
167   @param  MaxLun           Return pointer to the max number of LUN. (e.g. MaxLun=1 means LUN0 and
168                            LUN1 in all.)
169 
170   @retval EFI_SUCCESS      Max LUN is got successfully.
171   @retval Others           Fail to execute this request.
172 
173 **/
174 EFI_STATUS
175 UsbBotGetMaxLun (
176   IN  VOID                    *Context,
177   OUT UINT8                   *MaxLun
178   );
179 
180 /**
181   Clean up the resource used by this BOT protocol.
182 
183   @param  Context         The context of the BOT protocol, that is, USB_BOT_PROTOCOL.
184 
185   @retval EFI_SUCCESS     The resource is cleaned up.
186 
187 **/
188 EFI_STATUS
189 UsbBotCleanUp (
190   IN  VOID                    *Context
191   );
192 
193 #endif
194