1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi // Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi // No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi // modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi // supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi // Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi // Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi // obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi // such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi // MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi // confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi // third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi // kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi // without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi // intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi // and in conformity with any international standard. You agree to waive any
38*53ee8cc1Swenshuai.xi // claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi // incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi // In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi // consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi // revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi // You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi // even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi // request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi // parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi // services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi // MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi // ("Services").
52*53ee8cc1Swenshuai.xi // You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi // writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi // disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi // or otherwise:
58*53ee8cc1Swenshuai.xi // (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi // mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi // (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi // including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi // of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi // (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi // of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi // Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi // settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi // Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi // with the said Rules.
72*53ee8cc1Swenshuai.xi // The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi // be English.
74*53ee8cc1Swenshuai.xi // The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi
79*53ee8cc1Swenshuai.xi #include "include/drvConfig.h"
80*53ee8cc1Swenshuai.xi
81*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_DEBUG
82*53ee8cc1Swenshuai.xi #define DEBUG
83*53ee8cc1Swenshuai.xi #else
84*53ee8cc1Swenshuai.xi #undef DEBUG
85*53ee8cc1Swenshuai.xi #endif
86*53ee8cc1Swenshuai.xi
87*53ee8cc1Swenshuai.xi #include <MsCommon.h>
88*53ee8cc1Swenshuai.xi #include "include/drvCompiler.h"
89*53ee8cc1Swenshuai.xi #include "include/drvPorts.h"
90*53ee8cc1Swenshuai.xi #include "include/drvErrno.h"
91*53ee8cc1Swenshuai.xi #include "include/drvIO.h"
92*53ee8cc1Swenshuai.xi #include "include/drvPCIMEM.h"
93*53ee8cc1Swenshuai.xi #include "include/drvList.h"
94*53ee8cc1Swenshuai.xi #include "include/drvTimer.h"
95*53ee8cc1Swenshuai.xi #include "include/drvKernel.h"
96*53ee8cc1Swenshuai.xi // USB related implemented header files
97*53ee8cc1Swenshuai.xi #include "include/drvUSB.h"
98*53ee8cc1Swenshuai.xi #include "drvHCD.h"
99*53ee8cc1Swenshuai.xi #include "include/drvCPE_EHCI.h"
100*53ee8cc1Swenshuai.xi #include "drvEHCI.h"
101*53ee8cc1Swenshuai.xi #include "drvUSBHwCtl.h"
102*53ee8cc1Swenshuai.xi #include "include/drvCPE_AMBA.h"
103*53ee8cc1Swenshuai.xi #include "drvUsbcommon.h"
104*53ee8cc1Swenshuai.xi #include "drvUSB.h"
105*53ee8cc1Swenshuai.xi #if 1
106*53ee8cc1Swenshuai.xi
107*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
108*53ee8cc1Swenshuai.xi
109*53ee8cc1Swenshuai.xi
110*53ee8cc1Swenshuai.xi #define DRIVER_VERSION "2003-Jun-13"
111*53ee8cc1Swenshuai.xi #define DRIVER_AUTHOR "xxx"
112*53ee8cc1Swenshuai.xi #define DRIVER_DESC "USB 2.0 'Enhanced' Host Controller (EHCI) Driver"
113*53ee8cc1Swenshuai.xi
114*53ee8cc1Swenshuai.xi // #define EHCI_VERBOSE_DEBUG
115*53ee8cc1Swenshuai.xi // #define have_split_iso
116*53ee8cc1Swenshuai.xi
117*53ee8cc1Swenshuai.xi #ifdef DEBUG
118*53ee8cc1Swenshuai.xi #define EHCI_STATS
119*53ee8cc1Swenshuai.xi #endif
120*53ee8cc1Swenshuai.xi
121*53ee8cc1Swenshuai.xi /* magic numbers that can affect system performance */
122*53ee8cc1Swenshuai.xi #define EHCI_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */
123*53ee8cc1Swenshuai.xi #define EHCI_TUNE_RL_HS 4 /* nak throttle; see 4.9 */
124*53ee8cc1Swenshuai.xi #define EHCI_TUNE_RL_TT 0
125*53ee8cc1Swenshuai.xi #define EHCI_TUNE_MULT_HS 1 /* 1-3 transactions/uframe; 4.10.3 */
126*53ee8cc1Swenshuai.xi #define EHCI_TUNE_MULT_TT 1
127*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
128*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
129*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
130*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
131*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
132*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
133*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
134*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
135*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
136*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
137*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
138*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
139*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
140*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
141*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
142*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
143*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
144*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
145*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
146*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
147*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
148*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
149*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
150*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
151*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
152*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
153*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
154*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
155*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
156*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
157*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
158*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
159*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
160*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
161*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
162*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
163*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
164*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
165*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
166*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
167*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
168*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
169*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
170*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
171*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
172*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
173*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
174*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
175*53ee8cc1Swenshuai.xi
176*53ee8cc1Swenshuai.xi #ifdef CONFIG_HC_TEST
177*53ee8cc1Swenshuai.xi #define EHCI_TUNE_FLS 0 /* 1024 frame for schedule */
178*53ee8cc1Swenshuai.xi #else
179*53ee8cc1Swenshuai.xi #define EHCI_TUNE_FLS 2 /* (small) 256 frame schedule */
180*53ee8cc1Swenshuai.xi #endif
181*53ee8cc1Swenshuai.xi /* Initial IRQ latency: lower than default */
182*53ee8cc1Swenshuai.xi static int log2_irq_thresh = 0; // 0 to 6
183*53ee8cc1Swenshuai.xi #ifdef ROOTHUB_INTERRUPT_MODE
184*53ee8cc1Swenshuai.xi #define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT)
185*53ee8cc1Swenshuai.xi #else
186*53ee8cc1Swenshuai.xi #define INTR_MASK (STS_IAA | STS_FATAL | STS_ERR | STS_INT)
187*53ee8cc1Swenshuai.xi #endif
188*53ee8cc1Swenshuai.xi
189*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
190*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
191*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
192*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
193*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
194*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
195*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
196*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
197*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
198*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
199*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
200*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
201*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
202*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
203*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
204*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
205*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
206*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
207*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
208*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
209*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
210*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
211*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
212*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
213*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
214*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
215*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
216*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
217*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
218*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
219*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
220*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
221*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
222*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
223*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
224*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
225*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
226*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
227*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
228*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
229*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
230*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
231*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
232*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
233*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
234*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
235*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
236*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
237*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
238*53ee8cc1Swenshuai.xi
239*53ee8cc1Swenshuai.xi #include "drvEHCI.h"
240*53ee8cc1Swenshuai.xi #include "drvHCDDBG.cpp"
241*53ee8cc1Swenshuai.xi #include "drvEHCIDBG.cpp"
242*53ee8cc1Swenshuai.xi
243*53ee8cc1Swenshuai.xi struct usb_hcd *g_pUsbHcd = NULL;
244*53ee8cc1Swenshuai.xi extern struct cpe_dev cpe_ehci_dev;
245*53ee8cc1Swenshuai.xi extern struct cpe_dev cpe_ehci_dev_Port2;
246*53ee8cc1Swenshuai.xi
247*53ee8cc1Swenshuai.xi extern int hub_port_disable(struct usb_device *hub, int port);
248*53ee8cc1Swenshuai.xi
249*53ee8cc1Swenshuai.xi extern struct list_head hub_event_list;
250*53ee8cc1Swenshuai.xi extern void init_OS_Resource_EX(S32 *USBWaitFlg);
251*53ee8cc1Swenshuai.xi extern void ehci_StopRun_Setting(MS_U8 bOption, struct ehci_hcd *ehci);
252*53ee8cc1Swenshuai.xi extern void Chip_Flush_Memory(void);
253*53ee8cc1Swenshuai.xi
254*53ee8cc1Swenshuai.xi
handshake(U32 * ptr,U32 mask,U32 done,int usec)255*53ee8cc1Swenshuai.xi static int handshake (U32 *ptr, U32 mask, U32 done, int usec)
256*53ee8cc1Swenshuai.xi {
257*53ee8cc1Swenshuai.xi U32 result;
258*53ee8cc1Swenshuai.xi
259*53ee8cc1Swenshuai.xi do {
260*53ee8cc1Swenshuai.xi result = ehci_readl ((U32)ptr);
261*53ee8cc1Swenshuai.xi if (result == ~(U32)0) /* card removed */
262*53ee8cc1Swenshuai.xi return -ENODEV;
263*53ee8cc1Swenshuai.xi
264*53ee8cc1Swenshuai.xi result &= mask;
265*53ee8cc1Swenshuai.xi if (result == done)
266*53ee8cc1Swenshuai.xi return 0;
267*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
268*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
269*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
270*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
271*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
272*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
273*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
274*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
275*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
276*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
277*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
278*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
279*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
280*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
281*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
282*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
283*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
284*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
285*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
286*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
287*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
288*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
289*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
290*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
291*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
292*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
293*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
294*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
295*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
296*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
297*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
298*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
299*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
300*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
301*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
302*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
303*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
304*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
305*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
306*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
307*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
308*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
309*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
310*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
311*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
312*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
313*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
314*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
315*53ee8cc1Swenshuai.xi
316*53ee8cc1Swenshuai.xi udelay (1);
317*53ee8cc1Swenshuai.xi usec--;
318*53ee8cc1Swenshuai.xi } while (usec > 0);
319*53ee8cc1Swenshuai.xi
320*53ee8cc1Swenshuai.xi return -ETIMEDOUT;
321*53ee8cc1Swenshuai.xi }
322*53ee8cc1Swenshuai.xi
323*53ee8cc1Swenshuai.xi
ehci_halt(struct ehci_hcd * ehci)324*53ee8cc1Swenshuai.xi static int ehci_halt (struct ehci_hcd *ehci)
325*53ee8cc1Swenshuai.xi {
326*53ee8cc1Swenshuai.xi U32 temp = ehci_readl ((U32)&ehci->regs->status);
327*53ee8cc1Swenshuai.xi
328*53ee8cc1Swenshuai.xi if ((temp & STS_HALT) != 0)
329*53ee8cc1Swenshuai.xi return 0;
330*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
331*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
332*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
333*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
334*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
335*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
336*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
337*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
338*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
339*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
340*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
341*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
342*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
343*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
344*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
345*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
346*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
347*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
348*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
349*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
350*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
351*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
352*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
353*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
354*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
355*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
356*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
357*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
358*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
359*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
360*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
361*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
362*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
363*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
364*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
365*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
366*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
367*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
368*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
369*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
370*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
371*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
372*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
373*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
374*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
375*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
376*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
377*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
378*53ee8cc1Swenshuai.xi
379*53ee8cc1Swenshuai.xi temp = ehci_readl ((U32)&ehci->regs->command);
380*53ee8cc1Swenshuai.xi temp &= ~CMD_RUN;
381*53ee8cc1Swenshuai.xi ehci_writel (temp, (U32)&ehci->regs->command);
382*53ee8cc1Swenshuai.xi diag_printf("ehci_halt\n");
383*53ee8cc1Swenshuai.xi return handshake (&ehci->regs->status, STS_HALT, STS_HALT, 16 * 125);
384*53ee8cc1Swenshuai.xi }
385*53ee8cc1Swenshuai.xi
386*53ee8cc1Swenshuai.xi
ehci_reset(struct ehci_hcd * ehci)387*53ee8cc1Swenshuai.xi static int ehci_reset (struct ehci_hcd *ehci)
388*53ee8cc1Swenshuai.xi {
389*53ee8cc1Swenshuai.xi U32 command = ehci_readl ((U32)&ehci->regs->command);
390*53ee8cc1Swenshuai.xi
391*53ee8cc1Swenshuai.xi //printk("HW SW Reset\n");
392*53ee8cc1Swenshuai.xi command |= CMD_RESET;
393*53ee8cc1Swenshuai.xi dbg_cmd (ehci, "reset", command);
394*53ee8cc1Swenshuai.xi ehci_writel (command, (U32)&ehci->regs->command);
395*53ee8cc1Swenshuai.xi ehci->hcd.state = USB_STATE_HALT;
396*53ee8cc1Swenshuai.xi //Wait for HC reset complete
397*53ee8cc1Swenshuai.xi
398*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
399*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
400*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
401*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
402*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
403*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
404*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
405*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
406*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
407*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
408*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
409*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
410*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
411*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
412*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
413*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
414*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
415*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
416*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
417*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
418*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
419*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
420*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
421*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
422*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
423*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
424*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
425*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
426*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
427*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
428*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
429*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
430*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
431*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
432*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
433*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
434*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
435*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
436*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
437*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
438*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
439*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
440*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
441*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
442*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
443*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
444*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
445*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
446*53ee8cc1Swenshuai.xi command = handshake (&ehci->regs->command, CMD_RESET, 0, 250 * 1000);
447*53ee8cc1Swenshuai.xi
448*53ee8cc1Swenshuai.xi //Set EOF1
449*53ee8cc1Swenshuai.xi //writel(readl(0xC2000000+0x40)& (~(3<<2)),0xC2000000+0x40);
450*53ee8cc1Swenshuai.xi //mwOTG20_EOF1_Set(); // Set EOF1 360 clocks
451*53ee8cc1Swenshuai.xi
452*53ee8cc1Swenshuai.xi return command;
453*53ee8cc1Swenshuai.xi }
454*53ee8cc1Swenshuai.xi
ehci_ready(struct ehci_hcd * ehci)455*53ee8cc1Swenshuai.xi static void ehci_ready (struct ehci_hcd *ehci)
456*53ee8cc1Swenshuai.xi {
457*53ee8cc1Swenshuai.xi U32 temp;
458*53ee8cc1Swenshuai.xi
459*53ee8cc1Swenshuai.xi #ifdef DEBUG
460*53ee8cc1Swenshuai.xi if (!HCD_IS_RUNNING (ehci->hcd.state))
461*53ee8cc1Swenshuai.xi BUG ();
462*53ee8cc1Swenshuai.xi #endif
463*53ee8cc1Swenshuai.xi
464*53ee8cc1Swenshuai.xi /* wait for any schedule enables/disables to take effect */
465*53ee8cc1Swenshuai.xi #if 0
466*53ee8cc1Swenshuai.xi temp = 0;
467*53ee8cc1Swenshuai.xi if (ehci->async->qh_next.qh)
468*53ee8cc1Swenshuai.xi temp = STS_ASS;
469*53ee8cc1Swenshuai.xi if (ehci->next_uframe != -1)
470*53ee8cc1Swenshuai.xi temp |= STS_PSS;
471*53ee8cc1Swenshuai.xi if (handshake (&ehci->regs->status, STS_ASS | STS_PSS,
472*53ee8cc1Swenshuai.xi temp, 16 * 125) != 0) {
473*53ee8cc1Swenshuai.xi ehci->hcd.state = USB_STATE_HALT;
474*53ee8cc1Swenshuai.xi printk("Got problem,check it out, qHD is %p\n",ehci->async->qh_next.qh);
475*53ee8cc1Swenshuai.xi while(1);
476*53ee8cc1Swenshuai.xi return;
477*53ee8cc1Swenshuai.xi }
478*53ee8cc1Swenshuai.xi #endif
479*53ee8cc1Swenshuai.xi
480*53ee8cc1Swenshuai.xi /* then disable anything that's still active */
481*53ee8cc1Swenshuai.xi
482*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
483*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
484*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
485*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
486*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
487*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
488*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
489*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
490*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
491*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
492*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
493*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
494*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
495*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
496*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
497*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
498*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
499*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
500*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
501*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
502*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
503*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
504*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
505*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
506*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
507*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
508*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
509*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
510*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
511*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
512*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
513*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
514*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
515*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
516*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
517*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
518*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
519*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
520*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
521*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
522*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
523*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
524*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
525*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
526*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
527*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
528*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
529*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
530*53ee8cc1Swenshuai.xi temp = ehci_readl ((U32)&ehci->regs->command);
531*53ee8cc1Swenshuai.xi temp &= ~(CMD_ASE | CMD_IAAD | CMD_PSE);
532*53ee8cc1Swenshuai.xi ehci_writel (temp, (U32)&ehci->regs->command);
533*53ee8cc1Swenshuai.xi
534*53ee8cc1Swenshuai.xi /* hardware can take 16 microframes to turn off ... */
535*53ee8cc1Swenshuai.xi if (handshake (&ehci->regs->status, STS_ASS | STS_PSS,
536*53ee8cc1Swenshuai.xi 0, 16 * 125) != 0) {
537*53ee8cc1Swenshuai.xi usb_err("Cannot stop scheduler%s","\n");
538*53ee8cc1Swenshuai.xi ehci->hcd.state = USB_STATE_HALT;
539*53ee8cc1Swenshuai.xi return;
540*53ee8cc1Swenshuai.xi }
541*53ee8cc1Swenshuai.xi }
542*53ee8cc1Swenshuai.xi
543*53ee8cc1Swenshuai.xi /*
544*53ee8cc1Swenshuai.xi * EHCI Root Hub ... the nonsharable stuff
545*53ee8cc1Swenshuai.xi *
546*53ee8cc1Swenshuai.xi */
547*53ee8cc1Swenshuai.xi
548*53ee8cc1Swenshuai.xi
549*53ee8cc1Swenshuai.xi #if 1
check_reset_complete(struct ehci_hcd * ehci,int index,int port_status)550*53ee8cc1Swenshuai.xi static int check_reset_complete (
551*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci,
552*53ee8cc1Swenshuai.xi int index,
553*53ee8cc1Swenshuai.xi int port_status)
554*53ee8cc1Swenshuai.xi {
555*53ee8cc1Swenshuai.xi if (!(port_status & PORT_CONNECT)) {
556*53ee8cc1Swenshuai.xi ehci->reset_done [index] = 0;
557*53ee8cc1Swenshuai.xi return port_status;
558*53ee8cc1Swenshuai.xi }
559*53ee8cc1Swenshuai.xi
560*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
561*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
562*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
563*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
564*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
565*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
566*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
567*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
568*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
569*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
570*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
571*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
572*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
573*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
574*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
575*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
576*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
577*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
578*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
579*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
580*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
581*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
582*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
583*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
584*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
585*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
586*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
587*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
588*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
589*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
590*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
591*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
592*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
593*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
594*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
595*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
596*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
597*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
598*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
599*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
600*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
601*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
602*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
603*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
604*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
605*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
606*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
607*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
608*53ee8cc1Swenshuai.xi //#ifndef CONFIG_FARADAY_FOTG200
609*53ee8cc1Swenshuai.xi #if 0
610*53ee8cc1Swenshuai.xi /* if reset finished and it's still not enabled -- handoff */
611*53ee8cc1Swenshuai.xi if (!(port_status & PORT_PE)) {
612*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "port %d full speed --> companion%s",
613*53ee8cc1Swenshuai.xi index + 1, "\n");
614*53ee8cc1Swenshuai.xi
615*53ee8cc1Swenshuai.xi // what happens if HCS_N_CC(params) == 0 ?
616*53ee8cc1Swenshuai.xi port_status |= PORT_OWNER;
617*53ee8cc1Swenshuai.xi ehci_writel (port_status, (U32)&ehci->regs->port_status [index]);
618*53ee8cc1Swenshuai.xi } else
619*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "port %d high speed%s", index + 1,"\n");
620*53ee8cc1Swenshuai.xi #endif
621*53ee8cc1Swenshuai.xi return port_status;
622*53ee8cc1Swenshuai.xi }
623*53ee8cc1Swenshuai.xi
624*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
625*53ee8cc1Swenshuai.xi
626*53ee8cc1Swenshuai.xi
627*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
628*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
629*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
630*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
631*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
632*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
633*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
634*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
635*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
636*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
637*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
638*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
639*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
640*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
641*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
642*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
643*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
644*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
645*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
646*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
647*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
648*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
649*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
650*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
651*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
652*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
653*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
654*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
655*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
656*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
657*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
658*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
659*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
660*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
661*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
662*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
663*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
664*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
665*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
666*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
667*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
668*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
669*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
670*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
671*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
672*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
673*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
674*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
675*53ee8cc1Swenshuai.xi
676*53ee8cc1Swenshuai.xi int
ehci_hub_status_data(struct usb_hcd * hcd,char * buf)677*53ee8cc1Swenshuai.xi ehci_hub_status_data (struct usb_hcd *hcd, char *buf)
678*53ee8cc1Swenshuai.xi {
679*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci (hcd);
680*53ee8cc1Swenshuai.xi U32 temp, status = 0;
681*53ee8cc1Swenshuai.xi int ports, i, retval = 1;
682*53ee8cc1Swenshuai.xi U32 flags;
683*53ee8cc1Swenshuai.xi
684*53ee8cc1Swenshuai.xi /* init status to no-changes */
685*53ee8cc1Swenshuai.xi buf [0] = 0;
686*53ee8cc1Swenshuai.xi ports = HCS_N_PORTS (ehci->hcs_params);
687*53ee8cc1Swenshuai.xi if (ports > 7) {
688*53ee8cc1Swenshuai.xi buf [1] = 0;
689*53ee8cc1Swenshuai.xi retval++;
690*53ee8cc1Swenshuai.xi }
691*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
692*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
693*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
694*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
695*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
696*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
697*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
698*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
699*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
700*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
701*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
702*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
703*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
704*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
705*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
706*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
707*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
708*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
709*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
710*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
711*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
712*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
713*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
714*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
715*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
716*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
717*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
718*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
719*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
720*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
721*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
722*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
723*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
724*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
725*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
726*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
727*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
728*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
729*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
730*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
731*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
732*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
733*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
734*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
735*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
736*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
737*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
738*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
739*53ee8cc1Swenshuai.xi
740*53ee8cc1Swenshuai.xi /* no hub change reports (bit 0) for now (power, ...) */
741*53ee8cc1Swenshuai.xi
742*53ee8cc1Swenshuai.xi /* port N changes (bit N)? */
743*53ee8cc1Swenshuai.xi spin_lock_irqsave (&ehci->lock, flags);
744*53ee8cc1Swenshuai.xi for (i = 0; i < ports; i++) {
745*53ee8cc1Swenshuai.xi temp = ehci_readl ((U32)&ehci->regs->port_status[i]);
746*53ee8cc1Swenshuai.xi //diag_printf("<ehci_hub_status_data> temp: %lx, pre_sts: %lx @ root hub %d\n", temp, hcd->pre_sts, hcd->host_id);
747*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
748*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
749*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
750*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
751*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
752*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
753*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
754*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
755*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
756*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
757*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
758*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
759*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
760*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
761*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
762*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
763*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
764*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
765*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
766*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
767*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
768*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
769*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
770*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
771*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
772*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
773*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
774*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
775*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
776*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
777*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
778*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
779*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
780*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
781*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
782*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
783*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
784*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
785*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
786*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
787*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
788*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
789*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
790*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
791*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
792*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
793*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
794*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
795*53ee8cc1Swenshuai.xi
796*53ee8cc1Swenshuai.xi if ( ((temp & PORT_CONNECT) == 0) && ((hcd->pre_sts & PORT_CONNECT) != 0) )
797*53ee8cc1Swenshuai.xi {
798*53ee8cc1Swenshuai.xi diag_printf("<ehci_hub_status_data> Add CSC @ root hub %d, DISCONNECT!\n", hcd->host_id);
799*53ee8cc1Swenshuai.xi temp |= PORT_CSC;
800*53ee8cc1Swenshuai.xi }
801*53ee8cc1Swenshuai.xi hcd->pre_sts = temp;
802*53ee8cc1Swenshuai.xi
803*53ee8cc1Swenshuai.xi //#ifndef CONFIG_FARADAY_FOTG200
804*53ee8cc1Swenshuai.xi #if 0
805*53ee8cc1Swenshuai.xi if (temp & PORT_OWNER) {
806*53ee8cc1Swenshuai.xi /* don't report this in GetPortStatus */
807*53ee8cc1Swenshuai.xi if (temp & PORT_CSC) {
808*53ee8cc1Swenshuai.xi temp &= ~PORT_CSC;
809*53ee8cc1Swenshuai.xi ehci_writel (temp, (U32)&ehci->regs->port_status [i]);
810*53ee8cc1Swenshuai.xi }
811*53ee8cc1Swenshuai.xi continue;
812*53ee8cc1Swenshuai.xi }
813*53ee8cc1Swenshuai.xi #endif
814*53ee8cc1Swenshuai.xi if (!(temp & PORT_CONNECT))
815*53ee8cc1Swenshuai.xi ehci->reset_done [i] = 0;
816*53ee8cc1Swenshuai.xi
817*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
818*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
819*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
820*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
821*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
822*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
823*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
824*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
825*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
826*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
827*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
828*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
829*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
830*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
831*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
832*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
833*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
834*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
835*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
836*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
837*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
838*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
839*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
840*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
841*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
842*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
843*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
844*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
845*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
846*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
847*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
848*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
849*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
850*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
851*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
852*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
853*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
854*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
855*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
856*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
857*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
858*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
859*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
860*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
861*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
862*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
863*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
864*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
865*53ee8cc1Swenshuai.xi /*
866*53ee8cc1Swenshuai.xi if ((temp & mask) != 0 || test_bit(i, &ehci->port_c_suspend)
867*53ee8cc1Swenshuai.xi || (ehci->reset_done[i] && time_after_eq(
868*53ee8cc1Swenshuai.xi jiffies, ehci->reset_done[i]))) {
869*53ee8cc1Swenshuai.xi */
870*53ee8cc1Swenshuai.xi // if ((temp & (PORT_CSC | PORT_PEC | PORT_OCC)) != 0) {
871*53ee8cc1Swenshuai.xi if ((temp & (PORT_CSC)) != 0) {
872*53ee8cc1Swenshuai.xi if (i < 7)
873*53ee8cc1Swenshuai.xi buf [0] |= 1 << (i + 1);
874*53ee8cc1Swenshuai.xi
875*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
876*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
877*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
878*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
879*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
880*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
881*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
882*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
883*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
884*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
885*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
886*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
887*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
888*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
889*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
890*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
891*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
892*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
893*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
894*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
895*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
896*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
897*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
898*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
899*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
900*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
901*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
902*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
903*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
904*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
905*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
906*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
907*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
908*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
909*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
910*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
911*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
912*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
913*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
914*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
915*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
916*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
917*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
918*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
919*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
920*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
921*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
922*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
923*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
924*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
925*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
926*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
927*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
928*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
929*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
930*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
931*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
932*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
933*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
934*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
935*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
936*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
937*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
938*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
939*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
940*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
941*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
942*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
943*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
944*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
945*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
946*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
947*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
948*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
949*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
950*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
951*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
952*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
953*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
954*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
955*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
956*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
957*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
958*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
959*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
960*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
961*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
962*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
963*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
964*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
965*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
966*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
967*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
968*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
969*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
970*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
971*53ee8cc1Swenshuai.xi else
972*53ee8cc1Swenshuai.xi buf [1] |= 1 << (i - 7);
973*53ee8cc1Swenshuai.xi status = STS_PCD;
974*53ee8cc1Swenshuai.xi }
975*53ee8cc1Swenshuai.xi }
976*53ee8cc1Swenshuai.xi spin_unlock_irqrestore (&ehci->lock, flags);
977*53ee8cc1Swenshuai.xi return status ? retval : 0;
978*53ee8cc1Swenshuai.xi }
979*53ee8cc1Swenshuai.xi
980*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
981*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
982*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
983*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
984*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
985*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
986*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
987*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
988*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
989*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
990*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
991*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
992*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
993*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
994*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
995*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
996*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
997*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
998*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
999*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1000*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1001*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1002*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1003*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1004*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1005*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1006*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1007*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1008*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1009*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1010*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1011*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1012*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1013*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1014*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1015*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1016*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1017*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1018*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1019*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1020*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1021*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1022*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1023*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1024*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1025*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1026*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1027*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1028*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1029*53ee8cc1Swenshuai.xi
1030*53ee8cc1Swenshuai.xi static void
ehci_hub_descriptor(struct ehci_hcd * ehci,struct usb_hub_descriptor * desc)1031*53ee8cc1Swenshuai.xi ehci_hub_descriptor (
1032*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci,
1033*53ee8cc1Swenshuai.xi struct usb_hub_descriptor *desc
1034*53ee8cc1Swenshuai.xi ) {
1035*53ee8cc1Swenshuai.xi int ports = HCS_N_PORTS (ehci->hcs_params);
1036*53ee8cc1Swenshuai.xi U16 temp;
1037*53ee8cc1Swenshuai.xi
1038*53ee8cc1Swenshuai.xi desc->bDescriptorType = 0x29;
1039*53ee8cc1Swenshuai.xi desc->bPwrOn2PwrGood = 0;
1040*53ee8cc1Swenshuai.xi desc->bHubContrCurrent = 0;
1041*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1042*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1043*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1044*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1045*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1046*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1047*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1048*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1049*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1050*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1051*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1052*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1053*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1054*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1055*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1056*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1057*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1058*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1059*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1060*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1061*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1062*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1063*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1064*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1065*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1066*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1067*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1068*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1069*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1070*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1071*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1072*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1073*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1074*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1075*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1076*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1077*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1078*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1079*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1080*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1081*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1082*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1083*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1084*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1085*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1086*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1087*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1088*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1089*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1090*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1091*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1092*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1093*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1094*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1095*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1096*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1097*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1098*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1099*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1100*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1101*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1102*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1103*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1104*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1105*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1106*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1107*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1108*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1109*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1110*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1111*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1112*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1113*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1114*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1115*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1116*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1117*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1118*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1119*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1120*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1121*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1122*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1123*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1124*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1125*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1126*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1127*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1128*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1129*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1130*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1131*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1132*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1133*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1134*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1135*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1136*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1137*53ee8cc1Swenshuai.xi
1138*53ee8cc1Swenshuai.xi desc->bNbrPorts = ports;
1139*53ee8cc1Swenshuai.xi temp = 1 + (ports / 8);
1140*53ee8cc1Swenshuai.xi desc->bDescLength = 7 + 2 * temp;
1141*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1142*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1143*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1144*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1145*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1146*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1147*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1148*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1149*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1150*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1151*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1152*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1153*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1154*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1155*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1156*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1157*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1158*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1159*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1160*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1161*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1162*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1163*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1164*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1165*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1166*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1167*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1168*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1169*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1170*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1171*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1172*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1173*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1174*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1175*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1176*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1177*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1178*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1179*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1180*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1181*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1182*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1183*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1184*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1185*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1186*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1187*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1188*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1189*53ee8cc1Swenshuai.xi
1190*53ee8cc1Swenshuai.xi /* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */
1191*53ee8cc1Swenshuai.xi memset (&desc->bitmap [0], 0, temp);
1192*53ee8cc1Swenshuai.xi memset (&desc->bitmap [temp], 0xff, temp);
1193*53ee8cc1Swenshuai.xi
1194*53ee8cc1Swenshuai.xi temp = 0x0008; /* per-port overcurrent reporting */
1195*53ee8cc1Swenshuai.xi if (HCS_PPC (ehci->hcs_params))
1196*53ee8cc1Swenshuai.xi temp |= 0x0001; /* per-port power control */
1197*53ee8cc1Swenshuai.xi if (HCS_INDICATOR (ehci->hcs_params))
1198*53ee8cc1Swenshuai.xi temp |= 0x0080; /* per-port indicators (LEDs) */
1199*53ee8cc1Swenshuai.xi desc->wHubCharacteristics = CPUToLE16(temp);
1200*53ee8cc1Swenshuai.xi }
1201*53ee8cc1Swenshuai.xi
1202*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
ehci_hc_swreset(struct ehci_hcd * ehci)1203*53ee8cc1Swenshuai.xi void ehci_hc_swreset(struct ehci_hcd *ehci)
1204*53ee8cc1Swenshuai.xi {
1205*53ee8cc1Swenshuai.xi U32 regTmp[4];
1206*53ee8cc1Swenshuai.xi
1207*53ee8cc1Swenshuai.xi //FIXME: cover FOTG200 bug
1208*53ee8cc1Swenshuai.xi //Reset HC to cover FOTG2000 implementation limitation
1209*53ee8cc1Swenshuai.xi //Do not do hc_reset at HCP section
1210*53ee8cc1Swenshuai.xi //if ( mdwOTGC_Control_A_SET_B_HNP_EN_Rd() == 0 )
1211*53ee8cc1Swenshuai.xi {
1212*53ee8cc1Swenshuai.xi // regTmp[2] = mdwFOTGPort(0x80);
1213*53ee8cc1Swenshuai.xi // regTmp[3] = mdwFOTGPort(0x88);
1214*53ee8cc1Swenshuai.xi regTmp[0] = ehci_readl((U32)&ehci->regs->command);
1215*53ee8cc1Swenshuai.xi regTmp[1] = ehci_readl((U32)&ehci->regs->intr_enable);
1216*53ee8cc1Swenshuai.xi // HC soft reset
1217*53ee8cc1Swenshuai.xi ehci_reset(ehci);
1218*53ee8cc1Swenshuai.xi // Device Soft Reset
1219*53ee8cc1Swenshuai.xi /*
1220*53ee8cc1Swenshuai.xi mdwPort(CPE_USB_EHCI_REGBASE,0x100)|=BIT4;
1221*53ee8cc1Swenshuai.xi mdwPort(CPE_USB_EHCI_REGBASE,0x100)&=(~BIT4);
1222*53ee8cc1Swenshuai.xi */
1223*53ee8cc1Swenshuai.xi //#ifdef FORCE_FULL_SPEED
1224*53ee8cc1Swenshuai.xi // Force HC to full speed
1225*53ee8cc1Swenshuai.xi // mwOTG20_Control_ForceFullSpeed_Set();
1226*53ee8cc1Swenshuai.xi // mwOTG20_Control_ForceHighSpeed_Clr();
1227*53ee8cc1Swenshuai.xi // #endif
1228*53ee8cc1Swenshuai.xi //#ifdef FORCE_HIGH_SPEED
1229*53ee8cc1Swenshuai.xi // Force HC to high speed
1230*53ee8cc1Swenshuai.xi // mwOTG20_Control_ForceFullSpeed_Clr();
1231*53ee8cc1Swenshuai.xi // mwOTG20_Control_ForceHighSpeed_Set();
1232*53ee8cc1Swenshuai.xi // #endif
1233*53ee8cc1Swenshuai.xi // mdwFOTGPort(0x80) = regTmp[2];
1234*53ee8cc1Swenshuai.xi // mdwFOTGPort(0x88) = regTmp[3];
1235*53ee8cc1Swenshuai.xi ehci_writel(regTmp[1],(U32)&ehci->regs->intr_enable);
1236*53ee8cc1Swenshuai.xi ehci_writel(regTmp[0],(U32)&ehci->regs->command);
1237*53ee8cc1Swenshuai.xi ehci->hcd.state = USB_STATE_RUNNING;
1238*53ee8cc1Swenshuai.xi }
1239*53ee8cc1Swenshuai.xi //Cover OTG HW issue casused by HC Software reset for Device-B playing as Host
1240*53ee8cc1Swenshuai.xi #if 0
1241*53ee8cc1Swenshuai.xi if ( mdwOTGC_Control_B_BUS_REQ_Rd() > 0)
1242*53ee8cc1Swenshuai.xi {
1243*53ee8cc1Swenshuai.xi //HC reset at HNP section
1244*53ee8cc1Swenshuai.xi mdwOTGC_UsbUnPLGSet();
1245*53ee8cc1Swenshuai.xi mdwOTGC_UsbUnPLGClr();
1246*53ee8cc1Swenshuai.xi }
1247*53ee8cc1Swenshuai.xi #endif
1248*53ee8cc1Swenshuai.xi //End of cover
1249*53ee8cc1Swenshuai.xi }
1250*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
1251*53ee8cc1Swenshuai.xi
ehci_hub_control(struct usb_hcd * hcd,U16 typeReq,U16 wValue,U16 wIndex,char * buf,U16 wLength)1252*53ee8cc1Swenshuai.xi int ehci_hub_control (
1253*53ee8cc1Swenshuai.xi struct usb_hcd *hcd,
1254*53ee8cc1Swenshuai.xi U16 typeReq,
1255*53ee8cc1Swenshuai.xi U16 wValue,
1256*53ee8cc1Swenshuai.xi U16 wIndex,
1257*53ee8cc1Swenshuai.xi char *buf,
1258*53ee8cc1Swenshuai.xi U16 wLength
1259*53ee8cc1Swenshuai.xi ) {
1260*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci (hcd);
1261*53ee8cc1Swenshuai.xi int ports = HCS_N_PORTS (ehci->hcs_params);
1262*53ee8cc1Swenshuai.xi U32 temp, status,bus_monitor;
1263*53ee8cc1Swenshuai.xi U32 flags;
1264*53ee8cc1Swenshuai.xi int retval = 0;
1265*53ee8cc1Swenshuai.xi int time_out;
1266*53ee8cc1Swenshuai.xi struct cpe_dev *dev;
1267*53ee8cc1Swenshuai.xi const struct device_s *__mptr = hcd->controller;
1268*53ee8cc1Swenshuai.xi dev = (struct cpe_dev *)( (char *)__mptr - offsetof(struct cpe_dev,dev) );
1269*53ee8cc1Swenshuai.xi U32 regUTMI = dev->utmibase;
1270*53ee8cc1Swenshuai.xi U32 temp2, speed;
1271*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1272*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1273*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1274*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1275*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1276*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1277*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1278*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1279*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1280*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1281*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1282*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1283*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1284*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1285*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1286*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1287*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1288*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1289*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1290*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1291*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1292*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1293*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1294*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1295*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1296*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1297*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1298*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1299*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1300*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1301*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1302*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1303*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1304*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1305*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1306*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1307*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1308*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1309*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1310*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1311*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1312*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1313*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1314*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1315*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1316*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1317*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1318*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1319*53ee8cc1Swenshuai.xi
1320*53ee8cc1Swenshuai.xi spin_lock_irqsave (&ehci->lock, flags);
1321*53ee8cc1Swenshuai.xi switch (typeReq) {
1322*53ee8cc1Swenshuai.xi case ClearHubFeature:
1323*53ee8cc1Swenshuai.xi switch (wValue) {
1324*53ee8cc1Swenshuai.xi case C_HUB_LOCAL_POWER:
1325*53ee8cc1Swenshuai.xi case C_HUB_OVER_CURRENT:
1326*53ee8cc1Swenshuai.xi /* no hub-wide feature/status flags */
1327*53ee8cc1Swenshuai.xi break;
1328*53ee8cc1Swenshuai.xi default:
1329*53ee8cc1Swenshuai.xi goto error;
1330*53ee8cc1Swenshuai.xi }
1331*53ee8cc1Swenshuai.xi break;
1332*53ee8cc1Swenshuai.xi case ClearPortFeature:
1333*53ee8cc1Swenshuai.xi if (!wIndex || wIndex > ports)
1334*53ee8cc1Swenshuai.xi goto error;
1335*53ee8cc1Swenshuai.xi wIndex--;
1336*53ee8cc1Swenshuai.xi temp = ehci_readl ((U32)&ehci->regs->port_status [wIndex]);
1337*53ee8cc1Swenshuai.xi if (temp & PORT_OWNER)
1338*53ee8cc1Swenshuai.xi break;
1339*53ee8cc1Swenshuai.xi
1340*53ee8cc1Swenshuai.xi switch (wValue) {
1341*53ee8cc1Swenshuai.xi case USB_PORT_FEAT_ENABLE:
1342*53ee8cc1Swenshuai.xi usb_msg("Disable port%s","");
1343*53ee8cc1Swenshuai.xi if( ehci->async->qh_next.qh != 0 )
1344*53ee8cc1Swenshuai.xi {
1345*53ee8cc1Swenshuai.xi usb_err("Not only cantain one qHD (%p and %p)in asyn. scheduler",ehci->async->qh_next.qh,ehci->async);
1346*53ee8cc1Swenshuai.xi }
1347*53ee8cc1Swenshuai.xi ehci_writel (temp & ~PORT_PE, (U32)&ehci->regs->port_status [wIndex]);
1348*53ee8cc1Swenshuai.xi //Stop scheduler when device disconnect
1349*53ee8cc1Swenshuai.xi //Diable asyn. and sync. scheduler
1350*53ee8cc1Swenshuai.xi ehci_writel(ehci_readl((U32)&ehci->regs->command)&(~(CMD_ASE|CMD_PSE|CMD_IAAD)),(U32)&ehci->regs->command);
1351*53ee8cc1Swenshuai.xi //Halt HC (Stop scheduler)
1352*53ee8cc1Swenshuai.xi
1353*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1354*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1355*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1356*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1357*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1358*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1359*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1360*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1361*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1362*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1363*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1364*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1365*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1366*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1367*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1368*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1369*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1370*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1371*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1372*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1373*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1374*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1375*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1376*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1377*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1378*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1379*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1380*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1381*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1382*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1383*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1384*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1385*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1386*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1387*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1388*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1389*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1390*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1391*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1392*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1393*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1394*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1395*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1396*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1397*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1398*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1399*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1400*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1401*53ee8cc1Swenshuai.xi ehci_halt(ehci);
1402*53ee8cc1Swenshuai.xi ehci_hc_swreset(ehci);
1403*53ee8cc1Swenshuai.xi break;
1404*53ee8cc1Swenshuai.xi case USB_PORT_FEAT_C_ENABLE:
1405*53ee8cc1Swenshuai.xi ehci_writel (temp | PORT_PEC,
1406*53ee8cc1Swenshuai.xi (U32)&ehci->regs->port_status [wIndex]);
1407*53ee8cc1Swenshuai.xi break;
1408*53ee8cc1Swenshuai.xi case USB_PORT_FEAT_SUSPEND:
1409*53ee8cc1Swenshuai.xi case USB_PORT_FEAT_C_SUSPEND:
1410*53ee8cc1Swenshuai.xi /* ? */
1411*53ee8cc1Swenshuai.xi break;
1412*53ee8cc1Swenshuai.xi case USB_PORT_FEAT_POWER:
1413*53ee8cc1Swenshuai.xi if (HCS_PPC (ehci->hcs_params))
1414*53ee8cc1Swenshuai.xi ehci_writel (temp & ~PORT_POWER,
1415*53ee8cc1Swenshuai.xi (U32)&ehci->regs->port_status [wIndex]);
1416*53ee8cc1Swenshuai.xi break;
1417*53ee8cc1Swenshuai.xi case USB_PORT_FEAT_C_CONNECTION:
1418*53ee8cc1Swenshuai.xi ehci_writel (temp | PORT_CSC,
1419*53ee8cc1Swenshuai.xi (U32)&ehci->regs->port_status [wIndex]);
1420*53ee8cc1Swenshuai.xi break;
1421*53ee8cc1Swenshuai.xi
1422*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1423*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1424*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1425*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1426*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1427*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1428*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1429*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1430*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1431*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1432*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1433*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1434*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1435*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1436*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1437*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1438*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1439*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1440*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1441*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1442*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1443*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1444*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1445*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1446*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1447*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1448*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1449*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1450*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1451*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1452*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1453*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1454*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1455*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1456*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1457*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1458*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1459*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1460*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1461*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1462*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1463*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1464*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1465*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1466*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1467*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1468*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1469*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1470*53ee8cc1Swenshuai.xi case USB_PORT_FEAT_C_OVER_CURRENT:
1471*53ee8cc1Swenshuai.xi ehci_writel (temp | PORT_OCC,
1472*53ee8cc1Swenshuai.xi (U32)&ehci->regs->port_status [wIndex]);
1473*53ee8cc1Swenshuai.xi break;
1474*53ee8cc1Swenshuai.xi case USB_PORT_FEAT_C_RESET:
1475*53ee8cc1Swenshuai.xi /* GetPortStatus clears reset */
1476*53ee8cc1Swenshuai.xi break;
1477*53ee8cc1Swenshuai.xi default:
1478*53ee8cc1Swenshuai.xi goto error;
1479*53ee8cc1Swenshuai.xi }
1480*53ee8cc1Swenshuai.xi temp = ehci_readl ((U32)&ehci->regs->command); /* unblock posted write */
1481*53ee8cc1Swenshuai.xi break;
1482*53ee8cc1Swenshuai.xi case GetHubDescriptor:
1483*53ee8cc1Swenshuai.xi ehci_hub_descriptor (ehci, (struct usb_hub_descriptor *)
1484*53ee8cc1Swenshuai.xi buf);
1485*53ee8cc1Swenshuai.xi break;
1486*53ee8cc1Swenshuai.xi case GetHubStatus:
1487*53ee8cc1Swenshuai.xi /* no hub-wide feature/status flags */
1488*53ee8cc1Swenshuai.xi memset (buf, 0, 4);
1489*53ee8cc1Swenshuai.xi //cpu_to_le32s ((U32 *) buf);
1490*53ee8cc1Swenshuai.xi break;
1491*53ee8cc1Swenshuai.xi
1492*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1493*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1494*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1495*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1496*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1497*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1498*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1499*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1500*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1501*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1502*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1503*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1504*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1505*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1506*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1507*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1508*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1509*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1510*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1511*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1512*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1513*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1514*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1515*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1516*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1517*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1518*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1519*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1520*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1521*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1522*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1523*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1524*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1525*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1526*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1527*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1528*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1529*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1530*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1531*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1532*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1533*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1534*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1535*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1536*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1537*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1538*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1539*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1540*53ee8cc1Swenshuai.xi case GetPortStatus:
1541*53ee8cc1Swenshuai.xi if (!wIndex || wIndex > ports)
1542*53ee8cc1Swenshuai.xi goto error;
1543*53ee8cc1Swenshuai.xi wIndex--;
1544*53ee8cc1Swenshuai.xi status = 0;
1545*53ee8cc1Swenshuai.xi temp = ehci_readl ((U32)&ehci->regs->port_status [wIndex]);
1546*53ee8cc1Swenshuai.xi //diag_printf("<ehci_hub_control> GetPortStatus: pStatus: %x, \n", temp);
1547*53ee8cc1Swenshuai.xi if ( ((temp & PORT_CONNECT) == 0) && ((temp & PORT_CSC) == 0) )
1548*53ee8cc1Swenshuai.xi {
1549*53ee8cc1Swenshuai.xi if ((hcd->pre_temp & PORT_CONNECT) != 0)
1550*53ee8cc1Swenshuai.xi {
1551*53ee8cc1Swenshuai.xi diag_printf("<ehci_hub_control> GetPortStatus:Add CSC here, pStatus = %x\n", temp);
1552*53ee8cc1Swenshuai.xi temp |= PORT_CSC;
1553*53ee8cc1Swenshuai.xi }
1554*53ee8cc1Swenshuai.xi }
1555*53ee8cc1Swenshuai.xi hcd->pre_temp = temp;
1556*53ee8cc1Swenshuai.xi
1557*53ee8cc1Swenshuai.xi // wPortChange bits
1558*53ee8cc1Swenshuai.xi if (temp & PORT_CSC)
1559*53ee8cc1Swenshuai.xi status |= 1 << USB_PORT_FEAT_C_CONNECTION;
1560*53ee8cc1Swenshuai.xi if (temp & PORT_PEC)
1561*53ee8cc1Swenshuai.xi status |= 1 << USB_PORT_FEAT_C_ENABLE;
1562*53ee8cc1Swenshuai.xi // USB_PORT_FEAT_C_SUSPEND
1563*53ee8cc1Swenshuai.xi if (temp & PORT_OCC)
1564*53ee8cc1Swenshuai.xi status |= 1 << USB_PORT_FEAT_C_OVER_CURRENT;
1565*53ee8cc1Swenshuai.xi
1566*53ee8cc1Swenshuai.xi /* whoever resets must GetPortStatus to complete it!! */
1567*53ee8cc1Swenshuai.xi if ((temp & PORT_RESET)
1568*53ee8cc1Swenshuai.xi && time_after (jiffies,
1569*53ee8cc1Swenshuai.xi ehci->reset_done [wIndex])) {
1570*53ee8cc1Swenshuai.xi status |= 1 << USB_PORT_FEAT_C_RESET;
1571*53ee8cc1Swenshuai.xi time_out=0;
1572*53ee8cc1Swenshuai.xi
1573*53ee8cc1Swenshuai.xi writeb(0x0 ,(void*)(regUTMI+0x2A*2)); // chirp patch
1574*53ee8cc1Swenshuai.xi mdelay(20); // chirp patch
1575*53ee8cc1Swenshuai.xi
1576*53ee8cc1Swenshuai.xi /* force reset to complete */
1577*53ee8cc1Swenshuai.xi ehci_writel (temp & ~PORT_RESET,
1578*53ee8cc1Swenshuai.xi (U32)&ehci->regs->port_status [wIndex]);
1579*53ee8cc1Swenshuai.xi do {
1580*53ee8cc1Swenshuai.xi temp = ehci_readl (
1581*53ee8cc1Swenshuai.xi (U32)&ehci->regs->port_status [wIndex]);
1582*53ee8cc1Swenshuai.xi udelay (10);
1583*53ee8cc1Swenshuai.xi } while ((temp&(PORT_RESET|PORT_CONNECT)) == (PORT_RESET|PORT_CONNECT)&&(time_out++<10000));
1584*53ee8cc1Swenshuai.xi
1585*53ee8cc1Swenshuai.xi writeb(0x10, (void*) (regUTMI+0x2c*2)); // chirp patch
1586*53ee8cc1Swenshuai.xi writeb(0x02, (void*) (regUTMI+0x2d*2-1)); // chirp patch
1587*53ee8cc1Swenshuai.xi writeb(0x81, (void*) (regUTMI+0x2f*2-1)); // chirp patch
1588*53ee8cc1Swenshuai.xi
1589*53ee8cc1Swenshuai.xi //Add time-out mechanism to cover HW BUG
1590*53ee8cc1Swenshuai.xi //HW ISSUE?
1591*53ee8cc1Swenshuai.xi if( time_out >= 10000 )
1592*53ee8cc1Swenshuai.xi {
1593*53ee8cc1Swenshuai.xi //Maybe HW bug ==> check it out
1594*53ee8cc1Swenshuai.xi diag_printf("ERR: Port reset cannot force complete!!\n");//HW ISSUE?
1595*53ee8cc1Swenshuai.xi ehci_hc_swreset(ehci);
1596*53ee8cc1Swenshuai.xi }
1597*53ee8cc1Swenshuai.xi /* see what we found out */
1598*53ee8cc1Swenshuai.xi speed = (ehci_readl((U32)&ehci->regs->bus_control) >> 9) & 0x3;
1599*53ee8cc1Swenshuai.xi diag_printf("SPEED: %x\n", speed);
1600*53ee8cc1Swenshuai.xi
1601*53ee8cc1Swenshuai.xi temp2 = ehci_readl((U32)&ehci->regs->hcmisc) & 0xfffffff3;
1602*53ee8cc1Swenshuai.xi if (speed == 2) // high speed
1603*53ee8cc1Swenshuai.xi {
1604*53ee8cc1Swenshuai.xi UTMI_ORXBYTE_EX(0x09, 0x80, regUTMI); //HS rx robust enable
1605*53ee8cc1Swenshuai.xi temp2 |= (3 << 2);
1606*53ee8cc1Swenshuai.xi }
1607*53ee8cc1Swenshuai.xi else //full speed, low speed
1608*53ee8cc1Swenshuai.xi {
1609*53ee8cc1Swenshuai.xi UTMI_ANDXBYTE_EX(0x09, 0x7F, regUTMI);
1610*53ee8cc1Swenshuai.xi temp2 |= (2 << 2);
1611*53ee8cc1Swenshuai.xi }
1612*53ee8cc1Swenshuai.xi ehci_writel (temp2, (U32)&ehci->regs->hcmisc); // misc, EOF1
1613*53ee8cc1Swenshuai.xi
1614*53ee8cc1Swenshuai.xi temp = check_reset_complete (ehci, wIndex, temp);
1615*53ee8cc1Swenshuai.xi }
1616*53ee8cc1Swenshuai.xi
1617*53ee8cc1Swenshuai.xi // don't show wPortStatus if it's owned by a companion hc
1618*53ee8cc1Swenshuai.xi if (!(temp & PORT_OWNER)) {
1619*53ee8cc1Swenshuai.xi if (temp & PORT_CONNECT) {
1620*53ee8cc1Swenshuai.xi status |= 1 << USB_PORT_FEAT_CONNECTION;
1621*53ee8cc1Swenshuai.xi bus_monitor=ehci_readl ((U32)&ehci->regs->bus_control);
1622*53ee8cc1Swenshuai.xi bus_monitor>>=9;
1623*53ee8cc1Swenshuai.xi if (bus_monitor==2)
1624*53ee8cc1Swenshuai.xi status |= 1 << USB_PORT_FEAT_HIGHSPEED;
1625*53ee8cc1Swenshuai.xi else if (bus_monitor==1)
1626*53ee8cc1Swenshuai.xi status |=1 << USB_PORT_FEAT_LOWSPEED;
1627*53ee8cc1Swenshuai.xi //else ==> full speed don't set any bits
1628*53ee8cc1Swenshuai.xi
1629*53ee8cc1Swenshuai.xi }
1630*53ee8cc1Swenshuai.xi if (temp & PORT_PE)
1631*53ee8cc1Swenshuai.xi status |= 1 << USB_PORT_FEAT_ENABLE;
1632*53ee8cc1Swenshuai.xi if (temp & PORT_SUSPEND)
1633*53ee8cc1Swenshuai.xi status |= 1 << USB_PORT_FEAT_SUSPEND;
1634*53ee8cc1Swenshuai.xi
1635*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1636*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1637*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1638*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1639*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1640*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1641*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1642*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1643*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1644*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1645*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1646*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1647*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1648*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1649*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1650*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1651*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1652*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1653*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1654*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1655*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1656*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1657*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1658*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1659*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1660*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1661*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1662*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1663*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1664*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1665*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1666*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1667*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1668*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1669*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1670*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1671*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1672*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1673*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1674*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1675*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1676*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1677*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1678*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1679*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1680*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1681*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1682*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1683*53ee8cc1Swenshuai.xi if (temp & PORT_OC)
1684*53ee8cc1Swenshuai.xi status |= 1 << USB_PORT_FEAT_OVER_CURRENT;
1685*53ee8cc1Swenshuai.xi if (temp & PORT_RESET)
1686*53ee8cc1Swenshuai.xi status |= 1 << USB_PORT_FEAT_RESET;
1687*53ee8cc1Swenshuai.xi if (temp & PORT_POWER)
1688*53ee8cc1Swenshuai.xi status |= 1 << USB_PORT_FEAT_POWER;
1689*53ee8cc1Swenshuai.xi }
1690*53ee8cc1Swenshuai.xi
1691*53ee8cc1Swenshuai.xi #ifndef EHCI_VERBOSE_DEBUG
1692*53ee8cc1Swenshuai.xi if (status & ~0xffff) /* only if wPortChange is interesting */
1693*53ee8cc1Swenshuai.xi #endif
1694*53ee8cc1Swenshuai.xi dbg_port (ehci, "GetStatus", wIndex + 1, temp);
1695*53ee8cc1Swenshuai.xi #if 0
1696*53ee8cc1Swenshuai.xi // we "know" this alignment is good, caller used kmalloc()...
1697*53ee8cc1Swenshuai.xi *((U32 *) buf) = CPUToLE32(status);
1698*53ee8cc1Swenshuai.xi #else
1699*53ee8cc1Swenshuai.xi *buf = CPUToLE32(status);
1700*53ee8cc1Swenshuai.xi *(buf+1) = CPUToLE32(status) >> 8;
1701*53ee8cc1Swenshuai.xi *(buf+2) = CPUToLE32(status) >> 16;
1702*53ee8cc1Swenshuai.xi *(buf+3) = CPUToLE32(status) >> 24;
1703*53ee8cc1Swenshuai.xi #endif
1704*53ee8cc1Swenshuai.xi break;
1705*53ee8cc1Swenshuai.xi case SetHubFeature:
1706*53ee8cc1Swenshuai.xi switch (wValue) {
1707*53ee8cc1Swenshuai.xi case C_HUB_LOCAL_POWER:
1708*53ee8cc1Swenshuai.xi case C_HUB_OVER_CURRENT:
1709*53ee8cc1Swenshuai.xi /* no hub-wide feature/status flags */
1710*53ee8cc1Swenshuai.xi
1711*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1712*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1713*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1714*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1715*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1716*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1717*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1718*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1719*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1720*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1721*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1722*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1723*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1724*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1725*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1726*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1727*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1728*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1729*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1730*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1731*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1732*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1733*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1734*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1735*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1736*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1737*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1738*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1739*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1740*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1741*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1742*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1743*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1744*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1745*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1746*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1747*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1748*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1749*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1750*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1751*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1752*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1753*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1754*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1755*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1756*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1757*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1758*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1759*53ee8cc1Swenshuai.xi break;
1760*53ee8cc1Swenshuai.xi default:
1761*53ee8cc1Swenshuai.xi goto error;
1762*53ee8cc1Swenshuai.xi }
1763*53ee8cc1Swenshuai.xi break;
1764*53ee8cc1Swenshuai.xi case SetPortFeature:
1765*53ee8cc1Swenshuai.xi if (!wIndex || wIndex > ports)
1766*53ee8cc1Swenshuai.xi goto error;
1767*53ee8cc1Swenshuai.xi wIndex--;
1768*53ee8cc1Swenshuai.xi temp = ehci_readl ((U32)&ehci->regs->port_status [wIndex]);
1769*53ee8cc1Swenshuai.xi //#ifndef CONFIG_FARADAY_FOTG200
1770*53ee8cc1Swenshuai.xi #if 0
1771*53ee8cc1Swenshuai.xi if (temp & PORT_OWNER)
1772*53ee8cc1Swenshuai.xi break;
1773*53ee8cc1Swenshuai.xi #endif
1774*53ee8cc1Swenshuai.xi
1775*53ee8cc1Swenshuai.xi switch (wValue) {
1776*53ee8cc1Swenshuai.xi case USB_PORT_FEAT_SUSPEND:
1777*53ee8cc1Swenshuai.xi dbg("SetPortFeature suspend%s","\n");
1778*53ee8cc1Swenshuai.xi ehci_writel (temp | PORT_SUSPEND,
1779*53ee8cc1Swenshuai.xi (U32)&ehci->regs->port_status [wIndex]);
1780*53ee8cc1Swenshuai.xi break;
1781*53ee8cc1Swenshuai.xi case USB_PORT_FEAT_POWER:
1782*53ee8cc1Swenshuai.xi if (HCS_PPC (ehci->hcs_params))
1783*53ee8cc1Swenshuai.xi ehci_writel (temp | PORT_POWER,
1784*53ee8cc1Swenshuai.xi (U32)&ehci->regs->port_status [wIndex]);
1785*53ee8cc1Swenshuai.xi break;
1786*53ee8cc1Swenshuai.xi case USB_PORT_FEAT_RESET:
1787*53ee8cc1Swenshuai.xi /* line status bits may report this as low speed */
1788*53ee8cc1Swenshuai.xi //#ifndef CONFIG_FARADAY_FOTG200
1789*53ee8cc1Swenshuai.xi //diag_printf("<ehci_hub_control> SetPortFeature RESET port status: %lx\n", temp);
1790*53ee8cc1Swenshuai.xi #if 0
1791*53ee8cc1Swenshuai.xi if ((temp & (PORT_PE|PORT_CONNECT)) == PORT_CONNECT
1792*53ee8cc1Swenshuai.xi && PORT_USB11 (temp)) {
1793*53ee8cc1Swenshuai.xi diag_printf("temp: %x\n", temp);
1794*53ee8cc1Swenshuai.xi ehci_dbg (ehci,
1795*53ee8cc1Swenshuai.xi "port %d low speed --> companion%s",
1796*53ee8cc1Swenshuai.xi wIndex + 1,"\n");
1797*53ee8cc1Swenshuai.xi temp |= PORT_OWNER;
1798*53ee8cc1Swenshuai.xi } else
1799*53ee8cc1Swenshuai.xi #endif
1800*53ee8cc1Swenshuai.xi {
1801*53ee8cc1Swenshuai.xi ehci_vdbg (ehci, "port %d reset %s", wIndex + 1,"\n");
1802*53ee8cc1Swenshuai.xi temp |= PORT_RESET;
1803*53ee8cc1Swenshuai.xi temp &= ~PORT_PE;
1804*53ee8cc1Swenshuai.xi
1805*53ee8cc1Swenshuai.xi /*
1806*53ee8cc1Swenshuai.xi * caller must wait, then call GetPortStatus
1807*53ee8cc1Swenshuai.xi * usb 2.0 spec says 50 ms resets on root
1808*53ee8cc1Swenshuai.xi */
1809*53ee8cc1Swenshuai.xi ehci->reset_done [wIndex] = jiffies
1810*53ee8cc1Swenshuai.xi + ((50 /* msec */ * HZ) / 1000);
1811*53ee8cc1Swenshuai.xi }
1812*53ee8cc1Swenshuai.xi
1813*53ee8cc1Swenshuai.xi #if 0 //Colin, 090605 removed for reset bad USB disk
1814*53ee8cc1Swenshuai.xi if ( g_usb_phy_reset_flg && (hcd == cpe_ehci_dev.dev.driver_data) )
1815*53ee8cc1Swenshuai.xi {
1816*53ee8cc1Swenshuai.xi diag_printf("g_usb_phy_reset_flg\n");
1817*53ee8cc1Swenshuai.xi //Stop schedule
1818*53ee8cc1Swenshuai.xi ehci_writel(ehci_readl((U32)&ehci->regs->command)&(~(CMD_RUN|CMD_ASE|CMD_PSE)),(U32)&ehci->regs->command);
1819*53ee8cc1Swenshuai.xi time_out=0;
1820*53ee8cc1Swenshuai.xi //Add time-out mechanism to cover HW design issue (PIE may cause dead lock sometimes)
1821*53ee8cc1Swenshuai.xi while(((ehci_readl((U32)&ehci->regs->status)&STS_HALT) == 0)&&(time_out++<1000));
1822*53ee8cc1Swenshuai.xi //HW ISSUE?
1823*53ee8cc1Swenshuai.xi if( time_out >= 1000 )
1824*53ee8cc1Swenshuai.xi {
1825*53ee8cc1Swenshuai.xi ehci_hc_swreset(ehci);
1826*53ee8cc1Swenshuai.xi }
1827*53ee8cc1Swenshuai.xi
1828*53ee8cc1Swenshuai.xi UTMI_ORXBYTE(0x06,0x3); // XWORD[UTMIBaseAddr+0x06]|=0x03; //reset UTMI
1829*53ee8cc1Swenshuai.xi USB_DELAY(2);
1830*53ee8cc1Swenshuai.xi UTMI_ANDXBYTE(0x06,~0x03); //XWORD[UTMIBaseAddr+0x06]&=~0x3; // 0xfc;
1831*53ee8cc1Swenshuai.xi }
1832*53ee8cc1Swenshuai.xi
1833*53ee8cc1Swenshuai.xi if ( g_usb_phy_reset_flg_Port2&& (hcd == cpe_ehci_dev_Port2.dev.driver_data) )
1834*53ee8cc1Swenshuai.xi {
1835*53ee8cc1Swenshuai.xi diag_printf("g_usb_phy_reset_flg_Port2\n");
1836*53ee8cc1Swenshuai.xi //Stop schedule
1837*53ee8cc1Swenshuai.xi ehci_writel(ehci_readl((U32)&ehci->regs->command)&(~(CMD_RUN|CMD_ASE|CMD_PSE)),(U32)&ehci->regs->command);
1838*53ee8cc1Swenshuai.xi time_out=0;
1839*53ee8cc1Swenshuai.xi //Add time-out mechanism to cover HW design issue (PIE may cause dead lock sometimes)
1840*53ee8cc1Swenshuai.xi while(((ehci_readl((U32)&ehci->regs->status)&STS_HALT) == 0)&&(time_out++<1000));
1841*53ee8cc1Swenshuai.xi //HW ISSUE?
1842*53ee8cc1Swenshuai.xi if( time_out >= 1000 )
1843*53ee8cc1Swenshuai.xi {
1844*53ee8cc1Swenshuai.xi ehci_hc_swreset(ehci);
1845*53ee8cc1Swenshuai.xi }
1846*53ee8cc1Swenshuai.xi
1847*53ee8cc1Swenshuai.xi UTMI2_ORXBYTE(0x06,0x3); // XWORD[UTMIBaseAddr+0x06]|=0x03; //reset UTMI
1848*53ee8cc1Swenshuai.xi USB_DELAY(2);
1849*53ee8cc1Swenshuai.xi UTMI2_ANDXBYTE(0x06,~0x03); //XWORD[UTMIBaseAddr+0x06]&=~0x3; // 0xfc;
1850*53ee8cc1Swenshuai.xi }
1851*53ee8cc1Swenshuai.xi #endif
1852*53ee8cc1Swenshuai.xi
1853*53ee8cc1Swenshuai.xi //Do port reset only if device attaches to this port
1854*53ee8cc1Swenshuai.xi if( temp&PORT_CONNECT )
1855*53ee8cc1Swenshuai.xi {
1856*53ee8cc1Swenshuai.xi ehci_StopRun_Setting(HOST20_Enable, ehci);
1857*53ee8cc1Swenshuai.xi
1858*53ee8cc1Swenshuai.xi writeb(0x10, (void*)(regUTMI+0x2C*2)); // chirp patch
1859*53ee8cc1Swenshuai.xi writeb(0x00, (void*)(regUTMI+0x2D*2-1)); // chirp patch
1860*53ee8cc1Swenshuai.xi writeb(0x00, (void*)(regUTMI+0x2F*2-1)); // chirp patch
1861*53ee8cc1Swenshuai.xi writeb(0x80 ,(void*)(regUTMI+0x2A*2)); // chirp patch
1862*53ee8cc1Swenshuai.xi
1863*53ee8cc1Swenshuai.xi ehci_writel (temp, (U32)&ehci->regs->port_status [wIndex]); // port reset
1864*53ee8cc1Swenshuai.xi }
1865*53ee8cc1Swenshuai.xi break;
1866*53ee8cc1Swenshuai.xi default:
1867*53ee8cc1Swenshuai.xi goto error;
1868*53ee8cc1Swenshuai.xi }
1869*53ee8cc1Swenshuai.xi temp = ehci_readl ((U32)&ehci->regs->command); /* unblock posted writes */
1870*53ee8cc1Swenshuai.xi break;
1871*53ee8cc1Swenshuai.xi
1872*53ee8cc1Swenshuai.xi default:
1873*53ee8cc1Swenshuai.xi error:
1874*53ee8cc1Swenshuai.xi /* "stall" on error */
1875*53ee8cc1Swenshuai.xi retval = -EPIPE;
1876*53ee8cc1Swenshuai.xi }
1877*53ee8cc1Swenshuai.xi spin_unlock_irqrestore (&ehci->lock, flags);
1878*53ee8cc1Swenshuai.xi return retval;
1879*53ee8cc1Swenshuai.xi }
1880*53ee8cc1Swenshuai.xi
1881*53ee8cc1Swenshuai.xi #endif
1882*53ee8cc1Swenshuai.xi
1883*53ee8cc1Swenshuai.xi
1884*53ee8cc1Swenshuai.xi /*------------------------------------------------------------------------------*/
1885*53ee8cc1Swenshuai.xi #include "drvEHCI_MEM.cxx"
1886*53ee8cc1Swenshuai.xi
1887*53ee8cc1Swenshuai.xi
1888*53ee8cc1Swenshuai.xi #if 1
1889*53ee8cc1Swenshuai.xi
1890*53ee8cc1Swenshuai.xi //enum usb_device_speed eCurURBSpeed;
1891*53ee8cc1Swenshuai.xi //U32 my_qtd,my_buf,qtd_status;
1892*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1893*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1894*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1895*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1896*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1897*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1898*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1899*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1900*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1901*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1902*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1903*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1904*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1905*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1906*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1907*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1908*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1909*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1910*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1911*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1912*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1913*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1914*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1915*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1916*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1917*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1918*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1919*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1920*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1921*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1922*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1923*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1924*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1925*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1926*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1927*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1928*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1929*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1930*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1931*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1932*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1933*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1934*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1935*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1936*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1937*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1938*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1939*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1940*53ee8cc1Swenshuai.xi
1941*53ee8cc1Swenshuai.xi static int
qtd_fill(struct ehci_qtd * qtd,dma_addr_t buf,size_t len,int token,int maxpacket)1942*53ee8cc1Swenshuai.xi qtd_fill (struct ehci_qtd *qtd, dma_addr_t buf, size_t len,
1943*53ee8cc1Swenshuai.xi int token, int maxpacket)
1944*53ee8cc1Swenshuai.xi {
1945*53ee8cc1Swenshuai.xi U32 count;
1946*53ee8cc1Swenshuai.xi int i, lastnums = 0;
1947*53ee8cc1Swenshuai.xi cyg_uint64 addr = buf;
1948*53ee8cc1Swenshuai.xi unsigned char uPageShift;
1949*53ee8cc1Swenshuai.xi
1950*53ee8cc1Swenshuai.xi //my_qtd=(U32)qtd;
1951*53ee8cc1Swenshuai.xi //my_buf=(U32)buf;
1952*53ee8cc1Swenshuai.xi //diag_printf("qtd:%x buf:%x\n",(U32)qtd,buf);
1953*53ee8cc1Swenshuai.xi /* one buffer entry per 4K ... first might be short or unaligned */
1954*53ee8cc1Swenshuai.xi
1955*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1956*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1957*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1958*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1959*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1960*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1961*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1962*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1963*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1964*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1965*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1966*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1967*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1968*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1969*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1970*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1971*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1972*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1973*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1974*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1975*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1976*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1977*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1978*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1979*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1980*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1981*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1982*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1983*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1984*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1985*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1986*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1987*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1988*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1989*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1990*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1991*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1992*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1993*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1994*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1995*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1996*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1997*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1998*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1999*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2000*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2001*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2002*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2003*53ee8cc1Swenshuai.xi qtd->hw_buf [0] = CPUToLE32 ((U32)addr);
2004*53ee8cc1Swenshuai.xi qtd->hw_buf_hi [0] = CPUToLE32 ((U32)(addr >> 32));
2005*53ee8cc1Swenshuai.xi count = 0x1000 - (buf & 0x0fff); /* rest of that page */
2006*53ee8cc1Swenshuai.xi if (likely (len < count)) /* ... iff needed */
2007*53ee8cc1Swenshuai.xi count = len;
2008*53ee8cc1Swenshuai.xi else {
2009*53ee8cc1Swenshuai.xi buf += 0x1000;
2010*53ee8cc1Swenshuai.xi buf &= ~0x0fff;
2011*53ee8cc1Swenshuai.xi
2012*53ee8cc1Swenshuai.xi /* per-qtd limit: from 16K to 20K (best alignment) */
2013*53ee8cc1Swenshuai.xi for (i = 1; count < len && i < 5; i++) {
2014*53ee8cc1Swenshuai.xi addr = buf;
2015*53ee8cc1Swenshuai.xi qtd->hw_buf [i] = CPUToLE32 ((U32)addr);
2016*53ee8cc1Swenshuai.xi qtd->hw_buf_hi [i] = CPUToLE32 ((U32)(addr >> 32));
2017*53ee8cc1Swenshuai.xi lastnums++;
2018*53ee8cc1Swenshuai.xi buf += 0x1000;
2019*53ee8cc1Swenshuai.xi if ((count + 0x1000) < len)
2020*53ee8cc1Swenshuai.xi count += 0x1000;
2021*53ee8cc1Swenshuai.xi else
2022*53ee8cc1Swenshuai.xi count = len;
2023*53ee8cc1Swenshuai.xi }
2024*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2025*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2026*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2027*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2028*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2029*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2030*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2031*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2032*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2033*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2034*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2035*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2036*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2037*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2038*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2039*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2040*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2041*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2042*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2043*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2044*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2045*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2046*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2047*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2048*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2049*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2050*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2051*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2052*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2053*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2054*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2055*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2056*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2057*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2058*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2059*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2060*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2061*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2062*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2063*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2064*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2065*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2066*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2067*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2068*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2069*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2070*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2071*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2072*53ee8cc1Swenshuai.xi
2073*53ee8cc1Swenshuai.xi /* short packets may only terminate transfers */
2074*53ee8cc1Swenshuai.xi if (count != len)
2075*53ee8cc1Swenshuai.xi count -= (count % maxpacket);
2076*53ee8cc1Swenshuai.xi }
2077*53ee8cc1Swenshuai.xi qtd->hw_token = CPUToLE32 ((count << 16) | token);
2078*53ee8cc1Swenshuai.xi qtd->length = count;
2079*53ee8cc1Swenshuai.xi //qtd_status=qtd->hw_token; //yuwen
2080*53ee8cc1Swenshuai.xi if ((count > 0) && (lastnums < 4))
2081*53ee8cc1Swenshuai.xi {
2082*53ee8cc1Swenshuai.xi for (uPageShift = lastnums + 1;uPageShift < 5; uPageShift++)
2083*53ee8cc1Swenshuai.xi {
2084*53ee8cc1Swenshuai.xi qtd->hw_buf[uPageShift] = qtd->hw_buf [lastnums];
2085*53ee8cc1Swenshuai.xi qtd->hw_buf_hi[uPageShift] = qtd->hw_buf_hi [lastnums];
2086*53ee8cc1Swenshuai.xi }
2087*53ee8cc1Swenshuai.xi }
2088*53ee8cc1Swenshuai.xi
2089*53ee8cc1Swenshuai.xi #if 0
2090*53ee8cc1Swenshuai.xi if ((count > 0) && (i <= 4))
2091*53ee8cc1Swenshuai.xi {
2092*53ee8cc1Swenshuai.xi // Shift all page buffers to the bottom of qtd
2093*53ee8cc1Swenshuai.xi uPageShift = 4 - i;
2094*53ee8cc1Swenshuai.xi for (;i>=0; i--)
2095*53ee8cc1Swenshuai.xi {
2096*53ee8cc1Swenshuai.xi qtd->hw_buf[i+uPageShift] = qtd->hw_buf [i];
2097*53ee8cc1Swenshuai.xi qtd->hw_buf_hi[i+uPageShift] = qtd->hw_buf_hi [i];
2098*53ee8cc1Swenshuai.xi qtd->hw_buf [i] = 0;
2099*53ee8cc1Swenshuai.xi qtd->hw_buf_hi [i] = 0;
2100*53ee8cc1Swenshuai.xi }
2101*53ee8cc1Swenshuai.xi
2102*53ee8cc1Swenshuai.xi qtd->hw_token |= (uPageShift << 12); //New Current Page
2103*53ee8cc1Swenshuai.xi }
2104*53ee8cc1Swenshuai.xi
2105*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2106*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2107*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2108*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2109*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2110*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2111*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2112*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2113*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2114*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2115*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2116*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2117*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2118*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2119*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2120*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2121*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2122*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2123*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2124*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2125*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2126*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2127*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2128*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2129*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2130*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2131*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2132*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2133*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2134*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2135*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2136*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2137*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2138*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2139*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2140*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2141*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2142*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2143*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2144*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2145*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2146*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2147*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2148*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2149*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2150*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2151*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2152*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2153*53ee8cc1Swenshuai.xi #endif
2154*53ee8cc1Swenshuai.xi return count;
2155*53ee8cc1Swenshuai.xi }
2156*53ee8cc1Swenshuai.xi
2157*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
2158*53ee8cc1Swenshuai.xi
2159*53ee8cc1Swenshuai.xi
2160*53ee8cc1Swenshuai.xi static __inline__ void
qh_update(struct ehci_hcd * ehci,struct ehci_qh * qh,struct ehci_qtd * qtd)2161*53ee8cc1Swenshuai.xi qh_update (struct ehci_hcd *ehci, struct ehci_qh *qh, struct ehci_qtd *qtd)
2162*53ee8cc1Swenshuai.xi {
2163*53ee8cc1Swenshuai.xi qh->hw_qtd_next = QTD_NEXT (qtd->qtd_dma);
2164*53ee8cc1Swenshuai.xi qh->hw_alt_next = EHCI_LIST_END;
2165*53ee8cc1Swenshuai.xi
2166*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2167*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2168*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2169*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2170*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2171*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2172*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2173*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2174*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2175*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2176*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2177*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2178*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2179*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2180*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2181*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2182*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2183*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2184*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2185*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2186*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2187*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2188*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2189*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2190*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2191*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2192*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2193*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2194*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2195*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2196*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2197*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2198*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2199*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2200*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2201*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2202*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2203*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2204*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2205*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2206*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2207*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2208*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2209*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2210*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2211*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2212*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2213*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2214*53ee8cc1Swenshuai.xi
2215*53ee8cc1Swenshuai.xi
2216*53ee8cc1Swenshuai.xi /* HC must see latest qtd and qh data before we clear ACTIVE+HALT */
2217*53ee8cc1Swenshuai.xi wmb ();
2218*53ee8cc1Swenshuai.xi qh->hw_token &= CPUToLE32 (QTD_TOGGLE | QTD_STS_PING);
2219*53ee8cc1Swenshuai.xi }
2220*53ee8cc1Swenshuai.xi
2221*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
2222*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2223*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2224*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2225*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2226*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2227*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2228*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2229*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2230*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2231*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2232*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2233*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2234*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2235*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2236*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2237*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2238*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2239*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2240*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2241*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2242*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2243*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2244*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2245*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2246*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2247*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2248*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2249*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2250*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2251*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2252*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2253*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2254*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2255*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2256*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2257*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2258*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2259*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2260*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2261*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2262*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2263*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2264*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2265*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2266*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2267*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2268*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2269*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2270*53ee8cc1Swenshuai.xi
qtd_copy_status(struct ehci_hcd * ehci,struct urb * urb,size_t length,U32 token)2271*53ee8cc1Swenshuai.xi static void qtd_copy_status (
2272*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci,
2273*53ee8cc1Swenshuai.xi struct urb *urb,
2274*53ee8cc1Swenshuai.xi size_t length,
2275*53ee8cc1Swenshuai.xi U32 token
2276*53ee8cc1Swenshuai.xi )
2277*53ee8cc1Swenshuai.xi {
2278*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2279*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2280*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2281*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2282*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2283*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2284*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2285*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2286*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2287*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2288*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2289*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2290*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2291*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2292*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2293*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2294*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2295*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2296*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2297*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2298*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2299*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2300*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2301*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2302*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2303*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2304*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2305*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2306*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2307*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2308*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2309*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2310*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2311*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2312*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2313*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2314*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2315*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2316*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2317*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2318*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2319*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2320*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2321*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2322*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2323*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2324*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2325*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2326*53ee8cc1Swenshuai.xi
2327*53ee8cc1Swenshuai.xi if (likely (QTD_PID (token) != 2))
2328*53ee8cc1Swenshuai.xi urb->actual_length += length - QTD_LENGTH (token);
2329*53ee8cc1Swenshuai.xi
2330*53ee8cc1Swenshuai.xi /* don't modify error codes */
2331*53ee8cc1Swenshuai.xi if (unlikely (urb->status != -EINPROGRESS))
2332*53ee8cc1Swenshuai.xi return;
2333*53ee8cc1Swenshuai.xi
2334*53ee8cc1Swenshuai.xi /* force cleanup after short read; not always an error */
2335*53ee8cc1Swenshuai.xi if (unlikely (IS_SHORT_READ (token)))
2336*53ee8cc1Swenshuai.xi urb->status = -EREMOTEIO;
2337*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2338*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2339*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2340*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2341*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2342*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2343*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2344*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2345*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2346*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2347*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2348*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2349*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2350*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2351*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2352*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2353*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2354*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2355*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2356*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2357*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2358*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2359*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2360*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2361*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2362*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2363*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2364*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2365*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2366*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2367*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2368*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2369*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2370*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2371*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2372*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2373*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2374*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2375*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2376*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2377*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2378*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2379*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2380*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2381*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2382*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2383*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2384*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2385*53ee8cc1Swenshuai.xi
2386*53ee8cc1Swenshuai.xi if (token & QTD_STS_HALT) {
2387*53ee8cc1Swenshuai.xi if (token & QTD_STS_BABBLE) {
2388*53ee8cc1Swenshuai.xi diag_printf(" [ !!!! USB QTD_STS_BABBLE !!!!] \n ");
2389*53ee8cc1Swenshuai.xi /* FIXME "must" disable babbling device's port too */
2390*53ee8cc1Swenshuai.xi urb->status = -EOVERFLOW;
2391*53ee8cc1Swenshuai.xi } else if (token & QTD_STS_MMF) {
2392*53ee8cc1Swenshuai.xi diag_printf(" [ !!!! USB QTD_STS_MMF !!!!] \n ");
2393*53ee8cc1Swenshuai.xi /* fs/ls interrupt xfer missed the complete-split */
2394*53ee8cc1Swenshuai.xi urb->status = -EPROTO;
2395*53ee8cc1Swenshuai.xi } else if (token & QTD_STS_DBE) {
2396*53ee8cc1Swenshuai.xi diag_printf(" [ !!!! USB QTD_STS_DBE !!!!] \n ");
2397*53ee8cc1Swenshuai.xi urb->status = (QTD_PID (token) == 1) /* IN ? */
2398*53ee8cc1Swenshuai.xi ? -ENOSR /* hc couldn't read data */
2399*53ee8cc1Swenshuai.xi : -ECOMM; /* hc couldn't write data */
2400*53ee8cc1Swenshuai.xi } else if (token & QTD_STS_XACT) {
2401*53ee8cc1Swenshuai.xi diag_printf(" [ USB QTD_STS_XACT ] \n ");
2402*53ee8cc1Swenshuai.xi /* timeout, bad crc, wrong PID, etc; retried */
2403*53ee8cc1Swenshuai.xi if (QTD_CERR (token))
2404*53ee8cc1Swenshuai.xi urb->status = -EPIPE;
2405*53ee8cc1Swenshuai.xi else {
2406*53ee8cc1Swenshuai.xi
2407*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2408*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2409*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2410*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2411*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2412*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2413*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2414*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2415*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2416*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2417*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2418*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2419*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2420*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2421*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2422*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2423*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2424*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2425*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2426*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2427*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2428*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2429*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2430*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2431*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2432*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2433*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2434*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2435*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2436*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2437*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2438*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2439*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2440*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2441*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2442*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2443*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2444*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2445*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2446*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2447*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2448*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2449*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2450*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2451*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2452*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2453*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2454*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2455*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "devpath %s ep%d%s 3strikes\n",
2456*53ee8cc1Swenshuai.xi urb->dev->devpath,
2457*53ee8cc1Swenshuai.xi usb_pipeendpoint (urb->pipe),
2458*53ee8cc1Swenshuai.xi usb_pipein (urb->pipe) ? "in" : "out");
2459*53ee8cc1Swenshuai.xi urb->status = -EPROTO;
2460*53ee8cc1Swenshuai.xi }
2461*53ee8cc1Swenshuai.xi /* CERR nonzero + no errors + halt --> stall */
2462*53ee8cc1Swenshuai.xi } else if (QTD_CERR (token))
2463*53ee8cc1Swenshuai.xi urb->status = -EPIPE;
2464*53ee8cc1Swenshuai.xi else /* unknown */
2465*53ee8cc1Swenshuai.xi urb->status = -EPROTO;
2466*53ee8cc1Swenshuai.xi
2467*53ee8cc1Swenshuai.xi ehci_vdbg (ehci,
2468*53ee8cc1Swenshuai.xi "dev%d ep%d%s qtd token %08x --> status %d\n",
2469*53ee8cc1Swenshuai.xi usb_pipedevice (urb->pipe),
2470*53ee8cc1Swenshuai.xi usb_pipeendpoint (urb->pipe),
2471*53ee8cc1Swenshuai.xi usb_pipein (urb->pipe) ? "in" : "out",
2472*53ee8cc1Swenshuai.xi token, urb->status);
2473*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2474*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2475*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2476*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2477*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2478*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2479*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2480*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2481*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2482*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2483*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2484*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2485*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2486*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2487*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2488*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2489*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2490*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2491*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2492*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2493*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2494*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2495*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2496*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2497*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2498*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2499*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2500*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2501*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2502*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2503*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2504*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2505*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2506*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2507*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2508*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2509*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2510*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2511*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2512*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2513*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2514*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2515*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2516*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2517*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2518*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2519*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2520*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2521*53ee8cc1Swenshuai.xi
2522*53ee8cc1Swenshuai.xi if( urb->status < 0 )
2523*53ee8cc1Swenshuai.xi {
2524*53ee8cc1Swenshuai.xi //show error messafe if transfers urb fail
2525*53ee8cc1Swenshuai.xi usb_msg("msg: dev%d ep%d%s qtd token %08x --> status %d, len=%d",
2526*53ee8cc1Swenshuai.xi usb_pipedevice (urb->pipe),
2527*53ee8cc1Swenshuai.xi usb_pipeendpoint (urb->pipe),
2528*53ee8cc1Swenshuai.xi usb_pipein (urb->pipe) ? "in" : "out",
2529*53ee8cc1Swenshuai.xi token, urb->status, urb->transfer_buffer_length);
2530*53ee8cc1Swenshuai.xi }
2531*53ee8cc1Swenshuai.xi
2532*53ee8cc1Swenshuai.xi
2533*53ee8cc1Swenshuai.xi /* stall indicates some recovery action is needed */
2534*53ee8cc1Swenshuai.xi if (urb->status == -EPIPE) {
2535*53ee8cc1Swenshuai.xi int pipe = urb->pipe;
2536*53ee8cc1Swenshuai.xi
2537*53ee8cc1Swenshuai.xi if (!usb_pipecontrol (pipe))
2538*53ee8cc1Swenshuai.xi usb_endpoint_halt (urb->dev,
2539*53ee8cc1Swenshuai.xi usb_pipeendpoint (pipe),
2540*53ee8cc1Swenshuai.xi usb_pipeout (pipe));
2541*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2542*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2543*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2544*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2545*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2546*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2547*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2548*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2549*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2550*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2551*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2552*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2553*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2554*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2555*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2556*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2557*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2558*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2559*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2560*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2561*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2562*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2563*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2564*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2565*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2566*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2567*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2568*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2569*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2570*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2571*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2572*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2573*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2574*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2575*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2576*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2577*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2578*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2579*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2580*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2581*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2582*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2583*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2584*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2585*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2586*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2587*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2588*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2589*53ee8cc1Swenshuai.xi
2590*53ee8cc1Swenshuai.xi /* if async CSPLIT failed, try cleaning out the TT buffer */
2591*53ee8cc1Swenshuai.xi #ifdef USB_EHCI_TT
2592*53ee8cc1Swenshuai.xi } else if (urb->dev->tt && !usb_pipeint (urb->pipe)
2593*53ee8cc1Swenshuai.xi && QTD_CERR(token) == 0) {
2594*53ee8cc1Swenshuai.xi #ifdef DEBUG
2595*53ee8cc1Swenshuai.xi struct usb_device *tt = urb->dev->tt->hub;
2596*53ee8cc1Swenshuai.xi dev_dbg (&tt->dev,
2597*53ee8cc1Swenshuai.xi "clear tt buffer port %d, a%d ep%d t%08x\n",
2598*53ee8cc1Swenshuai.xi urb->dev->ttport, urb->dev->devnum,
2599*53ee8cc1Swenshuai.xi usb_pipeendpoint (urb->pipe), token);
2600*53ee8cc1Swenshuai.xi #endif /* DEBUG */
2601*53ee8cc1Swenshuai.xi usb_hub_tt_clear_buffer (urb->dev, urb->pipe);
2602*53ee8cc1Swenshuai.xi }
2603*53ee8cc1Swenshuai.xi #else
2604*53ee8cc1Swenshuai.xi }
2605*53ee8cc1Swenshuai.xi #endif
2606*53ee8cc1Swenshuai.xi }
2607*53ee8cc1Swenshuai.xi }
2608*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2609*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2610*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2611*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2612*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2613*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2614*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2615*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2616*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2617*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2618*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2619*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2620*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2621*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2622*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2623*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2624*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2625*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2626*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2627*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2628*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2629*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2630*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2631*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2632*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2633*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2634*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2635*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2636*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2637*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2638*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2639*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2640*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2641*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2642*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2643*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2644*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2645*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2646*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2647*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2648*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2649*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2650*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2651*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2652*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2653*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2654*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2655*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2656*53ee8cc1Swenshuai.xi
2657*53ee8cc1Swenshuai.xi static void
ehci_urb_done(struct ehci_hcd * ehci,struct urb * urb,struct pt_regs * regs)2658*53ee8cc1Swenshuai.xi ehci_urb_done (struct ehci_hcd *ehci, struct urb *urb, struct pt_regs *regs)
2659*53ee8cc1Swenshuai.xi {
2660*53ee8cc1Swenshuai.xi if (likely (urb->hcpriv != 0)) {
2661*53ee8cc1Swenshuai.xi struct ehci_qh *qh = (struct ehci_qh *) urb->hcpriv;
2662*53ee8cc1Swenshuai.xi
2663*53ee8cc1Swenshuai.xi /* S-mask in a QH means it's an interrupt urb */
2664*53ee8cc1Swenshuai.xi if ((qh->hw_info2 & CPUToLE32 (0x00ff)) != 0) {
2665*53ee8cc1Swenshuai.xi
2666*53ee8cc1Swenshuai.xi /* ... update hc-wide periodic stats (for usbfs) */
2667*53ee8cc1Swenshuai.xi hcd_to_bus (&ehci->hcd)->bandwidth_int_reqs--;
2668*53ee8cc1Swenshuai.xi }
2669*53ee8cc1Swenshuai.xi qh_put (ehci, qh);
2670*53ee8cc1Swenshuai.xi }
2671*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2672*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2673*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2674*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2675*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2676*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2677*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2678*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2679*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2680*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2681*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2682*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2683*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2684*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2685*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2686*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2687*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2688*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2689*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2690*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2691*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2692*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2693*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2694*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2695*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2696*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2697*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2698*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2699*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2700*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2701*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2702*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2703*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2704*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2705*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2706*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2707*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2708*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2709*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2710*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2711*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2712*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2713*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2714*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2715*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2716*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2717*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2718*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2719*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2720*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2721*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2722*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2723*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2724*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2725*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2726*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2727*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2728*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2729*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2730*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2731*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2732*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2733*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2734*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2735*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2736*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2737*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2738*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2739*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2740*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2741*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2742*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2743*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2744*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2745*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2746*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2747*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2748*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2749*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2750*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2751*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2752*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2753*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2754*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2755*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2756*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2757*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2758*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2759*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2760*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2761*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2762*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2763*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2764*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2765*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2766*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2767*53ee8cc1Swenshuai.xi
2768*53ee8cc1Swenshuai.xi spin_lock (&urb->lock);
2769*53ee8cc1Swenshuai.xi urb->hcpriv = 0;
2770*53ee8cc1Swenshuai.xi switch (urb->status) {
2771*53ee8cc1Swenshuai.xi case -EINPROGRESS: /* success */
2772*53ee8cc1Swenshuai.xi urb->status = 0;
2773*53ee8cc1Swenshuai.xi default: /* fault */
2774*53ee8cc1Swenshuai.xi COUNT (ehci->stats.complete);
2775*53ee8cc1Swenshuai.xi break;
2776*53ee8cc1Swenshuai.xi case -EREMOTEIO: /* fault or normal */
2777*53ee8cc1Swenshuai.xi if (!(urb->transfer_flags & URB_SHORT_NOT_OK))
2778*53ee8cc1Swenshuai.xi urb->status = 0;
2779*53ee8cc1Swenshuai.xi COUNT (ehci->stats.complete);
2780*53ee8cc1Swenshuai.xi break;
2781*53ee8cc1Swenshuai.xi
2782*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2783*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2784*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2785*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2786*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2787*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2788*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2789*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2790*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2791*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2792*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2793*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2794*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2795*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2796*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2797*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2798*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2799*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2800*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2801*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2802*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2803*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2804*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2805*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2806*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2807*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2808*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2809*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2810*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2811*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2812*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2813*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2814*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2815*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2816*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2817*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2818*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2819*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2820*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2821*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2822*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2823*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2824*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2825*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2826*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2827*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2828*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2829*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2830*53ee8cc1Swenshuai.xi case -ECONNRESET: /* canceled */
2831*53ee8cc1Swenshuai.xi case -ENOENT:
2832*53ee8cc1Swenshuai.xi COUNT (ehci->stats.unlink);
2833*53ee8cc1Swenshuai.xi break;
2834*53ee8cc1Swenshuai.xi }
2835*53ee8cc1Swenshuai.xi spin_unlock (&urb->lock);
2836*53ee8cc1Swenshuai.xi
2837*53ee8cc1Swenshuai.xi /* complete() can reenter this HCD */
2838*53ee8cc1Swenshuai.xi spin_unlock (&ehci->lock);
2839*53ee8cc1Swenshuai.xi #ifdef EHCI_VERBOSE_DEBUG
2840*53ee8cc1Swenshuai.xi urb_print (urb, "RET", usb_pipeout (urb->pipe));
2841*53ee8cc1Swenshuai.xi #endif
2842*53ee8cc1Swenshuai.xi usb_hcd_giveback_urb (&ehci->hcd, urb, regs);
2843*53ee8cc1Swenshuai.xi spin_lock (&ehci->lock);
2844*53ee8cc1Swenshuai.xi }
2845*53ee8cc1Swenshuai.xi
2846*53ee8cc1Swenshuai.xi
2847*53ee8cc1Swenshuai.xi
2848*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2849*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2850*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2851*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2852*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2853*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2854*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2855*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2856*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2857*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2858*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2859*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2860*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2861*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2862*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2863*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2864*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2865*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2866*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2867*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2868*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2869*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2870*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2871*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2872*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2873*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2874*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2875*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2876*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2877*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2878*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2879*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2880*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2881*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2882*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2883*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2884*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2885*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2886*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2887*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2888*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2889*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2890*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2891*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2892*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2893*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2894*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2895*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2896*53ee8cc1Swenshuai.xi #define HALT_BIT CPUToLE32(QTD_STS_HALT)
2897*53ee8cc1Swenshuai.xi static unsigned
qh_completions(struct ehci_hcd * ehci,struct ehci_qh * qh,struct pt_regs * regs)2898*53ee8cc1Swenshuai.xi qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh, struct pt_regs *regs)
2899*53ee8cc1Swenshuai.xi {
2900*53ee8cc1Swenshuai.xi struct ehci_qtd *last = 0, *end = qh->dummy;
2901*53ee8cc1Swenshuai.xi struct list_head *entry, *tmp;
2902*53ee8cc1Swenshuai.xi int stopped;
2903*53ee8cc1Swenshuai.xi unsigned count = 0;
2904*53ee8cc1Swenshuai.xi int do_status = 0;
2905*53ee8cc1Swenshuai.xi unsigned char state;
2906*53ee8cc1Swenshuai.xi BOOL bIsPageOver = FALSE;
2907*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2908*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2909*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2910*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2911*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2912*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2913*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2914*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2915*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2916*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2917*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2918*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2919*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2920*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2921*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2922*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2923*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2924*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2925*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2926*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2927*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2928*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2929*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2930*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2931*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2932*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2933*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2934*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2935*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2936*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2937*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2938*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2939*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2940*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2941*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2942*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2943*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2944*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2945*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2946*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2947*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2948*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2949*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2950*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2951*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2952*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2953*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2954*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2955*53ee8cc1Swenshuai.xi
2956*53ee8cc1Swenshuai.xi if (unlikely (list_empty (&qh->qtd_list)))
2957*53ee8cc1Swenshuai.xi return count;
2958*53ee8cc1Swenshuai.xi
2959*53ee8cc1Swenshuai.xi state = qh->qh_state;
2960*53ee8cc1Swenshuai.xi qh->qh_state = QH_STATE_COMPLETING;
2961*53ee8cc1Swenshuai.xi stopped = (state == QH_STATE_IDLE);
2962*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2963*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2964*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2965*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2966*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2967*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2968*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2969*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2970*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2971*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2972*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2973*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2974*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2975*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2976*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2977*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2978*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2979*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2980*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2981*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2982*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2983*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2984*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2985*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2986*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2987*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2988*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2989*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2990*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2991*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2992*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2993*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2994*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2995*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2996*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2997*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2998*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
2999*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3000*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3001*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3002*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3003*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3004*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3005*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3006*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3007*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3008*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3009*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3010*53ee8cc1Swenshuai.xi
3011*53ee8cc1Swenshuai.xi list_for_each_safe (entry, tmp, &qh->qtd_list) {
3012*53ee8cc1Swenshuai.xi struct ehci_qtd *qtd;
3013*53ee8cc1Swenshuai.xi struct urb *urb;
3014*53ee8cc1Swenshuai.xi U32 token = 0;
3015*53ee8cc1Swenshuai.xi
3016*53ee8cc1Swenshuai.xi qtd = list_entry (entry, struct ehci_qtd, qtd_list);
3017*53ee8cc1Swenshuai.xi //list_entry (entry, struct ehci_qtd,qtd_list, struct list_head,qtd);
3018*53ee8cc1Swenshuai.xi urb = qtd->urb;
3019*53ee8cc1Swenshuai.xi
3020*53ee8cc1Swenshuai.xi if ( ((qtd->hw_token >> 12) & 0x7) > 5) //For patching H/W bug
3021*53ee8cc1Swenshuai.xi {
3022*53ee8cc1Swenshuai.xi // diag_printf("Set Over Page !!!\n");
3023*53ee8cc1Swenshuai.xi bIsPageOver = TRUE;
3024*53ee8cc1Swenshuai.xi }
3025*53ee8cc1Swenshuai.xi
3026*53ee8cc1Swenshuai.xi /* clean up any state from previous QTD ...*/
3027*53ee8cc1Swenshuai.xi if (last) {
3028*53ee8cc1Swenshuai.xi if (likely (last->urb != urb)) {
3029*53ee8cc1Swenshuai.xi ehci_urb_done (ehci, last->urb, regs);
3030*53ee8cc1Swenshuai.xi count++;
3031*53ee8cc1Swenshuai.xi }
3032*53ee8cc1Swenshuai.xi
3033*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3034*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3035*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3036*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3037*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3038*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3039*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3040*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3041*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3042*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3043*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3044*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3045*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3046*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3047*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3048*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3049*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3050*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3051*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3052*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3053*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3054*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3055*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3056*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3057*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3058*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3059*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3060*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3061*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3062*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3063*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3064*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3065*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3066*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3067*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3068*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3069*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3070*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3071*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3072*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3073*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3074*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3075*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3076*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3077*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3078*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3079*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3080*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3081*53ee8cc1Swenshuai.xi ehci_qtd_free (ehci, last);
3082*53ee8cc1Swenshuai.xi last = 0;
3083*53ee8cc1Swenshuai.xi }
3084*53ee8cc1Swenshuai.xi
3085*53ee8cc1Swenshuai.xi /* ignore urbs submitted during completions we reported */
3086*53ee8cc1Swenshuai.xi if (qtd == end)
3087*53ee8cc1Swenshuai.xi break;
3088*53ee8cc1Swenshuai.xi
3089*53ee8cc1Swenshuai.xi /* hardware copies qtd out of qh overlay */
3090*53ee8cc1Swenshuai.xi rmb ();
3091*53ee8cc1Swenshuai.xi
3092*53ee8cc1Swenshuai.xi token = LE32ToCPU (qtd->hw_token);
3093*53ee8cc1Swenshuai.xi
3094*53ee8cc1Swenshuai.xi /* always clean up qtds the hc de-activated */
3095*53ee8cc1Swenshuai.xi if ((token & QTD_STS_ACTIVE) == 0) {
3096*53ee8cc1Swenshuai.xi
3097*53ee8cc1Swenshuai.xi if ((token & QTD_STS_HALT) != 0) {
3098*53ee8cc1Swenshuai.xi stopped = 1;
3099*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3100*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3101*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3102*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3103*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3104*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3105*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3106*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3107*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3108*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3109*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3110*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3111*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3112*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3113*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3114*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3115*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3116*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3117*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3118*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3119*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3120*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3121*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3122*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3123*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3124*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3125*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3126*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3127*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3128*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3129*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3130*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3131*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3132*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3133*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3134*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3135*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3136*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3137*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3138*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3139*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3140*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3141*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3142*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3143*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3144*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3145*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3146*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3147*53ee8cc1Swenshuai.xi
3148*53ee8cc1Swenshuai.xi } else if (IS_SHORT_READ (token)
3149*53ee8cc1Swenshuai.xi && (qh->hw_alt_next & QTD_MASK)
3150*53ee8cc1Swenshuai.xi == ehci->async->hw_alt_next) {
3151*53ee8cc1Swenshuai.xi stopped = 1;
3152*53ee8cc1Swenshuai.xi goto halt;
3153*53ee8cc1Swenshuai.xi } /*else if (IS_SHORT_READ (token)) {
3154*53ee8cc1Swenshuai.xi #if 0
3155*53ee8cc1Swenshuai.xi qh->hw_token &= __constant_cpu_to_le32 (QTD_TOGGLE | QTD_STS_PING);
3156*53ee8cc1Swenshuai.xi #else
3157*53ee8cc1Swenshuai.xi stopped = 1;
3158*53ee8cc1Swenshuai.xi goto halt;
3159*53ee8cc1Swenshuai.xi #endif
3160*53ee8cc1Swenshuai.xi }*/
3161*53ee8cc1Swenshuai.xi /* stop scanning when we reach qtds the hc is using */
3162*53ee8cc1Swenshuai.xi } else if (likely (!stopped
3163*53ee8cc1Swenshuai.xi && HCD_IS_RUNNING (ehci->hcd.state))) {
3164*53ee8cc1Swenshuai.xi break;
3165*53ee8cc1Swenshuai.xi
3166*53ee8cc1Swenshuai.xi } else {
3167*53ee8cc1Swenshuai.xi stopped = 1;
3168*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3169*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3170*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3171*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3172*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3173*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3174*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3175*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3176*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3177*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3178*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3179*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3180*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3181*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3182*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3183*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3184*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3185*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3186*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3187*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3188*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3189*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3190*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3191*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3192*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3193*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3194*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3195*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3196*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3197*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3198*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3199*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3200*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3201*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3202*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3203*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3204*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3205*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3206*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3207*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3208*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3209*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3210*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3211*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3212*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3213*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3214*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3215*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3216*53ee8cc1Swenshuai.xi
3217*53ee8cc1Swenshuai.xi if (likely (urb->status == -EINPROGRESS))
3218*53ee8cc1Swenshuai.xi continue;
3219*53ee8cc1Swenshuai.xi
3220*53ee8cc1Swenshuai.xi /* issue status after short control reads */
3221*53ee8cc1Swenshuai.xi if (unlikely (do_status != 0)
3222*53ee8cc1Swenshuai.xi && QTD_PID (token) == 0 /* OUT */) {
3223*53ee8cc1Swenshuai.xi do_status = 0;
3224*53ee8cc1Swenshuai.xi continue;
3225*53ee8cc1Swenshuai.xi }
3226*53ee8cc1Swenshuai.xi
3227*53ee8cc1Swenshuai.xi /* token in overlay may be most current */
3228*53ee8cc1Swenshuai.xi if (state == QH_STATE_IDLE
3229*53ee8cc1Swenshuai.xi && CPUToLE32 (qtd->qtd_dma)
3230*53ee8cc1Swenshuai.xi == qh->hw_current)
3231*53ee8cc1Swenshuai.xi token = LE32ToCPU (qh->hw_token);
3232*53ee8cc1Swenshuai.xi
3233*53ee8cc1Swenshuai.xi if ((HALT_BIT & qh->hw_token) == 0) {
3234*53ee8cc1Swenshuai.xi halt:
3235*53ee8cc1Swenshuai.xi qh->hw_token |= HALT_BIT;
3236*53ee8cc1Swenshuai.xi wmb ();
3237*53ee8cc1Swenshuai.xi }
3238*53ee8cc1Swenshuai.xi }
3239*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3240*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3241*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3242*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3243*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3244*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3245*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3246*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3247*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3248*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3249*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3250*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3251*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3252*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3253*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3254*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3255*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3256*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3257*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3258*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3259*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3260*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3261*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3262*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3263*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3264*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3265*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3266*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3267*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3268*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3269*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3270*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3271*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3272*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3273*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3274*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3275*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3276*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3277*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3278*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3279*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3280*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3281*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3282*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3283*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3284*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3285*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3286*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3287*53ee8cc1Swenshuai.xi
3288*53ee8cc1Swenshuai.xi /* remove it from the queue */
3289*53ee8cc1Swenshuai.xi spin_lock (&urb->lock);
3290*53ee8cc1Swenshuai.xi qtd_copy_status (ehci, urb, qtd->length, token);
3291*53ee8cc1Swenshuai.xi if (bIsPageOver)
3292*53ee8cc1Swenshuai.xi {
3293*53ee8cc1Swenshuai.xi //diag_printf("urb error because C_Page > 5\n");
3294*53ee8cc1Swenshuai.xi urb->status = (QTD_PID (token) == 1) /* IN ? */
3295*53ee8cc1Swenshuai.xi ? -ENOSR /* hc couldn't read data */
3296*53ee8cc1Swenshuai.xi : -ECOMM; /* hc couldn't write data */
3297*53ee8cc1Swenshuai.xi }
3298*53ee8cc1Swenshuai.xi do_status = (urb->status == -EREMOTEIO)
3299*53ee8cc1Swenshuai.xi && usb_pipecontrol (urb->pipe);
3300*53ee8cc1Swenshuai.xi spin_unlock (&urb->lock);
3301*53ee8cc1Swenshuai.xi
3302*53ee8cc1Swenshuai.xi if (stopped && qtd->qtd_list.prev != &qh->qtd_list) {
3303*53ee8cc1Swenshuai.xi last = list_entry (qtd->qtd_list.prev, struct ehci_qtd, qtd_list);
3304*53ee8cc1Swenshuai.xi //list_entry (qtd->qtd_list.prev,struct ehci_qtd,qtd_list, struct list_head,last);
3305*53ee8cc1Swenshuai.xi last->hw_next = qtd->hw_next;
3306*53ee8cc1Swenshuai.xi
3307*53ee8cc1Swenshuai.xi }
3308*53ee8cc1Swenshuai.xi list_del (&qtd->qtd_list);
3309*53ee8cc1Swenshuai.xi last = qtd;
3310*53ee8cc1Swenshuai.xi } /* list_for_each_safe */
3311*53ee8cc1Swenshuai.xi
3312*53ee8cc1Swenshuai.xi if (likely (last != 0)) {
3313*53ee8cc1Swenshuai.xi ehci_urb_done (ehci, last->urb, regs);
3314*53ee8cc1Swenshuai.xi count++;
3315*53ee8cc1Swenshuai.xi ehci_qtd_free (ehci, last);
3316*53ee8cc1Swenshuai.xi last = 0;
3317*53ee8cc1Swenshuai.xi }
3318*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3319*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3320*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3321*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3322*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3323*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3324*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3325*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3326*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3327*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3328*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3329*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3330*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3331*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3332*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3333*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3334*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3335*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3336*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3337*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3338*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3339*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3340*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3341*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3342*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3343*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3344*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3345*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3346*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3347*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3348*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3349*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3350*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3351*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3352*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3353*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3354*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3355*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3356*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3357*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3358*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3359*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3360*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3361*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3362*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3363*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3364*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3365*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3366*53ee8cc1Swenshuai.xi
3367*53ee8cc1Swenshuai.xi qh->qh_state = state;
3368*53ee8cc1Swenshuai.xi
3369*53ee8cc1Swenshuai.xi if (unlikely (stopped != 0)
3370*53ee8cc1Swenshuai.xi /* some EHCI 0.95 impls will overlay dummy qtds */
3371*53ee8cc1Swenshuai.xi || qh->hw_qtd_next == EHCI_LIST_END) {
3372*53ee8cc1Swenshuai.xi if (list_empty (&qh->qtd_list))
3373*53ee8cc1Swenshuai.xi end = qh->dummy;
3374*53ee8cc1Swenshuai.xi else {
3375*53ee8cc1Swenshuai.xi end = list_entry (qh->qtd_list.next,struct ehci_qtd, qtd_list);
3376*53ee8cc1Swenshuai.xi //list_entry (qh->qtd_list.next,struct ehci_qtd, qtd_list, struct list_head, end);
3377*53ee8cc1Swenshuai.xi if (CPUToLE32 (end->qtd_dma) == qh->hw_current)
3378*53ee8cc1Swenshuai.xi end = 0;
3379*53ee8cc1Swenshuai.xi }
3380*53ee8cc1Swenshuai.xi if (end)
3381*53ee8cc1Swenshuai.xi qh_update (ehci, qh, end);
3382*53ee8cc1Swenshuai.xi }
3383*53ee8cc1Swenshuai.xi
3384*53ee8cc1Swenshuai.xi return count;
3385*53ee8cc1Swenshuai.xi }
3386*53ee8cc1Swenshuai.xi
3387*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
3388*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3389*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3390*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3391*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3392*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3393*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3394*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3395*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3396*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3397*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3398*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3399*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3400*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3401*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3402*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3403*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3404*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3405*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3406*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3407*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3408*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3409*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3410*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3411*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3412*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3413*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3414*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3415*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3416*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3417*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3418*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3419*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3420*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3421*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3422*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3423*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3424*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3425*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3426*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3427*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3428*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3429*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3430*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3431*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3432*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3433*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3434*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3435*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3436*53ee8cc1Swenshuai.xi
3437*53ee8cc1Swenshuai.xi // high bandwidth multiplier, as encoded in highspeed endpoint descriptors
3438*53ee8cc1Swenshuai.xi #define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))
3439*53ee8cc1Swenshuai.xi // ... and packet size, for any kind of endpoint descriptor
3440*53ee8cc1Swenshuai.xi #define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)
3441*53ee8cc1Swenshuai.xi
qtd_list_free(struct ehci_hcd * ehci,struct urb * urb,struct list_head * qtd_list)3442*53ee8cc1Swenshuai.xi static void qtd_list_free (
3443*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci,
3444*53ee8cc1Swenshuai.xi struct urb *urb,
3445*53ee8cc1Swenshuai.xi struct list_head *qtd_list
3446*53ee8cc1Swenshuai.xi ) {
3447*53ee8cc1Swenshuai.xi struct list_head *entry, *temp;
3448*53ee8cc1Swenshuai.xi
3449*53ee8cc1Swenshuai.xi list_for_each_safe (entry, temp, qtd_list) {
3450*53ee8cc1Swenshuai.xi struct ehci_qtd *qtd;
3451*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3452*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3453*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3454*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3455*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3456*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3457*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3458*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3459*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3460*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3461*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3462*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3463*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3464*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3465*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3466*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3467*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3468*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3469*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3470*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3471*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3472*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3473*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3474*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3475*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3476*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3477*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3478*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3479*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3480*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3481*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3482*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3483*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3484*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3485*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3486*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3487*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3488*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3489*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3490*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3491*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3492*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3493*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3494*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3495*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3496*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3497*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3498*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3499*53ee8cc1Swenshuai.xi
3500*53ee8cc1Swenshuai.xi qtd = list_entry (entry, struct ehci_qtd, qtd_list);
3501*53ee8cc1Swenshuai.xi //list_entry (entry, struct ehci_qtd, qtd_list,struct list_head, qtd);
3502*53ee8cc1Swenshuai.xi list_del (&qtd->qtd_list);
3503*53ee8cc1Swenshuai.xi ehci_qtd_free (ehci, qtd);
3504*53ee8cc1Swenshuai.xi }
3505*53ee8cc1Swenshuai.xi }
3506*53ee8cc1Swenshuai.xi
3507*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3508*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3509*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3510*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3511*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3512*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3513*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3514*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3515*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3516*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3517*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3518*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3519*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3520*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3521*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3522*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3523*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3524*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3525*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3526*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3527*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3528*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3529*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3530*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3531*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3532*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3533*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3534*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3535*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3536*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3537*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3538*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3539*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3540*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3541*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3542*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3543*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3544*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3545*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3546*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3547*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3548*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3549*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3550*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3551*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3552*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3553*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3554*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3555*53ee8cc1Swenshuai.xi
3556*53ee8cc1Swenshuai.xi static struct list_head *
qh_urb_transaction(struct ehci_hcd * ehci,struct urb * urb,struct list_head * head,int flags)3557*53ee8cc1Swenshuai.xi qh_urb_transaction (
3558*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci,
3559*53ee8cc1Swenshuai.xi struct urb *urb,
3560*53ee8cc1Swenshuai.xi struct list_head *head,
3561*53ee8cc1Swenshuai.xi int flags
3562*53ee8cc1Swenshuai.xi ) {
3563*53ee8cc1Swenshuai.xi struct ehci_qtd *qtd, *qtd_prev;
3564*53ee8cc1Swenshuai.xi dma_addr_t buf;
3565*53ee8cc1Swenshuai.xi int len, maxpacket;
3566*53ee8cc1Swenshuai.xi int is_input;
3567*53ee8cc1Swenshuai.xi U32 token;
3568*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3569*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3570*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3571*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3572*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3573*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3574*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3575*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3576*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3577*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3578*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3579*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3580*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3581*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3582*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3583*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3584*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3585*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3586*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3587*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3588*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3589*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3590*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3591*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3592*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3593*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3594*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3595*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3596*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3597*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3598*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3599*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3600*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3601*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3602*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3603*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3604*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3605*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3606*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3607*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3608*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3609*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3610*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3611*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3612*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3613*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3614*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3615*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3616*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3617*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3618*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3619*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3620*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3621*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3622*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3623*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3624*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3625*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3626*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3627*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3628*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3629*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3630*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3631*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3632*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3633*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3634*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3635*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3636*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3637*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3638*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3639*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3640*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3641*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3642*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3643*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3644*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3645*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3646*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3647*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3648*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3649*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3650*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3651*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3652*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3653*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3654*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3655*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3656*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3657*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3658*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3659*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3660*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3661*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3662*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3663*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3664*53ee8cc1Swenshuai.xi
3665*53ee8cc1Swenshuai.xi qtd = ehci_qtd_alloc (ehci, flags);
3666*53ee8cc1Swenshuai.xi if (unlikely (!qtd))
3667*53ee8cc1Swenshuai.xi return 0;
3668*53ee8cc1Swenshuai.xi list_add_tail (&qtd->qtd_list, head);
3669*53ee8cc1Swenshuai.xi qtd->urb = urb;
3670*53ee8cc1Swenshuai.xi
3671*53ee8cc1Swenshuai.xi token = QTD_STS_ACTIVE;
3672*53ee8cc1Swenshuai.xi token |= (EHCI_TUNE_CERR << 10);
3673*53ee8cc1Swenshuai.xi /* for split transactions, SplitXState initialized to zero */
3674*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3675*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3676*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3677*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3678*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3679*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3680*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3681*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3682*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3683*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3684*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3685*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3686*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3687*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3688*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3689*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3690*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3691*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3692*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3693*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3694*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3695*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3696*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3697*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3698*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3699*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3700*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3701*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3702*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3703*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3704*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3705*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3706*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3707*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3708*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3709*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3710*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3711*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3712*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3713*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3714*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3715*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3716*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3717*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3718*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3719*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3720*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3721*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3722*53ee8cc1Swenshuai.xi
3723*53ee8cc1Swenshuai.xi len = urb->transfer_buffer_length;
3724*53ee8cc1Swenshuai.xi is_input = usb_pipein (urb->pipe);
3725*53ee8cc1Swenshuai.xi if (usb_pipecontrol (urb->pipe)) {
3726*53ee8cc1Swenshuai.xi /* SETUP pid */
3727*53ee8cc1Swenshuai.xi qtd_fill (qtd, urb->setup_dma, sizeof (struct usb_ctrlrequest),
3728*53ee8cc1Swenshuai.xi token | (2 /* "setup" */ << 8), 8);
3729*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3730*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3731*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3732*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3733*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3734*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3735*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3736*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3737*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3738*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3739*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3740*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3741*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3742*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3743*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3744*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3745*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3746*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3747*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3748*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3749*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3750*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3751*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3752*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3753*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3754*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3755*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3756*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3757*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3758*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3759*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3760*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3761*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3762*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3763*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3764*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3765*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3766*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3767*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3768*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3769*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3770*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3771*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3772*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3773*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3774*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3775*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3776*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3777*53ee8cc1Swenshuai.xi
3778*53ee8cc1Swenshuai.xi /* ... and always at least one more pid */
3779*53ee8cc1Swenshuai.xi token ^= QTD_TOGGLE;
3780*53ee8cc1Swenshuai.xi qtd_prev = qtd;
3781*53ee8cc1Swenshuai.xi qtd = ehci_qtd_alloc (ehci, flags);
3782*53ee8cc1Swenshuai.xi if (unlikely (!qtd))
3783*53ee8cc1Swenshuai.xi goto cleanup;
3784*53ee8cc1Swenshuai.xi qtd->urb = urb;
3785*53ee8cc1Swenshuai.xi qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);
3786*53ee8cc1Swenshuai.xi list_add_tail (&qtd->qtd_list, head);
3787*53ee8cc1Swenshuai.xi }
3788*53ee8cc1Swenshuai.xi
3789*53ee8cc1Swenshuai.xi /*
3790*53ee8cc1Swenshuai.xi * data transfer stage: buffer setup
3791*53ee8cc1Swenshuai.xi */
3792*53ee8cc1Swenshuai.xi
3793*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3794*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3795*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3796*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3797*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3798*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3799*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3800*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3801*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3802*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3803*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3804*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3805*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3806*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3807*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3808*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3809*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3810*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3811*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3812*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3813*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3814*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3815*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3816*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3817*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3818*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3819*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3820*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3821*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3822*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3823*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3824*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3825*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3826*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3827*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3828*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3829*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3830*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3831*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3832*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3833*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3834*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3835*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3836*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3837*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3838*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3839*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3840*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3841*53ee8cc1Swenshuai.xi if (likely (len > 0))
3842*53ee8cc1Swenshuai.xi buf = urb->transfer_dma;
3843*53ee8cc1Swenshuai.xi else
3844*53ee8cc1Swenshuai.xi buf = 0;
3845*53ee8cc1Swenshuai.xi
3846*53ee8cc1Swenshuai.xi if (!buf || is_input)
3847*53ee8cc1Swenshuai.xi token |= (1 /* "in" */ << 8);
3848*53ee8cc1Swenshuai.xi /* else it's already initted to "out" pid (0 << 8) */
3849*53ee8cc1Swenshuai.xi #if 0
3850*53ee8cc1Swenshuai.xi maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
3851*53ee8cc1Swenshuai.xi #else
3852*53ee8cc1Swenshuai.xi if (usb_pipebulk(urb->pipe)) {
3853*53ee8cc1Swenshuai.xi switch (urb->dev->speed) {
3854*53ee8cc1Swenshuai.xi case USB_SPEED_FULL:
3855*53ee8cc1Swenshuai.xi maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
3856*53ee8cc1Swenshuai.xi break;
3857*53ee8cc1Swenshuai.xi case USB_SPEED_HIGH:
3858*53ee8cc1Swenshuai.xi default:
3859*53ee8cc1Swenshuai.xi maxpacket = 512;
3860*53ee8cc1Swenshuai.xi break;
3861*53ee8cc1Swenshuai.xi }
3862*53ee8cc1Swenshuai.xi }
3863*53ee8cc1Swenshuai.xi else {
3864*53ee8cc1Swenshuai.xi maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
3865*53ee8cc1Swenshuai.xi }
3866*53ee8cc1Swenshuai.xi
3867*53ee8cc1Swenshuai.xi #endif
3868*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3869*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3870*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3871*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3872*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3873*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3874*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3875*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3876*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3877*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3878*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3879*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3880*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3881*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3882*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3883*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3884*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3885*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3886*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3887*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3888*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3889*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3890*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3891*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3892*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3893*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3894*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3895*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3896*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3897*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3898*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3899*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3900*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3901*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3902*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3903*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3904*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3905*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3906*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3907*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3908*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3909*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3910*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3911*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3912*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3913*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3914*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3915*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3916*53ee8cc1Swenshuai.xi
3917*53ee8cc1Swenshuai.xi for (;;) {
3918*53ee8cc1Swenshuai.xi int this_qtd_len;
3919*53ee8cc1Swenshuai.xi
3920*53ee8cc1Swenshuai.xi
3921*53ee8cc1Swenshuai.xi this_qtd_len = qtd_fill (qtd, buf, len, token, maxpacket);
3922*53ee8cc1Swenshuai.xi len -= this_qtd_len;
3923*53ee8cc1Swenshuai.xi buf += this_qtd_len;
3924*53ee8cc1Swenshuai.xi if (is_input)
3925*53ee8cc1Swenshuai.xi qtd->hw_alt_next = ehci->async->hw_alt_next;
3926*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3927*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3928*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3929*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3930*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3931*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3932*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3933*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3934*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3935*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3936*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3937*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3938*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3939*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3940*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3941*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3942*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3943*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3944*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3945*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3946*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3947*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3948*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3949*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3950*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3951*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3952*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3953*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3954*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3955*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3956*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3957*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3958*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3959*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3960*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3961*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3962*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3963*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3964*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3965*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3966*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3967*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3968*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3969*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3970*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3971*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3972*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3973*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3974*53ee8cc1Swenshuai.xi
3975*53ee8cc1Swenshuai.xi /* qh makes control packets use qtd toggle; maybe switch it */
3976*53ee8cc1Swenshuai.xi if ((maxpacket & (this_qtd_len + (maxpacket - 1))) == 0)
3977*53ee8cc1Swenshuai.xi token ^= QTD_TOGGLE;
3978*53ee8cc1Swenshuai.xi
3979*53ee8cc1Swenshuai.xi if (likely (len <= 0))
3980*53ee8cc1Swenshuai.xi break;
3981*53ee8cc1Swenshuai.xi
3982*53ee8cc1Swenshuai.xi qtd_prev = qtd;
3983*53ee8cc1Swenshuai.xi qtd = ehci_qtd_alloc (ehci, flags);
3984*53ee8cc1Swenshuai.xi if (unlikely (!qtd))
3985*53ee8cc1Swenshuai.xi goto cleanup;
3986*53ee8cc1Swenshuai.xi qtd->urb = urb;
3987*53ee8cc1Swenshuai.xi qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);
3988*53ee8cc1Swenshuai.xi list_add_tail (&qtd->qtd_list, head);
3989*53ee8cc1Swenshuai.xi }
3990*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3991*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3992*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3993*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3994*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3995*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3996*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3997*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3998*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
3999*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4000*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4001*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4002*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4003*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4004*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4005*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4006*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4007*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4008*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4009*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4010*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4011*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4012*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4013*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4014*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4015*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4016*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4017*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4018*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4019*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4020*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4021*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4022*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4023*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4024*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4025*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4026*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4027*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4028*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4029*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4030*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4031*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4032*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4033*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4034*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4035*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4036*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4037*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4038*53ee8cc1Swenshuai.xi
4039*53ee8cc1Swenshuai.xi if (likely ((urb->transfer_flags & URB_SHORT_NOT_OK) == 0
4040*53ee8cc1Swenshuai.xi || usb_pipecontrol (urb->pipe)))
4041*53ee8cc1Swenshuai.xi qtd->hw_alt_next = EHCI_LIST_END;
4042*53ee8cc1Swenshuai.xi
4043*53ee8cc1Swenshuai.xi
4044*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4045*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4046*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4047*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4048*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4049*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4050*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4051*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4052*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4053*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4054*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4055*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4056*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4057*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4058*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4059*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4060*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4061*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4062*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4063*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4064*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4065*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4066*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4067*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4068*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4069*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4070*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4071*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4072*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4073*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4074*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4075*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4076*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4077*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4078*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4079*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4080*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4081*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4082*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4083*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4084*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4085*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4086*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4087*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4088*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4089*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4090*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4091*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4092*53ee8cc1Swenshuai.xi if (likely (buf != 0)) {
4093*53ee8cc1Swenshuai.xi int one_more = 0;
4094*53ee8cc1Swenshuai.xi
4095*53ee8cc1Swenshuai.xi if (usb_pipecontrol (urb->pipe)) {
4096*53ee8cc1Swenshuai.xi one_more = 1;
4097*53ee8cc1Swenshuai.xi token ^= 0x0100; /* "in" <--> "out" */
4098*53ee8cc1Swenshuai.xi token |= QTD_TOGGLE; /* force DATA1 */
4099*53ee8cc1Swenshuai.xi } else if (usb_pipebulk (urb->pipe)
4100*53ee8cc1Swenshuai.xi && (urb->transfer_flags & URB_ZERO_PACKET)
4101*53ee8cc1Swenshuai.xi && !(urb->transfer_buffer_length % maxpacket)) {
4102*53ee8cc1Swenshuai.xi one_more = 1;
4103*53ee8cc1Swenshuai.xi }
4104*53ee8cc1Swenshuai.xi
4105*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4106*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4107*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4108*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4109*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4110*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4111*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4112*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4113*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4114*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4115*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4116*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4117*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4118*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4119*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4120*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4121*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4122*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4123*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4124*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4125*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4126*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4127*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4128*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4129*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4130*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4131*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4132*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4133*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4134*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4135*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4136*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4137*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4138*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4139*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4140*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4141*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4142*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4143*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4144*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4145*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4146*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4147*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4148*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4149*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4150*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4151*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4152*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4153*53ee8cc1Swenshuai.xi if (one_more) {
4154*53ee8cc1Swenshuai.xi qtd_prev = qtd;
4155*53ee8cc1Swenshuai.xi qtd = ehci_qtd_alloc (ehci, flags);
4156*53ee8cc1Swenshuai.xi if (unlikely (!qtd))
4157*53ee8cc1Swenshuai.xi goto cleanup;
4158*53ee8cc1Swenshuai.xi qtd->urb = urb;
4159*53ee8cc1Swenshuai.xi qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);
4160*53ee8cc1Swenshuai.xi list_add_tail (&qtd->qtd_list, head);
4161*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4162*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4163*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4164*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4165*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4166*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4167*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4168*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4169*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4170*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4171*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4172*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4173*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4174*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4175*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4176*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4177*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4178*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4179*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4180*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4181*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4182*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4183*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4184*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4185*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4186*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4187*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4188*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4189*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4190*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4191*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4192*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4193*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4194*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4195*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4196*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4197*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4198*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4199*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4200*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4201*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4202*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4203*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4204*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4205*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4206*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4207*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4208*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4209*53ee8cc1Swenshuai.xi
4210*53ee8cc1Swenshuai.xi /* never any data in such packets */
4211*53ee8cc1Swenshuai.xi qtd_fill (qtd, 0, 0, token, 0);
4212*53ee8cc1Swenshuai.xi }
4213*53ee8cc1Swenshuai.xi }
4214*53ee8cc1Swenshuai.xi
4215*53ee8cc1Swenshuai.xi /* by default, enable interrupt on urb completion */
4216*53ee8cc1Swenshuai.xi if (likely (!(urb->transfer_flags & URB_NO_INTERRUPT)))
4217*53ee8cc1Swenshuai.xi qtd->hw_token |= CPUToLE32 (QTD_IOC);
4218*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4219*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4220*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4221*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4222*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4223*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4224*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4225*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4226*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4227*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4228*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4229*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4230*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4231*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4232*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4233*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4234*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4235*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4236*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4237*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4238*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4239*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4240*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4241*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4242*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4243*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4244*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4245*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4246*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4247*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4248*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4249*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4250*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4251*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4252*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4253*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4254*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4255*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4256*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4257*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4258*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4259*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4260*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4261*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4262*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4263*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4264*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4265*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4266*53ee8cc1Swenshuai.xi
4267*53ee8cc1Swenshuai.xi return head;
4268*53ee8cc1Swenshuai.xi
4269*53ee8cc1Swenshuai.xi cleanup:
4270*53ee8cc1Swenshuai.xi
4271*53ee8cc1Swenshuai.xi qtd_list_free (ehci, urb, head);
4272*53ee8cc1Swenshuai.xi return 0;
4273*53ee8cc1Swenshuai.xi }
4274*53ee8cc1Swenshuai.xi
4275*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
4276*53ee8cc1Swenshuai.xi
4277*53ee8cc1Swenshuai.xi static __inline__ void
clear_toggle(struct usb_device * udev,int ep,int is_out,struct ehci_qh * qh)4278*53ee8cc1Swenshuai.xi clear_toggle (struct usb_device *udev, int ep, int is_out, struct ehci_qh *qh)
4279*53ee8cc1Swenshuai.xi {
4280*53ee8cc1Swenshuai.xi vdbg ("clear toggle, dev %d ep 0x%x-%s",
4281*53ee8cc1Swenshuai.xi udev->devnum, ep, is_out ? "out" : "in");
4282*53ee8cc1Swenshuai.xi qh->hw_token &= ~(CPUToLE32(QTD_TOGGLE));
4283*53ee8cc1Swenshuai.xi
4284*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4285*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4286*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4287*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4288*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4289*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4290*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4291*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4292*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4293*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4294*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4295*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4296*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4297*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4298*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4299*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4300*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4301*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4302*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4303*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4304*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4305*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4306*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4307*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4308*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4309*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4310*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4311*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4312*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4313*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4314*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4315*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4316*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4317*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4318*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4319*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4320*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4321*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4322*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4323*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4324*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4325*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4326*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4327*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4328*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4329*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4330*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4331*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4332*53ee8cc1Swenshuai.xi usb_settoggle (udev, ep, is_out, 1);
4333*53ee8cc1Swenshuai.xi }
4334*53ee8cc1Swenshuai.xi
4335*53ee8cc1Swenshuai.xi
4336*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4337*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4338*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4339*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4340*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4341*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4342*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4343*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4344*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4345*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4346*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4347*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4348*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4349*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4350*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4351*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4352*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4353*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4354*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4355*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4356*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4357*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4358*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4359*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4360*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4361*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4362*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4363*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4364*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4365*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4366*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4367*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4368*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4369*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4370*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4371*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4372*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4373*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4374*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4375*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4376*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4377*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4378*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4379*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4380*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4381*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4382*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4383*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4384*53ee8cc1Swenshuai.xi
4385*53ee8cc1Swenshuai.xi
4386*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4387*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4388*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4389*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4390*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4391*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4392*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4393*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4394*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4395*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4396*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4397*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4398*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4399*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4400*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4401*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4402*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4403*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4404*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4405*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4406*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4407*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4408*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4409*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4410*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4411*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4412*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4413*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4414*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4415*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4416*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4417*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4418*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4419*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4420*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4421*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4422*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4423*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4424*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4425*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4426*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4427*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4428*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4429*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4430*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4431*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4432*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4433*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4434*53ee8cc1Swenshuai.xi static struct ehci_qh *
qh_make(struct ehci_hcd * ehci,struct urb * urb,int flags)4435*53ee8cc1Swenshuai.xi qh_make (
4436*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci,
4437*53ee8cc1Swenshuai.xi struct urb *urb,
4438*53ee8cc1Swenshuai.xi int flags
4439*53ee8cc1Swenshuai.xi ) {
4440*53ee8cc1Swenshuai.xi struct ehci_qh *qh = ehci_qh_alloc (ehci, flags);
4441*53ee8cc1Swenshuai.xi U32 info1 = 0, info2 = 0;
4442*53ee8cc1Swenshuai.xi int is_input, type;
4443*53ee8cc1Swenshuai.xi int maxp = 0;
4444*53ee8cc1Swenshuai.xi
4445*53ee8cc1Swenshuai.xi if (!qh)
4446*53ee8cc1Swenshuai.xi return qh;
4447*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4448*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4449*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4450*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4451*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4452*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4453*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4454*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4455*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4456*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4457*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4458*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4459*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4460*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4461*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4462*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4463*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4464*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4465*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4466*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4467*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4468*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4469*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4470*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4471*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4472*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4473*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4474*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4475*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4476*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4477*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4478*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4479*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4480*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4481*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4482*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4483*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4484*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4485*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4486*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4487*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4488*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4489*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4490*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4491*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4492*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4493*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4494*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4495*53ee8cc1Swenshuai.xi
4496*53ee8cc1Swenshuai.xi info1 |= usb_pipeendpoint (urb->pipe) << 8;
4497*53ee8cc1Swenshuai.xi info1 |= usb_pipedevice (urb->pipe) << 0;
4498*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4499*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4500*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4501*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4502*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4503*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4504*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4505*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4506*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4507*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4508*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4509*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4510*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4511*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4512*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4513*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4514*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4515*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4516*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4517*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4518*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4519*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4520*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4521*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4522*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4523*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4524*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4525*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4526*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4527*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4528*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4529*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4530*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4531*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4532*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4533*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4534*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4535*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4536*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4537*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4538*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4539*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4540*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4541*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4542*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4543*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4544*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4545*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4546*53ee8cc1Swenshuai.xi
4547*53ee8cc1Swenshuai.xi is_input = usb_pipein (urb->pipe);
4548*53ee8cc1Swenshuai.xi type = usb_pipetype (urb->pipe);
4549*53ee8cc1Swenshuai.xi maxp = usb_maxpacket (urb->dev, urb->pipe, !is_input);
4550*53ee8cc1Swenshuai.xi
4551*53ee8cc1Swenshuai.xi if (type == PIPE_INTERRUPT) {
4552*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4553*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4554*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4555*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4556*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4557*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4558*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4559*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4560*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4561*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4562*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4563*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4564*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4565*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4566*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4567*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4568*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4569*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4570*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4571*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4572*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4573*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4574*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4575*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4576*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4577*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4578*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4579*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4580*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4581*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4582*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4583*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4584*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4585*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4586*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4587*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4588*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4589*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4590*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4591*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4592*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4593*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4594*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4595*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4596*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4597*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4598*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4599*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4600*53ee8cc1Swenshuai.xi
4601*53ee8cc1Swenshuai.xi // #ifndef CONFIG_FARADAY_FOTG200
4602*53ee8cc1Swenshuai.xi qh->usecs = usb_calc_bus_time (USB_SPEED_HIGH, is_input, 0,
4603*53ee8cc1Swenshuai.xi hb_mult (maxp) * max_packet (maxp));
4604*53ee8cc1Swenshuai.xi // #else
4605*53ee8cc1Swenshuai.xi // eCurURBSpeed = urb->dev->speed;
4606*53ee8cc1Swenshuai.xi // qh->usecs = usb_calc_bus_time (urb->dev->speed, is_input, 0,max_packet (maxp));
4607*53ee8cc1Swenshuai.xi // #endif
4608*53ee8cc1Swenshuai.xi
4609*53ee8cc1Swenshuai.xi qh->start = NO_FRAME;
4610*53ee8cc1Swenshuai.xi
4611*53ee8cc1Swenshuai.xi if (urb->dev->speed == USB_SPEED_HIGH) {
4612*53ee8cc1Swenshuai.xi qh->c_usecs = 0;
4613*53ee8cc1Swenshuai.xi qh->gap_uf = 0;
4614*53ee8cc1Swenshuai.xi
4615*53ee8cc1Swenshuai.xi /* FIXME handle HS periods of less than 1 frame. */
4616*53ee8cc1Swenshuai.xi qh->period = urb->interval >> 3;
4617*53ee8cc1Swenshuai.xi if (qh->period < 1) {
4618*53ee8cc1Swenshuai.xi dbg ("intr period %d uframes, NYET!",
4619*53ee8cc1Swenshuai.xi urb->interval);
4620*53ee8cc1Swenshuai.xi goto done;
4621*53ee8cc1Swenshuai.xi }
4622*53ee8cc1Swenshuai.xi } else {
4623*53ee8cc1Swenshuai.xi #ifndef CONFIG_FARADAY_FOTG200
4624*53ee8cc1Swenshuai.xi
4625*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4626*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4627*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4628*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4629*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4630*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4631*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4632*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4633*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4634*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4635*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4636*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4637*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4638*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4639*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4640*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4641*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4642*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4643*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4644*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4645*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4646*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4647*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4648*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4649*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4650*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4651*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4652*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4653*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4654*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4655*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4656*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4657*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4658*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4659*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4660*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4661*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4662*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4663*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4664*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4665*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4666*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4667*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4668*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4669*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4670*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4671*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4672*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4673*53ee8cc1Swenshuai.xi /* gap is f(FS/LS transfer times) */
4674*53ee8cc1Swenshuai.xi qh->gap_uf = 1 + usb_calc_bus_time (urb->dev->speed,
4675*53ee8cc1Swenshuai.xi is_input, 0, maxp) / (125 * 1000);
4676*53ee8cc1Swenshuai.xi
4677*53ee8cc1Swenshuai.xi /* FIXME this just approximates SPLIT/CSPLIT times */
4678*53ee8cc1Swenshuai.xi if (is_input) { // SPLIT, gap, CSPLIT+DATA
4679*53ee8cc1Swenshuai.xi qh->c_usecs = qh->usecs + HS_USECS (0);
4680*53ee8cc1Swenshuai.xi qh->usecs = HS_USECS (1);
4681*53ee8cc1Swenshuai.xi } else { // SPLIT+DATA, gap, CSPLIT
4682*53ee8cc1Swenshuai.xi qh->usecs += HS_USECS (1);
4683*53ee8cc1Swenshuai.xi qh->c_usecs = HS_USECS (0);
4684*53ee8cc1Swenshuai.xi }
4685*53ee8cc1Swenshuai.xi qh->period = urb->interval;
4686*53ee8cc1Swenshuai.xi #else
4687*53ee8cc1Swenshuai.xi qh->period = urb->interval >> 3;
4688*53ee8cc1Swenshuai.xi #endif
4689*53ee8cc1Swenshuai.xi
4690*53ee8cc1Swenshuai.xi }
4691*53ee8cc1Swenshuai.xi }
4692*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4693*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4694*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4695*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4696*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4697*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4698*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4699*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4700*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4701*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4702*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4703*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4704*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4705*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4706*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4707*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4708*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4709*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4710*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4711*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4712*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4713*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4714*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4715*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4716*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4717*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4718*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4719*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4720*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4721*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4722*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4723*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4724*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4725*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4726*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4727*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4728*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4729*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4730*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4731*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4732*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4733*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4734*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4735*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4736*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4737*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4738*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4739*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4740*53ee8cc1Swenshuai.xi
4741*53ee8cc1Swenshuai.xi //#ifdef CONFIG_FARADAY_FOTG200
4742*53ee8cc1Swenshuai.xi #if 1
4743*53ee8cc1Swenshuai.xi switch (urb->dev->speed) {
4744*53ee8cc1Swenshuai.xi case USB_SPEED_LOW:
4745*53ee8cc1Swenshuai.xi info1 |= (1 << 12); /* EPS "low" */
4746*53ee8cc1Swenshuai.xi /* FALL THROUGH */
4747*53ee8cc1Swenshuai.xi break;
4748*53ee8cc1Swenshuai.xi case USB_SPEED_FULL:
4749*53ee8cc1Swenshuai.xi break;
4750*53ee8cc1Swenshuai.xi case USB_SPEED_HIGH:
4751*53ee8cc1Swenshuai.xi info1 |= (2 << 12); /* EPS "high" */
4752*53ee8cc1Swenshuai.xi break;
4753*53ee8cc1Swenshuai.xi default:
4754*53ee8cc1Swenshuai.xi dbg ("unknow speed %d", urb->dev->speed);
4755*53ee8cc1Swenshuai.xi break;
4756*53ee8cc1Swenshuai.xi
4757*53ee8cc1Swenshuai.xi }
4758*53ee8cc1Swenshuai.xi #endif
4759*53ee8cc1Swenshuai.xi
4760*53ee8cc1Swenshuai.xi /* using TT? */
4761*53ee8cc1Swenshuai.xi switch (urb->dev->speed) {
4762*53ee8cc1Swenshuai.xi
4763*53ee8cc1Swenshuai.xi case USB_SPEED_LOW:
4764*53ee8cc1Swenshuai.xi if (type == PIPE_CONTROL) {
4765*53ee8cc1Swenshuai.xi info1 |= 8 << 16; /* fixed maxpacket */
4766*53ee8cc1Swenshuai.xi }
4767*53ee8cc1Swenshuai.xi /* FALL THROUGH */
4768*53ee8cc1Swenshuai.xi
4769*53ee8cc1Swenshuai.xi case USB_SPEED_FULL:
4770*53ee8cc1Swenshuai.xi //#ifdef CONFIG_FARADAY_FOTG200
4771*53ee8cc1Swenshuai.xi if (type == PIPE_CONTROL && (urb->dev->speed == USB_SPEED_FULL) ) {
4772*53ee8cc1Swenshuai.xi //info1 |= 64 << 16; // fixed maxpacket
4773*53ee8cc1Swenshuai.xi info1 |= max_packet (maxp) << 16; // PIPE_INTERRUPT,PIPE_BULK,PIPE_ISOCHRONOUS
4774*53ee8cc1Swenshuai.xi }
4775*53ee8cc1Swenshuai.xi if (type != PIPE_CONTROL) {
4776*53ee8cc1Swenshuai.xi info1 |= max_packet (maxp) << 16; // PIPE_INTERRUPT,PIPE_BULK,PIPE_ISOCHRONOUS
4777*53ee8cc1Swenshuai.xi }
4778*53ee8cc1Swenshuai.xi /* EPS 0 means "full" */
4779*53ee8cc1Swenshuai.xi // info1 |= (3 << 12); /* EPS "reserve" */
4780*53ee8cc1Swenshuai.xi //#endif
4781*53ee8cc1Swenshuai.xi if (type != PIPE_INTERRUPT)
4782*53ee8cc1Swenshuai.xi info1 |= (EHCI_TUNE_RL_TT << 28);
4783*53ee8cc1Swenshuai.xi if (type == PIPE_CONTROL) {
4784*53ee8cc1Swenshuai.xi info1 |= (1 << 27); /* for TT */
4785*53ee8cc1Swenshuai.xi info1 |= 1 << 14; /* toggle from qtd */
4786*53ee8cc1Swenshuai.xi }
4787*53ee8cc1Swenshuai.xi info2 |= (EHCI_TUNE_MULT_TT << 30);
4788*53ee8cc1Swenshuai.xi
4789*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4790*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4791*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4792*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4793*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4794*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4795*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4796*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4797*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4798*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4799*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4800*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4801*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4802*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4803*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4804*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4805*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4806*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4807*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4808*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4809*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4810*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4811*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4812*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4813*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4814*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4815*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4816*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4817*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4818*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4819*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4820*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4821*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4822*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4823*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4824*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4825*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4826*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4827*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4828*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4829*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4830*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4831*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4832*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4833*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4834*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4835*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4836*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4837*53ee8cc1Swenshuai.xi //#ifndef CONFIG_FARADAY_FOTG200
4838*53ee8cc1Swenshuai.xi #if 1
4839*53ee8cc1Swenshuai.xi if (urb->dev->tt->hub->devnum != 1) // Skip the Root Hub devnum == 1
4840*53ee8cc1Swenshuai.xi {
4841*53ee8cc1Swenshuai.xi info2 |= urb->dev->ttport << 23;
4842*53ee8cc1Swenshuai.xi info2 |= urb->dev->tt->hub->devnum << 16;
4843*53ee8cc1Swenshuai.xi }
4844*53ee8cc1Swenshuai.xi #else
4845*53ee8cc1Swenshuai.xi #endif /* CONFIG_FARADAY_FOTG200 */
4846*53ee8cc1Swenshuai.xi /* NOTE: if (PIPE_INTERRUPT) { scheduler sets c-mask } */
4847*53ee8cc1Swenshuai.xi break;
4848*53ee8cc1Swenshuai.xi case USB_SPEED_HIGH: /* no TT involved */
4849*53ee8cc1Swenshuai.xi info1 |= (2 << 12); /* EPS "high" */
4850*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4851*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4852*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4853*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4854*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4855*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4856*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4857*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4858*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4859*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4860*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4861*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4862*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4863*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4864*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4865*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4866*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4867*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4868*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4869*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4870*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4871*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4872*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4873*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4874*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4875*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4876*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4877*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4878*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4879*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4880*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4881*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4882*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4883*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4884*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4885*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4886*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4887*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4888*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4889*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4890*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4891*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4892*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4893*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4894*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4895*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4896*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4897*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4898*53ee8cc1Swenshuai.xi
4899*53ee8cc1Swenshuai.xi if (type == PIPE_CONTROL) {
4900*53ee8cc1Swenshuai.xi info1 |= (EHCI_TUNE_RL_HS << 28);
4901*53ee8cc1Swenshuai.xi info1 |= 64 << 16; /* usb2 fixed maxpacket */
4902*53ee8cc1Swenshuai.xi info1 |= 1 << 14; /* toggle from qtd */
4903*53ee8cc1Swenshuai.xi info2 |= (EHCI_TUNE_MULT_HS << 30);
4904*53ee8cc1Swenshuai.xi } else if (type == PIPE_BULK) {
4905*53ee8cc1Swenshuai.xi info1 |= (EHCI_TUNE_RL_HS << 28);
4906*53ee8cc1Swenshuai.xi #if 0
4907*53ee8cc1Swenshuai.xi info1 |= 512 << 16; /* usb2 fixed maxpacket */
4908*53ee8cc1Swenshuai.xi #else
4909*53ee8cc1Swenshuai.xi info1 |= max_packet (maxp) << 16; // Philips mp3 player endpoint descriptor bug
4910*53ee8cc1Swenshuai.xi #endif
4911*53ee8cc1Swenshuai.xi info2 |= (EHCI_TUNE_MULT_HS << 30);
4912*53ee8cc1Swenshuai.xi } else { /* PIPE_INTERRUPT */
4913*53ee8cc1Swenshuai.xi info1 |= max_packet (maxp) << 16;
4914*53ee8cc1Swenshuai.xi info2 |= hb_mult (maxp) << 30;
4915*53ee8cc1Swenshuai.xi }
4916*53ee8cc1Swenshuai.xi break;
4917*53ee8cc1Swenshuai.xi default:
4918*53ee8cc1Swenshuai.xi dbg ("bogus dev %p speed %d", urb->dev, urb->dev->speed);
4919*53ee8cc1Swenshuai.xi done:
4920*53ee8cc1Swenshuai.xi qh_put (ehci, qh);
4921*53ee8cc1Swenshuai.xi return 0;
4922*53ee8cc1Swenshuai.xi }
4923*53ee8cc1Swenshuai.xi
4924*53ee8cc1Swenshuai.xi /* NOTE: if (PIPE_INTERRUPT) { scheduler sets s-mask } */
4925*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4926*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4927*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4928*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4929*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4930*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4931*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4932*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4933*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4934*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4935*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4936*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4937*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4938*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4939*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4940*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4941*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4942*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4943*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4944*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4945*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4946*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4947*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4948*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4949*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4950*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4951*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4952*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4953*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4954*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4955*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4956*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4957*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4958*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4959*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4960*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4961*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4962*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4963*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4964*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4965*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4966*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4967*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4968*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4969*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4970*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4971*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4972*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4973*53ee8cc1Swenshuai.xi
4974*53ee8cc1Swenshuai.xi /* init as live, toggle clear, advance to dummy */
4975*53ee8cc1Swenshuai.xi qh->qh_state = QH_STATE_IDLE;
4976*53ee8cc1Swenshuai.xi qh->hw_info1 = CPUToLE32 (info1);
4977*53ee8cc1Swenshuai.xi qh->hw_info2 = CPUToLE32 (info2);
4978*53ee8cc1Swenshuai.xi qh_update (ehci, qh, qh->dummy);
4979*53ee8cc1Swenshuai.xi usb_settoggle (urb->dev, usb_pipeendpoint (urb->pipe), !is_input, 1);
4980*53ee8cc1Swenshuai.xi return qh;
4981*53ee8cc1Swenshuai.xi }
4982*53ee8cc1Swenshuai.xi #undef hb_mult
4983*53ee8cc1Swenshuai.xi #undef hb_packet
4984*53ee8cc1Swenshuai.xi
4985*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
4986*53ee8cc1Swenshuai.xi
qh_link_async(struct ehci_hcd * ehci,struct ehci_qh * qh)4987*53ee8cc1Swenshuai.xi static void qh_link_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
4988*53ee8cc1Swenshuai.xi {
4989*53ee8cc1Swenshuai.xi U32 dma = QH_NEXT (qh->qh_dma);
4990*53ee8cc1Swenshuai.xi struct ehci_qh *head;
4991*53ee8cc1Swenshuai.xi
4992*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4993*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4994*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4995*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4996*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4997*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4998*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
4999*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5000*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5001*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5002*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5003*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5004*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5005*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5006*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5007*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5008*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5009*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5010*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5011*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5012*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5013*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5014*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5015*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5016*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5017*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5018*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5019*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5020*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5021*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5022*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5023*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5024*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5025*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5026*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5027*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5028*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5029*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5030*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5031*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5032*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5033*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5034*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5035*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5036*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5037*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5038*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5039*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5040*53ee8cc1Swenshuai.xi
5041*53ee8cc1Swenshuai.xi /* (re)start the async schedule? */
5042*53ee8cc1Swenshuai.xi head = ehci->async;
5043*53ee8cc1Swenshuai.xi timer_action_done (ehci, TIMER_ASYNC_OFF);
5044*53ee8cc1Swenshuai.xi
5045*53ee8cc1Swenshuai.xi if (!head->qh_next.qh) {
5046*53ee8cc1Swenshuai.xi U32 cmd = ehci_readl ((U32)&ehci->regs->command);
5047*53ee8cc1Swenshuai.xi //If disable => restart it
5048*53ee8cc1Swenshuai.xi if (!(cmd & CMD_ASE)) {
5049*53ee8cc1Swenshuai.xi /* in case a clear of CMD_ASE didn't take yet */
5050*53ee8cc1Swenshuai.xi (void) handshake (&ehci->regs->status, STS_ASS, 0, 150);
5051*53ee8cc1Swenshuai.xi cmd |= CMD_ASE | CMD_RUN; //asynchronous scheduler enable
5052*53ee8cc1Swenshuai.xi ehci_writel (cmd, (U32)&ehci->regs->command);
5053*53ee8cc1Swenshuai.xi ehci->hcd.state = USB_STATE_RUNNING;
5054*53ee8cc1Swenshuai.xi /* posted write need not be known to HC yet ... */
5055*53ee8cc1Swenshuai.xi }
5056*53ee8cc1Swenshuai.xi }
5057*53ee8cc1Swenshuai.xi //ehci->regs->status=0x3f; //clear status
5058*53ee8cc1Swenshuai.xi //ehci->regs->command&=~CMD_ASE; //stop async scheduler
5059*53ee8cc1Swenshuai.xi qh->hw_token &= ~HALT_BIT;
5060*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5061*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5062*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5063*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5064*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5065*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5066*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5067*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5068*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5069*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5070*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5071*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5072*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5073*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5074*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5075*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5076*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5077*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5078*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5079*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5080*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5081*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5082*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5083*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5084*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5085*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5086*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5087*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5088*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5089*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5090*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5091*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5092*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5093*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5094*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5095*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5096*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5097*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5098*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5099*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5100*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5101*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5102*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5103*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5104*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5105*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5106*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5107*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5108*53ee8cc1Swenshuai.xi
5109*53ee8cc1Swenshuai.xi /* splice right after start */
5110*53ee8cc1Swenshuai.xi qh->qh_next = head->qh_next;
5111*53ee8cc1Swenshuai.xi qh->hw_next = head->hw_next;
5112*53ee8cc1Swenshuai.xi wmb ();
5113*53ee8cc1Swenshuai.xi
5114*53ee8cc1Swenshuai.xi head->qh_next.qh = qh;
5115*53ee8cc1Swenshuai.xi head->hw_next = dma;
5116*53ee8cc1Swenshuai.xi //game_status=0;
5117*53ee8cc1Swenshuai.xi qh->qh_state = QH_STATE_LINKED;
5118*53ee8cc1Swenshuai.xi // ehci->regs->command|=CMD_ASE; //start async scheduler
5119*53ee8cc1Swenshuai.xi /* qtd completions reported later by interrupt */
5120*53ee8cc1Swenshuai.xi }
5121*53ee8cc1Swenshuai.xi #if 0
5122*53ee8cc1Swenshuai.xi static void qh_link_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
5123*53ee8cc1Swenshuai.xi {
5124*53ee8cc1Swenshuai.xi U32 dma = QH_NEXT (qh->qh_dma);
5125*53ee8cc1Swenshuai.xi struct ehci_qh *q;
5126*53ee8cc1Swenshuai.xi
5127*53ee8cc1Swenshuai.xi // DBG_HOST_EHCI("### >>> Enter ehci-q.c file --> qh_link_async function \n");
5128*53ee8cc1Swenshuai.xi
5129*53ee8cc1Swenshuai.xi if (unlikely (!(q = ehci->async))) {
5130*53ee8cc1Swenshuai.xi U32 cmd = ehci_readl (&ehci->regs->command);
5131*53ee8cc1Swenshuai.xi
5132*53ee8cc1Swenshuai.xi /* in case a clear of CMD_ASE didn't take yet */
5133*53ee8cc1Swenshuai.xi while (ehci_readl (&ehci->regs->status) & STS_ASS)
5134*53ee8cc1Swenshuai.xi udelay (100);
5135*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5136*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5137*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5138*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5139*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5140*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5141*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5142*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5143*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5144*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5145*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5146*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5147*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5148*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5149*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5150*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5151*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5152*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5153*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5154*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5155*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5156*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5157*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5158*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5159*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5160*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5161*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5162*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5163*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5164*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5165*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5166*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5167*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5168*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5169*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5170*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5171*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5172*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5173*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5174*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5175*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5176*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5177*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5178*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5179*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5180*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5181*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5182*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5183*53ee8cc1Swenshuai.xi
5184*53ee8cc1Swenshuai.xi qh->hw_info1 |= CPUToLE32 (QH_HEAD); /* [4.8] */
5185*53ee8cc1Swenshuai.xi qh->qh_next.qh = qh;
5186*53ee8cc1Swenshuai.xi qh->hw_next = dma;
5187*53ee8cc1Swenshuai.xi wmb ();
5188*53ee8cc1Swenshuai.xi ehci->async = qh;
5189*53ee8cc1Swenshuai.xi ehci_writel ((U32)qh->qh_dma, &ehci->regs->async_next);
5190*53ee8cc1Swenshuai.xi cmd |= CMD_ASE | CMD_RUN;
5191*53ee8cc1Swenshuai.xi ehci_writel (cmd, &ehci->regs->command);
5192*53ee8cc1Swenshuai.xi ehci->hcd.state = USB_STATE_RUNNING;
5193*53ee8cc1Swenshuai.xi /* posted write need not be known to HC yet ... */
5194*53ee8cc1Swenshuai.xi } else {
5195*53ee8cc1Swenshuai.xi /* splice right after "start" of ring */
5196*53ee8cc1Swenshuai.xi qh->hw_info1 &= ~ CPUToLE32(QH_HEAD); /* [4.8] */
5197*53ee8cc1Swenshuai.xi qh->qh_next = q->qh_next;
5198*53ee8cc1Swenshuai.xi qh->hw_next = q->hw_next;
5199*53ee8cc1Swenshuai.xi wmb ();
5200*53ee8cc1Swenshuai.xi q->qh_next.qh = qh;
5201*53ee8cc1Swenshuai.xi q->hw_next = dma;
5202*53ee8cc1Swenshuai.xi }
5203*53ee8cc1Swenshuai.xi qh->qh_state = QH_STATE_LINKED;
5204*53ee8cc1Swenshuai.xi /* qtd completions reported later by interrupt */
5205*53ee8cc1Swenshuai.xi }
5206*53ee8cc1Swenshuai.xi #endif
5207*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
5208*53ee8cc1Swenshuai.xi
5209*53ee8cc1Swenshuai.xi #define QH_ADDR_MASK LE32ToCPU(0x7f)
5210*53ee8cc1Swenshuai.xi
5211*53ee8cc1Swenshuai.xi
5212*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5213*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5214*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5215*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5216*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5217*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5218*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5219*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5220*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5221*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5222*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5223*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5224*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5225*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5226*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5227*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5228*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5229*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5230*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5231*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5232*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5233*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5234*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5235*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5236*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5237*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5238*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5239*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5240*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5241*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5242*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5243*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5244*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5245*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5246*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5247*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5248*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5249*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5250*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5251*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5252*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5253*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5254*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5255*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5256*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5257*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5258*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5259*53ee8cc1Swenshuai.xi /*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*53ee8cc1Swenshuai.xi static struct ehci_qh *qh_append_tds (
5261*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci,
5262*53ee8cc1Swenshuai.xi struct urb *urb,
5263*53ee8cc1Swenshuai.xi struct list_head *qtd_list,
5264*53ee8cc1Swenshuai.xi int epnum,
5265*53ee8cc1Swenshuai.xi void **ptr
5266*53ee8cc1Swenshuai.xi )
5267*53ee8cc1Swenshuai.xi {
5268*53ee8cc1Swenshuai.xi struct ehci_qh *qh = 0;
5269*53ee8cc1Swenshuai.xi //int maxp;
5270*53ee8cc1Swenshuai.xi qh = (struct ehci_qh *) *ptr;
5271*53ee8cc1Swenshuai.xi if (unlikely (qh == 0)) {
5272*53ee8cc1Swenshuai.xi /* can't sleep here, we have ehci->lock... */
5273*53ee8cc1Swenshuai.xi qh = qh_make (ehci, urb, SLAB_ATOMIC);
5274*53ee8cc1Swenshuai.xi *ptr = qh;
5275*53ee8cc1Swenshuai.xi }
5276*53ee8cc1Swenshuai.xi
5277*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5278*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5279*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5280*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5281*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5282*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5283*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5284*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5285*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5286*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5287*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5288*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5289*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5290*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5291*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5292*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5293*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5294*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5295*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5296*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5297*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5298*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5299*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5300*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5301*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5302*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5303*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5304*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5305*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5306*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5307*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5308*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5309*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5310*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5311*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5312*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5313*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5314*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5315*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5316*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5317*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5318*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5319*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5320*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5321*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5322*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5323*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5324*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5325*53ee8cc1Swenshuai.xi //#ifdef CONFIG_FARADAY_FOTG200
5326*53ee8cc1Swenshuai.xi #if 1
5327*53ee8cc1Swenshuai.xi // The control endpoint's maximum packet size will be modified after fist "Get_Descriptor" request.
5328*53ee8cc1Swenshuai.xi // Therefore the maxp of qH should be updated here.
5329*53ee8cc1Swenshuai.xi if ( usb_pipecontrol(urb->pipe) )
5330*53ee8cc1Swenshuai.xi {
5331*53ee8cc1Swenshuai.xi //maxp = (usb_maxpacket (urb->dev, urb->pipe, !(usb_pipein (urb->pipe)))<<16);
5332*53ee8cc1Swenshuai.xi qh->hw_info1 = CPUToLE32((LE32ToCPU(qh->hw_info1)&(~(((1<<11)-1)<<16)))|(usb_maxpacket (urb->dev, urb->pipe, !(usb_pipein (urb->pipe)))<<16));
5333*53ee8cc1Swenshuai.xi }
5334*53ee8cc1Swenshuai.xi #endif
5335*53ee8cc1Swenshuai.xi if (likely (qh != 0)) {
5336*53ee8cc1Swenshuai.xi struct ehci_qtd *qtd;
5337*53ee8cc1Swenshuai.xi
5338*53ee8cc1Swenshuai.xi if (unlikely (list_empty (qtd_list)))
5339*53ee8cc1Swenshuai.xi qtd = 0;
5340*53ee8cc1Swenshuai.xi else
5341*53ee8cc1Swenshuai.xi {
5342*53ee8cc1Swenshuai.xi qtd = list_entry (qtd_list->next, struct ehci_qtd, qtd_list);
5343*53ee8cc1Swenshuai.xi //list_entry (qtd_list->next, struct ehci_qtd, qtd_list, struct list_head, qtd);
5344*53ee8cc1Swenshuai.xi }
5345*53ee8cc1Swenshuai.xi
5346*53ee8cc1Swenshuai.xi /* control qh may need patching after enumeration */
5347*53ee8cc1Swenshuai.xi if (unlikely (epnum == 0)) {
5348*53ee8cc1Swenshuai.xi /* set_address changes the address */
5349*53ee8cc1Swenshuai.xi if ((qh->hw_info1 & QH_ADDR_MASK) == 0)
5350*53ee8cc1Swenshuai.xi qh->hw_info1 |= CPUToLE32(
5351*53ee8cc1Swenshuai.xi usb_pipedevice (urb->pipe));
5352*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5353*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5354*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5355*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5356*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5357*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5358*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5359*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5360*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5361*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5362*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5363*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5364*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5365*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5366*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5367*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5368*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5369*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5370*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5371*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5372*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5373*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5374*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5375*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5376*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5377*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5378*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5379*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5380*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5381*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5382*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5383*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5384*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5385*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5386*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5387*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5388*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5389*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5390*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5391*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5392*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5393*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5394*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5395*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5396*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5397*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5398*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5399*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5400*53ee8cc1Swenshuai.xi
5401*53ee8cc1Swenshuai.xi /* for full speed, ep0 maxpacket can grow */
5402*53ee8cc1Swenshuai.xi else if (!(qh->hw_info1
5403*53ee8cc1Swenshuai.xi & CPUToLE32 (0x3 << 12))) {
5404*53ee8cc1Swenshuai.xi U32 info, max;
5405*53ee8cc1Swenshuai.xi
5406*53ee8cc1Swenshuai.xi info = LE32ToCPU(qh->hw_info1);
5407*53ee8cc1Swenshuai.xi max = urb->dev->descriptor.bMaxPacketSize0;
5408*53ee8cc1Swenshuai.xi if (max > (0x07ff & (info >> 16))) {
5409*53ee8cc1Swenshuai.xi info &= ~(0x07ff << 16);
5410*53ee8cc1Swenshuai.xi info |= max << 16;
5411*53ee8cc1Swenshuai.xi qh->hw_info1 = CPUToLE32(info);
5412*53ee8cc1Swenshuai.xi }
5413*53ee8cc1Swenshuai.xi }
5414*53ee8cc1Swenshuai.xi
5415*53ee8cc1Swenshuai.xi /* usb_reset_device() briefly reverts to address 0 */
5416*53ee8cc1Swenshuai.xi if (usb_pipedevice (urb->pipe) == 0)
5417*53ee8cc1Swenshuai.xi qh->hw_info1 &= ~QH_ADDR_MASK;
5418*53ee8cc1Swenshuai.xi }
5419*53ee8cc1Swenshuai.xi
5420*53ee8cc1Swenshuai.xi if (unlikely (!usb_gettoggle (urb->dev,
5421*53ee8cc1Swenshuai.xi (epnum & 0x0f), !(epnum & 0x10)))
5422*53ee8cc1Swenshuai.xi && !usb_pipecontrol (urb->pipe)) {
5423*53ee8cc1Swenshuai.xi /* "never happens": drivers do stall cleanup right */
5424*53ee8cc1Swenshuai.xi if (qh->qh_state != QH_STATE_IDLE
5425*53ee8cc1Swenshuai.xi && !list_empty (&qh->qtd_list)
5426*53ee8cc1Swenshuai.xi && qh->qh_state != QH_STATE_COMPLETING)
5427*53ee8cc1Swenshuai.xi 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*53ee8cc1Swenshuai.xi /* else we know this overlay write is safe */
5429*53ee8cc1Swenshuai.xi clear_toggle (urb->dev,
5430*53ee8cc1Swenshuai.xi epnum & 0x0f, !(epnum & 0x10), qh);
5431*53ee8cc1Swenshuai.xi }
5432*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5433*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5434*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5435*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5436*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5437*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5438*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5439*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5440*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5441*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5442*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5443*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5444*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5445*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5446*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5447*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5448*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5449*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5450*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5451*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5452*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5453*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5454*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5455*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5456*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5457*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5458*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5459*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5460*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5461*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5462*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5463*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5464*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5465*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5466*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5467*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5468*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5469*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5470*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5471*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5472*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5473*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5474*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5475*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5476*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5477*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5478*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5479*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5480*53ee8cc1Swenshuai.xi
5481*53ee8cc1Swenshuai.xi if (likely (qtd != 0)) {
5482*53ee8cc1Swenshuai.xi struct ehci_qtd *dummy;
5483*53ee8cc1Swenshuai.xi dma_addr_t dma;
5484*53ee8cc1Swenshuai.xi U32 token;
5485*53ee8cc1Swenshuai.xi
5486*53ee8cc1Swenshuai.xi token = qtd->hw_token;
5487*53ee8cc1Swenshuai.xi qtd->hw_token = HALT_BIT;
5488*53ee8cc1Swenshuai.xi wmb ();
5489*53ee8cc1Swenshuai.xi dummy = qh->dummy;
5490*53ee8cc1Swenshuai.xi //Copy qtd's data to dummy except dumm->qtd_dma
5491*53ee8cc1Swenshuai.xi dma = dummy->qtd_dma;
5492*53ee8cc1Swenshuai.xi *dummy = *qtd;
5493*53ee8cc1Swenshuai.xi dummy->qtd_dma = dma;
5494*53ee8cc1Swenshuai.xi
5495*53ee8cc1Swenshuai.xi list_del (&qtd->qtd_list);
5496*53ee8cc1Swenshuai.xi list_add (&dummy->qtd_list, qtd_list);
5497*53ee8cc1Swenshuai.xi __list_splice (qtd_list, qh->qtd_list.prev);
5498*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5499*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5500*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5501*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5502*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5503*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5504*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5505*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5506*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5507*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5508*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5509*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5510*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5511*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5512*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5513*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5514*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5515*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5516*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5517*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5518*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5519*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5520*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5521*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5522*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5523*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5524*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5525*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5526*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5527*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5528*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5529*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5530*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5531*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5532*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5533*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5534*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5535*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5536*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5537*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5538*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5539*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5540*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5541*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5542*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5543*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5544*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5545*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5546*53ee8cc1Swenshuai.xi
5547*53ee8cc1Swenshuai.xi ehci_qtd_init (qtd, qtd->qtd_dma);
5548*53ee8cc1Swenshuai.xi qh->dummy = qtd;
5549*53ee8cc1Swenshuai.xi
5550*53ee8cc1Swenshuai.xi /* hc must see the new dummy at list end */
5551*53ee8cc1Swenshuai.xi dma = qtd->qtd_dma;
5552*53ee8cc1Swenshuai.xi qtd = list_entry (qh->qtd_list.prev, struct ehci_qtd, qtd_list);
5553*53ee8cc1Swenshuai.xi //list_entry (qh->qtd_list.prev, struct ehci_qtd, qtd_list,struct list_head, qtd);
5554*53ee8cc1Swenshuai.xi //the last qtd of qh before spliceing qtd_list
5555*53ee8cc1Swenshuai.xi qtd->hw_next = QTD_NEXT (dma);
5556*53ee8cc1Swenshuai.xi
5557*53ee8cc1Swenshuai.xi /* let the hc process these next qtds */
5558*53ee8cc1Swenshuai.xi wmb ();
5559*53ee8cc1Swenshuai.xi dummy->hw_token = token;
5560*53ee8cc1Swenshuai.xi
5561*53ee8cc1Swenshuai.xi urb->hcpriv = qh_get (qh);
5562*53ee8cc1Swenshuai.xi }
5563*53ee8cc1Swenshuai.xi }
5564*53ee8cc1Swenshuai.xi return qh;
5565*53ee8cc1Swenshuai.xi }
5566*53ee8cc1Swenshuai.xi
5567*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
5568*53ee8cc1Swenshuai.xi
5569*53ee8cc1Swenshuai.xi static int
submit_async(struct ehci_hcd * ehci,struct urb * urb,struct list_head * qtd_list,int mem_flags)5570*53ee8cc1Swenshuai.xi submit_async (
5571*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci,
5572*53ee8cc1Swenshuai.xi struct urb *urb,
5573*53ee8cc1Swenshuai.xi struct list_head *qtd_list,
5574*53ee8cc1Swenshuai.xi int mem_flags
5575*53ee8cc1Swenshuai.xi ) {
5576*53ee8cc1Swenshuai.xi struct ehci_qtd *qtd;
5577*53ee8cc1Swenshuai.xi struct hcd_dev *dev;
5578*53ee8cc1Swenshuai.xi int epnum;
5579*53ee8cc1Swenshuai.xi U32 flags;
5580*53ee8cc1Swenshuai.xi struct ehci_qh *qh = 0;
5581*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5582*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5583*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5584*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5585*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5586*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5587*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5588*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5589*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5590*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5591*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5592*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5593*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5594*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5595*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5596*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5597*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5598*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5599*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5600*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5601*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5602*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5603*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5604*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5605*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5606*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5607*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5608*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5609*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5610*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5611*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5612*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5613*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5614*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5615*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5616*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5617*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5618*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5619*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5620*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5621*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5622*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5623*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5624*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5625*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5626*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5627*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5628*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5629*53ee8cc1Swenshuai.xi
5630*53ee8cc1Swenshuai.xi qtd = list_entry (qtd_list->next, struct ehci_qtd, qtd_list);
5631*53ee8cc1Swenshuai.xi //list_entry (qtd_list->next, struct ehci_qtd, qtd_list, struct list_head, qtd);
5632*53ee8cc1Swenshuai.xi dev = (struct hcd_dev *)urb->dev->hcpriv;
5633*53ee8cc1Swenshuai.xi epnum = usb_pipeendpoint (urb->pipe);
5634*53ee8cc1Swenshuai.xi if (usb_pipein (urb->pipe) && !usb_pipecontrol (urb->pipe))
5635*53ee8cc1Swenshuai.xi epnum |= 0x10;
5636*53ee8cc1Swenshuai.xi
5637*53ee8cc1Swenshuai.xi ehci_vdbg (ehci, "urb %p buf %p len %d ep%d%s qtd %p [qh %p]\n",
5638*53ee8cc1Swenshuai.xi urb, urb->transfer_buffer,urb->transfer_buffer_length,
5639*53ee8cc1Swenshuai.xi epnum & 0x0f, (epnum & 0x10) ? "in" : "out",
5640*53ee8cc1Swenshuai.xi qtd, dev ? dev->ep [epnum] : (void *)~0);
5641*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5642*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5643*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5644*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5645*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5646*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5647*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5648*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5649*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5650*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5651*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5652*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5653*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5654*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5655*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5656*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5657*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5658*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5659*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5660*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5661*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5662*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5663*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5664*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5665*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5666*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5667*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5668*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5669*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5670*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5671*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5672*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5673*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5674*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5675*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5676*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5677*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5678*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5679*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5680*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5681*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5682*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5683*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5684*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5685*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5686*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5687*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5688*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5689*53ee8cc1Swenshuai.xi
5690*53ee8cc1Swenshuai.xi spin_lock_irqsave (&ehci->lock, flags);
5691*53ee8cc1Swenshuai.xi qh = qh_append_tds (ehci, urb, qtd_list, epnum, &dev->ep [epnum]);
5692*53ee8cc1Swenshuai.xi /* Control/bulk operations through TTs don't need scheduling,
5693*53ee8cc1Swenshuai.xi * the HC and TT handle it when the TT has a buffer ready.
5694*53ee8cc1Swenshuai.xi */
5695*53ee8cc1Swenshuai.xi //GPIO_Trigger(2);
5696*53ee8cc1Swenshuai.xi if (likely (qh != 0)) {
5697*53ee8cc1Swenshuai.xi if (likely (qh->qh_state == QH_STATE_IDLE))
5698*53ee8cc1Swenshuai.xi qh_link_async (ehci, qh_get (qh));
5699*53ee8cc1Swenshuai.xi }
5700*53ee8cc1Swenshuai.xi
5701*53ee8cc1Swenshuai.xi //#ifdef ENABLE_PIPE_FLUSH
5702*53ee8cc1Swenshuai.xi Chip_Flush_Memory();
5703*53ee8cc1Swenshuai.xi //#endif
5704*53ee8cc1Swenshuai.xi
5705*53ee8cc1Swenshuai.xi spin_unlock_irqrestore (&ehci->lock, flags);
5706*53ee8cc1Swenshuai.xi if (unlikely (qh == 0)) {
5707*53ee8cc1Swenshuai.xi qtd_list_free (ehci, urb, qtd_list);
5708*53ee8cc1Swenshuai.xi return -ENOMEM;
5709*53ee8cc1Swenshuai.xi }
5710*53ee8cc1Swenshuai.xi return 0;
5711*53ee8cc1Swenshuai.xi }
5712*53ee8cc1Swenshuai.xi
5713*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
5714*53ee8cc1Swenshuai.xi
5715*53ee8cc1Swenshuai.xi
5716*53ee8cc1Swenshuai.xi static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh);
5717*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5718*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5719*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5720*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5721*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5722*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5723*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5724*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5725*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5726*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5727*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5728*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5729*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5730*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5731*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5732*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5733*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5734*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5735*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5736*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5737*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5738*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5739*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5740*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5741*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5742*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5743*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5744*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5745*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5746*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5747*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5748*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5749*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5750*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5751*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5752*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5753*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5754*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5755*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5756*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5757*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5758*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5759*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5760*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5761*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5762*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5763*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5764*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5765*53ee8cc1Swenshuai.xi
end_unlink_async(struct ehci_hcd * ehci,struct pt_regs * regs)5766*53ee8cc1Swenshuai.xi static void end_unlink_async (struct ehci_hcd *ehci, struct pt_regs *regs)
5767*53ee8cc1Swenshuai.xi {
5768*53ee8cc1Swenshuai.xi struct ehci_qh *qh = ehci->reclaim;
5769*53ee8cc1Swenshuai.xi struct ehci_qh *next;
5770*53ee8cc1Swenshuai.xi if(qh == NULL)
5771*53ee8cc1Swenshuai.xi return;
5772*53ee8cc1Swenshuai.xi timer_action_done (ehci, TIMER_IAA_WATCHDOG);
5773*53ee8cc1Swenshuai.xi
5774*53ee8cc1Swenshuai.xi // qh->hw_next = CPUToLE32 (qh->qh_dma);
5775*53ee8cc1Swenshuai.xi qh->qh_state = QH_STATE_IDLE;
5776*53ee8cc1Swenshuai.xi qh->qh_next.qh = 0;
5777*53ee8cc1Swenshuai.xi qh_put (ehci, qh); // refcount from reclaim
5778*53ee8cc1Swenshuai.xi
5779*53ee8cc1Swenshuai.xi /* other unlink(s) may be pending (in QH_STATE_UNLINK_WAIT) */
5780*53ee8cc1Swenshuai.xi next = qh->reclaim;
5781*53ee8cc1Swenshuai.xi ehci->reclaim = next;
5782*53ee8cc1Swenshuai.xi ehci->reclaim_ready = 0;
5783*53ee8cc1Swenshuai.xi qh->reclaim = 0;
5784*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5785*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5786*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5787*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5788*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5789*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5790*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5791*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5792*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5793*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5794*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5795*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5796*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5797*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5798*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5799*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5800*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5801*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5802*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5803*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5804*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5805*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5806*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5807*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5808*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5809*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5810*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5811*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5812*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5813*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5814*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5815*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5816*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5817*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5818*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5819*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5820*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5821*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5822*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5823*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5824*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5825*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5826*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5827*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5828*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5829*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5830*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5831*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5832*53ee8cc1Swenshuai.xi
5833*53ee8cc1Swenshuai.xi qh_completions (ehci, qh, regs);
5834*53ee8cc1Swenshuai.xi
5835*53ee8cc1Swenshuai.xi if (!list_empty (&qh->qtd_list)
5836*53ee8cc1Swenshuai.xi && HCD_IS_RUNNING (ehci->hcd.state))
5837*53ee8cc1Swenshuai.xi qh_link_async (ehci, qh);
5838*53ee8cc1Swenshuai.xi else {
5839*53ee8cc1Swenshuai.xi qh_put (ehci, qh); // refcount from async list
5840*53ee8cc1Swenshuai.xi
5841*53ee8cc1Swenshuai.xi if (HCD_IS_RUNNING (ehci->hcd.state)
5842*53ee8cc1Swenshuai.xi && ehci->async->qh_next.qh == 0)
5843*53ee8cc1Swenshuai.xi timer_action (ehci, TIMER_ASYNC_OFF);
5844*53ee8cc1Swenshuai.xi }
5845*53ee8cc1Swenshuai.xi
5846*53ee8cc1Swenshuai.xi if (next) {
5847*53ee8cc1Swenshuai.xi ehci->reclaim = 0;
5848*53ee8cc1Swenshuai.xi start_unlink_async (ehci, next);
5849*53ee8cc1Swenshuai.xi }
5850*53ee8cc1Swenshuai.xi }
5851*53ee8cc1Swenshuai.xi
5852*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5853*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5854*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5855*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5856*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5857*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5858*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5859*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5860*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5861*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5862*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5863*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5864*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5865*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5866*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5867*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5868*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5869*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5870*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5871*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5872*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5873*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5874*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5875*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5876*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5877*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5878*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5879*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5880*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5881*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5882*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5883*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5884*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5885*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5886*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5887*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5888*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5889*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5890*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5891*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5892*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5893*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5894*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5895*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5896*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5897*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5898*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5899*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5900*53ee8cc1Swenshuai.xi
start_unlink_async(struct ehci_hcd * ehci,struct ehci_qh * qh)5901*53ee8cc1Swenshuai.xi static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
5902*53ee8cc1Swenshuai.xi {
5903*53ee8cc1Swenshuai.xi int cmd = ehci_readl ((U32)&ehci->regs->command);
5904*53ee8cc1Swenshuai.xi struct ehci_qh *prev;
5905*53ee8cc1Swenshuai.xi
5906*53ee8cc1Swenshuai.xi #ifdef DEBUG
5907*53ee8cc1Swenshuai.xi if (ehci->reclaim
5908*53ee8cc1Swenshuai.xi || (qh->qh_state != QH_STATE_LINKED
5909*53ee8cc1Swenshuai.xi && qh->qh_state != QH_STATE_UNLINK_WAIT)
5910*53ee8cc1Swenshuai.xi #ifdef CONFIG_SMP
5911*53ee8cc1Swenshuai.xi // this macro lies except on SMP compiles
5912*53ee8cc1Swenshuai.xi || !spin_is_locked (&ehci->lock)
5913*53ee8cc1Swenshuai.xi #endif
5914*53ee8cc1Swenshuai.xi )
5915*53ee8cc1Swenshuai.xi BUG ();
5916*53ee8cc1Swenshuai.xi #endif
5917*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5918*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5919*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5920*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5921*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5922*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5923*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5924*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5925*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5926*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5927*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5928*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5929*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5930*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5931*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5932*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5933*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5934*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5935*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5936*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5937*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5938*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5939*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5940*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5941*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5942*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5943*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5944*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5945*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5946*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5947*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5948*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5949*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5950*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5951*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5952*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5953*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5954*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5955*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5956*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5957*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5958*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5959*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5960*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5961*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5962*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5963*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5964*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5965*53ee8cc1Swenshuai.xi
5966*53ee8cc1Swenshuai.xi /* stop async schedule right now? */
5967*53ee8cc1Swenshuai.xi if (unlikely (qh == ehci->async)) {
5968*53ee8cc1Swenshuai.xi /* can't get here without STS_ASS set */
5969*53ee8cc1Swenshuai.xi if (ehci->hcd.state != USB_STATE_HALT) {
5970*53ee8cc1Swenshuai.xi ehci_writel (cmd & ~CMD_ASE, (U32)&ehci->regs->command);
5971*53ee8cc1Swenshuai.xi wmb ();
5972*53ee8cc1Swenshuai.xi // handshake later, if we need to
5973*53ee8cc1Swenshuai.xi }
5974*53ee8cc1Swenshuai.xi timer_action_done (ehci, TIMER_ASYNC_OFF);
5975*53ee8cc1Swenshuai.xi return;
5976*53ee8cc1Swenshuai.xi }
5977*53ee8cc1Swenshuai.xi
5978*53ee8cc1Swenshuai.xi qh->qh_state = QH_STATE_UNLINK;
5979*53ee8cc1Swenshuai.xi ehci->reclaim = qh = qh_get (qh);
5980*53ee8cc1Swenshuai.xi
5981*53ee8cc1Swenshuai.xi prev = ehci->async;
5982*53ee8cc1Swenshuai.xi while (prev->qh_next.qh != qh)
5983*53ee8cc1Swenshuai.xi prev = prev->qh_next.qh;
5984*53ee8cc1Swenshuai.xi
5985*53ee8cc1Swenshuai.xi prev->hw_next = qh->hw_next;
5986*53ee8cc1Swenshuai.xi prev->qh_next = qh->qh_next;
5987*53ee8cc1Swenshuai.xi wmb ();
5988*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5989*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5990*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5991*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5992*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5993*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5994*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5995*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5996*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5997*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5998*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
5999*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6000*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6001*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6002*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6003*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6004*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6005*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6006*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6007*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6008*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6009*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6010*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6011*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6012*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6013*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6014*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6015*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6016*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6017*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6018*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6019*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6020*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6021*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6022*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6023*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6024*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6025*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6026*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6027*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6028*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6029*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6030*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6031*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6032*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6033*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6034*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6035*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6036*53ee8cc1Swenshuai.xi
6037*53ee8cc1Swenshuai.xi if (unlikely (ehci->hcd.state == USB_STATE_HALT)) {
6038*53ee8cc1Swenshuai.xi /* if (unlikely (qh->reclaim != 0))
6039*53ee8cc1Swenshuai.xi * this will recurse, probably not much
6040*53ee8cc1Swenshuai.xi */
6041*53ee8cc1Swenshuai.xi end_unlink_async (ehci, NULL);
6042*53ee8cc1Swenshuai.xi return;
6043*53ee8cc1Swenshuai.xi }
6044*53ee8cc1Swenshuai.xi //inform HC thar something has been removed from asyn. schedule
6045*53ee8cc1Swenshuai.xi ehci->reclaim_ready = 0;
6046*53ee8cc1Swenshuai.xi #if 1 // For bug 125MHz copy error (HALT)
6047*53ee8cc1Swenshuai.xi if (!ehci->uDontSendIAA)
6048*53ee8cc1Swenshuai.xi {
6049*53ee8cc1Swenshuai.xi cmd |= CMD_IAAD;
6050*53ee8cc1Swenshuai.xi ehci_writel (cmd, (U32)&ehci->regs->command);
6051*53ee8cc1Swenshuai.xi //(void) ehci_readl (&ehci->regs->command);
6052*53ee8cc1Swenshuai.xi }
6053*53ee8cc1Swenshuai.xi #endif
6054*53ee8cc1Swenshuai.xi timer_action (ehci, TIMER_IAA_WATCHDOG);
6055*53ee8cc1Swenshuai.xi }
6056*53ee8cc1Swenshuai.xi
6057*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
6058*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6059*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6060*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6061*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6062*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6063*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6064*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6065*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6066*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6067*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6068*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6069*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6070*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6071*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6072*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6073*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6074*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6075*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6076*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6077*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6078*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6079*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6080*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6081*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6082*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6083*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6084*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6085*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6086*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6087*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6088*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6089*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6090*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6091*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6092*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6093*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6094*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6095*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6096*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6097*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6098*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6099*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6100*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6101*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6102*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6103*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6104*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6105*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6106*53ee8cc1Swenshuai.xi
6107*53ee8cc1Swenshuai.xi static void
scan_async(struct ehci_hcd * ehci,struct pt_regs * regs)6108*53ee8cc1Swenshuai.xi scan_async (struct ehci_hcd *ehci, struct pt_regs *regs)
6109*53ee8cc1Swenshuai.xi {
6110*53ee8cc1Swenshuai.xi struct ehci_qh *qh;
6111*53ee8cc1Swenshuai.xi enum ehci_timer_action action = TIMER_IO_WATCHDOG;
6112*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6113*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6114*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6115*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6116*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6117*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6118*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6119*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6120*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6121*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6122*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6123*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6124*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6125*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6126*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6127*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6128*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6129*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6130*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6131*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6132*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6133*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6134*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6135*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6136*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6137*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6138*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6139*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6140*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6141*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6142*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6143*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6144*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6145*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6146*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6147*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6148*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6149*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6150*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6151*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6152*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6153*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6154*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6155*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6156*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6157*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6158*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6159*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6160*53ee8cc1Swenshuai.xi
6161*53ee8cc1Swenshuai.xi if (!++(ehci->stamp))
6162*53ee8cc1Swenshuai.xi ehci->stamp++;
6163*53ee8cc1Swenshuai.xi timer_action_done (ehci, TIMER_ASYNC_SHRINK);
6164*53ee8cc1Swenshuai.xi rescan:
6165*53ee8cc1Swenshuai.xi qh = ehci->async->qh_next.qh;
6166*53ee8cc1Swenshuai.xi if (likely (qh != 0)) {
6167*53ee8cc1Swenshuai.xi do {
6168*53ee8cc1Swenshuai.xi /* clean any finished work for this qh */
6169*53ee8cc1Swenshuai.xi if (!list_empty (&qh->qtd_list)
6170*53ee8cc1Swenshuai.xi && qh->stamp != ehci->stamp) {
6171*53ee8cc1Swenshuai.xi int temp;
6172*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6173*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6174*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6175*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6176*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6177*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6178*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6179*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6180*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6181*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6182*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6183*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6184*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6185*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6186*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6187*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6188*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6189*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6190*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6191*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6192*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6193*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6194*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6195*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6196*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6197*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6198*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6199*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6200*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6201*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6202*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6203*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6204*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6205*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6206*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6207*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6208*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6209*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6210*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6211*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6212*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6213*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6214*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6215*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6216*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6217*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6218*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6219*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6220*53ee8cc1Swenshuai.xi
6221*53ee8cc1Swenshuai.xi qh = qh_get (qh);
6222*53ee8cc1Swenshuai.xi qh->stamp = ehci->stamp;
6223*53ee8cc1Swenshuai.xi temp = qh_completions (ehci, qh, regs);
6224*53ee8cc1Swenshuai.xi qh_put (ehci, qh);
6225*53ee8cc1Swenshuai.xi if (temp != 0) {
6226*53ee8cc1Swenshuai.xi goto rescan;
6227*53ee8cc1Swenshuai.xi }
6228*53ee8cc1Swenshuai.xi
6229*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6230*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6231*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6232*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6233*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6234*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6235*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6236*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6237*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6238*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6239*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6240*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6241*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6242*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6243*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6244*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6245*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6246*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6247*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6248*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6249*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6250*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6251*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6252*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6253*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6254*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6255*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6256*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6257*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6258*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6259*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6260*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6261*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6262*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6263*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6264*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6265*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6266*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6267*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6268*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6269*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6270*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6271*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6272*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6273*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6274*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6275*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6276*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6277*53ee8cc1Swenshuai.xi }
6278*53ee8cc1Swenshuai.xi
6279*53ee8cc1Swenshuai.xi //FIXME: #if 1 is correct procedure but it will cause some when do plug testing
6280*53ee8cc1Swenshuai.xi //Watchdog timer will be unlink for unknow reson ==> Therefore, qHD can not be
6281*53ee8cc1Swenshuai.xi //unlinked from async list. (qh->state == USB_STATE_LINKED but USB_STATE_HALT)
6282*53ee8cc1Swenshuai.xi //So when disconnect attached device ep1in (Bulk in) cannot be releaseed.
6283*53ee8cc1Swenshuai.xi #if 0
6284*53ee8cc1Swenshuai.xi if (list_empty (&qh->qtd_list)) {
6285*53ee8cc1Swenshuai.xi if (qh->stamp == ehci->stamp)
6286*53ee8cc1Swenshuai.xi action = TIMER_ASYNC_SHRINK;
6287*53ee8cc1Swenshuai.xi else if (!ehci->reclaim
6288*53ee8cc1Swenshuai.xi && qh->qh_state == QH_STATE_LINKED)
6289*53ee8cc1Swenshuai.xi start_unlink_async (ehci, qh);
6290*53ee8cc1Swenshuai.xi }
6291*53ee8cc1Swenshuai.xi
6292*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6293*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6294*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6295*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6296*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6297*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6298*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6299*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6300*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6301*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6302*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6303*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6304*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6305*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6306*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6307*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6308*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6309*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6310*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6311*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6312*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6313*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6314*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6315*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6316*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6317*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6318*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6319*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6320*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6321*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6322*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6323*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6324*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6325*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6326*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6327*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6328*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6329*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6330*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6331*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6332*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6333*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6334*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6335*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6336*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6337*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6338*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6339*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6340*53ee8cc1Swenshuai.xi #else
6341*53ee8cc1Swenshuai.xi if (list_empty (&qh->qtd_list)) {
6342*53ee8cc1Swenshuai.xi if (!ehci->reclaim && qh->qh_state == QH_STATE_LINKED)
6343*53ee8cc1Swenshuai.xi start_unlink_async (ehci, qh);
6344*53ee8cc1Swenshuai.xi }
6345*53ee8cc1Swenshuai.xi #endif
6346*53ee8cc1Swenshuai.xi qh = qh->qh_next.qh;
6347*53ee8cc1Swenshuai.xi } while (qh);
6348*53ee8cc1Swenshuai.xi }
6349*53ee8cc1Swenshuai.xi if (action == TIMER_ASYNC_SHRINK)
6350*53ee8cc1Swenshuai.xi timer_action (ehci, TIMER_ASYNC_SHRINK);
6351*53ee8cc1Swenshuai.xi }
6352*53ee8cc1Swenshuai.xi #endif
6353*53ee8cc1Swenshuai.xi
6354*53ee8cc1Swenshuai.xi
6355*53ee8cc1Swenshuai.xi
6356*53ee8cc1Swenshuai.xi #include "drvEHCI_SCHD.cxx"
6357*53ee8cc1Swenshuai.xi
6358*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
6359*53ee8cc1Swenshuai.xi
6360*53ee8cc1Swenshuai.xi static void ehci_work(struct ehci_hcd *ehci, struct pt_regs *regs);
6361*53ee8cc1Swenshuai.xi
ehci_watchdog(U32 param)6362*53ee8cc1Swenshuai.xi static void ehci_watchdog (U32 param)
6363*53ee8cc1Swenshuai.xi {
6364*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = (struct ehci_hcd *) param;
6365*53ee8cc1Swenshuai.xi U32 flags;
6366*53ee8cc1Swenshuai.xi
6367*53ee8cc1Swenshuai.xi //GPIO_Trigger(2);
6368*53ee8cc1Swenshuai.xi //printk("w=0x%08X\n",(U32)ehci->actions);
6369*53ee8cc1Swenshuai.xi //printk("w%x\n",(U32)ehci->actions);
6370*53ee8cc1Swenshuai.xi
6371*53ee8cc1Swenshuai.xi //diag_printf("ehci_watchdog occurs\n"); //__Test
6372*53ee8cc1Swenshuai.xi kdbg("action: 0x%08X %s",(U32)ehci->actions,"\n");
6373*53ee8cc1Swenshuai.xi spin_lock_irqsave (&ehci->lock, flags);
6374*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6375*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6376*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6377*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6378*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6379*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6380*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6381*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6382*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6383*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6384*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6385*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6386*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6387*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6388*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6389*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6390*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6391*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6392*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6393*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6394*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6395*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6396*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6397*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6398*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6399*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6400*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6401*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6402*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6403*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6404*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6405*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6406*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6407*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6408*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6409*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6410*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6411*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6412*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6413*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6414*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6415*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6416*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6417*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6418*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6419*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6420*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6421*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6422*53ee8cc1Swenshuai.xi
6423*53ee8cc1Swenshuai.xi /* lost IAA irqs wedge things badly; seen with a vt8235 */
6424*53ee8cc1Swenshuai.xi if (ehci->reclaim) {
6425*53ee8cc1Swenshuai.xi U32 status = ehci_readl ((U32)&ehci->regs->status);
6426*53ee8cc1Swenshuai.xi
6427*53ee8cc1Swenshuai.xi if (status & STS_IAA) {
6428*53ee8cc1Swenshuai.xi ehci_vdbg (ehci, "lost IAA%s%s","\n","");
6429*53ee8cc1Swenshuai.xi COUNT (ehci->stats.lost_iaa);
6430*53ee8cc1Swenshuai.xi ehci_writel (STS_IAA, (U32)&ehci->regs->status);
6431*53ee8cc1Swenshuai.xi ehci->reclaim_ready = 1;
6432*53ee8cc1Swenshuai.xi }
6433*53ee8cc1Swenshuai.xi
6434*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6435*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6436*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6437*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6438*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6439*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6440*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6441*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6442*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6443*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6444*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6445*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6446*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6447*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6448*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6449*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6450*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6451*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6452*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6453*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6454*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6455*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6456*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6457*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6458*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6459*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6460*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6461*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6462*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6463*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6464*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6465*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6466*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6467*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6468*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6469*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6470*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6471*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6472*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6473*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6474*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6475*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6476*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6477*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6478*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6479*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6480*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6481*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6482*53ee8cc1Swenshuai.xi else if ( (ehci_readl((U32)&ehci->regs->command)&CMD_IAAD) && !(status & STS_IAA))
6483*53ee8cc1Swenshuai.xi {
6484*53ee8cc1Swenshuai.xi //printk ("Somethibg wrong ==>lost IAA\n");//HW ISSUE?
6485*53ee8cc1Swenshuai.xi ehci->reclaim_ready = 1;
6486*53ee8cc1Swenshuai.xi }
6487*53ee8cc1Swenshuai.xi }
6488*53ee8cc1Swenshuai.xi
6489*53ee8cc1Swenshuai.xi /* stop async processing after it's idled a bit */
6490*53ee8cc1Swenshuai.xi #if 1 //Periodic schedule issue was fixed, so reopen it
6491*53ee8cc1Swenshuai.xi if (test_bit (TIMER_ASYNC_OFF, &ehci->actions))
6492*53ee8cc1Swenshuai.xi start_unlink_async (ehci, ehci->async);
6493*53ee8cc1Swenshuai.xi #endif
6494*53ee8cc1Swenshuai.xi /* ehci could run by timer, without IRQs ... */
6495*53ee8cc1Swenshuai.xi ehci_work (ehci, NULL);
6496*53ee8cc1Swenshuai.xi
6497*53ee8cc1Swenshuai.xi spin_unlock_irqrestore (&ehci->lock, flags);
6498*53ee8cc1Swenshuai.xi /*
6499*53ee8cc1Swenshuai.xi if ( gTrigger == TRUE )
6500*53ee8cc1Swenshuai.xi {
6501*53ee8cc1Swenshuai.xi if ( *((U32 *)(0x00851BC0))!= 0x0 )
6502*53ee8cc1Swenshuai.xi {
6503*53ee8cc1Swenshuai.xi printk("ISR completed but hcpriv != NULL\n");
6504*53ee8cc1Swenshuai.xi //while(1);
6505*53ee8cc1Swenshuai.xi }
6506*53ee8cc1Swenshuai.xi }
6507*53ee8cc1Swenshuai.xi */
6508*53ee8cc1Swenshuai.xi //printk("we\n");
6509*53ee8cc1Swenshuai.xi //GPIO_Trigger(2);
6510*53ee8cc1Swenshuai.xi }
6511*53ee8cc1Swenshuai.xi
6512*53ee8cc1Swenshuai.xi #ifdef EHCI_PCI
6513*53ee8cc1Swenshuai.xi
bios_handoff(struct ehci_hcd * ehci,int where,U32 cap)6514*53ee8cc1Swenshuai.xi static int bios_handoff (struct ehci_hcd *ehci, int where, U32 cap)
6515*53ee8cc1Swenshuai.xi {
6516*53ee8cc1Swenshuai.xi if (cap & (1 << 16)) {
6517*53ee8cc1Swenshuai.xi int msec = 500;
6518*53ee8cc1Swenshuai.xi
6519*53ee8cc1Swenshuai.xi // request handoff to OS
6520*53ee8cc1Swenshuai.xi
6521*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6522*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6523*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6524*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6525*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6526*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6527*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6528*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6529*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6530*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6531*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6532*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6533*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6534*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6535*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6536*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6537*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6538*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6539*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6540*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6541*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6542*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6543*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6544*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6545*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6546*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6547*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6548*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6549*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6550*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6551*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6552*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6553*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6554*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6555*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6556*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6557*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6558*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6559*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6560*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6561*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6562*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6563*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6564*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6565*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6566*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6567*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6568*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6569*53ee8cc1Swenshuai.xi cap &= 1 << 24;
6570*53ee8cc1Swenshuai.xi // pci_write_config_dword (ehci->hcd.pdev, where, cap);
6571*53ee8cc1Swenshuai.xi
6572*53ee8cc1Swenshuai.xi // and wait a while for it to happen
6573*53ee8cc1Swenshuai.xi do {
6574*53ee8cc1Swenshuai.xi wait_ms (10);
6575*53ee8cc1Swenshuai.xi msec -= 10;
6576*53ee8cc1Swenshuai.xi pci_read_config_dword (ehci->hcd.pdev, where, &cap);
6577*53ee8cc1Swenshuai.xi } while ((cap & (1 << 16)) && msec);
6578*53ee8cc1Swenshuai.xi
6579*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6580*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6581*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6582*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6583*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6584*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6585*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6586*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6587*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6588*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6589*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6590*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6591*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6592*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6593*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6594*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6595*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6596*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6597*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6598*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6599*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6600*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6601*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6602*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6603*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6604*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6605*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6606*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6607*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6608*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6609*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6610*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6611*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6612*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6613*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6614*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6615*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6616*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6617*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6618*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6619*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6620*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6621*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6622*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6623*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6624*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6625*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6626*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6627*53ee8cc1Swenshuai.xi if (cap & (1 << 16)) {
6628*53ee8cc1Swenshuai.xi ehci_err (ehci, "BIOS handoff failed (%d, %04x)%s%s",0,
6629*53ee8cc1Swenshuai.xi where, cap,"\n","");
6630*53ee8cc1Swenshuai.xi return 1;
6631*53ee8cc1Swenshuai.xi }
6632*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "BIOS handoff succeeded%s","");
6633*53ee8cc1Swenshuai.xi }
6634*53ee8cc1Swenshuai.xi return 0;
6635*53ee8cc1Swenshuai.xi }
6636*53ee8cc1Swenshuai.xi
ehci_reboot(struct notifier_block * self,U32 code,void * null)6637*53ee8cc1Swenshuai.xi static int ehci_reboot (struct notifier_block *self, U32 code, void *null)
6638*53ee8cc1Swenshuai.xi {
6639*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci;
6640*53ee8cc1Swenshuai.xi
6641*53ee8cc1Swenshuai.xi ehci = container_of (self, struct ehci_hcd, reboot_notifier);
6642*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6643*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6644*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6645*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6646*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6647*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6648*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6649*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6650*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6651*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6652*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6653*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6654*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6655*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6656*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6657*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6658*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6659*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6660*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6661*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6662*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6663*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6664*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6665*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6666*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6667*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6668*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6669*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6670*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6671*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6672*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6673*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6674*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6675*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6676*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6677*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6678*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6679*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6680*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6681*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6682*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6683*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6684*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6685*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6686*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6687*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6688*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6689*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6690*53ee8cc1Swenshuai.xi
6691*53ee8cc1Swenshuai.xi // make BIOS/etc use companion controller during reboot
6692*53ee8cc1Swenshuai.xi // ehci_writel (0, &ehci->regs->configured_flag);//maryed by yuwen
6693*53ee8cc1Swenshuai.xi return 0;
6694*53ee8cc1Swenshuai.xi }
6695*53ee8cc1Swenshuai.xi
6696*53ee8cc1Swenshuai.xi #endif /* EHCI_PCI */
6697*53ee8cc1Swenshuai.xi
6698*53ee8cc1Swenshuai.xi /* called by khubd or root hub init threads */
6699*53ee8cc1Swenshuai.xi
ehci_hc_reset(struct usb_hcd * hcd)6700*53ee8cc1Swenshuai.xi int ehci_hc_reset (struct usb_hcd *hcd)
6701*53ee8cc1Swenshuai.xi {
6702*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci (hcd);
6703*53ee8cc1Swenshuai.xi U32 temp;
6704*53ee8cc1Swenshuai.xi
6705*53ee8cc1Swenshuai.xi spin_lock_init (&ehci->lock);
6706*53ee8cc1Swenshuai.xi
6707*53ee8cc1Swenshuai.xi ehci->caps = (struct ehci_caps *) hcd->regs;
6708*53ee8cc1Swenshuai.xi ehci->regs = (struct ehci_regs *) ( (U32)hcd->regs +
6709*53ee8cc1Swenshuai.xi (U32)ehci_readb ((U32)&ehci->caps->length));
6710*53ee8cc1Swenshuai.xi dbg_hcs_params (ehci, "reset");
6711*53ee8cc1Swenshuai.xi dbg_hcc_params (ehci, "reset");
6712*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6713*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6714*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6715*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6716*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6717*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6718*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6719*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6720*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6721*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6722*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6723*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6724*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6725*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6726*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6727*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6728*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6729*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6730*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6731*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6732*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6733*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6734*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6735*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6736*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6737*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6738*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6739*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6740*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6741*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6742*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6743*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6744*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6745*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6746*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6747*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6748*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6749*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6750*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6751*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6752*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6753*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6754*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6755*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6756*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6757*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6758*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6759*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6760*53ee8cc1Swenshuai.xi
6761*53ee8cc1Swenshuai.xi /* EHCI 0.96 and later may have "extended capabilities" */
6762*53ee8cc1Swenshuai.xi temp = HCC_EXT_CAPS (ehci_readl ((U32)&ehci->caps->hcc_params));
6763*53ee8cc1Swenshuai.xi while (temp) {
6764*53ee8cc1Swenshuai.xi U32 cap = 0;
6765*53ee8cc1Swenshuai.xi #ifdef EHCI_PCI
6766*53ee8cc1Swenshuai.xi pci_read_config_dword (ehci->hcd.pdev, temp, &cap);
6767*53ee8cc1Swenshuai.xi #endif
6768*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "capability %04x at %02x\n", cap, temp);
6769*53ee8cc1Swenshuai.xi switch (cap & 0xff) {
6770*53ee8cc1Swenshuai.xi case 1: /* BIOS/SMM/... handoff */
6771*53ee8cc1Swenshuai.xi /*
6772*53ee8cc1Swenshuai.xi if (bios_handoff (ehci, temp, cap) != 0)
6773*53ee8cc1Swenshuai.xi return -EOPNOTSUPP;
6774*53ee8cc1Swenshuai.xi */
6775*53ee8cc1Swenshuai.xi break;
6776*53ee8cc1Swenshuai.xi case 0: /* illegal reserved capability */
6777*53ee8cc1Swenshuai.xi ehci_warn (ehci, "illegal capability!%s","\n");
6778*53ee8cc1Swenshuai.xi cap = 0;
6779*53ee8cc1Swenshuai.xi
6780*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6781*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6782*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6783*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6784*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6785*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6786*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6787*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6788*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6789*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6790*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6791*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6792*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6793*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6794*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6795*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6796*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6797*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6798*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6799*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6800*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6801*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6802*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6803*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6804*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6805*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6806*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6807*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6808*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6809*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6810*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6811*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6812*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6813*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6814*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6815*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6816*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6817*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6818*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6819*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6820*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6821*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6822*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6823*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6824*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6825*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6826*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6827*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6828*53ee8cc1Swenshuai.xi /* FALLTHROUGH */
6829*53ee8cc1Swenshuai.xi default: /* unknown */
6830*53ee8cc1Swenshuai.xi break;
6831*53ee8cc1Swenshuai.xi }
6832*53ee8cc1Swenshuai.xi temp = (cap >> 8) & 0xff;
6833*53ee8cc1Swenshuai.xi }
6834*53ee8cc1Swenshuai.xi
6835*53ee8cc1Swenshuai.xi /* cache this readonly data; minimize PCI reads */
6836*53ee8cc1Swenshuai.xi ehci->hcs_params = ehci_readl ((U32)&ehci->caps->hcs_params);
6837*53ee8cc1Swenshuai.xi
6838*53ee8cc1Swenshuai.xi /* force HC to halt state */
6839*53ee8cc1Swenshuai.xi return ehci_halt (ehci);
6840*53ee8cc1Swenshuai.xi }
6841*53ee8cc1Swenshuai.xi
6842*53ee8cc1Swenshuai.xi extern void usb_hcd_poll_rh_status(struct usb_hcd *hcd);
6843*53ee8cc1Swenshuai.xi extern MS_U8 MDrv_USBGetChipID(void);
ehci_start(struct usb_hcd * hcd)6844*53ee8cc1Swenshuai.xi int ehci_start (struct usb_hcd *hcd)
6845*53ee8cc1Swenshuai.xi {
6846*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci (hcd);
6847*53ee8cc1Swenshuai.xi U32 temp;
6848*53ee8cc1Swenshuai.xi struct usb_device *udev;
6849*53ee8cc1Swenshuai.xi struct usb_bus *bus;
6850*53ee8cc1Swenshuai.xi int retval;
6851*53ee8cc1Swenshuai.xi U32 hcc_params;
6852*53ee8cc1Swenshuai.xi unsigned char tempbyte;
6853*53ee8cc1Swenshuai.xi U8 chipID = MDrv_USBGetChipID();
6854*53ee8cc1Swenshuai.xi
6855*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6856*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6857*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6858*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6859*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6860*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6861*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6862*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6863*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6864*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6865*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6866*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6867*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6868*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6869*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6870*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6871*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6872*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6873*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6874*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6875*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6876*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6877*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6878*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6879*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6880*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6881*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6882*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6883*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6884*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6885*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6886*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6887*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6888*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6889*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6890*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6891*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6892*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6893*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6894*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6895*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6896*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6897*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6898*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6899*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6900*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6901*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6902*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6903*53ee8cc1Swenshuai.xi ehci->periodic_size = DEFAULT_I_TDPS;
6904*53ee8cc1Swenshuai.xi if ((retval = ehci_mem_init (ehci, SLAB_KERNEL)) < 0)
6905*53ee8cc1Swenshuai.xi return retval;
6906*53ee8cc1Swenshuai.xi
6907*53ee8cc1Swenshuai.xi /* controllers may cache some of the periodic schedule ... */
6908*53ee8cc1Swenshuai.xi hcc_params = ehci_readl ((U32)&ehci->caps->hcc_params);
6909*53ee8cc1Swenshuai.xi if (HCC_ISOC_CACHE (hcc_params)) // full frame cache
6910*53ee8cc1Swenshuai.xi ehci->i_thresh = 8;
6911*53ee8cc1Swenshuai.xi else // N microframes cached
6912*53ee8cc1Swenshuai.xi ehci->i_thresh = 2 + HCC_ISOC_THRES (hcc_params);
6913*53ee8cc1Swenshuai.xi
6914*53ee8cc1Swenshuai.xi ehci->reclaim = 0;
6915*53ee8cc1Swenshuai.xi ehci->next_uframe = -1;
6916*53ee8cc1Swenshuai.xi
6917*53ee8cc1Swenshuai.xi /* controller state: unknown --> reset */
6918*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6919*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6920*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6921*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6922*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6923*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6924*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6925*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6926*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6927*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6928*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6929*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6930*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6931*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6932*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6933*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6934*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6935*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6936*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6937*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6938*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6939*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6940*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6941*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6942*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6943*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6944*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6945*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6946*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6947*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6948*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6949*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6950*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6951*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6952*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6953*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6954*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6955*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6956*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6957*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6958*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6959*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6960*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6961*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6962*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6963*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6964*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6965*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6966*53ee8cc1Swenshuai.xi
6967*53ee8cc1Swenshuai.xi #ifdef ROOTHUB_INTERRUPT_MODE
6968*53ee8cc1Swenshuai.xi hcd->uses_new_polling = 1;
6969*53ee8cc1Swenshuai.xi hcd->poll_rh = 0;
6970*53ee8cc1Swenshuai.xi #endif
6971*53ee8cc1Swenshuai.xi
6972*53ee8cc1Swenshuai.xi /* EHCI spec section 4.1 */
6973*53ee8cc1Swenshuai.xi if ((retval = ehci_reset (ehci)) != 0) {
6974*53ee8cc1Swenshuai.xi ehci_mem_cleanup (ehci);
6975*53ee8cc1Swenshuai.xi return retval;
6976*53ee8cc1Swenshuai.xi }
6977*53ee8cc1Swenshuai.xi
6978*53ee8cc1Swenshuai.xi ehci_writel (INTR_MASK, (U32)&ehci->regs->intr_enable);
6979*53ee8cc1Swenshuai.xi temp=ehci_readl((U32)&ehci->regs->bus_control);
6980*53ee8cc1Swenshuai.xi // temp|=INT_POLAR+HALF_SPEED;
6981*53ee8cc1Swenshuai.xi temp|=INT_POLAR;
6982*53ee8cc1Swenshuai.xi temp&=~VBUS_OFF;
6983*53ee8cc1Swenshuai.xi ehci_writel(temp,(U32)&ehci->regs->bus_control); //set intr high active
6984*53ee8cc1Swenshuai.xi ehci_writel (ehci->periodic_dma, (U32)&ehci->regs->frame_list);
6985*53ee8cc1Swenshuai.xi
6986*53ee8cc1Swenshuai.xi ehci->async->qh_next.qh = 0;
6987*53ee8cc1Swenshuai.xi
6988*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6989*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6990*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6991*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6992*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6993*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6994*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6995*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6996*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6997*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6998*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
6999*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7000*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7001*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7002*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7003*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7004*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7005*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7006*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7007*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7008*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7009*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7010*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7011*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7012*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7013*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7014*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7015*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7016*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7017*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7018*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7019*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7020*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7021*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7022*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7023*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7024*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7025*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7026*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7027*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7028*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7029*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7030*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7031*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7032*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7033*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7034*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7035*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7036*53ee8cc1Swenshuai.xi ehci->async->hw_next = QH_NEXT (ehci->async->qh_dma);
7037*53ee8cc1Swenshuai.xi ehci->async->hw_info1 = CPUToLE32(QH_HEAD);
7038*53ee8cc1Swenshuai.xi ehci->async->hw_token = CPUToLE32(QTD_STS_HALT);
7039*53ee8cc1Swenshuai.xi
7040*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7041*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7042*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7043*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7044*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7045*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7046*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7047*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7048*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7049*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7050*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7051*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7052*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7053*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7054*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7055*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7056*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7057*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7058*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7059*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7060*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7061*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7062*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7063*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7064*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7065*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7066*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7067*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7068*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7069*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7070*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7071*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7072*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7073*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7074*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7075*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7076*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7077*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7078*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7079*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7080*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7081*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7082*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7083*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7084*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7085*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7086*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7087*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7088*53ee8cc1Swenshuai.xi ehci->async->hw_qtd_next = EHCI_LIST_END;
7089*53ee8cc1Swenshuai.xi ehci->async->qh_state = QH_STATE_LINKED;
7090*53ee8cc1Swenshuai.xi ehci->async->hw_alt_next = QTD_NEXT (ehci->async->dummy->qtd_dma);
7091*53ee8cc1Swenshuai.xi diag_printf("qh: %p\n", (U32)ehci->async->qh_dma);
7092*53ee8cc1Swenshuai.xi ehci_writel ((U32)ehci->async->qh_dma, (U32)&ehci->regs->async_next);
7093*53ee8cc1Swenshuai.xi
7094*53ee8cc1Swenshuai.xi #ifndef CONFIG_FARADAY_FOTG200
7095*53ee8cc1Swenshuai.xi if (HCC_64BIT_ADDR (hcc_params)) {
7096*53ee8cc1Swenshuai.xi ehci_writel (0, (U32)&ehci->regs->segment);
7097*53ee8cc1Swenshuai.xi
7098*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7099*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7100*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7101*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7102*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7103*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7104*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7105*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7106*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7107*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7108*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7109*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7110*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7111*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7112*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7113*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7114*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7115*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7116*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7117*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7118*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7119*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7120*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7121*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7122*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7123*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7124*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7125*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7126*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7127*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7128*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7129*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7130*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7131*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7132*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7133*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7134*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7135*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7136*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7137*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7138*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7139*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7140*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7141*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7142*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7143*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7144*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7145*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7146*53ee8cc1Swenshuai.xi #if 0
7147*53ee8cc1Swenshuai.xi // this is deeply broken on almost all architectures
7148*53ee8cc1Swenshuai.xi if (!pci_set_dma_mask (ehci->hcd.pdev, 0xffffffffffffffffULL))
7149*53ee8cc1Swenshuai.xi ehci_info (ehci, "enabled 64bit PCI DMA\n");
7150*53ee8cc1Swenshuai.xi #endif
7151*53ee8cc1Swenshuai.xi }
7152*53ee8cc1Swenshuai.xi #endif
7153*53ee8cc1Swenshuai.xi /* help hc dma work well with cachelines */
7154*53ee8cc1Swenshuai.xi #ifdef EHCI_PCI
7155*53ee8cc1Swenshuai.xi pci_set_mwi (ehci->hcd.pdev);
7156*53ee8cc1Swenshuai.xi #endif
7157*53ee8cc1Swenshuai.xi
7158*53ee8cc1Swenshuai.xi /* clear interrupt enables, set irq latency */
7159*53ee8cc1Swenshuai.xi temp = ehci_readl ((U32)&ehci->regs->command) & 0x0fff;
7160*53ee8cc1Swenshuai.xi if (log2_irq_thresh < 0 || log2_irq_thresh > 6)
7161*53ee8cc1Swenshuai.xi log2_irq_thresh = 0;
7162*53ee8cc1Swenshuai.xi temp |= 1 << (16 + log2_irq_thresh);
7163*53ee8cc1Swenshuai.xi
7164*53ee8cc1Swenshuai.xi // if hc can park (ehci >= 0.96), default is 3 packets per async QH
7165*53ee8cc1Swenshuai.xi if (chipID == CHIPID_KAISERIN)
7166*53ee8cc1Swenshuai.xi {
7167*53ee8cc1Swenshuai.xi U16 chipVER = usb_readw((void *)(KAISERIN_CHIP_TOP_BASE+0xCE*2));
7168*53ee8cc1Swenshuai.xi if (chipVER == 0x101)
7169*53ee8cc1Swenshuai.xi {
7170*53ee8cc1Swenshuai.xi if (HCC_CANPARK(hcc_params)) {
7171*53ee8cc1Swenshuai.xi U32 park_eco = 3;
7172*53ee8cc1Swenshuai.xi if (park_eco) {
7173*53ee8cc1Swenshuai.xi temp |= CMD_PARK;
7174*53ee8cc1Swenshuai.xi temp |= park_eco << 8;
7175*53ee8cc1Swenshuai.xi }
7176*53ee8cc1Swenshuai.xi }
7177*53ee8cc1Swenshuai.xi }
7178*53ee8cc1Swenshuai.xi }
7179*53ee8cc1Swenshuai.xi
7180*53ee8cc1Swenshuai.xi if (HCC_PGM_FRAMELISTLEN (hcc_params)) {
7181*53ee8cc1Swenshuai.xi /* periodic schedule size can be smaller than default */
7182*53ee8cc1Swenshuai.xi temp &= ~(3 << 2);
7183*53ee8cc1Swenshuai.xi temp |= (EHCI_TUNE_FLS << 2);
7184*53ee8cc1Swenshuai.xi
7185*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7186*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7187*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7188*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7189*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7190*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7191*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7192*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7193*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7194*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7195*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7196*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7197*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7198*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7199*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7200*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7201*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7202*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7203*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7204*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7205*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7206*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7207*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7208*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7209*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7210*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7211*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7212*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7213*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7214*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7215*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7216*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7217*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7218*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7219*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7220*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7221*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7222*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7223*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7224*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7225*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7226*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7227*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7228*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7229*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7230*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7231*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7232*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7233*53ee8cc1Swenshuai.xi switch (EHCI_TUNE_FLS) {
7234*53ee8cc1Swenshuai.xi case 0: ehci->periodic_size = 1024; break;
7235*53ee8cc1Swenshuai.xi case 1: ehci->periodic_size = 512; break;
7236*53ee8cc1Swenshuai.xi case 2: ehci->periodic_size = 256; break;
7237*53ee8cc1Swenshuai.xi default: BUG ();
7238*53ee8cc1Swenshuai.xi }
7239*53ee8cc1Swenshuai.xi }
7240*53ee8cc1Swenshuai.xi temp &= ~(CMD_IAAD | CMD_ASE | CMD_PSE),
7241*53ee8cc1Swenshuai.xi // Philips, Intel, and maybe others need CMD_RUN before the
7242*53ee8cc1Swenshuai.xi // root hub will detect new devices (why?); NEC doesn't
7243*53ee8cc1Swenshuai.xi #ifdef CONFIG_FARADAY_FOTG200
7244*53ee8cc1Swenshuai.xi // Only make HC run when device connects to bus
7245*53ee8cc1Swenshuai.xi #else
7246*53ee8cc1Swenshuai.xi temp |= CMD_RUN;//mark by yuwen
7247*53ee8cc1Swenshuai.xi #endif
7248*53ee8cc1Swenshuai.xi ehci_writel (temp, (U32)&ehci->regs->command);
7249*53ee8cc1Swenshuai.xi dbg_cmd (ehci, "init", temp);
7250*53ee8cc1Swenshuai.xi //diag_printf("==> Set RUN bit !!\n");
7251*53ee8cc1Swenshuai.xi
7252*53ee8cc1Swenshuai.xi /* set async sleep time = 10 us ... ? */
7253*53ee8cc1Swenshuai.xi
7254*53ee8cc1Swenshuai.xi init_timer (&ehci->watchdog);
7255*53ee8cc1Swenshuai.xi ehci->watchdog.function = ehci_watchdog;
7256*53ee8cc1Swenshuai.xi ehci->watchdog.data = (U32) ehci;
7257*53ee8cc1Swenshuai.xi
7258*53ee8cc1Swenshuai.xi /* wire up the root hub */
7259*53ee8cc1Swenshuai.xi bus = hcd_to_bus (hcd);
7260*53ee8cc1Swenshuai.xi bus->root_hub = udev = usb_alloc_dev (NULL, bus);
7261*53ee8cc1Swenshuai.xi if (!udev) {
7262*53ee8cc1Swenshuai.xi done2:
7263*53ee8cc1Swenshuai.xi ehci_mem_cleanup (ehci);
7264*53ee8cc1Swenshuai.xi
7265*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7266*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7267*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7268*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7269*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7270*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7271*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7272*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7273*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7274*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7275*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7276*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7277*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7278*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7279*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7280*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7281*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7282*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7283*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7284*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7285*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7286*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7287*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7288*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7289*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7290*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7291*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7292*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7293*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7294*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7295*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7296*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7297*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7298*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7299*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7300*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7301*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7302*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7303*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7304*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7305*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7306*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7307*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7308*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7309*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7310*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7311*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7312*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7313*53ee8cc1Swenshuai.xi return -ENOMEM;
7314*53ee8cc1Swenshuai.xi }
7315*53ee8cc1Swenshuai.xi
7316*53ee8cc1Swenshuai.xi ehci->hcd.state = USB_STATE_RUNNING;
7317*53ee8cc1Swenshuai.xi #ifndef CONFIG_FARADAY_FOTG200
7318*53ee8cc1Swenshuai.xi // ehci_writel (FLAG_CF, &ehci->regs->configured_flag);//marked by yuwen
7319*53ee8cc1Swenshuai.xi #endif
7320*53ee8cc1Swenshuai.xi temp = ehci_readl ((U32)&ehci->regs->command); /* unblock posted write */
7321*53ee8cc1Swenshuai.xi
7322*53ee8cc1Swenshuai.xi /* PCI Serial Bus Release Number is at 0x60 offset */
7323*53ee8cc1Swenshuai.xi #ifdef EHCI_PCI
7324*53ee8cc1Swenshuai.xi pci_read_config_byte (hcd->pdev, 0x60, &tempbyte);
7325*53ee8cc1Swenshuai.xi
7326*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7327*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7328*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7329*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7330*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7331*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7332*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7333*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7334*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7335*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7336*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7337*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7338*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7339*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7340*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7341*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7342*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7343*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7344*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7345*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7346*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7347*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7348*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7349*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7350*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7351*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7352*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7353*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7354*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7355*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7356*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7357*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7358*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7359*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7360*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7361*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7362*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7363*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7364*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7365*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7366*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7367*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7368*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7369*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7370*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7371*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7372*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7373*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7374*53ee8cc1Swenshuai.xi #else
7375*53ee8cc1Swenshuai.xi tempbyte = 0;
7376*53ee8cc1Swenshuai.xi #endif
7377*53ee8cc1Swenshuai.xi temp = ehci_readw ((U32)&ehci->caps->hci_version);
7378*53ee8cc1Swenshuai.xi ehci_info (ehci,
7379*53ee8cc1Swenshuai.xi "USB %x.%x enabled, EHCI %x.%02x, driver %s\n",
7380*53ee8cc1Swenshuai.xi ((tempbyte & 0xf0)>>4), (tempbyte & 0x0f),
7381*53ee8cc1Swenshuai.xi temp >> 8, temp & 0xff, DRIVER_VERSION);
7382*53ee8cc1Swenshuai.xi
7383*53ee8cc1Swenshuai.xi
7384*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7385*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7386*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7387*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7388*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7389*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7390*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7391*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7392*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7393*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7394*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7395*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7396*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7397*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7398*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7399*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7400*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7401*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7402*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7403*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7404*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7405*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7406*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7407*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7408*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7409*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7410*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7411*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7412*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7413*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7414*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7415*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7416*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7417*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7418*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7419*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7420*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7421*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7422*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7423*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7424*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7425*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7426*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7427*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7428*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7429*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7430*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7431*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7432*53ee8cc1Swenshuai.xi udev->speed = USB_SPEED_HIGH;
7433*53ee8cc1Swenshuai.xi if (hcd_register_root (hcd) != 0) {
7434*53ee8cc1Swenshuai.xi if (hcd->state == USB_STATE_RUNNING)
7435*53ee8cc1Swenshuai.xi ehci_ready (ehci);
7436*53ee8cc1Swenshuai.xi ehci_reset (ehci);
7437*53ee8cc1Swenshuai.xi bus->root_hub = 0;
7438*53ee8cc1Swenshuai.xi usb_put_dev (udev);
7439*53ee8cc1Swenshuai.xi retval = -ENODEV;
7440*53ee8cc1Swenshuai.xi goto done2;
7441*53ee8cc1Swenshuai.xi }
7442*53ee8cc1Swenshuai.xi
7443*53ee8cc1Swenshuai.xi #ifdef ROOTHUB_INTERRUPT_MODE
7444*53ee8cc1Swenshuai.xi if (hcd->uses_new_polling && hcd->poll_rh)
7445*53ee8cc1Swenshuai.xi {
7446*53ee8cc1Swenshuai.xi diag_printf("<ehci_start> usb_hcd_poll_rh_status\n");
7447*53ee8cc1Swenshuai.xi usb_hcd_poll_rh_status(hcd);
7448*53ee8cc1Swenshuai.xi }
7449*53ee8cc1Swenshuai.xi #endif
7450*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7451*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7452*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7453*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7454*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7455*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7456*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7457*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7458*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7459*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7460*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7461*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7462*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7463*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7464*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7465*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7466*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7467*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7468*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7469*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7470*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7471*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7472*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7473*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7474*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7475*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7476*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7477*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7478*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7479*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7480*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7481*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7482*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7483*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7484*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7485*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7486*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7487*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7488*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7489*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7490*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7491*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7492*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7493*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7494*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7495*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7496*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7497*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7498*53ee8cc1Swenshuai.xi
7499*53ee8cc1Swenshuai.xi return 0;
7500*53ee8cc1Swenshuai.xi }
7501*53ee8cc1Swenshuai.xi
7502*53ee8cc1Swenshuai.xi /* always called by thread; normally rmmod */
7503*53ee8cc1Swenshuai.xi
ehci_stop(struct usb_hcd * hcd)7504*53ee8cc1Swenshuai.xi void ehci_stop (struct usb_hcd *hcd)
7505*53ee8cc1Swenshuai.xi {
7506*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci (hcd);
7507*53ee8cc1Swenshuai.xi
7508*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "stop%s","");
7509*53ee8cc1Swenshuai.xi
7510*53ee8cc1Swenshuai.xi /* no more interrupts ... */
7511*53ee8cc1Swenshuai.xi if (hcd->state == USB_STATE_RUNNING)
7512*53ee8cc1Swenshuai.xi ehci_ready (ehci);
7513*53ee8cc1Swenshuai.xi /*
7514*53ee8cc1Swenshuai.xi if (in_interrupt ()) { // must not happen!!
7515*53ee8cc1Swenshuai.xi ehci_err (ehci, "stopped in_interrupt!\n");
7516*53ee8cc1Swenshuai.xi return;
7517*53ee8cc1Swenshuai.xi }
7518*53ee8cc1Swenshuai.xi */
7519*53ee8cc1Swenshuai.xi del_timer_sync (&ehci->watchdog);
7520*53ee8cc1Swenshuai.xi ehci_reset (ehci);
7521*53ee8cc1Swenshuai.xi
7522*53ee8cc1Swenshuai.xi /* let companion controllers work when we aren't */
7523*53ee8cc1Swenshuai.xi #ifndef CONFIG_FARADAY_FOTG200
7524*53ee8cc1Swenshuai.xi // ehci_writel (0, &ehci->regs->configured_flag); //marked by Yuwen
7525*53ee8cc1Swenshuai.xi #endif
7526*53ee8cc1Swenshuai.xi //unregister_reboot_notifier (&ehci->reboot_notifier);
7527*53ee8cc1Swenshuai.xi
7528*53ee8cc1Swenshuai.xi //remove_debug_files (ehci);
7529*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7530*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7531*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7532*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7533*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7534*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7535*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7536*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7537*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7538*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7539*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7540*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7541*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7542*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7543*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7544*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7545*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7546*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7547*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7548*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7549*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7550*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7551*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7552*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7553*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7554*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7555*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7556*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7557*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7558*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7559*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7560*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7561*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7562*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7563*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7564*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7565*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7566*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7567*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7568*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7569*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7570*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7571*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7572*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7573*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7574*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7575*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7576*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7577*53ee8cc1Swenshuai.xi
7578*53ee8cc1Swenshuai.xi /* root hub is shut down separately (first, when possible) */
7579*53ee8cc1Swenshuai.xi spin_lock_irq (&ehci->lock);
7580*53ee8cc1Swenshuai.xi ehci_work (ehci, NULL);
7581*53ee8cc1Swenshuai.xi spin_unlock_irq (&ehci->lock);
7582*53ee8cc1Swenshuai.xi ehci_mem_cleanup (ehci);
7583*53ee8cc1Swenshuai.xi
7584*53ee8cc1Swenshuai.xi #ifdef EHCI_STATS
7585*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "irq normal %ld err %ld reclaim %ld (lost %ld)\n",
7586*53ee8cc1Swenshuai.xi ehci->stats.normal, ehci->stats.error, ehci->stats.reclaim,
7587*53ee8cc1Swenshuai.xi ehci->stats.lost_iaa);
7588*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "complete %ld unlink %ld\n",
7589*53ee8cc1Swenshuai.xi ehci->stats.complete, ehci->stats.unlink);
7590*53ee8cc1Swenshuai.xi #endif
7591*53ee8cc1Swenshuai.xi
7592*53ee8cc1Swenshuai.xi dbg_status (ehci, "ehci_stop completed", ehci_readl ((U32)&ehci->regs->status));
7593*53ee8cc1Swenshuai.xi }
7594*53ee8cc1Swenshuai.xi
ehci_get_frame(struct usb_hcd * hcd)7595*53ee8cc1Swenshuai.xi int ehci_get_frame (struct usb_hcd *hcd)
7596*53ee8cc1Swenshuai.xi {
7597*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci (hcd);
7598*53ee8cc1Swenshuai.xi
7599*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7600*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7601*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7602*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7603*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7604*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7605*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7606*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7607*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7608*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7609*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7610*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7611*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7612*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7613*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7614*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7615*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7616*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7617*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7618*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7619*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7620*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7621*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7622*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7623*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7624*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7625*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7626*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7627*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7628*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7629*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7630*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7631*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7632*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7633*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7634*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7635*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7636*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7637*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7638*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7639*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7640*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7641*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7642*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7643*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7644*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7645*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7646*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7647*53ee8cc1Swenshuai.xi return (ehci_readl ((U32)&ehci->regs->frame_index) >> 3) % ehci->periodic_size;
7648*53ee8cc1Swenshuai.xi }
7649*53ee8cc1Swenshuai.xi
7650*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
7651*53ee8cc1Swenshuai.xi
ehci_suspend(struct usb_hcd * hcd,U32 state)7652*53ee8cc1Swenshuai.xi int ehci_suspend (struct usb_hcd *hcd, U32 state)
7653*53ee8cc1Swenshuai.xi {
7654*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci (hcd);
7655*53ee8cc1Swenshuai.xi int ports;
7656*53ee8cc1Swenshuai.xi int i;
7657*53ee8cc1Swenshuai.xi
7658*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "suspend to %d\n", state);
7659*53ee8cc1Swenshuai.xi
7660*53ee8cc1Swenshuai.xi ports = HCS_N_PORTS (ehci->hcs_params);
7661*53ee8cc1Swenshuai.xi
7662*53ee8cc1Swenshuai.xi if (hcd->state == USB_STATE_RUNNING)
7663*53ee8cc1Swenshuai.xi ehci_ready (ehci);
7664*53ee8cc1Swenshuai.xi
7665*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7666*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7667*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7668*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7669*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7670*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7671*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7672*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7673*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7674*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7675*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7676*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7677*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7678*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7679*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7680*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7681*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7682*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7683*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7684*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7685*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7686*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7687*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7688*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7689*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7690*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7691*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7692*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7693*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7694*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7695*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7696*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7697*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7698*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7699*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7700*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7701*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7702*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7703*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7704*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7705*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7706*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7707*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7708*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7709*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7710*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7711*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7712*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7713*53ee8cc1Swenshuai.xi diag_printf("ehci_suspend\n");
7714*53ee8cc1Swenshuai.xi ehci_writel(ehci_readl ((U32)&ehci->regs->command) & ~CMD_RUN, (U32)&ehci->regs->command);
7715*53ee8cc1Swenshuai.xi while((ehci_readl((U32)&ehci->regs->status)&STS_HALT) == 0);
7716*53ee8cc1Swenshuai.xi
7717*53ee8cc1Swenshuai.xi /* suspend each port, then stop the hc */
7718*53ee8cc1Swenshuai.xi for (i = 0; i < ports; i++) {
7719*53ee8cc1Swenshuai.xi int temp = ehci_readl ((U32)&ehci->regs->port_status [i]);
7720*53ee8cc1Swenshuai.xi #ifndef CONFIG_FARADAY_FOTG200
7721*53ee8cc1Swenshuai.xi if ((temp & PORT_PE) == 0
7722*53ee8cc1Swenshuai.xi || (temp & PORT_OWNER) != 0)
7723*53ee8cc1Swenshuai.xi continue;
7724*53ee8cc1Swenshuai.xi #else
7725*53ee8cc1Swenshuai.xi if (((temp & PORT_PE) == 0))
7726*53ee8cc1Swenshuai.xi continue;
7727*53ee8cc1Swenshuai.xi #endif
7728*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "suspend port %d", i);
7729*53ee8cc1Swenshuai.xi temp |= PORT_SUSPEND;
7730*53ee8cc1Swenshuai.xi ehci_writel (temp, (U32)&ehci->regs->port_status [i]);
7731*53ee8cc1Swenshuai.xi }
7732*53ee8cc1Swenshuai.xi return 0;
7733*53ee8cc1Swenshuai.xi }
7734*53ee8cc1Swenshuai.xi
ehci_resume(struct usb_hcd * hcd)7735*53ee8cc1Swenshuai.xi int ehci_resume (struct usb_hcd *hcd)
7736*53ee8cc1Swenshuai.xi {
7737*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci (hcd);
7738*53ee8cc1Swenshuai.xi int ports;
7739*53ee8cc1Swenshuai.xi int i;
7740*53ee8cc1Swenshuai.xi U32 tmp;
7741*53ee8cc1Swenshuai.xi
7742*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "resume%s","");
7743*53ee8cc1Swenshuai.xi
7744*53ee8cc1Swenshuai.xi ports = HCS_N_PORTS (ehci->hcs_params);
7745*53ee8cc1Swenshuai.xi
7746*53ee8cc1Swenshuai.xi
7747*53ee8cc1Swenshuai.xi
7748*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7749*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7750*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7751*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7752*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7753*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7754*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7755*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7756*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7757*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7758*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7759*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7760*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7761*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7762*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7763*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7764*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7765*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7766*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7767*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7768*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7769*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7770*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7771*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7772*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7773*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7774*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7775*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7776*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7777*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7778*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7779*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7780*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7781*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7782*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7783*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7784*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7785*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7786*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7787*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7788*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7789*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7790*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7791*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7792*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7793*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7794*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7795*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7796*53ee8cc1Swenshuai.xi hcd->state = USB_STATE_RUNNING;
7797*53ee8cc1Swenshuai.xi // FIXME Philips/Intel/... etc don't really have a "READY"
7798*53ee8cc1Swenshuai.xi // state ... turn on CMD_RUN too
7799*53ee8cc1Swenshuai.xi for (i = 0; i < ports; i++) {
7800*53ee8cc1Swenshuai.xi int temp = ehci_readl ((U32)&ehci->regs->port_status [i]);
7801*53ee8cc1Swenshuai.xi if ((temp & PORT_PE) == 0
7802*53ee8cc1Swenshuai.xi || (temp & PORT_SUSPEND) != 0)
7803*53ee8cc1Swenshuai.xi continue;
7804*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "resume port %d", i);
7805*53ee8cc1Swenshuai.xi temp |= PORT_RESUME;
7806*53ee8cc1Swenshuai.xi ehci_writel (temp, (U32)&ehci->regs->port_status [i]);
7807*53ee8cc1Swenshuai.xi tmp = ehci_readl ((U32)&ehci->regs->command); /* unblock posted writes */
7808*53ee8cc1Swenshuai.xi wait_ms (20);
7809*53ee8cc1Swenshuai.xi temp &= ~PORT_RESUME;
7810*53ee8cc1Swenshuai.xi ehci_writel (temp, (U32)&ehci->regs->port_status [i]);
7811*53ee8cc1Swenshuai.xi }
7812*53ee8cc1Swenshuai.xi tmp = ehci_readl ((U32)&ehci->regs->command); /* unblock posted writes */
7813*53ee8cc1Swenshuai.xi return 0;
7814*53ee8cc1Swenshuai.xi }
7815*53ee8cc1Swenshuai.xi
7816*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
7817*53ee8cc1Swenshuai.xi
7818*53ee8cc1Swenshuai.xi
ehci_work(struct ehci_hcd * ehci,struct pt_regs * regs)7819*53ee8cc1Swenshuai.xi static void ehci_work (struct ehci_hcd *ehci, struct pt_regs *regs)
7820*53ee8cc1Swenshuai.xi {
7821*53ee8cc1Swenshuai.xi //del_timer(&ehci->watchdog); //__Test
7822*53ee8cc1Swenshuai.xi timer_action_done (ehci, TIMER_IO_WATCHDOG);
7823*53ee8cc1Swenshuai.xi
7824*53ee8cc1Swenshuai.xi // This sequence will release Host task befor USB DSR complete.
7825*53ee8cc1Swenshuai.xi #if 0
7826*53ee8cc1Swenshuai.xi if (ehci->reclaim_ready)
7827*53ee8cc1Swenshuai.xi end_unlink_async (ehci, regs);
7828*53ee8cc1Swenshuai.xi scan_async (ehci, regs);
7829*53ee8cc1Swenshuai.xi #endif
7830*53ee8cc1Swenshuai.xi if (ehci->reclaim_ready)
7831*53ee8cc1Swenshuai.xi {
7832*53ee8cc1Swenshuai.xi //ehci->regs->command&=~CMD_ASE; //stop asyn scheduler
7833*53ee8cc1Swenshuai.xi
7834*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7835*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7836*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7837*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7838*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7839*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7840*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7841*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7842*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7843*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7844*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7845*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7846*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7847*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7848*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7849*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7850*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7851*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7852*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7853*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7854*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7855*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7856*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7857*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7858*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7859*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7860*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7861*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7862*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7863*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7864*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7865*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7866*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7867*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7868*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7869*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7870*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7871*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7872*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7873*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7874*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7875*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7876*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7877*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7878*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7879*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7880*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7881*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7882*53ee8cc1Swenshuai.xi scan_async (ehci, regs);
7883*53ee8cc1Swenshuai.xi end_unlink_async (ehci, regs);
7884*53ee8cc1Swenshuai.xi }
7885*53ee8cc1Swenshuai.xi
7886*53ee8cc1Swenshuai.xi if (ehci->next_uframe != -1)
7887*53ee8cc1Swenshuai.xi scan_periodic (ehci, regs);
7888*53ee8cc1Swenshuai.xi
7889*53ee8cc1Swenshuai.xi /* the IO watchdog guards against hardware or driver bugs that
7890*53ee8cc1Swenshuai.xi * misplace IRQs, and should let us run completely without IRQs.
7891*53ee8cc1Swenshuai.xi */
7892*53ee8cc1Swenshuai.xi if ((ehci->async->qh_next.ptr != 0) || (ehci->periodic_sched != 0))
7893*53ee8cc1Swenshuai.xi timer_action (ehci, TIMER_IO_WATCHDOG);
7894*53ee8cc1Swenshuai.xi }
7895*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
7896*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
7897*53ee8cc1Swenshuai.xi //extern int game_status;
ehci_irq(struct usb_hcd * hcd,struct pt_regs * regs)7898*53ee8cc1Swenshuai.xi void ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs)
7899*53ee8cc1Swenshuai.xi {
7900*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci= hcd_to_ehci (hcd);
7901*53ee8cc1Swenshuai.xi U32 status;
7902*53ee8cc1Swenshuai.xi #ifdef ROOTHUB_INTERRUPT_MODE
7903*53ee8cc1Swenshuai.xi U32 pcd_status = 0;
7904*53ee8cc1Swenshuai.xi #endif
7905*53ee8cc1Swenshuai.xi int bh;
7906*53ee8cc1Swenshuai.xi U32 cmd_t;
7907*53ee8cc1Swenshuai.xi
7908*53ee8cc1Swenshuai.xi spin_lock (&ehci->lock);
7909*53ee8cc1Swenshuai.xi
7910*53ee8cc1Swenshuai.xi status = ehci_readl ((U32)&ehci->regs->status);
7911*53ee8cc1Swenshuai.xi //diag_printf("ehci_irq status: %x, intr_enable: %x\n", status, ehci_readb(&ehci->regs->intr_enable));
7912*53ee8cc1Swenshuai.xi
7913*53ee8cc1Swenshuai.xi /* e.g. cardbus physical eject */
7914*53ee8cc1Swenshuai.xi if (status == ~(U32) 0) {
7915*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "device removed%s%s","\n","");
7916*53ee8cc1Swenshuai.xi goto dead;
7917*53ee8cc1Swenshuai.xi }
7918*53ee8cc1Swenshuai.xi
7919*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7920*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7921*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7922*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7923*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7924*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7925*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7926*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7927*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7928*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7929*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7930*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7931*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7932*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7933*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7934*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7935*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7936*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7937*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7938*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7939*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7940*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7941*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7942*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7943*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7944*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7945*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7946*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7947*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7948*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7949*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7950*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7951*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7952*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7953*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7954*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7955*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7956*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7957*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7958*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7959*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7960*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7961*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7962*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7963*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7964*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7965*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7966*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
7967*53ee8cc1Swenshuai.xi
7968*53ee8cc1Swenshuai.xi status &= INTR_MASK;
7969*53ee8cc1Swenshuai.xi if (!status) /* irq sharing? */
7970*53ee8cc1Swenshuai.xi goto done;
7971*53ee8cc1Swenshuai.xi
7972*53ee8cc1Swenshuai.xi /* clear (just) interrupts */
7973*53ee8cc1Swenshuai.xi ehci_writel (status, (U32)&ehci->regs->status);
7974*53ee8cc1Swenshuai.xi cmd_t = ehci_readl ((U32)&ehci->regs->command); /* unblock posted write */
7975*53ee8cc1Swenshuai.xi bh = 0;
7976*53ee8cc1Swenshuai.xi ehci->uDontSendIAA = 0;
7977*53ee8cc1Swenshuai.xi
7978*53ee8cc1Swenshuai.xi #ifdef EHCI_VERBOSE_DEBUG
7979*53ee8cc1Swenshuai.xi #ifdef KERNEL_DEBUG
7980*53ee8cc1Swenshuai.xi /* unrequested/ignored: Port Change Detect, Frame List Rollover */
7981*53ee8cc1Swenshuai.xi dbg_status (ehci, "irq", status);
7982*53ee8cc1Swenshuai.xi #endif
7983*53ee8cc1Swenshuai.xi #endif
7984*53ee8cc1Swenshuai.xi
7985*53ee8cc1Swenshuai.xi /* INT, ERR, and IAA interrupt rates can be throttled */
7986*53ee8cc1Swenshuai.xi /* normal [4.15.1.2] or error [4.15.1.1] completion */
7987*53ee8cc1Swenshuai.xi if (likely ((status & (STS_INT|STS_ERR)) != 0)) {
7988*53ee8cc1Swenshuai.xi
7989*53ee8cc1Swenshuai.xi // Enable the interrupt for Async Advance Enable
7990*53ee8cc1Swenshuai.xi #if 1
7991*53ee8cc1Swenshuai.xi ehci->reclaim_ready = 0;
7992*53ee8cc1Swenshuai.xi int cmd = ehci_readl ((U32)&ehci->regs->command);
7993*53ee8cc1Swenshuai.xi cmd |= CMD_IAAD;
7994*53ee8cc1Swenshuai.xi ehci_writel (cmd, (U32)&ehci->regs->command);
7995*53ee8cc1Swenshuai.xi (void) ehci_readl ((U32)&ehci->regs->command);
7996*53ee8cc1Swenshuai.xi ehci->uDontSendIAA = 1;
7997*53ee8cc1Swenshuai.xi #endif
7998*53ee8cc1Swenshuai.xi // COUNT (ehci->stats.reclaim);
7999*53ee8cc1Swenshuai.xi //ehci->reclaim_ready = 1;
8000*53ee8cc1Swenshuai.xi //ehci->uDontSendIAA = 1;
8001*53ee8cc1Swenshuai.xi // bh = 1;
8002*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8003*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8004*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8005*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8006*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8007*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8008*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8009*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8010*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8011*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8012*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8013*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8014*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8015*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8016*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8017*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8018*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8019*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8020*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8021*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8022*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8023*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8024*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8025*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8026*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8027*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8028*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8029*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8030*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8031*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8032*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8033*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8034*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8035*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8036*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8037*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8038*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8039*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8040*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8041*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8042*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8043*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8044*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8045*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8046*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8047*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8048*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8049*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8050*53ee8cc1Swenshuai.xi
8051*53ee8cc1Swenshuai.xi if (likely ((status & STS_ERR) == 0))
8052*53ee8cc1Swenshuai.xi {
8053*53ee8cc1Swenshuai.xi COUNT (ehci->stats.normal);
8054*53ee8cc1Swenshuai.xi
8055*53ee8cc1Swenshuai.xi }
8056*53ee8cc1Swenshuai.xi else
8057*53ee8cc1Swenshuai.xi {
8058*53ee8cc1Swenshuai.xi COUNT (ehci->stats.error);
8059*53ee8cc1Swenshuai.xi //bh = 1; //Note, remove for command stall
8060*53ee8cc1Swenshuai.xi }
8061*53ee8cc1Swenshuai.xi }
8062*53ee8cc1Swenshuai.xi
8063*53ee8cc1Swenshuai.xi /* complete the unlinking of some qh [4.15.2.3] */
8064*53ee8cc1Swenshuai.xi #if 1
8065*53ee8cc1Swenshuai.xi if (status & STS_IAA) {
8066*53ee8cc1Swenshuai.xi COUNT (ehci->stats.reclaim);
8067*53ee8cc1Swenshuai.xi ehci->reclaim_ready = 1;
8068*53ee8cc1Swenshuai.xi ehci->uDontSendIAA = 1;
8069*53ee8cc1Swenshuai.xi bh = 1;
8070*53ee8cc1Swenshuai.xi //game_status=0x55;
8071*53ee8cc1Swenshuai.xi }
8072*53ee8cc1Swenshuai.xi #endif
8073*53ee8cc1Swenshuai.xi
8074*53ee8cc1Swenshuai.xi #ifdef ROOTHUB_INTERRUPT_MODE
8075*53ee8cc1Swenshuai.xi /* remote wakeup [4.3.1] */
8076*53ee8cc1Swenshuai.xi if (status & STS_PCD) {
8077*53ee8cc1Swenshuai.xi unsigned i = HCS_N_PORTS (ehci->hcs_params);
8078*53ee8cc1Swenshuai.xi
8079*53ee8cc1Swenshuai.xi
8080*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8081*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8082*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8083*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8084*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8085*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8086*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8087*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8088*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8089*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8090*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8091*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8092*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8093*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8094*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8095*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8096*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8097*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8098*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8099*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8100*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8101*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8102*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8103*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8104*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8105*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8106*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8107*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8108*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8109*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8110*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8111*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8112*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8113*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8114*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8115*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8116*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8117*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8118*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8119*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8120*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8121*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8122*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8123*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8124*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8125*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8126*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8127*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8128*53ee8cc1Swenshuai.xi
8129*53ee8cc1Swenshuai.xi /* kick root hub later */
8130*53ee8cc1Swenshuai.xi pcd_status = status & STS_PCD;
8131*53ee8cc1Swenshuai.xi
8132*53ee8cc1Swenshuai.xi /* resume root hub? */
8133*53ee8cc1Swenshuai.xi // TODO: FIXME
8134*53ee8cc1Swenshuai.xi //if (!(cmd_t & CMD_RUN))
8135*53ee8cc1Swenshuai.xi //usb_hcd_resume_root_hub(hcd);
8136*53ee8cc1Swenshuai.xi
8137*53ee8cc1Swenshuai.xi while (i--)
8138*53ee8cc1Swenshuai.xi {
8139*53ee8cc1Swenshuai.xi int pstatus = ehci_readl((U32)&ehci->regs->port_status [i]);
8140*53ee8cc1Swenshuai.xi
8141*53ee8cc1Swenshuai.xi //if (pstatus & PORT_OWNER)
8142*53ee8cc1Swenshuai.xi //continue;
8143*53ee8cc1Swenshuai.xi if (!(/*test_bit(i, &ehci->suspended_ports) &&*/
8144*53ee8cc1Swenshuai.xi ((pstatus & PORT_RESUME) ||
8145*53ee8cc1Swenshuai.xi !(pstatus & PORT_SUSPEND)) &&
8146*53ee8cc1Swenshuai.xi (pstatus & PORT_PE) &&
8147*53ee8cc1Swenshuai.xi ehci->reset_done[i] == 0))
8148*53ee8cc1Swenshuai.xi {
8149*53ee8cc1Swenshuai.xi //diag_printf("<ehci_irq> continue, pstatus %x, done[%d] = %x\n", pstatus, i, ehci->reset_done[i]);
8150*53ee8cc1Swenshuai.xi continue;
8151*53ee8cc1Swenshuai.xi }
8152*53ee8cc1Swenshuai.xi
8153*53ee8cc1Swenshuai.xi /* start 20 msec resume signaling from this port,
8154*53ee8cc1Swenshuai.xi * and make khubd collect PORT_STAT_C_SUSPEND to
8155*53ee8cc1Swenshuai.xi * stop that signaling.
8156*53ee8cc1Swenshuai.xi */
8157*53ee8cc1Swenshuai.xi //ehci->reset_done [i] = jiffies + msecs_to_jiffies (20);
8158*53ee8cc1Swenshuai.xi ehci->reset_done [i] = jiffies + ((20 /* msec */ * HZ) / 1000);
8159*53ee8cc1Swenshuai.xi ehci_dbg (ehci, "port %d remote wakeup\n", i + 1);
8160*53ee8cc1Swenshuai.xi mod_timer(&hcd->rh_timer, ehci->reset_done[i], 0);
8161*53ee8cc1Swenshuai.xi }
8162*53ee8cc1Swenshuai.xi }
8163*53ee8cc1Swenshuai.xi #endif
8164*53ee8cc1Swenshuai.xi
8165*53ee8cc1Swenshuai.xi /* PCI errors [4.15.2.4] */
8166*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8167*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8168*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8169*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8170*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8171*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8172*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8173*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8174*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8175*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8176*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8177*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8178*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8179*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8180*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8181*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8182*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8183*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8184*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8185*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8186*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8187*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8188*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8189*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8190*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8191*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8192*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8193*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8194*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8195*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8196*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8197*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8198*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8199*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8200*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8201*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8202*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8203*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8204*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8205*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8206*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8207*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8208*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8209*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8210*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8211*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8212*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8213*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8214*53ee8cc1Swenshuai.xi
8215*53ee8cc1Swenshuai.xi if (unlikely ((status & STS_FATAL) != 0)) {
8216*53ee8cc1Swenshuai.xi ehci_err (ehci, "fatal error%s","\n");
8217*53ee8cc1Swenshuai.xi dead:
8218*53ee8cc1Swenshuai.xi ehci_reset (ehci);
8219*53ee8cc1Swenshuai.xi /* generic layer kills/unlinks all urbs, then
8220*53ee8cc1Swenshuai.xi * uses ehci_stop to clean up the rest
8221*53ee8cc1Swenshuai.xi */
8222*53ee8cc1Swenshuai.xi bh = 1;
8223*53ee8cc1Swenshuai.xi }
8224*53ee8cc1Swenshuai.xi
8225*53ee8cc1Swenshuai.xi if (bh ||
8226*53ee8cc1Swenshuai.xi (ehci->periodic_sched != 0) //If we has periodic transactions in Schedule, we must scan periodic when STS_INT
8227*53ee8cc1Swenshuai.xi )
8228*53ee8cc1Swenshuai.xi ehci_work (ehci, regs);
8229*53ee8cc1Swenshuai.xi done:
8230*53ee8cc1Swenshuai.xi spin_unlock (&ehci->lock);
8231*53ee8cc1Swenshuai.xi #ifdef ROOTHUB_INTERRUPT_MODE
8232*53ee8cc1Swenshuai.xi if (pcd_status)
8233*53ee8cc1Swenshuai.xi usb_hcd_poll_rh_status(hcd);
8234*53ee8cc1Swenshuai.xi #endif
8235*53ee8cc1Swenshuai.xi }
8236*53ee8cc1Swenshuai.xi
8237*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
8238*53ee8cc1Swenshuai.xi
8239*53ee8cc1Swenshuai.xi
8240*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8241*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8242*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8243*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8244*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8245*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8246*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8247*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8248*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8249*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8250*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8251*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8252*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8253*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8254*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8255*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8256*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8257*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8258*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8259*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8260*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8261*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8262*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8263*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8264*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8265*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8266*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8267*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8268*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8269*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8270*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8271*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8272*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8273*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8274*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8275*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8276*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8277*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8278*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8279*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8280*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8281*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8282*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8283*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8284*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8285*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8286*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8287*53ee8cc1Swenshuai.xi /*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*53ee8cc1Swenshuai.xi int ehci_urb_enqueue (
8289*53ee8cc1Swenshuai.xi struct usb_hcd *hcd,
8290*53ee8cc1Swenshuai.xi struct urb *urb,
8291*53ee8cc1Swenshuai.xi int mem_flags
8292*53ee8cc1Swenshuai.xi ) {
8293*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci (hcd);
8294*53ee8cc1Swenshuai.xi struct list_head qtd_list;
8295*53ee8cc1Swenshuai.xi //printk("s\n");
8296*53ee8cc1Swenshuai.xi //g_ehci = ehci;
8297*53ee8cc1Swenshuai.xi #ifdef EHCI_VERBOSE_DEBUG
8298*53ee8cc1Swenshuai.xi urb_print (urb, "SUB", usb_pipein (urb->pipe));
8299*53ee8cc1Swenshuai.xi #endif
8300*53ee8cc1Swenshuai.xi //#ifdef CONFIG_FARADAY_FOTG200
8301*53ee8cc1Swenshuai.xi //FIXME: cover FOTG200 bug
8302*53ee8cc1Swenshuai.xi //Check if device is attached to USB
8303*53ee8cc1Swenshuai.xi //If not ==> do not issue URB out
8304*53ee8cc1Swenshuai.xi if( (ehci_readl ((U32)&ehci->regs->port_status[0])&PORT_CONNECT) == 0 )
8305*53ee8cc1Swenshuai.xi {
8306*53ee8cc1Swenshuai.xi return -ENODEV;
8307*53ee8cc1Swenshuai.xi }
8308*53ee8cc1Swenshuai.xi //#endif
8309*53ee8cc1Swenshuai.xi urb->transfer_flags &= ~EHCI_STATE_UNLINK;
8310*53ee8cc1Swenshuai.xi INIT_LIST_HEAD (&qtd_list);
8311*53ee8cc1Swenshuai.xi //CPUCleanInvalidateDCacheAll();
8312*53ee8cc1Swenshuai.xi
8313*53ee8cc1Swenshuai.xi switch (usb_pipetype (urb->pipe)) {
8314*53ee8cc1Swenshuai.xi // case PIPE_CONTROL:
8315*53ee8cc1Swenshuai.xi // case PIPE_BULK:
8316*53ee8cc1Swenshuai.xi default:
8317*53ee8cc1Swenshuai.xi
8318*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8319*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8320*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8321*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8322*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8323*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8324*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8325*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8326*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8327*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8328*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8329*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8330*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8331*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8332*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8333*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8334*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8335*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8336*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8337*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8338*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8339*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8340*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8341*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8342*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8343*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8344*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8345*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8346*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8347*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8348*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8349*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8350*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8351*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8352*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8353*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8354*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8355*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8356*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8357*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8358*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8359*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8360*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8361*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8362*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8363*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8364*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8365*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8366*53ee8cc1Swenshuai.xi if (mem_flags == ASYNC_MAKE_QTD)
8367*53ee8cc1Swenshuai.xi {
8368*53ee8cc1Swenshuai.xi INIT_LIST_HEAD (&urb->qtd_list);
8369*53ee8cc1Swenshuai.xi if (!qh_urb_transaction (ehci, urb, &urb->qtd_list, mem_flags))
8370*53ee8cc1Swenshuai.xi return -ENOMEM;
8371*53ee8cc1Swenshuai.xi else
8372*53ee8cc1Swenshuai.xi return ENOERR;
8373*53ee8cc1Swenshuai.xi }
8374*53ee8cc1Swenshuai.xi else if (mem_flags == ASYNC_SUBMIT_QTD)
8375*53ee8cc1Swenshuai.xi {
8376*53ee8cc1Swenshuai.xi return submit_async (ehci, urb, &urb->qtd_list, mem_flags);
8377*53ee8cc1Swenshuai.xi }
8378*53ee8cc1Swenshuai.xi else
8379*53ee8cc1Swenshuai.xi {
8380*53ee8cc1Swenshuai.xi if (!qh_urb_transaction (ehci, urb, &qtd_list, mem_flags))
8381*53ee8cc1Swenshuai.xi return -ENOMEM;
8382*53ee8cc1Swenshuai.xi return submit_async (ehci, urb, &qtd_list, mem_flags);
8383*53ee8cc1Swenshuai.xi }
8384*53ee8cc1Swenshuai.xi
8385*53ee8cc1Swenshuai.xi case PIPE_INTERRUPT:
8386*53ee8cc1Swenshuai.xi if (!qh_urb_transaction (ehci, urb, &qtd_list, mem_flags))
8387*53ee8cc1Swenshuai.xi return -ENOMEM;
8388*53ee8cc1Swenshuai.xi return intr_submit (ehci, urb, &qtd_list, mem_flags);
8389*53ee8cc1Swenshuai.xi
8390*53ee8cc1Swenshuai.xi case PIPE_ISOCHRONOUS:
8391*53ee8cc1Swenshuai.xi #ifdef have_iso_itd
8392*53ee8cc1Swenshuai.xi if (urb->dev->speed == USB_SPEED_HIGH)
8393*53ee8cc1Swenshuai.xi return itd_submit (ehci, urb, mem_flags);
8394*53ee8cc1Swenshuai.xi #endif
8395*53ee8cc1Swenshuai.xi #ifdef have_split_iso
8396*53ee8cc1Swenshuai.xi else
8397*53ee8cc1Swenshuai.xi return sitd_submit (ehci, urb, mem_flags);
8398*53ee8cc1Swenshuai.xi #else
8399*53ee8cc1Swenshuai.xi dbg ("no split iso support yet%s","");
8400*53ee8cc1Swenshuai.xi return -ENOSYS;
8401*53ee8cc1Swenshuai.xi #endif /* have_split_iso */
8402*53ee8cc1Swenshuai.xi }
8403*53ee8cc1Swenshuai.xi }
8404*53ee8cc1Swenshuai.xi
8405*53ee8cc1Swenshuai.xi extern void ResetMstarUsb(struct ehci_hcd *ehci);
USB_HW_Reset(struct usb_hcd * pUsbHcd)8406*53ee8cc1Swenshuai.xi void USB_HW_Reset(struct usb_hcd* pUsbHcd)
8407*53ee8cc1Swenshuai.xi {
8408*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci(pUsbHcd);
8409*53ee8cc1Swenshuai.xi ResetMstarUsb(ehci);
8410*53ee8cc1Swenshuai.xi ehci_StopRun_Setting(HOST20_Enable, ehci);
8411*53ee8cc1Swenshuai.xi }
8412*53ee8cc1Swenshuai.xi
8413*53ee8cc1Swenshuai.xi /* remove from hardware lists
8414*53ee8cc1Swenshuai.xi * completions normally happen asynchronously
8415*53ee8cc1Swenshuai.xi * It will be called in Interrupt context.
8416*53ee8cc1Swenshuai.xi */
ehci_urb_dequeue(struct usb_hcd * hcd,struct urb * urb)8417*53ee8cc1Swenshuai.xi int ehci_urb_dequeue (struct usb_hcd *hcd, struct urb *urb)
8418*53ee8cc1Swenshuai.xi {
8419*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci (hcd);
8420*53ee8cc1Swenshuai.xi struct ehci_qh *qh;
8421*53ee8cc1Swenshuai.xi U32 flags;
8422*53ee8cc1Swenshuai.xi usb_msg("ehci_urb_dequeue:UNLINK%s","");
8423*53ee8cc1Swenshuai.xi #ifdef EHCI_VERBOSE_DEBUG
8424*53ee8cc1Swenshuai.xi urb_print (urb, "UNLINK", 1);
8425*53ee8cc1Swenshuai.xi #endif
8426*53ee8cc1Swenshuai.xi spin_lock_irqsave (&ehci->lock, flags);
8427*53ee8cc1Swenshuai.xi switch (usb_pipetype (urb->pipe)) {
8428*53ee8cc1Swenshuai.xi // case PIPE_CONTROL:
8429*53ee8cc1Swenshuai.xi // case PIPE_BULK:
8430*53ee8cc1Swenshuai.xi
8431*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8432*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8433*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8434*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8435*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8436*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8437*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8438*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8439*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8440*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8441*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8442*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8443*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8444*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8445*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8446*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8447*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8448*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8449*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8450*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8451*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8452*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8453*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8454*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8455*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8456*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8457*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8458*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8459*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8460*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8461*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8462*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8463*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8464*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8465*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8466*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8467*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8468*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8469*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8470*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8471*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8472*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8473*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8474*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8475*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8476*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8477*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8478*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8479*53ee8cc1Swenshuai.xi default:
8480*53ee8cc1Swenshuai.xi qh = (struct ehci_qh *) urb->hcpriv;
8481*53ee8cc1Swenshuai.xi if (!qh)
8482*53ee8cc1Swenshuai.xi break;
8483*53ee8cc1Swenshuai.xi
8484*53ee8cc1Swenshuai.xi /* if we need to use IAA and it's busy, defer */
8485*53ee8cc1Swenshuai.xi if (qh->qh_state == QH_STATE_LINKED
8486*53ee8cc1Swenshuai.xi && ehci->reclaim
8487*53ee8cc1Swenshuai.xi && HCD_IS_RUNNING (ehci->hcd.state)
8488*53ee8cc1Swenshuai.xi ) {
8489*53ee8cc1Swenshuai.xi struct ehci_qh *last;
8490*53ee8cc1Swenshuai.xi
8491*53ee8cc1Swenshuai.xi for (last = ehci->reclaim;
8492*53ee8cc1Swenshuai.xi last->reclaim;
8493*53ee8cc1Swenshuai.xi last = last->reclaim)
8494*53ee8cc1Swenshuai.xi continue;
8495*53ee8cc1Swenshuai.xi qh->qh_state = QH_STATE_UNLINK_WAIT;
8496*53ee8cc1Swenshuai.xi last->reclaim = qh;
8497*53ee8cc1Swenshuai.xi /* bypass IAA if the hc can't care */
8498*53ee8cc1Swenshuai.xi } else if (!HCD_IS_RUNNING (ehci->hcd.state) && ehci->reclaim)
8499*53ee8cc1Swenshuai.xi end_unlink_async (ehci, NULL);
8500*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8501*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8502*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8503*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8504*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8505*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8506*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8507*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8508*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8509*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8510*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8511*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8512*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8513*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8514*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8515*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8516*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8517*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8518*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8519*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8520*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8521*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8522*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8523*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8524*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8525*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8526*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8527*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8528*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8529*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8530*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8531*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8532*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8533*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8534*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8535*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8536*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8537*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8538*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8539*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8540*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8541*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8542*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8543*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8544*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8545*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8546*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8547*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8548*53ee8cc1Swenshuai.xi
8549*53ee8cc1Swenshuai.xi /* something else might have unlinked the qh by now */
8550*53ee8cc1Swenshuai.xi if (qh->qh_state == QH_STATE_LINKED)
8551*53ee8cc1Swenshuai.xi start_unlink_async (ehci, qh);
8552*53ee8cc1Swenshuai.xi //#ifdef CONFIG_FARADAY_FOTG200
8553*53ee8cc1Swenshuai.xi #if 1
8554*53ee8cc1Swenshuai.xi //FIXME: cover FOTG200 bug
8555*53ee8cc1Swenshuai.xi if( (ehci_readl ((U32)&ehci->regs->port_status[0])&PORT_CONNECT) == 0 )
8556*53ee8cc1Swenshuai.xi {
8557*53ee8cc1Swenshuai.xi #ifdef CONFIG_FARADAY_FOTG200
8558*53ee8cc1Swenshuai.xi mdwOTGC_Control_PHY_Reset_Set();
8559*53ee8cc1Swenshuai.xi udelay(1000);
8560*53ee8cc1Swenshuai.xi mdwOTGC_Control_PHY_Reset_Clr();
8561*53ee8cc1Swenshuai.xi //Reset OTG controller
8562*53ee8cc1Swenshuai.xi mdwOTGC_Control_OTG_Reset_Set();
8563*53ee8cc1Swenshuai.xi #endif
8564*53ee8cc1Swenshuai.xi //Finish ullinking procedure
8565*53ee8cc1Swenshuai.xi end_unlink_async (ehci, NULL);
8566*53ee8cc1Swenshuai.xi //Reset HC to ensure FOTG200 work correctly at the next time
8567*53ee8cc1Swenshuai.xi hub_port_disable(ehci->hcd.self.root_hub,0);
8568*53ee8cc1Swenshuai.xi }
8569*53ee8cc1Swenshuai.xi else if ( (ehci_readl ((U32)&ehci->regs->command)&CMD_RUN) == 0 )
8570*53ee8cc1Swenshuai.xi {
8571*53ee8cc1Swenshuai.xi //diag_printf("Something wrong (script auto running?) ==> Check it out\n");
8572*53ee8cc1Swenshuai.xi
8573*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8574*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8575*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8576*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8577*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8578*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8579*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8580*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8581*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8582*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8583*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8584*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8585*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8586*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8587*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8588*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8589*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8590*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8591*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8592*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8593*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8594*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8595*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8596*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8597*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8598*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8599*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8600*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8601*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8602*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8603*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8604*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8605*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8606*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8607*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8608*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8609*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8610*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8611*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8612*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8613*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8614*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8615*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8616*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8617*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8618*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8619*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8620*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8621*53ee8cc1Swenshuai.xi #if 0
8622*53ee8cc1Swenshuai.xi // mdwOTGC_Control_PHY_Reset_Set();
8623*53ee8cc1Swenshuai.xi // udelay(1000);
8624*53ee8cc1Swenshuai.xi // mdwOTGC_Control_PHY_Reset_Clr();
8625*53ee8cc1Swenshuai.xi //Reset OTG controller
8626*53ee8cc1Swenshuai.xi //mdwOTGC_Control_OTG_Reset_Set();
8627*53ee8cc1Swenshuai.xi #endif
8628*53ee8cc1Swenshuai.xi //Finish ullinking procedure
8629*53ee8cc1Swenshuai.xi end_unlink_async (ehci, NULL);
8630*53ee8cc1Swenshuai.xi //Reset HC to ensure FOTG200 work correctly at the next time
8631*53ee8cc1Swenshuai.xi hub_port_disable(ehci->hcd.self.root_hub,0);
8632*53ee8cc1Swenshuai.xi }
8633*53ee8cc1Swenshuai.xi #endif
8634*53ee8cc1Swenshuai.xi break;
8635*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8636*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8637*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8638*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8639*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8640*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8641*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8642*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8643*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8644*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8645*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8646*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8647*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8648*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8649*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8650*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8651*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8652*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8653*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8654*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8655*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8656*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8657*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8658*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8659*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8660*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8661*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8662*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8663*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8664*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8665*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8666*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8667*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8668*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8669*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8670*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8671*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8672*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8673*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8674*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8675*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8676*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8677*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8678*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8679*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8680*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8681*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8682*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8683*53ee8cc1Swenshuai.xi
8684*53ee8cc1Swenshuai.xi case PIPE_INTERRUPT:
8685*53ee8cc1Swenshuai.xi qh = (struct ehci_qh *) urb->hcpriv;
8686*53ee8cc1Swenshuai.xi if (!qh)
8687*53ee8cc1Swenshuai.xi break;
8688*53ee8cc1Swenshuai.xi if (qh->qh_state == QH_STATE_LINKED) {
8689*53ee8cc1Swenshuai.xi /* messy, can spin or block a microframe ... */
8690*53ee8cc1Swenshuai.xi intr_deschedule (ehci, qh, 1);
8691*53ee8cc1Swenshuai.xi /* qh_state == IDLE */
8692*53ee8cc1Swenshuai.xi }
8693*53ee8cc1Swenshuai.xi qh_completions (ehci, qh, NULL);
8694*53ee8cc1Swenshuai.xi
8695*53ee8cc1Swenshuai.xi /* reschedule QH iff another request is queued */
8696*53ee8cc1Swenshuai.xi
8697*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8698*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8699*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8700*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8701*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8702*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8703*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8704*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8705*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8706*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8707*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8708*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8709*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8710*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8711*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8712*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8713*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8714*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8715*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8716*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8717*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8718*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8719*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8720*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8721*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8722*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8723*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8724*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8725*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8726*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8727*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8728*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8729*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8730*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8731*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8732*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8733*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8734*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8735*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8736*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8737*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8738*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8739*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8740*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8741*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8742*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8743*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8744*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8745*53ee8cc1Swenshuai.xi if (!list_empty (&qh->qtd_list)
8746*53ee8cc1Swenshuai.xi && HCD_IS_RUNNING (ehci->hcd.state)) {
8747*53ee8cc1Swenshuai.xi int status;
8748*53ee8cc1Swenshuai.xi
8749*53ee8cc1Swenshuai.xi status = qh_schedule (ehci, qh);
8750*53ee8cc1Swenshuai.xi spin_unlock_irqrestore (&ehci->lock, flags);
8751*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8752*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8753*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8754*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8755*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8756*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8757*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8758*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8759*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8760*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8761*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8762*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8763*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8764*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8765*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8766*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8767*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8768*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8769*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8770*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8771*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8772*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8773*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8774*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8775*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8776*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8777*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8778*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8779*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8780*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8781*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8782*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8783*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8784*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8785*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8786*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8787*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8788*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8789*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8790*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8791*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8792*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8793*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8794*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8795*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8796*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8797*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8798*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8799*53ee8cc1Swenshuai.xi
8800*53ee8cc1Swenshuai.xi if (status != 0) {
8801*53ee8cc1Swenshuai.xi // shouldn't happen often, but ...
8802*53ee8cc1Swenshuai.xi // FIXME kill those tds' urbs
8803*53ee8cc1Swenshuai.xi usb_err ("can't reschedule qh %p, err %d",
8804*53ee8cc1Swenshuai.xi qh, status);
8805*53ee8cc1Swenshuai.xi }
8806*53ee8cc1Swenshuai.xi return status;
8807*53ee8cc1Swenshuai.xi }
8808*53ee8cc1Swenshuai.xi break;
8809*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8810*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8811*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8812*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8813*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8814*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8815*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8816*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8817*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8818*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8819*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8820*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8821*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8822*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8823*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8824*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8825*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8826*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8827*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8828*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8829*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8830*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8831*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8832*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8833*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8834*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8835*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8836*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8837*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8838*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8839*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8840*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8841*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8842*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8843*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8844*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8845*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8846*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8847*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8848*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8849*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8850*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8851*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8852*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8853*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8854*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8855*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8856*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8857*53ee8cc1Swenshuai.xi
8858*53ee8cc1Swenshuai.xi case PIPE_ISOCHRONOUS:
8859*53ee8cc1Swenshuai.xi // itd or sitd ...
8860*53ee8cc1Swenshuai.xi
8861*53ee8cc1Swenshuai.xi // wait till next completion, do it then.
8862*53ee8cc1Swenshuai.xi // completion irqs can wait up to 1024 msec,
8863*53ee8cc1Swenshuai.xi urb->transfer_flags |= EHCI_STATE_UNLINK;
8864*53ee8cc1Swenshuai.xi break;
8865*53ee8cc1Swenshuai.xi }
8866*53ee8cc1Swenshuai.xi spin_unlock_irqrestore (&ehci->lock, flags);
8867*53ee8cc1Swenshuai.xi return 0;
8868*53ee8cc1Swenshuai.xi }
8869*53ee8cc1Swenshuai.xi
8870*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
8871*53ee8cc1Swenshuai.xi
8872*53ee8cc1Swenshuai.xi // bulk qh holds the data toggle
8873*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8874*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8875*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8876*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8877*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8878*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8879*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8880*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8881*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8882*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8883*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8884*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8885*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8886*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8887*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8888*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8889*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8890*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8891*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8892*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8893*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8894*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8895*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8896*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8897*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8898*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8899*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8900*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8901*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8902*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8903*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8904*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8905*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8906*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8907*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8908*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8909*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8910*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8911*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8912*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8913*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8914*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8915*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8916*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8917*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8918*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8919*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8920*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8921*53ee8cc1Swenshuai.xi
8922*53ee8cc1Swenshuai.xi void
ehci_endpoint_disable(struct usb_hcd * hcd,struct hcd_dev * dev,int ep)8923*53ee8cc1Swenshuai.xi ehci_endpoint_disable (struct usb_hcd *hcd, struct hcd_dev *dev, int ep)
8924*53ee8cc1Swenshuai.xi {
8925*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci (hcd);
8926*53ee8cc1Swenshuai.xi int epnum;
8927*53ee8cc1Swenshuai.xi U32 flags;
8928*53ee8cc1Swenshuai.xi struct ehci_qh *qh;
8929*53ee8cc1Swenshuai.xi
8930*53ee8cc1Swenshuai.xi /* ASSERT: any requests/urbs are being unlinked */
8931*53ee8cc1Swenshuai.xi /* ASSERT: nobody can be submitting urbs for this any more */
8932*53ee8cc1Swenshuai.xi
8933*53ee8cc1Swenshuai.xi epnum = ep & USB_ENDPOINT_NUMBER_MASK;
8934*53ee8cc1Swenshuai.xi if (epnum != 0 && (ep & USB_DIR_IN))
8935*53ee8cc1Swenshuai.xi epnum |= 0x10;
8936*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8937*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8938*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8939*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8940*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8941*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8942*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8943*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8944*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8945*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8946*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8947*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8948*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8949*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8950*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8951*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8952*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8953*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8954*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8955*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8956*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8957*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8958*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8959*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8960*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8961*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8962*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8963*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8964*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8965*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8966*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8967*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8968*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8969*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8970*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8971*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8972*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8973*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8974*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8975*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8976*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8977*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8978*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8979*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8980*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8981*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8982*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8983*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8984*53ee8cc1Swenshuai.xi
8985*53ee8cc1Swenshuai.xi rescan:
8986*53ee8cc1Swenshuai.xi spin_lock_irqsave (&ehci->lock, flags);
8987*53ee8cc1Swenshuai.xi qh = (struct ehci_qh *) dev->ep [epnum];
8988*53ee8cc1Swenshuai.xi if (!qh)
8989*53ee8cc1Swenshuai.xi goto done;
8990*53ee8cc1Swenshuai.xi
8991*53ee8cc1Swenshuai.xi if (!HCD_IS_RUNNING (ehci->hcd.state))
8992*53ee8cc1Swenshuai.xi qh->qh_state = QH_STATE_IDLE;
8993*53ee8cc1Swenshuai.xi
8994*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8995*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8996*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8997*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8998*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
8999*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9000*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9001*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9002*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9003*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9004*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9005*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9006*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9007*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9008*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9009*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9010*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9011*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9012*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9013*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9014*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9015*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9016*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9017*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9018*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9019*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9020*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9021*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9022*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9023*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9024*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9025*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9026*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9027*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9028*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9029*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9030*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9031*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9032*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9033*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9034*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9035*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9036*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9037*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9038*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9039*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9040*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9041*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9042*53ee8cc1Swenshuai.xi switch (qh->qh_state) {
9043*53ee8cc1Swenshuai.xi case QH_STATE_UNLINK: /* wait for hw to finish? */
9044*53ee8cc1Swenshuai.xi spin_unlock_irqrestore (&ehci->lock, flags);
9045*53ee8cc1Swenshuai.xi set_current_state (TASK_UNINTERRUPTIBLE);
9046*53ee8cc1Swenshuai.xi schedule_timeout (1);
9047*53ee8cc1Swenshuai.xi goto rescan;
9048*53ee8cc1Swenshuai.xi case QH_STATE_IDLE: /* fully unlinked */
9049*53ee8cc1Swenshuai.xi if (list_empty (&qh->qtd_list)) {
9050*53ee8cc1Swenshuai.xi qh_put (ehci, qh);
9051*53ee8cc1Swenshuai.xi break;
9052*53ee8cc1Swenshuai.xi }
9053*53ee8cc1Swenshuai.xi /* else FALL THROUGH */
9054*53ee8cc1Swenshuai.xi
9055*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9056*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9057*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9058*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9059*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9060*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9061*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9062*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9063*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9064*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9065*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9066*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9067*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9068*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9069*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9070*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9071*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9072*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9073*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9074*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9075*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9076*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9077*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9078*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9079*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9080*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9081*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9082*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9083*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9084*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9085*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9086*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9087*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9088*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9089*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9090*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9091*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9092*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9093*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9094*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9095*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9096*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9097*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9098*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9099*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9100*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9101*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9102*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9103*53ee8cc1Swenshuai.xi default:
9104*53ee8cc1Swenshuai.xi /* caller was supposed to have unlinked any requests;
9105*53ee8cc1Swenshuai.xi * that's not our job. just leak this memory.
9106*53ee8cc1Swenshuai.xi */
9107*53ee8cc1Swenshuai.xi if ( !list_empty (&qh->qtd_list))
9108*53ee8cc1Swenshuai.xi {
9109*53ee8cc1Swenshuai.xi ehci_err (ehci, "qh %p (#%d) state %d%s\n",
9110*53ee8cc1Swenshuai.xi qh, epnum, qh->qh_state,
9111*53ee8cc1Swenshuai.xi list_empty (&qh->qtd_list) ? "" : "(has tds)");
9112*53ee8cc1Swenshuai.xi }
9113*53ee8cc1Swenshuai.xi break;
9114*53ee8cc1Swenshuai.xi }
9115*53ee8cc1Swenshuai.xi dev->ep [epnum] = 0;
9116*53ee8cc1Swenshuai.xi done:
9117*53ee8cc1Swenshuai.xi spin_unlock_irqrestore (&ehci->lock, flags);
9118*53ee8cc1Swenshuai.xi return;
9119*53ee8cc1Swenshuai.xi }
9120*53ee8cc1Swenshuai.xi #endif //#
9121*53ee8cc1Swenshuai.xi
9122*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9123*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9124*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9125*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9126*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9127*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9128*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9129*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9130*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9131*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9132*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9133*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9134*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9135*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9136*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9137*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9138*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9139*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9140*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9141*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9142*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9143*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9144*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9145*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9146*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9147*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9148*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9149*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9150*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9151*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9152*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9153*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9154*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9155*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9156*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9157*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9158*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9159*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9160*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9161*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9162*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9163*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9164*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9165*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9166*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9167*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9168*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9169*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9170*53ee8cc1Swenshuai.xi
9171*53ee8cc1Swenshuai.xi
9172*53ee8cc1Swenshuai.xi #include <MsCommon.h>
9173*53ee8cc1Swenshuai.xi #include "include/drvKernel.h"
9174*53ee8cc1Swenshuai.xi #include "include/drvCPE_AMBA.h"
9175*53ee8cc1Swenshuai.xi #include "include/drvCPE_EHCI.h"
9176*53ee8cc1Swenshuai.xi #include "drvHCD.h"
9177*53ee8cc1Swenshuai.xi struct cpe_dev cpe_ehci_dev;
9178*53ee8cc1Swenshuai.xi
9179*53ee8cc1Swenshuai.xi #if 1
9180*53ee8cc1Swenshuai.xi
9181*53ee8cc1Swenshuai.xi extern MS_S32 usb_disabled(void);
9182*53ee8cc1Swenshuai.xi
9183*53ee8cc1Swenshuai.xi //int ehci_cpe_dev_init (void);
9184*53ee8cc1Swenshuai.xi
9185*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
9186*53ee8cc1Swenshuai.xi
cpe_ehci_start_hc(struct cpe_dev * dev)9187*53ee8cc1Swenshuai.xi void cpe_ehci_start_hc(struct cpe_dev *dev)
9188*53ee8cc1Swenshuai.xi {
9189*53ee8cc1Swenshuai.xi printk(": starting CPE EHCI USB Controller\n");
9190*53ee8cc1Swenshuai.xi /*
9191*53ee8cc1Swenshuai.xi * Reset and enable AMBA EHCI HC
9192*53ee8cc1Swenshuai.xi */
9193*53ee8cc1Swenshuai.xi udelay(11);
9194*53ee8cc1Swenshuai.xi }
9195*53ee8cc1Swenshuai.xi
cpe_ehci_stop_hc(struct cpe_dev * dev)9196*53ee8cc1Swenshuai.xi void cpe_ehci_stop_hc(struct cpe_dev *dev)
9197*53ee8cc1Swenshuai.xi {
9198*53ee8cc1Swenshuai.xi /*
9199*53ee8cc1Swenshuai.xi * Reset and disable AMBA EHCI HC
9200*53ee8cc1Swenshuai.xi */
9201*53ee8cc1Swenshuai.xi return;
9202*53ee8cc1Swenshuai.xi }
9203*53ee8cc1Swenshuai.xi
9204*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
9205*53ee8cc1Swenshuai.xi
9206*53ee8cc1Swenshuai.xi void usb_hcd_cpe_ehci_remove (struct usb_hcd *hcd, struct cpe_dev *dev);
9207*53ee8cc1Swenshuai.xi
9208*53ee8cc1Swenshuai.xi
9209*53ee8cc1Swenshuai.xi
9210*53ee8cc1Swenshuai.xi 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*53ee8cc1Swenshuai.xi int usb_hcd_cpe_ehci_probe (struct hc_driver *driver,
9212*53ee8cc1Swenshuai.xi struct usb_hcd **hcd_out,
9213*53ee8cc1Swenshuai.xi struct cpe_dev *dev)
9214*53ee8cc1Swenshuai.xi {
9215*53ee8cc1Swenshuai.xi int retval;
9216*53ee8cc1Swenshuai.xi struct usb_hcd *hcd = 0;
9217*53ee8cc1Swenshuai.xi //Basic initialization for FPFA version IP
9218*53ee8cc1Swenshuai.xi // mwPeri20_Control_ChipEnable_Set();
9219*53ee8cc1Swenshuai.xi // #ifdef CYGPKG_USB_HALF_SPEED_MODE
9220*53ee8cc1Swenshuai.xi // mwPeri20_Control_HALFSPEEDEnable_Set();
9221*53ee8cc1Swenshuai.xi // #endif
9222*53ee8cc1Swenshuai.xi
9223*53ee8cc1Swenshuai.xi //#ifdef FORCE_FULL_SPEED
9224*53ee8cc1Swenshuai.xi // Force HC to full speed
9225*53ee8cc1Swenshuai.xi //mwOTG20_Control_ForceFullSpeed_Set();
9226*53ee8cc1Swenshuai.xi //mwOTG20_Control_ForceHighSpeed_Clr();
9227*53ee8cc1Swenshuai.xi //#endif
9228*53ee8cc1Swenshuai.xi //#ifdef FORCE_HIGH_SPEED
9229*53ee8cc1Swenshuai.xi // Force HC to high speed
9230*53ee8cc1Swenshuai.xi //mwOTG20_Control_ForceFullSpeed_Clr();
9231*53ee8cc1Swenshuai.xi //mwOTG20_Control_ForceHighSpeed_Set();
9232*53ee8cc1Swenshuai.xi //#endif
9233*53ee8cc1Swenshuai.xi
9234*53ee8cc1Swenshuai.xi
9235*53ee8cc1Swenshuai.xi diag_printf("usb_hcd_cpe_ehci_probe\n");
9236*53ee8cc1Swenshuai.xi cpe_ehci_start_hc(dev);
9237*53ee8cc1Swenshuai.xi
9238*53ee8cc1Swenshuai.xi
9239*53ee8cc1Swenshuai.xi hcd = driver->hcd_alloc();
9240*53ee8cc1Swenshuai.xi diag_printf("hcd: %lx\n", (U32)hcd);
9241*53ee8cc1Swenshuai.xi if (hcd == NULL){
9242*53ee8cc1Swenshuai.xi dbg ("hcd_alloc failed%s"," ");
9243*53ee8cc1Swenshuai.xi retval = -ENOMEM;
9244*53ee8cc1Swenshuai.xi goto err1;
9245*53ee8cc1Swenshuai.xi }
9246*53ee8cc1Swenshuai.xi
9247*53ee8cc1Swenshuai.xi hcd->driver = (struct hc_driver *) driver;
9248*53ee8cc1Swenshuai.xi //hcd->description = driver->description;
9249*53ee8cc1Swenshuai.xi
9250*53ee8cc1Swenshuai.xi memcpy((char*)hcd,(char*)driver,24);
9251*53ee8cc1Swenshuai.xi
9252*53ee8cc1Swenshuai.xi hcd->irq = gIrqUHC; //CPE_USB_EHCI0_IRQ;
9253*53ee8cc1Swenshuai.xi hcd->regs = (U32*) gBaseUHC;
9254*53ee8cc1Swenshuai.xi hcd->host_id = 0; // new
9255*53ee8cc1Swenshuai.xi hcd->phub_event = &hub_event_list;
9256*53ee8cc1Swenshuai.xi hcd->pdev = (struct pci_dev *)(1111); //Fake PCI device
9257*53ee8cc1Swenshuai.xi hcd->self.controller = &dev->dev;
9258*53ee8cc1Swenshuai.xi hcd->controller = hcd->self.controller;
9259*53ee8cc1Swenshuai.xi
9260*53ee8cc1Swenshuai.xi retval = hcd_buffer_create (hcd);
9261*53ee8cc1Swenshuai.xi if (retval != 0) {
9262*53ee8cc1Swenshuai.xi dbg ("pool alloc fail%s","\n");
9263*53ee8cc1Swenshuai.xi goto err1;
9264*53ee8cc1Swenshuai.xi }
9265*53ee8cc1Swenshuai.xi
9266*53ee8cc1Swenshuai.xi /* till now HC has been in an indeterminate state ... */
9267*53ee8cc1Swenshuai.xi if (driver->reset && (retval = driver->reset (hcd)) < 0) {
9268*53ee8cc1Swenshuai.xi dev_err (hcd->controller, "can't reset%s","\n");
9269*53ee8cc1Swenshuai.xi goto err2;
9270*53ee8cc1Swenshuai.xi }
9271*53ee8cc1Swenshuai.xi // Initialize IRQ and ISR Trap, enable interrupt later (at the end)
9272*53ee8cc1Swenshuai.xi #if 0
9273*53ee8cc1Swenshuai.xi fLib_CloseInt(hcd->irq);
9274*53ee8cc1Swenshuai.xi fLib_SetIntTrig(hcd->irq,LEVEL,L_ACTIVE);
9275*53ee8cc1Swenshuai.xi retval = fLib_ReqInt (hcd->irq, usb_hcd_cpe_ehci_hcim_irq, hcd);
9276*53ee8cc1Swenshuai.xi if ( retval == FALSE )
9277*53ee8cc1Swenshuai.xi {
9278*53ee8cc1Swenshuai.xi usb_err("Register ISR fail%s","");
9279*53ee8cc1Swenshuai.xi retval = -EINVAL;
9280*53ee8cc1Swenshuai.xi goto err1;
9281*53ee8cc1Swenshuai.xi }
9282*53ee8cc1Swenshuai.xi #ifdef CONFIG_OTG
9283*53ee8cc1Swenshuai.xi #ifndef CONFIG_FARADAY_FOTG200
9284*53ee8cc1Swenshuai.xi // Enable CPE EHCI HC's Interrupt
9285*53ee8cc1Swenshuai.xi fLib_EnableInt(hcd->irq);
9286*53ee8cc1Swenshuai.xi #else
9287*53ee8cc1Swenshuai.xi // Enable EHCI interrupt after intilizing OTG controller driver
9288*53ee8cc1Swenshuai.xi #endif
9289*53ee8cc1Swenshuai.xi #else
9290*53ee8cc1Swenshuai.xi // Do OTG support ==> Enable CPE EHCI HC's Interrupt now
9291*53ee8cc1Swenshuai.xi fLib_EnableInt(hcd->irq);
9292*53ee8cc1Swenshuai.xi #endif
9293*53ee8cc1Swenshuai.xi #endif
9294*53ee8cc1Swenshuai.xi //mwOTG20_Interrupt_Mask_HOST_Clr();//yuwen mark
9295*53ee8cc1Swenshuai.xi
9296*53ee8cc1Swenshuai.xi #if 0
9297*53ee8cc1Swenshuai.xi if (retval != TRUE) {
9298*53ee8cc1Swenshuai.xi dbg("request_irq failed%s"," ");
9299*53ee8cc1Swenshuai.xi retval = -EBUSY;
9300*53ee8cc1Swenshuai.xi goto err2;
9301*53ee8cc1Swenshuai.xi }
9302*53ee8cc1Swenshuai.xi #endif
9303*53ee8cc1Swenshuai.xi
9304*53ee8cc1Swenshuai.xi usb_info ("%s (CPE_AMBA) at 0x%p, irq %d\n",
9305*53ee8cc1Swenshuai.xi hcd->description, hcd->regs, hcd->irq);
9306*53ee8cc1Swenshuai.xi usb_bus_init (&hcd->self);
9307*53ee8cc1Swenshuai.xi hcd->self.op = &usb_hcd_operations;
9308*53ee8cc1Swenshuai.xi hcd->self.hcpriv = (void *) hcd;
9309*53ee8cc1Swenshuai.xi hcd->self.bus_name = "cpe_ehci";
9310*53ee8cc1Swenshuai.xi //hcd->product_desc = "CPE_AMBA EHCI";
9311*53ee8cc1Swenshuai.xi memcpy(hcd->product_desc, "CPE_AMBA EHCI", sizeof(hcd->product_desc));
9312*53ee8cc1Swenshuai.xi
9313*53ee8cc1Swenshuai.xi #ifdef ROOTHUB_INTERRUPT_MODE
9314*53ee8cc1Swenshuai.xi init_timer(&hcd->rh_timer);
9315*53ee8cc1Swenshuai.xi hcd->rh_timer.function = rh_timer_func;
9316*53ee8cc1Swenshuai.xi hcd->rh_timer.data = (unsigned long) hcd;
9317*53ee8cc1Swenshuai.xi #endif
9318*53ee8cc1Swenshuai.xi hcd->pre_sts = 0; // new
9319*53ee8cc1Swenshuai.xi hcd->pre_temp = 0; // new
9320*53ee8cc1Swenshuai.xi init_OS_Resource_EX(&hcd->USBWaitFlg);
9321*53ee8cc1Swenshuai.xi INIT_LIST_HEAD (&hcd->dev_list);
9322*53ee8cc1Swenshuai.xi usb_register_bus (&hcd->self);
9323*53ee8cc1Swenshuai.xi
9324*53ee8cc1Swenshuai.xi if ((retval = driver->start (hcd)) < 0)
9325*53ee8cc1Swenshuai.xi {
9326*53ee8cc1Swenshuai.xi usb_hcd_cpe_ehci_remove(hcd, dev);
9327*53ee8cc1Swenshuai.xi return retval;
9328*53ee8cc1Swenshuai.xi }
9329*53ee8cc1Swenshuai.xi
9330*53ee8cc1Swenshuai.xi *hcd_out = hcd;
9331*53ee8cc1Swenshuai.xi
9332*53ee8cc1Swenshuai.xi return retval;
9333*53ee8cc1Swenshuai.xi
9334*53ee8cc1Swenshuai.xi err2:
9335*53ee8cc1Swenshuai.xi hcd_buffer_destroy (hcd);
9336*53ee8cc1Swenshuai.xi if (hcd)
9337*53ee8cc1Swenshuai.xi driver->hcd_free(hcd);
9338*53ee8cc1Swenshuai.xi err1:
9339*53ee8cc1Swenshuai.xi cpe_ehci_stop_hc(dev);
9340*53ee8cc1Swenshuai.xi //release_mem_region(dev->res.start, dev->res.end - dev->res.start + 1);
9341*53ee8cc1Swenshuai.xi return retval;
9342*53ee8cc1Swenshuai.xi }
9343*53ee8cc1Swenshuai.xi
9344*53ee8cc1Swenshuai.xi
usb_hcd_cpe_ehci_remove(struct usb_hcd * hcd,struct cpe_dev * dev)9345*53ee8cc1Swenshuai.xi void usb_hcd_cpe_ehci_remove (struct usb_hcd *hcd, struct cpe_dev *dev)
9346*53ee8cc1Swenshuai.xi {
9347*53ee8cc1Swenshuai.xi struct usb_device *hub;
9348*53ee8cc1Swenshuai.xi
9349*53ee8cc1Swenshuai.xi usb_info ("remove: %s, state %x", hcd->self.bus_name, hcd->state);
9350*53ee8cc1Swenshuai.xi hub = hcd->self.root_hub;
9351*53ee8cc1Swenshuai.xi if (HCD_IS_RUNNING (hcd->state))
9352*53ee8cc1Swenshuai.xi hcd->state = USB_STATE_QUIESCING;
9353*53ee8cc1Swenshuai.xi
9354*53ee8cc1Swenshuai.xi dbg ("%s: roothub graceful disconnect", hcd->self.bus_name);
9355*53ee8cc1Swenshuai.xi usb_disconnect (&hub);
9356*53ee8cc1Swenshuai.xi
9357*53ee8cc1Swenshuai.xi hcd->driver->stop (hcd);
9358*53ee8cc1Swenshuai.xi hcd->state = USB_STATE_HALT;
9359*53ee8cc1Swenshuai.xi
9360*53ee8cc1Swenshuai.xi //free_irq (hcd->irq, hcd);
9361*53ee8cc1Swenshuai.xi //fLib_CloseInt(hcd->irq);
9362*53ee8cc1Swenshuai.xi hcd_buffer_destroy (hcd);
9363*53ee8cc1Swenshuai.xi usb_deregister_bus (&hcd->self);
9364*53ee8cc1Swenshuai.xi hcd->driver->hcd_free (hcd);
9365*53ee8cc1Swenshuai.xi cpe_ehci_stop_hc(dev);
9366*53ee8cc1Swenshuai.xi }
9367*53ee8cc1Swenshuai.xi
9368*53ee8cc1Swenshuai.xi //#ifdef CONFIG_PM
9369*53ee8cc1Swenshuai.xi #if 1
9370*53ee8cc1Swenshuai.xi
9371*53ee8cc1Swenshuai.xi
usb_hcd_cpe_ehci_suspend(struct usb_hcd * hcd)9372*53ee8cc1Swenshuai.xi int usb_hcd_cpe_ehci_suspend (struct usb_hcd *hcd)
9373*53ee8cc1Swenshuai.xi {
9374*53ee8cc1Swenshuai.xi int retval = 0;
9375*53ee8cc1Swenshuai.xi
9376*53ee8cc1Swenshuai.xi switch (hcd->state) {
9377*53ee8cc1Swenshuai.xi case USB_STATE_HALT:
9378*53ee8cc1Swenshuai.xi dev_dbg (hcd->controller, "halted; hcd not suspended%s","\n");
9379*53ee8cc1Swenshuai.xi break;
9380*53ee8cc1Swenshuai.xi case USB_STATE_SUSPENDED:
9381*53ee8cc1Swenshuai.xi dev_dbg (hcd->controller, "hcd already suspended%s","\n");
9382*53ee8cc1Swenshuai.xi break;
9383*53ee8cc1Swenshuai.xi default:
9384*53ee8cc1Swenshuai.xi hcd->state = USB_STATE_QUIESCING;
9385*53ee8cc1Swenshuai.xi retval = hcd->driver->suspend (hcd, 0);
9386*53ee8cc1Swenshuai.xi if (retval)
9387*53ee8cc1Swenshuai.xi dev_dbg (hcd->controller, "suspend fail, retval %d%s","\n", retval);
9388*53ee8cc1Swenshuai.xi break;
9389*53ee8cc1Swenshuai.xi }
9390*53ee8cc1Swenshuai.xi return retval;
9391*53ee8cc1Swenshuai.xi }
usb_hcd_cpe_ehci_resume(struct usb_hcd * hcd)9392*53ee8cc1Swenshuai.xi int usb_hcd_cpe_ehci_resume(struct usb_hcd *hcd)
9393*53ee8cc1Swenshuai.xi {
9394*53ee8cc1Swenshuai.xi int retval=0;
9395*53ee8cc1Swenshuai.xi
9396*53ee8cc1Swenshuai.xi if (hcd->state != USB_STATE_SUSPENDED) {
9397*53ee8cc1Swenshuai.xi dev_dbg (hcd->controller, "can't resume, not suspended!%s","\n");
9398*53ee8cc1Swenshuai.xi return -46;//return -EL3HLT;
9399*53ee8cc1Swenshuai.xi }
9400*53ee8cc1Swenshuai.xi hcd->state = USB_STATE_RESUMING;
9401*53ee8cc1Swenshuai.xi /* remote wakeup needs hub->suspend() cooperation */
9402*53ee8cc1Swenshuai.xi retval = hcd->driver->resume (hcd);
9403*53ee8cc1Swenshuai.xi #if 0
9404*53ee8cc1Swenshuai.xi if (!HCD_IS_RUNNING (hcd->state)) {
9405*53ee8cc1Swenshuai.xi dev_dbg (hcd->controller, "resume fail, retval %d\n", retval);
9406*53ee8cc1Swenshuai.xi usb_hc_died (hcd);
9407*53ee8cc1Swenshuai.xi }
9408*53ee8cc1Swenshuai.xi #endif
9409*53ee8cc1Swenshuai.xi return retval;
9410*53ee8cc1Swenshuai.xi }
9411*53ee8cc1Swenshuai.xi
9412*53ee8cc1Swenshuai.xi #endif /* CONFIG_PM */
9413*53ee8cc1Swenshuai.xi
9414*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
9415*53ee8cc1Swenshuai.xi
9416*53ee8cc1Swenshuai.xi #if 0
9417*53ee8cc1Swenshuai.xi static int
9418*53ee8cc1Swenshuai.xi ehci_cpe_ehci_start (struct usb_hcd *hcd)
9419*53ee8cc1Swenshuai.xi {
9420*53ee8cc1Swenshuai.xi return 0;
9421*53ee8cc1Swenshuai.xi }
9422*53ee8cc1Swenshuai.xi #endif
9423*53ee8cc1Swenshuai.xi
9424*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
9425*53ee8cc1Swenshuai.xi
9426*53ee8cc1Swenshuai.xi struct cpe_driver ehci_hcd_cpe_driver;
9427*53ee8cc1Swenshuai.xi extern int ehci_hc_reset (struct usb_hcd *hcd);
9428*53ee8cc1Swenshuai.xi extern int ehci_start (struct usb_hcd *hcd);
9429*53ee8cc1Swenshuai.xi extern int ehci_suspend (struct usb_hcd *hcd, U32 state);
9430*53ee8cc1Swenshuai.xi extern int ehci_resume (struct usb_hcd *hcd);
9431*53ee8cc1Swenshuai.xi extern void ehci_stop (struct usb_hcd *hcd);
9432*53ee8cc1Swenshuai.xi extern struct usb_hcd *ehci_hcd_alloc (void);
9433*53ee8cc1Swenshuai.xi extern void ehci_hcd_free (struct usb_hcd *hcd);
9434*53ee8cc1Swenshuai.xi extern int ehci_urb_enqueue ( struct usb_hcd *hcd, struct urb *urb, int mem_flags) ;
9435*53ee8cc1Swenshuai.xi extern int ehci_urb_dequeue (struct usb_hcd *hcd, struct urb *urb);
9436*53ee8cc1Swenshuai.xi extern void ehci_endpoint_disable (struct usb_hcd *hcd, struct hcd_dev *dev, int ep);
9437*53ee8cc1Swenshuai.xi extern int ehci_get_frame (struct usb_hcd *hcd);
9438*53ee8cc1Swenshuai.xi extern int ehci_hub_status_data (struct usb_hcd *hcd, char *buf);
9439*53ee8cc1Swenshuai.xi extern int ehci_hub_control ( struct usb_hcd *hcd, U16 typeReq, U16 wValue, U16 wIndex, char *buf, U16 wLength) ;
9440*53ee8cc1Swenshuai.xi struct hc_driver ehci_cpe_hc_driver ;
9441*53ee8cc1Swenshuai.xi
cpe_ehci_hcd_init(void)9442*53ee8cc1Swenshuai.xi static void cpe_ehci_hcd_init(void)
9443*53ee8cc1Swenshuai.xi {
9444*53ee8cc1Swenshuai.xi memcpy( ehci_cpe_hc_driver.description , "ehci_hcd", sizeof("ehci_hcd")+1);
9445*53ee8cc1Swenshuai.xi
9446*53ee8cc1Swenshuai.xi /*
9447*53ee8cc1Swenshuai.xi * generic hardware linkage
9448*53ee8cc1Swenshuai.xi */
9449*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.irq = ehci_irq;
9450*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.flags = HCD_MEMORY | HCD_USB2;
9451*53ee8cc1Swenshuai.xi
9452*53ee8cc1Swenshuai.xi /*
9453*53ee8cc1Swenshuai.xi * basic lifecycle operations
9454*53ee8cc1Swenshuai.xi */
9455*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.reset = ehci_hc_reset;
9456*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.start = ehci_start;
9457*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.suspend = ehci_suspend;
9458*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.resume = ehci_resume;
9459*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.stop = ehci_stop;
9460*53ee8cc1Swenshuai.xi
9461*53ee8cc1Swenshuai.xi /*
9462*53ee8cc1Swenshuai.xi * memory lifecycle (except per-request)
9463*53ee8cc1Swenshuai.xi */
9464*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.hcd_alloc = ehci_hcd_alloc;
9465*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.hcd_free = ehci_hcd_free;
9466*53ee8cc1Swenshuai.xi
9467*53ee8cc1Swenshuai.xi /*
9468*53ee8cc1Swenshuai.xi * managing i/o requests and associated device resources
9469*53ee8cc1Swenshuai.xi */
9470*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.urb_enqueue = ehci_urb_enqueue;
9471*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.urb_dequeue = ehci_urb_dequeue;
9472*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.endpoint_disable = ehci_endpoint_disable;
9473*53ee8cc1Swenshuai.xi
9474*53ee8cc1Swenshuai.xi /*
9475*53ee8cc1Swenshuai.xi * scheduling support
9476*53ee8cc1Swenshuai.xi */
9477*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.get_frame_number = ehci_get_frame;
9478*53ee8cc1Swenshuai.xi
9479*53ee8cc1Swenshuai.xi /*
9480*53ee8cc1Swenshuai.xi * root hub support
9481*53ee8cc1Swenshuai.xi */
9482*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.hub_status_data = ehci_hub_status_data;
9483*53ee8cc1Swenshuai.xi ehci_cpe_hc_driver.hub_control = ehci_hub_control;
9484*53ee8cc1Swenshuai.xi }
9485*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
9486*53ee8cc1Swenshuai.xi
9487*53ee8cc1Swenshuai.xi extern void InitUSBIntr(struct usb_hcd * hcd);
ehci_hcd_cpe_ehci_drv_probe(struct device_s * _dev)9488*53ee8cc1Swenshuai.xi static int ehci_hcd_cpe_ehci_drv_probe(struct device_s *_dev)
9489*53ee8cc1Swenshuai.xi {
9490*53ee8cc1Swenshuai.xi struct cpe_dev *dev;
9491*53ee8cc1Swenshuai.xi struct usb_hcd *hcd = NULL;
9492*53ee8cc1Swenshuai.xi int ret;
9493*53ee8cc1Swenshuai.xi
9494*53ee8cc1Swenshuai.xi const struct device_s *__mptr = _dev;
9495*53ee8cc1Swenshuai.xi dev = (struct cpe_dev *)( (char *)__mptr - (char *)offsetof(struct cpe_dev,dev) );
9496*53ee8cc1Swenshuai.xi
9497*53ee8cc1Swenshuai.xi if (usb_disabled())
9498*53ee8cc1Swenshuai.xi return -ENODEV;
9499*53ee8cc1Swenshuai.xi
9500*53ee8cc1Swenshuai.xi cpe_ehci_hcd_init();
9501*53ee8cc1Swenshuai.xi
9502*53ee8cc1Swenshuai.xi ret = usb_hcd_cpe_ehci_probe(&ehci_cpe_hc_driver, &hcd, dev);
9503*53ee8cc1Swenshuai.xi
9504*53ee8cc1Swenshuai.xi if (ret == 0)
9505*53ee8cc1Swenshuai.xi {
9506*53ee8cc1Swenshuai.xi dev->dev.driver_data = hcd;
9507*53ee8cc1Swenshuai.xi g_pUsbHcd = hcd;
9508*53ee8cc1Swenshuai.xi InitUSBIntr(hcd); //add USB interrupt entry . yuwen
9509*53ee8cc1Swenshuai.xi }
9510*53ee8cc1Swenshuai.xi
9511*53ee8cc1Swenshuai.xi return ret;
9512*53ee8cc1Swenshuai.xi }
9513*53ee8cc1Swenshuai.xi
9514*53ee8cc1Swenshuai.xi /*static*/
ehci_hcd_cpe_ehci_drv_remove(struct device_s * _dev)9515*53ee8cc1Swenshuai.xi int ehci_hcd_cpe_ehci_drv_remove(struct device_s *_dev)
9516*53ee8cc1Swenshuai.xi {
9517*53ee8cc1Swenshuai.xi struct cpe_dev *dev;
9518*53ee8cc1Swenshuai.xi struct usb_hcd *hcd ;
9519*53ee8cc1Swenshuai.xi
9520*53ee8cc1Swenshuai.xi const struct device_s *__mptr = _dev;
9521*53ee8cc1Swenshuai.xi dev = (struct cpe_dev *)( (char *)__mptr - (char *)offsetof(struct cpe_dev,dev) );
9522*53ee8cc1Swenshuai.xi hcd = (struct usb_hcd *) dev->dev.driver_data;
9523*53ee8cc1Swenshuai.xi
9524*53ee8cc1Swenshuai.xi usb_hcd_cpe_ehci_remove(hcd, dev);
9525*53ee8cc1Swenshuai.xi
9526*53ee8cc1Swenshuai.xi dev->dev.driver_data = NULL;
9527*53ee8cc1Swenshuai.xi
9528*53ee8cc1Swenshuai.xi return 0;
9529*53ee8cc1Swenshuai.xi }
9530*53ee8cc1Swenshuai.xi
9531*53ee8cc1Swenshuai.xi /*static*/
ehci_hcd_cpe_ehci_drv_suspend(struct device_s * _dev,U32 state,U32 level)9532*53ee8cc1Swenshuai.xi int ehci_hcd_cpe_ehci_drv_suspend(struct device_s *_dev, U32 state, U32 level)
9533*53ee8cc1Swenshuai.xi {
9534*53ee8cc1Swenshuai.xi #ifdef CONFIG_PM
9535*53ee8cc1Swenshuai.xi struct cpe_dev *dev;
9536*53ee8cc1Swenshuai.xi struct usb_hcd *hcd ;
9537*53ee8cc1Swenshuai.xi const struct device *__mptr = _dev;
9538*53ee8cc1Swenshuai.xi dev = (struct cpe_dev *)( (char *)__mptr - offsetof(struct cpe_dev,dev) );
9539*53ee8cc1Swenshuai.xi hcd = dev->dev.driver_data;
9540*53ee8cc1Swenshuai.xi usb_hcd_cpe_ehci_suspend(hcd);
9541*53ee8cc1Swenshuai.xi #endif
9542*53ee8cc1Swenshuai.xi return 0;
9543*53ee8cc1Swenshuai.xi }
9544*53ee8cc1Swenshuai.xi
9545*53ee8cc1Swenshuai.xi /*static*/
ehci_hcd_cpe_ehci_drv_resume(struct device_s * _dev,U32 level)9546*53ee8cc1Swenshuai.xi int ehci_hcd_cpe_ehci_drv_resume(struct device_s *_dev, U32 level)
9547*53ee8cc1Swenshuai.xi {
9548*53ee8cc1Swenshuai.xi #ifdef CONFIG_PM
9549*53ee8cc1Swenshuai.xi struct cpe_dev *dev;
9550*53ee8cc1Swenshuai.xi struct usb_hcd *hcd ;
9551*53ee8cc1Swenshuai.xi const struct device *__mptr = _dev;
9552*53ee8cc1Swenshuai.xi dev = (struct cpe_dev *)( (char *)__mptr - offsetof(struct cpe_dev,dev) );
9553*53ee8cc1Swenshuai.xi hcd = dev->dev.driver_data;
9554*53ee8cc1Swenshuai.xi usb_hcd_cpe_ehci_resume(hcd);
9555*53ee8cc1Swenshuai.xi #endif /* CONFIG_PM */
9556*53ee8cc1Swenshuai.xi return 0;
9557*53ee8cc1Swenshuai.xi }
9558*53ee8cc1Swenshuai.xi
9559*53ee8cc1Swenshuai.xi #if 0
9560*53ee8cc1Swenshuai.xi static void __exit ehci_hcd_cpe_ehci_cleanup (void)
9561*53ee8cc1Swenshuai.xi {
9562*53ee8cc1Swenshuai.xi driver_unregister(&ehci_hcd_cpe_driver.drv);
9563*53ee8cc1Swenshuai.xi }
9564*53ee8cc1Swenshuai.xi #endif
9565*53ee8cc1Swenshuai.xi
9566*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
9567*53ee8cc1Swenshuai.xi
ehci_hcd_cpe_ehci_init(void)9568*53ee8cc1Swenshuai.xi static int __init ehci_hcd_cpe_ehci_init (void)
9569*53ee8cc1Swenshuai.xi {
9570*53ee8cc1Swenshuai.xi pr_debug ("ehci_hcd: block sizes: qh %d qtd %d itd %d sitd %d\n",
9571*53ee8cc1Swenshuai.xi sizeof (struct ehci_qh), sizeof (struct ehci_qtd),
9572*53ee8cc1Swenshuai.xi sizeof (struct ehci_itd), sizeof (struct ehci_sitd));
9573*53ee8cc1Swenshuai.xi strncpy(ehci_hcd_cpe_driver.drv.name, "cpe_ehci", sizeof("cpe_ehci"));
9574*53ee8cc1Swenshuai.xi ehci_hcd_cpe_driver.drv.bus = &CPE_AMBA_bus_type;
9575*53ee8cc1Swenshuai.xi ehci_hcd_cpe_driver.drv.probe = ehci_hcd_cpe_ehci_drv_probe;
9576*53ee8cc1Swenshuai.xi ehci_hcd_cpe_driver.drv.remove = ehci_hcd_cpe_ehci_drv_remove;
9577*53ee8cc1Swenshuai.xi ehci_hcd_cpe_driver.drv.suspend = ehci_hcd_cpe_ehci_drv_suspend;
9578*53ee8cc1Swenshuai.xi ehci_hcd_cpe_driver.drv.resume = ehci_hcd_cpe_ehci_drv_resume;
9579*53ee8cc1Swenshuai.xi ehci_hcd_cpe_driver.devid = CPE_DEVID_USB;
9580*53ee8cc1Swenshuai.xi return driver_register(&ehci_hcd_cpe_driver.drv);
9581*53ee8cc1Swenshuai.xi }
9582*53ee8cc1Swenshuai.xi
9583*53ee8cc1Swenshuai.xi //#define DRIVER_INFO DRIVER_VERSION " " DRIVER_DESC
9584*53ee8cc1Swenshuai.xi
ehci_cpe_dev_init(void)9585*53ee8cc1Swenshuai.xi int __init ehci_cpe_dev_init(void)
9586*53ee8cc1Swenshuai.xi {
9587*53ee8cc1Swenshuai.xi // Cannot remove: Init list heads of device and driver lists of CPE EHCI device
9588*53ee8cc1Swenshuai.xi device_initialize(&cpe_ehci_dev.dev);
9589*53ee8cc1Swenshuai.xi #ifdef DEBUG
9590*53ee8cc1Swenshuai.xi //dbg (DRIVER_INFO " Init CPE EHCI Host Controller%s"," ");
9591*53ee8cc1Swenshuai.xi #endif
9592*53ee8cc1Swenshuai.xi // Init CPE EHCI device data structure
9593*53ee8cc1Swenshuai.xi cpe_ehci_dev.dev.parent = NULL; //parent should be CPE AMBA
9594*53ee8cc1Swenshuai.xi strncpy(cpe_ehci_dev.dev.name,"CPE_EHCI HC", sizeof("CPE_EHCI HC")); //USB_2
9595*53ee8cc1Swenshuai.xi strncpy(cpe_ehci_dev.dev.bus_id,"AHB0_EHCI", sizeof("AHB0_EHCI"));
9596*53ee8cc1Swenshuai.xi cpe_ehci_dev.dev.bus = &CPE_AMBA_bus_type;
9597*53ee8cc1Swenshuai.xi cpe_ehci_dev.devid = CPE_DEVID_USB;
9598*53ee8cc1Swenshuai.xi cpe_ehci_dev.mapbase = gBaseUHC;
9599*53ee8cc1Swenshuai.xi cpe_ehci_dev.utmibase = gBaseUTMI;
9600*53ee8cc1Swenshuai.xi cpe_ehci_dev.usbcbase = gBaseUSBC;
9601*53ee8cc1Swenshuai.xi cpe_ehci_dev.dma_mask = 0x00; //Unsupport DMA
9602*53ee8cc1Swenshuai.xi //register cpe_ehci devie to CPE AMBA bus
9603*53ee8cc1Swenshuai.xi device_add(&cpe_ehci_dev.dev);
9604*53ee8cc1Swenshuai.xi
9605*53ee8cc1Swenshuai.xi return ehci_hcd_cpe_ehci_init();
9606*53ee8cc1Swenshuai.xi }
9607*53ee8cc1Swenshuai.xi #endif //#
9608*53ee8cc1Swenshuai.xi
9609*53ee8cc1Swenshuai.xi // -------------------------------------------------------------------------
9610*53ee8cc1Swenshuai.xi
ehci_StopRun_Setting(MS_U8 bOption,struct ehci_hcd * ehci)9611*53ee8cc1Swenshuai.xi void ehci_StopRun_Setting(MS_U8 bOption, struct ehci_hcd *ehci)
9612*53ee8cc1Swenshuai.xi {
9613*53ee8cc1Swenshuai.xi U32 temp;
9614*53ee8cc1Swenshuai.xi
9615*53ee8cc1Swenshuai.xi if (bOption==HOST20_Enable)
9616*53ee8cc1Swenshuai.xi {
9617*53ee8cc1Swenshuai.xi temp = ehci_readl((U32)&ehci->regs->command);
9618*53ee8cc1Swenshuai.xi if (temp & CMD_RUN)
9619*53ee8cc1Swenshuai.xi return;
9620*53ee8cc1Swenshuai.xi
9621*53ee8cc1Swenshuai.xi temp |= CMD_RUN;
9622*53ee8cc1Swenshuai.xi ehci_writel(temp, (U32)&ehci->regs->command);
9623*53ee8cc1Swenshuai.xi do {
9624*53ee8cc1Swenshuai.xi temp = ehci_readl((U32)&ehci->regs->command);
9625*53ee8cc1Swenshuai.xi } while ((temp & CMD_RUN) == 0);
9626*53ee8cc1Swenshuai.xi }
9627*53ee8cc1Swenshuai.xi else if (bOption==HOST20_Disable)
9628*53ee8cc1Swenshuai.xi {
9629*53ee8cc1Swenshuai.xi temp = ehci_readl((U32)&ehci->regs->command);
9630*53ee8cc1Swenshuai.xi if ((temp & CMD_RUN) == 0)
9631*53ee8cc1Swenshuai.xi return;
9632*53ee8cc1Swenshuai.xi
9633*53ee8cc1Swenshuai.xi temp &= ~CMD_RUN;
9634*53ee8cc1Swenshuai.xi ehci_writel(temp, (U32)&ehci->regs->command);
9635*53ee8cc1Swenshuai.xi do {
9636*53ee8cc1Swenshuai.xi temp = ehci_readl((U32)&ehci->regs->command);
9637*53ee8cc1Swenshuai.xi } while ((temp & CMD_RUN) > 0);
9638*53ee8cc1Swenshuai.xi }
9639*53ee8cc1Swenshuai.xi else
9640*53ee8cc1Swenshuai.xi {
9641*53ee8cc1Swenshuai.xi diag_printf("??? Input Error 'ehci_StopRun_Setting'...");
9642*53ee8cc1Swenshuai.xi while(1);
9643*53ee8cc1Swenshuai.xi }
9644*53ee8cc1Swenshuai.xi }
9645*53ee8cc1Swenshuai.xi
9646*53ee8cc1Swenshuai.xi extern struct cpe_dev cpe_ehci_dev;
9647*53ee8cc1Swenshuai.xi extern struct cpe_driver ehci_hcd_cpe_driver;
9648*53ee8cc1Swenshuai.xi extern struct hc_driver ehci_cpe_hc_driver;
9649*53ee8cc1Swenshuai.xi extern struct usb_hcd *g_pUsbHcd;
9650*53ee8cc1Swenshuai.xi
usb_hcd_cpe_ehci_probe_EX(struct hc_driver * driver,struct usb_hcd ** hcd_out,struct cpe_dev * dev)9651*53ee8cc1Swenshuai.xi int usb_hcd_cpe_ehci_probe_EX(struct hc_driver *driver,
9652*53ee8cc1Swenshuai.xi struct usb_hcd **hcd_out,
9653*53ee8cc1Swenshuai.xi struct cpe_dev *dev)
9654*53ee8cc1Swenshuai.xi {
9655*53ee8cc1Swenshuai.xi int retval;
9656*53ee8cc1Swenshuai.xi struct usb_hcd *hcd = 0;
9657*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort *p_rootHub = cpe_to_gVar(dev);
9658*53ee8cc1Swenshuai.xi
9659*53ee8cc1Swenshuai.xi diag_printf("usb_hcd_cpe_ehci_probe_EX\n");
9660*53ee8cc1Swenshuai.xi cpe_ehci_start_hc(dev);
9661*53ee8cc1Swenshuai.xi
9662*53ee8cc1Swenshuai.xi
9663*53ee8cc1Swenshuai.xi hcd = driver->hcd_alloc();
9664*53ee8cc1Swenshuai.xi diag_printf("hcd: %lx\n", (U32)hcd);
9665*53ee8cc1Swenshuai.xi if (hcd == NULL){
9666*53ee8cc1Swenshuai.xi dbg ("hcd_alloc failed%s"," ");
9667*53ee8cc1Swenshuai.xi retval = -ENOMEM;
9668*53ee8cc1Swenshuai.xi goto ex_err1;
9669*53ee8cc1Swenshuai.xi }
9670*53ee8cc1Swenshuai.xi
9671*53ee8cc1Swenshuai.xi hcd->driver = (struct hc_driver *) driver;
9672*53ee8cc1Swenshuai.xi //hcd->description = driver->description;
9673*53ee8cc1Swenshuai.xi
9674*53ee8cc1Swenshuai.xi memcpy((char*)hcd,(char*)driver,24);
9675*53ee8cc1Swenshuai.xi
9676*53ee8cc1Swenshuai.xi hcd->host_id = p_rootHub->portNum;
9677*53ee8cc1Swenshuai.xi hcd->phub_event = p_rootHub->p_hub_event;
9678*53ee8cc1Swenshuai.xi //hcd->irq = E_IRQ_UHC; //CPE_USB_EHCI0_IRQ;
9679*53ee8cc1Swenshuai.xi //hcd->regs = (U32*) gUHC_BASE;
9680*53ee8cc1Swenshuai.xi hcd->irq = dev->intNum;
9681*53ee8cc1Swenshuai.xi hcd->regs = (U32*) dev->mapbase;
9682*53ee8cc1Swenshuai.xi hcd->pdev = (struct pci_dev *)(1111); //Fake PCI device
9683*53ee8cc1Swenshuai.xi hcd->self.controller = &dev->dev;
9684*53ee8cc1Swenshuai.xi hcd->controller = hcd->self.controller;
9685*53ee8cc1Swenshuai.xi
9686*53ee8cc1Swenshuai.xi retval = hcd_buffer_create (hcd);
9687*53ee8cc1Swenshuai.xi if (retval != 0) {
9688*53ee8cc1Swenshuai.xi dbg ("pool alloc fail%s","\n");
9689*53ee8cc1Swenshuai.xi goto ex_err1;
9690*53ee8cc1Swenshuai.xi }
9691*53ee8cc1Swenshuai.xi
9692*53ee8cc1Swenshuai.xi /* till now HC has been in an indeterminate state ... */
9693*53ee8cc1Swenshuai.xi if (driver->reset && (retval = driver->reset (hcd)) < 0) {
9694*53ee8cc1Swenshuai.xi dev_err (hcd->controller, "can't reset%s","\n");
9695*53ee8cc1Swenshuai.xi goto ex_err2;
9696*53ee8cc1Swenshuai.xi }
9697*53ee8cc1Swenshuai.xi
9698*53ee8cc1Swenshuai.xi usb_info ("%s (CPE_AMBA) at 0x%p, irq %d\n",
9699*53ee8cc1Swenshuai.xi hcd->description, hcd->regs, hcd->irq);
9700*53ee8cc1Swenshuai.xi usb_bus_init (&hcd->self);
9701*53ee8cc1Swenshuai.xi hcd->self.op = &usb_hcd_operations;
9702*53ee8cc1Swenshuai.xi hcd->self.hcpriv = (void *) hcd;
9703*53ee8cc1Swenshuai.xi
9704*53ee8cc1Swenshuai.xi //hcd->self.bus_name = "cpe_ehci";
9705*53ee8cc1Swenshuai.xi //hcd->product_desc = "CPE_AMBA EHCI";
9706*53ee8cc1Swenshuai.xi //memcpy(hcd->product_desc, "CPE_AMBA EHCI", sizeof(hcd->product_desc));
9707*53ee8cc1Swenshuai.xi hcd->self.bus_name = p_rootHub->bus_name;
9708*53ee8cc1Swenshuai.xi memcpy(hcd->product_desc, p_rootHub->product_desc, sizeof(p_rootHub->product_desc));
9709*53ee8cc1Swenshuai.xi
9710*53ee8cc1Swenshuai.xi hcd->pre_sts = 0; // new
9711*53ee8cc1Swenshuai.xi hcd->pre_temp = 0; // new
9712*53ee8cc1Swenshuai.xi hcd->pgVar = p_rootHub; // new
9713*53ee8cc1Swenshuai.xi init_OS_Resource_EX(&hcd->USBWaitFlg);
9714*53ee8cc1Swenshuai.xi INIT_LIST_HEAD (&hcd->dev_list);
9715*53ee8cc1Swenshuai.xi usb_register_bus (&hcd->self);
9716*53ee8cc1Swenshuai.xi
9717*53ee8cc1Swenshuai.xi if ((retval = driver->start (hcd)) < 0) // start HCD
9718*53ee8cc1Swenshuai.xi {
9719*53ee8cc1Swenshuai.xi usb_hcd_cpe_ehci_remove(hcd, dev);
9720*53ee8cc1Swenshuai.xi return retval;
9721*53ee8cc1Swenshuai.xi }
9722*53ee8cc1Swenshuai.xi
9723*53ee8cc1Swenshuai.xi *hcd_out = hcd;
9724*53ee8cc1Swenshuai.xi
9725*53ee8cc1Swenshuai.xi return retval;
9726*53ee8cc1Swenshuai.xi
9727*53ee8cc1Swenshuai.xi ex_err2:
9728*53ee8cc1Swenshuai.xi hcd_buffer_destroy (hcd);
9729*53ee8cc1Swenshuai.xi if (hcd)
9730*53ee8cc1Swenshuai.xi driver->hcd_free(hcd);
9731*53ee8cc1Swenshuai.xi ex_err1:
9732*53ee8cc1Swenshuai.xi cpe_ehci_stop_hc(dev);
9733*53ee8cc1Swenshuai.xi //release_mem_region(dev->res.start, dev->res.end - dev->res.start + 1);
9734*53ee8cc1Swenshuai.xi return retval;
9735*53ee8cc1Swenshuai.xi }
9736*53ee8cc1Swenshuai.xi
cpe_ehci_hcd_init_EX(struct hc_driver * driver)9737*53ee8cc1Swenshuai.xi static void cpe_ehci_hcd_init_EX(struct hc_driver *driver)
9738*53ee8cc1Swenshuai.xi {
9739*53ee8cc1Swenshuai.xi memcpy( driver->description , "ehci_hcd", sizeof("ehci_hcd")+1);
9740*53ee8cc1Swenshuai.xi
9741*53ee8cc1Swenshuai.xi /*
9742*53ee8cc1Swenshuai.xi * generic hardware linkage
9743*53ee8cc1Swenshuai.xi */
9744*53ee8cc1Swenshuai.xi driver->irq = ehci_irq;
9745*53ee8cc1Swenshuai.xi driver->flags = HCD_MEMORY | HCD_USB2;
9746*53ee8cc1Swenshuai.xi
9747*53ee8cc1Swenshuai.xi /*
9748*53ee8cc1Swenshuai.xi * basic lifecycle operations
9749*53ee8cc1Swenshuai.xi */
9750*53ee8cc1Swenshuai.xi driver->reset = ehci_hc_reset;
9751*53ee8cc1Swenshuai.xi driver->start = ehci_start;
9752*53ee8cc1Swenshuai.xi driver->suspend = ehci_suspend;
9753*53ee8cc1Swenshuai.xi driver->resume = ehci_resume;
9754*53ee8cc1Swenshuai.xi driver->stop = ehci_stop;
9755*53ee8cc1Swenshuai.xi
9756*53ee8cc1Swenshuai.xi /*
9757*53ee8cc1Swenshuai.xi * memory lifecycle (except per-request)
9758*53ee8cc1Swenshuai.xi */
9759*53ee8cc1Swenshuai.xi driver->hcd_alloc = ehci_hcd_alloc;
9760*53ee8cc1Swenshuai.xi driver->hcd_free = ehci_hcd_free;
9761*53ee8cc1Swenshuai.xi
9762*53ee8cc1Swenshuai.xi /*
9763*53ee8cc1Swenshuai.xi * managing i/o requests and associated device resources
9764*53ee8cc1Swenshuai.xi */
9765*53ee8cc1Swenshuai.xi driver->urb_enqueue = ehci_urb_enqueue;
9766*53ee8cc1Swenshuai.xi driver->urb_dequeue = ehci_urb_dequeue;
9767*53ee8cc1Swenshuai.xi driver->endpoint_disable = ehci_endpoint_disable;
9768*53ee8cc1Swenshuai.xi
9769*53ee8cc1Swenshuai.xi /*
9770*53ee8cc1Swenshuai.xi * scheduling support
9771*53ee8cc1Swenshuai.xi */
9772*53ee8cc1Swenshuai.xi driver->get_frame_number = ehci_get_frame;
9773*53ee8cc1Swenshuai.xi
9774*53ee8cc1Swenshuai.xi /*
9775*53ee8cc1Swenshuai.xi * root hub support
9776*53ee8cc1Swenshuai.xi */
9777*53ee8cc1Swenshuai.xi driver->hub_status_data = ehci_hub_status_data;
9778*53ee8cc1Swenshuai.xi driver->hub_control = ehci_hub_control;
9779*53ee8cc1Swenshuai.xi }
9780*53ee8cc1Swenshuai.xi
9781*53ee8cc1Swenshuai.xi extern void InitUSBIntr_EX(struct usb_hcd * hcd);
ehci_hcd_cpe_ehci_drv_probe_EX(struct device_s * _dev)9782*53ee8cc1Swenshuai.xi static int ehci_hcd_cpe_ehci_drv_probe_EX(struct device_s *_dev)
9783*53ee8cc1Swenshuai.xi {
9784*53ee8cc1Swenshuai.xi struct cpe_dev *dev;
9785*53ee8cc1Swenshuai.xi struct usb_hcd *hcd = NULL;
9786*53ee8cc1Swenshuai.xi int ret;
9787*53ee8cc1Swenshuai.xi
9788*53ee8cc1Swenshuai.xi const struct device_s *__mptr = _dev;
9789*53ee8cc1Swenshuai.xi dev = (struct cpe_dev *)( (char *)__mptr - (char *)offsetof(struct cpe_dev,dev) );
9790*53ee8cc1Swenshuai.xi
9791*53ee8cc1Swenshuai.xi if (usb_disabled())
9792*53ee8cc1Swenshuai.xi return -ENODEV;
9793*53ee8cc1Swenshuai.xi
9794*53ee8cc1Swenshuai.xi cpe_ehci_hcd_init_EX(&ehci_cpe_hc_driver);
9795*53ee8cc1Swenshuai.xi ret = usb_hcd_cpe_ehci_probe_EX(&ehci_cpe_hc_driver, &hcd, dev);
9796*53ee8cc1Swenshuai.xi
9797*53ee8cc1Swenshuai.xi if (ret == 0)
9798*53ee8cc1Swenshuai.xi {
9799*53ee8cc1Swenshuai.xi diag_printf("ehci_hcd_cpe_ehci_drv_probe_EX -> allocate usb_hcd\n");
9800*53ee8cc1Swenshuai.xi dev->dev.driver_data = hcd;
9801*53ee8cc1Swenshuai.xi InitUSBIntr_EX(hcd);
9802*53ee8cc1Swenshuai.xi }
9803*53ee8cc1Swenshuai.xi
9804*53ee8cc1Swenshuai.xi return ret;
9805*53ee8cc1Swenshuai.xi }
9806*53ee8cc1Swenshuai.xi
9807*53ee8cc1Swenshuai.xi /*-------------------------------------------------------------------------*/
ehci_hcd_cpe_driver_init_EX(void)9808*53ee8cc1Swenshuai.xi int __init ehci_hcd_cpe_driver_init_EX(void)
9809*53ee8cc1Swenshuai.xi {
9810*53ee8cc1Swenshuai.xi static int init_once = 0;
9811*53ee8cc1Swenshuai.xi if (init_once)
9812*53ee8cc1Swenshuai.xi return 0;
9813*53ee8cc1Swenshuai.xi init_once = 1;
9814*53ee8cc1Swenshuai.xi pr_debug ("ehci_hcd: block sizes: qh %d qtd %d itd %d sitd %d\n",
9815*53ee8cc1Swenshuai.xi sizeof (struct ehci_qh), sizeof (struct ehci_qtd),
9816*53ee8cc1Swenshuai.xi sizeof (struct ehci_itd), sizeof (struct ehci_sitd));
9817*53ee8cc1Swenshuai.xi strncpy(ehci_hcd_cpe_driver.drv.name, "cpe_ehci_drv", sizeof("cpe_ehci_drv"));
9818*53ee8cc1Swenshuai.xi ehci_hcd_cpe_driver.drv.bus = &CPE_AMBA_bus_type_EX;
9819*53ee8cc1Swenshuai.xi ehci_hcd_cpe_driver.drv.probe = ehci_hcd_cpe_ehci_drv_probe_EX;
9820*53ee8cc1Swenshuai.xi ehci_hcd_cpe_driver.drv.remove = ehci_hcd_cpe_ehci_drv_remove;
9821*53ee8cc1Swenshuai.xi ehci_hcd_cpe_driver.drv.suspend = ehci_hcd_cpe_ehci_drv_suspend;
9822*53ee8cc1Swenshuai.xi ehci_hcd_cpe_driver.drv.resume = ehci_hcd_cpe_ehci_drv_resume;
9823*53ee8cc1Swenshuai.xi ehci_hcd_cpe_driver.devid = 0x1234;
9824*53ee8cc1Swenshuai.xi return driver_register(&ehci_hcd_cpe_driver.drv);
9825*53ee8cc1Swenshuai.xi }
9826*53ee8cc1Swenshuai.xi
ehci_cpe_dev_init_EX(struct cpe_dev * dev)9827*53ee8cc1Swenshuai.xi int __init ehci_cpe_dev_init_EX(struct cpe_dev * dev)
9828*53ee8cc1Swenshuai.xi {
9829*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort *p_rootHub = cpe_to_gVar(dev);
9830*53ee8cc1Swenshuai.xi
9831*53ee8cc1Swenshuai.xi // Cannot remove: Init list heads of device and driver lists of CPE EHCI device
9832*53ee8cc1Swenshuai.xi device_initialize(&dev->dev);
9833*53ee8cc1Swenshuai.xi #ifdef DEBUG
9834*53ee8cc1Swenshuai.xi //dbg (DRIVER_INFO " Init CPE EHCI Host Controller%s"," ");
9835*53ee8cc1Swenshuai.xi #endif
9836*53ee8cc1Swenshuai.xi // Init CPE EHCI device data structure
9837*53ee8cc1Swenshuai.xi dev->dev.parent = NULL; //parent should be CPE AMBA
9838*53ee8cc1Swenshuai.xi strncpy(dev->dev.name,p_rootHub->cpe_dev_info.devname, sizeof(p_rootHub->cpe_dev_info.devname));
9839*53ee8cc1Swenshuai.xi strncpy(dev->dev.bus_id,"AHB_EHCI", sizeof("AHB_EHCI"));
9840*53ee8cc1Swenshuai.xi dev->dev.bus = &CPE_AMBA_bus_type_EX;
9841*53ee8cc1Swenshuai.xi dev->devid = p_rootHub->cpe_dev_info.devid;
9842*53ee8cc1Swenshuai.xi dev->dma_mask = 0x00; //Unsupport DMA
9843*53ee8cc1Swenshuai.xi //register cpe_ehci devie to CPE AMBA bus
9844*53ee8cc1Swenshuai.xi device_add(&dev->dev);
9845*53ee8cc1Swenshuai.xi
9846*53ee8cc1Swenshuai.xi return ehci_hcd_cpe_driver_init_EX();
9847*53ee8cc1Swenshuai.xi }
9848*53ee8cc1Swenshuai.xi
9849*53ee8cc1Swenshuai.xi #if USB_IF_EHSET_SUPPORT // Embedded host electrical test procedure
9850*53ee8cc1Swenshuai.xi struct list_head *
qh_urb_transaction_EHSET(struct ehci_hcd * ehci,struct urb * urb,struct list_head * head,int flags,int stage)9851*53ee8cc1Swenshuai.xi qh_urb_transaction_EHSET (
9852*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci,
9853*53ee8cc1Swenshuai.xi struct urb *urb,
9854*53ee8cc1Swenshuai.xi struct list_head *head,
9855*53ee8cc1Swenshuai.xi int flags,
9856*53ee8cc1Swenshuai.xi int stage
9857*53ee8cc1Swenshuai.xi ) {
9858*53ee8cc1Swenshuai.xi struct ehci_qtd *qtd, *qtd_prev;
9859*53ee8cc1Swenshuai.xi dma_addr_t buf;
9860*53ee8cc1Swenshuai.xi int len, maxpacket;
9861*53ee8cc1Swenshuai.xi int is_input;
9862*53ee8cc1Swenshuai.xi U32 token;
9863*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9864*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9865*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9866*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9867*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9868*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9869*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9870*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9871*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9872*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9873*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9874*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9875*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9876*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9877*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9878*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9879*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9880*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9881*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9882*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9883*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9884*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9885*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9886*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9887*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9888*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9889*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9890*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9891*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9892*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9893*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9894*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9895*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9896*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9897*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9898*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9899*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9900*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9901*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9902*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9903*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9904*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9905*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9906*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9907*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9908*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9909*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9910*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9911*53ee8cc1Swenshuai.xi
9912*53ee8cc1Swenshuai.xi qtd = ehci_qtd_alloc (ehci, flags);
9913*53ee8cc1Swenshuai.xi if (unlikely (!qtd))
9914*53ee8cc1Swenshuai.xi return 0;
9915*53ee8cc1Swenshuai.xi list_add_tail (&qtd->qtd_list, head);
9916*53ee8cc1Swenshuai.xi qtd->urb = urb;
9917*53ee8cc1Swenshuai.xi
9918*53ee8cc1Swenshuai.xi token = QTD_STS_ACTIVE;
9919*53ee8cc1Swenshuai.xi token |= (EHCI_TUNE_CERR << 10);
9920*53ee8cc1Swenshuai.xi
9921*53ee8cc1Swenshuai.xi len = urb->transfer_buffer_length;
9922*53ee8cc1Swenshuai.xi is_input = usb_pipein (urb->pipe);
9923*53ee8cc1Swenshuai.xi if (!stage)
9924*53ee8cc1Swenshuai.xi {
9925*53ee8cc1Swenshuai.xi if (usb_pipecontrol (urb->pipe)) {
9926*53ee8cc1Swenshuai.xi qtd_fill (qtd, urb->setup_dma, sizeof (struct usb_ctrlrequest),
9927*53ee8cc1Swenshuai.xi token | (2 /* "setup" */ << 8), 8);
9928*53ee8cc1Swenshuai.xi qtd->hw_alt_next = EHCI_LIST_END; // EHSET
9929*53ee8cc1Swenshuai.xi
9930*53ee8cc1Swenshuai.xi token ^= QTD_TOGGLE;
9931*53ee8cc1Swenshuai.xi }
9932*53ee8cc1Swenshuai.xi
9933*53ee8cc1Swenshuai.xi if (likely (!(urb->transfer_flags & URB_NO_INTERRUPT)))
9934*53ee8cc1Swenshuai.xi qtd->hw_token |= CPUToLE32 (QTD_IOC); // EHSET
9935*53ee8cc1Swenshuai.xi return head;
9936*53ee8cc1Swenshuai.xi }
9937*53ee8cc1Swenshuai.xi else
9938*53ee8cc1Swenshuai.xi token ^= QTD_TOGGLE;
9939*53ee8cc1Swenshuai.xi
9940*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9941*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9942*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9943*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9944*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9945*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9946*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9947*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9948*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9949*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9950*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9951*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9952*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9953*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9954*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9955*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9956*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9957*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9958*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9959*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9960*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9961*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9962*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9963*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9964*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9965*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9966*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9967*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9968*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9969*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9970*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9971*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9972*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9973*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9974*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9975*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9976*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9977*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9978*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9979*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9980*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9981*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9982*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9983*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9984*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9985*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9986*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9987*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
9988*53ee8cc1Swenshuai.xi if (likely (len > 0))
9989*53ee8cc1Swenshuai.xi buf = urb->transfer_dma;
9990*53ee8cc1Swenshuai.xi else
9991*53ee8cc1Swenshuai.xi buf = 0;
9992*53ee8cc1Swenshuai.xi
9993*53ee8cc1Swenshuai.xi if (!buf || is_input)
9994*53ee8cc1Swenshuai.xi token |= (1 /* "in" */ << 8);
9995*53ee8cc1Swenshuai.xi if (usb_pipebulk(urb->pipe)) {
9996*53ee8cc1Swenshuai.xi switch (urb->dev->speed) {
9997*53ee8cc1Swenshuai.xi case USB_SPEED_FULL:
9998*53ee8cc1Swenshuai.xi maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
9999*53ee8cc1Swenshuai.xi break;
10000*53ee8cc1Swenshuai.xi case USB_SPEED_HIGH:
10001*53ee8cc1Swenshuai.xi default:
10002*53ee8cc1Swenshuai.xi maxpacket = 512;
10003*53ee8cc1Swenshuai.xi break;
10004*53ee8cc1Swenshuai.xi }
10005*53ee8cc1Swenshuai.xi }
10006*53ee8cc1Swenshuai.xi else {
10007*53ee8cc1Swenshuai.xi maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
10008*53ee8cc1Swenshuai.xi }
10009*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10010*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10011*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10012*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10013*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10014*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10015*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10016*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10017*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10018*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10019*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10020*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10021*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10022*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10023*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10024*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10025*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10026*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10027*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10028*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10029*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10030*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10031*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10032*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10033*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10034*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10035*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10036*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10037*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10038*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10039*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10040*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10041*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10042*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10043*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10044*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10045*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10046*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10047*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10048*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10049*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10050*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10051*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10052*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10053*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10054*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10055*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10056*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10057*53ee8cc1Swenshuai.xi
10058*53ee8cc1Swenshuai.xi for (;;) {
10059*53ee8cc1Swenshuai.xi int this_qtd_len;
10060*53ee8cc1Swenshuai.xi
10061*53ee8cc1Swenshuai.xi this_qtd_len = qtd_fill (qtd, buf, len, token, maxpacket);
10062*53ee8cc1Swenshuai.xi len -= this_qtd_len;
10063*53ee8cc1Swenshuai.xi buf += this_qtd_len;
10064*53ee8cc1Swenshuai.xi if (is_input)
10065*53ee8cc1Swenshuai.xi qtd->hw_alt_next = ehci->async->hw_alt_next;
10066*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10067*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10068*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10069*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10070*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10071*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10072*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10073*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10074*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10075*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10076*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10077*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10078*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10079*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10080*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10081*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10082*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10083*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10084*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10085*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10086*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10087*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10088*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10089*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10090*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10091*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10092*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10093*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10094*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10095*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10096*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10097*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10098*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10099*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10100*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10101*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10102*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10103*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10104*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10105*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10106*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10107*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10108*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10109*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10110*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10111*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10112*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10113*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10114*53ee8cc1Swenshuai.xi
10115*53ee8cc1Swenshuai.xi if ((maxpacket & (this_qtd_len + (maxpacket - 1))) == 0)
10116*53ee8cc1Swenshuai.xi token ^= QTD_TOGGLE;
10117*53ee8cc1Swenshuai.xi
10118*53ee8cc1Swenshuai.xi if (likely (len <= 0))
10119*53ee8cc1Swenshuai.xi break;
10120*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10121*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10122*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10123*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10124*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10125*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10126*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10127*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10128*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10129*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10130*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10131*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10132*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10133*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10134*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10135*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10136*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10137*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10138*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10139*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10140*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10141*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10142*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10143*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10144*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10145*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10146*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10147*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10148*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10149*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10150*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10151*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10152*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10153*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10154*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10155*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10156*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10157*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10158*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10159*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10160*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10161*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10162*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10163*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10164*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10165*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10166*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10167*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10168*53ee8cc1Swenshuai.xi
10169*53ee8cc1Swenshuai.xi qtd_prev = qtd;
10170*53ee8cc1Swenshuai.xi qtd = ehci_qtd_alloc (ehci, flags);
10171*53ee8cc1Swenshuai.xi if (unlikely (!qtd))
10172*53ee8cc1Swenshuai.xi goto cleanup;
10173*53ee8cc1Swenshuai.xi qtd->urb = urb;
10174*53ee8cc1Swenshuai.xi qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);
10175*53ee8cc1Swenshuai.xi list_add_tail (&qtd->qtd_list, head);
10176*53ee8cc1Swenshuai.xi }
10177*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10178*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10179*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10180*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10181*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10182*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10183*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10184*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10185*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10186*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10187*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10188*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10189*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10190*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10191*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10192*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10193*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10194*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10195*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10196*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10197*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10198*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10199*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10200*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10201*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10202*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10203*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10204*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10205*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10206*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10207*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10208*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10209*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10210*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10211*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10212*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10213*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10214*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10215*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10216*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10217*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10218*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10219*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10220*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10221*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10222*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10223*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10224*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10225*53ee8cc1Swenshuai.xi
10226*53ee8cc1Swenshuai.xi if (likely ((urb->transfer_flags & URB_SHORT_NOT_OK) == 0
10227*53ee8cc1Swenshuai.xi || usb_pipecontrol (urb->pipe)))
10228*53ee8cc1Swenshuai.xi qtd->hw_alt_next = EHCI_LIST_END;
10229*53ee8cc1Swenshuai.xi
10230*53ee8cc1Swenshuai.xi if (likely (buf != 0)) {
10231*53ee8cc1Swenshuai.xi int one_more = 0;
10232*53ee8cc1Swenshuai.xi
10233*53ee8cc1Swenshuai.xi if (usb_pipecontrol (urb->pipe)) {
10234*53ee8cc1Swenshuai.xi one_more = 1;
10235*53ee8cc1Swenshuai.xi token ^= 0x0100; /* "in" <--> "out" */
10236*53ee8cc1Swenshuai.xi token |= QTD_TOGGLE; /* force DATA1 */
10237*53ee8cc1Swenshuai.xi } else if (usb_pipebulk (urb->pipe)
10238*53ee8cc1Swenshuai.xi && (urb->transfer_flags & URB_ZERO_PACKET)
10239*53ee8cc1Swenshuai.xi && !(urb->transfer_buffer_length % maxpacket)) {
10240*53ee8cc1Swenshuai.xi one_more = 1;
10241*53ee8cc1Swenshuai.xi }
10242*53ee8cc1Swenshuai.xi if (one_more) {
10243*53ee8cc1Swenshuai.xi qtd_prev = qtd;
10244*53ee8cc1Swenshuai.xi qtd = ehci_qtd_alloc (ehci, flags);
10245*53ee8cc1Swenshuai.xi if (unlikely (!qtd))
10246*53ee8cc1Swenshuai.xi goto cleanup;
10247*53ee8cc1Swenshuai.xi qtd->urb = urb;
10248*53ee8cc1Swenshuai.xi qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);
10249*53ee8cc1Swenshuai.xi list_add_tail (&qtd->qtd_list, head);
10250*53ee8cc1Swenshuai.xi
10251*53ee8cc1Swenshuai.xi qtd_fill (qtd, 0, 0, token, 0);
10252*53ee8cc1Swenshuai.xi }
10253*53ee8cc1Swenshuai.xi }
10254*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10255*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10256*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10257*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10258*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10259*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10260*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10261*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10262*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10263*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10264*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10265*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10266*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10267*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10268*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10269*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10270*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10271*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10272*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10273*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10274*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10275*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10276*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10277*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10278*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10279*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10280*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10281*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10282*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10283*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10284*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10285*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10286*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10287*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10288*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10289*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10290*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10291*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10292*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10293*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10294*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10295*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10296*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10297*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10298*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10299*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10300*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10301*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
10302*53ee8cc1Swenshuai.xi
10303*53ee8cc1Swenshuai.xi if (likely (!(urb->transfer_flags & URB_NO_INTERRUPT)))
10304*53ee8cc1Swenshuai.xi qtd->hw_token |= CPUToLE32 (QTD_IOC);
10305*53ee8cc1Swenshuai.xi
10306*53ee8cc1Swenshuai.xi return head;
10307*53ee8cc1Swenshuai.xi
10308*53ee8cc1Swenshuai.xi cleanup:
10309*53ee8cc1Swenshuai.xi
10310*53ee8cc1Swenshuai.xi qtd_list_free (ehci, urb, head);
10311*53ee8cc1Swenshuai.xi return 0;
10312*53ee8cc1Swenshuai.xi }
10313*53ee8cc1Swenshuai.xi
submit_async_EHSET(struct ehci_hcd * ehci,struct urb * urb,struct list_head * qtd_list,int mem_flags)10314*53ee8cc1Swenshuai.xi inline int submit_async_EHSET (
10315*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci,
10316*53ee8cc1Swenshuai.xi struct urb *urb,
10317*53ee8cc1Swenshuai.xi struct list_head *qtd_list,
10318*53ee8cc1Swenshuai.xi int mem_flags
10319*53ee8cc1Swenshuai.xi ) {
10320*53ee8cc1Swenshuai.xi return submit_async(ehci, urb, qtd_list, mem_flags);
10321*53ee8cc1Swenshuai.xi }
10322*53ee8cc1Swenshuai.xi #endif
10323