]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.h
Revert "EhciDxe: Use common buffer for AsyncInterruptTransfer"
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / EhciDxe / EhciUrb.h
CommitLineData
913cb9dc 1/** @file\r
2\r
78c2ffb5 3 This file contains URB request, each request is warpped in a\r
4 URB (Usb Request Block).\r
5\r
f87db256 6Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
cd5ebaa0 7This program and the accompanying materials\r
913cb9dc 8are licensed and made available under the terms and conditions of the BSD License\r
9which accompanies this distribution. The full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
11\r
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
913cb9dc 15**/\r
16\r
17#ifndef _EFI_EHCI_URB_H_\r
18#define _EFI_EHCI_URB_H_\r
19\r
20\r
21typedef struct _EHC_QTD EHC_QTD;\r
22typedef struct _EHC_QH EHC_QH;\r
23typedef struct _URB URB;\r
24\r
1ccdbf2a 25//\r
26// Transfer types, used in URB to identify the transfer type\r
27//\r
28#define EHC_CTRL_TRANSFER 0x01\r
29#define EHC_BULK_TRANSFER 0x02\r
30#define EHC_INT_TRANSFER_SYNC 0x04\r
31#define EHC_INT_TRANSFER_ASYNC 0x08\r
913cb9dc 32\r
1ccdbf2a 33#define EHC_QTD_SIG SIGNATURE_32 ('U', 'S', 'B', 'T')\r
34#define EHC_QH_SIG SIGNATURE_32 ('U', 'S', 'B', 'H')\r
35#define EHC_URB_SIG SIGNATURE_32 ('U', 'S', 'B', 'R')\r
913cb9dc 36\r
1ccdbf2a 37//\r
38// Hardware related bit definitions\r
39//\r
40#define EHC_TYPE_ITD 0x00\r
41#define EHC_TYPE_QH 0x02\r
42#define EHC_TYPE_SITD 0x04\r
43#define EHC_TYPE_FSTN 0x06\r
44\r
45#define QH_NAK_RELOAD 3\r
46#define QH_HSHBW_MULTI 1\r
47\r
48#define QTD_MAX_ERR 3\r
49#define QTD_PID_OUTPUT 0x00\r
50#define QTD_PID_INPUT 0x01\r
51#define QTD_PID_SETUP 0x02\r
52\r
53#define QTD_STAT_DO_OUT 0\r
54#define QTD_STAT_DO_SS 0\r
55#define QTD_STAT_DO_PING 0x01\r
56#define QTD_STAT_DO_CS 0x02\r
57#define QTD_STAT_TRANS_ERR 0x08\r
58#define QTD_STAT_BABBLE_ERR 0x10\r
59#define QTD_STAT_BUFF_ERR 0x20\r
60#define QTD_STAT_HALTED 0x40\r
61#define QTD_STAT_ACTIVE 0x80\r
62#define QTD_STAT_ERR_MASK (QTD_STAT_TRANS_ERR | QTD_STAT_BABBLE_ERR | QTD_STAT_BUFF_ERR)\r
63\r
64#define QTD_MAX_BUFFER 4\r
65#define QTD_BUF_LEN 4096\r
66#define QTD_BUF_MASK 0x0FFF\r
67\r
68#define QH_MICROFRAME_0 0x01\r
69#define QH_MICROFRAME_1 0x02\r
70#define QH_MICROFRAME_2 0x04\r
71#define QH_MICROFRAME_3 0x08\r
72#define QH_MICROFRAME_4 0x10\r
73#define QH_MICROFRAME_5 0x20\r
74#define QH_MICROFRAME_6 0x40\r
75#define QH_MICROFRAME_7 0x80\r
76\r
77#define USB_ERR_SHORT_PACKET 0x200\r
913cb9dc 78\r
79//\r
80// Fill in the hardware link point: pass in a EHC_QH/QH_HW\r
81// pointer to QH_LINK; A EHC_QTD/QTD_HW pointer to QTD_LINK\r
82//\r
83#define QH_LINK(Addr, Type, Term) \\r
84 ((UINT32) ((EHC_LOW_32BIT (Addr) & 0xFFFFFFE0) | (Type) | ((Term) ? 1 : 0)))\r
85\r
86#define QTD_LINK(Addr, Term) QH_LINK((Addr), 0, (Term))\r
87\r
88//\r
89// The defination of EHCI hardware used data structure for\r
90// little endian architecture. The QTD and QH structures\r
91// are required to be 32 bytes aligned. Don't add members\r
92// to the head of the associated software strucuture.\r
93//\r
94#pragma pack(1)\r
95typedef struct {\r
96 UINT32 NextQtd;\r
97 UINT32 AltNext;\r
98\r
99 UINT32 Status : 8;\r
100 UINT32 Pid : 2;\r
101 UINT32 ErrCnt : 2;\r
102 UINT32 CurPage : 3;\r
1ccdbf2a 103 UINT32 Ioc : 1;\r
913cb9dc 104 UINT32 TotalBytes : 15;\r
105 UINT32 DataToggle : 1;\r
106\r
107 UINT32 Page[5];\r
108 UINT32 PageHigh[5];\r
109} QTD_HW;\r
110\r
111typedef struct {\r
112 UINT32 HorizonLink;\r
113 //\r
114 // Endpoint capabilities/Characteristics DWord 1 and DWord 2\r
115 //\r
116 UINT32 DeviceAddr : 7;\r
117 UINT32 Inactive : 1;\r
118 UINT32 EpNum : 4;\r
119 UINT32 EpSpeed : 2;\r
120 UINT32 DtCtrl : 1;\r
121 UINT32 ReclaimHead : 1;\r
122 UINT32 MaxPacketLen : 11;\r
123 UINT32 CtrlEp : 1;\r
124 UINT32 NakReload : 4;\r
125\r
126 UINT32 SMask : 8;\r
127 UINT32 CMask : 8;\r
128 UINT32 HubAddr : 7;\r
129 UINT32 PortNum : 7;\r
130 UINT32 Multiplier : 2;\r
131\r
132 //\r
133 // Transaction execution overlay area\r
134 //\r
135 UINT32 CurQtd;\r
136 UINT32 NextQtd;\r
137 UINT32 AltQtd;\r
138\r
139 UINT32 Status : 8;\r
140 UINT32 Pid : 2;\r
141 UINT32 ErrCnt : 2;\r
142 UINT32 CurPage : 3;\r
1ccdbf2a 143 UINT32 Ioc : 1;\r
913cb9dc 144 UINT32 TotalBytes : 15;\r
145 UINT32 DataToggle : 1;\r
146\r
147 UINT32 Page[5];\r
148 UINT32 PageHigh[5];\r
149} QH_HW;\r
150#pragma pack()\r
151\r
152\r
153//\r
154// Endpoint address and its capabilities\r
155//\r
156typedef struct _USB_ENDPOINT {\r
157 UINT8 DevAddr;\r
158 UINT8 EpAddr; // Endpoint address, no direction encoded in\r
159 EFI_USB_DATA_DIRECTION Direction;\r
160 UINT8 DevSpeed;\r
161 UINTN MaxPacket;\r
162 UINT8 HubAddr;\r
163 UINT8 HubPort;\r
164 UINT8 Toggle; // Data toggle, not used for control transfer\r
165 UINTN Type;\r
166 UINTN PollRate; // Polling interval used by EHCI\r
167} USB_ENDPOINT;\r
168\r
169//\r
170// Software QTD strcture, this is used to manage all the\r
171// QTD generated from a URB. Don't add fields before QtdHw.\r
172//\r
c52fa98c 173struct _EHC_QTD {\r
913cb9dc 174 QTD_HW QtdHw;\r
175 UINT32 Signature;\r
176 LIST_ENTRY QtdList; // The list of QTDs to one end point\r
177 UINT8 *Data; // Buffer of the original data\r
178 UINTN DataLen; // Original amount of data in this QTD\r
c52fa98c 179};\r
913cb9dc 180\r
181//\r
182// Software QH structure. All three different transaction types\r
183// supported by UEFI USB, that is the control/bulk/interrupt\r
184// transfers use the queue head and queue token strcuture.\r
185//\r
186// Interrupt QHs are linked to periodic frame list in the reversed\r
187// 2^N tree. Each interrupt QH is linked to the list starting at\r
188// frame 0. There is a dummy interrupt QH linked to each frame as\r
189// a sentinental whose polling interval is 1. Synchronous interrupt\r
190// transfer is linked after this dummy QH.\r
191//\r
192// For control/bulk transfer, only synchronous (in the sense of UEFI)\r
193// transfer is supported. A dummy QH is linked to EHCI AsyncListAddr\r
194// as the reclamation header. New transfer is inserted after this QH.\r
195//\r
c52fa98c 196struct _EHC_QH {\r
913cb9dc 197 QH_HW QhHw;\r
198 UINT32 Signature;\r
199 EHC_QH *NextQh; // The queue head pointed to by horizontal link\r
200 LIST_ENTRY Qtds; // The list of QTDs to this queue head\r
201 UINTN Interval;\r
c52fa98c 202};\r
913cb9dc 203\r
204//\r
205// URB (Usb Request Block) contains information for all kinds of\r
206// usb requests.\r
207//\r
c52fa98c 208struct _URB {\r
913cb9dc 209 UINT32 Signature;\r
210 LIST_ENTRY UrbList;\r
211\r
212 //\r
213 // Transaction information\r
214 //\r
215 USB_ENDPOINT Ep;\r
216 EFI_USB_DEVICE_REQUEST *Request; // Control transfer only\r
217 VOID *RequestPhy; // Address of the mapped request\r
218 VOID *RequestMap;\r
219 VOID *Data;\r
220 UINTN DataLen;\r
221 VOID *DataPhy; // Address of the mapped user data\r
222 VOID *DataMap;\r
223 EFI_ASYNC_USB_TRANSFER_CALLBACK Callback;\r
224 VOID *Context;\r
225\r
226 //\r
227 // Schedule data\r
228 //\r
229 EHC_QH *Qh;\r
230\r
231 //\r
232 // Transaction result\r
233 //\r
234 UINT32 Result;\r
235 UINTN Completed; // completed data length\r
236 UINT8 DataToggle;\r
c52fa98c 237};\r
913cb9dc 238\r
239\r
240\r
241/**\r
78c2ffb5 242 Create a single QTD to hold the data.\r
913cb9dc 243\r
78c2ffb5 244 @param Ehc The EHCI device.\r
739802e4 245 @param Data The cpu memory address of current data not associated with a QTD.\r
246 @param DataPhy The pci bus address of current data not associated with a QTD.\r
78c2ffb5 247 @param DataLen The length of the data.\r
248 @param PktId Packet ID to use in the QTD.\r
249 @param Toggle Data toggle to use in the QTD.\r
250 @param MaxPacket Maximu packet length of the endpoint.\r
913cb9dc 251\r
78c2ffb5 252 @return Created QTD or NULL if failed to create one.\r
913cb9dc 253\r
254**/\r
255EHC_QTD *\r
256EhcCreateQtd (\r
257 IN USB2_HC_DEV *Ehc,\r
258 IN UINT8 *Data,\r
739802e4 259 IN UINT8 *DataPhy,\r
913cb9dc 260 IN UINTN DataLen,\r
261 IN UINT8 PktId,\r
262 IN UINT8 Toggle,\r
263 IN UINTN MaxPacket\r
ed66e1bc 264 );\r
913cb9dc 265\r
266\r
267\r
268/**\r
78c2ffb5 269 Allocate and initialize a EHCI queue head.\r
913cb9dc 270\r
78c2ffb5 271 @param Ehci The EHCI device.\r
272 @param Ep The endpoint to create queue head for.\r
913cb9dc 273\r
78c2ffb5 274 @return Created queue head or NULL if failed to create one.\r
913cb9dc 275\r
276**/\r
277EHC_QH *\r
278EhcCreateQh (\r
279 IN USB2_HC_DEV *Ehci,\r
280 IN USB_ENDPOINT *Ep\r
ed66e1bc 281 );\r
913cb9dc 282\r
283\r
284/**\r
285 Free an allocated URB. It is possible for it to be partially inited.\r
286\r
78c2ffb5 287 @param Ehc The EHCI device.\r
288 @param Urb The URB to free.\r
913cb9dc 289\r
913cb9dc 290**/\r
291VOID\r
292EhcFreeUrb (\r
293 IN USB2_HC_DEV *Ehc,\r
294 IN URB *Urb\r
ed66e1bc 295 );\r
913cb9dc 296\r
297\r
298/**\r
78c2ffb5 299 Create a new URB and its associated QTD.\r
300\r
f87db256
SZ
301 @param Ehc The EHCI device.\r
302 @param DevAddr The device address.\r
303 @param EpAddr Endpoint addrress & its direction.\r
304 @param DevSpeed The device speed.\r
305 @param Toggle Initial data toggle to use.\r
306 @param MaxPacket The max packet length of the endpoint.\r
307 @param Hub The transaction translator to use.\r
308 @param Type The transaction type.\r
309 @param Request The standard USB request for control transfer.\r
310 @param Data The user data to transfer.\r
311 @param DataLen The length of data buffer.\r
312 @param Callback The function to call when data is transferred.\r
313 @param Context The context to the callback.\r
314 @param Interval The interval for interrupt transfer.\r
78c2ffb5 315\r
316 @return Created URB or NULL.\r
913cb9dc 317\r
318**/\r
319URB *\r
320EhcCreateUrb (\r
321 IN USB2_HC_DEV *Ehc,\r
322 IN UINT8 DevAddr,\r
323 IN UINT8 EpAddr,\r
324 IN UINT8 DevSpeed,\r
325 IN UINT8 Toggle,\r
326 IN UINTN MaxPacket,\r
327 IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,\r
328 IN UINTN Type,\r
329 IN EFI_USB_DEVICE_REQUEST *Request,\r
330 IN VOID *Data,\r
331 IN UINTN DataLen,\r
332 IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,\r
333 IN VOID *Context,\r
334 IN UINTN Interval\r
ed66e1bc 335 );\r
913cb9dc 336#endif\r