xref: /utopia/UTPA2-700.0.x/modules/usb/drv/usbhost/source/usb_host_p1/drvScsi.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 // Copyright (c) 2006-2008 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // (��MStar Confidential Information��) by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_NOS)
95*53ee8cc1Swenshuai.xi #include "../USBHostConfig.h"
96*53ee8cc1Swenshuai.xi #include <stdlib.h>
97*53ee8cc1Swenshuai.xi #ifndef ATV_SERISE_USE
98*53ee8cc1Swenshuai.xi #include <stdio.h>
99*53ee8cc1Swenshuai.xi #endif
100*53ee8cc1Swenshuai.xi #include <string.h>
101*53ee8cc1Swenshuai.xi #ifndef ATV_SERISE_USE
102*53ee8cc1Swenshuai.xi #include "../../include/datatype.h"
103*53ee8cc1Swenshuai.xi #else
104*53ee8cc1Swenshuai.xi #include "UsbHostDataDef.h"
105*53ee8cc1Swenshuai.xi #endif
106*53ee8cc1Swenshuai.xi #include "../drvHostLib.h"
107*53ee8cc1Swenshuai.xi #include "../drvHost200.h"
108*53ee8cc1Swenshuai.xi #include "../drvscsi.h"
109*53ee8cc1Swenshuai.xi #include "../drvMassStorage.h"
110*53ee8cc1Swenshuai.xi #ifdef ATV_SERISE_USE
111*53ee8cc1Swenshuai.xi #include "Board.h"
112*53ee8cc1Swenshuai.xi #include "common.h"
113*53ee8cc1Swenshuai.xi #include "uart.h"
114*53ee8cc1Swenshuai.xi #endif
115*53ee8cc1Swenshuai.xi #include "../drvUsbMain.h"
116*53ee8cc1Swenshuai.xi #include "../../include/_drvUSB.h"
117*53ee8cc1Swenshuai.xi #include "MsCommon.h"
118*53ee8cc1Swenshuai.xi #include "MsIRQ.h"
119*53ee8cc1Swenshuai.xi #include "MsOS.h"
120*53ee8cc1Swenshuai.xi 
121*53ee8cc1Swenshuai.xi extern void msAPI_Timer_ResetWDT(void);
122*53ee8cc1Swenshuai.xi 
123*53ee8cc1Swenshuai.xi #define DRV_SCSI_DBG(x) // x;
124*53ee8cc1Swenshuai.xi 
125*53ee8cc1Swenshuai.xi //struct us_data xdata *Mass_stor_us;
126*53ee8cc1Swenshuai.xi #define MAX_LUN_SUPPORT    5
127*53ee8cc1Swenshuai.xi 
128*53ee8cc1Swenshuai.xi struct us_data  Mass_stor_us1;
129*53ee8cc1Swenshuai.xi #if 1
130*53ee8cc1Swenshuai.xi struct LUN_Device  Mass_stor_device[MAX_LUN_SUPPORT]; //support 4 LUN
131*53ee8cc1Swenshuai.xi #else
132*53ee8cc1Swenshuai.xi struct LUN_Device  Mass_stor_device_1; //support 4 LUN
133*53ee8cc1Swenshuai.xi struct LUN_Device  Mass_stor_device_2;
134*53ee8cc1Swenshuai.xi struct LUN_Device  Mass_stor_device_3;
135*53ee8cc1Swenshuai.xi struct LUN_Device  Mass_stor_device_4;
136*53ee8cc1Swenshuai.xi struct LUN_Device  Mass_stor_device_5;
137*53ee8cc1Swenshuai.xi #endif
138*53ee8cc1Swenshuai.xi 
139*53ee8cc1Swenshuai.xi extern UINT8  pUsbData[1024];
140*53ee8cc1Swenshuai.xi Scsi_Cmnd  srb_data;
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi UINT8 u8Drive = 0;
143*53ee8cc1Swenshuai.xi extern U8 gUsbStatus;
144*53ee8cc1Swenshuai.xi extern U8 gSpeed;
145*53ee8cc1Swenshuai.xi 
146*53ee8cc1Swenshuai.xi struct stForceModeSense1A
147*53ee8cc1Swenshuai.xi {
148*53ee8cc1Swenshuai.xi     U16     VID;
149*53ee8cc1Swenshuai.xi     U16     PID;
150*53ee8cc1Swenshuai.xi } stForceModeSense1A;
151*53ee8cc1Swenshuai.xi 
152*53ee8cc1Swenshuai.xi struct stForceModeSense1A gForceModeSense1A[] =
153*53ee8cc1Swenshuai.xi {
154*53ee8cc1Swenshuai.xi         {0x0DD8, 0x1448},
155*53ee8cc1Swenshuai.xi         {0x1AA6, 0x0201},
156*53ee8cc1Swenshuai.xi         {0x0DD8, 0x1414},
157*53ee8cc1Swenshuai.xi         {0x0DD8, 0x1400},
158*53ee8cc1Swenshuai.xi         {0x0DD8, 0xE203},
159*53ee8cc1Swenshuai.xi         {0x8644, 0x800a},           //alan.yu add on 2010.08.13 (�Ϲ� ����)
160*53ee8cc1Swenshuai.xi         {0x0DD8, 0xD202},           //alan.yu add on 2010.08.16 (�ʿ�Netac)
161*53ee8cc1Swenshuai.xi         {0x18A5,0x302},             //alan.yu add on 2011.08.01
162*53ee8cc1Swenshuai.xi         {0, 0}
163*53ee8cc1Swenshuai.xi };
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi extern void MDrv_USBGetVIDPID(U16 *pVID, U16 *pPID);
166*53ee8cc1Swenshuai.xi 
167*53ee8cc1Swenshuai.xi //BOOLEAN gDeviceFatalError=FALSE;
Init_Mass_Storage_Structure(void)168*53ee8cc1Swenshuai.xi void Init_Mass_Storage_Structure(void)
169*53ee8cc1Swenshuai.xi {
170*53ee8cc1Swenshuai.xi   U16   uVID, uPID;
171*53ee8cc1Swenshuai.xi   //Mass_stor_us=&Mass_stor_us1;
172*53ee8cc1Swenshuai.xi   memset(&Mass_stor_device[0], 0, sizeof(Mass_stor_device[0]));
173*53ee8cc1Swenshuai.xi   Mass_stor_us1.Mass_stor_device=&Mass_stor_device[0];
174*53ee8cc1Swenshuai.xi #ifdef   ENABLE_CBI_HOST
175*53ee8cc1Swenshuai.xi   if ( (sAttachDevice.saCD[0].sInterface[0].bInterfaceProtocol==0x00)||
176*53ee8cc1Swenshuai.xi        (sAttachDevice.saCD[0].sInterface[0].bInterfaceProtocol==0x01) )
177*53ee8cc1Swenshuai.xi     Mass_stor_us1.max_lun=0;
178*53ee8cc1Swenshuai.xi   else
179*53ee8cc1Swenshuai.xi #endif
180*53ee8cc1Swenshuai.xi   {
181*53ee8cc1Swenshuai.xi     MDrv_USBGetVIDPID(&uVID, &uPID);
182*53ee8cc1Swenshuai.xi     //printf("MAXLUN VID: %x, PID: %x\n", uVID, uPID);
183*53ee8cc1Swenshuai.xi     if ( ((uVID == 0x8564) && (uPID == 0x1000)) ||
184*53ee8cc1Swenshuai.xi          ((uVID == 0xFCA) && (uPID == 0x8004)) ) //20130301, for blackberry phone
185*53ee8cc1Swenshuai.xi         Mass_stor_us1.max_lun = 0;
186*53ee8cc1Swenshuai.xi     else
187*53ee8cc1Swenshuai.xi         Mass_stor_us1.max_lun=   Host20_MSCD_GetMaxLUN();
188*53ee8cc1Swenshuai.xi   }
189*53ee8cc1Swenshuai.xi 
190*53ee8cc1Swenshuai.xi     if (Mass_stor_us1.max_lun > (MAX_LUN_SUPPORT-1) )
191*53ee8cc1Swenshuai.xi         Mass_stor_us1.max_lun = MAX_LUN_SUPPORT-1;
192*53ee8cc1Swenshuai.xi 
193*53ee8cc1Swenshuai.xi   //printf("Max Lun:%02bx\n",Mass_stor_us1.max_lun);
194*53ee8cc1Swenshuai.xi }
195*53ee8cc1Swenshuai.xi //***************************************************************************************
196*53ee8cc1Swenshuai.xi // Function Name: vSCSICmd_READ_10
197*53ee8cc1Swenshuai.xi // Description:
198*53ee8cc1Swenshuai.xi // Input:
199*53ee8cc1Swenshuai.xi // Output:
200*53ee8cc1Swenshuai.xi // Status:S
201*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSICmd_READ_WRITE_10(BOOLEAN DoWrite,struct us_data * us,Scsi_Cmnd * srb,INT8U u8LunNum,INT32U u32BlockAddr,INT16U u16BlockNum,U32 u8Buffer)202*53ee8cc1Swenshuai.xi void vSCSICmd_READ_WRITE_10(BOOLEAN DoWrite,struct us_data *us, Scsi_Cmnd *srb, INT8U u8LunNum,
203*53ee8cc1Swenshuai.xi 							  INT32U u32BlockAddr, INT16U u16BlockNum, U32 u8Buffer)
204*53ee8cc1Swenshuai.xi {
205*53ee8cc1Swenshuai.xi 
206*53ee8cc1Swenshuai.xi 
207*53ee8cc1Swenshuai.xi   /* set the command and the LUN */
208*53ee8cc1Swenshuai.xi   #if 0
209*53ee8cc1Swenshuai.xi   memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
210*53ee8cc1Swenshuai.xi   srb->cmnd[0] = READ_10;
211*53ee8cc1Swenshuai.xi 
212*53ee8cc1Swenshuai.xi   srb->cmnd[2] = (INT8U)(u32BlockAddr >> 24);
213*53ee8cc1Swenshuai.xi   srb->cmnd[3] = (INT8U)(u32BlockAddr >> 16);
214*53ee8cc1Swenshuai.xi   srb->cmnd[4] = (INT8U)(u32BlockAddr >> 8);
215*53ee8cc1Swenshuai.xi   srb->cmnd[5] = (INT8U)(u32BlockAddr);
216*53ee8cc1Swenshuai.xi 
217*53ee8cc1Swenshuai.xi   srb->cmnd[7] = (INT8U)(u16BlockNum >> 8);
218*53ee8cc1Swenshuai.xi   srb->cmnd[8] = (INT8U)(u16BlockNum );
219*53ee8cc1Swenshuai.xi   #endif
220*53ee8cc1Swenshuai.xi   if (DoWrite)
221*53ee8cc1Swenshuai.xi     OTGH_PT_BLK.sCBW.u8CB[0]=WRITE_10;
222*53ee8cc1Swenshuai.xi   else
223*53ee8cc1Swenshuai.xi     OTGH_PT_BLK.sCBW.u8CB[0]=READ_10;
224*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[1]=0;
225*53ee8cc1Swenshuai.xi 
226*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[2]= (INT8U)(u32BlockAddr >> 24);
227*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[3]= (INT8U)(u32BlockAddr >> 16);
228*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[4]= (INT8U)(u32BlockAddr >> 8);
229*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[5]= (INT8U)(u32BlockAddr);
230*53ee8cc1Swenshuai.xi 
231*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[7] = (INT8U)(u16BlockNum >> 8);
232*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[8] = (INT8U)(u16BlockNum );
233*53ee8cc1Swenshuai.xi 
234*53ee8cc1Swenshuai.xi 
235*53ee8cc1Swenshuai.xi   /* FIXME: we must do the protocol translation here */
236*53ee8cc1Swenshuai.xi   /*
237*53ee8cc1Swenshuai.xi   if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
238*53ee8cc1Swenshuai.xi     srb->cmd_len = 6;
239*53ee8cc1Swenshuai.xi   else
240*53ee8cc1Swenshuai.xi 	srb->cmd_len = 12;
241*53ee8cc1Swenshuai.xi   */
242*53ee8cc1Swenshuai.xi   srb->cmd_len = 10;
243*53ee8cc1Swenshuai.xi 
244*53ee8cc1Swenshuai.xi   /* set the transfer direction */
245*53ee8cc1Swenshuai.xi   if (DoWrite)
246*53ee8cc1Swenshuai.xi   	srb->sc_data_direction = SCSI_DATA_WRITE;
247*53ee8cc1Swenshuai.xi   else
248*53ee8cc1Swenshuai.xi 	srb->sc_data_direction = SCSI_DATA_READ;
249*53ee8cc1Swenshuai.xi 
250*53ee8cc1Swenshuai.xi   /* use the new buffer we have */
251*53ee8cc1Swenshuai.xi   srb->request_buffer= u8Buffer;
252*53ee8cc1Swenshuai.xi 
253*53ee8cc1Swenshuai.xi   /* set the buffer length for transfer */
254*53ee8cc1Swenshuai.xi   srb->request_bufflen = (us->Mass_stor_device[u8LunNum].u32BlockSize)*u16BlockNum;
255*53ee8cc1Swenshuai.xi 
256*53ee8cc1Swenshuai.xi   /* set up for no scatter-gather use */
257*53ee8cc1Swenshuai.xi   //srb->use_sg = 0;
258*53ee8cc1Swenshuai.xi 
259*53ee8cc1Swenshuai.xi   /* change the serial number -- toggle the high bit*/
260*53ee8cc1Swenshuai.xi   //srb->serial_number ^= 0x80000000;
261*53ee8cc1Swenshuai.xi 
262*53ee8cc1Swenshuai.xi   /* set Lun number*/
263*53ee8cc1Swenshuai.xi   srb->lun= u8LunNum;
264*53ee8cc1Swenshuai.xi 
265*53ee8cc1Swenshuai.xi   //srb->scsi_done = vScsi_SendCmd_Done;
266*53ee8cc1Swenshuai.xi 
267*53ee8cc1Swenshuai.xi 
268*53ee8cc1Swenshuai.xi 
269*53ee8cc1Swenshuai.xi }
270*53ee8cc1Swenshuai.xi #if 0
271*53ee8cc1Swenshuai.xi //***************************************************************************************
272*53ee8cc1Swenshuai.xi // Function Name:
273*53ee8cc1Swenshuai.xi // Description:
274*53ee8cc1Swenshuai.xi // Input:
275*53ee8cc1Swenshuai.xi // Output:
276*53ee8cc1Swenshuai.xi // Status:S
277*53ee8cc1Swenshuai.xi //***************************************************************************************
278*53ee8cc1Swenshuai.xi void vSCSICmd_WRITE_10(struct us_data *us, Scsi_Cmnd *srb,  INT8U u8LunNum,
279*53ee8cc1Swenshuai.xi 							  INT32U u32BlockAddr, INT16U u16BlockNum, U32 u8Buffer)
280*53ee8cc1Swenshuai.xi {
281*53ee8cc1Swenshuai.xi 
282*53ee8cc1Swenshuai.xi 
283*53ee8cc1Swenshuai.xi   /* set the command and the LUN */
284*53ee8cc1Swenshuai.xi   #if 0
285*53ee8cc1Swenshuai.xi   memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
286*53ee8cc1Swenshuai.xi   srb->cmnd[0] = WRITE_10;
287*53ee8cc1Swenshuai.xi 
288*53ee8cc1Swenshuai.xi   srb->cmnd[2] = (INT8U)(u32BlockAddr >> 24);
289*53ee8cc1Swenshuai.xi   srb->cmnd[3] = (INT8U)(u32BlockAddr >> 16);
290*53ee8cc1Swenshuai.xi   srb->cmnd[4] = (INT8U)(u32BlockAddr >> 8);
291*53ee8cc1Swenshuai.xi   srb->cmnd[5] = (INT8U)(u32BlockAddr);
292*53ee8cc1Swenshuai.xi 
293*53ee8cc1Swenshuai.xi   srb->cmnd[7] = (INT8U)(u16BlockNum >> 8);
294*53ee8cc1Swenshuai.xi   srb->cmnd[8] = (INT8U)(u16BlockNum );
295*53ee8cc1Swenshuai.xi   #endif
296*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[0]=WRITE_10;
297*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[1]=0;
298*53ee8cc1Swenshuai.xi 
299*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[2]= (INT8U)(u32BlockAddr >> 24);
300*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[3]= (INT8U)(u32BlockAddr >> 16);
301*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[4]= (INT8U)(u32BlockAddr >> 8);
302*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[5]= (INT8U)(u32BlockAddr);
303*53ee8cc1Swenshuai.xi 
304*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[7] = (INT8U)(u16BlockNum >> 8);
305*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[8] = (INT8U)(u16BlockNum );
306*53ee8cc1Swenshuai.xi 
307*53ee8cc1Swenshuai.xi   /* FIXME: we must do the protocol translation here */
308*53ee8cc1Swenshuai.xi   /*
309*53ee8cc1Swenshuai.xi   if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
310*53ee8cc1Swenshuai.xi     srb->cmd_len = 6;
311*53ee8cc1Swenshuai.xi   else
312*53ee8cc1Swenshuai.xi 	srb->cmd_len = 12;
313*53ee8cc1Swenshuai.xi   */
314*53ee8cc1Swenshuai.xi   srb->cmd_len = CB_LENGTH_WRITE_10;
315*53ee8cc1Swenshuai.xi 
316*53ee8cc1Swenshuai.xi   /* set the transfer direction */
317*53ee8cc1Swenshuai.xi   srb->sc_data_direction = SCSI_DATA_WRITE;
318*53ee8cc1Swenshuai.xi 
319*53ee8cc1Swenshuai.xi   /* use the new buffer we have */
320*53ee8cc1Swenshuai.xi   srb->phy_buf_adr=u8Buffer;
321*53ee8cc1Swenshuai.xi   srb->buffer_type=BUFFER_PHY;
322*53ee8cc1Swenshuai.xi 
323*53ee8cc1Swenshuai.xi   /* set the buffer length for transfer */
324*53ee8cc1Swenshuai.xi   srb->request_bufflen = us->Mass_stor_device[u8LunNum].u32BlockSize*u16BlockNum;
325*53ee8cc1Swenshuai.xi 
326*53ee8cc1Swenshuai.xi   /* set up for no scatter-gather use */
327*53ee8cc1Swenshuai.xi   //srb->use_sg = 0;
328*53ee8cc1Swenshuai.xi 
329*53ee8cc1Swenshuai.xi   /* change the serial number -- toggle the high bit*/
330*53ee8cc1Swenshuai.xi   //srb->serial_number ^= 0x80000000;
331*53ee8cc1Swenshuai.xi 
332*53ee8cc1Swenshuai.xi   /* set Lun number*/
333*53ee8cc1Swenshuai.xi   srb->lun= u8LunNum;
334*53ee8cc1Swenshuai.xi 
335*53ee8cc1Swenshuai.xi   //srb->scsi_done = vScsi_SendCmd_Done;
336*53ee8cc1Swenshuai.xi 
337*53ee8cc1Swenshuai.xi 
338*53ee8cc1Swenshuai.xi }
339*53ee8cc1Swenshuai.xi #endif
340*53ee8cc1Swenshuai.xi //***************************************************************************************
341*53ee8cc1Swenshuai.xi // Function Name:
342*53ee8cc1Swenshuai.xi // Description:
343*53ee8cc1Swenshuai.xi // Input:
344*53ee8cc1Swenshuai.xi // Output:
345*53ee8cc1Swenshuai.xi // Status:S
346*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSICmd_INQUIRY(Scsi_Cmnd * srb,INT8U * u8Buffer)347*53ee8cc1Swenshuai.xi void vSCSICmd_INQUIRY( Scsi_Cmnd *srb, INT8U *u8Buffer)
348*53ee8cc1Swenshuai.xi {
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi 
351*53ee8cc1Swenshuai.xi   /* set the command and the LUN */
352*53ee8cc1Swenshuai.xi   //memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
353*53ee8cc1Swenshuai.xi   //srb->cmnd[0] = INQUIRY;
354*53ee8cc1Swenshuai.xi   //srb->cmnd[4] = DATA_LENGTH_INQUIRY;
355*53ee8cc1Swenshuai.xi   memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
356*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[0]= INQUIRY;
357*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[4]= DATA_LENGTH_INQUIRY;
358*53ee8cc1Swenshuai.xi 
359*53ee8cc1Swenshuai.xi   /* FIXME: we must do the protocol translation here */
360*53ee8cc1Swenshuai.xi   /*
361*53ee8cc1Swenshuai.xi   if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
362*53ee8cc1Swenshuai.xi     srb->cmd_len = 6;
363*53ee8cc1Swenshuai.xi   else
364*53ee8cc1Swenshuai.xi 	srb->cmd_len = 12;
365*53ee8cc1Swenshuai.xi   */
366*53ee8cc1Swenshuai.xi   srb->cmd_len = CB_LENGTH_INQUIRY;
367*53ee8cc1Swenshuai.xi 
368*53ee8cc1Swenshuai.xi   /* set the transfer direction */
369*53ee8cc1Swenshuai.xi   srb->sc_data_direction = SCSI_DATA_READ;
370*53ee8cc1Swenshuai.xi 
371*53ee8cc1Swenshuai.xi   /* use the new buffer we have */
372*53ee8cc1Swenshuai.xi     srb->request_buffer = (U32)u8Buffer;
373*53ee8cc1Swenshuai.xi 
374*53ee8cc1Swenshuai.xi   /* set the buffer length for transfer */
375*53ee8cc1Swenshuai.xi   srb->request_bufflen = DATA_LENGTH_INQUIRY;
376*53ee8cc1Swenshuai.xi 
377*53ee8cc1Swenshuai.xi   /* set up for no scatter-gather use */
378*53ee8cc1Swenshuai.xi   //srb->use_sg = 0;
379*53ee8cc1Swenshuai.xi 
380*53ee8cc1Swenshuai.xi   /* change the serial number -- toggle the high bit*/
381*53ee8cc1Swenshuai.xi   //srb->serial_number ^= 0x80000000;
382*53ee8cc1Swenshuai.xi 
383*53ee8cc1Swenshuai.xi   /* set Lun number*/
384*53ee8cc1Swenshuai.xi   //srb->lun= u8Drive;//0;
385*53ee8cc1Swenshuai.xi 
386*53ee8cc1Swenshuai.xi   //srb->scsi_done = vScsi_SendCmd_Done;
387*53ee8cc1Swenshuai.xi 
388*53ee8cc1Swenshuai.xi 
389*53ee8cc1Swenshuai.xi }
390*53ee8cc1Swenshuai.xi //***************************************************************************************
391*53ee8cc1Swenshuai.xi // Function Name:
392*53ee8cc1Swenshuai.xi // Description:
393*53ee8cc1Swenshuai.xi // Input:
394*53ee8cc1Swenshuai.xi // Output:
395*53ee8cc1Swenshuai.xi // Status:S
396*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSICmd_READ_CAPACITY(Scsi_Cmnd * srb,INT8U * u8Buffer)397*53ee8cc1Swenshuai.xi void vSCSICmd_READ_CAPACITY( Scsi_Cmnd *srb, INT8U *u8Buffer)
398*53ee8cc1Swenshuai.xi {
399*53ee8cc1Swenshuai.xi 
400*53ee8cc1Swenshuai.xi   /* set the command and the LUN */
401*53ee8cc1Swenshuai.xi   //memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
402*53ee8cc1Swenshuai.xi   //srb->cmnd[0] = READ_CAPACITY;
403*53ee8cc1Swenshuai.xi   memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
404*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[0]= READ_CAPACITY;
405*53ee8cc1Swenshuai.xi 
406*53ee8cc1Swenshuai.xi   /* FIXME: we must do the protocol translation here */
407*53ee8cc1Swenshuai.xi   /*
408*53ee8cc1Swenshuai.xi   if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
409*53ee8cc1Swenshuai.xi     srb->cmd_len = 6;
410*53ee8cc1Swenshuai.xi   else
411*53ee8cc1Swenshuai.xi 	srb->cmd_len = 12;
412*53ee8cc1Swenshuai.xi   */
413*53ee8cc1Swenshuai.xi   srb->cmd_len = CB_LENGTH_READ_CAPACITY;
414*53ee8cc1Swenshuai.xi 
415*53ee8cc1Swenshuai.xi   /* set the transfer direction */
416*53ee8cc1Swenshuai.xi   srb->sc_data_direction = SCSI_DATA_READ;
417*53ee8cc1Swenshuai.xi 
418*53ee8cc1Swenshuai.xi   /* use the new buffer we have */
419*53ee8cc1Swenshuai.xi     srb->request_buffer = (U32)u8Buffer;
420*53ee8cc1Swenshuai.xi 
421*53ee8cc1Swenshuai.xi   /* set the buffer length for transfer */
422*53ee8cc1Swenshuai.xi   srb->request_bufflen = DATA_LENGTH_READ_CAPACITY;
423*53ee8cc1Swenshuai.xi 
424*53ee8cc1Swenshuai.xi   /* set up for no scatter-gather use */
425*53ee8cc1Swenshuai.xi   //srb->use_sg = 0;
426*53ee8cc1Swenshuai.xi 
427*53ee8cc1Swenshuai.xi   /* change the serial number -- toggle the high bit*/
428*53ee8cc1Swenshuai.xi   //srb->serial_number ^= 0x80000000;
429*53ee8cc1Swenshuai.xi 
430*53ee8cc1Swenshuai.xi   /* set Lun number*/
431*53ee8cc1Swenshuai.xi   //srb->lun= u8Drive;
432*53ee8cc1Swenshuai.xi 
433*53ee8cc1Swenshuai.xi   //srb->scsi_done = vScsi_SendCmd_Done;
434*53ee8cc1Swenshuai.xi 
435*53ee8cc1Swenshuai.xi 
436*53ee8cc1Swenshuai.xi }
437*53ee8cc1Swenshuai.xi 
vSCSICmd_READ_FORMAT_CAPACITY(Scsi_Cmnd * srb,INT8U * u8Buffer)438*53ee8cc1Swenshuai.xi void vSCSICmd_READ_FORMAT_CAPACITY( Scsi_Cmnd *srb, INT8U *u8Buffer)
439*53ee8cc1Swenshuai.xi {
440*53ee8cc1Swenshuai.xi 
441*53ee8cc1Swenshuai.xi   /* set the command and the LUN */
442*53ee8cc1Swenshuai.xi   //memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
443*53ee8cc1Swenshuai.xi   //srb->cmnd[0] = READ_CAPACITY;
444*53ee8cc1Swenshuai.xi   memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
445*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[0]= READ_FORMAT_CAPACITY;
446*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[8]= 12; //Length
447*53ee8cc1Swenshuai.xi 
448*53ee8cc1Swenshuai.xi   /* FIXME: we must do the protocol translation here */
449*53ee8cc1Swenshuai.xi   /*
450*53ee8cc1Swenshuai.xi   if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
451*53ee8cc1Swenshuai.xi     srb->cmd_len = 6;
452*53ee8cc1Swenshuai.xi   else
453*53ee8cc1Swenshuai.xi 	srb->cmd_len = 12;
454*53ee8cc1Swenshuai.xi   */
455*53ee8cc1Swenshuai.xi   srb->cmd_len = CB_LENGTH_READ_CAPACITY;
456*53ee8cc1Swenshuai.xi 
457*53ee8cc1Swenshuai.xi   /* set the transfer direction */
458*53ee8cc1Swenshuai.xi   srb->sc_data_direction = SCSI_DATA_READ;
459*53ee8cc1Swenshuai.xi 
460*53ee8cc1Swenshuai.xi   /* use the new buffer we have */
461*53ee8cc1Swenshuai.xi   srb->request_buffer = (U32)u8Buffer;
462*53ee8cc1Swenshuai.xi 
463*53ee8cc1Swenshuai.xi   /* set the buffer length for transfer */
464*53ee8cc1Swenshuai.xi   srb->request_bufflen = 12;
465*53ee8cc1Swenshuai.xi 
466*53ee8cc1Swenshuai.xi   /* set up for no scatter-gather use */
467*53ee8cc1Swenshuai.xi   //srb->use_sg = 0;
468*53ee8cc1Swenshuai.xi 
469*53ee8cc1Swenshuai.xi   /* change the serial number -- toggle the high bit*/
470*53ee8cc1Swenshuai.xi   //srb->serial_number ^= 0x80000000;
471*53ee8cc1Swenshuai.xi 
472*53ee8cc1Swenshuai.xi   /* set Lun number*/
473*53ee8cc1Swenshuai.xi   //srb->lun= u8Drive;
474*53ee8cc1Swenshuai.xi 
475*53ee8cc1Swenshuai.xi   //srb->scsi_done = vScsi_SendCmd_Done;
476*53ee8cc1Swenshuai.xi 
477*53ee8cc1Swenshuai.xi 
478*53ee8cc1Swenshuai.xi }
479*53ee8cc1Swenshuai.xi 
480*53ee8cc1Swenshuai.xi //***************************************************************************************
481*53ee8cc1Swenshuai.xi // Function Name:vSCSICmd_MODE_SENSE
482*53ee8cc1Swenshuai.xi // Description:
483*53ee8cc1Swenshuai.xi // Input:
484*53ee8cc1Swenshuai.xi // Output:
485*53ee8cc1Swenshuai.xi // Status:
486*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSICmd_MODE_SENSE(Scsi_Cmnd * srb,INT8U u8PageCode,INT8U * u8Buffer)487*53ee8cc1Swenshuai.xi void vSCSICmd_MODE_SENSE( Scsi_Cmnd *srb,INT8U u8PageCode,INT8U *u8Buffer)
488*53ee8cc1Swenshuai.xi {
489*53ee8cc1Swenshuai.xi 
490*53ee8cc1Swenshuai.xi   /* set the command and the LUN */
491*53ee8cc1Swenshuai.xi   //memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
492*53ee8cc1Swenshuai.xi   //srb->cmnd[0] = MODE_SENSE;
493*53ee8cc1Swenshuai.xi   //srb->cmnd[2] = u8PageCode;
494*53ee8cc1Swenshuai.xi   //srb->cmnd[4] = DATA_LENGTH_MODE_SENSE;
495*53ee8cc1Swenshuai.xi   memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
496*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[0]= MODE_SENSE;
497*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[2]= u8PageCode;
498*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[4]= DATA_LENGTH_MODE_SENSE;
499*53ee8cc1Swenshuai.xi 
500*53ee8cc1Swenshuai.xi   /* FIXME: we must do the protocol translation here */
501*53ee8cc1Swenshuai.xi   /*
502*53ee8cc1Swenshuai.xi   if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
503*53ee8cc1Swenshuai.xi     srb->cmd_len = 6;
504*53ee8cc1Swenshuai.xi   else
505*53ee8cc1Swenshuai.xi     srb->cmd_len = 12;
506*53ee8cc1Swenshuai.xi   */
507*53ee8cc1Swenshuai.xi   srb->cmd_len = CB_LENGTH_MODE_SENSE;
508*53ee8cc1Swenshuai.xi 
509*53ee8cc1Swenshuai.xi   /* set the transfer direction */
510*53ee8cc1Swenshuai.xi   srb->sc_data_direction = SCSI_DATA_READ;
511*53ee8cc1Swenshuai.xi 
512*53ee8cc1Swenshuai.xi   /* use the new buffer we have */
513*53ee8cc1Swenshuai.xi     srb->request_buffer = (U32)u8Buffer;
514*53ee8cc1Swenshuai.xi   /* set the buffer length for transfer */
515*53ee8cc1Swenshuai.xi   srb->request_bufflen = DATA_LENGTH_MODE_SENSE;
516*53ee8cc1Swenshuai.xi 
517*53ee8cc1Swenshuai.xi   /* set up for no scatter-gather use */
518*53ee8cc1Swenshuai.xi   //srb->use_sg = 0;
519*53ee8cc1Swenshuai.xi 
520*53ee8cc1Swenshuai.xi   /* change the serial number -- toggle the high bit*/
521*53ee8cc1Swenshuai.xi   //srb->serial_number ^= 0x80000000;
522*53ee8cc1Swenshuai.xi 
523*53ee8cc1Swenshuai.xi   /* set Lun number*/
524*53ee8cc1Swenshuai.xi   //srb->lun= u8Drive;
525*53ee8cc1Swenshuai.xi 
526*53ee8cc1Swenshuai.xi   //srb->scsi_done = vScsi_SendCmd_Done;
527*53ee8cc1Swenshuai.xi 
528*53ee8cc1Swenshuai.xi 
529*53ee8cc1Swenshuai.xi }
530*53ee8cc1Swenshuai.xi 
531*53ee8cc1Swenshuai.xi //***************************************************************************************
532*53ee8cc1Swenshuai.xi // Function Name:vSCSICmd_MODE_SENSE_OperCode5A
533*53ee8cc1Swenshuai.xi // Description:
534*53ee8cc1Swenshuai.xi // Input:
535*53ee8cc1Swenshuai.xi // Output:
536*53ee8cc1Swenshuai.xi // Status:
537*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSICmd_MODE_SENSE_OperCode5A(Scsi_Cmnd * srb,INT8U u8PageCode,INT8U * u8Buffer)538*53ee8cc1Swenshuai.xi void vSCSICmd_MODE_SENSE_OperCode5A( Scsi_Cmnd *srb,INT8U u8PageCode,INT8U *u8Buffer)
539*53ee8cc1Swenshuai.xi {
540*53ee8cc1Swenshuai.xi 
541*53ee8cc1Swenshuai.xi   /* set the command and the LUN */
542*53ee8cc1Swenshuai.xi   //memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
543*53ee8cc1Swenshuai.xi   //srb->cmnd[0] = MODE_SENSE;
544*53ee8cc1Swenshuai.xi   //srb->cmnd[2] = u8PageCode;
545*53ee8cc1Swenshuai.xi   //srb->cmnd[4] = DATA_LENGTH_MODE_SENSE;
546*53ee8cc1Swenshuai.xi   memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
547*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[0]= MODE_SENSE_5A;
548*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[2]= u8PageCode;
549*53ee8cc1Swenshuai.xi #if 0
550*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[4]= DATA_LENGTH_MODE_SENSE_OperCode5A;		//RCC?
551*53ee8cc1Swenshuai.xi #else
552*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[7] = (INT8U)(DATA_LENGTH_MODE_SENSE_OperCode5A >> 8);
553*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[8] = (INT8U)(DATA_LENGTH_MODE_SENSE_OperCode5A );
554*53ee8cc1Swenshuai.xi #endif
555*53ee8cc1Swenshuai.xi   /* FIXME: we must do the protocol translation here */
556*53ee8cc1Swenshuai.xi   /*
557*53ee8cc1Swenshuai.xi   if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
558*53ee8cc1Swenshuai.xi     srb->cmd_len = 6;
559*53ee8cc1Swenshuai.xi   else
560*53ee8cc1Swenshuai.xi     srb->cmd_len = 12;
561*53ee8cc1Swenshuai.xi   */
562*53ee8cc1Swenshuai.xi   srb->cmd_len = CB_LENGTH_MODE_SENSE_OperCode5A;
563*53ee8cc1Swenshuai.xi 
564*53ee8cc1Swenshuai.xi   /* set the transfer direction */
565*53ee8cc1Swenshuai.xi   srb->sc_data_direction = SCSI_DATA_READ;
566*53ee8cc1Swenshuai.xi 
567*53ee8cc1Swenshuai.xi   /* use the new buffer we have */
568*53ee8cc1Swenshuai.xi     srb->request_buffer = (U32)u8Buffer;
569*53ee8cc1Swenshuai.xi   /* set the buffer length for transfer */
570*53ee8cc1Swenshuai.xi   srb->request_bufflen = DATA_LENGTH_MODE_SENSE_OperCode5A;
571*53ee8cc1Swenshuai.xi 
572*53ee8cc1Swenshuai.xi   /* set up for no scatter-gather use */
573*53ee8cc1Swenshuai.xi   //srb->use_sg = 0;
574*53ee8cc1Swenshuai.xi 
575*53ee8cc1Swenshuai.xi   /* change the serial number -- toggle the high bit*/
576*53ee8cc1Swenshuai.xi   //srb->serial_number ^= 0x80000000;
577*53ee8cc1Swenshuai.xi 
578*53ee8cc1Swenshuai.xi   /* set Lun number*/
579*53ee8cc1Swenshuai.xi   //srb->lun= u8Drive;
580*53ee8cc1Swenshuai.xi 
581*53ee8cc1Swenshuai.xi   //srb->scsi_done = vScsi_SendCmd_Done;
582*53ee8cc1Swenshuai.xi 
583*53ee8cc1Swenshuai.xi 
584*53ee8cc1Swenshuai.xi }
585*53ee8cc1Swenshuai.xi 
586*53ee8cc1Swenshuai.xi //***************************************************************************************
587*53ee8cc1Swenshuai.xi // Function Name:vSCSICmd_REQUEST_SENSE
588*53ee8cc1Swenshuai.xi // Description:
589*53ee8cc1Swenshuai.xi // Input:
590*53ee8cc1Swenshuai.xi // Output:
591*53ee8cc1Swenshuai.xi // Status:
592*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSICmd_REQUEST_SENSE(Scsi_Cmnd * srb,INT8U * u8Buffer)593*53ee8cc1Swenshuai.xi void vSCSICmd_REQUEST_SENSE(  Scsi_Cmnd *srb, INT8U *u8Buffer)
594*53ee8cc1Swenshuai.xi {
595*53ee8cc1Swenshuai.xi 
596*53ee8cc1Swenshuai.xi 
597*53ee8cc1Swenshuai.xi   /* set the command and the LUN */
598*53ee8cc1Swenshuai.xi   //memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
599*53ee8cc1Swenshuai.xi   //srb->cmnd[0] = REQUEST_SENSE;
600*53ee8cc1Swenshuai.xi   //srb->cmnd[4] = 18;
601*53ee8cc1Swenshuai.xi   memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
602*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[0]= REQUEST_SENSE;
603*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[4]= 18;
604*53ee8cc1Swenshuai.xi 
605*53ee8cc1Swenshuai.xi   /* FIXME: we must do the protocol translation here */
606*53ee8cc1Swenshuai.xi   /*
607*53ee8cc1Swenshuai.xi   if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
608*53ee8cc1Swenshuai.xi     srb->cmd_len = 6;
609*53ee8cc1Swenshuai.xi   else
610*53ee8cc1Swenshuai.xi 	srb->cmd_len = 12;
611*53ee8cc1Swenshuai.xi   */
612*53ee8cc1Swenshuai.xi   srb->cmd_len = CB_LENGTH_REQUEST_SENSE;
613*53ee8cc1Swenshuai.xi 
614*53ee8cc1Swenshuai.xi   /* set the transfer direction */
615*53ee8cc1Swenshuai.xi   srb->sc_data_direction = SCSI_DATA_READ;
616*53ee8cc1Swenshuai.xi 
617*53ee8cc1Swenshuai.xi   /* use the new buffer we have */
618*53ee8cc1Swenshuai.xi     srb->request_buffer = (U32)u8Buffer;
619*53ee8cc1Swenshuai.xi   /* set the buffer length for transfer */
620*53ee8cc1Swenshuai.xi   srb->request_bufflen = 18;
621*53ee8cc1Swenshuai.xi 
622*53ee8cc1Swenshuai.xi   /* set up for no scatter-gather use */
623*53ee8cc1Swenshuai.xi   //srb->use_sg = 0;
624*53ee8cc1Swenshuai.xi 
625*53ee8cc1Swenshuai.xi   /* change the serial number -- toggle the high bit*/
626*53ee8cc1Swenshuai.xi   //srb->serial_number ^= 0x80000000;
627*53ee8cc1Swenshuai.xi 
628*53ee8cc1Swenshuai.xi   /* set Lun number*/
629*53ee8cc1Swenshuai.xi   //srb->lun= u8Drive;
630*53ee8cc1Swenshuai.xi 
631*53ee8cc1Swenshuai.xi   //srb->scsi_done = vScsi_SendCmd_Done;
632*53ee8cc1Swenshuai.xi 
633*53ee8cc1Swenshuai.xi 
634*53ee8cc1Swenshuai.xi }
635*53ee8cc1Swenshuai.xi #if 0
636*53ee8cc1Swenshuai.xi //***************************************************************************************
637*53ee8cc1Swenshuai.xi // Function Name:vSCSICmd_TEST_UNIT_READY
638*53ee8cc1Swenshuai.xi // Description:
639*53ee8cc1Swenshuai.xi // Input:
640*53ee8cc1Swenshuai.xi // Output:
641*53ee8cc1Swenshuai.xi // Status:S
642*53ee8cc1Swenshuai.xi //***************************************************************************************
643*53ee8cc1Swenshuai.xi void vSCSICmd_TEST_UNIT_READY( Scsi_Cmnd *srb)
644*53ee8cc1Swenshuai.xi {
645*53ee8cc1Swenshuai.xi 
646*53ee8cc1Swenshuai.xi   memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
647*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[0]= TEST_UNIT_READY;
648*53ee8cc1Swenshuai.xi 
649*53ee8cc1Swenshuai.xi   srb->cmd_len = CB_LENGTH_TEST_UNIT_READY;
650*53ee8cc1Swenshuai.xi 
651*53ee8cc1Swenshuai.xi 
652*53ee8cc1Swenshuai.xi   /* set the transfer direction */
653*53ee8cc1Swenshuai.xi   srb->sc_data_direction = SCSI_DATA_READ;
654*53ee8cc1Swenshuai.xi 
655*53ee8cc1Swenshuai.xi   /* set the buffer length for transfer */
656*53ee8cc1Swenshuai.xi   srb->request_bufflen = 0;
657*53ee8cc1Swenshuai.xi 
658*53ee8cc1Swenshuai.xi }
659*53ee8cc1Swenshuai.xi #endif
660*53ee8cc1Swenshuai.xi 
vSCSICmd_Prepare(Scsi_Cmnd * srb,U8 cmd)661*53ee8cc1Swenshuai.xi void vSCSICmd_Prepare(Scsi_Cmnd *srb, U8 cmd)
662*53ee8cc1Swenshuai.xi {
663*53ee8cc1Swenshuai.xi   memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
664*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[0]= cmd;
665*53ee8cc1Swenshuai.xi 
666*53ee8cc1Swenshuai.xi   srb->cmd_len = 6;
667*53ee8cc1Swenshuai.xi   /* set the transfer direction */
668*53ee8cc1Swenshuai.xi   srb->sc_data_direction = SCSI_DATA_READ;
669*53ee8cc1Swenshuai.xi   /* set the buffer length for transfer */
670*53ee8cc1Swenshuai.xi   srb->request_bufflen = 0;
671*53ee8cc1Swenshuai.xi }
672*53ee8cc1Swenshuai.xi 
673*53ee8cc1Swenshuai.xi 
674*53ee8cc1Swenshuai.xi 
675*53ee8cc1Swenshuai.xi 
vSCSI_EJECT_DEVICE(U8 lun)676*53ee8cc1Swenshuai.xi BOOLEAN  vSCSI_EJECT_DEVICE(U8 lun)
677*53ee8cc1Swenshuai.xi {
678*53ee8cc1Swenshuai.xi   BOOLEAN result;
679*53ee8cc1Swenshuai.xi 
680*53ee8cc1Swenshuai.xi   Mass_stor_us1.srb =&srb_data;
681*53ee8cc1Swenshuai.xi   memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
682*53ee8cc1Swenshuai.xi 
683*53ee8cc1Swenshuai.xi   vSCSICmd_Prepare(Mass_stor_us1.srb,START_STOP);
684*53ee8cc1Swenshuai.xi   Mass_stor_us1.srb->lun=lun;
685*53ee8cc1Swenshuai.xi   OTGH_PT_BLK.sCBW.u8CB[4]= 2;                         //stop the device
686*53ee8cc1Swenshuai.xi 
687*53ee8cc1Swenshuai.xi   //result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
688*53ee8cc1Swenshuai.xi   //if (result==FALSE) return result;
689*53ee8cc1Swenshuai.xi   //OTGH_PT_BLK.sCBW.u8CB[0]= START_STOP;
690*53ee8cc1Swenshuai.xi   //OTGH_PT_BLK.sCBW.u8CB[4]= 2;                         //stop the device
691*53ee8cc1Swenshuai.xi   //printf("lun:%02bx\n",lun);
692*53ee8cc1Swenshuai.xi   result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
693*53ee8cc1Swenshuai.xi   return result;
694*53ee8cc1Swenshuai.xi }
695*53ee8cc1Swenshuai.xi 
696*53ee8cc1Swenshuai.xi 
697*53ee8cc1Swenshuai.xi 
698*53ee8cc1Swenshuai.xi 
699*53ee8cc1Swenshuai.xi 
700*53ee8cc1Swenshuai.xi //=======================================================================================
701*53ee8cc1Swenshuai.xi //=======================================================================================
702*53ee8cc1Swenshuai.xi //=======================================================================================
703*53ee8cc1Swenshuai.xi //=======================================================================================
704*53ee8cc1Swenshuai.xi //***************************************************************************************
705*53ee8cc1Swenshuai.xi // Function Name:vSCSI_REQUEST_SENSE
706*53ee8cc1Swenshuai.xi // Description: Reserved.
707*53ee8cc1Swenshuai.xi //              If Device do not support the command-A
708*53ee8cc1Swenshuai.xi //              ,Host should issue command "vSCSI_REQUEST_SENSE" to ask "why not support".
709*53ee8cc1Swenshuai.xi // Input:
710*53ee8cc1Swenshuai.xi // Output:
711*53ee8cc1Swenshuai.xi // Status:P-OK
712*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSI_REQUEST_SENSE(U8 lun)713*53ee8cc1Swenshuai.xi BOOLEAN vSCSI_REQUEST_SENSE(U8 lun)
714*53ee8cc1Swenshuai.xi {
715*53ee8cc1Swenshuai.xi   INT8U *u8RequestSenseData;
716*53ee8cc1Swenshuai.xi   //Scsi_Cmnd  srb_data;
717*53ee8cc1Swenshuai.xi   BOOLEAN result;
718*53ee8cc1Swenshuai.xi 
719*53ee8cc1Swenshuai.xi   u8RequestSenseData=pUsbData;
720*53ee8cc1Swenshuai.xi   Mass_stor_us1.srb = &srb_data;
721*53ee8cc1Swenshuai.xi   memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
722*53ee8cc1Swenshuai.xi 
723*53ee8cc1Swenshuai.xi   // Build SCSI command.
724*53ee8cc1Swenshuai.xi   vSCSICmd_REQUEST_SENSE( Mass_stor_us1.srb,u8RequestSenseData);
725*53ee8cc1Swenshuai.xi 
726*53ee8cc1Swenshuai.xi   Mass_stor_us1.srb->lun=lun;
727*53ee8cc1Swenshuai.xi 
728*53ee8cc1Swenshuai.xi   //call mass storage function to send CBW
729*53ee8cc1Swenshuai.xi   //and get REQUEST_SENSE Data. Return CSW to check status.
730*53ee8cc1Swenshuai.xi   result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
731*53ee8cc1Swenshuai.xi   return result;
732*53ee8cc1Swenshuai.xi 
733*53ee8cc1Swenshuai.xi 
734*53ee8cc1Swenshuai.xi 
735*53ee8cc1Swenshuai.xi }
736*53ee8cc1Swenshuai.xi 
737*53ee8cc1Swenshuai.xi //***************************************************************************************
738*53ee8cc1Swenshuai.xi // Function Name:bSCSI_INQUIRY
739*53ee8cc1Swenshuai.xi // Description:To ask the device u8DeviceType/u8ProductID/u8ProductVer... information
740*53ee8cc1Swenshuai.xi // Input:
741*53ee8cc1Swenshuai.xi // Output:
742*53ee8cc1Swenshuai.xi // Status:P-OK
743*53ee8cc1Swenshuai.xi //***************************************************************************************
744*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
745*53ee8cc1Swenshuai.xi //		bSCSI_INQUIRY()
746*53ee8cc1Swenshuai.xi //		Description:
747*53ee8cc1Swenshuai.xi //			1. scsi inquiry command.
748*53ee8cc1Swenshuai.xi //		input: none
749*53ee8cc1Swenshuai.xi //		output: TRUE or FALSE (BOOLEAN)
750*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
751*53ee8cc1Swenshuai.xi //INT8U xdata u8InquiryData[DATA_LENGTH_INQUIRY] _at_ Host20_TEMP_DATA;
bSCSI_INQUIRY(U8 lun)752*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_INQUIRY(U8 lun)
753*53ee8cc1Swenshuai.xi {
754*53ee8cc1Swenshuai.xi   INT8U u8i, u8j;
755*53ee8cc1Swenshuai.xi   //Scsi_Cmnd  srb_data;
756*53ee8cc1Swenshuai.xi   U8 *u8InquiryData;
757*53ee8cc1Swenshuai.xi   BOOLEAN result;
758*53ee8cc1Swenshuai.xi 
759*53ee8cc1Swenshuai.xi   u8InquiryData=pUsbData;
760*53ee8cc1Swenshuai.xi   //printf("INQUIRY\n");
761*53ee8cc1Swenshuai.xi   for(u8j =0; u8j< ScsiCmd_Fail_Retry ;u8j++)
762*53ee8cc1Swenshuai.xi   {
763*53ee8cc1Swenshuai.xi 
764*53ee8cc1Swenshuai.xi     Mass_stor_us1.srb =&srb_data;
765*53ee8cc1Swenshuai.xi 	memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
766*53ee8cc1Swenshuai.xi 
767*53ee8cc1Swenshuai.xi 	//Build SCSI command.
768*53ee8cc1Swenshuai.xi 	vSCSICmd_INQUIRY( Mass_stor_us1.srb, u8InquiryData);
769*53ee8cc1Swenshuai.xi     Mass_stor_us1.srb->lun=lun;
770*53ee8cc1Swenshuai.xi 
771*53ee8cc1Swenshuai.xi 	//call mass storage function to send CBW
772*53ee8cc1Swenshuai.xi 	//and get INQUIRY Data. Return CSW to check status.
773*53ee8cc1Swenshuai.xi 	result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
774*53ee8cc1Swenshuai.xi 	if (result==FALSE) continue;
775*53ee8cc1Swenshuai.xi 
776*53ee8cc1Swenshuai.xi 	if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
777*53ee8cc1Swenshuai.xi 	{
778*53ee8cc1Swenshuai.xi       //save all INQUIRY data
779*53ee8cc1Swenshuai.xi 	  Mass_stor_us1.device.u8DeviceType = (u8InquiryData[0] & 0x1F);
780*53ee8cc1Swenshuai.xi 
781*53ee8cc1Swenshuai.xi         Mass_stor_us1.Mass_stor_device[lun].bRMB = (u8InquiryData[1] & 0x80) >> 7;
782*53ee8cc1Swenshuai.xi         //printf("Removable: %d\n", Mass_stor_us1.Mass_stor_device[lun].bRMB);
783*53ee8cc1Swenshuai.xi 
784*53ee8cc1Swenshuai.xi 	  for(u8i =0; u8i <8; u8i++)
785*53ee8cc1Swenshuai.xi 	    Mass_stor_us1.Mass_stor_device[lun].u8VendorID[u8i] = u8InquiryData[u8i+8];
786*53ee8cc1Swenshuai.xi 	  for(u8i =0; u8i <16; u8i++)
787*53ee8cc1Swenshuai.xi 		Mass_stor_us1.Mass_stor_device[lun].u8ProductID[u8i] = u8InquiryData[u8i+16];
788*53ee8cc1Swenshuai.xi 	  for(u8i =0; u8i <4; u8i++)
789*53ee8cc1Swenshuai.xi 	    Mass_stor_us1.Mass_stor_device[lun].u8ProductVer[u8i] = u8InquiryData[u8i+32];
790*53ee8cc1Swenshuai.xi 
791*53ee8cc1Swenshuai.xi 	  if(Mass_stor_us1.device.u8DeviceType != TYPE_DISK)
792*53ee8cc1Swenshuai.xi 	  {
793*53ee8cc1Swenshuai.xi 	    DRV_SCSI_DBG(printf("Device type unsuport, it's not a scsi disk%s","\n"));
794*53ee8cc1Swenshuai.xi 
795*53ee8cc1Swenshuai.xi 		return FALSE;
796*53ee8cc1Swenshuai.xi 	  }
797*53ee8cc1Swenshuai.xi 	  else
798*53ee8cc1Swenshuai.xi 	  {
799*53ee8cc1Swenshuai.xi 
800*53ee8cc1Swenshuai.xi 	    DRV_SCSI_DBG(SCSI_DbgPrint("SCSI INQUIRY : SCSI Device ID <%s>\n",&Mass_stor_us1.Mass_stor_device[lun].u8VendorID));
801*53ee8cc1Swenshuai.xi 		//SCSI_DbgPrint("SCSI INQUIRY : SCSI Product ID <%s>\n",&Mass_stor_us1.device.u8ProductID);
802*53ee8cc1Swenshuai.xi 		//SCSI_DbgPrint("SCSI INQUIRY : SCSI Product ver <%s>\n",&Mass_stor_us1.device.u8ProductVer);
803*53ee8cc1Swenshuai.xi         return TRUE;
804*53ee8cc1Swenshuai.xi 	  }
805*53ee8cc1Swenshuai.xi 
806*53ee8cc1Swenshuai.xi 
807*53ee8cc1Swenshuai.xi 	}
808*53ee8cc1Swenshuai.xi 
809*53ee8cc1Swenshuai.xi   }
810*53ee8cc1Swenshuai.xi 	return FALSE;
811*53ee8cc1Swenshuai.xi }
812*53ee8cc1Swenshuai.xi //***************************************************************************************
813*53ee8cc1Swenshuai.xi // Function Name:bSCSI_MODE_SENSE
814*53ee8cc1Swenshuai.xi // Description:To know the mode of device <1>.Write Protect => Y/N
815*53ee8cc1Swenshuai.xi // Input:
816*53ee8cc1Swenshuai.xi // Output:
817*53ee8cc1Swenshuai.xi // Status:P-OK
818*53ee8cc1Swenshuai.xi //***************************************************************************************
819*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
820*53ee8cc1Swenshuai.xi //		bSCSI_MODE_SENSE()
821*53ee8cc1Swenshuai.xi //		Description:
822*53ee8cc1Swenshuai.xi //			1. scsi mode sense command.
823*53ee8cc1Swenshuai.xi //		input: none
824*53ee8cc1Swenshuai.xi //		output: TRUE or FALSE (BOOLEAN)
825*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
bSCSI_MODE_SENSE(U8 lun)826*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_MODE_SENSE(U8 lun)
827*53ee8cc1Swenshuai.xi {
828*53ee8cc1Swenshuai.xi   INT8U  u8j;
829*53ee8cc1Swenshuai.xi   INT8U *u8ModeSenseData;
830*53ee8cc1Swenshuai.xi   BOOLEAN result;
831*53ee8cc1Swenshuai.xi   //Scsi_Cmnd  srb_data;
832*53ee8cc1Swenshuai.xi 
833*53ee8cc1Swenshuai.xi   u8ModeSenseData=pUsbData;
834*53ee8cc1Swenshuai.xi 
835*53ee8cc1Swenshuai.xi   Mass_stor_us1.srb = &srb_data;
836*53ee8cc1Swenshuai.xi 
837*53ee8cc1Swenshuai.xi   for(u8j =0; u8j< ScsiCmd_Fail_Retry ;u8j++)
838*53ee8cc1Swenshuai.xi   {
839*53ee8cc1Swenshuai.xi     memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
840*53ee8cc1Swenshuai.xi     //Build SCSI command.
841*53ee8cc1Swenshuai.xi 	vSCSICmd_MODE_SENSE( Mass_stor_us1.srb,0x3F, u8ModeSenseData);
842*53ee8cc1Swenshuai.xi     Mass_stor_us1.srb->lun=lun;
843*53ee8cc1Swenshuai.xi 
844*53ee8cc1Swenshuai.xi 	//call mass storage function to send CBW
845*53ee8cc1Swenshuai.xi 	//and get Mode Sense Data. Return CSW to check status.
846*53ee8cc1Swenshuai.xi 	result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
847*53ee8cc1Swenshuai.xi 	if (result==FALSE) return FALSE;
848*53ee8cc1Swenshuai.xi 
849*53ee8cc1Swenshuai.xi 	if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
850*53ee8cc1Swenshuai.xi 	{
851*53ee8cc1Swenshuai.xi       //save all Mode Sense(page code=0x3F) data
852*53ee8cc1Swenshuai.xi 	  //Now we only use u8ModeSenseData[2], this byte save device
853*53ee8cc1Swenshuai.xi 	  //write protection information
854*53ee8cc1Swenshuai.xi 	  Mass_stor_us1.Mass_stor_device[lun].bWriteProtect = (u8ModeSenseData[2]==0x80)?
855*53ee8cc1Swenshuai.xi 												TRUE:FALSE;
856*53ee8cc1Swenshuai.xi 
857*53ee8cc1Swenshuai.xi 
858*53ee8cc1Swenshuai.xi 	  return TRUE;
859*53ee8cc1Swenshuai.xi 	}
860*53ee8cc1Swenshuai.xi   }
861*53ee8cc1Swenshuai.xi   Mass_stor_us1.Mass_stor_device[lun].bWriteProtect=FALSE;      //not support this command
862*53ee8cc1Swenshuai.xi   return FALSE;
863*53ee8cc1Swenshuai.xi }
864*53ee8cc1Swenshuai.xi 
865*53ee8cc1Swenshuai.xi //***************************************************************************************
866*53ee8cc1Swenshuai.xi // Function Name:bSCSI_MODE_SENSE_OperCode5A
867*53ee8cc1Swenshuai.xi // Description:To know the mode of device <1>.Write Protect => Y/N
868*53ee8cc1Swenshuai.xi // Input:
869*53ee8cc1Swenshuai.xi // Output:
870*53ee8cc1Swenshuai.xi // Status:P-OK
871*53ee8cc1Swenshuai.xi //***************************************************************************************
872*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
873*53ee8cc1Swenshuai.xi //		bSCSI_MODE_SENSE_OperCode5A()
874*53ee8cc1Swenshuai.xi //		Description:
875*53ee8cc1Swenshuai.xi //			1. scsi mode sense command.
876*53ee8cc1Swenshuai.xi //		input: none
877*53ee8cc1Swenshuai.xi //		output: TRUE or FALSE (BOOLEAN)
878*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
bSCSI_MODE_SENSE_OperCode5A(U8 lun)879*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_MODE_SENSE_OperCode5A(U8 lun)
880*53ee8cc1Swenshuai.xi {
881*53ee8cc1Swenshuai.xi   INT8U  u8j;
882*53ee8cc1Swenshuai.xi   INT8U *u8ModeSenseData;
883*53ee8cc1Swenshuai.xi   BOOLEAN result;
884*53ee8cc1Swenshuai.xi   //Scsi_Cmnd  srb_data;
885*53ee8cc1Swenshuai.xi 
886*53ee8cc1Swenshuai.xi   u8ModeSenseData=pUsbData;
887*53ee8cc1Swenshuai.xi 
888*53ee8cc1Swenshuai.xi   Mass_stor_us1.srb = &srb_data;
889*53ee8cc1Swenshuai.xi 
890*53ee8cc1Swenshuai.xi   for(u8j =0; u8j< ScsiCmd_Fail_Retry ;u8j++)
891*53ee8cc1Swenshuai.xi   {
892*53ee8cc1Swenshuai.xi     memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
893*53ee8cc1Swenshuai.xi     //Build SCSI command.
894*53ee8cc1Swenshuai.xi 		vSCSICmd_MODE_SENSE_OperCode5A( Mass_stor_us1.srb,0x3F, u8ModeSenseData);
895*53ee8cc1Swenshuai.xi     Mass_stor_us1.srb->lun=lun;
896*53ee8cc1Swenshuai.xi 
897*53ee8cc1Swenshuai.xi 	//call mass storage function to send CBW
898*53ee8cc1Swenshuai.xi 	//and get Mode Sense Data. Return CSW to check status.
899*53ee8cc1Swenshuai.xi 	result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
900*53ee8cc1Swenshuai.xi 	if (result==FALSE) return FALSE;
901*53ee8cc1Swenshuai.xi 
902*53ee8cc1Swenshuai.xi 	if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
903*53ee8cc1Swenshuai.xi 	{
904*53ee8cc1Swenshuai.xi     //save all Mode Sense(page code=0x3F) data
905*53ee8cc1Swenshuai.xi 	  //Now we only use u8ModeSenseData[2], this byte save device
906*53ee8cc1Swenshuai.xi 	  //write protection information
907*53ee8cc1Swenshuai.xi 	  Mass_stor_us1.Mass_stor_device[lun].bWriteProtect = (u8ModeSenseData[3]==0x80)?		//RCC?
908*53ee8cc1Swenshuai.xi 												TRUE:FALSE;
909*53ee8cc1Swenshuai.xi 	  return TRUE;
910*53ee8cc1Swenshuai.xi 	}
911*53ee8cc1Swenshuai.xi   }
912*53ee8cc1Swenshuai.xi   Mass_stor_us1.Mass_stor_device[lun].bWriteProtect=FALSE;      //not support this command
913*53ee8cc1Swenshuai.xi   return FALSE;
914*53ee8cc1Swenshuai.xi }
915*53ee8cc1Swenshuai.xi 
916*53ee8cc1Swenshuai.xi //***************************************************************************************
917*53ee8cc1Swenshuai.xi // Function Name:bSCSI_READ_CAPACITY
918*53ee8cc1Swenshuai.xi // Description:To get the CAPACITY
919*53ee8cc1Swenshuai.xi // Input:
920*53ee8cc1Swenshuai.xi // Output:
921*53ee8cc1Swenshuai.xi // Status:S
922*53ee8cc1Swenshuai.xi //***************************************************************************************
923*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
924*53ee8cc1Swenshuai.xi //		bSCSI_READ_CAPACITY()
925*53ee8cc1Swenshuai.xi //		Description:
926*53ee8cc1Swenshuai.xi //			1. scsi READ_CAPACITY command.
927*53ee8cc1Swenshuai.xi //		input: none
928*53ee8cc1Swenshuai.xi //		output: TRUE or FALSE (BOOLEAN)
929*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
bSCSI_READ_CAPACITY(U8 lun)930*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_READ_CAPACITY(U8 lun)
931*53ee8cc1Swenshuai.xi {
932*53ee8cc1Swenshuai.xi   //INT8U u8j;
933*53ee8cc1Swenshuai.xi   INT8U *u8ReadCapacityData;
934*53ee8cc1Swenshuai.xi   BOOLEAN result;
935*53ee8cc1Swenshuai.xi   //Scsi_Cmnd  srb_data;
936*53ee8cc1Swenshuai.xi 
937*53ee8cc1Swenshuai.xi   u8ReadCapacityData=pUsbData;
938*53ee8cc1Swenshuai.xi   //for(u8j =0; u8j< ScsiCmd_Fail_Retry ;u8j++)
939*53ee8cc1Swenshuai.xi   {
940*53ee8cc1Swenshuai.xi     Mass_stor_us1.srb = &srb_data;
941*53ee8cc1Swenshuai.xi 	memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
942*53ee8cc1Swenshuai.xi 
943*53ee8cc1Swenshuai.xi 	//Build SCSI command.
944*53ee8cc1Swenshuai.xi 	vSCSICmd_READ_CAPACITY(Mass_stor_us1.srb, u8ReadCapacityData);
945*53ee8cc1Swenshuai.xi     Mass_stor_us1.srb->lun=lun;
946*53ee8cc1Swenshuai.xi 
947*53ee8cc1Swenshuai.xi     //call mass storage function to send CBW
948*53ee8cc1Swenshuai.xi 	//and get CAPACITY Data. Return CSW to check status.
949*53ee8cc1Swenshuai.xi 	result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
950*53ee8cc1Swenshuai.xi 	if (result==FALSE) return result;
951*53ee8cc1Swenshuai.xi 
952*53ee8cc1Swenshuai.xi 	if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
953*53ee8cc1Swenshuai.xi 	{
954*53ee8cc1Swenshuai.xi 	  //save all CAPACITY data
955*53ee8cc1Swenshuai.xi 	  Mass_stor_us1.Mass_stor_device[lun].u32BlockTotalNum = ((INT32U)u8ReadCapacityData[0] << 24) |
956*53ee8cc1Swenshuai.xi 										   ((INT32U)u8ReadCapacityData[1] << 16) |
957*53ee8cc1Swenshuai.xi 										   ((INT32U)u8ReadCapacityData[2] << 8) |
958*53ee8cc1Swenshuai.xi 										   ((INT32U)u8ReadCapacityData[3] ) ;
959*53ee8cc1Swenshuai.xi 
960*53ee8cc1Swenshuai.xi 	  Mass_stor_us1.Mass_stor_device[lun].u32BlockSize = ((INT32U)u8ReadCapacityData[4] << 24) |
961*53ee8cc1Swenshuai.xi 									   ((INT32U)u8ReadCapacityData[5] << 16) |
962*53ee8cc1Swenshuai.xi 									   ((INT32U)u8ReadCapacityData[6] << 8) |
963*53ee8cc1Swenshuai.xi 									   ((INT32U)u8ReadCapacityData[7] ) ;
964*53ee8cc1Swenshuai.xi      //if ( Mass_stor_us1.Mass_stor_device[lun].u32BlockSize > 1024)
965*53ee8cc1Swenshuai.xi      //{
966*53ee8cc1Swenshuai.xi      //  printf("Block size over 1024, is %X\n",Mass_stor_us1.Mass_stor_device[lun].u32BlockSize);
967*53ee8cc1Swenshuai.xi      //  while(1);
968*53ee8cc1Swenshuai.xi      //}
969*53ee8cc1Swenshuai.xi 
970*53ee8cc1Swenshuai.xi 	 DRV_SCSI_DBG(SCSI_DbgPrint("SCSI CAPACITY : SCSI Device total block <0x%x%x>\n",
971*53ee8cc1Swenshuai.xi 	                           (INT16U)(Mass_stor_us1.Mass_stor_device[lun].u32BlockTotalNum >> 16),
972*53ee8cc1Swenshuai.xi 					           (INT16U)Mass_stor_us1.Mass_stor_device[lun].u32BlockTotalNum));
973*53ee8cc1Swenshuai.xi 	 DRV_SCSI_DBG(SCSI_DbgPrint("SCSI CAPACITY : SCSI Product block size <0x%x bytes>\n",(INT16U)Mass_stor_us1.Mass_stor_device[lun].u32BlockSize));
974*53ee8cc1Swenshuai.xi 
975*53ee8cc1Swenshuai.xi 	 return TRUE;
976*53ee8cc1Swenshuai.xi    }
977*53ee8cc1Swenshuai.xi      else
978*53ee8cc1Swenshuai.xi      {
979*53ee8cc1Swenshuai.xi         vSCSI_REQUEST_SENSE(lun);
980*53ee8cc1Swenshuai.xi #if 0
981*53ee8cc1Swenshuai.xi         printf("ReqSense: ");
982*53ee8cc1Swenshuai.xi         for (ii=0; ii<18; ii++)
983*53ee8cc1Swenshuai.xi         {
984*53ee8cc1Swenshuai.xi             printf(" %bx", pUsbData[ii]);
985*53ee8cc1Swenshuai.xi         }
986*53ee8cc1Swenshuai.xi         printf("\n");
987*53ee8cc1Swenshuai.xi #endif
988*53ee8cc1Swenshuai.xi         return FALSE;
989*53ee8cc1Swenshuai.xi      }
990*53ee8cc1Swenshuai.xi  }
991*53ee8cc1Swenshuai.xi  return FALSE;
992*53ee8cc1Swenshuai.xi 
993*53ee8cc1Swenshuai.xi }
994*53ee8cc1Swenshuai.xi 
bSCSI_READ_FORMAT_CAPACITY(U8 lun)995*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_READ_FORMAT_CAPACITY(U8 lun)
996*53ee8cc1Swenshuai.xi {
997*53ee8cc1Swenshuai.xi   INT8U u8j;
998*53ee8cc1Swenshuai.xi   INT8U *u8ReadCapacityData;
999*53ee8cc1Swenshuai.xi   BOOLEAN result;
1000*53ee8cc1Swenshuai.xi   //Scsi_Cmnd  srb_data;
1001*53ee8cc1Swenshuai.xi 
1002*53ee8cc1Swenshuai.xi   u8ReadCapacityData=pUsbData;
1003*53ee8cc1Swenshuai.xi   for(u8j =0; u8j< ScsiCmd_Fail_Retry ;u8j++)
1004*53ee8cc1Swenshuai.xi   {
1005*53ee8cc1Swenshuai.xi     Mass_stor_us1.srb = &srb_data;
1006*53ee8cc1Swenshuai.xi 	memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
1007*53ee8cc1Swenshuai.xi 
1008*53ee8cc1Swenshuai.xi 	//Build SCSI command.
1009*53ee8cc1Swenshuai.xi 	vSCSICmd_READ_FORMAT_CAPACITY(Mass_stor_us1.srb, u8ReadCapacityData);
1010*53ee8cc1Swenshuai.xi     Mass_stor_us1.srb->lun=lun;
1011*53ee8cc1Swenshuai.xi 
1012*53ee8cc1Swenshuai.xi     //call mass storage function to send CBW
1013*53ee8cc1Swenshuai.xi 	//and get CAPACITY Data. Return CSW to check status.
1014*53ee8cc1Swenshuai.xi 	result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
1015*53ee8cc1Swenshuai.xi 	if (result==FALSE) return result;
1016*53ee8cc1Swenshuai.xi 
1017*53ee8cc1Swenshuai.xi 	if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
1018*53ee8cc1Swenshuai.xi 	{
1019*53ee8cc1Swenshuai.xi 	  //save all CAPACITY data
1020*53ee8cc1Swenshuai.xi 	  Mass_stor_us1.Mass_stor_device[lun].u32BlockTotalNum = ((INT32U)u8ReadCapacityData[4] << 24) |
1021*53ee8cc1Swenshuai.xi 										   ((INT32U)u8ReadCapacityData[5] << 16) |
1022*53ee8cc1Swenshuai.xi 										   ((INT32U)u8ReadCapacityData[6] << 8) |
1023*53ee8cc1Swenshuai.xi 										   ((INT32U)u8ReadCapacityData[7] ) ;
1024*53ee8cc1Swenshuai.xi 
1025*53ee8cc1Swenshuai.xi 	  Mass_stor_us1.Mass_stor_device[lun].u32BlockSize = ((INT32U)u8ReadCapacityData[9] << 16) |
1026*53ee8cc1Swenshuai.xi 									   ((INT32U)u8ReadCapacityData[10] << 8) |
1027*53ee8cc1Swenshuai.xi 									   ((INT32U)u8ReadCapacityData[11] ) ;
1028*53ee8cc1Swenshuai.xi      //if ( Mass_stor_us1.Mass_stor_device[lun].u32BlockSize > 1024)
1029*53ee8cc1Swenshuai.xi      //{
1030*53ee8cc1Swenshuai.xi      //  printf("Block size over 1024, is %X\n",Mass_stor_us1.Mass_stor_device[lun].u32BlockSize);
1031*53ee8cc1Swenshuai.xi      //  while(1);
1032*53ee8cc1Swenshuai.xi      //}
1033*53ee8cc1Swenshuai.xi 
1034*53ee8cc1Swenshuai.xi 	 DRV_SCSI_DBG(SCSI_DbgPrint("SCSI CAPACITY : SCSI Device total block <0x%x%x>\n",
1035*53ee8cc1Swenshuai.xi 	                           (INT16U)(Mass_stor_us1.Mass_stor_device[lun].u32BlockTotalNum >> 16),
1036*53ee8cc1Swenshuai.xi 					           (INT16U)Mass_stor_us1.Mass_stor_device[lun].u32BlockTotalNum));
1037*53ee8cc1Swenshuai.xi 	 DRV_SCSI_DBG(SCSI_DbgPrint("SCSI CAPACITY : SCSI Product block size <0x%x bytes>\n",(INT16U)Mass_stor_us1.Mass_stor_device[lun].u32BlockSize));
1038*53ee8cc1Swenshuai.xi 
1039*53ee8cc1Swenshuai.xi 	 return TRUE;
1040*53ee8cc1Swenshuai.xi    }
1041*53ee8cc1Swenshuai.xi  }
1042*53ee8cc1Swenshuai.xi  return FALSE;
1043*53ee8cc1Swenshuai.xi 
1044*53ee8cc1Swenshuai.xi }
1045*53ee8cc1Swenshuai.xi 
1046*53ee8cc1Swenshuai.xi extern void OTGH_PT_Bulk_Init(void);
1047*53ee8cc1Swenshuai.xi //***************************************************************************************
1048*53ee8cc1Swenshuai.xi // Function Name:bSCSI_TEST_UNIT_READY
1049*53ee8cc1Swenshuai.xi // Description: To know that "device is ready ?"
1050*53ee8cc1Swenshuai.xi // Input:
1051*53ee8cc1Swenshuai.xi // Output:
1052*53ee8cc1Swenshuai.xi // Status:
1053*53ee8cc1Swenshuai.xi //***************************************************************************************
1054*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
1055*53ee8cc1Swenshuai.xi //		bSCSI_TEST_UNIT_READY()
1056*53ee8cc1Swenshuai.xi //		Description:
1057*53ee8cc1Swenshuai.xi //			1. scsi TEST_UNIT_READY command.
1058*53ee8cc1Swenshuai.xi //		input: none
1059*53ee8cc1Swenshuai.xi //		output: TRUE or FALSE (BOOLEAN)
1060*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
bSCSI_TEST_UNIT_READY(U8 lun)1061*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_TEST_UNIT_READY(U8 lun)
1062*53ee8cc1Swenshuai.xi {
1063*53ee8cc1Swenshuai.xi   INT8U u8j;
1064*53ee8cc1Swenshuai.xi   BOOLEAN result;
1065*53ee8cc1Swenshuai.xi   #ifdef ATV_SERISE_USE
1066*53ee8cc1Swenshuai.xi   U32 i;
1067*53ee8cc1Swenshuai.xi   #endif
1068*53ee8cc1Swenshuai.xi   //Scsi_Cmnd  srb_data;
1069*53ee8cc1Swenshuai.xi   //printf("TUR\n");
1070*53ee8cc1Swenshuai.xi 
1071*53ee8cc1Swenshuai.xi   for(u8j =0; u8j< TestUnitReady_Fail_Retry ;u8j++)
1072*53ee8cc1Swenshuai.xi   {
1073*53ee8cc1Swenshuai.xi     //printf("connect status:%02bx\n",mwHost20_PORTSC_ConnectStatus_Rd());
1074*53ee8cc1Swenshuai.xi 	if (mwHost20_PORTSC_ConnectStatus_Rd()==0)
1075*53ee8cc1Swenshuai.xi       return FALSE;               //device is not connected
1076*53ee8cc1Swenshuai.xi 
1077*53ee8cc1Swenshuai.xi 	Mass_stor_us1.srb = &srb_data;
1078*53ee8cc1Swenshuai.xi 	memset((U8 xdata *)Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
1079*53ee8cc1Swenshuai.xi 
1080*53ee8cc1Swenshuai.xi 	// Build SCSI command.
1081*53ee8cc1Swenshuai.xi 	vSCSICmd_Prepare(Mass_stor_us1.srb,TEST_UNIT_READY);
1082*53ee8cc1Swenshuai.xi 	//vSCSICmd_TEST_UNIT_READY(Mass_stor_us1.srb);
1083*53ee8cc1Swenshuai.xi     Mass_stor_us1.srb->lun=lun;
1084*53ee8cc1Swenshuai.xi     //printf("Mass_stor_us1.srb:%02bx\n",Mass_stor_us1.srb->request_bufflen);
1085*53ee8cc1Swenshuai.xi 	//call mass storage function to send CBW
1086*53ee8cc1Swenshuai.xi 	//and get CAPACITY Data. Return CSW to check status.
1087*53ee8cc1Swenshuai.xi 
1088*53ee8cc1Swenshuai.xi 	result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
1089*53ee8cc1Swenshuai.xi     //printf("result:%02bx\n",result);
1090*53ee8cc1Swenshuai.xi #if 1
1091*53ee8cc1Swenshuai.xi         if (result == FALSE)
1092*53ee8cc1Swenshuai.xi         {
1093*53ee8cc1Swenshuai.xi             if (gUsbStatus == USB_TIMEOUT)
1094*53ee8cc1Swenshuai.xi             {
1095*53ee8cc1Swenshuai.xi                 DRV_SCSI_DBG(printf("resend TUR\n"));
1096*53ee8cc1Swenshuai.xi                 if ( MDrv_UsbHost_Init() && (flib_Host20_Enumerate(1,3)!=0) )
1097*53ee8cc1Swenshuai.xi                 {
1098*53ee8cc1Swenshuai.xi                     OTGH_PT_Bulk_Init();
1099*53ee8cc1Swenshuai.xi                     continue;
1100*53ee8cc1Swenshuai.xi                 }
1101*53ee8cc1Swenshuai.xi             }
1102*53ee8cc1Swenshuai.xi             else
1103*53ee8cc1Swenshuai.xi                 return result;
1104*53ee8cc1Swenshuai.xi         }
1105*53ee8cc1Swenshuai.xi #else
1106*53ee8cc1Swenshuai.xi         if (result==FALSE)
1107*53ee8cc1Swenshuai.xi         {
1108*53ee8cc1Swenshuai.xi             return result;
1109*53ee8cc1Swenshuai.xi         }
1110*53ee8cc1Swenshuai.xi #endif
1111*53ee8cc1Swenshuai.xi 	if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
1112*53ee8cc1Swenshuai.xi 	{
1113*53ee8cc1Swenshuai.xi 	  Mass_stor_us1.Mass_stor_device[lun].bDeviceReady = TRUE;
1114*53ee8cc1Swenshuai.xi       //SCSI_DbgPrint("SCSI TEST UNIT READY : Succeed\n",u8Drive);
1115*53ee8cc1Swenshuai.xi 
1116*53ee8cc1Swenshuai.xi 	  return TRUE;
1117*53ee8cc1Swenshuai.xi 	}
1118*53ee8cc1Swenshuai.xi 	else
1119*53ee8cc1Swenshuai.xi 	{
1120*53ee8cc1Swenshuai.xi        #ifndef ATV_SERISE_USE
1121*53ee8cc1Swenshuai.xi          MsOS_DelayTask(10);
1122*53ee8cc1Swenshuai.xi        #else
1123*53ee8cc1Swenshuai.xi          for(i=0;i<(0x100);i++);
1124*53ee8cc1Swenshuai.xi        #endif
1125*53ee8cc1Swenshuai.xi 
1126*53ee8cc1Swenshuai.xi 	  result=vSCSI_REQUEST_SENSE(lun);
1127*53ee8cc1Swenshuai.xi       if ((pUsbData[12]==0x3a)&&(pUsbData[13]==0)) return FALSE;  //no media
1128*53ee8cc1Swenshuai.xi 	  if (result==FALSE) return result;
1129*53ee8cc1Swenshuai.xi 	}
1130*53ee8cc1Swenshuai.xi     #ifndef ATV_SERISE_USE
1131*53ee8cc1Swenshuai.xi 	MsOS_DelayTask(10);
1132*53ee8cc1Swenshuai.xi 	#else
1133*53ee8cc1Swenshuai.xi 	for(i=0;i<0x100;i++);
1134*53ee8cc1Swenshuai.xi 	#endif
1135*53ee8cc1Swenshuai.xi   }
1136*53ee8cc1Swenshuai.xi 	//SCSI_DbgPrint("SCSI TEST UNIT READY : Failed%s","\n");
1137*53ee8cc1Swenshuai.xi   return FALSE;
1138*53ee8cc1Swenshuai.xi }
1139*53ee8cc1Swenshuai.xi extern BOOLEAN  MDrv_Usb_Device_Enum(void);
1140*53ee8cc1Swenshuai.xi #ifdef ATV_SERISE_USE
1141*53ee8cc1Swenshuai.xi extern void EnableINT(void);
1142*53ee8cc1Swenshuai.xi #endif
1143*53ee8cc1Swenshuai.xi 
bSCSI_TEST_UNIT_READY2(U8 lun)1144*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_TEST_UNIT_READY2(U8 lun)
1145*53ee8cc1Swenshuai.xi {
1146*53ee8cc1Swenshuai.xi   INT8U u8j;
1147*53ee8cc1Swenshuai.xi   BOOLEAN result;
1148*53ee8cc1Swenshuai.xi   U8  RetryCnt=0;
1149*53ee8cc1Swenshuai.xi 
1150*53ee8cc1Swenshuai.xi   #ifdef ATV_SERISE_USE
1151*53ee8cc1Swenshuai.xi   U32 i;
1152*53ee8cc1Swenshuai.xi   #endif
1153*53ee8cc1Swenshuai.xi   //Scsi_Cmnd  srb_data;
1154*53ee8cc1Swenshuai.xi   //printf("TUR\n");
1155*53ee8cc1Swenshuai.xi 
1156*53ee8cc1Swenshuai.xi   for(u8j =0; u8j< TestUnitReady_Fail_Retry ;u8j++)
1157*53ee8cc1Swenshuai.xi   {
1158*53ee8cc1Swenshuai.xi     //printf("connect status:%02bx\n",mwHost20_PORTSC_ConnectStatus_Rd());
1159*53ee8cc1Swenshuai.xi 	if (mwHost20_PORTSC_ConnectStatus_Rd()==0)
1160*53ee8cc1Swenshuai.xi       return FALSE;               //device is not connected
1161*53ee8cc1Swenshuai.xi 
1162*53ee8cc1Swenshuai.xi 	Mass_stor_us1.srb = &srb_data;
1163*53ee8cc1Swenshuai.xi 	memset((U8 xdata *)Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
1164*53ee8cc1Swenshuai.xi 
1165*53ee8cc1Swenshuai.xi 	// Build SCSI command.
1166*53ee8cc1Swenshuai.xi 	vSCSICmd_Prepare(Mass_stor_us1.srb,TEST_UNIT_READY);
1167*53ee8cc1Swenshuai.xi 	//vSCSICmd_TEST_UNIT_READY(Mass_stor_us1.srb);
1168*53ee8cc1Swenshuai.xi     Mass_stor_us1.srb->lun=lun;
1169*53ee8cc1Swenshuai.xi     //printf("Mass_stor_us1.srb:%02bx\n",Mass_stor_us1.srb->request_bufflen);
1170*53ee8cc1Swenshuai.xi 	//call mass storage function to send CBW
1171*53ee8cc1Swenshuai.xi 	//and get CAPACITY Data. Return CSW to check status.
1172*53ee8cc1Swenshuai.xi 
1173*53ee8cc1Swenshuai.xi 	result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
1174*53ee8cc1Swenshuai.xi     //printf("result:%02bx\n",result);
1175*53ee8cc1Swenshuai.xi 
1176*53ee8cc1Swenshuai.xi     if (result==FALSE)
1177*53ee8cc1Swenshuai.xi     {
1178*53ee8cc1Swenshuai.xi       RetryCnt++;
1179*53ee8cc1Swenshuai.xi       if (gUsbStatus==USB_TIMEOUT)
1180*53ee8cc1Swenshuai.xi       {
1181*53ee8cc1Swenshuai.xi         if (RetryCnt > 3) return FALSE;
1182*53ee8cc1Swenshuai.xi         if ((RetryCnt==2)&&(mwOTG20_Control_HOST_SPD_TYP_Rd()==2) )           //make sure it is hi speed
1183*53ee8cc1Swenshuai.xi         {
1184*53ee8cc1Swenshuai.xi           DRV_SCSI_DBG( printf("Force FS\n"));
1185*53ee8cc1Swenshuai.xi           UHC_ORXBYTE(0x40,0x80);//force enter FSmode
1186*53ee8cc1Swenshuai.xi         }
1187*53ee8cc1Swenshuai.xi         #ifndef ATV_SERISE_USE
1188*53ee8cc1Swenshuai.xi         msAPI_Timer_ResetWDT();
1189*53ee8cc1Swenshuai.xi         #else
1190*53ee8cc1Swenshuai.xi           #ifdef Enable_Close_INT
1191*53ee8cc1Swenshuai.xi           //XBYTE[0x2B00]&=0xFD;
1192*53ee8cc1Swenshuai.xi           EnableINT();
1193*53ee8cc1Swenshuai.xi           #endif
1194*53ee8cc1Swenshuai.xi         #endif
1195*53ee8cc1Swenshuai.xi         #ifdef Enable_Low_Temperature_Patch
1196*53ee8cc1Swenshuai.xi 	    if(gSpeed==0)
1197*53ee8cc1Swenshuai.xi 	    {
1198*53ee8cc1Swenshuai.xi 	      //printf("\r\n CDR toggle!!",0);
1199*53ee8cc1Swenshuai.xi               UTMI_SETXBYTE(0x0a,UTMI_READXBYTE(0x0a)^0x10);    //invert CDR_CLOCK
1200*53ee8cc1Swenshuai.xi               UTMI_ORXBYTE(0x06,0x03);  //reset UTMI
1201*53ee8cc1Swenshuai.xi               UTMI_ANDXBYTE(0x06,0xfc);
1202*53ee8cc1Swenshuai.xi 
1203*53ee8cc1Swenshuai.xi 	    }
1204*53ee8cc1Swenshuai.xi 		#endif
1205*53ee8cc1Swenshuai.xi        // MDrv_Usb_Device_Enum();
1206*53ee8cc1Swenshuai.xi         if (MDrv_Usb_Device_Enum()==FALSE) return FALSE;
1207*53ee8cc1Swenshuai.xi 
1208*53ee8cc1Swenshuai.xi         continue;
1209*53ee8cc1Swenshuai.xi       }
1210*53ee8cc1Swenshuai.xi       else
1211*53ee8cc1Swenshuai.xi         return FALSE;
1212*53ee8cc1Swenshuai.xi     }
1213*53ee8cc1Swenshuai.xi 
1214*53ee8cc1Swenshuai.xi 	if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
1215*53ee8cc1Swenshuai.xi 	{
1216*53ee8cc1Swenshuai.xi 	  Mass_stor_us1.Mass_stor_device[lun].bDeviceReady = TRUE;
1217*53ee8cc1Swenshuai.xi       //SCSI_DbgPrint("SCSI TEST UNIT READY : Succeed\n",u8Drive);
1218*53ee8cc1Swenshuai.xi 
1219*53ee8cc1Swenshuai.xi 	  return TRUE;
1220*53ee8cc1Swenshuai.xi 	}
1221*53ee8cc1Swenshuai.xi 	else
1222*53ee8cc1Swenshuai.xi 	{
1223*53ee8cc1Swenshuai.xi 	#ifndef ATV_SERISE_USE
1224*53ee8cc1Swenshuai.xi          MsOS_DelayTask(10);
1225*53ee8cc1Swenshuai.xi 	#else
1226*53ee8cc1Swenshuai.xi          for(i=0;i<(0x100);i++);
1227*53ee8cc1Swenshuai.xi        #endif
1228*53ee8cc1Swenshuai.xi 
1229*53ee8cc1Swenshuai.xi 	  result=vSCSI_REQUEST_SENSE(lun);
1230*53ee8cc1Swenshuai.xi       if ((pUsbData[12]==0x3a)&&(pUsbData[13]==0)) return FALSE;  //no media
1231*53ee8cc1Swenshuai.xi       if ((pUsbData[12]==0x28)&&(pUsbData[13]==0)) return FALSE;  //media change
1232*53ee8cc1Swenshuai.xi 	  if (result==FALSE) return result;
1233*53ee8cc1Swenshuai.xi 	}
1234*53ee8cc1Swenshuai.xi     #ifndef ATV_SERISE_USE
1235*53ee8cc1Swenshuai.xi 	MsOS_DelayTask(10);
1236*53ee8cc1Swenshuai.xi 	#else
1237*53ee8cc1Swenshuai.xi 	for(i=0;i<0x100;i++);
1238*53ee8cc1Swenshuai.xi 	#endif
1239*53ee8cc1Swenshuai.xi   }
1240*53ee8cc1Swenshuai.xi 	//SCSI_DbgPrint("SCSI TEST UNIT READY : Failed%s","\n");
1241*53ee8cc1Swenshuai.xi   return FALSE;
1242*53ee8cc1Swenshuai.xi }
1243*53ee8cc1Swenshuai.xi //***************************************************************************************
1244*53ee8cc1Swenshuai.xi // Function Name:bSCSI_Initial
1245*53ee8cc1Swenshuai.xi // Description:
1246*53ee8cc1Swenshuai.xi // Input:
1247*53ee8cc1Swenshuai.xi // Output:
1248*53ee8cc1Swenshuai.xi // Status:P-OK
1249*53ee8cc1Swenshuai.xi //***************************************************************************************
1250*53ee8cc1Swenshuai.xi U8 ValidLunNum;
bSCSI_Initial(void)1251*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_Initial(void)
1252*53ee8cc1Swenshuai.xi {
1253*53ee8cc1Swenshuai.xi   //INT8U i=0;
1254*53ee8cc1Swenshuai.xi   //iCardSuddenlyRemove = FALSE;
1255*53ee8cc1Swenshuai.xi   //iCardReplace = FALSE;
1256*53ee8cc1Swenshuai.xi   BOOLEAN		bFoundValidDev = FALSE;
1257*53ee8cc1Swenshuai.xi   struct LUN_Device* LunDevice = Mass_stor_us1.Mass_stor_device;
1258*53ee8cc1Swenshuai.xi   U8		LunIdx;
1259*53ee8cc1Swenshuai.xi 
1260*53ee8cc1Swenshuai.xi  ValidLunNum=0;
1261*53ee8cc1Swenshuai.xi  for (	LunIdx=0; LunIdx<=Mass_stor_us1.max_lun; LunIdx++)
1262*53ee8cc1Swenshuai.xi   {
1263*53ee8cc1Swenshuai.xi     LunDevice[LunIdx].bDeviceValid=FALSE;
1264*53ee8cc1Swenshuai.xi 	if (bSCSI_INQUIRY(LunIdx))
1265*53ee8cc1Swenshuai.xi        {
1266*53ee8cc1Swenshuai.xi             LunDevice[LunIdx].bDeviceValid=TRUE;
1267*53ee8cc1Swenshuai.xi             ValidLunNum++;
1268*53ee8cc1Swenshuai.xi        }
1269*53ee8cc1Swenshuai.xi 	//break;
1270*53ee8cc1Swenshuai.xi   }
1271*53ee8cc1Swenshuai.xi  DRV_SCSI_DBG(printf("ValidLunNum:%02bx\n",ValidLunNum));
1272*53ee8cc1Swenshuai.xi     // For some usb harddrive without enough power, may meet following case.
1273*53ee8cc1Swenshuai.xi     if (!ValidLunNum)
1274*53ee8cc1Swenshuai.xi     {
1275*53ee8cc1Swenshuai.xi     	  if (mwHost20_PORTSC_ConnectChange_Rd()==0)
1276*53ee8cc1Swenshuai.xi             MDrv_SetUsbDeviceStatus(BAD_DEVICE);
1277*53ee8cc1Swenshuai.xi         return bFoundValidDev;
1278*53ee8cc1Swenshuai.xi     }
1279*53ee8cc1Swenshuai.xi 
1280*53ee8cc1Swenshuai.xi   // Sometime device is failed to initial at first time, but success at last.
1281*53ee8cc1Swenshuai.xi   // It set the device status as BAD_DEVICE at first time when it failed.
1282*53ee8cc1Swenshuai.xi   // We need to set correct value to device status when successed.
1283*53ee8cc1Swenshuai.xi   if (gSpeed==2)
1284*53ee8cc1Swenshuai.xi   {
1285*53ee8cc1Swenshuai.xi       MDrv_SetUsbDeviceStatus(USB20_DEVICE);
1286*53ee8cc1Swenshuai.xi   }
1287*53ee8cc1Swenshuai.xi   else
1288*53ee8cc1Swenshuai.xi   {
1289*53ee8cc1Swenshuai.xi       MDrv_SetUsbDeviceStatus(USB11_DEVICE);
1290*53ee8cc1Swenshuai.xi   }
1291*53ee8cc1Swenshuai.xi   #ifdef ATV_SERISE_USE
1292*53ee8cc1Swenshuai.xi     #ifdef Enable_Close_INT
1293*53ee8cc1Swenshuai.xi   EA=0;
1294*53ee8cc1Swenshuai.xi   #endif
1295*53ee8cc1Swenshuai.xi   #endif
1296*53ee8cc1Swenshuai.xi   for (	LunIdx=0; LunIdx<=Mass_stor_us1.max_lun; LunIdx++)
1297*53ee8cc1Swenshuai.xi   {
1298*53ee8cc1Swenshuai.xi     LunDevice[LunIdx].bDeviceReady = FALSE;
1299*53ee8cc1Swenshuai.xi 	if (!bInit_USB_LUN(LunIdx))
1300*53ee8cc1Swenshuai.xi 	  continue;
1301*53ee8cc1Swenshuai.xi 	LunDevice[LunIdx].bDeviceReady = TRUE;
1302*53ee8cc1Swenshuai.xi     bFoundValidDev = TRUE;
1303*53ee8cc1Swenshuai.xi 
1304*53ee8cc1Swenshuai.xi   }
1305*53ee8cc1Swenshuai.xi   #ifdef ATV_SERISE_USE
1306*53ee8cc1Swenshuai.xi     #ifdef Enable_Close_INT
1307*53ee8cc1Swenshuai.xi   EA=1;
1308*53ee8cc1Swenshuai.xi   #endif
1309*53ee8cc1Swenshuai.xi   #endif
1310*53ee8cc1Swenshuai.xi   return bFoundValidDev;
1311*53ee8cc1Swenshuai.xi 
1312*53ee8cc1Swenshuai.xi }
GetValidLun(void)1313*53ee8cc1Swenshuai.xi void GetValidLun(void)
1314*53ee8cc1Swenshuai.xi {
1315*53ee8cc1Swenshuai.xi   U8 LunIdx;
1316*53ee8cc1Swenshuai.xi   struct LUN_Device* LunDevice = Mass_stor_us1.Mass_stor_device;
1317*53ee8cc1Swenshuai.xi 
1318*53ee8cc1Swenshuai.xi   if (LunDevice == NULL)
1319*53ee8cc1Swenshuai.xi   {
1320*53ee8cc1Swenshuai.xi       DRV_SCSI_DBG(printf(" LUN structure not initialized!!\n"));
1321*53ee8cc1Swenshuai.xi       return;
1322*53ee8cc1Swenshuai.xi   }
1323*53ee8cc1Swenshuai.xi 
1324*53ee8cc1Swenshuai.xi   if ( (Mass_stor_us1.max_lun == 0) && (!LunDevice[0].bRMB) && LunDevice[0].bDeviceReady)
1325*53ee8cc1Swenshuai.xi   {
1326*53ee8cc1Swenshuai.xi         //20120817, Don't do TUR on this special USB HDD.
1327*53ee8cc1Swenshuai.xi         //It returns NOT READY after 30 minutes idle.
1328*53ee8cc1Swenshuai.xi               return;
1329*53ee8cc1Swenshuai.xi           }
1330*53ee8cc1Swenshuai.xi 
1331*53ee8cc1Swenshuai.xi   for (LunIdx=0; LunIdx<=Mass_stor_us1.max_lun; LunIdx++)
1332*53ee8cc1Swenshuai.xi   {
1333*53ee8cc1Swenshuai.xi     if (LunDevice[LunIdx].bDeviceValid)
1334*53ee8cc1Swenshuai.xi     {
1335*53ee8cc1Swenshuai.xi       if(!bSCSI_TEST_UNIT_READY2(LunIdx))
1336*53ee8cc1Swenshuai.xi       {
1337*53ee8cc1Swenshuai.xi             LunDevice[LunIdx].bDeviceReady=FALSE;
1338*53ee8cc1Swenshuai.xi             LunDevice[LunIdx].u32BlockSize = 0; // 20111110: resolve lun capacity zero if not the first lun
1339*53ee8cc1Swenshuai.xi             LunDevice[LunIdx].u32BlockTotalNum = 0;
1340*53ee8cc1Swenshuai.xi       }
1341*53ee8cc1Swenshuai.xi       else
1342*53ee8cc1Swenshuai.xi       {
1343*53ee8cc1Swenshuai.xi               LunDevice[LunIdx].bDeviceReady = TRUE;
1344*53ee8cc1Swenshuai.xi               if (LunDevice[LunIdx].u32BlockSize == 0) // 20111110: resolve lun capacity zero if not the first lun
1345*53ee8cc1Swenshuai.xi               {
1346*53ee8cc1Swenshuai.xi                   if(!bSCSI_READ_CAPACITY(LunIdx))
1347*53ee8cc1Swenshuai.xi                   {
1348*53ee8cc1Swenshuai.xi                     if (!bSCSI_READ_FORMAT_CAPACITY(LunIdx))
1349*53ee8cc1Swenshuai.xi                     {
1350*53ee8cc1Swenshuai.xi                         DRV_SCSI_DBG(SCSI_DbgPrint("Read CAPACITY failed.%s","\n"));
1351*53ee8cc1Swenshuai.xi                     }
1352*53ee8cc1Swenshuai.xi                   }
1353*53ee8cc1Swenshuai.xi               }
1354*53ee8cc1Swenshuai.xi         }
1355*53ee8cc1Swenshuai.xi     }
1356*53ee8cc1Swenshuai.xi     else
1357*53ee8cc1Swenshuai.xi       LunDevice[LunIdx].bDeviceReady=FALSE;                   //not a valid device, so always not ready
1358*53ee8cc1Swenshuai.xi   }
1359*53ee8cc1Swenshuai.xi }
bInit_USB_LUN(U8 Lun)1360*53ee8cc1Swenshuai.xi BOOLEAN bInit_USB_LUN(U8 Lun)
1361*53ee8cc1Swenshuai.xi {
1362*53ee8cc1Swenshuai.xi   U16   uVID, uPID;
1363*53ee8cc1Swenshuai.xi   U8     ii;
1364*53ee8cc1Swenshuai.xi   BOOLEAN bIsForceMS1A = FALSE;
1365*53ee8cc1Swenshuai.xi 
1366*53ee8cc1Swenshuai.xi   MDrv_USBGetVIDPID(&uVID, &uPID);
1367*53ee8cc1Swenshuai.xi   if ( (uVID == 0xFCA) && (uPID == 0x8004) ) //20130301, for blackberry phone
1368*53ee8cc1Swenshuai.xi   {
1369*53ee8cc1Swenshuai.xi       if (!bSCSI_INQUIRY(Lun))
1370*53ee8cc1Swenshuai.xi       {
1371*53ee8cc1Swenshuai.xi         DRV_SCSI_DBG(SCSI_DbgPrint("Scsi inquiry failed (Lun=%d).\n",u8Drive));
1372*53ee8cc1Swenshuai.xi     	return FALSE;
1373*53ee8cc1Swenshuai.xi       }
1374*53ee8cc1Swenshuai.xi   }
1375*53ee8cc1Swenshuai.xi 
1376*53ee8cc1Swenshuai.xi   if(!bSCSI_TEST_UNIT_READY(Lun))
1377*53ee8cc1Swenshuai.xi   {
1378*53ee8cc1Swenshuai.xi     DRV_SCSI_DBG(SCSI_DbgPrint("Scsi Device not ready (Lun=%d).\n",Lun));
1379*53ee8cc1Swenshuai.xi 	return FALSE;
1380*53ee8cc1Swenshuai.xi   }
1381*53ee8cc1Swenshuai.xi   //bSCSI_INQUIRY();
1382*53ee8cc1Swenshuai.xi   if (!bSCSI_INQUIRY(Lun))
1383*53ee8cc1Swenshuai.xi   {
1384*53ee8cc1Swenshuai.xi     DRV_SCSI_DBG(SCSI_DbgPrint("Scsi inquiry failed (Lun=%d).\n",u8Drive));
1385*53ee8cc1Swenshuai.xi 	return FALSE;
1386*53ee8cc1Swenshuai.xi   }
1387*53ee8cc1Swenshuai.xi   if(!bSCSI_READ_CAPACITY(Lun))
1388*53ee8cc1Swenshuai.xi   {
1389*53ee8cc1Swenshuai.xi     if (!bSCSI_READ_FORMAT_CAPACITY(Lun))
1390*53ee8cc1Swenshuai.xi     {
1391*53ee8cc1Swenshuai.xi         DRV_SCSI_DBG(SCSI_DbgPrint("Read CAPACITY failed.%s","\n"));
1392*53ee8cc1Swenshuai.xi         return FALSE;
1393*53ee8cc1Swenshuai.xi     }
1394*53ee8cc1Swenshuai.xi   }
1395*53ee8cc1Swenshuai.xi 
1396*53ee8cc1Swenshuai.xi #ifdef ENABLE_CBI_HOST
1397*53ee8cc1Swenshuai.xi     if ((sAttachDevice.saCD[0].sInterface[0].bInterfaceProtocol==0x00)||(sAttachDevice.saCD[0].sInterface[0].bInterfaceProtocol==0x01))
1398*53ee8cc1Swenshuai.xi     {
1399*53ee8cc1Swenshuai.xi         //do nothing
1400*53ee8cc1Swenshuai.xi     }
1401*53ee8cc1Swenshuai.xi     else
1402*53ee8cc1Swenshuai.xi #endif
1403*53ee8cc1Swenshuai.xi     {
1404*53ee8cc1Swenshuai.xi     MDrv_USBGetVIDPID(&uVID, &uPID);
1405*53ee8cc1Swenshuai.xi     DRV_SCSI_DBG(printf("VID: %x, PID: %x\n", uVID, uPID));
1406*53ee8cc1Swenshuai.xi     ii = 0;
1407*53ee8cc1Swenshuai.xi     while ( (gForceModeSense1A[ii].VID != 0) && (gForceModeSense1A[ii].PID != 0) )
1408*53ee8cc1Swenshuai.xi     {
1409*53ee8cc1Swenshuai.xi         if ( (uVID == gForceModeSense1A[ii].VID) && (uPID == gForceModeSense1A[ii].PID) )
1410*53ee8cc1Swenshuai.xi         {
1411*53ee8cc1Swenshuai.xi             DRV_SCSI_DBG(printf("Find a Force Mode Sense 1A device\n"));
1412*53ee8cc1Swenshuai.xi             bIsForceMS1A = TRUE;
1413*53ee8cc1Swenshuai.xi         }
1414*53ee8cc1Swenshuai.xi 
1415*53ee8cc1Swenshuai.xi         ii++;
1416*53ee8cc1Swenshuai.xi         if (ii >= (sizeof(gForceModeSense1A) / sizeof(struct stForceModeSense1A)))
1417*53ee8cc1Swenshuai.xi           break;
1418*53ee8cc1Swenshuai.xi     }
1419*53ee8cc1Swenshuai.xi 
1420*53ee8cc1Swenshuai.xi     if (bIsForceMS1A)
1421*53ee8cc1Swenshuai.xi         bSCSI_MODE_SENSE(Lun);
1422*53ee8cc1Swenshuai.xi     else
1423*53ee8cc1Swenshuai.xi         bSCSI_MODE_SENSE_OperCode5A(Lun);
1424*53ee8cc1Swenshuai.xi 
1425*53ee8cc1Swenshuai.xi     }
1426*53ee8cc1Swenshuai.xi 
1427*53ee8cc1Swenshuai.xi   //if (!bSCSI_MODE_SENSE(Lun))
1428*53ee8cc1Swenshuai.xi   //{
1429*53ee8cc1Swenshuai.xi   //  SCSI_DbgPrint("Mode sense failed!\n");
1430*53ee8cc1Swenshuai.xi   //  return FALSE;
1431*53ee8cc1Swenshuai.xi   //}
1432*53ee8cc1Swenshuai.xi 
1433*53ee8cc1Swenshuai.xi   if(!bSCSI_TEST_UNIT_READY(Lun))
1434*53ee8cc1Swenshuai.xi   {
1435*53ee8cc1Swenshuai.xi     DRV_SCSI_DBG(SCSI_DbgPrint("Scsi Device not ready (Lun=%d).\n",u8Drive));
1436*53ee8cc1Swenshuai.xi 	return FALSE;
1437*53ee8cc1Swenshuai.xi   }
1438*53ee8cc1Swenshuai.xi   return TRUE;
1439*53ee8cc1Swenshuai.xi 
1440*53ee8cc1Swenshuai.xi }
1441*53ee8cc1Swenshuai.xi 
1442*53ee8cc1Swenshuai.xi 
1443*53ee8cc1Swenshuai.xi //***************************************************************************************
1444*53ee8cc1Swenshuai.xi // Function Name:
1445*53ee8cc1Swenshuai.xi // Description:
1446*53ee8cc1Swenshuai.xi // Input:
1447*53ee8cc1Swenshuai.xi // Output:
1448*53ee8cc1Swenshuai.xi // Status:
1449*53ee8cc1Swenshuai.xi //***************************************************************************************
1450*53ee8cc1Swenshuai.xi 
1451*53ee8cc1Swenshuai.xi 
1452*53ee8cc1Swenshuai.xi 
bSCSI_Read_Write10(BOOLEAN DoWrite,U8 lun,INT32U u32BlockAddr,INT32U u32BlockNum,U32 u8Buffer)1453*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_Read_Write10(BOOLEAN DoWrite, U8 lun,  INT32U u32BlockAddr, INT32U u32BlockNum,U32 u8Buffer)
1454*53ee8cc1Swenshuai.xi {
1455*53ee8cc1Swenshuai.xi 
1456*53ee8cc1Swenshuai.xi   //Scsi_Cmnd  srb_data;
1457*53ee8cc1Swenshuai.xi   BOOLEAN result;
1458*53ee8cc1Swenshuai.xi   Mass_stor_us1.srb = &srb_data;
1459*53ee8cc1Swenshuai.xi   //memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
1460*53ee8cc1Swenshuai.xi   //printf("read sector:%lx, sz:%lx\n",u32BlockAddr,u32BlockNum);
1461*53ee8cc1Swenshuai.xi 
1462*53ee8cc1Swenshuai.xi   if (DoWrite)
1463*53ee8cc1Swenshuai.xi   {
1464*53ee8cc1Swenshuai.xi     if(Mass_stor_us1.Mass_stor_device[lun].bWriteProtect)
1465*53ee8cc1Swenshuai.xi     {
1466*53ee8cc1Swenshuai.xi 	  DRV_SCSI_DBG(printf("This device is write protect now\n"));
1467*53ee8cc1Swenshuai.xi 	  return FALSE;
1468*53ee8cc1Swenshuai.xi 	}
1469*53ee8cc1Swenshuai.xi   }
1470*53ee8cc1Swenshuai.xi 
1471*53ee8cc1Swenshuai.xi   //Build SCSI command.
1472*53ee8cc1Swenshuai.xi   vSCSICmd_READ_WRITE_10(DoWrite,&Mass_stor_us1, Mass_stor_us1.srb, lun,
1473*53ee8cc1Swenshuai.xi 								u32BlockAddr, (INT16U)u32BlockNum, u8Buffer);
1474*53ee8cc1Swenshuai.xi 
1475*53ee8cc1Swenshuai.xi 
1476*53ee8cc1Swenshuai.xi   //call mass storage function to send scsi command
1477*53ee8cc1Swenshuai.xi   result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
1478*53ee8cc1Swenshuai.xi   if (result==FALSE) return result;
1479*53ee8cc1Swenshuai.xi 
1480*53ee8cc1Swenshuai.xi   if(Mass_stor_us1.srb->result != SAM_STAT_GOOD)
1481*53ee8cc1Swenshuai.xi   {
1482*53ee8cc1Swenshuai.xi     DRV_SCSI_DBG(SCSI_DbgPrint("Scsi ReadWrite_10 command failed.%s","\n"));
1483*53ee8cc1Swenshuai.xi 
1484*53ee8cc1Swenshuai.xi 	return FALSE;
1485*53ee8cc1Swenshuai.xi   }
1486*53ee8cc1Swenshuai.xi 
1487*53ee8cc1Swenshuai.xi 
1488*53ee8cc1Swenshuai.xi   //printf("#");
1489*53ee8cc1Swenshuai.xi   return TRUE;
1490*53ee8cc1Swenshuai.xi 
1491*53ee8cc1Swenshuai.xi 
1492*53ee8cc1Swenshuai.xi 
1493*53ee8cc1Swenshuai.xi }
1494*53ee8cc1Swenshuai.xi 
1495*53ee8cc1Swenshuai.xi #endif //#if defined(MSOS_TYPE_NOS)
1496*53ee8cc1Swenshuai.xi 
1497*53ee8cc1Swenshuai.xi 
1498*53ee8cc1Swenshuai.xi 
1499