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