1 /** @file
2 
3   The definition for EHCI register operation routines.
4 
5 Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution.  The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10 
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #ifndef _EFI_UHCI_SCHED_H_
17 #define _EFI_UHCI_SCHED_H_
18 
19 
20 #define UHCI_ASYNC_INT_SIGNATURE  SIGNATURE_32 ('u', 'h', 'c', 'a')
21 //
22 // The failure mask for USB transfer return status. If any of
23 // these bit is set, the transfer failed. EFI_USB_ERR_NOEXECUTE
24 // and EFI_USB_ERR_NAK are not considered as error condition:
25 // the transfer is still going on.
26 //
27 #define USB_ERR_FAIL_MASK  (EFI_USB_ERR_STALL   | EFI_USB_ERR_BUFFER | \
28                             EFI_USB_ERR_BABBLE  | EFI_USB_ERR_CRC    | \
29                             EFI_USB_ERR_TIMEOUT | EFI_USB_ERR_BITSTUFF | \
30                             EFI_USB_ERR_SYSTEM)
31 
32 
33 //
34 // Structure to return the result of UHCI QH execution.
35 // Result is the final result of the QH's QTD. NextToggle
36 // is the next data toggle to use. Complete is the actual
37 // length of data transferred.
38 //
39 typedef struct {
40   UINT32                  Result;
41   UINT8                   NextToggle;
42   UINTN                   Complete;
43 } UHCI_QH_RESULT;
44 
45 typedef struct _UHCI_ASYNC_REQUEST  UHCI_ASYNC_REQUEST;
46 
47 //
48 // Structure used to manager the asynchronous interrupt transfers.
49 //
50 struct _UHCI_ASYNC_REQUEST{
51   UINTN                           Signature;
52   LIST_ENTRY                      Link;
53   UHCI_ASYNC_REQUEST              *Recycle;
54 
55   //
56   // Endpoint attributes
57   //
58   UINT8                           DevAddr;
59   UINT8                           EndPoint;
60   BOOLEAN                         IsLow;
61   UINTN                           Interval;
62 
63   //
64   // Data and UHC structures
65   //
66   UHCI_QH_SW                      *QhSw;
67   UHCI_TD_SW                      *FirstTd;
68   UINT8                           *Data;      // Allocated host memory, not mapped memory
69   UINTN                           DataLen;
70   VOID                            *Mapping;
71 
72   //
73   // User callback and its context
74   //
75   EFI_ASYNC_USB_TRANSFER_CALLBACK Callback;
76   VOID                            *Context;
77 };
78 
79 #define UHCI_ASYNC_INT_FROM_LINK(a) \
80           CR (a, UHCI_ASYNC_REQUEST, Link, UHCI_ASYNC_INT_SIGNATURE)
81 
82 
83 /**
84   Create Frame List Structure.
85 
86   @param  Uhc                    The UHCI device.
87 
88   @return EFI_OUT_OF_RESOURCES   Can't allocate memory resources.
89   @return EFI_UNSUPPORTED        Map memory fail.
90   @return EFI_SUCCESS            Success.
91 
92 **/
93 EFI_STATUS
94 UhciInitFrameList (
95   IN USB_HC_DEV         *Uhc
96   );
97 
98 /**
99   Destory FrameList buffer.
100 
101   @param  Uhc                    The UHCI device.
102 
103   @return None.
104 
105 **/
106 VOID
107 UhciDestoryFrameList (
108   IN USB_HC_DEV           *Uhc
109   );
110 
111 
112 /**
113   Convert the poll rate to the maxium 2^n that is smaller
114   than Interval.
115 
116   @param  Interval               The poll rate to convert.
117 
118   @return The converted poll rate.
119 
120 **/
121 UINTN
122 UhciConvertPollRate (
123   IN  UINTN               Interval
124   );
125 
126 
127 /**
128   Link a queue head (for asynchronous interrupt transfer) to
129   the frame list.
130 
131   @param  Uhc                    The UHCI device.
132   @param  Qh                     The queue head to link into.
133 
134 **/
135 VOID
136 UhciLinkQhToFrameList (
137   USB_HC_DEV              *Uhc,
138   UHCI_QH_SW              *Qh
139   );
140 
141 
142 /**
143   Unlink QH from the frame list is easier: find all
144   the precedence node, and pointer there next to QhSw's
145   next.
146 
147   @param  Uhc                    The UHCI device.
148   @param  Qh                     The queue head to unlink.
149 
150 **/
151 VOID
152 UhciUnlinkQhFromFrameList (
153   USB_HC_DEV              *Uhc,
154   UHCI_QH_SW              *Qh
155   );
156 
157 
158 /**
159   Check the result of the transfer.
160 
161   @param  Uhc                    The UHCI device.
162   @param  Qh                     The queue head of the transfer.
163   @param  Td                     The first TDs of the transfer.
164   @param  TimeOut                TimeOut value in milliseconds.
165   @param  IsLow                  Is Low Speed Device.
166   @param  QhResult               The variable to return result.
167 
168   @retval EFI_SUCCESS            The transfer finished with success.
169   @retval EFI_DEVICE_ERROR       Transfer failed.
170 
171 **/
172 EFI_STATUS
173 UhciExecuteTransfer (
174   IN  USB_HC_DEV          *Uhc,
175   IN  UHCI_QH_SW          *Qh,
176   IN  UHCI_TD_SW          *Td,
177   IN  UINTN               TimeOut,
178   IN  BOOLEAN             IsLow,
179   OUT UHCI_QH_RESULT      *QhResult
180   );
181 
182 
183 /**
184   Create Async Request node, and Link to List.
185 
186   @param  Uhc                    The UHCI device.
187   @param  Qh                     The queue head of the transfer.
188   @param  FirstTd                First TD of the transfer.
189   @param  DevAddr                Device Address.
190   @param  EndPoint               EndPoint Address.
191   @param  DataLen                Data length.
192   @param  Interval               Polling Interval when inserted to frame list.
193   @param  Data                   Data buffer, unmapped.
194   @param  Callback               Callback after interrupt transfeer.
195   @param  Context                Callback Context passed as function parameter.
196   @param  IsLow                  Is Low Speed.
197 
198   @retval EFI_SUCCESS            An asynchronous transfer is created.
199   @retval EFI_INVALID_PARAMETER  Paremeter is error.
200   @retval EFI_OUT_OF_RESOURCES   Failed because of resource shortage.
201 
202 **/
203 EFI_STATUS
204 UhciCreateAsyncReq (
205   IN USB_HC_DEV                       *Uhc,
206   IN UHCI_QH_SW                       *Qh,
207   IN UHCI_TD_SW                       *FirstTd,
208   IN UINT8                            DevAddr,
209   IN UINT8                            EndPoint,
210   IN UINTN                            DataLen,
211   IN UINTN                            Interval,
212   IN UINT8                            *Data,
213   IN EFI_ASYNC_USB_TRANSFER_CALLBACK  Callback,
214   IN VOID                             *Context,
215   IN BOOLEAN                          IsLow
216   );
217 
218 
219 /**
220   Delete Async Interrupt QH and TDs.
221 
222   @param  Uhc                    The UHCI device.
223   @param  DevAddr                Device Address.
224   @param  EndPoint               EndPoint Address.
225   @param  Toggle                 The next data toggle to use.
226 
227   @retval EFI_SUCCESS            The request is deleted.
228   @retval EFI_INVALID_PARAMETER  Paremeter is error.
229   @retval EFI_NOT_FOUND          The asynchronous isn't found.
230 
231 **/
232 EFI_STATUS
233 UhciRemoveAsyncReq (
234   IN  USB_HC_DEV          *Uhc,
235   IN  UINT8               DevAddr,
236   IN  UINT8               EndPoint,
237   OUT UINT8               *Toggle
238   );
239 
240 
241 /**
242   Release all the asynchronous transfers on the lsit.
243 
244   @param  Uhc                    The UHCI device.
245 
246   @return None.
247 
248 **/
249 VOID
250 UhciFreeAllAsyncReq (
251   IN USB_HC_DEV           *Uhc
252   );
253 
254 
255 /**
256   Interrupt transfer periodic check handler.
257 
258   @param  Event                  The event of the time.
259   @param  Context                Context of the event, pointer to USB_HC_DEV.
260 
261   @return None.
262 
263 **/
264 VOID
265 EFIAPI
266 UhciMonitorAsyncReqList (
267   IN EFI_EVENT            Event,
268   IN VOID                 *Context
269   );
270 
271 #endif
272