xref: /utopia/UTPA2-700.0.x/modules/usb/drv/usb_ecos/usbhost/drvUSBEntry_2.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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 #include "include/drvConfig.h"
79*53ee8cc1Swenshuai.xi #include "include/drvPorts.h"
80*53ee8cc1Swenshuai.xi #include "include/drvKernel.h"
81*53ee8cc1Swenshuai.xi #include "include/drvTimer.h"
82*53ee8cc1Swenshuai.xi #include "include/drvUSBMsg.h"
83*53ee8cc1Swenshuai.xi 
84*53ee8cc1Swenshuai.xi #include "drvHCD.h"
85*53ee8cc1Swenshuai.xi #include "drvMassStor.h"
86*53ee8cc1Swenshuai.xi #include "include/drvCPE_EHCI.h"
87*53ee8cc1Swenshuai.xi #include "MsCommon.h"
88*53ee8cc1Swenshuai.xi #include "drvUSB.h"
89*53ee8cc1Swenshuai.xi #include "include/drvIO.h"
90*53ee8cc1Swenshuai.xi #include "drvUSBHwCtl.h"
91*53ee8cc1Swenshuai.xi #include "include/drvCPE_AMBA.h"
92*53ee8cc1Swenshuai.xi #include "drvSCSI.h"
93*53ee8cc1Swenshuai.xi #include "drvEHCI.h"
94*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
95*53ee8cc1Swenshuai.xi #include "drvHIDDev.h"
96*53ee8cc1Swenshuai.xi #endif
97*53ee8cc1Swenshuai.xi 
98*53ee8cc1Swenshuai.xi #define USBENT_DEBUG
99*53ee8cc1Swenshuai.xi #ifdef USBENT_DEBUG
100*53ee8cc1Swenshuai.xi #define USBENT_Dbg		diag_printf
101*53ee8cc1Swenshuai.xi #else
102*53ee8cc1Swenshuai.xi #define USBENT_Dbg(x,...)
103*53ee8cc1Swenshuai.xi #endif
104*53ee8cc1Swenshuai.xi 
105*53ee8cc1Swenshuai.xi #define USBENT_ERR		diag_printf
106*53ee8cc1Swenshuai.xi 
107*53ee8cc1Swenshuai.xi MS_BOOL UsbReady_Port2 = FALSE;
108*53ee8cc1Swenshuai.xi 
109*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
110*53ee8cc1Swenshuai.xi /*static*/ MS_U8 u8HubStackBuffer_Port2[HUB_STACK_SIZE];
111*53ee8cc1Swenshuai.xi #endif
112*53ee8cc1Swenshuai.xi 
113*53ee8cc1Swenshuai.xi extern struct usb_hcd *g_pUsbHcd_Port2;
114*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
115*53ee8cc1Swenshuai.xi extern MS_U32  Invalid_HidDevs;
116*53ee8cc1Swenshuai.xi extern U8 Hid_Report_Desc[0x100];
117*53ee8cc1Swenshuai.xi extern void usb_hid_parse_report(
118*53ee8cc1Swenshuai.xi     U8 *start,
119*53ee8cc1Swenshuai.xi     U16 size,
120*53ee8cc1Swenshuai.xi     struct   button_struct *pButton,
121*53ee8cc1Swenshuai.xi     struct   axis_struct *pAxis,
122*53ee8cc1Swenshuai.xi     struct   key_struct *pKeys);
123*53ee8cc1Swenshuai.xi #endif
124*53ee8cc1Swenshuai.xi extern struct cpe_dev cpe_ehci_dev_Port2;
125*53ee8cc1Swenshuai.xi 
126*53ee8cc1Swenshuai.xi extern void USBCriticalSectionIn(MS_U8 Port);
127*53ee8cc1Swenshuai.xi extern void USBCriticalSectionOut(MS_U8 Port);
128*53ee8cc1Swenshuai.xi 
129*53ee8cc1Swenshuai.xi extern void hub_poll_Port2(void);
130*53ee8cc1Swenshuai.xi extern BOOL has_hub_events_Port2(U16 *pPortStatus);
131*53ee8cc1Swenshuai.xi extern int PortReset(unsigned int regUTMI, unsigned int regUHC);
132*53ee8cc1Swenshuai.xi 
133*53ee8cc1Swenshuai.xi extern S32 _s32MutexUSB_Port2;
134*53ee8cc1Swenshuai.xi 
135*53ee8cc1Swenshuai.xi extern MS_BOOL MDrv_UsbDeviceConnect_EX(struct usb_hcd *hcd);
136*53ee8cc1Swenshuai.xi extern void ResetMstarUsb(struct ehci_hcd *ehci);  // replace void ResetUsbHardware_Port2(void) and moved to drvUSBHwCtl.c
MDrv_UsbDeviceConnect_Port2(struct usb_hcd * hcd)137*53ee8cc1Swenshuai.xi MS_BOOL MDrv_UsbDeviceConnect_Port2(struct usb_hcd *hcd)
138*53ee8cc1Swenshuai.xi {
139*53ee8cc1Swenshuai.xi     if (MDrv_UsbDeviceConnect_EX(hcd))
140*53ee8cc1Swenshuai.xi         return TRUE;
141*53ee8cc1Swenshuai.xi     else
142*53ee8cc1Swenshuai.xi         return(UsbReady_Port2 = FALSE);
143*53ee8cc1Swenshuai.xi }
144*53ee8cc1Swenshuai.xi 
145*53ee8cc1Swenshuai.xi extern struct s_ChipUsbHostDef *pCurrentChip;
146*53ee8cc1Swenshuai.xi extern USBCallback _DrvUSBC_CBFun;
147*53ee8cc1Swenshuai.xi extern BOOL usb_get_connected_dev_state(int *pdevstate, unsigned char *pDevClass, struct usb_hcd *hcd);
UsbTask_Port2(MS_U32 argc,VOID * argv)148*53ee8cc1Swenshuai.xi void  UsbTask_Port2(MS_U32 argc, VOID *argv)
149*53ee8cc1Swenshuai.xi {
150*53ee8cc1Swenshuai.xi     MS_U16	    PortStatus;
151*53ee8cc1Swenshuai.xi     MS_BOOL     isExtHubConnect, isFirstEvent, isConnect;
152*53ee8cc1Swenshuai.xi     int		    DevState;
153*53ee8cc1Swenshuai.xi     MS_U8       DevClass, ii, kk;
154*53ee8cc1Swenshuai.xi     MS_U8       LunSts[MAX_USB_STOR_LUNS];
155*53ee8cc1Swenshuai.xi     MS_U8       LunPreSts[MAX_USB_STOR_LUNS];
156*53ee8cc1Swenshuai.xi     MS_BOOL     isMSCPlugIn;
157*53ee8cc1Swenshuai.xi     #if USB_HID_SUPPORT
158*53ee8cc1Swenshuai.xi     MS_U8       jj;
159*53ee8cc1Swenshuai.xi     MS_BOOL     isHIDPlugIn, isHIDPlugIntoSamePort;
160*53ee8cc1Swenshuai.xi     MS_U8       isHIDPlugIn_IntfCnt;
161*53ee8cc1Swenshuai.xi     #endif
162*53ee8cc1Swenshuai.xi     MS_U8       us_id;
163*53ee8cc1Swenshuai.xi     struct ehci_hcd *ehci = hcd_to_ehci(g_pUsbHcd_Port2);
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi     diag_printf("UsbTask 2...\n");
166*53ee8cc1Swenshuai.xi     while (1)
167*53ee8cc1Swenshuai.xi     {
168*53ee8cc1Swenshuai.xi         //UsbReady_Port2=FALSE; //move to MDrv_UsbDeviceConnect_Port2
169*53ee8cc1Swenshuai.xi         isExtHubConnect = FALSE;
170*53ee8cc1Swenshuai.xi         isMSCPlugIn = FALSE;
171*53ee8cc1Swenshuai.xi         #if USB_HID_SUPPORT
172*53ee8cc1Swenshuai.xi         isHIDPlugIn = FALSE;
173*53ee8cc1Swenshuai.xi         #endif
174*53ee8cc1Swenshuai.xi 
175*53ee8cc1Swenshuai.xi         // Waiting for USB port connection
176*53ee8cc1Swenshuai.xi         while(1)
177*53ee8cc1Swenshuai.xi         {
178*53ee8cc1Swenshuai.xi             USBCriticalSectionIn(2);
179*53ee8cc1Swenshuai.xi             isConnect = MDrv_UsbDeviceConnect_Port2(g_pUsbHcd_Port2);
180*53ee8cc1Swenshuai.xi             USBCriticalSectionOut(2);
181*53ee8cc1Swenshuai.xi 
182*53ee8cc1Swenshuai.xi             #if USBC_IP_SUPPORT // USBC IP control
183*53ee8cc1Swenshuai.xi             {
184*53ee8cc1Swenshuai.xi                 U8 idx = 1;
185*53ee8cc1Swenshuai.xi 
186*53ee8cc1Swenshuai.xi                 if (pCurrentChip->chipID == CHIPID_URANUS4)
187*53ee8cc1Swenshuai.xi                     idx = 2;
188*53ee8cc1Swenshuai.xi                 if ((pCurrentChip->usbc_ip[idx].portNum == idx) && (pCurrentChip->usbc_ip[idx].eventFlag))
189*53ee8cc1Swenshuai.xi                             if (_DrvUSBC_CBFun)
190*53ee8cc1Swenshuai.xi                             {
191*53ee8cc1Swenshuai.xi                                 if (pCurrentChip->usbc_ip[idx].eventType)
192*53ee8cc1Swenshuai.xi                                     _DrvUSBC_CBFun(USBC_NON_OVER_CURRENT, idx, NULL);
193*53ee8cc1Swenshuai.xi                                 else
194*53ee8cc1Swenshuai.xi                                     _DrvUSBC_CBFun(USBC_OVER_CURRENT, idx, NULL);
195*53ee8cc1Swenshuai.xi                                 pCurrentChip->usbc_ip[idx].eventFlag = 0;
196*53ee8cc1Swenshuai.xi                             }
197*53ee8cc1Swenshuai.xi             }
198*53ee8cc1Swenshuai.xi             #endif
199*53ee8cc1Swenshuai.xi             if(isConnect)
200*53ee8cc1Swenshuai.xi                 break;
201*53ee8cc1Swenshuai.xi             MsOS_DelayTask(100);
202*53ee8cc1Swenshuai.xi         }
203*53ee8cc1Swenshuai.xi 
204*53ee8cc1Swenshuai.xi         //MsOS_DelayTask(1000);
205*53ee8cc1Swenshuai.xi         //diag_printf("USB Port 2 is connect\n");
206*53ee8cc1Swenshuai.xi 
207*53ee8cc1Swenshuai.xi         while (1)
208*53ee8cc1Swenshuai.xi         {
209*53ee8cc1Swenshuai.xi             if (g_pUsbHcd_Port2->isBadDevice)
210*53ee8cc1Swenshuai.xi             {
211*53ee8cc1Swenshuai.xi                 diag_printf("A bad device found on port 2\n");
212*53ee8cc1Swenshuai.xi                 break;
213*53ee8cc1Swenshuai.xi             }
214*53ee8cc1Swenshuai.xi 
215*53ee8cc1Swenshuai.xi             kk = 0;
216*53ee8cc1Swenshuai.xi             while(kk<HUB_DEBOUNCE_STABLE)
217*53ee8cc1Swenshuai.xi             {
218*53ee8cc1Swenshuai.xi                 USBCriticalSectionIn(2);
219*53ee8cc1Swenshuai.xi                 isConnect = MDrv_UsbDeviceConnect_Port2(g_pUsbHcd_Port2);
220*53ee8cc1Swenshuai.xi                 USBCriticalSectionOut(2);
221*53ee8cc1Swenshuai.xi                 if ( !isConnect )
222*53ee8cc1Swenshuai.xi                 {
223*53ee8cc1Swenshuai.xi                     MsOS_DelayTask(600);  //By Jonas! for hub event!
224*53ee8cc1Swenshuai.xi                     diag_printf("USB port 2 disconnect\n");
225*53ee8cc1Swenshuai.xi                     //if (isExtHubConnect)
226*53ee8cc1Swenshuai.xi                         hub_poll_Port2(); //for disconnect hub event
227*53ee8cc1Swenshuai.xi                     goto PORT_DISCONNECT;
228*53ee8cc1Swenshuai.xi                 }
229*53ee8cc1Swenshuai.xi                 kk++;
230*53ee8cc1Swenshuai.xi                 MsOS_DelayTask(HUB_DEBOUNCE_STEP);
231*53ee8cc1Swenshuai.xi             }
232*53ee8cc1Swenshuai.xi #if 0
233*53ee8cc1Swenshuai.xi             if (!MDrv_UsbDeviceConnect_Port2())
234*53ee8cc1Swenshuai.xi             {
235*53ee8cc1Swenshuai.xi                 hub_poll_Port2(); //for disconnect hub event
236*53ee8cc1Swenshuai.xi                 break;
237*53ee8cc1Swenshuai.xi             }
238*53ee8cc1Swenshuai.xi #endif
239*53ee8cc1Swenshuai.xi 
240*53ee8cc1Swenshuai.xi             // Device is connecting to the port
241*53ee8cc1Swenshuai.xi             isFirstEvent = FALSE;
242*53ee8cc1Swenshuai.xi             if (has_hub_events_Port2(&PortStatus))
243*53ee8cc1Swenshuai.xi             {
244*53ee8cc1Swenshuai.xi                 //diag_printf("hub event 2\n");
245*53ee8cc1Swenshuai.xi                 isFirstEvent = TRUE;
246*53ee8cc1Swenshuai.xi                 hub_poll_Port2();
247*53ee8cc1Swenshuai.xi 
248*53ee8cc1Swenshuai.xi #if 0
249*53ee8cc1Swenshuai.xi                 if ( PortStatus & USB_PORT_STAT_CONNECTION )
250*53ee8cc1Swenshuai.xi                 {
251*53ee8cc1Swenshuai.xi                     usb_get_connected_dev_state(&DevState, &DevClass);
252*53ee8cc1Swenshuai.xi 
253*53ee8cc1Swenshuai.xi                     if (DevClass == 9)
254*53ee8cc1Swenshuai.xi                     {
255*53ee8cc1Swenshuai.xi                         diag_printf("External Hub is connected\n");
256*53ee8cc1Swenshuai.xi                         isExtHubConnect = TRUE;
257*53ee8cc1Swenshuai.xi                     }
258*53ee8cc1Swenshuai.xi                 }
259*53ee8cc1Swenshuai.xi #endif
260*53ee8cc1Swenshuai.xi             }
261*53ee8cc1Swenshuai.xi 
262*53ee8cc1Swenshuai.xi             if (isExtHubConnect)
263*53ee8cc1Swenshuai.xi                 hub_poll_Port2();
264*53ee8cc1Swenshuai.xi 
265*53ee8cc1Swenshuai.xi             isMSCPlugIn = FALSE;
266*53ee8cc1Swenshuai.xi             for (us_id=2*MAX_USTOR; us_id<3*MAX_USTOR; us_id++)
267*53ee8cc1Swenshuai.xi             {
268*53ee8cc1Swenshuai.xi                 if (Is_Stor_Dev_Info_Valid(us_id))   // Check if we found a Mass Stoarge device.
269*53ee8cc1Swenshuai.xi                 {
270*53ee8cc1Swenshuai.xi                     isMSCPlugIn = TRUE;
271*53ee8cc1Swenshuai.xi                     if (!Is_Stor_Dev_Init(us_id))    // First time after connected
272*53ee8cc1Swenshuai.xi                     {
273*53ee8cc1Swenshuai.xi                         diag_printf("found a Mass Storage device 2, try to init it\n");
274*53ee8cc1Swenshuai.xi 
275*53ee8cc1Swenshuai.xi                         if (bInit_USB_Disk(us_id))
276*53ee8cc1Swenshuai.xi                         {
277*53ee8cc1Swenshuai.xi                             for (ii=0; ii<=Get_Stor_Max_Lun(us_id); ii++)
278*53ee8cc1Swenshuai.xi                             {
279*53ee8cc1Swenshuai.xi                                 LunSts[ii] = LunPreSts[ii] = bIsDevValid(us_id, ii);
280*53ee8cc1Swenshuai.xi                                 if (LunSts[ii])
281*53ee8cc1Swenshuai.xi                                 {
282*53ee8cc1Swenshuai.xi                                     diag_printf("LUN %d is init ok\n", ii);
283*53ee8cc1Swenshuai.xi                                 }
284*53ee8cc1Swenshuai.xi                             }
285*53ee8cc1Swenshuai.xi                             Set_Stor_Dev_Init(us_id, TRUE);
286*53ee8cc1Swenshuai.xi                             diag_printf("MSC plug in\n");
287*53ee8cc1Swenshuai.xi                         }
288*53ee8cc1Swenshuai.xi                     }
289*53ee8cc1Swenshuai.xi                     else
290*53ee8cc1Swenshuai.xi                     {
291*53ee8cc1Swenshuai.xi                         vChk_USB_LUNs(us_id);
292*53ee8cc1Swenshuai.xi 
293*53ee8cc1Swenshuai.xi                         for (ii=0; ii<=Get_Stor_Max_Lun(us_id); ii++)
294*53ee8cc1Swenshuai.xi                         {
295*53ee8cc1Swenshuai.xi                             LunSts[ii] = bIsDevValid(us_id, ii);
296*53ee8cc1Swenshuai.xi                             if ( LunSts[ii] && (LunSts[ii] != LunPreSts[ii]) )
297*53ee8cc1Swenshuai.xi                             {
298*53ee8cc1Swenshuai.xi                                 diag_printf("Chk LUN %d is init ok\n", ii);
299*53ee8cc1Swenshuai.xi                             }
300*53ee8cc1Swenshuai.xi                             LunPreSts[ii] = LunSts[ii];
301*53ee8cc1Swenshuai.xi                         }
302*53ee8cc1Swenshuai.xi                     }
303*53ee8cc1Swenshuai.xi                 }
304*53ee8cc1Swenshuai.xi                 else
305*53ee8cc1Swenshuai.xi                 {
306*53ee8cc1Swenshuai.xi                     #if 0
307*53ee8cc1Swenshuai.xi                     if (isMSCPlugIn)
308*53ee8cc1Swenshuai.xi                     {
309*53ee8cc1Swenshuai.xi                         diag_printf("MSC plug out\n");
310*53ee8cc1Swenshuai.xi                         isMSCPlugIn = FALSE;
311*53ee8cc1Swenshuai.xi                         if ( _DrvUSB_CBFun != NULL )
312*53ee8cc1Swenshuai.xi                             _DrvUSB_CBFun(USB_PLUG_OUT, USB_EVENT_DEV_TYPE_STOR);
313*53ee8cc1Swenshuai.xi                     }
314*53ee8cc1Swenshuai.xi                     #endif
315*53ee8cc1Swenshuai.xi                 }
316*53ee8cc1Swenshuai.xi 
317*53ee8cc1Swenshuai.xi             }
318*53ee8cc1Swenshuai.xi 
319*53ee8cc1Swenshuai.xi 
320*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
321*53ee8cc1Swenshuai.xi             if (Is_Any_Hid_Dev_Info_Valid_EX())
322*53ee8cc1Swenshuai.xi             {
323*53ee8cc1Swenshuai.xi                 for (ii=0; ii<MAX_HID_DEV_COUNT; ii++)	//find the port index
324*53ee8cc1Swenshuai.xi                 {
325*53ee8cc1Swenshuai.xi                     isHIDPlugIntoSamePort = FALSE;		//a bool value to indicate that the interface enumeration below is for the same port
326*53ee8cc1Swenshuai.xi 		            isHIDPlugIn_IntfCnt = 0;
327*53ee8cc1Swenshuai.xi                     for (jj=0; jj<MAX_HID_INTF_COUNT; jj++)	//find the interface index
328*53ee8cc1Swenshuai.xi                     {
329*53ee8cc1Swenshuai.xi                         if(isHIDPlugIntoSamePort==FALSE)
330*53ee8cc1Swenshuai.xi 			                isHIDPlugIntoSamePort = TRUE;	//for multiple interfaces, using same port
331*53ee8cc1Swenshuai.xi 
332*53ee8cc1Swenshuai.xi                         if ( Is_Hid_Dev_Info_Valid_EX(ii,jj) &&
333*53ee8cc1Swenshuai.xi 				  (HID_us[ii][jj]->pusb_dev->bus->hcpriv == cpe_ehci_dev_Port2.dev.driver_data) )
334*53ee8cc1Swenshuai.xi                         {
335*53ee8cc1Swenshuai.xi                             if (!Is_Hid_Dev_Init_EX(ii,jj))
336*53ee8cc1Swenshuai.xi                             {
337*53ee8cc1Swenshuai.xi 	                        if ((Invalid_HidDevs & ((1 << jj)<<(ii*MAX_HID_INTF_COUNT))) != 0)
338*53ee8cc1Swenshuai.xi                                 {
339*53ee8cc1Swenshuai.xi 			            continue;;
340*53ee8cc1Swenshuai.xi 				}
341*53ee8cc1Swenshuai.xi 
342*53ee8cc1Swenshuai.xi                                if (usb_get_report_descriptor_EX(ii, jj, Hid_Report_Desc, 0x65) == ENOERR)
343*53ee8cc1Swenshuai.xi                                 {
344*53ee8cc1Swenshuai.xi                    	    /* index 3 of id_Report_Desc is for Local Usage type: 1(Unknown), 2(Mouse),4(Joystick),6(Keyboard)
345*53ee8cc1Swenshuai.xi                    	    *  e.g. of Joystick: 5 1 9 "4" a1 1 85 ...
346*53ee8cc1Swenshuai.xi                    	    */
347*53ee8cc1Swenshuai.xi                    	    if(Hid_Report_Desc[3]==Usage_Unkown)
348*53ee8cc1Swenshuai.xi                                     {
349*53ee8cc1Swenshuai.xi        			        Invalid_HidDevs |= ((1 << jj)<<(ii * MAX_HID_INTF_COUNT));
350*53ee8cc1Swenshuai.xi                        		diag_printf("Invalid_HidDevs=%lx\n",Invalid_HidDevs);
351*53ee8cc1Swenshuai.xi                        		continue;
352*53ee8cc1Swenshuai.xi                                    }
353*53ee8cc1Swenshuai.xi 
354*53ee8cc1Swenshuai.xi                                     //hid_parse_report(Hid_Report_Desc, 0x65);
355*53ee8cc1Swenshuai.xi                                    usb_hid_parse_report(Hid_Report_Desc, 0x65, &HID_us[ii][jj]->buttons, HID_us[ii][jj]->axis, &HID_us[ii][jj]->keys);
356*53ee8cc1Swenshuai.xi                                     diag_printf("HID finished\n");
357*53ee8cc1Swenshuai.xi                                    Set_Hid_Dev_Init_EX(ii, jj, TRUE);
358*53ee8cc1Swenshuai.xi 
359*53ee8cc1Swenshuai.xi        			    #if 1  //RCC
360*53ee8cc1Swenshuai.xi        			        if ((isHIDPlugIn_IntfCnt < MAX_HID_INTF_COUNT)&& (isHIDPlugIntoSamePort == TRUE))
361*53ee8cc1Swenshuai.xi                                        {
362*53ee8cc1Swenshuai.xi                                            isHIDPlugIn = TRUE;
363*53ee8cc1Swenshuai.xi                                            isHIDPlugIn_IntfCnt++;
364*53ee8cc1Swenshuai.xi                                            diag_printf("HID plug into Port(%d) Intf(%d)\n", ii, jj);
365*53ee8cc1Swenshuai.xi                                            if ( _DrvUSB_CBFun != NULL )
366*53ee8cc1Swenshuai.xi                                                _DrvUSB_CBFun(USB_PLUG_IN, USB_EVENT_DEV_TYPE_HID, NULL);
367*53ee8cc1Swenshuai.xi                                        }
368*53ee8cc1Swenshuai.xi                    	    #else
369*53ee8cc1Swenshuai.xi                                         if (!isHIDPlugIn)
370*53ee8cc1Swenshuai.xi                                         {
371*53ee8cc1Swenshuai.xi                                             isHIDPlugIn = TRUE;
372*53ee8cc1Swenshuai.xi                                             diag_printf("HID plug in\n");
373*53ee8cc1Swenshuai.xi                                             if ( _DrvUSB_CBFun != NULL )
374*53ee8cc1Swenshuai.xi                                                 _DrvUSB_CBFun(USB_PLUG_IN, USB_EVENT_DEV_TYPE_HID, NULL);
375*53ee8cc1Swenshuai.xi                                         }
376*53ee8cc1Swenshuai.xi        			    #endif
377*53ee8cc1Swenshuai.xi                                 //usb_hid_get_int_ex(0, HID_us[0]->IntPipeBuf, 8);
378*53ee8cc1Swenshuai.xi                                 //MsOS_StartTimer(g_Hid_Timer_ID);
379*53ee8cc1Swenshuai.xi                                 }
380*53ee8cc1Swenshuai.xi                             }
381*53ee8cc1Swenshuai.xi                         }
382*53ee8cc1Swenshuai.xi                     }
383*53ee8cc1Swenshuai.xi                 }
384*53ee8cc1Swenshuai.xi             }
385*53ee8cc1Swenshuai.xi             else
386*53ee8cc1Swenshuai.xi             {
387*53ee8cc1Swenshuai.xi                 if (isHIDPlugIn)
388*53ee8cc1Swenshuai.xi                 {
389*53ee8cc1Swenshuai.xi                     diag_printf("HID plug out\n");
390*53ee8cc1Swenshuai.xi                     isHIDPlugIn = FALSE;
391*53ee8cc1Swenshuai.xi                     if ( _DrvUSB_CBFun != NULL )
392*53ee8cc1Swenshuai.xi                         _DrvUSB_CBFun(USB_PLUG_OUT, USB_EVENT_DEV_TYPE_HID, NULL);
393*53ee8cc1Swenshuai.xi                 }
394*53ee8cc1Swenshuai.xi             }
395*53ee8cc1Swenshuai.xi #endif
396*53ee8cc1Swenshuai.xi 
397*53ee8cc1Swenshuai.xi 
398*53ee8cc1Swenshuai.xi             if ( (isMSCPlugIn == FALSE)
399*53ee8cc1Swenshuai.xi                 #if USB_HID_SUPPORT
400*53ee8cc1Swenshuai.xi                     && !Is_Any_Hid_Dev_Info_Valid_EX()
401*53ee8cc1Swenshuai.xi                 #endif
402*53ee8cc1Swenshuai.xi                     && isFirstEvent )
403*53ee8cc1Swenshuai.xi             {
404*53ee8cc1Swenshuai.xi                 if ( PortStatus & USB_PORT_STAT_CONNECTION )
405*53ee8cc1Swenshuai.xi                 {
406*53ee8cc1Swenshuai.xi                     //if ( usb_get_connected_dev_state(&DevState, &DevClass) && (DevState < USB_STATE_CONFIGURED) )
407*53ee8cc1Swenshuai.xi                     if ( usb_get_connected_dev_state(&DevState, &DevClass, g_pUsbHcd_Port2) )
408*53ee8cc1Swenshuai.xi                     {
409*53ee8cc1Swenshuai.xi                         if (DevState < USB_STATE_CONFIGURED)
410*53ee8cc1Swenshuai.xi                         {
411*53ee8cc1Swenshuai.xi                             diag_printf("P2> Usb device no responding\n");
412*53ee8cc1Swenshuai.xi                         }
413*53ee8cc1Swenshuai.xi                         else
414*53ee8cc1Swenshuai.xi                         {
415*53ee8cc1Swenshuai.xi                             if (DevClass == 0x09)
416*53ee8cc1Swenshuai.xi                             {
417*53ee8cc1Swenshuai.xi                                 diag_printf("P2> External Hub is connected\n");
418*53ee8cc1Swenshuai.xi                                 isExtHubConnect = TRUE;
419*53ee8cc1Swenshuai.xi                             }
420*53ee8cc1Swenshuai.xi                             else
421*53ee8cc1Swenshuai.xi                             {
422*53ee8cc1Swenshuai.xi                                 diag_printf("P2> Usb device not supported\n");
423*53ee8cc1Swenshuai.xi                                 if ( _DrvUSB_CBFun != NULL )
424*53ee8cc1Swenshuai.xi                                     _DrvUSB_CBFun(USB_PLUG_IN, USB_EVENT_DEV_TYPE_UNKNOW, NULL);
425*53ee8cc1Swenshuai.xi                             }
426*53ee8cc1Swenshuai.xi                         }
427*53ee8cc1Swenshuai.xi                     }
428*53ee8cc1Swenshuai.xi                 }
429*53ee8cc1Swenshuai.xi 
430*53ee8cc1Swenshuai.xi             }
431*53ee8cc1Swenshuai.xi 
432*53ee8cc1Swenshuai.xi             #if USBC_IP_SUPPORT // USBC IP control
433*53ee8cc1Swenshuai.xi             {
434*53ee8cc1Swenshuai.xi                 U8 idx = 1;
435*53ee8cc1Swenshuai.xi 
436*53ee8cc1Swenshuai.xi                 if (pCurrentChip->chipID == CHIPID_URANUS4)
437*53ee8cc1Swenshuai.xi                     idx = 2;
438*53ee8cc1Swenshuai.xi                 if ((pCurrentChip->usbc_ip[idx].portNum == idx) && (pCurrentChip->usbc_ip[idx].eventFlag))
439*53ee8cc1Swenshuai.xi                         if ( PortStatus & USB_PORT_STAT_CONNECTION)
440*53ee8cc1Swenshuai.xi                             if (_DrvUSBC_CBFun)
441*53ee8cc1Swenshuai.xi                             {
442*53ee8cc1Swenshuai.xi                                 if (pCurrentChip->usbc_ip[idx].eventType)
443*53ee8cc1Swenshuai.xi                                     _DrvUSBC_CBFun(USBC_NON_OVER_CURRENT, idx, NULL);
444*53ee8cc1Swenshuai.xi                                 else
445*53ee8cc1Swenshuai.xi                                     _DrvUSBC_CBFun(USBC_OVER_CURRENT, idx, NULL);
446*53ee8cc1Swenshuai.xi                                 pCurrentChip->usbc_ip[idx].eventFlag = 0;
447*53ee8cc1Swenshuai.xi                             }
448*53ee8cc1Swenshuai.xi             }
449*53ee8cc1Swenshuai.xi             #endif
450*53ee8cc1Swenshuai.xi 
451*53ee8cc1Swenshuai.xi             //MsOS_DelayTask(1000);
452*53ee8cc1Swenshuai.xi         }
453*53ee8cc1Swenshuai.xi 
454*53ee8cc1Swenshuai.xi PORT_DISCONNECT:
455*53ee8cc1Swenshuai.xi         diag_printf("No device is connecting @ port 2\n");
456*53ee8cc1Swenshuai.xi         if (has_hub_events_Port2(&PortStatus))
457*53ee8cc1Swenshuai.xi         {
458*53ee8cc1Swenshuai.xi             diag_printf("Has hub event 2.. @ port disconnect\n");
459*53ee8cc1Swenshuai.xi             hub_poll_Port2();
460*53ee8cc1Swenshuai.xi         }
461*53ee8cc1Swenshuai.xi 
462*53ee8cc1Swenshuai.xi         #if USB_HID_SUPPORT
463*53ee8cc1Swenshuai.xi         for (ii=0; ii<MAX_HID_DEV_COUNT; ii++)
464*53ee8cc1Swenshuai.xi         {
465*53ee8cc1Swenshuai.xi             for (jj=0; jj<MAX_HID_INTF_COUNT; jj++)		//find the interface index
466*53ee8cc1Swenshuai.xi             {
467*53ee8cc1Swenshuai.xi                 if (Is_Hid_Dev_Info_Valid_EX(ii,jj))
468*53ee8cc1Swenshuai.xi                 {
469*53ee8cc1Swenshuai.xi                     if (HID_us[ii][jj]->pusb_dev->bus->hcpriv == cpe_ehci_dev_Port2.dev.driver_data)
470*53ee8cc1Swenshuai.xi                     {
471*53ee8cc1Swenshuai.xi                         diag_printf("Set HID Port(%d) Intf(%d) not init\n", ii, jj);
472*53ee8cc1Swenshuai.xi                         Set_Hid_Dev_Init_EX(ii, jj, FALSE);
473*53ee8cc1Swenshuai.xi                     }
474*53ee8cc1Swenshuai.xi                 }
475*53ee8cc1Swenshuai.xi             }
476*53ee8cc1Swenshuai.xi         }
477*53ee8cc1Swenshuai.xi         #endif
478*53ee8cc1Swenshuai.xi 
479*53ee8cc1Swenshuai.xi 
480*53ee8cc1Swenshuai.xi         #if 0
481*53ee8cc1Swenshuai.xi         if (isMSCPlugIn)
482*53ee8cc1Swenshuai.xi         {
483*53ee8cc1Swenshuai.xi             diag_printf("MSC plug out\n");
484*53ee8cc1Swenshuai.xi             if ( _DrvUSB_CBFun != NULL )
485*53ee8cc1Swenshuai.xi                 _DrvUSB_CBFun(USB_PLUG_OUT, USB_EVENT_DEV_TYPE_STOR);
486*53ee8cc1Swenshuai.xi         }
487*53ee8cc1Swenshuai.xi         #endif
488*53ee8cc1Swenshuai.xi 
489*53ee8cc1Swenshuai.xi         #if 0
490*53ee8cc1Swenshuai.xi         for (us_id=MAX_USTOR; us_id<MAX_USTOR*2; us_id++)
491*53ee8cc1Swenshuai.xi         {
492*53ee8cc1Swenshuai.xi             if (Is_Stor_Dev_Info_Valid(us_id))
493*53ee8cc1Swenshuai.xi             {
494*53ee8cc1Swenshuai.xi                 diag_printf("!!! Remove device:%d begin..", us_id);
495*53ee8cc1Swenshuai.xi                 vRemove_DISK_LUNs(us_id);
496*53ee8cc1Swenshuai.xi                 //Free memory
497*53ee8cc1Swenshuai.xi 	            dissociate_dev(Mass_stor_us[us_id]);
498*53ee8cc1Swenshuai.xi 	            usb_stor_release_resources(Mass_stor_us[us_id]);
499*53ee8cc1Swenshuai.xi                 Clr_Stor_Dev_Info(us_id);
500*53ee8cc1Swenshuai.xi                 diag_printf("OK\n");
501*53ee8cc1Swenshuai.xi             }
502*53ee8cc1Swenshuai.xi         }
503*53ee8cc1Swenshuai.xi         #endif
504*53ee8cc1Swenshuai.xi 
505*53ee8cc1Swenshuai.xi         #if USB_HID_SUPPORT
506*53ee8cc1Swenshuai.xi         if (isHIDPlugIn)
507*53ee8cc1Swenshuai.xi         {
508*53ee8cc1Swenshuai.xi             diag_printf("HID plug out\n");
509*53ee8cc1Swenshuai.xi             if ( _DrvUSB_CBFun != NULL )
510*53ee8cc1Swenshuai.xi                 _DrvUSB_CBFun(USB_PLUG_OUT, USB_EVENT_DEV_TYPE_HID, NULL);
511*53ee8cc1Swenshuai.xi         }
512*53ee8cc1Swenshuai.xi         #endif
513*53ee8cc1Swenshuai.xi         //if get any Hub device, enter Hub handler
514*53ee8cc1Swenshuai.xi 
515*53ee8cc1Swenshuai.xi         //if get any MSC device, enter MSC handler
516*53ee8cc1Swenshuai.xi 
517*53ee8cc1Swenshuai.xi         //device is disconnected
518*53ee8cc1Swenshuai.xi 
519*53ee8cc1Swenshuai.xi         USBCriticalSectionIn(2);
520*53ee8cc1Swenshuai.xi         ResetMstarUsb(ehci);
521*53ee8cc1Swenshuai.xi         USBCriticalSectionOut(2);
522*53ee8cc1Swenshuai.xi 
523*53ee8cc1Swenshuai.xi     }
524*53ee8cc1Swenshuai.xi }
525*53ee8cc1Swenshuai.xi 
USB_Start_Port2(void)526*53ee8cc1Swenshuai.xi void USB_Start_Port2(void)
527*53ee8cc1Swenshuai.xi {
528*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
529*53ee8cc1Swenshuai.xi     MS_U8 *HubStack;
530*53ee8cc1Swenshuai.xi     int pid;
531*53ee8cc1Swenshuai.xi #endif
532*53ee8cc1Swenshuai.xi 
533*53ee8cc1Swenshuai.xi     diag_printf("Usb 2 start..\n");
534*53ee8cc1Swenshuai.xi 
535*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
536*53ee8cc1Swenshuai.xi     HubStack = u8HubStackBuffer_Port2;
537*53ee8cc1Swenshuai.xi     _s32MutexUSB_Port2 = MsOS_CreateMutex(E_MSOS_FIFO, "USB_MUTEX_PORT2", MSOS_PROCESS_SHARED);
538*53ee8cc1Swenshuai.xi 
539*53ee8cc1Swenshuai.xi     if (_s32MutexUSB_Port2<0)
540*53ee8cc1Swenshuai.xi     {
541*53ee8cc1Swenshuai.xi         GEN_EXCEP;
542*53ee8cc1Swenshuai.xi         return;
543*53ee8cc1Swenshuai.xi     }
544*53ee8cc1Swenshuai.xi #endif
545*53ee8cc1Swenshuai.xi 
546*53ee8cc1Swenshuai.xi #ifndef MS_NOSAPI
547*53ee8cc1Swenshuai.xi     //Create Task
548*53ee8cc1Swenshuai.xi     pid = MsOS_CreateTask((TaskEntry) UsbTask_Port2,
549*53ee8cc1Swenshuai.xi                          (MS_U32)NULL,
550*53ee8cc1Swenshuai.xi                          E_TASK_PRI_HIGH,
551*53ee8cc1Swenshuai.xi                          TRUE,
552*53ee8cc1Swenshuai.xi                          HubStack,
553*53ee8cc1Swenshuai.xi                          HUB_STACK_SIZE,
554*53ee8cc1Swenshuai.xi                          "USB Hub Task 2");
555*53ee8cc1Swenshuai.xi     if (pid < 0)
556*53ee8cc1Swenshuai.xi     {
557*53ee8cc1Swenshuai.xi         GEN_EXCEP;
558*53ee8cc1Swenshuai.xi 
559*53ee8cc1Swenshuai.xi         MsOS_DeleteMutex(_s32MutexUSB_Port2);
560*53ee8cc1Swenshuai.xi         //MsOS_FreeMemory(HubStack, gs32CachedPoolID);
561*53ee8cc1Swenshuai.xi         return;
562*53ee8cc1Swenshuai.xi     }
563*53ee8cc1Swenshuai.xi #else
564*53ee8cc1Swenshuai.xi     //UsbTask();
565*53ee8cc1Swenshuai.xi #endif //MS_NOSAPI
566*53ee8cc1Swenshuai.xi     return;
567*53ee8cc1Swenshuai.xi }
568*53ee8cc1Swenshuai.xi 
_DrvUSB_OnInterrupt_Port2(InterruptNum eIntNum)569*53ee8cc1Swenshuai.xi static void _DrvUSB_OnInterrupt_Port2(InterruptNum eIntNum)
570*53ee8cc1Swenshuai.xi {
571*53ee8cc1Swenshuai.xi     //MS_U8		OldUSBEchiID;
572*53ee8cc1Swenshuai.xi 
573*53ee8cc1Swenshuai.xi     //MS_U8 status;
574*53ee8cc1Swenshuai.xi     //gIntStatus=mwHost20_USBSTS_Rd();
575*53ee8cc1Swenshuai.xi     //diag_printf("USB INT:%x\n",gIntStatus);
576*53ee8cc1Swenshuai.xi     //mwHost20_USBSTS_Set(gIntStatus);         //clear usb intr status
577*53ee8cc1Swenshuai.xi     MsOS_DisableInterrupt(gIrqUHC2);
578*53ee8cc1Swenshuai.xi 
579*53ee8cc1Swenshuai.xi     //OldUSBEchiID = MDrv_USBGetCurntEhciNum();
580*53ee8cc1Swenshuai.xi     //MDrv_USBSelectEhci(2);
581*53ee8cc1Swenshuai.xi     g_pUsbHcd_Port2->driver->irq(g_pUsbHcd_Port2, NULL);
582*53ee8cc1Swenshuai.xi     //MDrv_USBSelectEhci(OldUSBEchiID);
583*53ee8cc1Swenshuai.xi 
584*53ee8cc1Swenshuai.xi     MsOS_EnableInterrupt(gIrqUHC2);
585*53ee8cc1Swenshuai.xi }
586*53ee8cc1Swenshuai.xi 
InitUSBIntr_Port2(struct usb_hcd * hcd)587*53ee8cc1Swenshuai.xi void InitUSBIntr_Port2(struct usb_hcd * hcd)
588*53ee8cc1Swenshuai.xi {
589*53ee8cc1Swenshuai.xi     struct ehci_hcd  *ehci = hcd_to_ehci (hcd);
590*53ee8cc1Swenshuai.xi     U32 temp;
591*53ee8cc1Swenshuai.xi 
592*53ee8cc1Swenshuai.xi     diag_printf("InitUSBIntr_Port2 enter\n");
593*53ee8cc1Swenshuai.xi     temp = (HOST20_USBINTR_IntOnAsyncAdvance |
594*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_SystemError |
595*53ee8cc1Swenshuai.xi #ifdef ROOTHUB_INTERRUPT_MODE
596*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_PortChangeDetect |
597*53ee8cc1Swenshuai.xi #endif
598*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_USBError |
599*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_CompletionOfTransaction);
600*53ee8cc1Swenshuai.xi     ehci_writel (temp, (U32)&ehci->regs->intr_enable);
601*53ee8cc1Swenshuai.xi 
602*53ee8cc1Swenshuai.xi     temp = ehci_readb((U32)&ehci->regs->status);
603*53ee8cc1Swenshuai.xi     ehci_writel (temp, (U32)&ehci->regs->status); //clear all pending interrupt
604*53ee8cc1Swenshuai.xi 
605*53ee8cc1Swenshuai.xi     temp = ehci_readb((U32)&ehci->regs->bus_control);
606*53ee8cc1Swenshuai.xi     temp|= INT_POLAR;
607*53ee8cc1Swenshuai.xi     ehci_writel (temp, (U32)&ehci->regs->bus_control); // set interrupt polarity high
608*53ee8cc1Swenshuai.xi 
609*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
610*53ee8cc1Swenshuai.xi     //diag_printf("attach usb int\n");
611*53ee8cc1Swenshuai.xi 	MsOS_AttachInterrupt(gIrqUHC2, _DrvUSB_OnInterrupt_Port2);
612*53ee8cc1Swenshuai.xi     //diag_printf("enable usb int\n");
613*53ee8cc1Swenshuai.xi 	MsOS_EnableInterrupt(gIrqUHC2);
614*53ee8cc1Swenshuai.xi     //diag_printf("ok");
615*53ee8cc1Swenshuai.xi #endif
616*53ee8cc1Swenshuai.xi }
617*53ee8cc1Swenshuai.xi 
618