xref: /utopia/UTPA2-700.0.x/modules/usb/drv/usb_ecos/usbhost/drvMassStor.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 
79*53ee8cc1Swenshuai.xi //=============================================================================
80*53ee8cc1Swenshuai.xi #include <MsCommon.h>
81*53ee8cc1Swenshuai.xi #include  "include/drvConfig.h"
82*53ee8cc1Swenshuai.xi #include  "include/drvErrno.h"
83*53ee8cc1Swenshuai.xi #include "include/drvUSB.h"
84*53ee8cc1Swenshuai.xi //#include "scsiglue.h"
85*53ee8cc1Swenshuai.xi #include "drvTransport.h"
86*53ee8cc1Swenshuai.xi #include "drvProtocol.h"
87*53ee8cc1Swenshuai.xi //#include "initializers.h"
88*53ee8cc1Swenshuai.xi #include "include/drvBitops.h"
89*53ee8cc1Swenshuai.xi #include "include/drvCPE_AMBA.h"
90*53ee8cc1Swenshuai.xi #include "drvUsbHostConfig.h"
91*53ee8cc1Swenshuai.xi #include "drvHCD.h"
92*53ee8cc1Swenshuai.xi 
93*53ee8cc1Swenshuai.xi #if 1
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_HP8200e
96*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
97*53ee8cc1Swenshuai.xi #include "shuttle_usbat.h"
98*53ee8cc1Swenshuai.xi #endif
99*53ee8cc1Swenshuai.xi 
100*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_SDDR09
101*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
102*53ee8cc1Swenshuai.xi #include "sddr09.h"
103*53ee8cc1Swenshuai.xi #endif
104*53ee8cc1Swenshuai.xi 
105*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_SDDR55
106*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
107*53ee8cc1Swenshuai.xi #include "sddr55.h"
108*53ee8cc1Swenshuai.xi #endif
109*53ee8cc1Swenshuai.xi 
110*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_DPCM
111*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
112*53ee8cc1Swenshuai.xi #include "dpcm.h"
113*53ee8cc1Swenshuai.xi #endif
114*53ee8cc1Swenshuai.xi 
115*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_FREECOM
116*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
117*53ee8cc1Swenshuai.xi #include "freecom.h"
118*53ee8cc1Swenshuai.xi #endif
119*53ee8cc1Swenshuai.xi 
120*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_ISD200
121*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
122*53ee8cc1Swenshuai.xi #include "isd200.h"
123*53ee8cc1Swenshuai.xi #endif
124*53ee8cc1Swenshuai.xi 
125*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_DATAFAB
126*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
127*53ee8cc1Swenshuai.xi #include "datafab.h"
128*53ee8cc1Swenshuai.xi #endif
129*53ee8cc1Swenshuai.xi 
130*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_JUMPSHOT
131*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
132*53ee8cc1Swenshuai.xi #include "jumpshot.h"
133*53ee8cc1Swenshuai.xi #endif
134*53ee8cc1Swenshuai.xi 
135*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
136*53ee8cc1Swenshuai.xi #ifdef MASS_DEBUG
137*53ee8cc1Swenshuai.xi #define US_DEBUGP(x,...) diag_printf(x,__VA_ARGS__)
138*53ee8cc1Swenshuai.xi #else
139*53ee8cc1Swenshuai.xi #define US_DEBUGP(x,...)
140*53ee8cc1Swenshuai.xi #endif
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
143*53ee8cc1Swenshuai.xi extern struct cpe_dev cpe_ehci_dev;
144*53ee8cc1Swenshuai.xi 
145*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
146*53ee8cc1Swenshuai.xi static int storage_probe(struct usb_interface *iface, const struct usb_device_id *id);
147*53ee8cc1Swenshuai.xi 
148*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
149*53ee8cc1Swenshuai.xi static void storage_disconnect(struct usb_interface *iface);
150*53ee8cc1Swenshuai.xi 
151*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
152*53ee8cc1Swenshuai.xi extern void RemoveUSBDiskPort(U8 uPort, U8 uLunNum);
153*53ee8cc1Swenshuai.xi 
154*53ee8cc1Swenshuai.xi 
155*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
156*53ee8cc1Swenshuai.xi #define USB_STOR_DEVICE_VER(vend,prod,lo,hi) \
157*53ee8cc1Swenshuai.xi 	 USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, (vend), (prod), (lo), (hi),0,0,0,0,0,0,0
158*53ee8cc1Swenshuai.xi 
159*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
160*53ee8cc1Swenshuai.xi #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
161*53ee8cc1Swenshuai.xi 		    vendorName, productName,useProtocol, useTransport, \
162*53ee8cc1Swenshuai.xi 		    initFunction, flags) \
163*53ee8cc1Swenshuai.xi { USB_STOR_DEVICE_VER(id_vendor, id_product, bcdDeviceMin,bcdDeviceMax) }
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
166*53ee8cc1Swenshuai.xi #define GET_INTERFACE_INFO(cl,sc,pr) \
167*53ee8cc1Swenshuai.xi 	 USB_DEVICE_ID_MATCH_INT_INFO,0,0,0,0,0,0,0, (cl), (sc), (pr),0
168*53ee8cc1Swenshuai.xi 
169*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
170*53ee8cc1Swenshuai.xi #undef UNUSUAL_DEV
171*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
172*53ee8cc1Swenshuai.xi #define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
173*53ee8cc1Swenshuai.xi 		    vendor_name, product_name, use_protocol, use_transport, \
174*53ee8cc1Swenshuai.xi 		    init_function, Flags) \
175*53ee8cc1Swenshuai.xi { \
176*53ee8cc1Swenshuai.xi 	 vendor_name,	\
177*53ee8cc1Swenshuai.xi 	 product_name,	\
178*53ee8cc1Swenshuai.xi 	 use_protocol,	\
179*53ee8cc1Swenshuai.xi 	 use_transport,	\
180*53ee8cc1Swenshuai.xi 	 init_function,	\
181*53ee8cc1Swenshuai.xi 	 Flags \
182*53ee8cc1Swenshuai.xi }
183*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
184*53ee8cc1Swenshuai.xi 
185*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
186*53ee8cc1Swenshuai.xi static struct usb_device_id storage_usb_ids [] =
187*53ee8cc1Swenshuai.xi {
188*53ee8cc1Swenshuai.xi 
189*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
190*53ee8cc1Swenshuai.xi //#include "unusual_devs.h"
191*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
192*53ee8cc1Swenshuai.xi //#undef UNUSUAL_DEV
193*53ee8cc1Swenshuai.xi 
194*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
195*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, US_SC_RBC, US_PR_CB) },
196*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE,US_SC_8020,US_PR_CB) },
197*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE,US_SC_QIC,US_PR_CB) },
198*53ee8cc1Swenshuai.xi 
199*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
200*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE,US_SC_UFI,US_PR_CB) },
201*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE,US_SC_8070,US_PR_CB) },
202*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE,US_SC_SCSI,US_PR_CB) },
203*53ee8cc1Swenshuai.xi 
204*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
205*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, US_SC_RBC, US_PR_CBI) },
206*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, US_SC_8020, US_PR_CBI) },
207*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, US_SC_QIC, US_PR_CBI) },
208*53ee8cc1Swenshuai.xi 
209*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
210*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, US_SC_UFI, US_PR_CBI) },
211*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, US_SC_8070, US_PR_CBI) },
212*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, US_SC_SCSI, US_PR_CBI) },
213*53ee8cc1Swenshuai.xi 
214*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
215*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, US_SC_RBC, US_PR_BULK) },
216*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, US_SC_8020, US_PR_BULK) },
217*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, US_SC_QIC, US_PR_BULK) },
218*53ee8cc1Swenshuai.xi 
219*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
220*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, US_SC_UFI, US_PR_BULK) },
221*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, US_SC_8070, US_PR_BULK) },
222*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, US_SC_SCSI, US_PR_BULK) },
223*53ee8cc1Swenshuai.xi 
224*53ee8cc1Swenshuai.xi 	{GET_INTERFACE_INFO (USB_CLASS_STORAGE, 0xFF, US_PR_CB) },
225*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
226*53ee8cc1Swenshuai.xi 	{ 0,0,0,0,0,0,0,0,0,0,0,0}
227*53ee8cc1Swenshuai.xi };
228*53ee8cc1Swenshuai.xi 
229*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
230*53ee8cc1Swenshuai.xi static struct us_unusual_dev us_unusual_dev_list[] =
231*53ee8cc1Swenshuai.xi {
232*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
233*53ee8cc1Swenshuai.xi //#include "unusual_devs.h"
234*53ee8cc1Swenshuai.xi //#undef UNUSUAL_DEV
235*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
236*53ee8cc1Swenshuai.xi 	{ 0,0, US_SC_RBC,
237*53ee8cc1Swenshuai.xi 	   US_PR_CB,0,0},
238*53ee8cc1Swenshuai.xi 	{ 0,0, US_SC_8020,
239*53ee8cc1Swenshuai.xi 	   US_PR_CB,0,0},
240*53ee8cc1Swenshuai.xi 	{ 0,0, US_SC_QIC,
241*53ee8cc1Swenshuai.xi 	   US_PR_CB,0,0},
242*53ee8cc1Swenshuai.xi 	{ 0,0,  US_SC_UFI,
243*53ee8cc1Swenshuai.xi 	   US_PR_CB,0,0},
244*53ee8cc1Swenshuai.xi 	{ 0,0,  US_SC_8070,
245*53ee8cc1Swenshuai.xi 	   US_PR_CB,0,0},
246*53ee8cc1Swenshuai.xi 	{ 0,0,  US_SC_SCSI,
247*53ee8cc1Swenshuai.xi 	   US_PR_CB,0,0},
248*53ee8cc1Swenshuai.xi 
249*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
250*53ee8cc1Swenshuai.xi 	{ 0,0,  US_SC_RBC,
251*53ee8cc1Swenshuai.xi 	   US_PR_CBI,0,0},
252*53ee8cc1Swenshuai.xi 	{  0,0,  US_SC_8020,
253*53ee8cc1Swenshuai.xi 	   US_PR_CBI,0,0},
254*53ee8cc1Swenshuai.xi 	{ 0,0,  US_SC_QIC,
255*53ee8cc1Swenshuai.xi 	   US_PR_CBI,0,0},
256*53ee8cc1Swenshuai.xi 	{ 0,0,  US_SC_UFI,
257*53ee8cc1Swenshuai.xi 	   US_PR_CBI,0,0},
258*53ee8cc1Swenshuai.xi 	{  0,0, US_SC_8070,
259*53ee8cc1Swenshuai.xi 	   US_PR_CBI,0,0},
260*53ee8cc1Swenshuai.xi 	{  0,0,  US_SC_SCSI,
261*53ee8cc1Swenshuai.xi 	   US_PR_CBI,0,0},
262*53ee8cc1Swenshuai.xi 
263*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
264*53ee8cc1Swenshuai.xi 	{  0,0,  US_SC_RBC,
265*53ee8cc1Swenshuai.xi 	   US_PR_BULK,0,0},
266*53ee8cc1Swenshuai.xi 	{  0,0,  US_SC_8020,
267*53ee8cc1Swenshuai.xi 	   US_PR_BULK,0,0},
268*53ee8cc1Swenshuai.xi 	{  0,0,  US_SC_QIC,
269*53ee8cc1Swenshuai.xi 	   US_PR_BULK,0,0},
270*53ee8cc1Swenshuai.xi 	{  0,0,  US_SC_UFI,
271*53ee8cc1Swenshuai.xi 	   US_PR_BULK,0,0},
272*53ee8cc1Swenshuai.xi 	{  0,0,  US_SC_8070,
273*53ee8cc1Swenshuai.xi 	   US_PR_BULK,0,0},
274*53ee8cc1Swenshuai.xi 	{  0,0,  US_SC_SCSI,
275*53ee8cc1Swenshuai.xi 	   US_PR_BULK,0,0},
276*53ee8cc1Swenshuai.xi 
277*53ee8cc1Swenshuai.xi 	{  0,0,  0xFF,
278*53ee8cc1Swenshuai.xi 	   US_PR_CB,0,0},
279*53ee8cc1Swenshuai.xi 
280*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
281*53ee8cc1Swenshuai.xi 	{ 0,0,0,0,0,0 }
282*53ee8cc1Swenshuai.xi };
283*53ee8cc1Swenshuai.xi 
284*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
285*53ee8cc1Swenshuai.xi struct usb_driver usb_storage_driver =
286*53ee8cc1Swenshuai.xi {
287*53ee8cc1Swenshuai.xi 	(void*) 0,
288*53ee8cc1Swenshuai.xi 	"usb-storage",
289*53ee8cc1Swenshuai.xi 	storage_probe,
290*53ee8cc1Swenshuai.xi 	storage_disconnect,
291*53ee8cc1Swenshuai.xi 	0,
292*53ee8cc1Swenshuai.xi 	storage_usb_ids
293*53ee8cc1Swenshuai.xi };
294*53ee8cc1Swenshuai.xi 
295*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
296*53ee8cc1Swenshuai.xi #if 1
fill_inquiry_response(struct us_data * us,unsigned char * data,U32 data_len)297*53ee8cc1Swenshuai.xi void fill_inquiry_response(struct us_data *us, unsigned char *data,
298*53ee8cc1Swenshuai.xi 							U32 data_len)
299*53ee8cc1Swenshuai.xi {
300*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
301*53ee8cc1Swenshuai.xi 	//int i;
302*53ee8cc1Swenshuai.xi //	struct scatterlist *sg;		//YPING??
303*53ee8cc1Swenshuai.xi 	int len =
304*53ee8cc1Swenshuai.xi 		us->srb.request_bufflen > data_len ? data_len :
305*53ee8cc1Swenshuai.xi 		us->srb.request_bufflen;
306*53ee8cc1Swenshuai.xi 	//int transferred;
307*53ee8cc1Swenshuai.xi 	//int amt;
308*53ee8cc1Swenshuai.xi 
309*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
310*53ee8cc1Swenshuai.xi 	if (data_len<36) // You lose.
311*53ee8cc1Swenshuai.xi 		return;
312*53ee8cc1Swenshuai.xi 
313*53ee8cc1Swenshuai.xi 	if(data[0]&0x20)
314*53ee8cc1Swenshuai.xi 	{
315*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
316*53ee8cc1Swenshuai.xi 		memset(data+8,0,28);
317*53ee8cc1Swenshuai.xi 	}
318*53ee8cc1Swenshuai.xi 	else
319*53ee8cc1Swenshuai.xi 	{
320*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
321*53ee8cc1Swenshuai.xi 		memcpy(data+8, us->unusual_dev->vendorName,
322*53ee8cc1Swenshuai.xi 			strlen(us->unusual_dev->vendorName) > 8 ? 8 :
323*53ee8cc1Swenshuai.xi 			strlen(us->unusual_dev->vendorName));
324*53ee8cc1Swenshuai.xi 
325*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
326*53ee8cc1Swenshuai.xi 		memcpy(data+16, us->unusual_dev->productName,
327*53ee8cc1Swenshuai.xi 			strlen(us->unusual_dev->productName) > 16 ? 16 :
328*53ee8cc1Swenshuai.xi 			strlen(us->unusual_dev->productName));
329*53ee8cc1Swenshuai.xi 
330*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
331*53ee8cc1Swenshuai.xi 		data[32] = 0x30 + ((us->pusb_dev->descriptor.bcdDevice>>12) & 0x0F);
332*53ee8cc1Swenshuai.xi 		data[33] = 0x30 + ((us->pusb_dev->descriptor.bcdDevice>>8) & 0x0F);
333*53ee8cc1Swenshuai.xi 		data[34] = 0x30 + ((us->pusb_dev->descriptor.bcdDevice>>4) & 0x0F);
334*53ee8cc1Swenshuai.xi 		data[35] = 0x30 + ((us->pusb_dev->descriptor.bcdDevice) & 0x0F);
335*53ee8cc1Swenshuai.xi 	}
336*53ee8cc1Swenshuai.xi 
337*53ee8cc1Swenshuai.xi 
338*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
339*53ee8cc1Swenshuai.xi 	if (us->srb.use_sg)
340*53ee8cc1Swenshuai.xi 	{
341*53ee8cc1Swenshuai.xi 		printk("fill_inquiry_response: Not support scatter function.");
342*53ee8cc1Swenshuai.xi 	}
343*53ee8cc1Swenshuai.xi 	else
344*53ee8cc1Swenshuai.xi 	{
345*53ee8cc1Swenshuai.xi 		memset(us->srb.request_buffer, 0, us->srb.request_bufflen);
346*53ee8cc1Swenshuai.xi 		memcpy(us->srb.request_buffer, data, len);
347*53ee8cc1Swenshuai.xi 	}
348*53ee8cc1Swenshuai.xi }
349*53ee8cc1Swenshuai.xi #endif
350*53ee8cc1Swenshuai.xi 
usb_stor_control_thread(void * __us)351*53ee8cc1Swenshuai.xi int usb_stor_control_thread(void * __us)
352*53ee8cc1Swenshuai.xi {
353*53ee8cc1Swenshuai.xi 	struct us_data *us = (struct us_data *)__us;
354*53ee8cc1Swenshuai.xi 
355*53ee8cc1Swenshuai.xi //	lock_kernel();
356*53ee8cc1Swenshuai.xi 
357*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
358*53ee8cc1Swenshuai.xi /*	daemonize("usb-storage");
359*53ee8cc1Swenshuai.xi 
360*53ee8cc1Swenshuai.xi 	current->flags |= PF_IOTHREAD;
361*53ee8cc1Swenshuai.xi 
362*53ee8cc1Swenshuai.xi 	unlock_kernel();
363*53ee8cc1Swenshuai.xi */
364*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
365*53ee8cc1Swenshuai.xi //	complete(&(us->notify));
366*53ee8cc1Swenshuai.xi 
367*53ee8cc1Swenshuai.xi //	for(;;)
368*53ee8cc1Swenshuai.xi 	{
369*53ee8cc1Swenshuai.xi //		struct Scsi_Host *host;			//YPING01??
370*53ee8cc1Swenshuai.xi 		US_DEBUGP("*** thread sleeping.%s","\n");
371*53ee8cc1Swenshuai.xi //		if(down_interruptible(&us->sema))
372*53ee8cc1Swenshuai.xi //			break;
373*53ee8cc1Swenshuai.xi 
374*53ee8cc1Swenshuai.xi 		US_DEBUGP("*** thread awakened.%s","\n");
375*53ee8cc1Swenshuai.xi 
376*53ee8cc1Swenshuai.xi 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
377*53ee8cc1Swenshuai.xi //		if (us->srb == NULL)
378*53ee8cc1Swenshuai.xi //		{
379*53ee8cc1Swenshuai.xi //			US_DEBUGP("-- exit command received%s","\n");
380*53ee8cc1Swenshuai.xi //			goto SkipForAbort;
381*53ee8cc1Swenshuai.xi //			break;
382*53ee8cc1Swenshuai.xi //		}
383*53ee8cc1Swenshuai.xi //		host = us->srb.device->host;
384*53ee8cc1Swenshuai.xi 
385*53ee8cc1Swenshuai.xi 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
386*53ee8cc1Swenshuai.xi //		scsi_lock(host);
387*53ee8cc1Swenshuai.xi 
388*53ee8cc1Swenshuai.xi 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
389*53ee8cc1Swenshuai.xi 		if (us->sm_state == US_STATE_ABORTING)
390*53ee8cc1Swenshuai.xi 		{
391*53ee8cc1Swenshuai.xi 			us->srb.result = DID_ABORT << 16;
392*53ee8cc1Swenshuai.xi 			goto SkipForAbort;
393*53ee8cc1Swenshuai.xi 		}
394*53ee8cc1Swenshuai.xi 
395*53ee8cc1Swenshuai.xi 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
396*53ee8cc1Swenshuai.xi 		us->sm_state = US_STATE_RUNNING;
397*53ee8cc1Swenshuai.xi //		scsi_unlock(host);
398*53ee8cc1Swenshuai.xi 
399*53ee8cc1Swenshuai.xi 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
400*53ee8cc1Swenshuai.xi 		down(&(us->dev_semaphore));
401*53ee8cc1Swenshuai.xi 
402*53ee8cc1Swenshuai.xi 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
403*53ee8cc1Swenshuai.xi 
404*53ee8cc1Swenshuai.xi 		if (test_bit(US_FLIDX_DISCONNECTING, &us->flags))
405*53ee8cc1Swenshuai.xi 		{
406*53ee8cc1Swenshuai.xi 			US_DEBUGP("No command during disconnect%s","\n");
407*53ee8cc1Swenshuai.xi 			us->srb.result = DID_BAD_TARGET << 16;
408*53ee8cc1Swenshuai.xi 		}
409*53ee8cc1Swenshuai.xi 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
410*53ee8cc1Swenshuai.xi 		else if (us->srb.sc_data_direction == SCSI_DATA_UNKNOWN)
411*53ee8cc1Swenshuai.xi 		{
412*53ee8cc1Swenshuai.xi 			US_DEBUGP("UNKNOWN data direction%s","\n");
413*53ee8cc1Swenshuai.xi 			us->srb.result = DID_ERROR << 16;
414*53ee8cc1Swenshuai.xi 		}
415*53ee8cc1Swenshuai.xi 
416*53ee8cc1Swenshuai.xi #if 0
417*53ee8cc1Swenshuai.xi 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
418*53ee8cc1Swenshuai.xi 		else if (us->srb.device->id &&
419*53ee8cc1Swenshuai.xi 				!(us->flags & US_FL_SCM_MULT_TARG))
420*53ee8cc1Swenshuai.xi 		{
421*53ee8cc1Swenshuai.xi 			US_DEBUGP("Bad target number (%d:%d)\n",
422*53ee8cc1Swenshuai.xi 				  us->srb.device->id, us->srb.device->lun);
423*53ee8cc1Swenshuai.xi 			us->srb.result = DID_BAD_TARGET << 16;
424*53ee8cc1Swenshuai.xi 		}
425*53ee8cc1Swenshuai.xi 
426*53ee8cc1Swenshuai.xi 		else if (us->srb.device->lun > us->max_lun)
427*53ee8cc1Swenshuai.xi 		{
428*53ee8cc1Swenshuai.xi 			US_DEBUGP("Bad LUN (%d:%d)\n",
429*53ee8cc1Swenshuai.xi 				  us->srb.device->id, us->srb.device->lun);
430*53ee8cc1Swenshuai.xi 			us->srb.result = DID_BAD_TARGET << 16;
431*53ee8cc1Swenshuai.xi 		}
432*53ee8cc1Swenshuai.xi #endif
433*53ee8cc1Swenshuai.xi 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
434*53ee8cc1Swenshuai.xi 		else if ((us->srb.cmnd[0] == INQUIRY) &&
435*53ee8cc1Swenshuai.xi 			    (us->flags & US_FL_FIX_INQUIRY)) {
436*53ee8cc1Swenshuai.xi 			unsigned char data_ptr[36] = {
437*53ee8cc1Swenshuai.xi 			    0x00, 0x80, 0x02, 0x02,
438*53ee8cc1Swenshuai.xi 			    0x1F, 0x00, 0x00, 0x00};
439*53ee8cc1Swenshuai.xi 
440*53ee8cc1Swenshuai.xi 			US_DEBUGP("Faking INQUIRY command%s","\n");
441*53ee8cc1Swenshuai.xi 			fill_inquiry_response(us, data_ptr, 36);
442*53ee8cc1Swenshuai.xi 			us->srb.result = SAM_STAT_GOOD;
443*53ee8cc1Swenshuai.xi 		}
444*53ee8cc1Swenshuai.xi 
445*53ee8cc1Swenshuai.xi 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
446*53ee8cc1Swenshuai.xi 		else
447*53ee8cc1Swenshuai.xi 		{
448*53ee8cc1Swenshuai.xi //			US_DEBUGP(usb_stor_show_command(us->srb)"%s","\n");		//xyz
449*53ee8cc1Swenshuai.xi 			us->proto_handler(&us->srb, us);
450*53ee8cc1Swenshuai.xi 		}
451*53ee8cc1Swenshuai.xi 
452*53ee8cc1Swenshuai.xi 		/* unlock the device pointers */
453*53ee8cc1Swenshuai.xi 		up(&(us->dev_semaphore));
454*53ee8cc1Swenshuai.xi 
455*53ee8cc1Swenshuai.xi 		/* lock access to the state */
456*53ee8cc1Swenshuai.xi //		scsi_lock(host);
457*53ee8cc1Swenshuai.xi 
458*53ee8cc1Swenshuai.xi 		/* indicate that the command is done */
459*53ee8cc1Swenshuai.xi 		if (us->srb.result != DID_ABORT << 16)
460*53ee8cc1Swenshuai.xi 		{
461*53ee8cc1Swenshuai.xi 			US_DEBUGP("scsi cmd done, result=0x%x\n",
462*53ee8cc1Swenshuai.xi 				   us->srb.result);
463*53ee8cc1Swenshuai.xi 
464*53ee8cc1Swenshuai.xi 			if(us->srb.scsi_done != NULL)
465*53ee8cc1Swenshuai.xi 				us->srb.scsi_done(&us->srb);
466*53ee8cc1Swenshuai.xi 		}
467*53ee8cc1Swenshuai.xi 		else
468*53ee8cc1Swenshuai.xi 		{
469*53ee8cc1Swenshuai.xi 			SkipForAbort:
470*53ee8cc1Swenshuai.xi 			US_DEBUGP("scsi command aborted%s","\n");
471*53ee8cc1Swenshuai.xi 		}
472*53ee8cc1Swenshuai.xi 
473*53ee8cc1Swenshuai.xi 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
474*53ee8cc1Swenshuai.xi 		if (us->sm_state == US_STATE_ABORTING)
475*53ee8cc1Swenshuai.xi 			complete(&(us->notify));
476*53ee8cc1Swenshuai.xi 
477*53ee8cc1Swenshuai.xi 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
478*53ee8cc1Swenshuai.xi //		us->srb = NULL;			//YPING01??
479*53ee8cc1Swenshuai.xi 		us->sm_state = US_STATE_IDLE;
480*53ee8cc1Swenshuai.xi //		scsi_unlock(host);
481*53ee8cc1Swenshuai.xi 	} /* for (;;) */
482*53ee8cc1Swenshuai.xi 
483*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
484*53ee8cc1Swenshuai.xi 	complete(&(us->notify));
485*53ee8cc1Swenshuai.xi 
486*53ee8cc1Swenshuai.xi 	return 0;
487*53ee8cc1Swenshuai.xi }
488*53ee8cc1Swenshuai.xi 
associate_dev(struct us_data * us,struct usb_interface * intf)489*53ee8cc1Swenshuai.xi static int associate_dev(struct us_data *us, struct usb_interface *intf)
490*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
491*53ee8cc1Swenshuai.xi {
492*53ee8cc1Swenshuai.xi 
493*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
494*53ee8cc1Swenshuai.xi 	us->pusb_dev = interface_to_usbdev(intf);
495*53ee8cc1Swenshuai.xi 
496*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
497*53ee8cc1Swenshuai.xi 	us->pusb_intf = intf;
498*53ee8cc1Swenshuai.xi 
499*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
500*53ee8cc1Swenshuai.xi 	us->ifnum = intf->altsetting->desc.bInterfaceNumber;
501*53ee8cc1Swenshuai.xi 
502*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
503*53ee8cc1Swenshuai.xi 	usb_set_intfdata(intf, us);
504*53ee8cc1Swenshuai.xi 	usb_get_dev(us->pusb_dev);
505*53ee8cc1Swenshuai.xi 
506*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
507*53ee8cc1Swenshuai.xi 	us->cr = (struct usb_ctrlrequest*) usb_buffer_alloc(us->pusb_dev, sizeof(*us->cr), GFP_KERNEL, &us->cr_dma);
508*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
509*53ee8cc1Swenshuai.xi 
510*53ee8cc1Swenshuai.xi 
511*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
512*53ee8cc1Swenshuai.xi 	if (!us->cr)
513*53ee8cc1Swenshuai.xi         {
514*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
515*53ee8cc1Swenshuai.xi 		US_DEBUGP("[associate_dev] usb_ctrlrequest allocation failed%s","\n");
516*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
517*53ee8cc1Swenshuai.xi 		return -ENOMEM;
518*53ee8cc1Swenshuai.xi 	}
519*53ee8cc1Swenshuai.xi 
520*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
521*53ee8cc1Swenshuai.xi 	us->iobuf = (unsigned char*) usb_buffer_alloc(us->pusb_dev, US_IOBUF_SIZE, GFP_KERNEL, &us->iobuf_dma);
522*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
523*53ee8cc1Swenshuai.xi 
524*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
525*53ee8cc1Swenshuai.xi 	if (!us->iobuf) {
526*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
527*53ee8cc1Swenshuai.xi 		US_DEBUGP("[associate_dev] I/O buffer allocation failed%s","\n");
528*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
529*53ee8cc1Swenshuai.xi 		return -ENOMEM;
530*53ee8cc1Swenshuai.xi 	}
531*53ee8cc1Swenshuai.xi 
532*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
533*53ee8cc1Swenshuai.xi 	return 0;
534*53ee8cc1Swenshuai.xi }
535*53ee8cc1Swenshuai.xi 
get_device_info(struct us_data * us,int id_index)536*53ee8cc1Swenshuai.xi static void get_device_info(struct us_data *us, int id_index)
537*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
538*53ee8cc1Swenshuai.xi {
539*53ee8cc1Swenshuai.xi 
540*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
541*53ee8cc1Swenshuai.xi 	struct usb_interface_descriptor *idesc =
542*53ee8cc1Swenshuai.xi 		&us->pusb_intf->altsetting[us->pusb_intf->act_altsetting].desc;
543*53ee8cc1Swenshuai.xi 
544*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
545*53ee8cc1Swenshuai.xi 	struct us_unusual_dev *unusual_dev = &us_unusual_dev_list[id_index];
546*53ee8cc1Swenshuai.xi 
547*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
548*53ee8cc1Swenshuai.xi 	struct usb_device_id *id = &storage_usb_ids[id_index];
549*53ee8cc1Swenshuai.xi 
550*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
551*53ee8cc1Swenshuai.xi 	if (unusual_dev->vendorName)
552*53ee8cc1Swenshuai.xi 		US_DEBUGP("[get_device_info] Vendor: %s\n", unusual_dev->vendorName);
553*53ee8cc1Swenshuai.xi 
554*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
555*53ee8cc1Swenshuai.xi 	if (unusual_dev->productName)
556*53ee8cc1Swenshuai.xi 		US_DEBUGP("[get_device_info] Product: %s\n", unusual_dev->productName);
557*53ee8cc1Swenshuai.xi 
558*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
559*53ee8cc1Swenshuai.xi 	us->unusual_dev = unusual_dev;
560*53ee8cc1Swenshuai.xi 	us->subclass = (unusual_dev->useProtocol == US_SC_DEVICE) ?
561*53ee8cc1Swenshuai.xi 			idesc->bInterfaceSubClass :
562*53ee8cc1Swenshuai.xi 			unusual_dev->useProtocol;
563*53ee8cc1Swenshuai.xi 	us->protocol = (unusual_dev->useTransport == US_PR_DEVICE) ?
564*53ee8cc1Swenshuai.xi 			idesc->bInterfaceProtocol :
565*53ee8cc1Swenshuai.xi 			unusual_dev->useTransport;
566*53ee8cc1Swenshuai.xi 	us->flags = unusual_dev->flags;
567*53ee8cc1Swenshuai.xi 
568*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
569*53ee8cc1Swenshuai.xi 	if (id->idVendor || id->idProduct) {
570*53ee8cc1Swenshuai.xi 
571*53ee8cc1Swenshuai.xi 		//struct usb_device_descriptor *ddesc = &dev->descriptor;
572*53ee8cc1Swenshuai.xi 		int msg = -1;
573*53ee8cc1Swenshuai.xi 
574*53ee8cc1Swenshuai.xi 		if (unusual_dev->useProtocol != US_SC_DEVICE &&
575*53ee8cc1Swenshuai.xi 			us->subclass == idesc->bInterfaceSubClass)
576*53ee8cc1Swenshuai.xi 			msg += 1;
577*53ee8cc1Swenshuai.xi 		if (unusual_dev->useTransport != US_PR_DEVICE &&
578*53ee8cc1Swenshuai.xi 			us->protocol == idesc->bInterfaceProtocol)
579*53ee8cc1Swenshuai.xi 			msg += 2;
580*53ee8cc1Swenshuai.xi 	}
581*53ee8cc1Swenshuai.xi 
582*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
583*53ee8cc1Swenshuai.xi 	if (strlen(us->vendor) == 0) {
584*53ee8cc1Swenshuai.xi 		if (unusual_dev->vendorName)
585*53ee8cc1Swenshuai.xi 			strncpy(us->vendor, unusual_dev->vendorName,
586*53ee8cc1Swenshuai.xi 				sizeof(us->vendor));
587*53ee8cc1Swenshuai.xi 		else
588*53ee8cc1Swenshuai.xi 			strncpy(us->vendor, "Unknown", sizeof(us->vendor));
589*53ee8cc1Swenshuai.xi 	}
590*53ee8cc1Swenshuai.xi 	if (strlen(us->product) == 0) {
591*53ee8cc1Swenshuai.xi 		if (unusual_dev->productName)
592*53ee8cc1Swenshuai.xi 			strncpy(us->product, unusual_dev->productName,
593*53ee8cc1Swenshuai.xi 				sizeof(us->product));
594*53ee8cc1Swenshuai.xi 		else
595*53ee8cc1Swenshuai.xi 			strncpy(us->product, "Unknown", sizeof(us->product));
596*53ee8cc1Swenshuai.xi 	}
597*53ee8cc1Swenshuai.xi 	if (strlen(us->serial) == 0)
598*53ee8cc1Swenshuai.xi 		strncpy(us->serial, "None", sizeof(us->serial));
599*53ee8cc1Swenshuai.xi }
600*53ee8cc1Swenshuai.xi 
601*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
get_transport(struct us_data * us)602*53ee8cc1Swenshuai.xi static int get_transport(struct us_data *us)
603*53ee8cc1Swenshuai.xi {
604*53ee8cc1Swenshuai.xi 	switch (us->protocol) {
605*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
606*53ee8cc1Swenshuai.xi 	case US_PR_CB:
607*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
608*53ee8cc1Swenshuai.xi 		us->transport_name = "Control/Bulk";
609*53ee8cc1Swenshuai.xi 		us->transport = usb_stor_CB_transport;
610*53ee8cc1Swenshuai.xi 		us->transport_reset = usb_stor_CB_reset;
611*53ee8cc1Swenshuai.xi 		//us->max_lun = 7;
612*53ee8cc1Swenshuai.xi 		us->max_lun = 0;	//FIXME, Find some way to get real Max. LUN
613*53ee8cc1Swenshuai.xi 		break;
614*53ee8cc1Swenshuai.xi 
615*53ee8cc1Swenshuai.xi 	case US_PR_CBI:
616*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
617*53ee8cc1Swenshuai.xi 		us->transport_name = "Control/Bulk/Interrupt";
618*53ee8cc1Swenshuai.xi 		us->transport = usb_stor_CBI_transport;
619*53ee8cc1Swenshuai.xi 		us->transport_reset = usb_stor_CB_reset;
620*53ee8cc1Swenshuai.xi 		us->max_lun = 0;
621*53ee8cc1Swenshuai.xi 		break;
622*53ee8cc1Swenshuai.xi 
623*53ee8cc1Swenshuai.xi 	case US_PR_BULK:
624*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
625*53ee8cc1Swenshuai.xi 		us->transport_name = "Bulk";
626*53ee8cc1Swenshuai.xi 		us->transport = usb_stor_Bulk_transport;
627*53ee8cc1Swenshuai.xi 		us->transport_reset = usb_stor_Bulk_reset;
628*53ee8cc1Swenshuai.xi 		break;
629*53ee8cc1Swenshuai.xi 
630*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_HP8200e
631*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
632*53ee8cc1Swenshuai.xi 	case US_PR_SCM_ATAPI:
633*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
634*53ee8cc1Swenshuai.xi 		us->transport_name = "SCM/ATAPI";
635*53ee8cc1Swenshuai.xi 		us->transport = hp8200e_transport;
636*53ee8cc1Swenshuai.xi 		us->transport_reset = usb_stor_CB_reset;
637*53ee8cc1Swenshuai.xi 		us->max_lun = 1;
638*53ee8cc1Swenshuai.xi 		break;
639*53ee8cc1Swenshuai.xi #endif
640*53ee8cc1Swenshuai.xi 
641*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_SDDR09
642*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
643*53ee8cc1Swenshuai.xi 	case US_PR_EUSB_SDDR09:
644*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
645*53ee8cc1Swenshuai.xi 		us->transport_name = "EUSB/SDDR09";
646*53ee8cc1Swenshuai.xi 		us->transport = sddr09_transport;
647*53ee8cc1Swenshuai.xi 		us->transport_reset = usb_stor_CB_reset;
648*53ee8cc1Swenshuai.xi 		us->max_lun = 0;
649*53ee8cc1Swenshuai.xi 		break;
650*53ee8cc1Swenshuai.xi #endif
651*53ee8cc1Swenshuai.xi 
652*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_SDDR55
653*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
654*53ee8cc1Swenshuai.xi 	case US_PR_SDDR55:
655*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
656*53ee8cc1Swenshuai.xi 		us->transport_name = "SDDR55";
657*53ee8cc1Swenshuai.xi 		us->transport = sddr55_transport;
658*53ee8cc1Swenshuai.xi 		us->transport_reset = sddr55_reset;
659*53ee8cc1Swenshuai.xi 		us->max_lun = 0;
660*53ee8cc1Swenshuai.xi 		break;
661*53ee8cc1Swenshuai.xi #endif
662*53ee8cc1Swenshuai.xi 
663*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_DPCM
664*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
665*53ee8cc1Swenshuai.xi 	case US_PR_DPCM_USB:
666*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
667*53ee8cc1Swenshuai.xi 		us->transport_name = "Control/Bulk-EUSB/SDDR09";
668*53ee8cc1Swenshuai.xi 		us->transport = dpcm_transport;
669*53ee8cc1Swenshuai.xi 		us->transport_reset = usb_stor_CB_reset;
670*53ee8cc1Swenshuai.xi 		us->max_lun = 1;
671*53ee8cc1Swenshuai.xi 		break;
672*53ee8cc1Swenshuai.xi #endif
673*53ee8cc1Swenshuai.xi 
674*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_FREECOM
675*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
676*53ee8cc1Swenshuai.xi 	case US_PR_FREECOM:
677*53ee8cc1Swenshuai.xi 		us->transport_name = "Freecom";
678*53ee8cc1Swenshuai.xi 		us->transport = freecom_transport;
679*53ee8cc1Swenshuai.xi 		us->transport_reset = usb_stor_freecom_reset;
680*53ee8cc1Swenshuai.xi 		us->max_lun = 0;
681*53ee8cc1Swenshuai.xi 		break;
682*53ee8cc1Swenshuai.xi #endif
683*53ee8cc1Swenshuai.xi 
684*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_DATAFAB
685*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
686*53ee8cc1Swenshuai.xi 	case US_PR_DATAFAB:
687*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
688*53ee8cc1Swenshuai.xi 		us->transport_name  = "Datafab Bulk-Only";
689*53ee8cc1Swenshuai.xi 		us->transport = datafab_transport;
690*53ee8cc1Swenshuai.xi 		us->transport_reset = usb_stor_Bulk_reset;
691*53ee8cc1Swenshuai.xi 		us->max_lun = 1;
692*53ee8cc1Swenshuai.xi 		break;
693*53ee8cc1Swenshuai.xi #endif
694*53ee8cc1Swenshuai.xi 
695*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_JUMPSHOT
696*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
697*53ee8cc1Swenshuai.xi 	case US_PR_JUMPSHOT:
698*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
699*53ee8cc1Swenshuai.xi 		us->transport_name  = "Lexar Jumpshot Control/Bulk";
700*53ee8cc1Swenshuai.xi 		us->transport = jumpshot_transport;
701*53ee8cc1Swenshuai.xi 		us->transport_reset = usb_stor_Bulk_reset;
702*53ee8cc1Swenshuai.xi 		us->max_lun = 1;
703*53ee8cc1Swenshuai.xi 		break;
704*53ee8cc1Swenshuai.xi #endif
705*53ee8cc1Swenshuai.xi 
706*53ee8cc1Swenshuai.xi 	default:
707*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
708*53ee8cc1Swenshuai.xi 		return -EIO;
709*53ee8cc1Swenshuai.xi 	}
710*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
711*53ee8cc1Swenshuai.xi 	US_DEBUGP("Transport: %s\n", us->transport_name);
712*53ee8cc1Swenshuai.xi 
713*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
714*53ee8cc1Swenshuai.xi 	if (us->flags & US_FL_SINGLE_LUN)
715*53ee8cc1Swenshuai.xi 		us->max_lun = 0;
716*53ee8cc1Swenshuai.xi 	return 0;
717*53ee8cc1Swenshuai.xi }
718*53ee8cc1Swenshuai.xi 
719*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
get_protocol(struct us_data * us)720*53ee8cc1Swenshuai.xi static int get_protocol(struct us_data *us)
721*53ee8cc1Swenshuai.xi {
722*53ee8cc1Swenshuai.xi 	switch (us->subclass) {
723*53ee8cc1Swenshuai.xi 	case US_SC_RBC:
724*53ee8cc1Swenshuai.xi 		us->protocol_name = "Reduced Block Commands (RBC)";
725*53ee8cc1Swenshuai.xi //		USB_sprintf(us->protocol_name,"Reduced Block Commands (RBC)");
726*53ee8cc1Swenshuai.xi 		us->proto_handler = usb_stor_transparent_scsi_command;
727*53ee8cc1Swenshuai.xi 		break;
728*53ee8cc1Swenshuai.xi 
729*53ee8cc1Swenshuai.xi 	case US_SC_8070:
730*53ee8cc1Swenshuai.xi 	case US_SC_SCSI:
731*53ee8cc1Swenshuai.xi 	case 0xFF:	// For Sony DC P8 (P series) and Sony DV
732*53ee8cc1Swenshuai.xi 		us->protocol_name = "Transparent SCSI";
733*53ee8cc1Swenshuai.xi //		USB_sprintf(us->protocol_name,"Transparent SCSI");
734*53ee8cc1Swenshuai.xi 		us->proto_handler = usb_stor_transparent_scsi_command;
735*53ee8cc1Swenshuai.xi 		break;
736*53ee8cc1Swenshuai.xi 
737*53ee8cc1Swenshuai.xi 	case US_SC_8020:
738*53ee8cc1Swenshuai.xi 		us->protocol_name = "8020i";
739*53ee8cc1Swenshuai.xi 		us->proto_handler = usb_stor_transparent_scsi_command;
740*53ee8cc1Swenshuai.xi 		us->max_lun = 0;
741*53ee8cc1Swenshuai.xi 		break;
742*53ee8cc1Swenshuai.xi 
743*53ee8cc1Swenshuai.xi #if SupportOtherDevice
744*53ee8cc1Swenshuai.xi #if 0
745*53ee8cc1Swenshuai.xi 	case US_SC_8020:
746*53ee8cc1Swenshuai.xi 		us->protocol_name = "8020i";
747*53ee8cc1Swenshuai.xi 		us->proto_handler = usb_stor_ATAPI_command;
748*53ee8cc1Swenshuai.xi 		us->max_lun = 0;
749*53ee8cc1Swenshuai.xi 		break;
750*53ee8cc1Swenshuai.xi #endif
751*53ee8cc1Swenshuai.xi 
752*53ee8cc1Swenshuai.xi 	case US_SC_QIC:
753*53ee8cc1Swenshuai.xi 		us->protocol_name = "QIC-157";
754*53ee8cc1Swenshuai.xi 		us->proto_handler = usb_stor_qic157_command;
755*53ee8cc1Swenshuai.xi 		us->max_lun = 0;
756*53ee8cc1Swenshuai.xi 		break;
757*53ee8cc1Swenshuai.xi #if 0
758*53ee8cc1Swenshuai.xi 	case US_SC_8070:
759*53ee8cc1Swenshuai.xi 		us->protocol_name = "8070i";
760*53ee8cc1Swenshuai.xi 		us->proto_handler = usb_stor_ATAPI_command;
761*53ee8cc1Swenshuai.xi 		us->max_lun = 0;
762*53ee8cc1Swenshuai.xi 		break;
763*53ee8cc1Swenshuai.xi #endif
764*53ee8cc1Swenshuai.xi 
765*53ee8cc1Swenshuai.xi 	case US_SC_UFI:
766*53ee8cc1Swenshuai.xi 		us->protocol_name = "Uniform Floppy Interface (UFI)";
767*53ee8cc1Swenshuai.xi 		us->proto_handler = usb_stor_ufi_command;
768*53ee8cc1Swenshuai.xi 		break;
769*53ee8cc1Swenshuai.xi #endif
770*53ee8cc1Swenshuai.xi 
771*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_ISD200
772*53ee8cc1Swenshuai.xi 	case US_SC_ISD200:
773*53ee8cc1Swenshuai.xi 		us->protocol_name = "ISD200 ATA/ATAPI";
774*53ee8cc1Swenshuai.xi 		us->proto_handler = isd200_ata_command;
775*53ee8cc1Swenshuai.xi 		break;
776*53ee8cc1Swenshuai.xi #endif
777*53ee8cc1Swenshuai.xi 
778*53ee8cc1Swenshuai.xi 	default:
779*53ee8cc1Swenshuai.xi 		return -EIO;
780*53ee8cc1Swenshuai.xi 	}
781*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
782*53ee8cc1Swenshuai.xi 	US_DEBUGP("Protocol: %s\n", us->protocol_name);
783*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
784*53ee8cc1Swenshuai.xi 	return 0;
785*53ee8cc1Swenshuai.xi }
786*53ee8cc1Swenshuai.xi 
787*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
get_pipes(struct us_data * us)788*53ee8cc1Swenshuai.xi static int get_pipes(struct us_data *us)
789*53ee8cc1Swenshuai.xi {
790*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
791*53ee8cc1Swenshuai.xi 	struct usb_host_interface *altsetting =	&us->pusb_intf->altsetting[us->pusb_intf->act_altsetting];
792*53ee8cc1Swenshuai.xi 
793*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
794*53ee8cc1Swenshuai.xi 	int ii;
795*53ee8cc1Swenshuai.xi 
796*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
797*53ee8cc1Swenshuai.xi 	struct usb_endpoint_descriptor *ep_tmp;
798*53ee8cc1Swenshuai.xi 
799*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
800*53ee8cc1Swenshuai.xi 	struct usb_endpoint_descriptor *ep_in = NULL;
801*53ee8cc1Swenshuai.xi 
802*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
803*53ee8cc1Swenshuai.xi 	struct usb_endpoint_descriptor *ep_out = NULL;
804*53ee8cc1Swenshuai.xi 
805*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
806*53ee8cc1Swenshuai.xi 	struct usb_endpoint_descriptor *ep_int = NULL;
807*53ee8cc1Swenshuai.xi 
808*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
809*53ee8cc1Swenshuai.xi 	for (ii = 0; ii < altsetting->desc.bNumEndpoints; ii++)
810*53ee8cc1Swenshuai.xi         {
811*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
812*53ee8cc1Swenshuai.xi 		ep_tmp=&altsetting->endpoint[ii].desc;
813*53ee8cc1Swenshuai.xi 
814*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
815*53ee8cc1Swenshuai.xi 		if ((ep_tmp->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK)
816*53ee8cc1Swenshuai.xi                 {
817*53ee8cc1Swenshuai.xi 			/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
818*53ee8cc1Swenshuai.xi 			if (ep_tmp->bEndpointAddress & USB_DIR_IN)
819*53ee8cc1Swenshuai.xi                         {
820*53ee8cc1Swenshuai.xi                                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
821*53ee8cc1Swenshuai.xi 				ep_in = ep_tmp;
822*53ee8cc1Swenshuai.xi                         }
823*53ee8cc1Swenshuai.xi 			else
824*53ee8cc1Swenshuai.xi                         {
825*53ee8cc1Swenshuai.xi                                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
826*53ee8cc1Swenshuai.xi 				ep_out = ep_tmp;
827*53ee8cc1Swenshuai.xi                         }
828*53ee8cc1Swenshuai.xi 		}
829*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
830*53ee8cc1Swenshuai.xi 		else
831*53ee8cc1Swenshuai.xi                 if ((ep_tmp->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
832*53ee8cc1Swenshuai.xi                              == USB_ENDPOINT_XFER_INT)
833*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
834*53ee8cc1Swenshuai.xi                 {
835*53ee8cc1Swenshuai.xi                         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
836*53ee8cc1Swenshuai.xi                        	ep_int = ep_tmp;
837*53ee8cc1Swenshuai.xi 
838*53ee8cc1Swenshuai.xi 		}
839*53ee8cc1Swenshuai.xi 	}
840*53ee8cc1Swenshuai.xi 
841*53ee8cc1Swenshuai.xi 
842*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
843*53ee8cc1Swenshuai.xi 	if (!ep_in || !ep_out || (us->protocol == US_PR_CBI && !ep_int))
844*53ee8cc1Swenshuai.xi         {
845*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
846*53ee8cc1Swenshuai.xi 		US_DEBUGP("Endpoint sanity check failed! Rejecting dev.%s","\n");
847*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
848*53ee8cc1Swenshuai.xi 		return -EIO;
849*53ee8cc1Swenshuai.xi 	}
850*53ee8cc1Swenshuai.xi 
851*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
852*53ee8cc1Swenshuai.xi 	us->send_ctrl_pipe = usb_sndctrlpipe(us->pusb_dev, 0);
853*53ee8cc1Swenshuai.xi 
854*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
855*53ee8cc1Swenshuai.xi 	us->recv_ctrl_pipe = usb_rcvctrlpipe(us->pusb_dev, 0);
856*53ee8cc1Swenshuai.xi 
857*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
858*53ee8cc1Swenshuai.xi 	us->send_bulk_pipe = usb_sndbulkpipe(us->pusb_dev,
859*53ee8cc1Swenshuai.xi 		ep_out->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
860*53ee8cc1Swenshuai.xi 
861*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
862*53ee8cc1Swenshuai.xi 	us->recv_bulk_pipe = usb_rcvbulkpipe(us->pusb_dev,
863*53ee8cc1Swenshuai.xi 		ep_in->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
864*53ee8cc1Swenshuai.xi 
865*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
866*53ee8cc1Swenshuai.xi 	if (ep_int) {
867*53ee8cc1Swenshuai.xi #if 1    //
868*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
869*53ee8cc1Swenshuai.xi 		us->recv_intr_pipe = usb_rcvbulkpipe(us->pusb_dev,
870*53ee8cc1Swenshuai.xi 			ep_int->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
871*53ee8cc1Swenshuai.xi #else
872*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
873*53ee8cc1Swenshuai.xi 		us->recv_intr_pipe = usb_rcvintpipe(us->pusb_dev,
874*53ee8cc1Swenshuai.xi 			ep_int->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
875*53ee8cc1Swenshuai.xi #endif
876*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
877*53ee8cc1Swenshuai.xi 		us->ep_bInterval = ep_int->bInterval;
878*53ee8cc1Swenshuai.xi 	}
879*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
880*53ee8cc1Swenshuai.xi 	return 0;
881*53ee8cc1Swenshuai.xi }
882*53ee8cc1Swenshuai.xi 
883*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_stor_acquire_resources(struct us_data * us)884*53ee8cc1Swenshuai.xi static int usb_stor_acquire_resources(struct us_data *us)
885*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
886*53ee8cc1Swenshuai.xi {
887*53ee8cc1Swenshuai.xi 	//int p;
888*53ee8cc1Swenshuai.xi 
889*53ee8cc1Swenshuai.xi 	us->current_urb = usb_alloc_urb(0, GFP_KERNEL);
890*53ee8cc1Swenshuai.xi 	if (!us->current_urb) {
891*53ee8cc1Swenshuai.xi 		US_DEBUGP("URB allocation failed%s","\n");
892*53ee8cc1Swenshuai.xi 		return -ENOMEM;
893*53ee8cc1Swenshuai.xi 	}
894*53ee8cc1Swenshuai.xi 	us->data_urb = usb_alloc_urb(0, GFP_KERNEL);
895*53ee8cc1Swenshuai.xi 	if (!us->data_urb) {
896*53ee8cc1Swenshuai.xi 		US_DEBUGP("URB allocation failed%s","\n");
897*53ee8cc1Swenshuai.xi 		return -ENOMEM;
898*53ee8cc1Swenshuai.xi 	}
899*53ee8cc1Swenshuai.xi 	us->status_urb = usb_alloc_urb(0, GFP_KERNEL);
900*53ee8cc1Swenshuai.xi 	if (!us->status_urb) {
901*53ee8cc1Swenshuai.xi 		US_DEBUGP("URB allocation failed%s","\n");
902*53ee8cc1Swenshuai.xi 		return -ENOMEM;
903*53ee8cc1Swenshuai.xi 	}
904*53ee8cc1Swenshuai.xi 
905*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
906*53ee8cc1Swenshuai.xi 	down(&us->dev_semaphore);
907*53ee8cc1Swenshuai.xi 
908*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
909*53ee8cc1Swenshuai.xi 	if (us->protocol == US_PR_BULK)
910*53ee8cc1Swenshuai.xi 		us->max_lun = usb_stor_Bulk_max_lun(us);
911*53ee8cc1Swenshuai.xi 
912*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
913*53ee8cc1Swenshuai.xi 	us->Mass_stor_device=(struct LUN_Device*)kmalloc(sizeof(struct LUN_Device)*(us->max_lun+1), GFP_KERNEL);
914*53ee8cc1Swenshuai.xi 	memset(us->Mass_stor_device,0 , sizeof(struct LUN_Device)*(us->max_lun+1));
915*53ee8cc1Swenshuai.xi 
916*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
917*53ee8cc1Swenshuai.xi 	if (us->unusual_dev->initFunction)
918*53ee8cc1Swenshuai.xi 		us->unusual_dev->initFunction(us);
919*53ee8cc1Swenshuai.xi 
920*53ee8cc1Swenshuai.xi 	up(&us->dev_semaphore);
921*53ee8cc1Swenshuai.xi 
922*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
923*53ee8cc1Swenshuai.xi 	us->sm_state = US_STATE_IDLE;
924*53ee8cc1Swenshuai.xi /*			//YPING??
925*53ee8cc1Swenshuai.xi 	p = kernel_thread(usb_stor_control_thread, us, CLONE_VM);
926*53ee8cc1Swenshuai.xi 	if (p < 0) {
927*53ee8cc1Swenshuai.xi 		printk(KERN_WARNING USB_STORAGE
928*53ee8cc1Swenshuai.xi 		       "Unable to start control thread\n");
929*53ee8cc1Swenshuai.xi 		return p;
930*53ee8cc1Swenshuai.xi 	}
931*53ee8cc1Swenshuai.xi 	us->pid = p;
932*53ee8cc1Swenshuai.xi */
933*53ee8cc1Swenshuai.xi 
934*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
935*53ee8cc1Swenshuai.xi //	wait_for_completion(&(us->notify));
936*53ee8cc1Swenshuai.xi 
937*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
938*53ee8cc1Swenshuai.xi /*	    	//YPING??
939*53ee8cc1Swenshuai.xi 	us->host = scsi_host_alloc(&usb_stor_host_template, sizeof(us));
940*53ee8cc1Swenshuai.xi 	if (!us->host) {
941*53ee8cc1Swenshuai.xi 		printk(KERN_WARNING USB_STORAGE
942*53ee8cc1Swenshuai.xi 			"Unable to register the scsi host\n");
943*53ee8cc1Swenshuai.xi 		return -EBUSY;
944*53ee8cc1Swenshuai.xi 	}
945*53ee8cc1Swenshuai.xi */
946*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
947*53ee8cc1Swenshuai.xi //	us->host->hostdata[0] = (unsigned long) us;		//YPING??
948*53ee8cc1Swenshuai.xi 
949*53ee8cc1Swenshuai.xi 	return 0;
950*53ee8cc1Swenshuai.xi }
951*53ee8cc1Swenshuai.xi 
952*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
dissociate_dev(struct us_data * us)953*53ee8cc1Swenshuai.xi static void dissociate_dev(struct us_data *us)
954*53ee8cc1Swenshuai.xi {
955*53ee8cc1Swenshuai.xi 
956*53ee8cc1Swenshuai.xi 	US_DEBUGP("-- %s\n", __FUNCTION__);
957*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
958*53ee8cc1Swenshuai.xi 	down(&us->dev_semaphore);
959*53ee8cc1Swenshuai.xi 
960*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
961*53ee8cc1Swenshuai.xi 	if (us->cr) {
962*53ee8cc1Swenshuai.xi 		usb_buffer_free(us->pusb_dev, sizeof(*us->cr), us->cr,
963*53ee8cc1Swenshuai.xi 				us->cr_dma);
964*53ee8cc1Swenshuai.xi 		us->cr = NULL;
965*53ee8cc1Swenshuai.xi 	}
966*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
967*53ee8cc1Swenshuai.xi 	if (us->iobuf) {
968*53ee8cc1Swenshuai.xi 		usb_buffer_free(us->pusb_dev, US_IOBUF_SIZE, us->iobuf,
969*53ee8cc1Swenshuai.xi 				us->iobuf_dma);
970*53ee8cc1Swenshuai.xi 		us->iobuf = NULL;
971*53ee8cc1Swenshuai.xi 	}
972*53ee8cc1Swenshuai.xi 
973*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
974*53ee8cc1Swenshuai.xi 	usb_set_intfdata(us->pusb_intf, NULL);
975*53ee8cc1Swenshuai.xi 	usb_put_dev(us->pusb_dev);
976*53ee8cc1Swenshuai.xi 
977*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
978*53ee8cc1Swenshuai.xi 	us->pusb_dev = NULL;
979*53ee8cc1Swenshuai.xi 	us->pusb_intf = NULL;
980*53ee8cc1Swenshuai.xi 	up(&us->dev_semaphore);
981*53ee8cc1Swenshuai.xi }
982*53ee8cc1Swenshuai.xi 
983*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_stor_release_resources(struct us_data * us)984*53ee8cc1Swenshuai.xi void usb_stor_release_resources(struct us_data *us)
985*53ee8cc1Swenshuai.xi {
986*53ee8cc1Swenshuai.xi diag_printf("usb_stor_release_resources\n");
987*53ee8cc1Swenshuai.xi     MS_U8   ii, iLun;
988*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
989*53ee8cc1Swenshuai.xi 
990*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
991*53ee8cc1Swenshuai.xi /*					//YPING??
992*53ee8cc1Swenshuai.xi 	if (us->host) {
993*53ee8cc1Swenshuai.xi 		(struct us_data *) us->host->hostdata[0] = NULL;
994*53ee8cc1Swenshuai.xi 		scsi_host_put(us->host);
995*53ee8cc1Swenshuai.xi 	}
996*53ee8cc1Swenshuai.xi */
997*53ee8cc1Swenshuai.xi 
998*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
999*53ee8cc1Swenshuai.xi /*	    			//YPING??
1000*53ee8cc1Swenshuai.xi 	if (us->pid) {
1001*53ee8cc1Swenshuai.xi 		US_DEBUGP("-- sending exit command to thread\n");
1002*53ee8cc1Swenshuai.xi 		BUG_ON(us->sm_state != US_STATE_IDLE);
1003*53ee8cc1Swenshuai.xi 		us->srb = NULL;
1004*53ee8cc1Swenshuai.xi 		up(&(us->sema));
1005*53ee8cc1Swenshuai.xi 		wait_for_completion(&(us->notify));
1006*53ee8cc1Swenshuai.xi 	}
1007*53ee8cc1Swenshuai.xi */
1008*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1009*53ee8cc1Swenshuai.xi 	if (us->extra_destructor) {
1010*53ee8cc1Swenshuai.xi 		US_DEBUGP("-- calling extra_destructor()%s","\n");
1011*53ee8cc1Swenshuai.xi 		us->extra_destructor(us->extra);
1012*53ee8cc1Swenshuai.xi 	}
1013*53ee8cc1Swenshuai.xi 
1014*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1015*53ee8cc1Swenshuai.xi 	if (us->extra)
1016*53ee8cc1Swenshuai.xi 		kfree(us->extra);
1017*53ee8cc1Swenshuai.xi 	if (us->current_urb)
1018*53ee8cc1Swenshuai.xi 		usb_free_urb(us->current_urb);
1019*53ee8cc1Swenshuai.xi 	if (us->data_urb)
1020*53ee8cc1Swenshuai.xi 		usb_free_urb(us->data_urb);
1021*53ee8cc1Swenshuai.xi 	if (us->status_urb)
1022*53ee8cc1Swenshuai.xi 		usb_free_urb(us->status_urb);
1023*53ee8cc1Swenshuai.xi 
1024*53ee8cc1Swenshuai.xi 	/* Free the structure itself */
1025*53ee8cc1Swenshuai.xi 	//vUSBDisk_FileSystem_Remove();
1026*53ee8cc1Swenshuai.xi 
1027*53ee8cc1Swenshuai.xi     for (ii=0; ii<NUM_OF_ROOT_HUB*MAX_USTOR; ii++)
1028*53ee8cc1Swenshuai.xi     {
1029*53ee8cc1Swenshuai.xi         if (Mass_stor_us[ii] == us)
1030*53ee8cc1Swenshuai.xi         {
1031*53ee8cc1Swenshuai.xi             for (iLun=0; iLun<=Mass_stor_us[ii]->max_lun; iLun++)
1032*53ee8cc1Swenshuai.xi                 RemoveUSBDiskPort(Mass_stor_us[ii]->ustor_id, iLun);
1033*53ee8cc1Swenshuai.xi 
1034*53ee8cc1Swenshuai.xi             Mass_stor_us[ii] = NULL;
1035*53ee8cc1Swenshuai.xi         }
1036*53ee8cc1Swenshuai.xi     }
1037*53ee8cc1Swenshuai.xi     if (us->Mass_stor_device)
1038*53ee8cc1Swenshuai.xi         kfree(us->Mass_stor_device);
1039*53ee8cc1Swenshuai.xi 
1040*53ee8cc1Swenshuai.xi   kfree(us);
1041*53ee8cc1Swenshuai.xi  // US_DEBUGP("-- %s finished\n", __FUNCTION__);
1042*53ee8cc1Swenshuai.xi //  US_DEBUGP("USB Mass Storage device disconnected\n");
1043*53ee8cc1Swenshuai.xi }
1044*53ee8cc1Swenshuai.xi 
1045*53ee8cc1Swenshuai.xi /* Get free ID from MAX_USTOR during one host controller support range */
GetUStorID(unsigned char startId)1046*53ee8cc1Swenshuai.xi int GetUStorID(unsigned char startId)
1047*53ee8cc1Swenshuai.xi {
1048*53ee8cc1Swenshuai.xi     int i;
1049*53ee8cc1Swenshuai.xi 
1050*53ee8cc1Swenshuai.xi     if (startId >= NUM_OF_ROOT_HUB*MAX_USTOR)
1051*53ee8cc1Swenshuai.xi         ASSERT(0);
1052*53ee8cc1Swenshuai.xi 
1053*53ee8cc1Swenshuai.xi     for (i=startId; i<startId+MAX_USTOR; i++)
1054*53ee8cc1Swenshuai.xi     {
1055*53ee8cc1Swenshuai.xi         if (Mass_stor_us[i] == NULL)
1056*53ee8cc1Swenshuai.xi             return i;
1057*53ee8cc1Swenshuai.xi     }
1058*53ee8cc1Swenshuai.xi 
1059*53ee8cc1Swenshuai.xi     diag_printf("!! ERROR: Exceed the max support number of usb storage device !!\n");
1060*53ee8cc1Swenshuai.xi     return (-1);
1061*53ee8cc1Swenshuai.xi }
1062*53ee8cc1Swenshuai.xi 
1063*53ee8cc1Swenshuai.xi 
1064*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
storage_probe(struct usb_interface * intf,const struct usb_device_id * id)1065*53ee8cc1Swenshuai.xi static int storage_probe(struct usb_interface *intf,
1066*53ee8cc1Swenshuai.xi 			 const struct usb_device_id *id)
1067*53ee8cc1Swenshuai.xi {
1068*53ee8cc1Swenshuai.xi 
1069*53ee8cc1Swenshuai.xi 	struct us_data *us;
1070*53ee8cc1Swenshuai.xi 	const int id_index = id - storage_usb_ids;
1071*53ee8cc1Swenshuai.xi 	int result,i;
1072*53ee8cc1Swenshuai.xi 	struct usb_device *pudev;
1073*53ee8cc1Swenshuai.xi 
1074*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1075*53ee8cc1Swenshuai.xi         diag_printf("storage_probe\n");
1076*53ee8cc1Swenshuai.xi 	US_DEBUGP("USB Mass Storage device detected%s","\n");
1077*53ee8cc1Swenshuai.xi 	US_DEBUGP("act_altsetting is %d, id_index is %d\n",
1078*53ee8cc1Swenshuai.xi 			intf->act_altsetting, id_index);
1079*53ee8cc1Swenshuai.xi 
1080*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1081*53ee8cc1Swenshuai.xi 	us = (struct us_data *) kmalloc(sizeof(*us), GFP_KERNEL);
1082*53ee8cc1Swenshuai.xi 	if (!us)
1083*53ee8cc1Swenshuai.xi         {
1084*53ee8cc1Swenshuai.xi 		US_DEBUGP("Out of memory %d\n", us);
1085*53ee8cc1Swenshuai.xi 		return -ENOMEM;
1086*53ee8cc1Swenshuai.xi 	}
1087*53ee8cc1Swenshuai.xi 
1088*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1089*53ee8cc1Swenshuai.xi 	memset(us, 0, sizeof(struct us_data));
1090*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1091*53ee8cc1Swenshuai.xi         init_MUTEX(&(us->dev_semaphore));
1092*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1093*53ee8cc1Swenshuai.xi 	init_MUTEX_LOCKED(&(us->sema));
1094*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1095*53ee8cc1Swenshuai.xi 	init_completion(&(us->notify));
1096*53ee8cc1Swenshuai.xi 
1097*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1098*53ee8cc1Swenshuai.xi 	result = associate_dev(us, intf);
1099*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1100*53ee8cc1Swenshuai.xi 	if (result)
1101*53ee8cc1Swenshuai.xi 	      goto BadDevice;
1102*53ee8cc1Swenshuai.xi 
1103*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1104*53ee8cc1Swenshuai.xi 	get_device_info(us, id_index);
1105*53ee8cc1Swenshuai.xi 
1106*53ee8cc1Swenshuai.xi #ifdef CONFIG_USB_STORAGE_SDDR09
1107*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1108*53ee8cc1Swenshuai.xi 	if (us->protocol == US_PR_EUSB_SDDR09 || us->protocol == US_PR_DPCM_USB)
1109*53ee8cc1Swenshuai.xi         {
1110*53ee8cc1Swenshuai.xi 		/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1111*53ee8cc1Swenshuai.xi 		result = usb_set_configuration(us->pusb_dev, 1);
1112*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1113*53ee8cc1Swenshuai.xi 		US_DEBUGP("Result from usb_set_configuration is %d\n", result);
1114*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1115*53ee8cc1Swenshuai.xi 		if (result == -EPIPE)
1116*53ee8cc1Swenshuai.xi                 {
1117*53ee8cc1Swenshuai.xi                         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1118*53ee8cc1Swenshuai.xi 			US_DEBUGP("-- stall on control interface\n");
1119*53ee8cc1Swenshuai.xi 		}
1120*53ee8cc1Swenshuai.xi                 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1121*53ee8cc1Swenshuai.xi                 else if (result != 0)
1122*53ee8cc1Swenshuai.xi                 {
1123*53ee8cc1Swenshuai.xi 			/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1124*53ee8cc1Swenshuai.xi 			US_DEBUGP("-- Unknown error.  Rejecting device\n");
1125*53ee8cc1Swenshuai.xi                         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1126*53ee8cc1Swenshuai.xi 			goto BadDevice;
1127*53ee8cc1Swenshuai.xi 		}
1128*53ee8cc1Swenshuai.xi 	}
1129*53ee8cc1Swenshuai.xi #endif
1130*53ee8cc1Swenshuai.xi 
1131*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1132*53ee8cc1Swenshuai.xi 	result = get_transport(us);
1133*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1134*53ee8cc1Swenshuai.xi 	if (result)
1135*53ee8cc1Swenshuai.xi 		goto BadDevice;
1136*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1137*53ee8cc1Swenshuai.xi 	result = get_protocol(us);
1138*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1139*53ee8cc1Swenshuai.xi 	if (result)
1140*53ee8cc1Swenshuai.xi 		goto BadDevice;
1141*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1142*53ee8cc1Swenshuai.xi 	result = get_pipes(us);
1143*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1144*53ee8cc1Swenshuai.xi 	if (result)
1145*53ee8cc1Swenshuai.xi 		goto BadDevice;
1146*53ee8cc1Swenshuai.xi 
1147*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1148*53ee8cc1Swenshuai.xi 	result = usb_stor_acquire_resources(us);
1149*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1150*53ee8cc1Swenshuai.xi 	if (result)
1151*53ee8cc1Swenshuai.xi 		goto BadDevice;
1152*53ee8cc1Swenshuai.xi 
1153*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1154*53ee8cc1Swenshuai.xi 	pudev = interface_to_usbdev(intf);
1155*53ee8cc1Swenshuai.xi         i = GetUStorID(MAX_USTOR* (((struct usb_hcd *)pudev->bus->hcpriv)->host_id));
1156*53ee8cc1Swenshuai.xi 
1157*53ee8cc1Swenshuai.xi     if (i != (-1))
1158*53ee8cc1Swenshuai.xi     {
1159*53ee8cc1Swenshuai.xi         Mass_stor_us[i] = us;
1160*53ee8cc1Swenshuai.xi         us->ustor_id = (unsigned char)i;
1161*53ee8cc1Swenshuai.xi         //diag_printf("storage_probe: get ustor_id: %d\n", i);
1162*53ee8cc1Swenshuai.xi     }
1163*53ee8cc1Swenshuai.xi     else
1164*53ee8cc1Swenshuai.xi         goto BadDevice;
1165*53ee8cc1Swenshuai.xi 
1166*53ee8cc1Swenshuai.xi         Mass_stor_us[i]->host_id = ((struct usb_hcd *)pudev->bus->hcpriv)->host_id;
1167*53ee8cc1Swenshuai.xi 
1168*53ee8cc1Swenshuai.xi 
1169*53ee8cc1Swenshuai.xi 	for(i = 0; i<=us->max_lun; i++)
1170*53ee8cc1Swenshuai.xi 		us->Mass_stor_device[i].bDeviceReady = FALSE;
1171*53ee8cc1Swenshuai.xi 	//Mass_stor_us->bFileSystemInit = FALSE;
1172*53ee8cc1Swenshuai.xi 
1173*53ee8cc1Swenshuai.xi 	kdbg("WARNING: USB Mass Storage data integrity not assured%s\n","");
1174*53ee8cc1Swenshuai.xi 
1175*53ee8cc1Swenshuai.xi 	US_DEBUGP("USB Mass Storage device found at %d\n", us->pusb_dev->devnum);
1176*53ee8cc1Swenshuai.xi 
1177*53ee8cc1Swenshuai.xi 	return 0;
1178*53ee8cc1Swenshuai.xi 
1179*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1180*53ee8cc1Swenshuai.xi BadDevice:
1181*53ee8cc1Swenshuai.xi 	US_DEBUGP("storage_probe() failed%s","\n");
1182*53ee8cc1Swenshuai.xi diag_printf("storage_probe() failed%s","\n");
1183*53ee8cc1Swenshuai.xi         /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1184*53ee8cc1Swenshuai.xi 	dissociate_dev(us);
1185*53ee8cc1Swenshuai.xi 
1186*53ee8cc1Swenshuai.xi 	usb_stor_release_resources(us);
1187*53ee8cc1Swenshuai.xi 
1188*53ee8cc1Swenshuai.xi 	return result;
1189*53ee8cc1Swenshuai.xi 
1190*53ee8cc1Swenshuai.xi }
1191*53ee8cc1Swenshuai.xi 
1192*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
storage_disconnect(struct usb_interface * intf)1193*53ee8cc1Swenshuai.xi static void storage_disconnect(struct usb_interface *intf)
1194*53ee8cc1Swenshuai.xi {
1195*53ee8cc1Swenshuai.xi 	struct us_data *us = (struct us_data*) usb_get_intfdata(intf);
1196*53ee8cc1Swenshuai.xi //	struct scsi_device *sdev;
1197*53ee8cc1Swenshuai.xi 
1198*53ee8cc1Swenshuai.xi 	diag_printf("storage_disconnect() : ustor_id: %d \n", us->ustor_id);
1199*53ee8cc1Swenshuai.xi 
1200*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1201*53ee8cc1Swenshuai.xi /*
1202*53ee8cc1Swenshuai.xi 	scsi_lock(us->host);
1203*53ee8cc1Swenshuai.xi 	list_for_each_entry(sdev, &us->host->my_devices, siblings)
1204*53ee8cc1Swenshuai.xi 		sdev->online = 0;
1205*53ee8cc1Swenshuai.xi 	scsi_unlock(us->host);
1206*53ee8cc1Swenshuai.xi */
1207*53ee8cc1Swenshuai.xi 
1208*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1209*53ee8cc1Swenshuai.xi 	set_bit(US_FLIDX_DISCONNECTING, &us->flags, unsigned long);
1210*53ee8cc1Swenshuai.xi 	usb_stor_stop_transport(us);
1211*53ee8cc1Swenshuai.xi 
1212*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1213*53ee8cc1Swenshuai.xi 	dissociate_dev(us);
1214*53ee8cc1Swenshuai.xi 
1215*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1216*53ee8cc1Swenshuai.xi /*
1217*53ee8cc1Swenshuai.xi 	if (scsi_remove_host(us->host))
1218*53ee8cc1Swenshuai.xi 	{
1219*53ee8cc1Swenshuai.xi 		US_DEBUGP("-- SCSI refused to remove the host\n");
1220*53ee8cc1Swenshuai.xi 		BUG();
1221*53ee8cc1Swenshuai.xi 		return;
1222*53ee8cc1Swenshuai.xi 	}
1223*53ee8cc1Swenshuai.xi */
1224*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1225*53ee8cc1Swenshuai.xi 	usb_stor_release_resources(us);
1226*53ee8cc1Swenshuai.xi }
1227*53ee8cc1Swenshuai.xi 
1228*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1229*53ee8cc1Swenshuai.xi 
usb_stor_init(void)1230*53ee8cc1Swenshuai.xi int  usb_stor_init(void)
1231*53ee8cc1Swenshuai.xi {
1232*53ee8cc1Swenshuai.xi 	printk(KERN_INFO "Initializing USB Mass Storage driver...\n");
1233*53ee8cc1Swenshuai.xi 
1234*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1235*53ee8cc1Swenshuai.xi 	if (usb_register(&usb_storage_driver) < 0)
1236*53ee8cc1Swenshuai.xi 		return -1;
1237*53ee8cc1Swenshuai.xi 
1238*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1239*53ee8cc1Swenshuai.xi 	printk(KERN_INFO "USB Mass Storage support registered.\n");
1240*53ee8cc1Swenshuai.xi 	return 0;
1241*53ee8cc1Swenshuai.xi }
1242*53ee8cc1Swenshuai.xi 
1243*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
usb_stor_exit(void)1244*53ee8cc1Swenshuai.xi void  usb_stor_exit(void)
1245*53ee8cc1Swenshuai.xi {
1246*53ee8cc1Swenshuai.xi 
1247*53ee8cc1Swenshuai.xi 	US_DEBUGP("usb_stor_exit() called%s","\n");
1248*53ee8cc1Swenshuai.xi 
1249*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1250*53ee8cc1Swenshuai.xi 	US_DEBUGP("-- calling usb_deregister()%s","\n");
1251*53ee8cc1Swenshuai.xi 	usb_deregister(&usb_storage_driver) ;
1252*53ee8cc1Swenshuai.xi 
1253*53ee8cc1Swenshuai.xi #if 0
1254*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1255*53ee8cc1Swenshuai.xi 	for (next = us_list; next; next = next->next) {
1256*53ee8cc1Swenshuai.xi 		US_DEBUGP("-- calling scsi_unregister_host()\n");
1257*53ee8cc1Swenshuai.xi 		scsi_unregister_host(&usb_stor_host_template);
1258*53ee8cc1Swenshuai.xi 	}
1259*53ee8cc1Swenshuai.xi 
1260*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1261*53ee8cc1Swenshuai.xi 	while (us_list) {
1262*53ee8cc1Swenshuai.xi 		/* keep track of where the next one is */
1263*53ee8cc1Swenshuai.xi 		next = us_list->next;
1264*53ee8cc1Swenshuai.xi 
1265*53ee8cc1Swenshuai.xi 		/* If there's extra data in the us_data structure then
1266*53ee8cc1Swenshuai.xi 		 * free that first */
1267*53ee8cc1Swenshuai.xi 		if (us_list->extra) {
1268*53ee8cc1Swenshuai.xi 			/* call the destructor routine, if it exists */
1269*53ee8cc1Swenshuai.xi 			if (us_list->extra_destructor) {
1270*53ee8cc1Swenshuai.xi 				US_DEBUGP("-- calling extra_destructor()\n");
1271*53ee8cc1Swenshuai.xi 				us_list->extra_destructor(us_list->extra);
1272*53ee8cc1Swenshuai.xi 			}
1273*53ee8cc1Swenshuai.xi 
1274*53ee8cc1Swenshuai.xi 			/* destroy the extra data */
1275*53ee8cc1Swenshuai.xi 			US_DEBUGP("-- freeing the data structure\n");
1276*53ee8cc1Swenshuai.xi 			kfree(us_list->extra);
1277*53ee8cc1Swenshuai.xi 		}
1278*53ee8cc1Swenshuai.xi 
1279*53ee8cc1Swenshuai.xi 		/* free the structure itself */
1280*53ee8cc1Swenshuai.xi 		kfree (us_list);
1281*53ee8cc1Swenshuai.xi 
1282*53ee8cc1Swenshuai.xi 		/* advance the list pointer */
1283*53ee8cc1Swenshuai.xi 		us_list = next;
1284*53ee8cc1Swenshuai.xi 	}
1285*53ee8cc1Swenshuai.xi #endif
1286*53ee8cc1Swenshuai.xi }
1287*53ee8cc1Swenshuai.xi 
1288*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1289*53ee8cc1Swenshuai.xi  /*
1290*53ee8cc1Swenshuai.xi int Test_and_Clear_Bit(int nr, void *addr)
1291*53ee8cc1Swenshuai.xi {
1292*53ee8cc1Swenshuai.xi 	U32 mask, retval;
1293*53ee8cc1Swenshuai.xi 	U32 *adr = (U32 *)addr;
1294*53ee8cc1Swenshuai.xi 
1295*53ee8cc1Swenshuai.xi 	adr += nr >> 5;
1296*53ee8cc1Swenshuai.xi 	mask = 1 << (nr & 0x1f);
1297*53ee8cc1Swenshuai.xi 	retval = (mask & *adr) != 0;
1298*53ee8cc1Swenshuai.xi 	*adr &= ~mask;
1299*53ee8cc1Swenshuai.xi 	return retval;
1300*53ee8cc1Swenshuai.xi }
1301*53ee8cc1Swenshuai.xi 
1302*53ee8cc1Swenshuai.xi  int Test_Bit(int nr, long * addr)
1303*53ee8cc1Swenshuai.xi {
1304*53ee8cc1Swenshuai.xi 	int	mask;
1305*53ee8cc1Swenshuai.xi 
1306*53ee8cc1Swenshuai.xi 	addr += nr >> 5;
1307*53ee8cc1Swenshuai.xi 	mask = 1 << (nr & 0x1f);
1308*53ee8cc1Swenshuai.xi 	return ((mask & *addr) != 0);
1309*53ee8cc1Swenshuai.xi }
1310*53ee8cc1Swenshuai.xi */
1311*53ee8cc1Swenshuai.xi 
1312*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
1313*53ee8cc1Swenshuai.xi 
1314*53ee8cc1Swenshuai.xi #endif	//#ifdef
1315*53ee8cc1Swenshuai.xi 
1316