1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 // Software and any modification/derivatives thereof.
18 // No right, ownership, or interest to MStar Software and any
19 // modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 // supplied together with third party`s software and the use of MStar
23 // Software may require additional licenses from third parties.
24 // Therefore, you hereby agree it is your sole responsibility to separately
25 // obtain any and all third party right and license necessary for your use of
26 // such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 // MStar`s confidential information and you agree to keep MStar`s
30 // confidential information in strictest confidence and not disclose to any
31 // third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 // kind. Any warranties are hereby expressly disclaimed by MStar, including
35 // without limitation, any warranties of merchantability, non-infringement of
36 // intellectual property rights, fitness for a particular purpose, error free
37 // and in conformity with any international standard. You agree to waive any
38 // claim against MStar for any loss, damage, cost or expense that you may
39 // incur related to your use of MStar Software.
40 // In no event shall MStar be liable for any direct, indirect, incidental or
41 // consequential damages, including without limitation, lost of profit or
42 // revenues, lost or damage of data, and unauthorized system use.
43 // You agree that this Section 4 shall still apply without being affected
44 // even if MStar Software has been modified by MStar in accordance with your
45 // request or instruction for your use, except otherwise agreed by both
46 // parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 // services in relation with MStar Software to you for your use of
50 // MStar Software in conjunction with your or your customer`s product
51 // ("Services").
52 // You understand and agree that, except otherwise agreed by both parties in
53 // writing, Services are provided on an "AS IS" basis and the warranty
54 // disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 // or otherwise:
58 // (a) conferring any license or right to use MStar name, trademark, service
59 // mark, symbol or any other identification;
60 // (b) obligating MStar or any of its affiliates to furnish any person,
61 // including without limitation, you and your customers, any assistance
62 // of any kind whatsoever, or any information; or
63 // (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 // of Taiwan, R.O.C., excluding its conflict of law rules.
67 // Any and all dispute arising out hereof or related hereto shall be finally
68 // settled by arbitration referred to the Chinese Arbitration Association,
69 // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 // Rules of the Association by three (3) arbitrators appointed in accordance
71 // with the said Rules.
72 // The place of arbitration shall be in Taipei, Taiwan and the language shall
73 // be English.
74 // The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78
79 #include "include/drvConfig.h"
80
81 #ifdef CONFIG_USB_DEBUG
82 #define DEBUG
83 #else
84 #undef DEBUG
85 #endif
86
87 #include <MsCommon.h>
88 #include "include/drvCompiler.h"
89 #include "include/drvPorts.h"
90 #include "include/drvErrno.h"
91 #include "include/drvIO.h"
92 #include "include/drvPCIMEM.h"
93 #include "include/drvList.h"
94 #include "include/drvTimer.h"
95 #include "include/drvKernel.h"
96 // USB related implemented header files
97 #include "include/drvUSB.h"
98 #include "drvHCD.h"
99 #include "include/drvCPE_EHCI.h"
100 #include "drvEHCI.h"
101 #include "drvUSBHwCtl.h"
102 #include "include/drvCPE_AMBA.h"
103 #include "drvUsbcommon.h"
104 #include "drvUSB.h"
105 #if 1
106
107 /*-------------------------------------------------------------------------*/
108
109
110 #define DRIVER_VERSION "2003-Jun-13"
111 #define DRIVER_AUTHOR "xxx"
112 #define DRIVER_DESC "USB 2.0 'Enhanced' Host Controller (EHCI) Driver"
113
114 // #define EHCI_VERBOSE_DEBUG
115 // #define have_split_iso
116
117 #ifdef DEBUG
118 #define EHCI_STATS
119 #endif
120
121 /* magic numbers that can affect system performance */
122 #define EHCI_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */
123 #define EHCI_TUNE_RL_HS 4 /* nak throttle; see 4.9 */
124 #define EHCI_TUNE_RL_TT 0
125 #define EHCI_TUNE_MULT_HS 1 /* 1-3 transactions/uframe; 4.10.3 */
126 #define EHCI_TUNE_MULT_TT 1
127 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
128 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
129 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
130 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
131 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
132 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
133 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
134 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
135 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
136 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
137 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
138 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
139 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
140 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
141 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
142 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
143 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
144 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
145 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
146 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
147 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
148 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
149 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
150 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
151 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
152 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
153 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
154 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
155 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
156 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
157 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
158 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
159 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
160 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
161 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
162 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
163 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
164 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
165 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
166 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
167 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
168 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
169 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
170 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
171 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
172 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
173 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
174 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
175
176 #ifdef CONFIG_HC_TEST
177 #define EHCI_TUNE_FLS 0 /* 1024 frame for schedule */
178 #else
179 #define EHCI_TUNE_FLS 2 /* (small) 256 frame schedule */
180 #endif
181 /* Initial IRQ latency: lower than default */
182 static int log2_irq_thresh = 0; // 0 to 6
183 #ifdef ROOTHUB_INTERRUPT_MODE
184 #define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT)
185 #else
186 #define INTR_MASK (STS_IAA | STS_FATAL | STS_ERR | STS_INT)
187 #endif
188
189 /*-------------------------------------------------------------------------*/
190 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
191 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
192 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
193 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
194 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
195 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
196 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
197 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
198 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
199 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
200 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
201 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
202 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
203 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
204 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
205 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
206 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
207 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
208 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
209 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
210 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
211 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
212 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
213 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
214 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
215 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
216 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
217 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
218 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
219 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
220 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
221 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
222 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
223 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
224 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
225 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
226 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
227 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
228 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
229 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
230 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
231 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
232 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
233 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
234 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
235 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
236 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
237 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
238
239 #include "drvEHCI.h"
240 #include "drvHCDDBG.cpp"
241 #include "drvEHCIDBG.cpp"
242
243 struct usb_hcd *g_pUsbHcd = NULL;
244 extern struct cpe_dev cpe_ehci_dev;
245 extern struct cpe_dev cpe_ehci_dev_Port2;
246
247 extern int hub_port_disable(struct usb_device *hub, int port);
248
249 extern struct list_head hub_event_list;
250 extern void init_OS_Resource_EX(S32 *USBWaitFlg);
251 extern void ehci_StopRun_Setting(MS_U8 bOption, struct ehci_hcd *ehci);
252 extern void Chip_Flush_Memory(void);
253
254
handshake(U32 * ptr,U32 mask,U32 done,int usec)255 static int handshake (U32 *ptr, U32 mask, U32 done, int usec)
256 {
257 U32 result;
258
259 do {
260 result = ehci_readl ((U32)ptr);
261 if (result == ~(U32)0) /* card removed */
262 return -ENODEV;
263
264 result &= mask;
265 if (result == done)
266 return 0;
267 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
268 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
269 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
270 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
271 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
272 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
273 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
274 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
275 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
276 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
277 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
278 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
279 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
280 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
281 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
282 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
283 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
284 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
285 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
286 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
287 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
288 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
289 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
290 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
291 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
292 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
293 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
294 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
295 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
296 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
297 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
298 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
299 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
300 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
301 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
302 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
303 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
304 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
305 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
306 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
307 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
308 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
309 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
310 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
311 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
312 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
313 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
314 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
315
316 udelay (1);
317 usec--;
318 } while (usec > 0);
319
320 return -ETIMEDOUT;
321 }
322
323
ehci_halt(struct ehci_hcd * ehci)324 static int ehci_halt (struct ehci_hcd *ehci)
325 {
326 U32 temp = ehci_readl ((U32)&ehci->regs->status);
327
328 if ((temp & STS_HALT) != 0)
329 return 0;
330 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
331 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
332 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
333 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
334 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
335 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
336 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
337 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
338 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
339 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
340 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
341 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
342 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
343 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
344 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
345 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
346 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
347 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
348 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
349 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
350 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
351 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
352 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
353 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
354 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
355 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
356 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
357 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
358 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
359 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
360 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
361 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
362 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
363 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
364 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
365 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
366 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
367 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
368 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
369 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
370 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
371 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
372 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
373 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
374 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
375 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
376 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
377 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
378
379 temp = ehci_readl ((U32)&ehci->regs->command);
380 temp &= ~CMD_RUN;
381 ehci_writel (temp, (U32)&ehci->regs->command);
382 diag_printf("ehci_halt\n");
383 return handshake (&ehci->regs->status, STS_HALT, STS_HALT, 16 * 125);
384 }
385
386
ehci_reset(struct ehci_hcd * ehci)387 static int ehci_reset (struct ehci_hcd *ehci)
388 {
389 U32 command = ehci_readl ((U32)&ehci->regs->command);
390
391 //printk("HW SW Reset\n");
392 command |= CMD_RESET;
393 dbg_cmd (ehci, "reset", command);
394 ehci_writel (command, (U32)&ehci->regs->command);
395 ehci->hcd.state = USB_STATE_HALT;
396 //Wait for HC reset complete
397
398 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
399 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
400 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
401 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
402 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
403 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
404 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
405 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
406 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
407 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
408 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
409 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
410 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
411 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
412 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
413 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
414 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
415 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
416 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
417 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
418 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
419 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
420 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
421 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
422 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
423 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
424 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
425 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
426 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
427 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
428 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
429 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
430 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
431 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
432 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
433 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
434 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
435 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
436 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
437 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
438 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
439 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
440 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
441 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
442 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
443 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
444 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
445 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
446 command = handshake (&ehci->regs->command, CMD_RESET, 0, 250 * 1000);
447
448 //Set EOF1
449 //writel(readl(0xC2000000+0x40)& (~(3<<2)),0xC2000000+0x40);
450 //mwOTG20_EOF1_Set(); // Set EOF1 360 clocks
451
452 return command;
453 }
454
ehci_ready(struct ehci_hcd * ehci)455 static void ehci_ready (struct ehci_hcd *ehci)
456 {
457 U32 temp;
458
459 #ifdef DEBUG
460 if (!HCD_IS_RUNNING (ehci->hcd.state))
461 BUG ();
462 #endif
463
464 /* wait for any schedule enables/disables to take effect */
465 #if 0
466 temp = 0;
467 if (ehci->async->qh_next.qh)
468 temp = STS_ASS;
469 if (ehci->next_uframe != -1)
470 temp |= STS_PSS;
471 if (handshake (&ehci->regs->status, STS_ASS | STS_PSS,
472 temp, 16 * 125) != 0) {
473 ehci->hcd.state = USB_STATE_HALT;
474 printk("Got problem,check it out, qHD is %p\n",ehci->async->qh_next.qh);
475 while(1);
476 return;
477 }
478 #endif
479
480 /* then disable anything that's still active */
481
482 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
483 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
484 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
485 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
486 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
487 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
488 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
489 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
490 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
491 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
492 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
493 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
494 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
495 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
496 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
497 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
498 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
499 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
500 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
501 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
502 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
503 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
504 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
505 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
506 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
507 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
508 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
509 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
510 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
511 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
512 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
513 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
514 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
515 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
516 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
517 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
518 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
519 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
520 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
521 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
522 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
523 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
524 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
525 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
526 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
527 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
528 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
529 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
530 temp = ehci_readl ((U32)&ehci->regs->command);
531 temp &= ~(CMD_ASE | CMD_IAAD | CMD_PSE);
532 ehci_writel (temp, (U32)&ehci->regs->command);
533
534 /* hardware can take 16 microframes to turn off ... */
535 if (handshake (&ehci->regs->status, STS_ASS | STS_PSS,
536 0, 16 * 125) != 0) {
537 usb_err("Cannot stop scheduler%s","\n");
538 ehci->hcd.state = USB_STATE_HALT;
539 return;
540 }
541 }
542
543 /*
544 * EHCI Root Hub ... the nonsharable stuff
545 *
546 */
547
548
549 #if 1
check_reset_complete(struct ehci_hcd * ehci,int index,int port_status)550 static int check_reset_complete (
551 struct ehci_hcd *ehci,
552 int index,
553 int port_status)
554 {
555 if (!(port_status & PORT_CONNECT)) {
556 ehci->reset_done [index] = 0;
557 return port_status;
558 }
559
560 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
561 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
562 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
563 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
564 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
565 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
566 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
567 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
568 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
569 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
570 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
571 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
572 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
573 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
574 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
575 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
576 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
577 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
578 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
579 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
580 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
581 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
582 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
583 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
584 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
585 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
586 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
587 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
588 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
589 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
590 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
591 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
592 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
593 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
594 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
595 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
596 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
597 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
598 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
599 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
600 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
601 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
602 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
603 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
604 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
605 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
606 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
607 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
608 //#ifndef CONFIG_FARADAY_FOTG200
609 #if 0
610 /* if reset finished and it's still not enabled -- handoff */
611 if (!(port_status & PORT_PE)) {
612 ehci_dbg (ehci, "port %d full speed --> companion%s",
613 index + 1, "\n");
614
615 // what happens if HCS_N_CC(params) == 0 ?
616 port_status |= PORT_OWNER;
617 ehci_writel (port_status, (U32)&ehci->regs->port_status [index]);
618 } else
619 ehci_dbg (ehci, "port %d high speed%s", index + 1,"\n");
620 #endif
621 return port_status;
622 }
623
624 /*-------------------------------------------------------------------------*/
625
626
627 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
628 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
629 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
630 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
631 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
632 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
633 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
634 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
635 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
636 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
637 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
638 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
639 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
640 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
641 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
642 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
643 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
644 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
645 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
646 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
647 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
648 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
649 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
650 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
651 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
652 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
653 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
654 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
655 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
656 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
657 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
658 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
659 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
660 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
661 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
662 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
663 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
664 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
665 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
666 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
667 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
668 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
669 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
670 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
671 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
672 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
673 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
674 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
675
676 int
ehci_hub_status_data(struct usb_hcd * hcd,char * buf)677 ehci_hub_status_data (struct usb_hcd *hcd, char *buf)
678 {
679 struct ehci_hcd *ehci = hcd_to_ehci (hcd);
680 U32 temp, status = 0;
681 int ports, i, retval = 1;
682 U32 flags;
683
684 /* init status to no-changes */
685 buf [0] = 0;
686 ports = HCS_N_PORTS (ehci->hcs_params);
687 if (ports > 7) {
688 buf [1] = 0;
689 retval++;
690 }
691 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
692 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
693 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
694 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
695 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
696 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
697 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
698 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
699 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
700 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
701 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
702 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
703 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
704 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
705 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
706 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
707 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
708 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
709 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
710 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
711 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
712 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
713 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
714 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
715 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
716 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
717 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
718 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
719 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
720 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
721 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
722 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
723 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
724 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
725 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
726 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
727 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
728 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
729 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
730 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
731 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
732 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
733 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
734 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
735 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
736 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
737 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
738 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
739
740 /* no hub change reports (bit 0) for now (power, ...) */
741
742 /* port N changes (bit N)? */
743 spin_lock_irqsave (&ehci->lock, flags);
744 for (i = 0; i < ports; i++) {
745 temp = ehci_readl ((U32)&ehci->regs->port_status[i]);
746 //diag_printf("<ehci_hub_status_data> temp: %lx, pre_sts: %lx @ root hub %d\n", temp, hcd->pre_sts, hcd->host_id);
747 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
748 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
749 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
750 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
751 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
752 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
753 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
754 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
755 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
756 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
757 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
758 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
759 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
760 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
761 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
762 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
763 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
764 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
765 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
766 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
767 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
768 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
769 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
770 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
771 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
772 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
773 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
774 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
775 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
776 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
777 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
778 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
779 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
780 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
781 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
782 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
783 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
784 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
785 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
786 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
787 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
788 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
789 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
790 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
791 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
792 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
793 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
794 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
795
796 if ( ((temp & PORT_CONNECT) == 0) && ((hcd->pre_sts & PORT_CONNECT) != 0) )
797 {
798 diag_printf("<ehci_hub_status_data> Add CSC @ root hub %d, DISCONNECT!\n", hcd->host_id);
799 temp |= PORT_CSC;
800 }
801 hcd->pre_sts = temp;
802
803 //#ifndef CONFIG_FARADAY_FOTG200
804 #if 0
805 if (temp & PORT_OWNER) {
806 /* don't report this in GetPortStatus */
807 if (temp & PORT_CSC) {
808 temp &= ~PORT_CSC;
809 ehci_writel (temp, (U32)&ehci->regs->port_status [i]);
810 }
811 continue;
812 }
813 #endif
814 if (!(temp & PORT_CONNECT))
815 ehci->reset_done [i] = 0;
816
817 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
818 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
819 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
820 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
821 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
822 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
823 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
824 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
825 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
826 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
827 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
828 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
829 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
830 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
831 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
832 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
833 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
834 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
835 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
836 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
837 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
838 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
839 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
840 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
841 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
842 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
843 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
844 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
845 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
846 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
847 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
848 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
849 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
850 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
851 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
852 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
853 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
854 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
855 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
856 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
857 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
858 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
859 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
860 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
861 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
862 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
863 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
864 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
865 /*
866 if ((temp & mask) != 0 || test_bit(i, &ehci->port_c_suspend)
867 || (ehci->reset_done[i] && time_after_eq(
868 jiffies, ehci->reset_done[i]))) {
869 */
870 // if ((temp & (PORT_CSC | PORT_PEC | PORT_OCC)) != 0) {
871 if ((temp & (PORT_CSC)) != 0) {
872 if (i < 7)
873 buf [0] |= 1 << (i + 1);
874
875 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
876 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
877 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
878 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
879 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
880 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
881 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
882 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
883 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
884 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
885 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
886 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
887 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
888 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
889 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
890 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
891 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
892 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
893 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
894 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
895 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
896 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
897 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
898 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
899 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
900 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
901 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
902 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
903 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
904 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
905 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
906 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
907 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
908 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
909 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
910 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
911 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
912 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
913 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
914 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
915 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
916 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
917 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
918 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
919 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
920 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
921 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
922 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
923 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
924 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
925 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
926 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
927 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
928 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
929 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
930 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
931 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
932 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
933 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
934 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
935 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
936 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
937 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
938 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
939 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
940 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
941 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
942 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
943 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
944 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
945 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
946 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
947 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
948 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
949 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
950 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
951 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
952 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
953 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
954 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
955 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
956 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
957 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
958 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
959 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
960 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
961 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
962 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
963 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
964 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
965 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
966 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
967 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
968 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
969 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
970 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
971 else
972 buf [1] |= 1 << (i - 7);
973 status = STS_PCD;
974 }
975 }
976 spin_unlock_irqrestore (&ehci->lock, flags);
977 return status ? retval : 0;
978 }
979
980 /*-------------------------------------------------------------------------*/
981 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
982 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
983 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
984 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
985 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
986 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
987 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
988 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
989 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
990 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
991 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
992 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
993 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
994 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
995 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
996 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
997 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
998 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
999 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1000 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1001 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1002 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1003 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1004 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1005 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1006 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1007 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1008 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1009 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1010 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1011 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1012 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1013 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1014 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1015 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1016 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1017 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1018 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1019 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1020 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1021 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1022 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1023 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1024 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1025 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1026 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1027 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1028 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1029
1030 static void
ehci_hub_descriptor(struct ehci_hcd * ehci,struct usb_hub_descriptor * desc)1031 ehci_hub_descriptor (
1032 struct ehci_hcd *ehci,
1033 struct usb_hub_descriptor *desc
1034 ) {
1035 int ports = HCS_N_PORTS (ehci->hcs_params);
1036 U16 temp;
1037
1038 desc->bDescriptorType = 0x29;
1039 desc->bPwrOn2PwrGood = 0;
1040 desc->bHubContrCurrent = 0;
1041 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1042 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1043 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1044 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1045 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1046 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1047 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1048 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1049 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1050 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1051 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1052 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1053 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1054 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1055 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1056 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1057 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1058 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1059 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1060 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1061 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1062 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1063 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1064 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1065 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1066 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1067 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1068 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1069 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1070 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1071 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1072 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1073 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1074 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1075 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1076 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1077 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1078 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1079 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1080 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1081 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1082 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1083 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1084 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1085 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1086 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1087 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1088 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1089 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1090 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1091 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1092 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1093 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1094 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1095 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1096 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1097 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1098 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1099 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1100 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1101 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1102 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1103 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1104 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1105 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1106 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1107 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1108 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1109 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1110 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1111 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1112 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1113 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1114 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1115 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1116 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1117 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1118 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1119 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1120 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1121 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1122 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1123 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1124 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1125 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1126 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1127 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1128 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1129 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1130 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1131 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1132 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1133 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1134 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1135 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1136 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1137
1138 desc->bNbrPorts = ports;
1139 temp = 1 + (ports / 8);
1140 desc->bDescLength = 7 + 2 * temp;
1141 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1142 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1143 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1144 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1145 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1146 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1147 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1148 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1149 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1150 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1151 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1152 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1153 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1154 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1155 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1156 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1157 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1158 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1159 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1160 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1161 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1162 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1163 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1164 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1165 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1166 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1167 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1168 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1169 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1170 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1171 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1172 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1173 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1174 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1175 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1176 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1177 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1178 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1179 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1180 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1181 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1182 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1183 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1184 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1185 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1186 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1187 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1188 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1189
1190 /* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */
1191 memset (&desc->bitmap [0], 0, temp);
1192 memset (&desc->bitmap [temp], 0xff, temp);
1193
1194 temp = 0x0008; /* per-port overcurrent reporting */
1195 if (HCS_PPC (ehci->hcs_params))
1196 temp |= 0x0001; /* per-port power control */
1197 if (HCS_INDICATOR (ehci->hcs_params))
1198 temp |= 0x0080; /* per-port indicators (LEDs) */
1199 desc->wHubCharacteristics = CPUToLE16(temp);
1200 }
1201
1202 /*-------------------------------------------------------------------------*/
ehci_hc_swreset(struct ehci_hcd * ehci)1203 void ehci_hc_swreset(struct ehci_hcd *ehci)
1204 {
1205 U32 regTmp[4];
1206
1207 //FIXME: cover FOTG200 bug
1208 //Reset HC to cover FOTG2000 implementation limitation
1209 //Do not do hc_reset at HCP section
1210 //if ( mdwOTGC_Control_A_SET_B_HNP_EN_Rd() == 0 )
1211 {
1212 // regTmp[2] = mdwFOTGPort(0x80);
1213 // regTmp[3] = mdwFOTGPort(0x88);
1214 regTmp[0] = ehci_readl((U32)&ehci->regs->command);
1215 regTmp[1] = ehci_readl((U32)&ehci->regs->intr_enable);
1216 // HC soft reset
1217 ehci_reset(ehci);
1218 // Device Soft Reset
1219 /*
1220 mdwPort(CPE_USB_EHCI_REGBASE,0x100)|=BIT4;
1221 mdwPort(CPE_USB_EHCI_REGBASE,0x100)&=(~BIT4);
1222 */
1223 //#ifdef FORCE_FULL_SPEED
1224 // Force HC to full speed
1225 // mwOTG20_Control_ForceFullSpeed_Set();
1226 // mwOTG20_Control_ForceHighSpeed_Clr();
1227 // #endif
1228 //#ifdef FORCE_HIGH_SPEED
1229 // Force HC to high speed
1230 // mwOTG20_Control_ForceFullSpeed_Clr();
1231 // mwOTG20_Control_ForceHighSpeed_Set();
1232 // #endif
1233 // mdwFOTGPort(0x80) = regTmp[2];
1234 // mdwFOTGPort(0x88) = regTmp[3];
1235 ehci_writel(regTmp[1],(U32)&ehci->regs->intr_enable);
1236 ehci_writel(regTmp[0],(U32)&ehci->regs->command);
1237 ehci->hcd.state = USB_STATE_RUNNING;
1238 }
1239 //Cover OTG HW issue casused by HC Software reset for Device-B playing as Host
1240 #if 0
1241 if ( mdwOTGC_Control_B_BUS_REQ_Rd() > 0)
1242 {
1243 //HC reset at HNP section
1244 mdwOTGC_UsbUnPLGSet();
1245 mdwOTGC_UsbUnPLGClr();
1246 }
1247 #endif
1248 //End of cover
1249 }
1250 /*-------------------------------------------------------------------------*/
1251
ehci_hub_control(struct usb_hcd * hcd,U16 typeReq,U16 wValue,U16 wIndex,char * buf,U16 wLength)1252 int ehci_hub_control (
1253 struct usb_hcd *hcd,
1254 U16 typeReq,
1255 U16 wValue,
1256 U16 wIndex,
1257 char *buf,
1258 U16 wLength
1259 ) {
1260 struct ehci_hcd *ehci = hcd_to_ehci (hcd);
1261 int ports = HCS_N_PORTS (ehci->hcs_params);
1262 U32 temp, status,bus_monitor;
1263 U32 flags;
1264 int retval = 0;
1265 int time_out;
1266 struct cpe_dev *dev;
1267 const struct device_s *__mptr = hcd->controller;
1268 dev = (struct cpe_dev *)( (char *)__mptr - offsetof(struct cpe_dev,dev) );
1269 U32 regUTMI = dev->utmibase;
1270 U32 temp2, speed;
1271 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1272 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1273 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1274 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1275 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1276 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1277 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1278 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1279 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1280 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1281 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1282 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1283 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1284 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1285 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1286 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1287 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1288 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1289 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1290 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1291 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1292 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1293 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1294 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1295 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1296 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1297 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1298 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1299 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1300 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1301 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1302 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1303 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1304 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1305 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1306 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1307 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1308 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1309 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1310 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1311 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1312 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1313 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1314 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1315 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1316 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1317 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1318 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1319
1320 spin_lock_irqsave (&ehci->lock, flags);
1321 switch (typeReq) {
1322 case ClearHubFeature:
1323 switch (wValue) {
1324 case C_HUB_LOCAL_POWER:
1325 case C_HUB_OVER_CURRENT:
1326 /* no hub-wide feature/status flags */
1327 break;
1328 default:
1329 goto error;
1330 }
1331 break;
1332 case ClearPortFeature:
1333 if (!wIndex || wIndex > ports)
1334 goto error;
1335 wIndex--;
1336 temp = ehci_readl ((U32)&ehci->regs->port_status [wIndex]);
1337 if (temp & PORT_OWNER)
1338 break;
1339
1340 switch (wValue) {
1341 case USB_PORT_FEAT_ENABLE:
1342 usb_msg("Disable port%s","");
1343 if( ehci->async->qh_next.qh != 0 )
1344 {
1345 usb_err("Not only cantain one qHD (%p and %p)in asyn. scheduler",ehci->async->qh_next.qh,ehci->async);
1346 }
1347 ehci_writel (temp & ~PORT_PE, (U32)&ehci->regs->port_status [wIndex]);
1348 //Stop scheduler when device disconnect
1349 //Diable asyn. and sync. scheduler
1350 ehci_writel(ehci_readl((U32)&ehci->regs->command)&(~(CMD_ASE|CMD_PSE|CMD_IAAD)),(U32)&ehci->regs->command);
1351 //Halt HC (Stop scheduler)
1352
1353 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1354 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1355 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1356 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1357 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1358 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1359 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1360 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1361 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1362 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1363 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1364 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1365 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1366 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1367 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1368 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1369 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1370 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1371 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1372 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1373 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1374 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1375 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1376 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1377 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1378 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1379 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1380 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1381 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1382 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1383 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1384 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1385 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1386 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1387 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1388 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1389 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1390 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1391 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1392 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1393 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1394 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1395 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1396 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1397 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1398 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1399 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1400 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1401 ehci_halt(ehci);
1402 ehci_hc_swreset(ehci);
1403 break;
1404 case USB_PORT_FEAT_C_ENABLE:
1405 ehci_writel (temp | PORT_PEC,
1406 (U32)&ehci->regs->port_status [wIndex]);
1407 break;
1408 case USB_PORT_FEAT_SUSPEND:
1409 case USB_PORT_FEAT_C_SUSPEND:
1410 /* ? */
1411 break;
1412 case USB_PORT_FEAT_POWER:
1413 if (HCS_PPC (ehci->hcs_params))
1414 ehci_writel (temp & ~PORT_POWER,
1415 (U32)&ehci->regs->port_status [wIndex]);
1416 break;
1417 case USB_PORT_FEAT_C_CONNECTION:
1418 ehci_writel (temp | PORT_CSC,
1419 (U32)&ehci->regs->port_status [wIndex]);
1420 break;
1421
1422 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1423 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1424 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1425 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1426 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1427 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1428 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1429 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1430 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1431 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1432 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1433 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1434 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1435 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1436 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1437 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1438 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1439 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1440 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1441 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1442 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1443 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1444 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1445 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1446 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1447 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1448 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1449 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1450 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1451 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1452 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1453 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1454 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1455 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1456 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1457 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1458 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1459 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1460 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1461 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1462 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1463 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1464 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1465 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1466 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1467 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1468 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1469 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1470 case USB_PORT_FEAT_C_OVER_CURRENT:
1471 ehci_writel (temp | PORT_OCC,
1472 (U32)&ehci->regs->port_status [wIndex]);
1473 break;
1474 case USB_PORT_FEAT_C_RESET:
1475 /* GetPortStatus clears reset */
1476 break;
1477 default:
1478 goto error;
1479 }
1480 temp = ehci_readl ((U32)&ehci->regs->command); /* unblock posted write */
1481 break;
1482 case GetHubDescriptor:
1483 ehci_hub_descriptor (ehci, (struct usb_hub_descriptor *)
1484 buf);
1485 break;
1486 case GetHubStatus:
1487 /* no hub-wide feature/status flags */
1488 memset (buf, 0, 4);
1489 //cpu_to_le32s ((U32 *) buf);
1490 break;
1491
1492 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1493 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1494 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1495 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1496 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1497 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1498 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1499 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1500 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1501 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1502 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1503 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1504 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1505 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1506 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1507 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1508 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1509 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1510 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1511 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1512 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1513 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1514 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1515 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1516 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1517 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1518 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1519 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1520 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1521 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1522 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1523 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1524 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1525 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1526 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1527 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1528 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1529 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1530 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1531 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1532 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1533 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1534 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1535 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1536 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1537 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1538 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1539 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1540 case GetPortStatus:
1541 if (!wIndex || wIndex > ports)
1542 goto error;
1543 wIndex--;
1544 status = 0;
1545 temp = ehci_readl ((U32)&ehci->regs->port_status [wIndex]);
1546 //diag_printf("<ehci_hub_control> GetPortStatus: pStatus: %x, \n", temp);
1547 if ( ((temp & PORT_CONNECT) == 0) && ((temp & PORT_CSC) == 0) )
1548 {
1549 if ((hcd->pre_temp & PORT_CONNECT) != 0)
1550 {
1551 diag_printf("<ehci_hub_control> GetPortStatus:Add CSC here, pStatus = %x\n", temp);
1552 temp |= PORT_CSC;
1553 }
1554 }
1555 hcd->pre_temp = temp;
1556
1557 // wPortChange bits
1558 if (temp & PORT_CSC)
1559 status |= 1 << USB_PORT_FEAT_C_CONNECTION;
1560 if (temp & PORT_PEC)
1561 status |= 1 << USB_PORT_FEAT_C_ENABLE;
1562 // USB_PORT_FEAT_C_SUSPEND
1563 if (temp & PORT_OCC)
1564 status |= 1 << USB_PORT_FEAT_C_OVER_CURRENT;
1565
1566 /* whoever resets must GetPortStatus to complete it!! */
1567 if ((temp & PORT_RESET)
1568 && time_after (jiffies,
1569 ehci->reset_done [wIndex])) {
1570 status |= 1 << USB_PORT_FEAT_C_RESET;
1571 time_out=0;
1572
1573 writeb(0x0 ,(void*)(regUTMI+0x2A*2)); // chirp patch
1574 mdelay(20); // chirp patch
1575
1576 /* force reset to complete */
1577 ehci_writel (temp & ~PORT_RESET,
1578 (U32)&ehci->regs->port_status [wIndex]);
1579 do {
1580 temp = ehci_readl (
1581 (U32)&ehci->regs->port_status [wIndex]);
1582 udelay (10);
1583 } while ((temp&(PORT_RESET|PORT_CONNECT)) == (PORT_RESET|PORT_CONNECT)&&(time_out++<10000));
1584
1585 writeb(0x10, (void*) (regUTMI+0x2c*2)); // chirp patch
1586 writeb(0x02, (void*) (regUTMI+0x2d*2-1)); // chirp patch
1587 writeb(0x81, (void*) (regUTMI+0x2f*2-1)); // chirp patch
1588
1589 //Add time-out mechanism to cover HW BUG
1590 //HW ISSUE?
1591 if( time_out >= 10000 )
1592 {
1593 //Maybe HW bug ==> check it out
1594 diag_printf("ERR: Port reset cannot force complete!!\n");//HW ISSUE?
1595 ehci_hc_swreset(ehci);
1596 }
1597 /* see what we found out */
1598 speed = (ehci_readl((U32)&ehci->regs->bus_control) >> 9) & 0x3;
1599 diag_printf("SPEED: %x\n", speed);
1600
1601 temp2 = ehci_readl((U32)&ehci->regs->hcmisc) & 0xfffffff3;
1602 if (speed == 2) // high speed
1603 {
1604 UTMI_ORXBYTE_EX(0x09, 0x80, regUTMI); //HS rx robust enable
1605 temp2 |= (3 << 2);
1606 }
1607 else //full speed, low speed
1608 {
1609 UTMI_ANDXBYTE_EX(0x09, 0x7F, regUTMI);
1610 temp2 |= (2 << 2);
1611 }
1612 ehci_writel (temp2, (U32)&ehci->regs->hcmisc); // misc, EOF1
1613
1614 temp = check_reset_complete (ehci, wIndex, temp);
1615 }
1616
1617 // don't show wPortStatus if it's owned by a companion hc
1618 if (!(temp & PORT_OWNER)) {
1619 if (temp & PORT_CONNECT) {
1620 status |= 1 << USB_PORT_FEAT_CONNECTION;
1621 bus_monitor=ehci_readl ((U32)&ehci->regs->bus_control);
1622 bus_monitor>>=9;
1623 if (bus_monitor==2)
1624 status |= 1 << USB_PORT_FEAT_HIGHSPEED;
1625 else if (bus_monitor==1)
1626 status |=1 << USB_PORT_FEAT_LOWSPEED;
1627 //else ==> full speed don't set any bits
1628
1629 }
1630 if (temp & PORT_PE)
1631 status |= 1 << USB_PORT_FEAT_ENABLE;
1632 if (temp & PORT_SUSPEND)
1633 status |= 1 << USB_PORT_FEAT_SUSPEND;
1634
1635 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1636 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1637 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1638 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1639 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1640 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1641 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1642 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1643 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1644 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1645 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1646 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1647 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1648 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1649 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1650 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1651 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1652 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1653 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1654 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1655 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1656 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1657 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1658 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1659 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1660 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1661 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1662 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1663 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1664 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1665 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1666 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1667 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1668 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1669 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1670 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1671 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1672 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1673 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1674 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1675 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1676 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1677 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1678 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1679 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1680 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1681 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1682 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1683 if (temp & PORT_OC)
1684 status |= 1 << USB_PORT_FEAT_OVER_CURRENT;
1685 if (temp & PORT_RESET)
1686 status |= 1 << USB_PORT_FEAT_RESET;
1687 if (temp & PORT_POWER)
1688 status |= 1 << USB_PORT_FEAT_POWER;
1689 }
1690
1691 #ifndef EHCI_VERBOSE_DEBUG
1692 if (status & ~0xffff) /* only if wPortChange is interesting */
1693 #endif
1694 dbg_port (ehci, "GetStatus", wIndex + 1, temp);
1695 #if 0
1696 // we "know" this alignment is good, caller used kmalloc()...
1697 *((U32 *) buf) = CPUToLE32(status);
1698 #else
1699 *buf = CPUToLE32(status);
1700 *(buf+1) = CPUToLE32(status) >> 8;
1701 *(buf+2) = CPUToLE32(status) >> 16;
1702 *(buf+3) = CPUToLE32(status) >> 24;
1703 #endif
1704 break;
1705 case SetHubFeature:
1706 switch (wValue) {
1707 case C_HUB_LOCAL_POWER:
1708 case C_HUB_OVER_CURRENT:
1709 /* no hub-wide feature/status flags */
1710
1711 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1712 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1713 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1714 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1715 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1716 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1717 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1718 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1719 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1720 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1721 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1722 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1723 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1724 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1725 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1726 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1727 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1728 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1729 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1730 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1731 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1732 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1733 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1734 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1735 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1736 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1737 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1738 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1739 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1740 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1741 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1742 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1743 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1744 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1745 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1746 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1747 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1748 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1749 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1750 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1751 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1752 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1753 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1754 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1755 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1756 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1757 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1758 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1759 break;
1760 default:
1761 goto error;
1762 }
1763 break;
1764 case SetPortFeature:
1765 if (!wIndex || wIndex > ports)
1766 goto error;
1767 wIndex--;
1768 temp = ehci_readl ((U32)&ehci->regs->port_status [wIndex]);
1769 //#ifndef CONFIG_FARADAY_FOTG200
1770 #if 0
1771 if (temp & PORT_OWNER)
1772 break;
1773 #endif
1774
1775 switch (wValue) {
1776 case USB_PORT_FEAT_SUSPEND:
1777 dbg("SetPortFeature suspend%s","\n");
1778 ehci_writel (temp | PORT_SUSPEND,
1779 (U32)&ehci->regs->port_status [wIndex]);
1780 break;
1781 case USB_PORT_FEAT_POWER:
1782 if (HCS_PPC (ehci->hcs_params))
1783 ehci_writel (temp | PORT_POWER,
1784 (U32)&ehci->regs->port_status [wIndex]);
1785 break;
1786 case USB_PORT_FEAT_RESET:
1787 /* line status bits may report this as low speed */
1788 //#ifndef CONFIG_FARADAY_FOTG200
1789 //diag_printf("<ehci_hub_control> SetPortFeature RESET port status: %lx\n", temp);
1790 #if 0
1791 if ((temp & (PORT_PE|PORT_CONNECT)) == PORT_CONNECT
1792 && PORT_USB11 (temp)) {
1793 diag_printf("temp: %x\n", temp);
1794 ehci_dbg (ehci,
1795 "port %d low speed --> companion%s",
1796 wIndex + 1,"\n");
1797 temp |= PORT_OWNER;
1798 } else
1799 #endif
1800 {
1801 ehci_vdbg (ehci, "port %d reset %s", wIndex + 1,"\n");
1802 temp |= PORT_RESET;
1803 temp &= ~PORT_PE;
1804
1805 /*
1806 * caller must wait, then call GetPortStatus
1807 * usb 2.0 spec says 50 ms resets on root
1808 */
1809 ehci->reset_done [wIndex] = jiffies
1810 + ((50 /* msec */ * HZ) / 1000);
1811 }
1812
1813 #if 0 //Colin, 090605 removed for reset bad USB disk
1814 if ( g_usb_phy_reset_flg && (hcd == cpe_ehci_dev.dev.driver_data) )
1815 {
1816 diag_printf("g_usb_phy_reset_flg\n");
1817 //Stop schedule
1818 ehci_writel(ehci_readl((U32)&ehci->regs->command)&(~(CMD_RUN|CMD_ASE|CMD_PSE)),(U32)&ehci->regs->command);
1819 time_out=0;
1820 //Add time-out mechanism to cover HW design issue (PIE may cause dead lock sometimes)
1821 while(((ehci_readl((U32)&ehci->regs->status)&STS_HALT) == 0)&&(time_out++<1000));
1822 //HW ISSUE?
1823 if( time_out >= 1000 )
1824 {
1825 ehci_hc_swreset(ehci);
1826 }
1827
1828 UTMI_ORXBYTE(0x06,0x3); // XWORD[UTMIBaseAddr+0x06]|=0x03; //reset UTMI
1829 USB_DELAY(2);
1830 UTMI_ANDXBYTE(0x06,~0x03); //XWORD[UTMIBaseAddr+0x06]&=~0x3; // 0xfc;
1831 }
1832
1833 if ( g_usb_phy_reset_flg_Port2&& (hcd == cpe_ehci_dev_Port2.dev.driver_data) )
1834 {
1835 diag_printf("g_usb_phy_reset_flg_Port2\n");
1836 //Stop schedule
1837 ehci_writel(ehci_readl((U32)&ehci->regs->command)&(~(CMD_RUN|CMD_ASE|CMD_PSE)),(U32)&ehci->regs->command);
1838 time_out=0;
1839 //Add time-out mechanism to cover HW design issue (PIE may cause dead lock sometimes)
1840 while(((ehci_readl((U32)&ehci->regs->status)&STS_HALT) == 0)&&(time_out++<1000));
1841 //HW ISSUE?
1842 if( time_out >= 1000 )
1843 {
1844 ehci_hc_swreset(ehci);
1845 }
1846
1847 UTMI2_ORXBYTE(0x06,0x3); // XWORD[UTMIBaseAddr+0x06]|=0x03; //reset UTMI
1848 USB_DELAY(2);
1849 UTMI2_ANDXBYTE(0x06,~0x03); //XWORD[UTMIBaseAddr+0x06]&=~0x3; // 0xfc;
1850 }
1851 #endif
1852
1853 //Do port reset only if device attaches to this port
1854 if( temp&PORT_CONNECT )
1855 {
1856 ehci_StopRun_Setting(HOST20_Enable, ehci);
1857
1858 writeb(0x10, (void*)(regUTMI+0x2C*2)); // chirp patch
1859 writeb(0x00, (void*)(regUTMI+0x2D*2-1)); // chirp patch
1860 writeb(0x00, (void*)(regUTMI+0x2F*2-1)); // chirp patch
1861 writeb(0x80 ,(void*)(regUTMI+0x2A*2)); // chirp patch
1862
1863 ehci_writel (temp, (U32)&ehci->regs->port_status [wIndex]); // port reset
1864 }
1865 break;
1866 default:
1867 goto error;
1868 }
1869 temp = ehci_readl ((U32)&ehci->regs->command); /* unblock posted writes */
1870 break;
1871
1872 default:
1873 error:
1874 /* "stall" on error */
1875 retval = -EPIPE;
1876 }
1877 spin_unlock_irqrestore (&ehci->lock, flags);
1878 return retval;
1879 }
1880
1881 #endif
1882
1883
1884 /*------------------------------------------------------------------------------*/
1885 #include "drvEHCI_MEM.cxx"
1886
1887
1888 #if 1
1889
1890 //enum usb_device_speed eCurURBSpeed;
1891 //U32 my_qtd,my_buf,qtd_status;
1892 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1893 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1894 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1895 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1896 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1897 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1898 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1899 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1900 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1901 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1902 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1903 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1904 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1905 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1906 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1907 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1908 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1909 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1910 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1911 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1912 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1913 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1914 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1915 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1916 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1917 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1918 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1919 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1920 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1921 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1922 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1923 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1924 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1925 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1926 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1927 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1928 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1929 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1930 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1931 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1932 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1933 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1934 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1935 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1936 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1937 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1938 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1939 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1940
1941 static int
qtd_fill(struct ehci_qtd * qtd,dma_addr_t buf,size_t len,int token,int maxpacket)1942 qtd_fill (struct ehci_qtd *qtd, dma_addr_t buf, size_t len,
1943 int token, int maxpacket)
1944 {
1945 U32 count;
1946 int i, lastnums = 0;
1947 cyg_uint64 addr = buf;
1948 unsigned char uPageShift;
1949
1950 //my_qtd=(U32)qtd;
1951 //my_buf=(U32)buf;
1952 //diag_printf("qtd:%x buf:%x\n",(U32)qtd,buf);
1953 /* one buffer entry per 4K ... first might be short or unaligned */
1954
1955 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1956 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1957 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1958 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1959 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1960 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1961 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1962 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1963 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1964 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1965 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1966 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1967 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1968 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1969 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1970 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1971 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1972 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1973 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1974 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1975 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1976 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1977 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1978 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1979 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1980 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1981 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1982 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1983 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1984 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1985 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1986 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1987 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1988 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1989 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1990 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1991 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1992 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1993 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1994 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1995 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1996 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1997 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1998 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1999 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2000 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2001 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2002 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2003 qtd->hw_buf [0] = CPUToLE32 ((U32)addr);
2004 qtd->hw_buf_hi [0] = CPUToLE32 ((U32)(addr >> 32));
2005 count = 0x1000 - (buf & 0x0fff); /* rest of that page */
2006 if (likely (len < count)) /* ... iff needed */
2007 count = len;
2008 else {
2009 buf += 0x1000;
2010 buf &= ~0x0fff;
2011
2012 /* per-qtd limit: from 16K to 20K (best alignment) */
2013 for (i = 1; count < len && i < 5; i++) {
2014 addr = buf;
2015 qtd->hw_buf [i] = CPUToLE32 ((U32)addr);
2016 qtd->hw_buf_hi [i] = CPUToLE32 ((U32)(addr >> 32));
2017 lastnums++;
2018 buf += 0x1000;
2019 if ((count + 0x1000) < len)
2020 count += 0x1000;
2021 else
2022 count = len;
2023 }
2024 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2025 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2026 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2027 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2028 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2029 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2030 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2031 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2032 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2033 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2034 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2035 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2036 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2037 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2038 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2039 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2040 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2041 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2042 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2043 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2044 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2045 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2046 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2047 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2048 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2049 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2050 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2051 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2052 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2053 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2054 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2055 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2056 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2057 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2058 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2059 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2060 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2061 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2062 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2063 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2064 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2065 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2066 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2067 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2068 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2069 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2070 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2071 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2072
2073 /* short packets may only terminate transfers */
2074 if (count != len)
2075 count -= (count % maxpacket);
2076 }
2077 qtd->hw_token = CPUToLE32 ((count << 16) | token);
2078 qtd->length = count;
2079 //qtd_status=qtd->hw_token; //yuwen
2080 if ((count > 0) && (lastnums < 4))
2081 {
2082 for (uPageShift = lastnums + 1;uPageShift < 5; uPageShift++)
2083 {
2084 qtd->hw_buf[uPageShift] = qtd->hw_buf [lastnums];
2085 qtd->hw_buf_hi[uPageShift] = qtd->hw_buf_hi [lastnums];
2086 }
2087 }
2088
2089 #if 0
2090 if ((count > 0) && (i <= 4))
2091 {
2092 // Shift all page buffers to the bottom of qtd
2093 uPageShift = 4 - i;
2094 for (;i>=0; i--)
2095 {
2096 qtd->hw_buf[i+uPageShift] = qtd->hw_buf [i];
2097 qtd->hw_buf_hi[i+uPageShift] = qtd->hw_buf_hi [i];
2098 qtd->hw_buf [i] = 0;
2099 qtd->hw_buf_hi [i] = 0;
2100 }
2101
2102 qtd->hw_token |= (uPageShift << 12); //New Current Page
2103 }
2104
2105 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2106 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2107 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2108 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2109 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2110 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2111 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2112 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2113 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2114 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2115 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2116 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2117 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2118 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2119 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2120 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2121 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2122 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2123 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2124 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2125 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2126 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2127 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2128 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2129 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2130 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2131 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2132 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2133 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2134 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2135 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2136 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2137 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2138 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2139 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2140 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2141 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2142 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2143 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2144 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2145 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2146 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2147 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2148 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2149 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2150 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2151 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2152 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2153 #endif
2154 return count;
2155 }
2156
2157 /*-------------------------------------------------------------------------*/
2158
2159
2160 static __inline__ void
qh_update(struct ehci_hcd * ehci,struct ehci_qh * qh,struct ehci_qtd * qtd)2161 qh_update (struct ehci_hcd *ehci, struct ehci_qh *qh, struct ehci_qtd *qtd)
2162 {
2163 qh->hw_qtd_next = QTD_NEXT (qtd->qtd_dma);
2164 qh->hw_alt_next = EHCI_LIST_END;
2165
2166 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2167 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2168 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2169 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2170 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2171 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2172 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2173 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2174 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2175 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2176 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2177 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2178 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2179 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2180 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2181 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2182 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2183 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2184 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2185 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2186 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2187 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2188 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2189 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2190 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2191 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2192 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2193 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2194 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2195 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2196 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2197 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2198 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2199 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2200 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2201 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2202 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2203 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2204 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2205 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2206 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2207 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2208 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2209 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2210 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2211 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2212 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2213 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2214
2215
2216 /* HC must see latest qtd and qh data before we clear ACTIVE+HALT */
2217 wmb ();
2218 qh->hw_token &= CPUToLE32 (QTD_TOGGLE | QTD_STS_PING);
2219 }
2220
2221 /*-------------------------------------------------------------------------*/
2222 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2223 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2224 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2225 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2226 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2227 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2228 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2229 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2230 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2231 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2232 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2233 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2234 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2235 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2236 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2237 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2238 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2239 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2240 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2241 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2242 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2243 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2244 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2245 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2246 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2247 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2248 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2249 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2250 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2251 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2252 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2253 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2254 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2255 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2256 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2257 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2258 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2259 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2260 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2261 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2262 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2263 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2264 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2265 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2266 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2267 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2268 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2269 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2270
qtd_copy_status(struct ehci_hcd * ehci,struct urb * urb,size_t length,U32 token)2271 static void qtd_copy_status (
2272 struct ehci_hcd *ehci,
2273 struct urb *urb,
2274 size_t length,
2275 U32 token
2276 )
2277 {
2278 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2279 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2280 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2281 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2282 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2283 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2284 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2285 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2286 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2287 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2288 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2289 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2290 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2291 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2292 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2293 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2294 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2295 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2296 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2297 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2298 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2299 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2300 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2301 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2302 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2303 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2304 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2305 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2306 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2307 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2308 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2309 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2310 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2311 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2312 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2313 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2314 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2315 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2316 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2317 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2318 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2319 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2320 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2321 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2322 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2323 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2324 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2325 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2326
2327 if (likely (QTD_PID (token) != 2))
2328 urb->actual_length += length - QTD_LENGTH (token);
2329
2330 /* don't modify error codes */
2331 if (unlikely (urb->status != -EINPROGRESS))
2332 return;
2333
2334 /* force cleanup after short read; not always an error */
2335 if (unlikely (IS_SHORT_READ (token)))
2336 urb->status = -EREMOTEIO;
2337 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2338 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2339 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2340 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2341 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2342 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2343 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2344 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2345 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2346 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2347 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2348 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2349 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2350 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2351 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2352 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2353 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2354 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2355 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2356 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2357 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2358 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2359 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2360 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2361 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2362 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2363 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2364 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2365 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2366 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2367 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2368 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2369 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2370 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2371 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2372 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2373 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2374 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2375 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2376 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2377 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2378 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2379 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2380 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2381 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2382 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2383 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2384 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2385
2386 if (token & QTD_STS_HALT) {
2387 if (token & QTD_STS_BABBLE) {
2388 diag_printf(" [ !!!! USB QTD_STS_BABBLE !!!!] \n ");
2389 /* FIXME "must" disable babbling device's port too */
2390 urb->status = -EOVERFLOW;
2391 } else if (token & QTD_STS_MMF) {
2392 diag_printf(" [ !!!! USB QTD_STS_MMF !!!!] \n ");
2393 /* fs/ls interrupt xfer missed the complete-split */
2394 urb->status = -EPROTO;
2395 } else if (token & QTD_STS_DBE) {
2396 diag_printf(" [ !!!! USB QTD_STS_DBE !!!!] \n ");
2397 urb->status = (QTD_PID (token) == 1) /* IN ? */
2398 ? -ENOSR /* hc couldn't read data */
2399 : -ECOMM; /* hc couldn't write data */
2400 } else if (token & QTD_STS_XACT) {
2401 diag_printf(" [ USB QTD_STS_XACT ] \n ");
2402 /* timeout, bad crc, wrong PID, etc; retried */
2403 if (QTD_CERR (token))
2404 urb->status = -EPIPE;
2405 else {
2406
2407 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2408 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2409 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2410 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2411 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2412 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2413 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2414 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2415 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2416 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2417 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2418 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2419 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2420 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2421 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2422 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2423 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2424 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2425 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2426 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2427 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2428 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2429 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2430 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2431 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2432 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2433 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2434 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2435 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2436 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2437 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2438 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2439 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2440 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2441 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2442 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2443 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2444 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2445 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2446 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2447 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2448 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2449 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2450 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2451 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2452 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2453 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2454 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2455 ehci_dbg (ehci, "devpath %s ep%d%s 3strikes\n",
2456 urb->dev->devpath,
2457 usb_pipeendpoint (urb->pipe),
2458 usb_pipein (urb->pipe) ? "in" : "out");
2459 urb->status = -EPROTO;
2460 }
2461 /* CERR nonzero + no errors + halt --> stall */
2462 } else if (QTD_CERR (token))
2463 urb->status = -EPIPE;
2464 else /* unknown */
2465 urb->status = -EPROTO;
2466
2467 ehci_vdbg (ehci,
2468 "dev%d ep%d%s qtd token %08x --> status %d\n",
2469 usb_pipedevice (urb->pipe),
2470 usb_pipeendpoint (urb->pipe),
2471 usb_pipein (urb->pipe) ? "in" : "out",
2472 token, urb->status);
2473 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2474 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2475 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2476 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2477 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2478 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2479 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2480 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2481 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2482 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2483 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2484 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2485 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2486 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2487 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2488 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2489 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2490 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2491 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2492 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2493 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2494 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2495 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2496 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2497 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2498 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2499 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2500 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2501 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2502 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2503 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2504 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2505 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2506 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2507 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2508 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2509 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2510 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2511 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2512 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2513 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2514 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2515 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2516 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2517 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2518 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2519 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2520 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2521
2522 if( urb->status < 0 )
2523 {
2524 //show error messafe if transfers urb fail
2525 usb_msg("msg: dev%d ep%d%s qtd token %08x --> status %d, len=%d",
2526 usb_pipedevice (urb->pipe),
2527 usb_pipeendpoint (urb->pipe),
2528 usb_pipein (urb->pipe) ? "in" : "out",
2529 token, urb->status, urb->transfer_buffer_length);
2530 }
2531
2532
2533 /* stall indicates some recovery action is needed */
2534 if (urb->status == -EPIPE) {
2535 int pipe = urb->pipe;
2536
2537 if (!usb_pipecontrol (pipe))
2538 usb_endpoint_halt (urb->dev,
2539 usb_pipeendpoint (pipe),
2540 usb_pipeout (pipe));
2541 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2542 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2543 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2544 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2545 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2546 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2547 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2548 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2549 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2550 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2551 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2552 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2553 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2554 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2555 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2556 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2557 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2558 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2559 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2560 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2561 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2562 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2563 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2564 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2565 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2566 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2567 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2568 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2569 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2570 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2571 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2572 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2573 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2574 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2575 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2576 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2577 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2578 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2579 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2580 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2581 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2582 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2583 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2584 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2585 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2586 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2587 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2588 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2589
2590 /* if async CSPLIT failed, try cleaning out the TT buffer */
2591 #ifdef USB_EHCI_TT
2592 } else if (urb->dev->tt && !usb_pipeint (urb->pipe)
2593 && QTD_CERR(token) == 0) {
2594 #ifdef DEBUG
2595 struct usb_device *tt = urb->dev->tt->hub;
2596 dev_dbg (&tt->dev,
2597 "clear tt buffer port %d, a%d ep%d t%08x\n",
2598 urb->dev->ttport, urb->dev->devnum,
2599 usb_pipeendpoint (urb->pipe), token);
2600 #endif /* DEBUG */
2601 usb_hub_tt_clear_buffer (urb->dev, urb->pipe);
2602 }
2603 #else
2604 }
2605 #endif
2606 }
2607 }
2608 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2609 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2610 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2611 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2612 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2613 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2614 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2615 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2616 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2617 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2618 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2619 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2620 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2621 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2622 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2623 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2624 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2625 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2626 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2627 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2628 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2629 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2630 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2631 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2632 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2633 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2634 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2635 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2636 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2637 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2638 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2639 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2640 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2641 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2642 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2643 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2644 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2645 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2646 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2647 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2648 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2649 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2650 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2651 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2652 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2653 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2654 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2655 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2656
2657 static void
ehci_urb_done(struct ehci_hcd * ehci,struct urb * urb,struct pt_regs * regs)2658 ehci_urb_done (struct ehci_hcd *ehci, struct urb *urb, struct pt_regs *regs)
2659 {
2660 if (likely (urb->hcpriv != 0)) {
2661 struct ehci_qh *qh = (struct ehci_qh *) urb->hcpriv;
2662
2663 /* S-mask in a QH means it's an interrupt urb */
2664 if ((qh->hw_info2 & CPUToLE32 (0x00ff)) != 0) {
2665
2666 /* ... update hc-wide periodic stats (for usbfs) */
2667 hcd_to_bus (&ehci->hcd)->bandwidth_int_reqs--;
2668 }
2669 qh_put (ehci, qh);
2670 }
2671 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2672 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2673 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2674 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2675 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2676 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2677 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2678 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2679 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2680 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2681 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2682 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2683 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2684 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2685 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2686 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2687 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2688 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2689 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2690 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2691 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2692 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2693 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2694 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2695 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2696 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2697 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2698 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2699 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2700 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2701 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2702 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2703 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2704 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2705 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2706 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2707 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2708 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2709 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2710 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2711 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2712 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2713 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2714 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2715 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2716 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2717 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2718 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2719 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2720 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2721 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2722 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2723 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2724 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2725 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2726 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2727 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2728 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2729 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2730 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2731 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2732 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2733 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2734 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2735 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2736 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2737 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2738 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2739 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2740 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2741 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2742 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2743 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2744 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2745 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2746 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2747 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2748 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2749 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2750 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2751 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2752 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2753 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2754 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2755 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2756 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2757 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2758 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2759 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2760 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2761 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2762 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2763 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2764 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2765 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2766 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2767
2768 spin_lock (&urb->lock);
2769 urb->hcpriv = 0;
2770 switch (urb->status) {
2771 case -EINPROGRESS: /* success */
2772 urb->status = 0;
2773 default: /* fault */
2774 COUNT (ehci->stats.complete);
2775 break;
2776 case -EREMOTEIO: /* fault or normal */
2777 if (!(urb->transfer_flags & URB_SHORT_NOT_OK))
2778 urb->status = 0;
2779 COUNT (ehci->stats.complete);
2780 break;
2781
2782 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2783 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2784 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2785 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2786 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2787 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2788 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2789 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2790 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2791 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2792 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2793 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2794 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2795 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2796 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2797 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2798 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2799 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2800 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2801 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2802 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2803 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2804 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2805 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2806 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2807 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2808 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2809 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2810 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2811 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2812 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2813 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2814 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2815 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2816 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2817 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2818 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2819 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2820 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2821 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2822 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2823 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2824 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2825 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2826 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2827 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2828 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2829 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2830 case -ECONNRESET: /* canceled */
2831 case -ENOENT:
2832 COUNT (ehci->stats.unlink);
2833 break;
2834 }
2835 spin_unlock (&urb->lock);
2836
2837 /* complete() can reenter this HCD */
2838 spin_unlock (&ehci->lock);
2839 #ifdef EHCI_VERBOSE_DEBUG
2840 urb_print (urb, "RET", usb_pipeout (urb->pipe));
2841 #endif
2842 usb_hcd_giveback_urb (&ehci->hcd, urb, regs);
2843 spin_lock (&ehci->lock);
2844 }
2845
2846
2847
2848 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2849 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2850 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2851 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2852 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2853 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2854 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2855 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2856 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2857 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2858 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2859 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2860 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2861 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2862 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2863 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2864 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2865 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2866 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2867 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2868 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2869 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2870 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2871 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2872 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2873 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2874 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2875 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2876 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2877 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2878 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2879 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2880 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2881 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2882 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2883 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2884 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2885 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2886 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2887 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2888 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2889 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2890 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2891 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2892 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2893 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2894 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2895 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2896 #define HALT_BIT CPUToLE32(QTD_STS_HALT)
2897 static unsigned
qh_completions(struct ehci_hcd * ehci,struct ehci_qh * qh,struct pt_regs * regs)2898 qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh, struct pt_regs *regs)
2899 {
2900 struct ehci_qtd *last = 0, *end = qh->dummy;
2901 struct list_head *entry, *tmp;
2902 int stopped;
2903 unsigned count = 0;
2904 int do_status = 0;
2905 unsigned char state;
2906 BOOL bIsPageOver = FALSE;
2907 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2908 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2909 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2910 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2911 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2912 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2913 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2914 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2915 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2916 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2917 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2918 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2919 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2920 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2921 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2922 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2923 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2924 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2925 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2926 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2927 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2928 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2929 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2930 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2931 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2932 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2933 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2934 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2935 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2936 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2937 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2938 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2939 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2940 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2941 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2942 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2943 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2944 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2945 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2946 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2947 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2948 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2949 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2950 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2951 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2952 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2953 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2954 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2955
2956 if (unlikely (list_empty (&qh->qtd_list)))
2957 return count;
2958
2959 state = qh->qh_state;
2960 qh->qh_state = QH_STATE_COMPLETING;
2961 stopped = (state == QH_STATE_IDLE);
2962 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2963 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2964 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2965 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2966 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2967 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2968 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2969 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2970 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2971 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2972 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2973 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2974 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2975 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2976 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2977 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2978 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2979 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2980 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2981 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2982 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2983 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2984 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2985 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2986 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2987 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2988 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2989 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2990 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2991 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2992 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2993 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2994 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2995 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2996 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2997 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2998 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2999 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3000 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3001 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3002 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3003 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3004 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3005 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3006 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3007 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3008 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3009 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3010
3011 list_for_each_safe (entry, tmp, &qh->qtd_list) {
3012 struct ehci_qtd *qtd;
3013 struct urb *urb;
3014 U32 token = 0;
3015
3016 qtd = list_entry (entry, struct ehci_qtd, qtd_list);
3017 //list_entry (entry, struct ehci_qtd,qtd_list, struct list_head,qtd);
3018 urb = qtd->urb;
3019
3020 if ( ((qtd->hw_token >> 12) & 0x7) > 5) //For patching H/W bug
3021 {
3022 // diag_printf("Set Over Page !!!\n");
3023 bIsPageOver = TRUE;
3024 }
3025
3026 /* clean up any state from previous QTD ...*/
3027 if (last) {
3028 if (likely (last->urb != urb)) {
3029 ehci_urb_done (ehci, last->urb, regs);
3030 count++;
3031 }
3032
3033 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3034 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3035 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3036 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3037 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3038 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3039 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3040 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3041 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3042 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3043 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3044 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3045 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3046 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3047 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3048 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3049 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3050 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3051 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3052 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3053 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3054 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3055 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3056 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3057 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3058 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3059 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3060 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3061 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3062 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3063 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3064 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3065 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3066 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3067 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3068 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3069 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3070 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3071 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3072 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3073 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3074 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3075 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3076 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3077 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3078 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3079 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3080 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3081 ehci_qtd_free (ehci, last);
3082 last = 0;
3083 }
3084
3085 /* ignore urbs submitted during completions we reported */
3086 if (qtd == end)
3087 break;
3088
3089 /* hardware copies qtd out of qh overlay */
3090 rmb ();
3091
3092 token = LE32ToCPU (qtd->hw_token);
3093
3094 /* always clean up qtds the hc de-activated */
3095 if ((token & QTD_STS_ACTIVE) == 0) {
3096
3097 if ((token & QTD_STS_HALT) != 0) {
3098 stopped = 1;
3099 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3100 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3101 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3102 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3103 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3104 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3105 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3106 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3107 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3108 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3109 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3110 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3111 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3112 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3113 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3114 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3115 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3116 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3117 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3118 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3119 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3120 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3121 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3122 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3123 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3124 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3125 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3126 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3127 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3128 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3129 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3130 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3131 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3132 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3133 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3134 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3135 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3136 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3137 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3138 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3139 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3140 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3141 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3142 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3143 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3144 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3145 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3146 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3147
3148 } else if (IS_SHORT_READ (token)
3149 && (qh->hw_alt_next & QTD_MASK)
3150 == ehci->async->hw_alt_next) {
3151 stopped = 1;
3152 goto halt;
3153 } /*else if (IS_SHORT_READ (token)) {
3154 #if 0
3155 qh->hw_token &= __constant_cpu_to_le32 (QTD_TOGGLE | QTD_STS_PING);
3156 #else
3157 stopped = 1;
3158 goto halt;
3159 #endif
3160 }*/
3161 /* stop scanning when we reach qtds the hc is using */
3162 } else if (likely (!stopped
3163 && HCD_IS_RUNNING (ehci->hcd.state))) {
3164 break;
3165
3166 } else {
3167 stopped = 1;
3168 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3169 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3170 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3171 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3172 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3173 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3174 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3175 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3176 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3177 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3178 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3179 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3180 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3181 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3182 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3183 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3184 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3185 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3186 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3187 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3188 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3189 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3190 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3191 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3192 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3193 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3194 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3195 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3196 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3197 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3198 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3199 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3200 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3201 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3202 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3203 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3204 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3205 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3206 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3207 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3208 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3209 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3210 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3211 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3212 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3213 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3214 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3215 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3216
3217 if (likely (urb->status == -EINPROGRESS))
3218 continue;
3219
3220 /* issue status after short control reads */
3221 if (unlikely (do_status != 0)
3222 && QTD_PID (token) == 0 /* OUT */) {
3223 do_status = 0;
3224 continue;
3225 }
3226
3227 /* token in overlay may be most current */
3228 if (state == QH_STATE_IDLE
3229 && CPUToLE32 (qtd->qtd_dma)
3230 == qh->hw_current)
3231 token = LE32ToCPU (qh->hw_token);
3232
3233 if ((HALT_BIT & qh->hw_token) == 0) {
3234 halt:
3235 qh->hw_token |= HALT_BIT;
3236 wmb ();
3237 }
3238 }
3239 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3240 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3241 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3242 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3243 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3244 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3245 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3246 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3247 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3248 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3249 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3250 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3251 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3252 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3253 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3254 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3255 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3256 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3257 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3258 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3259 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3260 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3261 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3262 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3263 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3264 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3265 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3266 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3267 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3268 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3269 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3270 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3271 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3272 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3273 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3274 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3275 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3276 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3277 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3278 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3279 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3280 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3281 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3282 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3283 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3284 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3285 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3286 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3287
3288 /* remove it from the queue */
3289 spin_lock (&urb->lock);
3290 qtd_copy_status (ehci, urb, qtd->length, token);
3291 if (bIsPageOver)
3292 {
3293 //diag_printf("urb error because C_Page > 5\n");
3294 urb->status = (QTD_PID (token) == 1) /* IN ? */
3295 ? -ENOSR /* hc couldn't read data */
3296 : -ECOMM; /* hc couldn't write data */
3297 }
3298 do_status = (urb->status == -EREMOTEIO)
3299 && usb_pipecontrol (urb->pipe);
3300 spin_unlock (&urb->lock);
3301
3302 if (stopped && qtd->qtd_list.prev != &qh->qtd_list) {
3303 last = list_entry (qtd->qtd_list.prev, struct ehci_qtd, qtd_list);
3304 //list_entry (qtd->qtd_list.prev,struct ehci_qtd,qtd_list, struct list_head,last);
3305 last->hw_next = qtd->hw_next;
3306
3307 }
3308 list_del (&qtd->qtd_list);
3309 last = qtd;
3310 } /* list_for_each_safe */
3311
3312 if (likely (last != 0)) {
3313 ehci_urb_done (ehci, last->urb, regs);
3314 count++;
3315 ehci_qtd_free (ehci, last);
3316 last = 0;
3317 }
3318 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3319 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3320 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3321 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3322 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3323 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3324 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3325 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3326 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3327 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3328 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3329 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3330 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3331 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3332 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3333 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3334 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3335 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3336 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3337 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3338 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3339 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3340 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3341 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3342 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3343 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3344 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3345 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3346 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3347 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3348 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3349 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3350 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3351 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3352 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3353 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3354 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3355 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3356 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3357 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3358 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3359 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3360 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3361 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3362 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3363 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3364 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3365 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3366
3367 qh->qh_state = state;
3368
3369 if (unlikely (stopped != 0)
3370 /* some EHCI 0.95 impls will overlay dummy qtds */
3371 || qh->hw_qtd_next == EHCI_LIST_END) {
3372 if (list_empty (&qh->qtd_list))
3373 end = qh->dummy;
3374 else {
3375 end = list_entry (qh->qtd_list.next,struct ehci_qtd, qtd_list);
3376 //list_entry (qh->qtd_list.next,struct ehci_qtd, qtd_list, struct list_head, end);
3377 if (CPUToLE32 (end->qtd_dma) == qh->hw_current)
3378 end = 0;
3379 }
3380 if (end)
3381 qh_update (ehci, qh, end);
3382 }
3383
3384 return count;
3385 }
3386
3387 /*-------------------------------------------------------------------------*/
3388 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3389 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3390 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3391 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3392 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3393 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3394 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3395 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3396 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3397 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3398 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3399 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3400 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3401 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3402 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3403 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3404 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3405 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3406 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3407 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3408 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3409 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3410 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3411 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3412 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3413 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3414 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3415 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3416 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3417 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3418 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3419 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3420 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3421 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3422 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3423 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3424 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3425 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3426 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3427 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3428 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3429 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3430 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3431 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3432 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3433 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3434 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3435 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3436
3437 // high bandwidth multiplier, as encoded in highspeed endpoint descriptors
3438 #define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))
3439 // ... and packet size, for any kind of endpoint descriptor
3440 #define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)
3441
qtd_list_free(struct ehci_hcd * ehci,struct urb * urb,struct list_head * qtd_list)3442 static void qtd_list_free (
3443 struct ehci_hcd *ehci,
3444 struct urb *urb,
3445 struct list_head *qtd_list
3446 ) {
3447 struct list_head *entry, *temp;
3448
3449 list_for_each_safe (entry, temp, qtd_list) {
3450 struct ehci_qtd *qtd;
3451 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3452 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3453 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3454 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3455 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3456 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3457 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3458 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3459 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3460 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3461 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3462 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3463 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3464 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3465 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3466 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3467 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3468 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3469 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3470 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3471 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3472 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3473 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3474 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3475 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3476 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3477 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3478 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3479 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3480 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3481 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3482 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3483 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3484 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3485 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3486 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3487 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3488 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3489 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3490 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3491 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3492 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3493 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3494 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3495 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3496 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3497 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3498 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3499
3500 qtd = list_entry (entry, struct ehci_qtd, qtd_list);
3501 //list_entry (entry, struct ehci_qtd, qtd_list,struct list_head, qtd);
3502 list_del (&qtd->qtd_list);
3503 ehci_qtd_free (ehci, qtd);
3504 }
3505 }
3506
3507 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3508 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3509 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3510 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3511 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3512 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3513 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3514 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3515 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3516 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3517 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3518 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3519 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3520 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3521 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3522 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3523 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3524 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3525 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3526 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3527 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3528 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3529 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3530 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3531 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3532 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3533 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3534 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3535 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3536 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3537 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3538 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3539 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3540 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3541 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3542 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3543 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3544 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3545 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3546 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3547 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3548 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3549 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3550 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3551 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3552 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3553 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3554 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3555
3556 static struct list_head *
qh_urb_transaction(struct ehci_hcd * ehci,struct urb * urb,struct list_head * head,int flags)3557 qh_urb_transaction (
3558 struct ehci_hcd *ehci,
3559 struct urb *urb,
3560 struct list_head *head,
3561 int flags
3562 ) {
3563 struct ehci_qtd *qtd, *qtd_prev;
3564 dma_addr_t buf;
3565 int len, maxpacket;
3566 int is_input;
3567 U32 token;
3568 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3569 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3570 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3571 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3572 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3573 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3574 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3575 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3576 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3577 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3578 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3579 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3580 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3581 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3582 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3583 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3584 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3585 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3586 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3587 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3588 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3589 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3590 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3591 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3592 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3593 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3594 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3595 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3596 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3597 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3598 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3599 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3600 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3601 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3602 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3603 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3604 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3605 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3606 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3607 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3608 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3609 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3610 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3611 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3612 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3613 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3614 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3615 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3616 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3617 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3618 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3619 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3620 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3621 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3622 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3623 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3624 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3625 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3626 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3627 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3628 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3629 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3630 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3631 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3632 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3633 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3634 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3635 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3636 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3637 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3638 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3639 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3640 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3641 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3642 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3643 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3644 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3645 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3646 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3647 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3648 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3649 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3650 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3651 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3652 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3653 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3654 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3655 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3656 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3657 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3658 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3659 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3660 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3661 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3662 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3663 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3664
3665 qtd = ehci_qtd_alloc (ehci, flags);
3666 if (unlikely (!qtd))
3667 return 0;
3668 list_add_tail (&qtd->qtd_list, head);
3669 qtd->urb = urb;
3670
3671 token = QTD_STS_ACTIVE;
3672 token |= (EHCI_TUNE_CERR << 10);
3673 /* for split transactions, SplitXState initialized to zero */
3674 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3675 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3676 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3677 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3678 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3679 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3680 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3681 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3682 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3683 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3684 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3685 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3686 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3687 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3688 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3689 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3690 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3691 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3692 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3693 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3694 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3695 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3696 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3697 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3698 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3699 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3700 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3701 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3702 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3703 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3704 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3705 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3706 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3707 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3708 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3709 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3710 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3711 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3712 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3713 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3714 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3715 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3716 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3717 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3718 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3719 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3720 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3721 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3722
3723 len = urb->transfer_buffer_length;
3724 is_input = usb_pipein (urb->pipe);
3725 if (usb_pipecontrol (urb->pipe)) {
3726 /* SETUP pid */
3727 qtd_fill (qtd, urb->setup_dma, sizeof (struct usb_ctrlrequest),
3728 token | (2 /* "setup" */ << 8), 8);
3729 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3730 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3731 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3732 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3733 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3734 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3735 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3736 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3737 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3738 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3739 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3740 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3741 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3742 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3743 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3744 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3745 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3746 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3747 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3748 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3749 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3750 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3751 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3752 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3753 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3754 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3755 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3756 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3757 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3758 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3759 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3760 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3761 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3762 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3763 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3764 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3765 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3766 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3767 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3768 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3769 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3770 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3771 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3772 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3773 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3774 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3775 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3776 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3777
3778 /* ... and always at least one more pid */
3779 token ^= QTD_TOGGLE;
3780 qtd_prev = qtd;
3781 qtd = ehci_qtd_alloc (ehci, flags);
3782 if (unlikely (!qtd))
3783 goto cleanup;
3784 qtd->urb = urb;
3785 qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);
3786 list_add_tail (&qtd->qtd_list, head);
3787 }
3788
3789 /*
3790 * data transfer stage: buffer setup
3791 */
3792
3793 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3794 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3795 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3796 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3797 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3798 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3799 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3800 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3801 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3802 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3803 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3804 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3805 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3806 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3807 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3808 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3809 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3810 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3811 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3812 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3813 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3814 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3815 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3816 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3817 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3818 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3819 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3820 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3821 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3822 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3823 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3824 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3825 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3826 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3827 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3828 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3829 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3830 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3831 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3832 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3833 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3834 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3835 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3836 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3837 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3838 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3839 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3840 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3841 if (likely (len > 0))
3842 buf = urb->transfer_dma;
3843 else
3844 buf = 0;
3845
3846 if (!buf || is_input)
3847 token |= (1 /* "in" */ << 8);
3848 /* else it's already initted to "out" pid (0 << 8) */
3849 #if 0
3850 maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
3851 #else
3852 if (usb_pipebulk(urb->pipe)) {
3853 switch (urb->dev->speed) {
3854 case USB_SPEED_FULL:
3855 maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
3856 break;
3857 case USB_SPEED_HIGH:
3858 default:
3859 maxpacket = 512;
3860 break;
3861 }
3862 }
3863 else {
3864 maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
3865 }
3866
3867 #endif
3868 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3869 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3870 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3871 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3872 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3873 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3874 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3875 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3876 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3877 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3878 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3879 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3880 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3881 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3882 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3883 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3884 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3885 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3886 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3887 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3888 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3889 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3890 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3891 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3892 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3893 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3894 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3895 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3896 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3897 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3898 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3899 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3900 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3901 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3902 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3903 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3904 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3905 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3906 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3907 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3908 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3909 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3910 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3911 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3912 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3913 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3914 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3915 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3916
3917 for (;;) {
3918 int this_qtd_len;
3919
3920
3921 this_qtd_len = qtd_fill (qtd, buf, len, token, maxpacket);
3922 len -= this_qtd_len;
3923 buf += this_qtd_len;
3924 if (is_input)
3925 qtd->hw_alt_next = ehci->async->hw_alt_next;
3926 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3927 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3928 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3929 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3930 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3931 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3932 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3933 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3934 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3935 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3936 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3937 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3938 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3939 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3940 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3941 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3942 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3943 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3944 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3945 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3946 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3947 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3948 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3949 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3950 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3951 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3952 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3953 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3954 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3955 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3956 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3957 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3958 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3959 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3960 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3961 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3962 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3963 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3964 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3965 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3966 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3967 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3968 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3969 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3970 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3971 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3972 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3973 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3974
3975 /* qh makes control packets use qtd toggle; maybe switch it */
3976 if ((maxpacket & (this_qtd_len + (maxpacket - 1))) == 0)
3977 token ^= QTD_TOGGLE;
3978
3979 if (likely (len <= 0))
3980 break;
3981
3982 qtd_prev = qtd;
3983 qtd = ehci_qtd_alloc (ehci, flags);
3984 if (unlikely (!qtd))
3985 goto cleanup;
3986 qtd->urb = urb;
3987 qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);
3988 list_add_tail (&qtd->qtd_list, head);
3989 }
3990 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3991 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3992 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3993 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3994 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3995 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3996 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3997 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3998 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3999 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4000 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4001 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4002 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4003 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4004 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4005 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4006 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4007 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4008 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4009 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4010 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4011 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4012 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4013 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4014 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4015 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4016 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4017 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4018 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4019 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4020 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4021 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4022 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4023 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4024 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4025 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4026 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4027 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4028 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4029 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4030 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4031 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4032 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4033 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4034 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4035 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4036 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4037 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4038
4039 if (likely ((urb->transfer_flags & URB_SHORT_NOT_OK) == 0
4040 || usb_pipecontrol (urb->pipe)))
4041 qtd->hw_alt_next = EHCI_LIST_END;
4042
4043
4044 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4045 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4046 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4047 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4048 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4049 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4050 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4051 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4052 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4053 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4054 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4055 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4056 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4057 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4058 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4059 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4060 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4061 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4062 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4063 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4064 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4065 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4066 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4067 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4068 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4069 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4070 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4071 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4072 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4073 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4074 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4075 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4076 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4077 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4078 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4079 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4080 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4081 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4082 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4083 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4084 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4085 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4086 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4087 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4088 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4089 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4090 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4091 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4092 if (likely (buf != 0)) {
4093 int one_more = 0;
4094
4095 if (usb_pipecontrol (urb->pipe)) {
4096 one_more = 1;
4097 token ^= 0x0100; /* "in" <--> "out" */
4098 token |= QTD_TOGGLE; /* force DATA1 */
4099 } else if (usb_pipebulk (urb->pipe)
4100 && (urb->transfer_flags & URB_ZERO_PACKET)
4101 && !(urb->transfer_buffer_length % maxpacket)) {
4102 one_more = 1;
4103 }
4104
4105 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4106 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4107 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4108 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4109 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4110 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4111 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4112 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4113 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4114 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4115 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4116 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4117 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4118 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4119 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4120 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4121 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4122 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4123 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4124 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4125 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4126 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4127 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4128 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4129 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4130 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4131 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4132 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4133 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4134 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4135 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4136 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4137 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4138 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4139 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4140 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4141 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4142 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4143 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4144 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4145 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4146 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4147 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4148 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4149 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4150 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4151 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4152 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4153 if (one_more) {
4154 qtd_prev = qtd;
4155 qtd = ehci_qtd_alloc (ehci, flags);
4156 if (unlikely (!qtd))
4157 goto cleanup;
4158 qtd->urb = urb;
4159 qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);
4160 list_add_tail (&qtd->qtd_list, head);
4161 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4162 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4163 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4164 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4165 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4166 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4167 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4168 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4169 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4170 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4171 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4172 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4173 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4174 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4175 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4176 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4177 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4178 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4179 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4180 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4181 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4182 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4183 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4184 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4185 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4186 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4187 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4188 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4189 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4190 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4191 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4192 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4193 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4194 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4195 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4196 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4197 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4198 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4199 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4200 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4201 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4202 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4203 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4204 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4205 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4206 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4207 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4208 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4209
4210 /* never any data in such packets */
4211 qtd_fill (qtd, 0, 0, token, 0);
4212 }
4213 }
4214
4215 /* by default, enable interrupt on urb completion */
4216 if (likely (!(urb->transfer_flags & URB_NO_INTERRUPT)))
4217 qtd->hw_token |= CPUToLE32 (QTD_IOC);
4218 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4219 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4220 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4221 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4222 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4223 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4224 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4225 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4226 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4227 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4228 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4229 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4230 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4231 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4232 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4233 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4234 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4235 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4236 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4237 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4238 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4239 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4240 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4241 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4242 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4243 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4244 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4245 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4246 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4247 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4248 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4249 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4250 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4251 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4252 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4253 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4254 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4255 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4256 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4257 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4258 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4259 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4260 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4261 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4262 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4263 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4264 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4265 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4266
4267 return head;
4268
4269 cleanup:
4270
4271 qtd_list_free (ehci, urb, head);
4272 return 0;
4273 }
4274
4275 /*-------------------------------------------------------------------------*/
4276
4277 static __inline__ void
clear_toggle(struct usb_device * udev,int ep,int is_out,struct ehci_qh * qh)4278 clear_toggle (struct usb_device *udev, int ep, int is_out, struct ehci_qh *qh)
4279 {
4280 vdbg ("clear toggle, dev %d ep 0x%x-%s",
4281 udev->devnum, ep, is_out ? "out" : "in");
4282 qh->hw_token &= ~(CPUToLE32(QTD_TOGGLE));
4283
4284 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4285 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4286 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4287 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4288 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4289 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4290 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4291 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4292 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4293 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4294 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4295 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4296 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4297 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4298 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4299 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4300 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4301 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4302 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4303 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4304 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4305 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4306 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4307 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4308 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4309 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4310 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4311 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4312 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4313 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4314 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4315 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4316 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4317 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4318 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4319 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4320 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4321 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4322 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4323 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4324 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4325 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4326 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4327 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4328 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4329 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4330 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4331 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4332 usb_settoggle (udev, ep, is_out, 1);
4333 }
4334
4335
4336 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4337 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4338 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4339 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4340 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4341 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4342 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4343 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4344 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4345 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4346 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4347 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4348 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4349 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4350 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4351 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4352 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4353 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4354 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4355 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4356 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4357 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4358 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4359 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4360 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4361 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4362 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4363 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4364 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4365 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4366 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4367 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4368 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4369 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4370 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4371 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4372 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4373 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4374 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4375 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4376 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4377 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4378 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4379 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4380 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4381 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4382 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4383 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4384
4385
4386 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4387 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4388 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4389 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4390 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4391 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4392 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4393 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4394 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4395 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4396 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4397 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4398 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4399 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4400 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4401 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4402 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4403 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4404 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4405 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4406 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4407 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4408 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4409 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4410 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4411 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4412 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4413 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4414 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4415 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4416 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4417 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4418 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4419 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4420 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4421 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4422 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4423 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4424 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4425 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4426 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4427 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4428 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4429 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4430 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4431 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4432 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4433 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4434 static struct ehci_qh *
qh_make(struct ehci_hcd * ehci,struct urb * urb,int flags)4435 qh_make (
4436 struct ehci_hcd *ehci,
4437 struct urb *urb,
4438 int flags
4439 ) {
4440 struct ehci_qh *qh = ehci_qh_alloc (ehci, flags);
4441 U32 info1 = 0, info2 = 0;
4442 int is_input, type;
4443 int maxp = 0;
4444
4445 if (!qh)
4446 return qh;
4447 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4448 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4449 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4450 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4451 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4452 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4453 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4454 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4455 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4456 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4457 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4458 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4459 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4460 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4461 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4462 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4463 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4464 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4465 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4466 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4467 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4468 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4469 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4470 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4471 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4472 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4473 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4474 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4475 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4476 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4477 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4478 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4479 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4480 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4481 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4482 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4483 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4484 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4485 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4486 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4487 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4488 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4489 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4490 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4491 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4492 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4493 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4494 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4495
4496 info1 |= usb_pipeendpoint (urb->pipe) << 8;
4497 info1 |= usb_pipedevice (urb->pipe) << 0;
4498 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4499 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4500 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4501 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4502 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4503 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4504 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4505 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4506 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4507 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4508 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4509 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4510 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4511 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4512 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4513 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4514 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4515 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4516 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4517 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4518 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4519 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4520 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4521 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4522 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4523 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4524 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4525 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4526 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4527 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4528 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4529 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4530 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4531 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4532 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4533 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4534 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4535 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4536 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4537 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4538 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4539 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4540 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4541 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4542 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4543 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4544 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4545 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4546
4547 is_input = usb_pipein (urb->pipe);
4548 type = usb_pipetype (urb->pipe);
4549 maxp = usb_maxpacket (urb->dev, urb->pipe, !is_input);
4550
4551 if (type == PIPE_INTERRUPT) {
4552 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4553 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4554 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4555 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4556 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4557 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4558 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4559 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4560 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4561 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4562 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4563 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4564 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4565 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4566 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4567 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4568 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4569 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4570 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4571 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4572 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4573 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4574 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4575 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4576 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4577 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4578 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4579 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4580 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4581 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4582 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4583 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4584 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4585 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4586 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4587 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4588 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4589 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4590 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4591 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4592 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4593 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4594 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4595 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4596 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4597 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4598 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4599 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4600
4601 // #ifndef CONFIG_FARADAY_FOTG200
4602 qh->usecs = usb_calc_bus_time (USB_SPEED_HIGH, is_input, 0,
4603 hb_mult (maxp) * max_packet (maxp));
4604 // #else
4605 // eCurURBSpeed = urb->dev->speed;
4606 // qh->usecs = usb_calc_bus_time (urb->dev->speed, is_input, 0,max_packet (maxp));
4607 // #endif
4608
4609 qh->start = NO_FRAME;
4610
4611 if (urb->dev->speed == USB_SPEED_HIGH) {
4612 qh->c_usecs = 0;
4613 qh->gap_uf = 0;
4614
4615 /* FIXME handle HS periods of less than 1 frame. */
4616 qh->period = urb->interval >> 3;
4617 if (qh->period < 1) {
4618 dbg ("intr period %d uframes, NYET!",
4619 urb->interval);
4620 goto done;
4621 }
4622 } else {
4623 #ifndef CONFIG_FARADAY_FOTG200
4624
4625 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4626 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4627 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4628 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4629 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4630 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4631 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4632 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4633 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4634 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4635 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4636 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4637 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4638 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4639 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4640 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4641 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4642 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4643 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4644 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4645 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4646 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4647 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4648 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4649 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4650 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4651 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4652 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4653 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4654 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4655 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4656 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4657 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4658 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4659 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4660 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4661 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4662 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4663 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4664 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4665 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4666 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4667 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4668 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4669 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4670 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4671 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4672 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4673 /* gap is f(FS/LS transfer times) */
4674 qh->gap_uf = 1 + usb_calc_bus_time (urb->dev->speed,
4675 is_input, 0, maxp) / (125 * 1000);
4676
4677 /* FIXME this just approximates SPLIT/CSPLIT times */
4678 if (is_input) { // SPLIT, gap, CSPLIT+DATA
4679 qh->c_usecs = qh->usecs + HS_USECS (0);
4680 qh->usecs = HS_USECS (1);
4681 } else { // SPLIT+DATA, gap, CSPLIT
4682 qh->usecs += HS_USECS (1);
4683 qh->c_usecs = HS_USECS (0);
4684 }
4685 qh->period = urb->interval;
4686 #else
4687 qh->period = urb->interval >> 3;
4688 #endif
4689
4690 }
4691 }
4692 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4693 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4694 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4695 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4696 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4697 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4698 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4699 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4700 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4701 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4702 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4703 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4704 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4705 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4706 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4707 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4708 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4709 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4710 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4711 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4712 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4713 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4714 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4715 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4716 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4717 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4718 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4719 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4720 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4721 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4722 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4723 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4724 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4725 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4726 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4727 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4728 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4729 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4730 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4731 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4732 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4733 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4734 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4735 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4736 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4737 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4738 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4739 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4740
4741 //#ifdef CONFIG_FARADAY_FOTG200
4742 #if 1
4743 switch (urb->dev->speed) {
4744 case USB_SPEED_LOW:
4745 info1 |= (1 << 12); /* EPS "low" */
4746 /* FALL THROUGH */
4747 break;
4748 case USB_SPEED_FULL:
4749 break;
4750 case USB_SPEED_HIGH:
4751 info1 |= (2 << 12); /* EPS "high" */
4752 break;
4753 default:
4754 dbg ("unknow speed %d", urb->dev->speed);
4755 break;
4756
4757 }
4758 #endif
4759
4760 /* using TT? */
4761 switch (urb->dev->speed) {
4762
4763 case USB_SPEED_LOW:
4764 if (type == PIPE_CONTROL) {
4765 info1 |= 8 << 16; /* fixed maxpacket */
4766 }
4767 /* FALL THROUGH */
4768
4769 case USB_SPEED_FULL:
4770 //#ifdef CONFIG_FARADAY_FOTG200
4771 if (type == PIPE_CONTROL && (urb->dev->speed == USB_SPEED_FULL) ) {
4772 //info1 |= 64 << 16; // fixed maxpacket
4773 info1 |= max_packet (maxp) << 16; // PIPE_INTERRUPT,PIPE_BULK,PIPE_ISOCHRONOUS
4774 }
4775 if (type != PIPE_CONTROL) {
4776 info1 |= max_packet (maxp) << 16; // PIPE_INTERRUPT,PIPE_BULK,PIPE_ISOCHRONOUS
4777 }
4778 /* EPS 0 means "full" */
4779 // info1 |= (3 << 12); /* EPS "reserve" */
4780 //#endif
4781 if (type != PIPE_INTERRUPT)
4782 info1 |= (EHCI_TUNE_RL_TT << 28);
4783 if (type == PIPE_CONTROL) {
4784 info1 |= (1 << 27); /* for TT */
4785 info1 |= 1 << 14; /* toggle from qtd */
4786 }
4787 info2 |= (EHCI_TUNE_MULT_TT << 30);
4788
4789 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4790 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4791 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4792 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4793 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4794 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4795 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4796 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4797 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4798 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4799 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4800 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4801 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4802 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4803 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4804 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4805 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4806 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4807 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4808 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4809 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4810 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4811 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4812 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4813 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4814 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4815 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4816 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4817 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4818 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4819 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4820 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4821 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4822 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4823 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4824 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4825 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4826 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4827 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4828 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4829 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4830 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4831 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4832 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4833 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4834 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4835 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4836 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4837 //#ifndef CONFIG_FARADAY_FOTG200
4838 #if 1
4839 if (urb->dev->tt->hub->devnum != 1) // Skip the Root Hub devnum == 1
4840 {
4841 info2 |= urb->dev->ttport << 23;
4842 info2 |= urb->dev->tt->hub->devnum << 16;
4843 }
4844 #else
4845 #endif /* CONFIG_FARADAY_FOTG200 */
4846 /* NOTE: if (PIPE_INTERRUPT) { scheduler sets c-mask } */
4847 break;
4848 case USB_SPEED_HIGH: /* no TT involved */
4849 info1 |= (2 << 12); /* EPS "high" */
4850 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4851 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4852 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4853 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4854 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4855 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4856 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4857 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4858 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4859 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4860 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4861 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4862 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4863 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4864 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4865 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4866 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4867 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4868 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4869 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4870 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4871 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4872 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4873 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4874 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4875 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4876 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4877 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4878 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4879 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4880 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4881 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4882 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4883 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4884 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4885 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4886 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4887 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4888 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4889 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4890 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4891 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4892 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4893 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4894 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4895 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4896 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4897 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4898
4899 if (type == PIPE_CONTROL) {
4900 info1 |= (EHCI_TUNE_RL_HS << 28);
4901 info1 |= 64 << 16; /* usb2 fixed maxpacket */
4902 info1 |= 1 << 14; /* toggle from qtd */
4903 info2 |= (EHCI_TUNE_MULT_HS << 30);
4904 } else if (type == PIPE_BULK) {
4905 info1 |= (EHCI_TUNE_RL_HS << 28);
4906 #if 0
4907 info1 |= 512 << 16; /* usb2 fixed maxpacket */
4908 #else
4909 info1 |= max_packet (maxp) << 16; // Philips mp3 player endpoint descriptor bug
4910 #endif
4911 info2 |= (EHCI_TUNE_MULT_HS << 30);
4912 } else { /* PIPE_INTERRUPT */
4913 info1 |= max_packet (maxp) << 16;
4914 info2 |= hb_mult (maxp) << 30;
4915 }
4916 break;
4917 default:
4918 dbg ("bogus dev %p speed %d", urb->dev, urb->dev->speed);
4919 done:
4920 qh_put (ehci, qh);
4921 return 0;
4922 }
4923
4924 /* NOTE: if (PIPE_INTERRUPT) { scheduler sets s-mask } */
4925 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4926 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4927 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4928 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4929 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4930 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4931 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4932 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4933 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4934 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4935 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4936 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4937 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4938 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4939 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4940 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4941 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4942 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4943 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4944 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4945 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4946 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4947 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4948 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4949 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4950 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4951 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4952 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4953 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4954 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4955 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4956 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4957 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4958 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4959 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4960 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4961 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4962 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4963 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4964 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4965 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4966 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4967 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4968 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4969 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4970 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4971 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4972 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4973
4974 /* init as live, toggle clear, advance to dummy */
4975 qh->qh_state = QH_STATE_IDLE;
4976 qh->hw_info1 = CPUToLE32 (info1);
4977 qh->hw_info2 = CPUToLE32 (info2);
4978 qh_update (ehci, qh, qh->dummy);
4979 usb_settoggle (urb->dev, usb_pipeendpoint (urb->pipe), !is_input, 1);
4980 return qh;
4981 }
4982 #undef hb_mult
4983 #undef hb_packet
4984
4985 /*-------------------------------------------------------------------------*/
4986
qh_link_async(struct ehci_hcd * ehci,struct ehci_qh * qh)4987 static void qh_link_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
4988 {
4989 U32 dma = QH_NEXT (qh->qh_dma);
4990 struct ehci_qh *head;
4991
4992 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4993 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4994 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4995 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4996 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4997 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4998 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4999 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5000 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5001 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5002 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5003 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5004 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5005 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5006 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5007 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5008 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5009 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5010 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5011 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5012 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5013 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5014 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5015 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5016 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5017 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5018 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5019 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5020 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5021 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5022 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5023 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5024 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5025 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5026 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5027 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5028 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5029 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5030 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5031 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5032 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5033 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5034 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5035 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5036 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5037 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5038 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5039 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5040
5041 /* (re)start the async schedule? */
5042 head = ehci->async;
5043 timer_action_done (ehci, TIMER_ASYNC_OFF);
5044
5045 if (!head->qh_next.qh) {
5046 U32 cmd = ehci_readl ((U32)&ehci->regs->command);
5047 //If disable => restart it
5048 if (!(cmd & CMD_ASE)) {
5049 /* in case a clear of CMD_ASE didn't take yet */
5050 (void) handshake (&ehci->regs->status, STS_ASS, 0, 150);
5051 cmd |= CMD_ASE | CMD_RUN; //asynchronous scheduler enable
5052 ehci_writel (cmd, (U32)&ehci->regs->command);
5053 ehci->hcd.state = USB_STATE_RUNNING;
5054 /* posted write need not be known to HC yet ... */
5055 }
5056 }
5057 //ehci->regs->status=0x3f; //clear status
5058 //ehci->regs->command&=~CMD_ASE; //stop async scheduler
5059 qh->hw_token &= ~HALT_BIT;
5060 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5061 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5062 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5063 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5064 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5065 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5066 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5067 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5068 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5069 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5070 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5071 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5072 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5073 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5074 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5075 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5076 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5077 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5078 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5079 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5080 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5081 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5082 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5083 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5084 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5085 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5086 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5087 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5088 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5089 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5090 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5091 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5092 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5093 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5094 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5095 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5096 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5097 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5098 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5099 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5100 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5101 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5102 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5103 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5104 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5105 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5106 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5107 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5108
5109 /* splice right after start */
5110 qh->qh_next = head->qh_next;
5111 qh->hw_next = head->hw_next;
5112 wmb ();
5113
5114 head->qh_next.qh = qh;
5115 head->hw_next = dma;
5116 //game_status=0;
5117 qh->qh_state = QH_STATE_LINKED;
5118 // ehci->regs->command|=CMD_ASE; //start async scheduler
5119 /* qtd completions reported later by interrupt */
5120 }
5121 #if 0
5122 static void qh_link_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
5123 {
5124 U32 dma = QH_NEXT (qh->qh_dma);
5125 struct ehci_qh *q;
5126
5127 // DBG_HOST_EHCI("### >>> Enter ehci-q.c file --> qh_link_async function \n");
5128
5129 if (unlikely (!(q = ehci->async))) {
5130 U32 cmd = ehci_readl (&ehci->regs->command);
5131
5132 /* in case a clear of CMD_ASE didn't take yet */
5133 while (ehci_readl (&ehci->regs->status) & STS_ASS)
5134 udelay (100);
5135 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5136 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5137 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5138 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5139 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5140 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5141 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5142 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5143 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5144 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5145 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5146 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5147 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5148 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5149 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5150 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5151 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5152 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5153 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5154 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5155 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5156 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5157 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5158 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5159 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5160 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5161 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5162 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5163 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5164 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5165 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5166 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5167 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5168 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5169 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5170 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5171 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5172 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5173 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5174 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5175 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5176 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5177 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5178 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5179 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5180 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5181 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5182 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5183
5184 qh->hw_info1 |= CPUToLE32 (QH_HEAD); /* [4.8] */
5185 qh->qh_next.qh = qh;
5186 qh->hw_next = dma;
5187 wmb ();
5188 ehci->async = qh;
5189 ehci_writel ((U32)qh->qh_dma, &ehci->regs->async_next);
5190 cmd |= CMD_ASE | CMD_RUN;
5191 ehci_writel (cmd, &ehci->regs->command);
5192 ehci->hcd.state = USB_STATE_RUNNING;
5193 /* posted write need not be known to HC yet ... */
5194 } else {
5195 /* splice right after "start" of ring */
5196 qh->hw_info1 &= ~ CPUToLE32(QH_HEAD); /* [4.8] */
5197 qh->qh_next = q->qh_next;
5198 qh->hw_next = q->hw_next;
5199 wmb ();
5200 q->qh_next.qh = qh;
5201 q->hw_next = dma;
5202 }
5203 qh->qh_state = QH_STATE_LINKED;
5204 /* qtd completions reported later by interrupt */
5205 }
5206 #endif
5207 /*-------------------------------------------------------------------------*/
5208
5209 #define QH_ADDR_MASK LE32ToCPU(0x7f)
5210
5211
5212 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5213 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5214 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5215 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5216 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5217 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5218 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5219 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5220 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5221 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5222 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5223 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5224 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5225 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5226 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5227 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5228 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5229 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5230 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5231 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5232 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5233 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5234 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5235 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5236 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5237 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5238 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5239 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5240 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5241 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5242 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5243 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5244 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5245 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5246 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5247 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5248 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5249 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5250 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5251 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5252 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5253 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5254 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5255 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5256 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5257 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5258 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5259 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
qh_append_tds(struct ehci_hcd * ehci,struct urb * urb,struct list_head * qtd_list,int epnum,void ** ptr)5260 static struct ehci_qh *qh_append_tds (
5261 struct ehci_hcd *ehci,
5262 struct urb *urb,
5263 struct list_head *qtd_list,
5264 int epnum,
5265 void **ptr
5266 )
5267 {
5268 struct ehci_qh *qh = 0;
5269 //int maxp;
5270 qh = (struct ehci_qh *) *ptr;
5271 if (unlikely (qh == 0)) {
5272 /* can't sleep here, we have ehci->lock... */
5273 qh = qh_make (ehci, urb, SLAB_ATOMIC);
5274 *ptr = qh;
5275 }
5276
5277 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5278 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5279 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5280 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5281 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5282 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5283 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5284 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5285 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5286 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5287 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5288 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5289 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5290 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5291 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5292 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5293 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5294 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5295 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5296 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5297 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5298 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5299 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5300 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5301 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5302 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5303 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5304 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5305 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5306 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5307 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5308 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5309 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5310 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5311 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5312 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5313 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5314 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5315 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5316 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5317 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5318 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5319 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5320 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5321 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5322 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5323 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5324 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5325 //#ifdef CONFIG_FARADAY_FOTG200
5326 #if 1
5327 // The control endpoint's maximum packet size will be modified after fist "Get_Descriptor" request.
5328 // Therefore the maxp of qH should be updated here.
5329 if ( usb_pipecontrol(urb->pipe) )
5330 {
5331 //maxp = (usb_maxpacket (urb->dev, urb->pipe, !(usb_pipein (urb->pipe)))<<16);
5332 qh->hw_info1 = CPUToLE32((LE32ToCPU(qh->hw_info1)&(~(((1<<11)-1)<<16)))|(usb_maxpacket (urb->dev, urb->pipe, !(usb_pipein (urb->pipe)))<<16));
5333 }
5334 #endif
5335 if (likely (qh != 0)) {
5336 struct ehci_qtd *qtd;
5337
5338 if (unlikely (list_empty (qtd_list)))
5339 qtd = 0;
5340 else
5341 {
5342 qtd = list_entry (qtd_list->next, struct ehci_qtd, qtd_list);
5343 //list_entry (qtd_list->next, struct ehci_qtd, qtd_list, struct list_head, qtd);
5344 }
5345
5346 /* control qh may need patching after enumeration */
5347 if (unlikely (epnum == 0)) {
5348 /* set_address changes the address */
5349 if ((qh->hw_info1 & QH_ADDR_MASK) == 0)
5350 qh->hw_info1 |= CPUToLE32(
5351 usb_pipedevice (urb->pipe));
5352 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5353 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5354 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5355 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5356 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5357 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5358 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5359 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5360 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5361 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5362 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5363 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5364 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5365 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5366 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5367 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5368 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5369 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5370 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5371 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5372 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5373 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5374 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5375 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5376 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5377 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5378 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5379 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5380 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5381 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5382 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5383 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5384 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5385 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5386 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5387 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5388 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5389 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5390 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5391 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5392 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5393 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5394 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5395 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5396 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5397 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5398 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5399 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5400
5401 /* for full speed, ep0 maxpacket can grow */
5402 else if (!(qh->hw_info1
5403 & CPUToLE32 (0x3 << 12))) {
5404 U32 info, max;
5405
5406 info = LE32ToCPU(qh->hw_info1);
5407 max = urb->dev->descriptor.bMaxPacketSize0;
5408 if (max > (0x07ff & (info >> 16))) {
5409 info &= ~(0x07ff << 16);
5410 info |= max << 16;
5411 qh->hw_info1 = CPUToLE32(info);
5412 }
5413 }
5414
5415 /* usb_reset_device() briefly reverts to address 0 */
5416 if (usb_pipedevice (urb->pipe) == 0)
5417 qh->hw_info1 &= ~QH_ADDR_MASK;
5418 }
5419
5420 if (unlikely (!usb_gettoggle (urb->dev,
5421 (epnum & 0x0f), !(epnum & 0x10)))
5422 && !usb_pipecontrol (urb->pipe)) {
5423 /* "never happens": drivers do stall cleanup right */
5424 if (qh->qh_state != QH_STATE_IDLE
5425 && !list_empty (&qh->qtd_list)
5426 && qh->qh_state != QH_STATE_COMPLETING)
5427 ehci_warn (ehci, "clear toggle dev%d ep%d%s: not idle\n", usb_pipedevice (urb->pipe), epnum & 0x0f, usb_pipein (urb->pipe) ? "in" : "out");
5428 /* else we know this overlay write is safe */
5429 clear_toggle (urb->dev,
5430 epnum & 0x0f, !(epnum & 0x10), qh);
5431 }
5432 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5433 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5434 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5435 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5436 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5437 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5438 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5439 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5440 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5441 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5442 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5443 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5444 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5445 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5446 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5447 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5448 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5449 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5450 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5451 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5452 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5453 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5454 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5455 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5456 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5457 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5458 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5459 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5460 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5461 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5462 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5463 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5464 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5465 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5466 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5467 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5468 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5469 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5470 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5471 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5472 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5473 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5474 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5475 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5476 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5477 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5478 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5479 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5480
5481 if (likely (qtd != 0)) {
5482 struct ehci_qtd *dummy;
5483 dma_addr_t dma;
5484 U32 token;
5485
5486 token = qtd->hw_token;
5487 qtd->hw_token = HALT_BIT;
5488 wmb ();
5489 dummy = qh->dummy;
5490 //Copy qtd's data to dummy except dumm->qtd_dma
5491 dma = dummy->qtd_dma;
5492 *dummy = *qtd;
5493 dummy->qtd_dma = dma;
5494
5495 list_del (&qtd->qtd_list);
5496 list_add (&dummy->qtd_list, qtd_list);
5497 __list_splice (qtd_list, qh->qtd_list.prev);
5498 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5499 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5500 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5501 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5502 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5503 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5504 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5505 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5506 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5507 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5508 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5509 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5510 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5511 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5512 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5513 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5514 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5515 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5516 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5517 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5518 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5519 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5520 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5521 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5522 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5523 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5524 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5525 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5526 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5527 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5528 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5529 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5530 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5531 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5532 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5533 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5534 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5535 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5536 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5537 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5538 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5539 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5540 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5541 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5542 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5543 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5544 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5545 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5546
5547 ehci_qtd_init (qtd, qtd->qtd_dma);
5548 qh->dummy = qtd;
5549
5550 /* hc must see the new dummy at list end */
5551 dma = qtd->qtd_dma;
5552 qtd = list_entry (qh->qtd_list.prev, struct ehci_qtd, qtd_list);
5553 //list_entry (qh->qtd_list.prev, struct ehci_qtd, qtd_list,struct list_head, qtd);
5554 //the last qtd of qh before spliceing qtd_list
5555 qtd->hw_next = QTD_NEXT (dma);
5556
5557 /* let the hc process these next qtds */
5558 wmb ();
5559 dummy->hw_token = token;
5560
5561 urb->hcpriv = qh_get (qh);
5562 }
5563 }
5564 return qh;
5565 }
5566
5567 /*-------------------------------------------------------------------------*/
5568
5569 static int
submit_async(struct ehci_hcd * ehci,struct urb * urb,struct list_head * qtd_list,int mem_flags)5570 submit_async (
5571 struct ehci_hcd *ehci,
5572 struct urb *urb,
5573 struct list_head *qtd_list,
5574 int mem_flags
5575 ) {
5576 struct ehci_qtd *qtd;
5577 struct hcd_dev *dev;
5578 int epnum;
5579 U32 flags;
5580 struct ehci_qh *qh = 0;
5581 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5582 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5583 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5584 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5585 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5586 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5587 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5588 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5589 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5590 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5591 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5592 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5593 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5594 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5595 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5596 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5597 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5598 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5599 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5600 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5601 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5602 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5603 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5604 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5605 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5606 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5607 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5608 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5609 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5610 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5611 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5612 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5613 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5614 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5615 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5616 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5617 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5618 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5619 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5620 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5621 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5622 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5623 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5624 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5625 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5626 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5627 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5628 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5629
5630 qtd = list_entry (qtd_list->next, struct ehci_qtd, qtd_list);
5631 //list_entry (qtd_list->next, struct ehci_qtd, qtd_list, struct list_head, qtd);
5632 dev = (struct hcd_dev *)urb->dev->hcpriv;
5633 epnum = usb_pipeendpoint (urb->pipe);
5634 if (usb_pipein (urb->pipe) && !usb_pipecontrol (urb->pipe))
5635 epnum |= 0x10;
5636
5637 ehci_vdbg (ehci, "urb %p buf %p len %d ep%d%s qtd %p [qh %p]\n",
5638 urb, urb->transfer_buffer,urb->transfer_buffer_length,
5639 epnum & 0x0f, (epnum & 0x10) ? "in" : "out",
5640 qtd, dev ? dev->ep [epnum] : (void *)~0);
5641 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5642 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5643 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5644 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5645 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5646 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5647 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5648 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5649 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5650 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5651 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5652 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5653 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5654 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5655 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5656 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5657 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5658 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5659 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5660 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5661 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5662 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5663 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5664 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5665 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5666 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5667 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5668 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5669 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5670 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5671 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5672 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5673 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5674 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5675 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5676 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5677 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5678 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5679 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5680 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5681 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5682 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5683 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5684 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5685 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5686 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5687 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5688 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5689
5690 spin_lock_irqsave (&ehci->lock, flags);
5691 qh = qh_append_tds (ehci, urb, qtd_list, epnum, &dev->ep [epnum]);
5692 /* Control/bulk operations through TTs don't need scheduling,
5693 * the HC and TT handle it when the TT has a buffer ready.
5694 */
5695 //GPIO_Trigger(2);
5696 if (likely (qh != 0)) {
5697 if (likely (qh->qh_state == QH_STATE_IDLE))
5698 qh_link_async (ehci, qh_get (qh));
5699 }
5700
5701 //#ifdef ENABLE_PIPE_FLUSH
5702 Chip_Flush_Memory();
5703 //#endif
5704
5705 spin_unlock_irqrestore (&ehci->lock, flags);
5706 if (unlikely (qh == 0)) {
5707 qtd_list_free (ehci, urb, qtd_list);
5708 return -ENOMEM;
5709 }
5710 return 0;
5711 }
5712
5713 /*-------------------------------------------------------------------------*/
5714
5715
5716 static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh);
5717 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5718 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5719 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5720 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5721 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5722 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5723 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5724 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5725 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5726 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5727 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5728 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5729 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5730 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5731 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5732 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5733 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5734 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5735 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5736 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5737 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5738 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5739 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5740 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5741 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5742 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5743 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5744 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5745 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5746 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5747 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5748 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5749 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5750 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5751 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5752 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5753 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5754 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5755 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5756 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5757 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5758 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5759 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5760 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5761 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5762 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5763 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5764 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5765
end_unlink_async(struct ehci_hcd * ehci,struct pt_regs * regs)5766 static void end_unlink_async (struct ehci_hcd *ehci, struct pt_regs *regs)
5767 {
5768 struct ehci_qh *qh = ehci->reclaim;
5769 struct ehci_qh *next;
5770 if(qh == NULL)
5771 return;
5772 timer_action_done (ehci, TIMER_IAA_WATCHDOG);
5773
5774 // qh->hw_next = CPUToLE32 (qh->qh_dma);
5775 qh->qh_state = QH_STATE_IDLE;
5776 qh->qh_next.qh = 0;
5777 qh_put (ehci, qh); // refcount from reclaim
5778
5779 /* other unlink(s) may be pending (in QH_STATE_UNLINK_WAIT) */
5780 next = qh->reclaim;
5781 ehci->reclaim = next;
5782 ehci->reclaim_ready = 0;
5783 qh->reclaim = 0;
5784 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5785 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5786 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5787 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5788 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5789 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5790 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5791 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5792 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5793 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5794 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5795 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5796 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5797 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5798 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5799 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5800 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5801 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5802 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5803 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5804 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5805 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5806 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5807 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5808 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5809 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5810 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5811 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5812 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5813 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5814 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5815 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5816 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5817 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5818 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5819 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5820 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5821 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5822 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5823 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5824 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5825 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5826 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5827 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5828 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5829 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5830 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5831 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5832
5833 qh_completions (ehci, qh, regs);
5834
5835 if (!list_empty (&qh->qtd_list)
5836 && HCD_IS_RUNNING (ehci->hcd.state))
5837 qh_link_async (ehci, qh);
5838 else {
5839 qh_put (ehci, qh); // refcount from async list
5840
5841 if (HCD_IS_RUNNING (ehci->hcd.state)
5842 && ehci->async->qh_next.qh == 0)
5843 timer_action (ehci, TIMER_ASYNC_OFF);
5844 }
5845
5846 if (next) {
5847 ehci->reclaim = 0;
5848 start_unlink_async (ehci, next);
5849 }
5850 }
5851
5852 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5853 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5854 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5855 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5856 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5857 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5858 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5859 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5860 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5861 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5862 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5863 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5864 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5865 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5866 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5867 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5868 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5869 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5870 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5871 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5872 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5873 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5874 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5875 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5876 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5877 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5878 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5879 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5880 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5881 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5882 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5883 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5884 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5885 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5886 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5887 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5888 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5889 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5890 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5891 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5892 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5893 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5894 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5895 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5896 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5897 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5898 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5899 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5900
start_unlink_async(struct ehci_hcd * ehci,struct ehci_qh * qh)5901 static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
5902 {
5903 int cmd = ehci_readl ((U32)&ehci->regs->command);
5904 struct ehci_qh *prev;
5905
5906 #ifdef DEBUG
5907 if (ehci->reclaim
5908 || (qh->qh_state != QH_STATE_LINKED
5909 && qh->qh_state != QH_STATE_UNLINK_WAIT)
5910 #ifdef CONFIG_SMP
5911 // this macro lies except on SMP compiles
5912 || !spin_is_locked (&ehci->lock)
5913 #endif
5914 )
5915 BUG ();
5916 #endif
5917 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5918 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5919 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5920 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5921 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5922 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5923 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5924 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5925 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5926 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5927 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5928 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5929 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5930 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5931 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5932 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5933 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5934 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5935 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5936 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5937 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5938 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5939 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5940 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5941 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5942 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5943 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5944 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5945 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5946 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5947 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5948 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5949 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5950 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5951 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5952 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5953 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5954 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5955 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5956 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5957 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5958 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5959 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5960 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5961 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5962 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5963 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5964 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5965
5966 /* stop async schedule right now? */
5967 if (unlikely (qh == ehci->async)) {
5968 /* can't get here without STS_ASS set */
5969 if (ehci->hcd.state != USB_STATE_HALT) {
5970 ehci_writel (cmd & ~CMD_ASE, (U32)&ehci->regs->command);
5971 wmb ();
5972 // handshake later, if we need to
5973 }
5974 timer_action_done (ehci, TIMER_ASYNC_OFF);
5975 return;
5976 }
5977
5978 qh->qh_state = QH_STATE_UNLINK;
5979 ehci->reclaim = qh = qh_get (qh);
5980
5981 prev = ehci->async;
5982 while (prev->qh_next.qh != qh)
5983 prev = prev->qh_next.qh;
5984
5985 prev->hw_next = qh->hw_next;
5986 prev->qh_next = qh->qh_next;
5987 wmb ();
5988 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5989 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5990 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5991 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5992 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5993 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5994 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5995 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5996 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5997 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5998 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5999 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6000 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6001 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6002 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6003 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6004 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6005 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6006 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6007 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6008 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6009 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6010 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6011 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6012 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6013 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6014 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6015 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6016 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6017 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6018 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6019 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6020 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6021 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6022 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6023 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6024 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6025 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6026 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6027 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6028 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6029 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6030 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6031 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6032 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6033 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6034 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6035 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6036
6037 if (unlikely (ehci->hcd.state == USB_STATE_HALT)) {
6038 /* if (unlikely (qh->reclaim != 0))
6039 * this will recurse, probably not much
6040 */
6041 end_unlink_async (ehci, NULL);
6042 return;
6043 }
6044 //inform HC thar something has been removed from asyn. schedule
6045 ehci->reclaim_ready = 0;
6046 #if 1 // For bug 125MHz copy error (HALT)
6047 if (!ehci->uDontSendIAA)
6048 {
6049 cmd |= CMD_IAAD;
6050 ehci_writel (cmd, (U32)&ehci->regs->command);
6051 //(void) ehci_readl (&ehci->regs->command);
6052 }
6053 #endif
6054 timer_action (ehci, TIMER_IAA_WATCHDOG);
6055 }
6056
6057 /*-------------------------------------------------------------------------*/
6058 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6059 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6060 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6061 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6062 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6063 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6064 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6065 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6066 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6067 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6068 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6069 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6070 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6071 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6072 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6073 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6074 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6075 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6076 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6077 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6078 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6079 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6080 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6081 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6082 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6083 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6084 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6085 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6086 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6087 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6088 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6089 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6090 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6091 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6092 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6093 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6094 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6095 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6096 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6097 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6098 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6099 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6100 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6101 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6102 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6103 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6104 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6105 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6106
6107 static void
scan_async(struct ehci_hcd * ehci,struct pt_regs * regs)6108 scan_async (struct ehci_hcd *ehci, struct pt_regs *regs)
6109 {
6110 struct ehci_qh *qh;
6111 enum ehci_timer_action action = TIMER_IO_WATCHDOG;
6112 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6113 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6114 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6115 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6116 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6117 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6118 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6119 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6120 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6121 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6122 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6123 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6124 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6125 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6126 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6127 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6128 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6129 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6130 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6131 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6132 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6133 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6134 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6135 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6136 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6137 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6138 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6139 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6140 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6141 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6142 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6143 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6144 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6145 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6146 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6147 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6148 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6149 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6150 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6151 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6152 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6153 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6154 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6155 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6156 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6157 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6158 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6159 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6160
6161 if (!++(ehci->stamp))
6162 ehci->stamp++;
6163 timer_action_done (ehci, TIMER_ASYNC_SHRINK);
6164 rescan:
6165 qh = ehci->async->qh_next.qh;
6166 if (likely (qh != 0)) {
6167 do {
6168 /* clean any finished work for this qh */
6169 if (!list_empty (&qh->qtd_list)
6170 && qh->stamp != ehci->stamp) {
6171 int temp;
6172 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6173 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6174 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6175 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6176 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6177 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6178 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6179 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6180 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6181 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6182 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6183 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6184 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6185 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6186 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6187 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6188 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6189 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6190 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6191 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6192 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6193 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6194 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6195 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6196 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6197 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6198 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6199 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6200 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6201 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6202 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6203 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6204 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6205 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6206 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6207 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6208 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6209 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6210 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6211 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6212 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6213 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6214 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6215 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6216 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6217 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6218 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6219 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6220
6221 qh = qh_get (qh);
6222 qh->stamp = ehci->stamp;
6223 temp = qh_completions (ehci, qh, regs);
6224 qh_put (ehci, qh);
6225 if (temp != 0) {
6226 goto rescan;
6227 }
6228
6229 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6230 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6231 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6232 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6233 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6234 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6235 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6236 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6237 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6238 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6239 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6240 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6241 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6242 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6243 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6244 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6245 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6246 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6247 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6248 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6249 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6250 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6251 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6252 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6253 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6254 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6255 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6256 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6257 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6258 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6259 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6260 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6261 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6262 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6263 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6264 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6265 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6266 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6267 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6268 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6269 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6270 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6271 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6272 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6273 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6274 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6275 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6276 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6277 }
6278
6279 //FIXME: #if 1 is correct procedure but it will cause some when do plug testing
6280 //Watchdog timer will be unlink for unknow reson ==> Therefore, qHD can not be
6281 //unlinked from async list. (qh->state == USB_STATE_LINKED but USB_STATE_HALT)
6282 //So when disconnect attached device ep1in (Bulk in) cannot be releaseed.
6283 #if 0
6284 if (list_empty (&qh->qtd_list)) {
6285 if (qh->stamp == ehci->stamp)
6286 action = TIMER_ASYNC_SHRINK;
6287 else if (!ehci->reclaim
6288 && qh->qh_state == QH_STATE_LINKED)
6289 start_unlink_async (ehci, qh);
6290 }
6291
6292 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6293 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6294 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6295 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6296 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6297 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6298 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6299 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6300 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6301 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6302 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6303 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6304 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6305 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6306 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6307 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6308 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6309 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6310 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6311 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6312 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6313 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6314 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6315 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6316 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6317 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6318 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6319 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6320 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6321 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6322 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6323 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6324 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6325 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6326 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6327 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6328 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6329 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6330 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6331 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6332 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6333 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6334 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6335 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6336 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6337 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6338 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6339 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6340 #else
6341 if (list_empty (&qh->qtd_list)) {
6342 if (!ehci->reclaim && qh->qh_state == QH_STATE_LINKED)
6343 start_unlink_async (ehci, qh);
6344 }
6345 #endif
6346 qh = qh->qh_next.qh;
6347 } while (qh);
6348 }
6349 if (action == TIMER_ASYNC_SHRINK)
6350 timer_action (ehci, TIMER_ASYNC_SHRINK);
6351 }
6352 #endif
6353
6354
6355
6356 #include "drvEHCI_SCHD.cxx"
6357
6358 /*-------------------------------------------------------------------------*/
6359
6360 static void ehci_work(struct ehci_hcd *ehci, struct pt_regs *regs);
6361
ehci_watchdog(U32 param)6362 static void ehci_watchdog (U32 param)
6363 {
6364 struct ehci_hcd *ehci = (struct ehci_hcd *) param;
6365 U32 flags;
6366
6367 //GPIO_Trigger(2);
6368 //printk("w=0x%08X\n",(U32)ehci->actions);
6369 //printk("w%x\n",(U32)ehci->actions);
6370
6371 //diag_printf("ehci_watchdog occurs\n"); //__Test
6372 kdbg("action: 0x%08X %s",(U32)ehci->actions,"\n");
6373 spin_lock_irqsave (&ehci->lock, flags);
6374 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6375 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6376 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6377 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6378 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6379 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6380 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6381 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6382 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6383 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6384 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6385 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6386 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6387 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6388 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6389 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6390 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6391 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6392 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6393 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6394 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6395 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6396 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6397 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6398 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6399 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6400 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6401 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6402 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6403 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6404 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6405 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6406 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6407 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6408 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6409 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6410 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6411 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6412 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6413 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6414 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6415 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6416 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6417 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6418 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6419 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6420 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6421 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6422
6423 /* lost IAA irqs wedge things badly; seen with a vt8235 */
6424 if (ehci->reclaim) {
6425 U32 status = ehci_readl ((U32)&ehci->regs->status);
6426
6427 if (status & STS_IAA) {
6428 ehci_vdbg (ehci, "lost IAA%s%s","\n","");
6429 COUNT (ehci->stats.lost_iaa);
6430 ehci_writel (STS_IAA, (U32)&ehci->regs->status);
6431 ehci->reclaim_ready = 1;
6432 }
6433
6434 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6435 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6436 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6437 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6438 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6439 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6440 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6441 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6442 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6443 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6444 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6445 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6446 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6447 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6448 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6449 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6450 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6451 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6452 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6453 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6454 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6455 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6456 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6457 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6458 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6459 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6460 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6461 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6462 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6463 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6464 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6465 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6466 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6467 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6468 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6469 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6470 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6471 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6472 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6473 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6474 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6475 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6476 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6477 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6478 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6479 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6480 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6481 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6482 else if ( (ehci_readl((U32)&ehci->regs->command)&CMD_IAAD) && !(status & STS_IAA))
6483 {
6484 //printk ("Somethibg wrong ==>lost IAA\n");//HW ISSUE?
6485 ehci->reclaim_ready = 1;
6486 }
6487 }
6488
6489 /* stop async processing after it's idled a bit */
6490 #if 1 //Periodic schedule issue was fixed, so reopen it
6491 if (test_bit (TIMER_ASYNC_OFF, &ehci->actions))
6492 start_unlink_async (ehci, ehci->async);
6493 #endif
6494 /* ehci could run by timer, without IRQs ... */
6495 ehci_work (ehci, NULL);
6496
6497 spin_unlock_irqrestore (&ehci->lock, flags);
6498 /*
6499 if ( gTrigger == TRUE )
6500 {
6501 if ( *((U32 *)(0x00851BC0))!= 0x0 )
6502 {
6503 printk("ISR completed but hcpriv != NULL\n");
6504 //while(1);
6505 }
6506 }
6507 */
6508 //printk("we\n");
6509 //GPIO_Trigger(2);
6510 }
6511
6512 #ifdef EHCI_PCI
6513
bios_handoff(struct ehci_hcd * ehci,int where,U32 cap)6514 static int bios_handoff (struct ehci_hcd *ehci, int where, U32 cap)
6515 {
6516 if (cap & (1 << 16)) {
6517 int msec = 500;
6518
6519 // request handoff to OS
6520
6521 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6522 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6523 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6524 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6525 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6526 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6527 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6528 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6529 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6530 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6531 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6532 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6533 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6534 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6535 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6536 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6537 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6538 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6539 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6540 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6541 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6542 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6543 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6544 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6545 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6546 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6547 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6548 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6549 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6550 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6551 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6552 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6553 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6554 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6555 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6556 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6557 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6558 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6559 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6560 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6561 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6562 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6563 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6564 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6565 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6566 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6567 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6568 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6569 cap &= 1 << 24;
6570 // pci_write_config_dword (ehci->hcd.pdev, where, cap);
6571
6572 // and wait a while for it to happen
6573 do {
6574 wait_ms (10);
6575 msec -= 10;
6576 pci_read_config_dword (ehci->hcd.pdev, where, &cap);
6577 } while ((cap & (1 << 16)) && msec);
6578
6579 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6580 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6581 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6582 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6583 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6584 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6585 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6586 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6587 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6588 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6589 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6590 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6591 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6592 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6593 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6594 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6595 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6596 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6597 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6598 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6599 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6600 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6601 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6602 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6603 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6604 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6605 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6606 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6607 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6608 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6609 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6610 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6611 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6612 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6613 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6614 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6615 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6616 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6617 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6618 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6619 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6620 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6621 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6622 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6623 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6624 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6625 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6626 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6627 if (cap & (1 << 16)) {
6628 ehci_err (ehci, "BIOS handoff failed (%d, %04x)%s%s",0,
6629 where, cap,"\n","");
6630 return 1;
6631 }
6632 ehci_dbg (ehci, "BIOS handoff succeeded%s","");
6633 }
6634 return 0;
6635 }
6636
ehci_reboot(struct notifier_block * self,U32 code,void * null)6637 static int ehci_reboot (struct notifier_block *self, U32 code, void *null)
6638 {
6639 struct ehci_hcd *ehci;
6640
6641 ehci = container_of (self, struct ehci_hcd, reboot_notifier);
6642 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6643 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6644 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6645 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6646 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6647 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6648 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6649 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6650 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6651 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6652 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6653 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6654 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6655 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6656 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6657 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6658 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6659 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6660 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6661 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6662 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6663 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6664 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6665 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6666 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6667 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6668 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6669 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6670 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6671 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6672 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6673 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6674 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6675 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6676 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6677 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6678 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6679 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6680 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6681 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6682 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6683 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6684 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6685 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6686 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6687 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6688 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6689 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6690
6691 // make BIOS/etc use companion controller during reboot
6692 // ehci_writel (0, &ehci->regs->configured_flag);//maryed by yuwen
6693 return 0;
6694 }
6695
6696 #endif /* EHCI_PCI */
6697
6698 /* called by khubd or root hub init threads */
6699
ehci_hc_reset(struct usb_hcd * hcd)6700 int ehci_hc_reset (struct usb_hcd *hcd)
6701 {
6702 struct ehci_hcd *ehci = hcd_to_ehci (hcd);
6703 U32 temp;
6704
6705 spin_lock_init (&ehci->lock);
6706
6707 ehci->caps = (struct ehci_caps *) hcd->regs;
6708 ehci->regs = (struct ehci_regs *) ( (U32)hcd->regs +
6709 (U32)ehci_readb ((U32)&ehci->caps->length));
6710 dbg_hcs_params (ehci, "reset");
6711 dbg_hcc_params (ehci, "reset");
6712 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6713 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6714 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6715 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6716 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6717 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6718 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6719 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6720 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6721 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6722 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6723 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6724 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6725 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6726 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6727 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6728 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6729 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6730 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6731 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6732 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6733 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6734 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6735 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6736 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6737 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6738 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6739 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6740 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6741 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6742 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6743 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6744 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6745 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6746 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6747 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6748 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6749 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6750 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6751 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6752 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6753 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6754 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6755 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6756 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6757 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6758 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6759 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6760
6761 /* EHCI 0.96 and later may have "extended capabilities" */
6762 temp = HCC_EXT_CAPS (ehci_readl ((U32)&ehci->caps->hcc_params));
6763 while (temp) {
6764 U32 cap = 0;
6765 #ifdef EHCI_PCI
6766 pci_read_config_dword (ehci->hcd.pdev, temp, &cap);
6767 #endif
6768 ehci_dbg (ehci, "capability %04x at %02x\n", cap, temp);
6769 switch (cap & 0xff) {
6770 case 1: /* BIOS/SMM/... handoff */
6771 /*
6772 if (bios_handoff (ehci, temp, cap) != 0)
6773 return -EOPNOTSUPP;
6774 */
6775 break;
6776 case 0: /* illegal reserved capability */
6777 ehci_warn (ehci, "illegal capability!%s","\n");
6778 cap = 0;
6779
6780 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6781 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6782 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6783 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6784 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6785 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6786 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6787 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6788 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6789 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6790 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6791 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6792 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6793 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6794 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6795 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6796 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6797 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6798 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6799 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6800 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6801 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6802 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6803 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6804 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6805 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6806 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6807 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6808 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6809 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6810 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6811 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6812 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6813 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6814 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6815 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6816 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6817 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6818 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6819 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6820 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6821 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6822 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6823 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6824 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6825 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6826 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6827 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6828 /* FALLTHROUGH */
6829 default: /* unknown */
6830 break;
6831 }
6832 temp = (cap >> 8) & 0xff;
6833 }
6834
6835 /* cache this readonly data; minimize PCI reads */
6836 ehci->hcs_params = ehci_readl ((U32)&ehci->caps->hcs_params);
6837
6838 /* force HC to halt state */
6839 return ehci_halt (ehci);
6840 }
6841
6842 extern void usb_hcd_poll_rh_status(struct usb_hcd *hcd);
6843 extern MS_U8 MDrv_USBGetChipID(void);
ehci_start(struct usb_hcd * hcd)6844 int ehci_start (struct usb_hcd *hcd)
6845 {
6846 struct ehci_hcd *ehci = hcd_to_ehci (hcd);
6847 U32 temp;
6848 struct usb_device *udev;
6849 struct usb_bus *bus;
6850 int retval;
6851 U32 hcc_params;
6852 unsigned char tempbyte;
6853 U8 chipID = MDrv_USBGetChipID();
6854
6855 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6856 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6857 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6858 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6859 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6860 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6861 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6862 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6863 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6864 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6865 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6866 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6867 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6868 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6869 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6870 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6871 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6872 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6873 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6874 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6875 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6876 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6877 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6878 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6879 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6880 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6881 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6882 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6883 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6884 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6885 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6886 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6887 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6888 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6889 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6890 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6891 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6892 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6893 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6894 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6895 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6896 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6897 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6898 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6899 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6900 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6901 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6902 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6903 ehci->periodic_size = DEFAULT_I_TDPS;
6904 if ((retval = ehci_mem_init (ehci, SLAB_KERNEL)) < 0)
6905 return retval;
6906
6907 /* controllers may cache some of the periodic schedule ... */
6908 hcc_params = ehci_readl ((U32)&ehci->caps->hcc_params);
6909 if (HCC_ISOC_CACHE (hcc_params)) // full frame cache
6910 ehci->i_thresh = 8;
6911 else // N microframes cached
6912 ehci->i_thresh = 2 + HCC_ISOC_THRES (hcc_params);
6913
6914 ehci->reclaim = 0;
6915 ehci->next_uframe = -1;
6916
6917 /* controller state: unknown --> reset */
6918 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6919 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6920 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6921 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6922 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6923 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6924 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6925 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6926 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6927 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6928 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6929 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6930 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6931 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6932 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6933 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6934 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6935 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6936 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6937 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6938 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6939 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6940 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6941 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6942 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6943 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6944 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6945 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6946 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6947 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6948 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6949 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6950 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6951 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6952 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6953 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6954 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6955 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6956 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6957 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6958 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6959 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6960 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6961 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6962 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6963 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6964 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6965 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6966
6967 #ifdef ROOTHUB_INTERRUPT_MODE
6968 hcd->uses_new_polling = 1;
6969 hcd->poll_rh = 0;
6970 #endif
6971
6972 /* EHCI spec section 4.1 */
6973 if ((retval = ehci_reset (ehci)) != 0) {
6974 ehci_mem_cleanup (ehci);
6975 return retval;
6976 }
6977
6978 ehci_writel (INTR_MASK, (U32)&ehci->regs->intr_enable);
6979 temp=ehci_readl((U32)&ehci->regs->bus_control);
6980 // temp|=INT_POLAR+HALF_SPEED;
6981 temp|=INT_POLAR;
6982 temp&=~VBUS_OFF;
6983 ehci_writel(temp,(U32)&ehci->regs->bus_control); //set intr high active
6984 ehci_writel (ehci->periodic_dma, (U32)&ehci->regs->frame_list);
6985
6986 ehci->async->qh_next.qh = 0;
6987
6988 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6989 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6990 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6991 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6992 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6993 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6994 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6995 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6996 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6997 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6998 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6999 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7000 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7001 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7002 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7003 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7004 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7005 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7006 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7007 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7008 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7009 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7010 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7011 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7012 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7013 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7014 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7015 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7016 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7017 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7018 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7019 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7020 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7021 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7022 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7023 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7024 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7025 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7026 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7027 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7028 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7029 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7030 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7031 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7032 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7033 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7034 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7035 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7036 ehci->async->hw_next = QH_NEXT (ehci->async->qh_dma);
7037 ehci->async->hw_info1 = CPUToLE32(QH_HEAD);
7038 ehci->async->hw_token = CPUToLE32(QTD_STS_HALT);
7039
7040 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7041 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7042 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7043 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7044 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7045 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7046 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7047 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7048 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7049 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7050 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7051 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7052 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7053 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7054 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7055 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7056 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7057 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7058 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7059 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7060 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7061 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7062 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7063 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7064 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7065 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7066 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7067 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7068 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7069 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7070 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7071 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7072 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7073 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7074 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7075 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7076 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7077 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7078 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7079 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7080 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7081 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7082 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7083 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7084 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7085 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7086 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7087 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7088 ehci->async->hw_qtd_next = EHCI_LIST_END;
7089 ehci->async->qh_state = QH_STATE_LINKED;
7090 ehci->async->hw_alt_next = QTD_NEXT (ehci->async->dummy->qtd_dma);
7091 diag_printf("qh: %p\n", (U32)ehci->async->qh_dma);
7092 ehci_writel ((U32)ehci->async->qh_dma, (U32)&ehci->regs->async_next);
7093
7094 #ifndef CONFIG_FARADAY_FOTG200
7095 if (HCC_64BIT_ADDR (hcc_params)) {
7096 ehci_writel (0, (U32)&ehci->regs->segment);
7097
7098 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7099 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7100 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7101 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7102 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7103 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7104 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7105 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7106 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7107 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7108 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7109 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7110 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7111 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7112 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7113 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7114 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7115 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7116 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7117 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7118 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7119 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7120 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7121 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7122 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7123 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7124 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7125 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7126 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7127 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7128 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7129 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7130 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7131 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7132 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7133 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7134 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7135 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7136 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7137 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7138 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7139 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7140 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7141 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7142 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7143 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7144 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7145 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7146 #if 0
7147 // this is deeply broken on almost all architectures
7148 if (!pci_set_dma_mask (ehci->hcd.pdev, 0xffffffffffffffffULL))
7149 ehci_info (ehci, "enabled 64bit PCI DMA\n");
7150 #endif
7151 }
7152 #endif
7153 /* help hc dma work well with cachelines */
7154 #ifdef EHCI_PCI
7155 pci_set_mwi (ehci->hcd.pdev);
7156 #endif
7157
7158 /* clear interrupt enables, set irq latency */
7159 temp = ehci_readl ((U32)&ehci->regs->command) & 0x0fff;
7160 if (log2_irq_thresh < 0 || log2_irq_thresh > 6)
7161 log2_irq_thresh = 0;
7162 temp |= 1 << (16 + log2_irq_thresh);
7163
7164 // if hc can park (ehci >= 0.96), default is 3 packets per async QH
7165 if (chipID == CHIPID_KAISERIN)
7166 {
7167 U16 chipVER = usb_readw((void *)(KAISERIN_CHIP_TOP_BASE+0xCE*2));
7168 if (chipVER == 0x101)
7169 {
7170 if (HCC_CANPARK(hcc_params)) {
7171 U32 park_eco = 3;
7172 if (park_eco) {
7173 temp |= CMD_PARK;
7174 temp |= park_eco << 8;
7175 }
7176 }
7177 }
7178 }
7179
7180 if (HCC_PGM_FRAMELISTLEN (hcc_params)) {
7181 /* periodic schedule size can be smaller than default */
7182 temp &= ~(3 << 2);
7183 temp |= (EHCI_TUNE_FLS << 2);
7184
7185 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7186 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7187 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7188 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7189 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7190 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7191 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7192 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7193 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7194 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7195 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7196 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7197 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7198 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7199 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7200 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7201 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7202 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7203 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7204 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7205 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7206 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7207 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7208 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7209 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7210 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7211 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7212 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7213 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7214 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7215 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7216 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7217 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7218 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7219 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7220 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7221 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7222 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7223 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7224 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7225 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7226 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7227 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7228 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7229 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7230 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7231 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7232 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7233 switch (EHCI_TUNE_FLS) {
7234 case 0: ehci->periodic_size = 1024; break;
7235 case 1: ehci->periodic_size = 512; break;
7236 case 2: ehci->periodic_size = 256; break;
7237 default: BUG ();
7238 }
7239 }
7240 temp &= ~(CMD_IAAD | CMD_ASE | CMD_PSE),
7241 // Philips, Intel, and maybe others need CMD_RUN before the
7242 // root hub will detect new devices (why?); NEC doesn't
7243 #ifdef CONFIG_FARADAY_FOTG200
7244 // Only make HC run when device connects to bus
7245 #else
7246 temp |= CMD_RUN;//mark by yuwen
7247 #endif
7248 ehci_writel (temp, (U32)&ehci->regs->command);
7249 dbg_cmd (ehci, "init", temp);
7250 //diag_printf("==> Set RUN bit !!\n");
7251
7252 /* set async sleep time = 10 us ... ? */
7253
7254 init_timer (&ehci->watchdog);
7255 ehci->watchdog.function = ehci_watchdog;
7256 ehci->watchdog.data = (U32) ehci;
7257
7258 /* wire up the root hub */
7259 bus = hcd_to_bus (hcd);
7260 bus->root_hub = udev = usb_alloc_dev (NULL, bus);
7261 if (!udev) {
7262 done2:
7263 ehci_mem_cleanup (ehci);
7264
7265 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7266 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7267 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7268 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7269 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7270 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7271 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7272 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7273 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7274 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7275 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7276 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7277 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7278 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7279 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7280 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7281 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7282 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7283 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7284 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7285 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7286 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7287 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7288 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7289 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7290 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7291 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7292 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7293 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7294 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7295 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7296 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7297 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7298 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7299 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7300 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7301 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7302 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7303 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7304 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7305 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7306 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7307 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7308 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7309 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7310 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7311 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7312 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7313 return -ENOMEM;
7314 }
7315
7316 ehci->hcd.state = USB_STATE_RUNNING;
7317 #ifndef CONFIG_FARADAY_FOTG200
7318 // ehci_writel (FLAG_CF, &ehci->regs->configured_flag);//marked by yuwen
7319 #endif
7320 temp = ehci_readl ((U32)&ehci->regs->command); /* unblock posted write */
7321
7322 /* PCI Serial Bus Release Number is at 0x60 offset */
7323 #ifdef EHCI_PCI
7324 pci_read_config_byte (hcd->pdev, 0x60, &tempbyte);
7325
7326 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7327 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7328 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7329 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7330 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7331 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7332 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7333 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7334 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7335 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7336 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7337 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7338 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7339 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7340 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7341 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7342 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7343 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7344 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7345 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7346 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7347 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7348 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7349 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7350 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7351 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7352 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7353 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7354 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7355 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7356 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7357 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7358 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7359 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7360 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7361 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7362 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7363 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7364 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7365 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7366 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7367 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7368 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7369 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7370 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7371 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7372 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7373 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7374 #else
7375 tempbyte = 0;
7376 #endif
7377 temp = ehci_readw ((U32)&ehci->caps->hci_version);
7378 ehci_info (ehci,
7379 "USB %x.%x enabled, EHCI %x.%02x, driver %s\n",
7380 ((tempbyte & 0xf0)>>4), (tempbyte & 0x0f),
7381 temp >> 8, temp & 0xff, DRIVER_VERSION);
7382
7383
7384 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7385 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7386 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7387 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7388 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7389 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7390 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7391 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7392 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7393 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7394 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7395 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7396 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7397 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7398 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7399 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7400 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7401 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7402 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7403 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7404 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7405 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7406 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7407 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7408 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7409 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7410 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7411 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7412 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7413 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7414 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7415 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7416 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7417 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7418 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7419 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7420 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7421 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7422 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7423 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7424 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7425 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7426 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7427 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7428 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7429 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7430 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7431 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7432 udev->speed = USB_SPEED_HIGH;
7433 if (hcd_register_root (hcd) != 0) {
7434 if (hcd->state == USB_STATE_RUNNING)
7435 ehci_ready (ehci);
7436 ehci_reset (ehci);
7437 bus->root_hub = 0;
7438 usb_put_dev (udev);
7439 retval = -ENODEV;
7440 goto done2;
7441 }
7442
7443 #ifdef ROOTHUB_INTERRUPT_MODE
7444 if (hcd->uses_new_polling && hcd->poll_rh)
7445 {
7446 diag_printf("<ehci_start> usb_hcd_poll_rh_status\n");
7447 usb_hcd_poll_rh_status(hcd);
7448 }
7449 #endif
7450 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7451 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7452 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7453 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7454 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7455 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7456 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7457 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7458 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7459 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7460 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7461 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7462 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7463 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7464 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7465 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7466 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7467 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7468 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7469 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7470 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7471 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7472 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7473 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7474 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7475 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7476 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7477 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7478 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7479 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7480 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7481 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7482 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7483 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7484 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7485 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7486 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7487 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7488 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7489 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7490 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7491 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7492 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7493 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7494 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7495 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7496 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7497 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7498
7499 return 0;
7500 }
7501
7502 /* always called by thread; normally rmmod */
7503
ehci_stop(struct usb_hcd * hcd)7504 void ehci_stop (struct usb_hcd *hcd)
7505 {
7506 struct ehci_hcd *ehci = hcd_to_ehci (hcd);
7507
7508 ehci_dbg (ehci, "stop%s","");
7509
7510 /* no more interrupts ... */
7511 if (hcd->state == USB_STATE_RUNNING)
7512 ehci_ready (ehci);
7513 /*
7514 if (in_interrupt ()) { // must not happen!!
7515 ehci_err (ehci, "stopped in_interrupt!\n");
7516 return;
7517 }
7518 */
7519 del_timer_sync (&ehci->watchdog);
7520 ehci_reset (ehci);
7521
7522 /* let companion controllers work when we aren't */
7523 #ifndef CONFIG_FARADAY_FOTG200
7524 // ehci_writel (0, &ehci->regs->configured_flag); //marked by Yuwen
7525 #endif
7526 //unregister_reboot_notifier (&ehci->reboot_notifier);
7527
7528 //remove_debug_files (ehci);
7529 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7530 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7531 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7532 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7533 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7534 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7535 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7536 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7537 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7538 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7539 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7540 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7541 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7542 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7543 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7544 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7545 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7546 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7547 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7548 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7549 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7550 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7551 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7552 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7553 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7554 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7555 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7556 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7557 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7558 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7559 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7560 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7561 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7562 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7563 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7564 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7565 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7566 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7567 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7568 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7569 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7570 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7571 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7572 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7573 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7574 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7575 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7576 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7577
7578 /* root hub is shut down separately (first, when possible) */
7579 spin_lock_irq (&ehci->lock);
7580 ehci_work (ehci, NULL);
7581 spin_unlock_irq (&ehci->lock);
7582 ehci_mem_cleanup (ehci);
7583
7584 #ifdef EHCI_STATS
7585 ehci_dbg (ehci, "irq normal %ld err %ld reclaim %ld (lost %ld)\n",
7586 ehci->stats.normal, ehci->stats.error, ehci->stats.reclaim,
7587 ehci->stats.lost_iaa);
7588 ehci_dbg (ehci, "complete %ld unlink %ld\n",
7589 ehci->stats.complete, ehci->stats.unlink);
7590 #endif
7591
7592 dbg_status (ehci, "ehci_stop completed", ehci_readl ((U32)&ehci->regs->status));
7593 }
7594
ehci_get_frame(struct usb_hcd * hcd)7595 int ehci_get_frame (struct usb_hcd *hcd)
7596 {
7597 struct ehci_hcd *ehci = hcd_to_ehci (hcd);
7598
7599 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7600 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7601 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7602 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7603 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7604 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7605 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7606 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7607 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7608 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7609 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7610 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7611 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7612 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7613 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7614 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7615 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7616 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7617 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7618 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7619 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7620 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7621 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7622 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7623 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7624 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7625 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7626 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7627 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7628 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7629 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7630 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7631 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7632 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7633 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7634 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7635 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7636 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7637 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7638 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7639 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7640 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7641 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7642 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7643 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7644 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7645 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7646 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7647 return (ehci_readl ((U32)&ehci->regs->frame_index) >> 3) % ehci->periodic_size;
7648 }
7649
7650 /*-------------------------------------------------------------------------*/
7651
ehci_suspend(struct usb_hcd * hcd,U32 state)7652 int ehci_suspend (struct usb_hcd *hcd, U32 state)
7653 {
7654 struct ehci_hcd *ehci = hcd_to_ehci (hcd);
7655 int ports;
7656 int i;
7657
7658 ehci_dbg (ehci, "suspend to %d\n", state);
7659
7660 ports = HCS_N_PORTS (ehci->hcs_params);
7661
7662 if (hcd->state == USB_STATE_RUNNING)
7663 ehci_ready (ehci);
7664
7665 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7666 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7667 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7668 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7669 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7670 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7671 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7672 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7673 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7674 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7675 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7676 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7677 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7678 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7679 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7680 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7681 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7682 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7683 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7684 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7685 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7686 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7687 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7688 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7689 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7690 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7691 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7692 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7693 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7694 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7695 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7696 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7697 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7698 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7699 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7700 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7701 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7702 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7703 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7704 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7705 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7706 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7707 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7708 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7709 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7710 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7711 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7712 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7713 diag_printf("ehci_suspend\n");
7714 ehci_writel(ehci_readl ((U32)&ehci->regs->command) & ~CMD_RUN, (U32)&ehci->regs->command);
7715 while((ehci_readl((U32)&ehci->regs->status)&STS_HALT) == 0);
7716
7717 /* suspend each port, then stop the hc */
7718 for (i = 0; i < ports; i++) {
7719 int temp = ehci_readl ((U32)&ehci->regs->port_status [i]);
7720 #ifndef CONFIG_FARADAY_FOTG200
7721 if ((temp & PORT_PE) == 0
7722 || (temp & PORT_OWNER) != 0)
7723 continue;
7724 #else
7725 if (((temp & PORT_PE) == 0))
7726 continue;
7727 #endif
7728 ehci_dbg (ehci, "suspend port %d", i);
7729 temp |= PORT_SUSPEND;
7730 ehci_writel (temp, (U32)&ehci->regs->port_status [i]);
7731 }
7732 return 0;
7733 }
7734
ehci_resume(struct usb_hcd * hcd)7735 int ehci_resume (struct usb_hcd *hcd)
7736 {
7737 struct ehci_hcd *ehci = hcd_to_ehci (hcd);
7738 int ports;
7739 int i;
7740 U32 tmp;
7741
7742 ehci_dbg (ehci, "resume%s","");
7743
7744 ports = HCS_N_PORTS (ehci->hcs_params);
7745
7746
7747
7748 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7749 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7750 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7751 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7752 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7753 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7754 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7755 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7756 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7757 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7758 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7759 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7760 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7761 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7762 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7763 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7764 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7765 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7766 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7767 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7768 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7769 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7770 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7771 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7772 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7773 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7774 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7775 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7776 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7777 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7778 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7779 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7780 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7781 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7782 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7783 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7784 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7785 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7786 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7787 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7788 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7789 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7790 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7791 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7792 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7793 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7794 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7795 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7796 hcd->state = USB_STATE_RUNNING;
7797 // FIXME Philips/Intel/... etc don't really have a "READY"
7798 // state ... turn on CMD_RUN too
7799 for (i = 0; i < ports; i++) {
7800 int temp = ehci_readl ((U32)&ehci->regs->port_status [i]);
7801 if ((temp & PORT_PE) == 0
7802 || (temp & PORT_SUSPEND) != 0)
7803 continue;
7804 ehci_dbg (ehci, "resume port %d", i);
7805 temp |= PORT_RESUME;
7806 ehci_writel (temp, (U32)&ehci->regs->port_status [i]);
7807 tmp = ehci_readl ((U32)&ehci->regs->command); /* unblock posted writes */
7808 wait_ms (20);
7809 temp &= ~PORT_RESUME;
7810 ehci_writel (temp, (U32)&ehci->regs->port_status [i]);
7811 }
7812 tmp = ehci_readl ((U32)&ehci->regs->command); /* unblock posted writes */
7813 return 0;
7814 }
7815
7816 /*-------------------------------------------------------------------------*/
7817
7818
ehci_work(struct ehci_hcd * ehci,struct pt_regs * regs)7819 static void ehci_work (struct ehci_hcd *ehci, struct pt_regs *regs)
7820 {
7821 //del_timer(&ehci->watchdog); //__Test
7822 timer_action_done (ehci, TIMER_IO_WATCHDOG);
7823
7824 // This sequence will release Host task befor USB DSR complete.
7825 #if 0
7826 if (ehci->reclaim_ready)
7827 end_unlink_async (ehci, regs);
7828 scan_async (ehci, regs);
7829 #endif
7830 if (ehci->reclaim_ready)
7831 {
7832 //ehci->regs->command&=~CMD_ASE; //stop asyn scheduler
7833
7834 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7835 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7836 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7837 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7838 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7839 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7840 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7841 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7842 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7843 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7844 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7845 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7846 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7847 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7848 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7849 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7850 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7851 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7852 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7853 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7854 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7855 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7856 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7857 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7858 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7859 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7860 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7861 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7862 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7863 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7864 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7865 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7866 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7867 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7868 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7869 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7870 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7871 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7872 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7873 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7874 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7875 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7876 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7877 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7878 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7879 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7880 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7881 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7882 scan_async (ehci, regs);
7883 end_unlink_async (ehci, regs);
7884 }
7885
7886 if (ehci->next_uframe != -1)
7887 scan_periodic (ehci, regs);
7888
7889 /* the IO watchdog guards against hardware or driver bugs that
7890 * misplace IRQs, and should let us run completely without IRQs.
7891 */
7892 if ((ehci->async->qh_next.ptr != 0) || (ehci->periodic_sched != 0))
7893 timer_action (ehci, TIMER_IO_WATCHDOG);
7894 }
7895 /*-------------------------------------------------------------------------*/
7896 /*-------------------------------------------------------------------------*/
7897 //extern int game_status;
ehci_irq(struct usb_hcd * hcd,struct pt_regs * regs)7898 void ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs)
7899 {
7900 struct ehci_hcd *ehci= hcd_to_ehci (hcd);
7901 U32 status;
7902 #ifdef ROOTHUB_INTERRUPT_MODE
7903 U32 pcd_status = 0;
7904 #endif
7905 int bh;
7906 U32 cmd_t;
7907
7908 spin_lock (&ehci->lock);
7909
7910 status = ehci_readl ((U32)&ehci->regs->status);
7911 //diag_printf("ehci_irq status: %x, intr_enable: %x\n", status, ehci_readb(&ehci->regs->intr_enable));
7912
7913 /* e.g. cardbus physical eject */
7914 if (status == ~(U32) 0) {
7915 ehci_dbg (ehci, "device removed%s%s","\n","");
7916 goto dead;
7917 }
7918
7919 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7920 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7921 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7922 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7923 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7924 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7925 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7926 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7927 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7928 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7929 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7930 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7931 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7932 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7933 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7934 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7935 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7936 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7937 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7938 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7939 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7940 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7941 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7942 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7943 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7944 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7945 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7946 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7947 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7948 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7949 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7950 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7951 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7952 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7953 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7954 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7955 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7956 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7957 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7958 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7959 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7960 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7961 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7962 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7963 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7964 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7965 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7966 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7967
7968 status &= INTR_MASK;
7969 if (!status) /* irq sharing? */
7970 goto done;
7971
7972 /* clear (just) interrupts */
7973 ehci_writel (status, (U32)&ehci->regs->status);
7974 cmd_t = ehci_readl ((U32)&ehci->regs->command); /* unblock posted write */
7975 bh = 0;
7976 ehci->uDontSendIAA = 0;
7977
7978 #ifdef EHCI_VERBOSE_DEBUG
7979 #ifdef KERNEL_DEBUG
7980 /* unrequested/ignored: Port Change Detect, Frame List Rollover */
7981 dbg_status (ehci, "irq", status);
7982 #endif
7983 #endif
7984
7985 /* INT, ERR, and IAA interrupt rates can be throttled */
7986 /* normal [4.15.1.2] or error [4.15.1.1] completion */
7987 if (likely ((status & (STS_INT|STS_ERR)) != 0)) {
7988
7989 // Enable the interrupt for Async Advance Enable
7990 #if 1
7991 ehci->reclaim_ready = 0;
7992 int cmd = ehci_readl ((U32)&ehci->regs->command);
7993 cmd |= CMD_IAAD;
7994 ehci_writel (cmd, (U32)&ehci->regs->command);
7995 (void) ehci_readl ((U32)&ehci->regs->command);
7996 ehci->uDontSendIAA = 1;
7997 #endif
7998 // COUNT (ehci->stats.reclaim);
7999 //ehci->reclaim_ready = 1;
8000 //ehci->uDontSendIAA = 1;
8001 // bh = 1;
8002 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8003 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8004 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8005 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8006 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8007 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8008 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8009 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8010 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8011 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8012 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8013 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8014 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8015 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8016 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8017 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8018 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8019 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8020 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8021 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8022 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8023 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8024 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8025 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8026 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8027 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8028 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8029 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8030 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8031 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8032 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8033 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8034 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8035 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8036 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8037 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8038 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8039 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8040 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8041 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8042 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8043 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8044 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8045 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8046 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8047 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8048 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8049 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8050
8051 if (likely ((status & STS_ERR) == 0))
8052 {
8053 COUNT (ehci->stats.normal);
8054
8055 }
8056 else
8057 {
8058 COUNT (ehci->stats.error);
8059 //bh = 1; //Note, remove for command stall
8060 }
8061 }
8062
8063 /* complete the unlinking of some qh [4.15.2.3] */
8064 #if 1
8065 if (status & STS_IAA) {
8066 COUNT (ehci->stats.reclaim);
8067 ehci->reclaim_ready = 1;
8068 ehci->uDontSendIAA = 1;
8069 bh = 1;
8070 //game_status=0x55;
8071 }
8072 #endif
8073
8074 #ifdef ROOTHUB_INTERRUPT_MODE
8075 /* remote wakeup [4.3.1] */
8076 if (status & STS_PCD) {
8077 unsigned i = HCS_N_PORTS (ehci->hcs_params);
8078
8079
8080 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8081 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8082 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8083 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8084 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8085 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8086 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8087 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8088 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8089 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8090 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8091 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8092 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8093 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8094 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8095 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8096 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8097 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8098 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8099 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8100 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8101 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8102 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8103 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8104 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8105 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8106 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8107 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8108 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8109 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8110 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8111 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8112 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8113 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8114 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8115 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8116 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8117 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8118 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8119 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8120 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8121 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8122 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8123 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8124 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8125 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8126 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8127 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8128
8129 /* kick root hub later */
8130 pcd_status = status & STS_PCD;
8131
8132 /* resume root hub? */
8133 // TODO: FIXME
8134 //if (!(cmd_t & CMD_RUN))
8135 //usb_hcd_resume_root_hub(hcd);
8136
8137 while (i--)
8138 {
8139 int pstatus = ehci_readl((U32)&ehci->regs->port_status [i]);
8140
8141 //if (pstatus & PORT_OWNER)
8142 //continue;
8143 if (!(/*test_bit(i, &ehci->suspended_ports) &&*/
8144 ((pstatus & PORT_RESUME) ||
8145 !(pstatus & PORT_SUSPEND)) &&
8146 (pstatus & PORT_PE) &&
8147 ehci->reset_done[i] == 0))
8148 {
8149 //diag_printf("<ehci_irq> continue, pstatus %x, done[%d] = %x\n", pstatus, i, ehci->reset_done[i]);
8150 continue;
8151 }
8152
8153 /* start 20 msec resume signaling from this port,
8154 * and make khubd collect PORT_STAT_C_SUSPEND to
8155 * stop that signaling.
8156 */
8157 //ehci->reset_done [i] = jiffies + msecs_to_jiffies (20);
8158 ehci->reset_done [i] = jiffies + ((20 /* msec */ * HZ) / 1000);
8159 ehci_dbg (ehci, "port %d remote wakeup\n", i + 1);
8160 mod_timer(&hcd->rh_timer, ehci->reset_done[i], 0);
8161 }
8162 }
8163 #endif
8164
8165 /* PCI errors [4.15.2.4] */
8166 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8167 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8168 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8169 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8170 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8171 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8172 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8173 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8174 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8175 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8176 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8177 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8178 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8179 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8180 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8181 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8182 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8183 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8184 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8185 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8186 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8187 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8188 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8189 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8190 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8191 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8192 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8193 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8194 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8195 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8196 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8197 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8198 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8199 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8200 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8201 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8202 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8203 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8204 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8205 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8206 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8207 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8208 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8209 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8210 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8211 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8212 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8213 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8214
8215 if (unlikely ((status & STS_FATAL) != 0)) {
8216 ehci_err (ehci, "fatal error%s","\n");
8217 dead:
8218 ehci_reset (ehci);
8219 /* generic layer kills/unlinks all urbs, then
8220 * uses ehci_stop to clean up the rest
8221 */
8222 bh = 1;
8223 }
8224
8225 if (bh ||
8226 (ehci->periodic_sched != 0) //If we has periodic transactions in Schedule, we must scan periodic when STS_INT
8227 )
8228 ehci_work (ehci, regs);
8229 done:
8230 spin_unlock (&ehci->lock);
8231 #ifdef ROOTHUB_INTERRUPT_MODE
8232 if (pcd_status)
8233 usb_hcd_poll_rh_status(hcd);
8234 #endif
8235 }
8236
8237 /*-------------------------------------------------------------------------*/
8238
8239
8240 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8241 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8242 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8243 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8244 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8245 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8246 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8247 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8248 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8249 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8250 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8251 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8252 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8253 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8254 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8255 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8256 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8257 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8258 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8259 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8260 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8261 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8262 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8263 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8264 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8265 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8266 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8267 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8268 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8269 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8270 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8271 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8272 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8273 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8274 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8275 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8276 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8277 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8278 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8279 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8280 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8281 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8282 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8283 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8284 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8285 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8286 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8287 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
ehci_urb_enqueue(struct usb_hcd * hcd,struct urb * urb,int mem_flags)8288 int ehci_urb_enqueue (
8289 struct usb_hcd *hcd,
8290 struct urb *urb,
8291 int mem_flags
8292 ) {
8293 struct ehci_hcd *ehci = hcd_to_ehci (hcd);
8294 struct list_head qtd_list;
8295 //printk("s\n");
8296 //g_ehci = ehci;
8297 #ifdef EHCI_VERBOSE_DEBUG
8298 urb_print (urb, "SUB", usb_pipein (urb->pipe));
8299 #endif
8300 //#ifdef CONFIG_FARADAY_FOTG200
8301 //FIXME: cover FOTG200 bug
8302 //Check if device is attached to USB
8303 //If not ==> do not issue URB out
8304 if( (ehci_readl ((U32)&ehci->regs->port_status[0])&PORT_CONNECT) == 0 )
8305 {
8306 return -ENODEV;
8307 }
8308 //#endif
8309 urb->transfer_flags &= ~EHCI_STATE_UNLINK;
8310 INIT_LIST_HEAD (&qtd_list);
8311 //CPUCleanInvalidateDCacheAll();
8312
8313 switch (usb_pipetype (urb->pipe)) {
8314 // case PIPE_CONTROL:
8315 // case PIPE_BULK:
8316 default:
8317
8318 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8319 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8320 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8321 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8322 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8323 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8324 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8325 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8326 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8327 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8328 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8329 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8330 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8331 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8332 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8333 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8334 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8335 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8336 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8337 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8338 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8339 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8340 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8341 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8342 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8343 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8344 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8345 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8346 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8347 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8348 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8349 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8350 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8351 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8352 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8353 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8354 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8355 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8356 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8357 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8358 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8359 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8360 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8361 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8362 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8363 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8364 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8365 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8366 if (mem_flags == ASYNC_MAKE_QTD)
8367 {
8368 INIT_LIST_HEAD (&urb->qtd_list);
8369 if (!qh_urb_transaction (ehci, urb, &urb->qtd_list, mem_flags))
8370 return -ENOMEM;
8371 else
8372 return ENOERR;
8373 }
8374 else if (mem_flags == ASYNC_SUBMIT_QTD)
8375 {
8376 return submit_async (ehci, urb, &urb->qtd_list, mem_flags);
8377 }
8378 else
8379 {
8380 if (!qh_urb_transaction (ehci, urb, &qtd_list, mem_flags))
8381 return -ENOMEM;
8382 return submit_async (ehci, urb, &qtd_list, mem_flags);
8383 }
8384
8385 case PIPE_INTERRUPT:
8386 if (!qh_urb_transaction (ehci, urb, &qtd_list, mem_flags))
8387 return -ENOMEM;
8388 return intr_submit (ehci, urb, &qtd_list, mem_flags);
8389
8390 case PIPE_ISOCHRONOUS:
8391 #ifdef have_iso_itd
8392 if (urb->dev->speed == USB_SPEED_HIGH)
8393 return itd_submit (ehci, urb, mem_flags);
8394 #endif
8395 #ifdef have_split_iso
8396 else
8397 return sitd_submit (ehci, urb, mem_flags);
8398 #else
8399 dbg ("no split iso support yet%s","");
8400 return -ENOSYS;
8401 #endif /* have_split_iso */
8402 }
8403 }
8404
8405 extern void ResetMstarUsb(struct ehci_hcd *ehci);
USB_HW_Reset(struct usb_hcd * pUsbHcd)8406 void USB_HW_Reset(struct usb_hcd* pUsbHcd)
8407 {
8408 struct ehci_hcd *ehci = hcd_to_ehci(pUsbHcd);
8409 ResetMstarUsb(ehci);
8410 ehci_StopRun_Setting(HOST20_Enable, ehci);
8411 }
8412
8413 /* remove from hardware lists
8414 * completions normally happen asynchronously
8415 * It will be called in Interrupt context.
8416 */
ehci_urb_dequeue(struct usb_hcd * hcd,struct urb * urb)8417 int ehci_urb_dequeue (struct usb_hcd *hcd, struct urb *urb)
8418 {
8419 struct ehci_hcd *ehci = hcd_to_ehci (hcd);
8420 struct ehci_qh *qh;
8421 U32 flags;
8422 usb_msg("ehci_urb_dequeue:UNLINK%s","");
8423 #ifdef EHCI_VERBOSE_DEBUG
8424 urb_print (urb, "UNLINK", 1);
8425 #endif
8426 spin_lock_irqsave (&ehci->lock, flags);
8427 switch (usb_pipetype (urb->pipe)) {
8428 // case PIPE_CONTROL:
8429 // case PIPE_BULK:
8430
8431 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8432 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8433 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8434 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8435 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8436 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8437 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8438 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8439 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8440 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8441 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8442 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8443 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8444 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8445 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8446 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8447 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8448 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8449 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8450 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8451 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8452 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8453 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8454 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8455 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8456 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8457 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8458 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8459 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8460 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8461 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8462 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8463 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8464 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8465 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8466 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8467 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8468 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8469 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8470 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8471 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8472 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8473 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8474 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8475 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8476 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8477 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8478 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8479 default:
8480 qh = (struct ehci_qh *) urb->hcpriv;
8481 if (!qh)
8482 break;
8483
8484 /* if we need to use IAA and it's busy, defer */
8485 if (qh->qh_state == QH_STATE_LINKED
8486 && ehci->reclaim
8487 && HCD_IS_RUNNING (ehci->hcd.state)
8488 ) {
8489 struct ehci_qh *last;
8490
8491 for (last = ehci->reclaim;
8492 last->reclaim;
8493 last = last->reclaim)
8494 continue;
8495 qh->qh_state = QH_STATE_UNLINK_WAIT;
8496 last->reclaim = qh;
8497 /* bypass IAA if the hc can't care */
8498 } else if (!HCD_IS_RUNNING (ehci->hcd.state) && ehci->reclaim)
8499 end_unlink_async (ehci, NULL);
8500 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8501 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8502 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8503 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8504 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8505 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8506 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8507 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8508 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8509 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8510 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8511 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8512 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8513 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8514 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8515 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8516 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8517 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8518 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8519 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8520 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8521 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8522 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8523 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8524 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8525 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8526 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8527 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8528 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8529 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8530 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8531 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8532 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8533 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8534 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8535 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8536 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8537 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8538 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8539 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8540 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8541 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8542 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8543 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8544 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8545 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8546 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8547 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8548
8549 /* something else might have unlinked the qh by now */
8550 if (qh->qh_state == QH_STATE_LINKED)
8551 start_unlink_async (ehci, qh);
8552 //#ifdef CONFIG_FARADAY_FOTG200
8553 #if 1
8554 //FIXME: cover FOTG200 bug
8555 if( (ehci_readl ((U32)&ehci->regs->port_status[0])&PORT_CONNECT) == 0 )
8556 {
8557 #ifdef CONFIG_FARADAY_FOTG200
8558 mdwOTGC_Control_PHY_Reset_Set();
8559 udelay(1000);
8560 mdwOTGC_Control_PHY_Reset_Clr();
8561 //Reset OTG controller
8562 mdwOTGC_Control_OTG_Reset_Set();
8563 #endif
8564 //Finish ullinking procedure
8565 end_unlink_async (ehci, NULL);
8566 //Reset HC to ensure FOTG200 work correctly at the next time
8567 hub_port_disable(ehci->hcd.self.root_hub,0);
8568 }
8569 else if ( (ehci_readl ((U32)&ehci->regs->command)&CMD_RUN) == 0 )
8570 {
8571 //diag_printf("Something wrong (script auto running?) ==> Check it out\n");
8572
8573 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8574 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8575 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8576 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8577 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8578 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8579 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8580 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8581 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8582 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8583 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8584 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8585 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8586 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8587 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8588 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8589 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8590 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8591 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8592 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8593 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8594 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8595 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8596 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8597 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8598 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8599 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8600 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8601 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8602 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8603 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8604 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8605 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8606 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8607 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8608 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8609 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8610 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8611 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8612 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8613 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8614 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8615 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8616 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8617 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8618 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8619 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8620 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8621 #if 0
8622 // mdwOTGC_Control_PHY_Reset_Set();
8623 // udelay(1000);
8624 // mdwOTGC_Control_PHY_Reset_Clr();
8625 //Reset OTG controller
8626 //mdwOTGC_Control_OTG_Reset_Set();
8627 #endif
8628 //Finish ullinking procedure
8629 end_unlink_async (ehci, NULL);
8630 //Reset HC to ensure FOTG200 work correctly at the next time
8631 hub_port_disable(ehci->hcd.self.root_hub,0);
8632 }
8633 #endif
8634 break;
8635 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8636 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8637 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8638 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8639 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8640 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8641 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8642 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8643 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8644 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8645 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8646 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8647 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8648 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8649 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8650 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8651 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8652 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8653 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8654 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8655 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8656 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8657 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8658 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8659 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8660 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8661 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8662 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8663 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8664 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8665 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8666 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8667 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8668 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8669 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8670 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8671 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8672 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8673 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8674 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8675 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8676 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8677 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8678 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8679 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8680 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8681 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8682 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8683
8684 case PIPE_INTERRUPT:
8685 qh = (struct ehci_qh *) urb->hcpriv;
8686 if (!qh)
8687 break;
8688 if (qh->qh_state == QH_STATE_LINKED) {
8689 /* messy, can spin or block a microframe ... */
8690 intr_deschedule (ehci, qh, 1);
8691 /* qh_state == IDLE */
8692 }
8693 qh_completions (ehci, qh, NULL);
8694
8695 /* reschedule QH iff another request is queued */
8696
8697 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8698 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8699 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8700 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8701 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8702 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8703 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8704 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8705 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8706 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8707 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8708 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8709 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8710 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8711 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8712 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8713 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8714 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8715 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8716 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8717 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8718 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8719 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8720 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8721 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8722 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8723 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8724 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8725 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8726 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8727 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8728 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8729 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8730 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8731 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8732 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8733 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8734 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8735 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8736 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8737 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8738 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8739 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8740 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8741 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8742 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8743 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8744 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8745 if (!list_empty (&qh->qtd_list)
8746 && HCD_IS_RUNNING (ehci->hcd.state)) {
8747 int status;
8748
8749 status = qh_schedule (ehci, qh);
8750 spin_unlock_irqrestore (&ehci->lock, flags);
8751 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8752 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8753 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8754 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8755 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8756 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8757 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8758 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8759 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8760 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8761 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8762 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8763 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8764 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8765 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8766 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8767 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8768 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8769 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8770 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8771 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8772 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8773 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8774 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8775 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8776 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8777 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8778 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8779 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8780 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8781 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8782 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8783 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8784 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8785 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8786 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8787 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8788 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8789 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8790 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8791 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8792 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8793 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8794 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8795 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8796 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8797 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8798 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8799
8800 if (status != 0) {
8801 // shouldn't happen often, but ...
8802 // FIXME kill those tds' urbs
8803 usb_err ("can't reschedule qh %p, err %d",
8804 qh, status);
8805 }
8806 return status;
8807 }
8808 break;
8809 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8810 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8811 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8812 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8813 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8814 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8815 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8816 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8817 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8818 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8819 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8820 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8821 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8822 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8823 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8824 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8825 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8826 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8827 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8828 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8829 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8830 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8831 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8832 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8833 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8834 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8835 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8836 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8837 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8838 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8839 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8840 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8841 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8842 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8843 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8844 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8845 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8846 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8847 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8848 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8849 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8850 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8851 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8852 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8853 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8854 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8855 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8856 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8857
8858 case PIPE_ISOCHRONOUS:
8859 // itd or sitd ...
8860
8861 // wait till next completion, do it then.
8862 // completion irqs can wait up to 1024 msec,
8863 urb->transfer_flags |= EHCI_STATE_UNLINK;
8864 break;
8865 }
8866 spin_unlock_irqrestore (&ehci->lock, flags);
8867 return 0;
8868 }
8869
8870 /*-------------------------------------------------------------------------*/
8871
8872 // bulk qh holds the data toggle
8873 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8874 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8875 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8876 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8877 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8878 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8879 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8880 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8881 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8882 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8883 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8884 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8885 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8886 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8887 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8888 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8889 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8890 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8891 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8892 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8893 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8894 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8895 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8896 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8897 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8898 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8899 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8900 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8901 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8902 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8903 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8904 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8905 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8906 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8907 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8908 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8909 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8910 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8911 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8912 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8913 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8914 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8915 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8916 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8917 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8918 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8919 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8920 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8921
8922 void
ehci_endpoint_disable(struct usb_hcd * hcd,struct hcd_dev * dev,int ep)8923 ehci_endpoint_disable (struct usb_hcd *hcd, struct hcd_dev *dev, int ep)
8924 {
8925 struct ehci_hcd *ehci = hcd_to_ehci (hcd);
8926 int epnum;
8927 U32 flags;
8928 struct ehci_qh *qh;
8929
8930 /* ASSERT: any requests/urbs are being unlinked */
8931 /* ASSERT: nobody can be submitting urbs for this any more */
8932
8933 epnum = ep & USB_ENDPOINT_NUMBER_MASK;
8934 if (epnum != 0 && (ep & USB_DIR_IN))
8935 epnum |= 0x10;
8936 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8937 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8938 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8939 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8940 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8941 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8942 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8943 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8944 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8945 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8946 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8947 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8948 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8949 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8950 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8951 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8952 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8953 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8954 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8955 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8956 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8957 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8958 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8959 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8960 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8961 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8962 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8963 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8964 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8965 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8966 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8967 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8968 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8969 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8970 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8971 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8972 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8973 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8974 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8975 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8976 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8977 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8978 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8979 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8980 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8981 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8982 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8983 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8984
8985 rescan:
8986 spin_lock_irqsave (&ehci->lock, flags);
8987 qh = (struct ehci_qh *) dev->ep [epnum];
8988 if (!qh)
8989 goto done;
8990
8991 if (!HCD_IS_RUNNING (ehci->hcd.state))
8992 qh->qh_state = QH_STATE_IDLE;
8993
8994 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8995 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8996 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8997 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8998 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8999 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9000 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9001 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9002 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9003 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9004 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9005 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9006 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9007 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9008 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9009 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9010 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9011 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9012 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9013 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9014 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9015 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9016 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9017 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9018 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9019 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9020 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9021 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9022 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9023 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9024 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9025 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9026 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9027 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9028 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9029 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9030 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9031 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9032 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9033 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9034 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9035 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9036 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9037 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9038 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9039 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9040 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9041 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9042 switch (qh->qh_state) {
9043 case QH_STATE_UNLINK: /* wait for hw to finish? */
9044 spin_unlock_irqrestore (&ehci->lock, flags);
9045 set_current_state (TASK_UNINTERRUPTIBLE);
9046 schedule_timeout (1);
9047 goto rescan;
9048 case QH_STATE_IDLE: /* fully unlinked */
9049 if (list_empty (&qh->qtd_list)) {
9050 qh_put (ehci, qh);
9051 break;
9052 }
9053 /* else FALL THROUGH */
9054
9055 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9056 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9057 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9058 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9059 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9060 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9061 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9062 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9063 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9064 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9065 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9066 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9067 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9068 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9069 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9070 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9071 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9072 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9073 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9074 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9075 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9076 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9077 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9078 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9079 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9080 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9081 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9082 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9083 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9084 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9085 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9086 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9087 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9088 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9089 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9090 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9091 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9092 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9093 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9094 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9095 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9096 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9097 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9098 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9099 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9100 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9101 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9102 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9103 default:
9104 /* caller was supposed to have unlinked any requests;
9105 * that's not our job. just leak this memory.
9106 */
9107 if ( !list_empty (&qh->qtd_list))
9108 {
9109 ehci_err (ehci, "qh %p (#%d) state %d%s\n",
9110 qh, epnum, qh->qh_state,
9111 list_empty (&qh->qtd_list) ? "" : "(has tds)");
9112 }
9113 break;
9114 }
9115 dev->ep [epnum] = 0;
9116 done:
9117 spin_unlock_irqrestore (&ehci->lock, flags);
9118 return;
9119 }
9120 #endif //#
9121
9122 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9123 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9124 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9125 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9126 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9127 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9128 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9129 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9130 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9131 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9132 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9133 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9134 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9135 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9136 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9137 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9138 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9139 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9140 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9141 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9142 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9143 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9144 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9145 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9146 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9147 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9148 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9149 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9150 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9151 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9152 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9153 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9154 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9155 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9156 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9157 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9158 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9159 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9160 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9161 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9162 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9163 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9164 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9165 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9166 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9167 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9168 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9169 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9170
9171
9172 #include <MsCommon.h>
9173 #include "include/drvKernel.h"
9174 #include "include/drvCPE_AMBA.h"
9175 #include "include/drvCPE_EHCI.h"
9176 #include "drvHCD.h"
9177 struct cpe_dev cpe_ehci_dev;
9178
9179 #if 1
9180
9181 extern MS_S32 usb_disabled(void);
9182
9183 //int ehci_cpe_dev_init (void);
9184
9185 /*-------------------------------------------------------------------------*/
9186
cpe_ehci_start_hc(struct cpe_dev * dev)9187 void cpe_ehci_start_hc(struct cpe_dev *dev)
9188 {
9189 printk(": starting CPE EHCI USB Controller\n");
9190 /*
9191 * Reset and enable AMBA EHCI HC
9192 */
9193 udelay(11);
9194 }
9195
cpe_ehci_stop_hc(struct cpe_dev * dev)9196 void cpe_ehci_stop_hc(struct cpe_dev *dev)
9197 {
9198 /*
9199 * Reset and disable AMBA EHCI HC
9200 */
9201 return;
9202 }
9203
9204 /*-------------------------------------------------------------------------*/
9205
9206 void usb_hcd_cpe_ehci_remove (struct usb_hcd *hcd, struct cpe_dev *dev);
9207
9208
9209
9210 extern void rh_timer_func (unsigned long _hcd);
usb_hcd_cpe_ehci_probe(struct hc_driver * driver,struct usb_hcd ** hcd_out,struct cpe_dev * dev)9211 int usb_hcd_cpe_ehci_probe (struct hc_driver *driver,
9212 struct usb_hcd **hcd_out,
9213 struct cpe_dev *dev)
9214 {
9215 int retval;
9216 struct usb_hcd *hcd = 0;
9217 //Basic initialization for FPFA version IP
9218 // mwPeri20_Control_ChipEnable_Set();
9219 // #ifdef CYGPKG_USB_HALF_SPEED_MODE
9220 // mwPeri20_Control_HALFSPEEDEnable_Set();
9221 // #endif
9222
9223 //#ifdef FORCE_FULL_SPEED
9224 // Force HC to full speed
9225 //mwOTG20_Control_ForceFullSpeed_Set();
9226 //mwOTG20_Control_ForceHighSpeed_Clr();
9227 //#endif
9228 //#ifdef FORCE_HIGH_SPEED
9229 // Force HC to high speed
9230 //mwOTG20_Control_ForceFullSpeed_Clr();
9231 //mwOTG20_Control_ForceHighSpeed_Set();
9232 //#endif
9233
9234
9235 diag_printf("usb_hcd_cpe_ehci_probe\n");
9236 cpe_ehci_start_hc(dev);
9237
9238
9239 hcd = driver->hcd_alloc();
9240 diag_printf("hcd: %lx\n", (U32)hcd);
9241 if (hcd == NULL){
9242 dbg ("hcd_alloc failed%s"," ");
9243 retval = -ENOMEM;
9244 goto err1;
9245 }
9246
9247 hcd->driver = (struct hc_driver *) driver;
9248 //hcd->description = driver->description;
9249
9250 memcpy((char*)hcd,(char*)driver,24);
9251
9252 hcd->irq = gIrqUHC; //CPE_USB_EHCI0_IRQ;
9253 hcd->regs = (U32*) gBaseUHC;
9254 hcd->host_id = 0; // new
9255 hcd->phub_event = &hub_event_list;
9256 hcd->pdev = (struct pci_dev *)(1111); //Fake PCI device
9257 hcd->self.controller = &dev->dev;
9258 hcd->controller = hcd->self.controller;
9259
9260 retval = hcd_buffer_create (hcd);
9261 if (retval != 0) {
9262 dbg ("pool alloc fail%s","\n");
9263 goto err1;
9264 }
9265
9266 /* till now HC has been in an indeterminate state ... */
9267 if (driver->reset && (retval = driver->reset (hcd)) < 0) {
9268 dev_err (hcd->controller, "can't reset%s","\n");
9269 goto err2;
9270 }
9271 // Initialize IRQ and ISR Trap, enable interrupt later (at the end)
9272 #if 0
9273 fLib_CloseInt(hcd->irq);
9274 fLib_SetIntTrig(hcd->irq,LEVEL,L_ACTIVE);
9275 retval = fLib_ReqInt (hcd->irq, usb_hcd_cpe_ehci_hcim_irq, hcd);
9276 if ( retval == FALSE )
9277 {
9278 usb_err("Register ISR fail%s","");
9279 retval = -EINVAL;
9280 goto err1;
9281 }
9282 #ifdef CONFIG_OTG
9283 #ifndef CONFIG_FARADAY_FOTG200
9284 // Enable CPE EHCI HC's Interrupt
9285 fLib_EnableInt(hcd->irq);
9286 #else
9287 // Enable EHCI interrupt after intilizing OTG controller driver
9288 #endif
9289 #else
9290 // Do OTG support ==> Enable CPE EHCI HC's Interrupt now
9291 fLib_EnableInt(hcd->irq);
9292 #endif
9293 #endif
9294 //mwOTG20_Interrupt_Mask_HOST_Clr();//yuwen mark
9295
9296 #if 0
9297 if (retval != TRUE) {
9298 dbg("request_irq failed%s"," ");
9299 retval = -EBUSY;
9300 goto err2;
9301 }
9302 #endif
9303
9304 usb_info ("%s (CPE_AMBA) at 0x%p, irq %d\n",
9305 hcd->description, hcd->regs, hcd->irq);
9306 usb_bus_init (&hcd->self);
9307 hcd->self.op = &usb_hcd_operations;
9308 hcd->self.hcpriv = (void *) hcd;
9309 hcd->self.bus_name = "cpe_ehci";
9310 //hcd->product_desc = "CPE_AMBA EHCI";
9311 memcpy(hcd->product_desc, "CPE_AMBA EHCI", sizeof(hcd->product_desc));
9312
9313 #ifdef ROOTHUB_INTERRUPT_MODE
9314 init_timer(&hcd->rh_timer);
9315 hcd->rh_timer.function = rh_timer_func;
9316 hcd->rh_timer.data = (unsigned long) hcd;
9317 #endif
9318 hcd->pre_sts = 0; // new
9319 hcd->pre_temp = 0; // new
9320 init_OS_Resource_EX(&hcd->USBWaitFlg);
9321 INIT_LIST_HEAD (&hcd->dev_list);
9322 usb_register_bus (&hcd->self);
9323
9324 if ((retval = driver->start (hcd)) < 0)
9325 {
9326 usb_hcd_cpe_ehci_remove(hcd, dev);
9327 return retval;
9328 }
9329
9330 *hcd_out = hcd;
9331
9332 return retval;
9333
9334 err2:
9335 hcd_buffer_destroy (hcd);
9336 if (hcd)
9337 driver->hcd_free(hcd);
9338 err1:
9339 cpe_ehci_stop_hc(dev);
9340 //release_mem_region(dev->res.start, dev->res.end - dev->res.start + 1);
9341 return retval;
9342 }
9343
9344
usb_hcd_cpe_ehci_remove(struct usb_hcd * hcd,struct cpe_dev * dev)9345 void usb_hcd_cpe_ehci_remove (struct usb_hcd *hcd, struct cpe_dev *dev)
9346 {
9347 struct usb_device *hub;
9348
9349 usb_info ("remove: %s, state %x", hcd->self.bus_name, hcd->state);
9350 hub = hcd->self.root_hub;
9351 if (HCD_IS_RUNNING (hcd->state))
9352 hcd->state = USB_STATE_QUIESCING;
9353
9354 dbg ("%s: roothub graceful disconnect", hcd->self.bus_name);
9355 usb_disconnect (&hub);
9356
9357 hcd->driver->stop (hcd);
9358 hcd->state = USB_STATE_HALT;
9359
9360 //free_irq (hcd->irq, hcd);
9361 //fLib_CloseInt(hcd->irq);
9362 hcd_buffer_destroy (hcd);
9363 usb_deregister_bus (&hcd->self);
9364 hcd->driver->hcd_free (hcd);
9365 cpe_ehci_stop_hc(dev);
9366 }
9367
9368 //#ifdef CONFIG_PM
9369 #if 1
9370
9371
usb_hcd_cpe_ehci_suspend(struct usb_hcd * hcd)9372 int usb_hcd_cpe_ehci_suspend (struct usb_hcd *hcd)
9373 {
9374 int retval = 0;
9375
9376 switch (hcd->state) {
9377 case USB_STATE_HALT:
9378 dev_dbg (hcd->controller, "halted; hcd not suspended%s","\n");
9379 break;
9380 case USB_STATE_SUSPENDED:
9381 dev_dbg (hcd->controller, "hcd already suspended%s","\n");
9382 break;
9383 default:
9384 hcd->state = USB_STATE_QUIESCING;
9385 retval = hcd->driver->suspend (hcd, 0);
9386 if (retval)
9387 dev_dbg (hcd->controller, "suspend fail, retval %d%s","\n", retval);
9388 break;
9389 }
9390 return retval;
9391 }
usb_hcd_cpe_ehci_resume(struct usb_hcd * hcd)9392 int usb_hcd_cpe_ehci_resume(struct usb_hcd *hcd)
9393 {
9394 int retval=0;
9395
9396 if (hcd->state != USB_STATE_SUSPENDED) {
9397 dev_dbg (hcd->controller, "can't resume, not suspended!%s","\n");
9398 return -46;//return -EL3HLT;
9399 }
9400 hcd->state = USB_STATE_RESUMING;
9401 /* remote wakeup needs hub->suspend() cooperation */
9402 retval = hcd->driver->resume (hcd);
9403 #if 0
9404 if (!HCD_IS_RUNNING (hcd->state)) {
9405 dev_dbg (hcd->controller, "resume fail, retval %d\n", retval);
9406 usb_hc_died (hcd);
9407 }
9408 #endif
9409 return retval;
9410 }
9411
9412 #endif /* CONFIG_PM */
9413
9414 /*-------------------------------------------------------------------------*/
9415
9416 #if 0
9417 static int
9418 ehci_cpe_ehci_start (struct usb_hcd *hcd)
9419 {
9420 return 0;
9421 }
9422 #endif
9423
9424 /*-------------------------------------------------------------------------*/
9425
9426 struct cpe_driver ehci_hcd_cpe_driver;
9427 extern int ehci_hc_reset (struct usb_hcd *hcd);
9428 extern int ehci_start (struct usb_hcd *hcd);
9429 extern int ehci_suspend (struct usb_hcd *hcd, U32 state);
9430 extern int ehci_resume (struct usb_hcd *hcd);
9431 extern void ehci_stop (struct usb_hcd *hcd);
9432 extern struct usb_hcd *ehci_hcd_alloc (void);
9433 extern void ehci_hcd_free (struct usb_hcd *hcd);
9434 extern int ehci_urb_enqueue ( struct usb_hcd *hcd, struct urb *urb, int mem_flags) ;
9435 extern int ehci_urb_dequeue (struct usb_hcd *hcd, struct urb *urb);
9436 extern void ehci_endpoint_disable (struct usb_hcd *hcd, struct hcd_dev *dev, int ep);
9437 extern int ehci_get_frame (struct usb_hcd *hcd);
9438 extern int ehci_hub_status_data (struct usb_hcd *hcd, char *buf);
9439 extern int ehci_hub_control ( struct usb_hcd *hcd, U16 typeReq, U16 wValue, U16 wIndex, char *buf, U16 wLength) ;
9440 struct hc_driver ehci_cpe_hc_driver ;
9441
cpe_ehci_hcd_init(void)9442 static void cpe_ehci_hcd_init(void)
9443 {
9444 memcpy( ehci_cpe_hc_driver.description , "ehci_hcd", sizeof("ehci_hcd")+1);
9445
9446 /*
9447 * generic hardware linkage
9448 */
9449 ehci_cpe_hc_driver.irq = ehci_irq;
9450 ehci_cpe_hc_driver.flags = HCD_MEMORY | HCD_USB2;
9451
9452 /*
9453 * basic lifecycle operations
9454 */
9455 ehci_cpe_hc_driver.reset = ehci_hc_reset;
9456 ehci_cpe_hc_driver.start = ehci_start;
9457 ehci_cpe_hc_driver.suspend = ehci_suspend;
9458 ehci_cpe_hc_driver.resume = ehci_resume;
9459 ehci_cpe_hc_driver.stop = ehci_stop;
9460
9461 /*
9462 * memory lifecycle (except per-request)
9463 */
9464 ehci_cpe_hc_driver.hcd_alloc = ehci_hcd_alloc;
9465 ehci_cpe_hc_driver.hcd_free = ehci_hcd_free;
9466
9467 /*
9468 * managing i/o requests and associated device resources
9469 */
9470 ehci_cpe_hc_driver.urb_enqueue = ehci_urb_enqueue;
9471 ehci_cpe_hc_driver.urb_dequeue = ehci_urb_dequeue;
9472 ehci_cpe_hc_driver.endpoint_disable = ehci_endpoint_disable;
9473
9474 /*
9475 * scheduling support
9476 */
9477 ehci_cpe_hc_driver.get_frame_number = ehci_get_frame;
9478
9479 /*
9480 * root hub support
9481 */
9482 ehci_cpe_hc_driver.hub_status_data = ehci_hub_status_data;
9483 ehci_cpe_hc_driver.hub_control = ehci_hub_control;
9484 }
9485 /*-------------------------------------------------------------------------*/
9486
9487 extern void InitUSBIntr(struct usb_hcd * hcd);
ehci_hcd_cpe_ehci_drv_probe(struct device_s * _dev)9488 static int ehci_hcd_cpe_ehci_drv_probe(struct device_s *_dev)
9489 {
9490 struct cpe_dev *dev;
9491 struct usb_hcd *hcd = NULL;
9492 int ret;
9493
9494 const struct device_s *__mptr = _dev;
9495 dev = (struct cpe_dev *)( (char *)__mptr - (char *)offsetof(struct cpe_dev,dev) );
9496
9497 if (usb_disabled())
9498 return -ENODEV;
9499
9500 cpe_ehci_hcd_init();
9501
9502 ret = usb_hcd_cpe_ehci_probe(&ehci_cpe_hc_driver, &hcd, dev);
9503
9504 if (ret == 0)
9505 {
9506 dev->dev.driver_data = hcd;
9507 g_pUsbHcd = hcd;
9508 InitUSBIntr(hcd); //add USB interrupt entry . yuwen
9509 }
9510
9511 return ret;
9512 }
9513
9514 /*static*/
ehci_hcd_cpe_ehci_drv_remove(struct device_s * _dev)9515 int ehci_hcd_cpe_ehci_drv_remove(struct device_s *_dev)
9516 {
9517 struct cpe_dev *dev;
9518 struct usb_hcd *hcd ;
9519
9520 const struct device_s *__mptr = _dev;
9521 dev = (struct cpe_dev *)( (char *)__mptr - (char *)offsetof(struct cpe_dev,dev) );
9522 hcd = (struct usb_hcd *) dev->dev.driver_data;
9523
9524 usb_hcd_cpe_ehci_remove(hcd, dev);
9525
9526 dev->dev.driver_data = NULL;
9527
9528 return 0;
9529 }
9530
9531 /*static*/
ehci_hcd_cpe_ehci_drv_suspend(struct device_s * _dev,U32 state,U32 level)9532 int ehci_hcd_cpe_ehci_drv_suspend(struct device_s *_dev, U32 state, U32 level)
9533 {
9534 #ifdef CONFIG_PM
9535 struct cpe_dev *dev;
9536 struct usb_hcd *hcd ;
9537 const struct device *__mptr = _dev;
9538 dev = (struct cpe_dev *)( (char *)__mptr - offsetof(struct cpe_dev,dev) );
9539 hcd = dev->dev.driver_data;
9540 usb_hcd_cpe_ehci_suspend(hcd);
9541 #endif
9542 return 0;
9543 }
9544
9545 /*static*/
ehci_hcd_cpe_ehci_drv_resume(struct device_s * _dev,U32 level)9546 int ehci_hcd_cpe_ehci_drv_resume(struct device_s *_dev, U32 level)
9547 {
9548 #ifdef CONFIG_PM
9549 struct cpe_dev *dev;
9550 struct usb_hcd *hcd ;
9551 const struct device *__mptr = _dev;
9552 dev = (struct cpe_dev *)( (char *)__mptr - offsetof(struct cpe_dev,dev) );
9553 hcd = dev->dev.driver_data;
9554 usb_hcd_cpe_ehci_resume(hcd);
9555 #endif /* CONFIG_PM */
9556 return 0;
9557 }
9558
9559 #if 0
9560 static void __exit ehci_hcd_cpe_ehci_cleanup (void)
9561 {
9562 driver_unregister(&ehci_hcd_cpe_driver.drv);
9563 }
9564 #endif
9565
9566 /*-------------------------------------------------------------------------*/
9567
ehci_hcd_cpe_ehci_init(void)9568 static int __init ehci_hcd_cpe_ehci_init (void)
9569 {
9570 pr_debug ("ehci_hcd: block sizes: qh %d qtd %d itd %d sitd %d\n",
9571 sizeof (struct ehci_qh), sizeof (struct ehci_qtd),
9572 sizeof (struct ehci_itd), sizeof (struct ehci_sitd));
9573 strncpy(ehci_hcd_cpe_driver.drv.name, "cpe_ehci", sizeof("cpe_ehci"));
9574 ehci_hcd_cpe_driver.drv.bus = &CPE_AMBA_bus_type;
9575 ehci_hcd_cpe_driver.drv.probe = ehci_hcd_cpe_ehci_drv_probe;
9576 ehci_hcd_cpe_driver.drv.remove = ehci_hcd_cpe_ehci_drv_remove;
9577 ehci_hcd_cpe_driver.drv.suspend = ehci_hcd_cpe_ehci_drv_suspend;
9578 ehci_hcd_cpe_driver.drv.resume = ehci_hcd_cpe_ehci_drv_resume;
9579 ehci_hcd_cpe_driver.devid = CPE_DEVID_USB;
9580 return driver_register(&ehci_hcd_cpe_driver.drv);
9581 }
9582
9583 //#define DRIVER_INFO DRIVER_VERSION " " DRIVER_DESC
9584
ehci_cpe_dev_init(void)9585 int __init ehci_cpe_dev_init(void)
9586 {
9587 // Cannot remove: Init list heads of device and driver lists of CPE EHCI device
9588 device_initialize(&cpe_ehci_dev.dev);
9589 #ifdef DEBUG
9590 //dbg (DRIVER_INFO " Init CPE EHCI Host Controller%s"," ");
9591 #endif
9592 // Init CPE EHCI device data structure
9593 cpe_ehci_dev.dev.parent = NULL; //parent should be CPE AMBA
9594 strncpy(cpe_ehci_dev.dev.name,"CPE_EHCI HC", sizeof("CPE_EHCI HC")); //USB_2
9595 strncpy(cpe_ehci_dev.dev.bus_id,"AHB0_EHCI", sizeof("AHB0_EHCI"));
9596 cpe_ehci_dev.dev.bus = &CPE_AMBA_bus_type;
9597 cpe_ehci_dev.devid = CPE_DEVID_USB;
9598 cpe_ehci_dev.mapbase = gBaseUHC;
9599 cpe_ehci_dev.utmibase = gBaseUTMI;
9600 cpe_ehci_dev.usbcbase = gBaseUSBC;
9601 cpe_ehci_dev.dma_mask = 0x00; //Unsupport DMA
9602 //register cpe_ehci devie to CPE AMBA bus
9603 device_add(&cpe_ehci_dev.dev);
9604
9605 return ehci_hcd_cpe_ehci_init();
9606 }
9607 #endif //#
9608
9609 // -------------------------------------------------------------------------
9610
ehci_StopRun_Setting(MS_U8 bOption,struct ehci_hcd * ehci)9611 void ehci_StopRun_Setting(MS_U8 bOption, struct ehci_hcd *ehci)
9612 {
9613 U32 temp;
9614
9615 if (bOption==HOST20_Enable)
9616 {
9617 temp = ehci_readl((U32)&ehci->regs->command);
9618 if (temp & CMD_RUN)
9619 return;
9620
9621 temp |= CMD_RUN;
9622 ehci_writel(temp, (U32)&ehci->regs->command);
9623 do {
9624 temp = ehci_readl((U32)&ehci->regs->command);
9625 } while ((temp & CMD_RUN) == 0);
9626 }
9627 else if (bOption==HOST20_Disable)
9628 {
9629 temp = ehci_readl((U32)&ehci->regs->command);
9630 if ((temp & CMD_RUN) == 0)
9631 return;
9632
9633 temp &= ~CMD_RUN;
9634 ehci_writel(temp, (U32)&ehci->regs->command);
9635 do {
9636 temp = ehci_readl((U32)&ehci->regs->command);
9637 } while ((temp & CMD_RUN) > 0);
9638 }
9639 else
9640 {
9641 diag_printf("??? Input Error 'ehci_StopRun_Setting'...");
9642 while(1);
9643 }
9644 }
9645
9646 extern struct cpe_dev cpe_ehci_dev;
9647 extern struct cpe_driver ehci_hcd_cpe_driver;
9648 extern struct hc_driver ehci_cpe_hc_driver;
9649 extern struct usb_hcd *g_pUsbHcd;
9650
usb_hcd_cpe_ehci_probe_EX(struct hc_driver * driver,struct usb_hcd ** hcd_out,struct cpe_dev * dev)9651 int usb_hcd_cpe_ehci_probe_EX(struct hc_driver *driver,
9652 struct usb_hcd **hcd_out,
9653 struct cpe_dev *dev)
9654 {
9655 int retval;
9656 struct usb_hcd *hcd = 0;
9657 struct s_gVar4UsbPort *p_rootHub = cpe_to_gVar(dev);
9658
9659 diag_printf("usb_hcd_cpe_ehci_probe_EX\n");
9660 cpe_ehci_start_hc(dev);
9661
9662
9663 hcd = driver->hcd_alloc();
9664 diag_printf("hcd: %lx\n", (U32)hcd);
9665 if (hcd == NULL){
9666 dbg ("hcd_alloc failed%s"," ");
9667 retval = -ENOMEM;
9668 goto ex_err1;
9669 }
9670
9671 hcd->driver = (struct hc_driver *) driver;
9672 //hcd->description = driver->description;
9673
9674 memcpy((char*)hcd,(char*)driver,24);
9675
9676 hcd->host_id = p_rootHub->portNum;
9677 hcd->phub_event = p_rootHub->p_hub_event;
9678 //hcd->irq = E_IRQ_UHC; //CPE_USB_EHCI0_IRQ;
9679 //hcd->regs = (U32*) gUHC_BASE;
9680 hcd->irq = dev->intNum;
9681 hcd->regs = (U32*) dev->mapbase;
9682 hcd->pdev = (struct pci_dev *)(1111); //Fake PCI device
9683 hcd->self.controller = &dev->dev;
9684 hcd->controller = hcd->self.controller;
9685
9686 retval = hcd_buffer_create (hcd);
9687 if (retval != 0) {
9688 dbg ("pool alloc fail%s","\n");
9689 goto ex_err1;
9690 }
9691
9692 /* till now HC has been in an indeterminate state ... */
9693 if (driver->reset && (retval = driver->reset (hcd)) < 0) {
9694 dev_err (hcd->controller, "can't reset%s","\n");
9695 goto ex_err2;
9696 }
9697
9698 usb_info ("%s (CPE_AMBA) at 0x%p, irq %d\n",
9699 hcd->description, hcd->regs, hcd->irq);
9700 usb_bus_init (&hcd->self);
9701 hcd->self.op = &usb_hcd_operations;
9702 hcd->self.hcpriv = (void *) hcd;
9703
9704 //hcd->self.bus_name = "cpe_ehci";
9705 //hcd->product_desc = "CPE_AMBA EHCI";
9706 //memcpy(hcd->product_desc, "CPE_AMBA EHCI", sizeof(hcd->product_desc));
9707 hcd->self.bus_name = p_rootHub->bus_name;
9708 memcpy(hcd->product_desc, p_rootHub->product_desc, sizeof(p_rootHub->product_desc));
9709
9710 hcd->pre_sts = 0; // new
9711 hcd->pre_temp = 0; // new
9712 hcd->pgVar = p_rootHub; // new
9713 init_OS_Resource_EX(&hcd->USBWaitFlg);
9714 INIT_LIST_HEAD (&hcd->dev_list);
9715 usb_register_bus (&hcd->self);
9716
9717 if ((retval = driver->start (hcd)) < 0) // start HCD
9718 {
9719 usb_hcd_cpe_ehci_remove(hcd, dev);
9720 return retval;
9721 }
9722
9723 *hcd_out = hcd;
9724
9725 return retval;
9726
9727 ex_err2:
9728 hcd_buffer_destroy (hcd);
9729 if (hcd)
9730 driver->hcd_free(hcd);
9731 ex_err1:
9732 cpe_ehci_stop_hc(dev);
9733 //release_mem_region(dev->res.start, dev->res.end - dev->res.start + 1);
9734 return retval;
9735 }
9736
cpe_ehci_hcd_init_EX(struct hc_driver * driver)9737 static void cpe_ehci_hcd_init_EX(struct hc_driver *driver)
9738 {
9739 memcpy( driver->description , "ehci_hcd", sizeof("ehci_hcd")+1);
9740
9741 /*
9742 * generic hardware linkage
9743 */
9744 driver->irq = ehci_irq;
9745 driver->flags = HCD_MEMORY | HCD_USB2;
9746
9747 /*
9748 * basic lifecycle operations
9749 */
9750 driver->reset = ehci_hc_reset;
9751 driver->start = ehci_start;
9752 driver->suspend = ehci_suspend;
9753 driver->resume = ehci_resume;
9754 driver->stop = ehci_stop;
9755
9756 /*
9757 * memory lifecycle (except per-request)
9758 */
9759 driver->hcd_alloc = ehci_hcd_alloc;
9760 driver->hcd_free = ehci_hcd_free;
9761
9762 /*
9763 * managing i/o requests and associated device resources
9764 */
9765 driver->urb_enqueue = ehci_urb_enqueue;
9766 driver->urb_dequeue = ehci_urb_dequeue;
9767 driver->endpoint_disable = ehci_endpoint_disable;
9768
9769 /*
9770 * scheduling support
9771 */
9772 driver->get_frame_number = ehci_get_frame;
9773
9774 /*
9775 * root hub support
9776 */
9777 driver->hub_status_data = ehci_hub_status_data;
9778 driver->hub_control = ehci_hub_control;
9779 }
9780
9781 extern void InitUSBIntr_EX(struct usb_hcd * hcd);
ehci_hcd_cpe_ehci_drv_probe_EX(struct device_s * _dev)9782 static int ehci_hcd_cpe_ehci_drv_probe_EX(struct device_s *_dev)
9783 {
9784 struct cpe_dev *dev;
9785 struct usb_hcd *hcd = NULL;
9786 int ret;
9787
9788 const struct device_s *__mptr = _dev;
9789 dev = (struct cpe_dev *)( (char *)__mptr - (char *)offsetof(struct cpe_dev,dev) );
9790
9791 if (usb_disabled())
9792 return -ENODEV;
9793
9794 cpe_ehci_hcd_init_EX(&ehci_cpe_hc_driver);
9795 ret = usb_hcd_cpe_ehci_probe_EX(&ehci_cpe_hc_driver, &hcd, dev);
9796
9797 if (ret == 0)
9798 {
9799 diag_printf("ehci_hcd_cpe_ehci_drv_probe_EX -> allocate usb_hcd\n");
9800 dev->dev.driver_data = hcd;
9801 InitUSBIntr_EX(hcd);
9802 }
9803
9804 return ret;
9805 }
9806
9807 /*-------------------------------------------------------------------------*/
ehci_hcd_cpe_driver_init_EX(void)9808 int __init ehci_hcd_cpe_driver_init_EX(void)
9809 {
9810 static int init_once = 0;
9811 if (init_once)
9812 return 0;
9813 init_once = 1;
9814 pr_debug ("ehci_hcd: block sizes: qh %d qtd %d itd %d sitd %d\n",
9815 sizeof (struct ehci_qh), sizeof (struct ehci_qtd),
9816 sizeof (struct ehci_itd), sizeof (struct ehci_sitd));
9817 strncpy(ehci_hcd_cpe_driver.drv.name, "cpe_ehci_drv", sizeof("cpe_ehci_drv"));
9818 ehci_hcd_cpe_driver.drv.bus = &CPE_AMBA_bus_type_EX;
9819 ehci_hcd_cpe_driver.drv.probe = ehci_hcd_cpe_ehci_drv_probe_EX;
9820 ehci_hcd_cpe_driver.drv.remove = ehci_hcd_cpe_ehci_drv_remove;
9821 ehci_hcd_cpe_driver.drv.suspend = ehci_hcd_cpe_ehci_drv_suspend;
9822 ehci_hcd_cpe_driver.drv.resume = ehci_hcd_cpe_ehci_drv_resume;
9823 ehci_hcd_cpe_driver.devid = 0x1234;
9824 return driver_register(&ehci_hcd_cpe_driver.drv);
9825 }
9826
ehci_cpe_dev_init_EX(struct cpe_dev * dev)9827 int __init ehci_cpe_dev_init_EX(struct cpe_dev * dev)
9828 {
9829 struct s_gVar4UsbPort *p_rootHub = cpe_to_gVar(dev);
9830
9831 // Cannot remove: Init list heads of device and driver lists of CPE EHCI device
9832 device_initialize(&dev->dev);
9833 #ifdef DEBUG
9834 //dbg (DRIVER_INFO " Init CPE EHCI Host Controller%s"," ");
9835 #endif
9836 // Init CPE EHCI device data structure
9837 dev->dev.parent = NULL; //parent should be CPE AMBA
9838 strncpy(dev->dev.name,p_rootHub->cpe_dev_info.devname, sizeof(p_rootHub->cpe_dev_info.devname));
9839 strncpy(dev->dev.bus_id,"AHB_EHCI", sizeof("AHB_EHCI"));
9840 dev->dev.bus = &CPE_AMBA_bus_type_EX;
9841 dev->devid = p_rootHub->cpe_dev_info.devid;
9842 dev->dma_mask = 0x00; //Unsupport DMA
9843 //register cpe_ehci devie to CPE AMBA bus
9844 device_add(&dev->dev);
9845
9846 return ehci_hcd_cpe_driver_init_EX();
9847 }
9848
9849 #if USB_IF_EHSET_SUPPORT // Embedded host electrical test procedure
9850 struct list_head *
qh_urb_transaction_EHSET(struct ehci_hcd * ehci,struct urb * urb,struct list_head * head,int flags,int stage)9851 qh_urb_transaction_EHSET (
9852 struct ehci_hcd *ehci,
9853 struct urb *urb,
9854 struct list_head *head,
9855 int flags,
9856 int stage
9857 ) {
9858 struct ehci_qtd *qtd, *qtd_prev;
9859 dma_addr_t buf;
9860 int len, maxpacket;
9861 int is_input;
9862 U32 token;
9863 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9864 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9865 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9866 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9867 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9868 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9869 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9870 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9871 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9872 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9873 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9874 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9875 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9876 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9877 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9878 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9879 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9880 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9881 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9882 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9883 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9884 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9885 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9886 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9887 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9888 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9889 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9890 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9891 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9892 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9893 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9894 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9895 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9896 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9897 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9898 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9899 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9900 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9901 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9902 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9903 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9904 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9905 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9906 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9907 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9908 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9909 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9910 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9911
9912 qtd = ehci_qtd_alloc (ehci, flags);
9913 if (unlikely (!qtd))
9914 return 0;
9915 list_add_tail (&qtd->qtd_list, head);
9916 qtd->urb = urb;
9917
9918 token = QTD_STS_ACTIVE;
9919 token |= (EHCI_TUNE_CERR << 10);
9920
9921 len = urb->transfer_buffer_length;
9922 is_input = usb_pipein (urb->pipe);
9923 if (!stage)
9924 {
9925 if (usb_pipecontrol (urb->pipe)) {
9926 qtd_fill (qtd, urb->setup_dma, sizeof (struct usb_ctrlrequest),
9927 token | (2 /* "setup" */ << 8), 8);
9928 qtd->hw_alt_next = EHCI_LIST_END; // EHSET
9929
9930 token ^= QTD_TOGGLE;
9931 }
9932
9933 if (likely (!(urb->transfer_flags & URB_NO_INTERRUPT)))
9934 qtd->hw_token |= CPUToLE32 (QTD_IOC); // EHSET
9935 return head;
9936 }
9937 else
9938 token ^= QTD_TOGGLE;
9939
9940 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9941 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9942 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9943 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9944 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9945 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9946 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9947 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9948 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9949 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9950 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9951 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9952 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9953 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9954 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9955 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9956 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9957 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9958 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9959 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9960 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9961 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9962 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9963 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9964 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9965 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9966 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9967 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9968 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9969 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9970 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9971 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9972 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9973 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9974 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9975 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9976 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9977 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9978 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9979 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9980 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9981 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9982 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9983 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9984 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9985 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9986 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9987 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9988 if (likely (len > 0))
9989 buf = urb->transfer_dma;
9990 else
9991 buf = 0;
9992
9993 if (!buf || is_input)
9994 token |= (1 /* "in" */ << 8);
9995 if (usb_pipebulk(urb->pipe)) {
9996 switch (urb->dev->speed) {
9997 case USB_SPEED_FULL:
9998 maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
9999 break;
10000 case USB_SPEED_HIGH:
10001 default:
10002 maxpacket = 512;
10003 break;
10004 }
10005 }
10006 else {
10007 maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
10008 }
10009 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10010 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10011 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10012 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10013 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10014 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10015 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10016 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10017 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10018 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10019 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10020 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10021 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10022 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10023 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10024 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10025 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10026 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10027 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10028 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10029 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10030 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10031 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10032 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10033 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10034 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10035 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10036 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10037 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10038 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10039 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10040 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10041 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10042 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10043 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10044 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10045 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10046 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10047 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10048 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10049 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10050 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10051 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10052 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10053 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10054 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10055 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10056 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10057
10058 for (;;) {
10059 int this_qtd_len;
10060
10061 this_qtd_len = qtd_fill (qtd, buf, len, token, maxpacket);
10062 len -= this_qtd_len;
10063 buf += this_qtd_len;
10064 if (is_input)
10065 qtd->hw_alt_next = ehci->async->hw_alt_next;
10066 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10067 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10068 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10069 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10070 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10071 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10072 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10073 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10074 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10075 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10076 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10077 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10078 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10079 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10080 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10081 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10082 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10083 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10084 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10085 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10086 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10087 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10088 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10089 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10090 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10091 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10092 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10093 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10094 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10095 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10096 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10097 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10098 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10099 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10100 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10101 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10102 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10103 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10104 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10105 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10106 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10107 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10108 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10109 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10110 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10111 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10112 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10113 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10114
10115 if ((maxpacket & (this_qtd_len + (maxpacket - 1))) == 0)
10116 token ^= QTD_TOGGLE;
10117
10118 if (likely (len <= 0))
10119 break;
10120 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10121 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10122 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10123 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10124 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10125 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10126 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10127 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10128 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10129 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10130 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10131 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10132 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10133 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10134 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10135 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10136 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10137 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10138 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10139 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10140 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10141 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10142 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10143 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10144 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10145 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10146 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10147 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10148 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10149 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10150 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10151 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10152 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10153 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10154 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10155 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10156 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10157 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10158 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10159 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10160 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10161 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10162 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10163 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10164 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10165 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10166 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10167 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10168
10169 qtd_prev = qtd;
10170 qtd = ehci_qtd_alloc (ehci, flags);
10171 if (unlikely (!qtd))
10172 goto cleanup;
10173 qtd->urb = urb;
10174 qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);
10175 list_add_tail (&qtd->qtd_list, head);
10176 }
10177 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10178 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10179 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10180 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10181 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10182 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10183 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10184 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10185 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10186 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10187 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10188 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10189 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10190 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10191 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10192 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10193 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10194 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10195 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10196 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10197 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10198 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10199 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10200 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10201 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10202 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10203 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10204 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10205 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10206 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10207 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10208 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10209 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10210 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10211 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10212 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10213 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10214 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10215 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10216 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10217 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10218 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10219 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10220 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10221 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10222 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10223 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10224 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10225
10226 if (likely ((urb->transfer_flags & URB_SHORT_NOT_OK) == 0
10227 || usb_pipecontrol (urb->pipe)))
10228 qtd->hw_alt_next = EHCI_LIST_END;
10229
10230 if (likely (buf != 0)) {
10231 int one_more = 0;
10232
10233 if (usb_pipecontrol (urb->pipe)) {
10234 one_more = 1;
10235 token ^= 0x0100; /* "in" <--> "out" */
10236 token |= QTD_TOGGLE; /* force DATA1 */
10237 } else if (usb_pipebulk (urb->pipe)
10238 && (urb->transfer_flags & URB_ZERO_PACKET)
10239 && !(urb->transfer_buffer_length % maxpacket)) {
10240 one_more = 1;
10241 }
10242 if (one_more) {
10243 qtd_prev = qtd;
10244 qtd = ehci_qtd_alloc (ehci, flags);
10245 if (unlikely (!qtd))
10246 goto cleanup;
10247 qtd->urb = urb;
10248 qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);
10249 list_add_tail (&qtd->qtd_list, head);
10250
10251 qtd_fill (qtd, 0, 0, token, 0);
10252 }
10253 }
10254 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10255 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10256 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10257 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10258 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10259 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10260 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10261 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10262 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10263 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10264 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10265 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10266 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10267 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10268 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10269 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10270 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10271 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10272 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10273 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10274 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10275 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10276 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10277 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10278 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10279 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10280 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10281 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10282 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10283 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10284 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10285 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10286 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10287 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10288 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10289 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10290 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10291 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10292 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10293 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10294 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10295 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10296 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10297 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10298 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10299 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10300 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10301 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10302
10303 if (likely (!(urb->transfer_flags & URB_NO_INTERRUPT)))
10304 qtd->hw_token |= CPUToLE32 (QTD_IOC);
10305
10306 return head;
10307
10308 cleanup:
10309
10310 qtd_list_free (ehci, urb, head);
10311 return 0;
10312 }
10313
submit_async_EHSET(struct ehci_hcd * ehci,struct urb * urb,struct list_head * qtd_list,int mem_flags)10314 inline int submit_async_EHSET (
10315 struct ehci_hcd *ehci,
10316 struct urb *urb,
10317 struct list_head *qtd_list,
10318 int mem_flags
10319 ) {
10320 return submit_async(ehci, urb, qtd_list, mem_flags);
10321 }
10322 #endif
10323