xref: /utopia/UTPA2-700.0.x/modules/usb/drv/usb_ecos/usbhost/drvEhciHcd.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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