1*4e1bc9a0SAchim Leubner /*******************************************************************************
2*4e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
3*4e1bc9a0SAchim Leubner *
4*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*4e1bc9a0SAchim Leubner *that the following conditions are met:
6*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*4e1bc9a0SAchim Leubner *following disclaimer.
8*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
9*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*4e1bc9a0SAchim Leubner *with the distribution.
11*4e1bc9a0SAchim Leubner *
12*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20*4e1bc9a0SAchim Leubner
21*4e1bc9a0SAchim Leubner ********************************************************************************/
22*4e1bc9a0SAchim Leubner /*****************************************************************************/
23*4e1bc9a0SAchim Leubner /** \file
24*4e1bc9a0SAchim Leubner *
25*4e1bc9a0SAchim Leubner * The file implementing LL HW encapsulation for SCSI/ATA Translation (SAT).
26*4e1bc9a0SAchim Leubner *
27*4e1bc9a0SAchim Leubner */
28*4e1bc9a0SAchim Leubner /*****************************************************************************/
29*4e1bc9a0SAchim Leubner #include <sys/cdefs.h>
30*4e1bc9a0SAchim Leubner #include <dev/pms/config.h>
31*4e1bc9a0SAchim Leubner
32*4e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osenv.h>
33*4e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/ostypes.h>
34*4e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osdebug.h>
35*4e1bc9a0SAchim Leubner
36*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/sa.h>
37*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
38*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
39*4e1bc9a0SAchim Leubner
40*4e1bc9a0SAchim Leubner #ifdef SATA_ENABLE
41*4e1bc9a0SAchim Leubner
42*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/titypes.h>
43*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
44*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/tiapi.h>
45*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
46*4e1bc9a0SAchim Leubner
47*4e1bc9a0SAchim Leubner #ifdef FDS_SM
48*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sat/api/sm.h>
49*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sat/api/smapi.h>
50*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
51*4e1bc9a0SAchim Leubner #endif
52*4e1bc9a0SAchim Leubner
53*4e1bc9a0SAchim Leubner #ifdef FDS_DM
54*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dm.h>
55*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dmapi.h>
56*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
57*4e1bc9a0SAchim Leubner #endif
58*4e1bc9a0SAchim Leubner
59*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
60*4e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osstring.h>
61*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
62*4e1bc9a0SAchim Leubner
63*4e1bc9a0SAchim Leubner #ifdef INITIATOR_DRIVER
64*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
65*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
66*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
67*4e1bc9a0SAchim Leubner #endif
68*4e1bc9a0SAchim Leubner
69*4e1bc9a0SAchim Leubner #ifdef TARGET_DRIVER
70*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
71*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
72*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
73*4e1bc9a0SAchim Leubner #endif
74*4e1bc9a0SAchim Leubner
75*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
76*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
77*4e1bc9a0SAchim Leubner
78*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sata/host/sat.h>
79*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sata/host/satproto.h>
80*4e1bc9a0SAchim Leubner
81*4e1bc9a0SAchim Leubner /*
82*4e1bc9a0SAchim Leubner * This table is used to map LL Layer saSATAStart() status to TISA status.
83*4e1bc9a0SAchim Leubner */
84*4e1bc9a0SAchim Leubner static bit32 mapStat[3] =
85*4e1bc9a0SAchim Leubner {
86*4e1bc9a0SAchim Leubner tiSuccess,
87*4e1bc9a0SAchim Leubner tiError,
88*4e1bc9a0SAchim Leubner tiBusy
89*4e1bc9a0SAchim Leubner };
90*4e1bc9a0SAchim Leubner
91*4e1bc9a0SAchim Leubner
92*4e1bc9a0SAchim Leubner /*****************************************************************************
93*4e1bc9a0SAchim Leubner *! \brief sataLLIOStart
94*4e1bc9a0SAchim Leubner *
95*4e1bc9a0SAchim Leubner * This routine is called to initiate a new SATA request to LL layer.
96*4e1bc9a0SAchim Leubner * This function implements/encapsulates HW and LL API dependency.
97*4e1bc9a0SAchim Leubner *
98*4e1bc9a0SAchim Leubner * \param tiRoot: Pointer to TISA initiator driver/port instance.
99*4e1bc9a0SAchim Leubner * \param tiIORequest: Pointer to TISA I/O request context for this I/O.
100*4e1bc9a0SAchim Leubner * \param tiDeviceHandle: Pointer to TISA device handle for this I/O.
101*4e1bc9a0SAchim Leubner * \param tiScsiRequest: Pointer to TISA SCSI I/O request and SGL list.
102*4e1bc9a0SAchim Leubner * \param satIOContext_t: Pointer to the SAT IO Context
103*4e1bc9a0SAchim Leubner *
104*4e1bc9a0SAchim Leubner * \return:
105*4e1bc9a0SAchim Leubner *
106*4e1bc9a0SAchim Leubner * \e tiSuccess: I/O request successfully initiated.
107*4e1bc9a0SAchim Leubner * \e tiBusy: No resources available, try again later.
108*4e1bc9a0SAchim Leubner * \e tiIONoDevice: Invalid device handle.
109*4e1bc9a0SAchim Leubner * \e tiError: Other errors that prevent the I/O request to be started.
110*4e1bc9a0SAchim Leubner *
111*4e1bc9a0SAchim Leubner *
112*4e1bc9a0SAchim Leubner *****************************************************************************/
113*4e1bc9a0SAchim Leubner
sataLLIOStart(tiRoot_t * tiRoot,tiIORequest_t * tiIORequest,tiDeviceHandle_t * tiDeviceHandle,tiScsiInitiatorRequest_t * tiScsiRequest,satIOContext_t * satIOContext)114*4e1bc9a0SAchim Leubner GLOBAL bit32 sataLLIOStart (
115*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
116*4e1bc9a0SAchim Leubner tiIORequest_t *tiIORequest,
117*4e1bc9a0SAchim Leubner tiDeviceHandle_t *tiDeviceHandle,
118*4e1bc9a0SAchim Leubner tiScsiInitiatorRequest_t *tiScsiRequest,
119*4e1bc9a0SAchim Leubner satIOContext_t *satIOContext
120*4e1bc9a0SAchim Leubner )
121*4e1bc9a0SAchim Leubner {
122*4e1bc9a0SAchim Leubner
123*4e1bc9a0SAchim Leubner tdsaDeviceData_t *oneDeviceData;
124*4e1bc9a0SAchim Leubner agsaRoot_t *agRoot;
125*4e1bc9a0SAchim Leubner agsaIORequest_t *agIORequest;
126*4e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle;
127*4e1bc9a0SAchim Leubner bit32 status;
128*4e1bc9a0SAchim Leubner tdIORequestBody_t *tdIORequestBody;
129*4e1bc9a0SAchim Leubner agsaSATAInitiatorRequest_t *agSATAReq;
130*4e1bc9a0SAchim Leubner satDeviceData_t *pSatDevData;
131*4e1bc9a0SAchim Leubner satInternalIo_t *satIntIo;
132*4e1bc9a0SAchim Leubner bit32 RLERecovery = agFALSE;
133*4e1bc9a0SAchim Leubner
134*4e1bc9a0SAchim Leubner oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
135*4e1bc9a0SAchim Leubner agRoot = oneDeviceData->agRoot;
136*4e1bc9a0SAchim Leubner agDevHandle = oneDeviceData->agDevHandle;
137*4e1bc9a0SAchim Leubner tdIORequestBody = (tdIORequestBody_t *)satIOContext->tiRequestBody;
138*4e1bc9a0SAchim Leubner agSATAReq = &(tdIORequestBody->transport.SATA.agSATARequestBody);
139*4e1bc9a0SAchim Leubner pSatDevData = satIOContext->pSatDevData;
140*4e1bc9a0SAchim Leubner satIntIo = satIOContext->satIntIoContext;
141*4e1bc9a0SAchim Leubner
142*4e1bc9a0SAchim Leubner /*
143*4e1bc9a0SAchim Leubner * If this is a super I/O request, check for optional settings.
144*4e1bc9a0SAchim Leubner * Be careful. Use the superRequest pointer for all references
145*4e1bc9a0SAchim Leubner * in this block of code.
146*4e1bc9a0SAchim Leubner */
147*4e1bc9a0SAchim Leubner agSATAReq->option = 0;
148*4e1bc9a0SAchim Leubner if (satIOContext->superIOFlag)
149*4e1bc9a0SAchim Leubner {
150*4e1bc9a0SAchim Leubner tiSuperScsiInitiatorRequest_t *superRequest = (tiSuperScsiInitiatorRequest_t *) tiScsiRequest;
151*4e1bc9a0SAchim Leubner agBOOLEAN needPlusDataLenAdjustment = agFALSE;
152*4e1bc9a0SAchim Leubner agBOOLEAN needMinusDataLenAdjustment = agFALSE;
153*4e1bc9a0SAchim Leubner bit32 adjusted_length;
154*4e1bc9a0SAchim Leubner
155*4e1bc9a0SAchim Leubner if (superRequest->flags & TI_SCSI_INITIATOR_ENCRYPT)
156*4e1bc9a0SAchim Leubner {
157*4e1bc9a0SAchim Leubner /*
158*4e1bc9a0SAchim Leubner * Copy all of the relevant encrypt information
159*4e1bc9a0SAchim Leubner */
160*4e1bc9a0SAchim Leubner agSATAReq->option |= AGSA_SATA_ENABLE_ENCRYPTION;
161*4e1bc9a0SAchim Leubner osti_memcpy(&agSATAReq->encrypt, &superRequest->Encrypt, sizeof(agsaEncrypt_t));
162*4e1bc9a0SAchim Leubner }
163*4e1bc9a0SAchim Leubner
164*4e1bc9a0SAchim Leubner if (superRequest->flags & TI_SCSI_INITIATOR_DIF)
165*4e1bc9a0SAchim Leubner {
166*4e1bc9a0SAchim Leubner /*
167*4e1bc9a0SAchim Leubner * Copy all of the relevant DIF information
168*4e1bc9a0SAchim Leubner */
169*4e1bc9a0SAchim Leubner agSATAReq->option |= AGSA_SATA_ENABLE_DIF;
170*4e1bc9a0SAchim Leubner osti_memcpy(&agSATAReq->dif, &superRequest->Dif, sizeof(agsaDif_t));
171*4e1bc9a0SAchim Leubner
172*4e1bc9a0SAchim Leubner /*
173*4e1bc9a0SAchim Leubner * Set SGL data len
174*4e1bc9a0SAchim Leubner * XXX This code needs to support more sector sizes
175*4e1bc9a0SAchim Leubner */
176*4e1bc9a0SAchim Leubner if (needPlusDataLenAdjustment == agTRUE)
177*4e1bc9a0SAchim Leubner {
178*4e1bc9a0SAchim Leubner adjusted_length = superRequest->scsiCmnd.expDataLength;
179*4e1bc9a0SAchim Leubner adjusted_length += (adjusted_length/512) * 8;
180*4e1bc9a0SAchim Leubner agSATAReq->dataLength = adjusted_length;
181*4e1bc9a0SAchim Leubner }
182*4e1bc9a0SAchim Leubner else if (needMinusDataLenAdjustment == agTRUE)
183*4e1bc9a0SAchim Leubner {
184*4e1bc9a0SAchim Leubner adjusted_length = superRequest->scsiCmnd.expDataLength;
185*4e1bc9a0SAchim Leubner adjusted_length -= (adjusted_length/520) * 8;
186*4e1bc9a0SAchim Leubner agSATAReq->dataLength = adjusted_length;
187*4e1bc9a0SAchim Leubner }
188*4e1bc9a0SAchim Leubner else
189*4e1bc9a0SAchim Leubner {
190*4e1bc9a0SAchim Leubner /* setting the data length */
191*4e1bc9a0SAchim Leubner agSATAReq->dataLength = superRequest->scsiCmnd.expDataLength;
192*4e1bc9a0SAchim Leubner }
193*4e1bc9a0SAchim Leubner
194*4e1bc9a0SAchim Leubner tdIORequestBody->IOType.InitiatorRegIO.expDataLength = agSATAReq->dataLength;
195*4e1bc9a0SAchim Leubner }
196*4e1bc9a0SAchim Leubner else
197*4e1bc9a0SAchim Leubner {
198*4e1bc9a0SAchim Leubner /* initialize expDataLength */
199*4e1bc9a0SAchim Leubner if (satIOContext->reqType == AGSA_SATA_PROTOCOL_NON_DATA ||
200*4e1bc9a0SAchim Leubner satIOContext->reqType == AGSA_SATA_PROTOCOL_SRST_ASSERT ||
201*4e1bc9a0SAchim Leubner satIOContext->reqType == AGSA_SATA_PROTOCOL_SRST_DEASSERT
202*4e1bc9a0SAchim Leubner )
203*4e1bc9a0SAchim Leubner {
204*4e1bc9a0SAchim Leubner tdIORequestBody->IOType.InitiatorRegIO.expDataLength = 0;
205*4e1bc9a0SAchim Leubner }
206*4e1bc9a0SAchim Leubner else
207*4e1bc9a0SAchim Leubner {
208*4e1bc9a0SAchim Leubner tdIORequestBody->IOType.InitiatorRegIO.expDataLength = tiScsiRequest->scsiCmnd.expDataLength;
209*4e1bc9a0SAchim Leubner }
210*4e1bc9a0SAchim Leubner
211*4e1bc9a0SAchim Leubner agSATAReq->dataLength = tdIORequestBody->IOType.InitiatorRegIO.expDataLength;
212*4e1bc9a0SAchim Leubner }
213*4e1bc9a0SAchim Leubner }
214*4e1bc9a0SAchim Leubner else
215*4e1bc9a0SAchim Leubner {
216*4e1bc9a0SAchim Leubner agSATAReq->option = 0;
217*4e1bc9a0SAchim Leubner /* initialize expDataLength */
218*4e1bc9a0SAchim Leubner if (satIOContext->reqType == AGSA_SATA_PROTOCOL_NON_DATA ||
219*4e1bc9a0SAchim Leubner satIOContext->reqType == AGSA_SATA_PROTOCOL_SRST_ASSERT ||
220*4e1bc9a0SAchim Leubner satIOContext->reqType == AGSA_SATA_PROTOCOL_SRST_DEASSERT
221*4e1bc9a0SAchim Leubner )
222*4e1bc9a0SAchim Leubner {
223*4e1bc9a0SAchim Leubner tdIORequestBody->IOType.InitiatorRegIO.expDataLength = 0;
224*4e1bc9a0SAchim Leubner }
225*4e1bc9a0SAchim Leubner else
226*4e1bc9a0SAchim Leubner {
227*4e1bc9a0SAchim Leubner tdIORequestBody->IOType.InitiatorRegIO.expDataLength = tiScsiRequest->scsiCmnd.expDataLength;
228*4e1bc9a0SAchim Leubner }
229*4e1bc9a0SAchim Leubner
230*4e1bc9a0SAchim Leubner agSATAReq->dataLength = tdIORequestBody->IOType.InitiatorRegIO.expDataLength;
231*4e1bc9a0SAchim Leubner }
232*4e1bc9a0SAchim Leubner
233*4e1bc9a0SAchim Leubner if ( (pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY) &&
234*4e1bc9a0SAchim Leubner (satIOContext->pFis->h.command == SAT_READ_LOG_EXT)
235*4e1bc9a0SAchim Leubner )
236*4e1bc9a0SAchim Leubner {
237*4e1bc9a0SAchim Leubner RLERecovery = agTRUE;
238*4e1bc9a0SAchim Leubner }
239*4e1bc9a0SAchim Leubner
240*4e1bc9a0SAchim Leubner /* check max io */
241*4e1bc9a0SAchim Leubner /* be sure to free */
242*4e1bc9a0SAchim Leubner if ( (pSatDevData->satDriveState != SAT_DEV_STATE_IN_RECOVERY) ||
243*4e1bc9a0SAchim Leubner (RLERecovery == agTRUE)
244*4e1bc9a0SAchim Leubner )
245*4e1bc9a0SAchim Leubner {
246*4e1bc9a0SAchim Leubner if (RLERecovery == agFALSE) /* RLE is not checked against pending IO's */
247*4e1bc9a0SAchim Leubner {
248*4e1bc9a0SAchim Leubner if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
249*4e1bc9a0SAchim Leubner (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
250*4e1bc9a0SAchim Leubner {
251*4e1bc9a0SAchim Leubner if (pSatDevData->satPendingNCQIO >= pSatDevData->satNCQMaxIO ||
252*4e1bc9a0SAchim Leubner pSatDevData->satPendingNONNCQIO != 0)
253*4e1bc9a0SAchim Leubner {
254*4e1bc9a0SAchim Leubner TI_DBG1(("sataLLIOStart: 1st busy NCQ. NCQ Pending %d NONNCQ Pending %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
255*4e1bc9a0SAchim Leubner /* free resource */
256*4e1bc9a0SAchim Leubner satFreeIntIoResource( tiRoot,
257*4e1bc9a0SAchim Leubner pSatDevData,
258*4e1bc9a0SAchim Leubner satIntIo);
259*4e1bc9a0SAchim Leubner return tiBusy;
260*4e1bc9a0SAchim Leubner }
261*4e1bc9a0SAchim Leubner }
262*4e1bc9a0SAchim Leubner else
263*4e1bc9a0SAchim Leubner {
264*4e1bc9a0SAchim Leubner if (pSatDevData->satPendingNONNCQIO >= SAT_NONNCQ_MAX ||
265*4e1bc9a0SAchim Leubner pSatDevData->satPendingNCQIO != 0)
266*4e1bc9a0SAchim Leubner {
267*4e1bc9a0SAchim Leubner TI_DBG1(("sataLLIOStart: 2nd busy NON-NCQ. NCQ Pending %d NON-NCQ Pending %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
268*4e1bc9a0SAchim Leubner /* free resource */
269*4e1bc9a0SAchim Leubner satFreeIntIoResource( tiRoot,
270*4e1bc9a0SAchim Leubner pSatDevData,
271*4e1bc9a0SAchim Leubner satIntIo);
272*4e1bc9a0SAchim Leubner return tiBusy;
273*4e1bc9a0SAchim Leubner }
274*4e1bc9a0SAchim Leubner }
275*4e1bc9a0SAchim Leubner } /* RLE */
276*4e1bc9a0SAchim Leubner /* for internal SATA command only */
277*4e1bc9a0SAchim Leubner if (satIOContext->satOrgIOContext != agNULL)
278*4e1bc9a0SAchim Leubner {
279*4e1bc9a0SAchim Leubner /* Initialize tiIORequest */
280*4e1bc9a0SAchim Leubner tdIORequestBody->tiIORequest = tiIORequest;
281*4e1bc9a0SAchim Leubner }
282*4e1bc9a0SAchim Leubner /* Initialize tiDevhandle */
283*4e1bc9a0SAchim Leubner tdIORequestBody->tiDevHandle = tiDeviceHandle;
284*4e1bc9a0SAchim Leubner
285*4e1bc9a0SAchim Leubner /* Initializes Scatter Gather and ESGL */
286*4e1bc9a0SAchim Leubner status = itdsataIOPrepareSGL( tiRoot,
287*4e1bc9a0SAchim Leubner tdIORequestBody,
288*4e1bc9a0SAchim Leubner &tiScsiRequest->agSgl1,
289*4e1bc9a0SAchim Leubner tiScsiRequest->sglVirtualAddr );
290*4e1bc9a0SAchim Leubner
291*4e1bc9a0SAchim Leubner if (status != tiSuccess)
292*4e1bc9a0SAchim Leubner {
293*4e1bc9a0SAchim Leubner TI_DBG1(("sataLLIOStart: can't get SGL\n"));
294*4e1bc9a0SAchim Leubner return status;
295*4e1bc9a0SAchim Leubner }
296*4e1bc9a0SAchim Leubner
297*4e1bc9a0SAchim Leubner
298*4e1bc9a0SAchim Leubner /* Initialize LL Layer agIORequest */
299*4e1bc9a0SAchim Leubner agIORequest = &(tdIORequestBody->agIORequest);
300*4e1bc9a0SAchim Leubner agIORequest->osData = (void *) tdIORequestBody;
301*4e1bc9a0SAchim Leubner agIORequest->sdkData = agNULL; /* SA takes care of this */
302*4e1bc9a0SAchim Leubner
303*4e1bc9a0SAchim Leubner tdIORequestBody->ioStarted = agTRUE;
304*4e1bc9a0SAchim Leubner tdIORequestBody->ioCompleted = agFALSE;
305*4e1bc9a0SAchim Leubner
306*4e1bc9a0SAchim Leubner /*
307*4e1bc9a0SAchim Leubner
308*4e1bc9a0SAchim Leubner #ifdef PRE_SALL_v033
309*4e1bc9a0SAchim Leubner GLOBAL bit32 saSATAStart(
310*4e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
311*4e1bc9a0SAchim Leubner agsaIORequest_t *agIORequest,
312*4e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle,
313*4e1bc9a0SAchim Leubner bit32 agRequestType,
314*4e1bc9a0SAchim Leubner agsaSATAInitiatorRequest_t *agSATAReq,
315*4e1bc9a0SAchim Leubner bit8 *agTag
316*4e1bc9a0SAchim Leubner );
317*4e1bc9a0SAchim Leubner #endif
318*4e1bc9a0SAchim Leubner GLOBAL bit32 saSATAStart(
319*4e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
320*4e1bc9a0SAchim Leubner agsaIORequest_t *agIORequest,
321*4e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle,
322*4e1bc9a0SAchim Leubner bit32 agRequestType,
323*4e1bc9a0SAchim Leubner agsaSATAInitiatorRequest_t *agSATAReq,
324*4e1bc9a0SAchim Leubner bit8 agTag,
325*4e1bc9a0SAchim Leubner ossaSATACompletedCB_t agCB
326*4e1bc9a0SAchim Leubner );
327*4e1bc9a0SAchim Leubner */
328*4e1bc9a0SAchim Leubner
329*4e1bc9a0SAchim Leubner /* assign tag value for SATA */
330*4e1bc9a0SAchim Leubner if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
331*4e1bc9a0SAchim Leubner (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
332*4e1bc9a0SAchim Leubner {
333*4e1bc9a0SAchim Leubner if (agFALSE == satTagAlloc(tiRoot, pSatDevData, &satIOContext->sataTag))
334*4e1bc9a0SAchim Leubner {
335*4e1bc9a0SAchim Leubner TI_DBG1(("sataLLIOStart: No more NCQ tag\n"));
336*4e1bc9a0SAchim Leubner tdIORequestBody->ioStarted = agFALSE;
337*4e1bc9a0SAchim Leubner tdIORequestBody->ioCompleted = agTRUE;
338*4e1bc9a0SAchim Leubner return tiBusy;
339*4e1bc9a0SAchim Leubner }
340*4e1bc9a0SAchim Leubner TI_DBG3(("sataLLIOStart: ncq tag 0x%x\n",satIOContext->sataTag));
341*4e1bc9a0SAchim Leubner }
342*4e1bc9a0SAchim Leubner else
343*4e1bc9a0SAchim Leubner {
344*4e1bc9a0SAchim Leubner satIOContext->sataTag = 0xFF;
345*4e1bc9a0SAchim Leubner }
346*4e1bc9a0SAchim Leubner }
347*4e1bc9a0SAchim Leubner else /* AGSA_SATA_PROTOCOL_SRST_ASSERT or AGSA_SATA_PROTOCOL_SRST_DEASSERT
348*4e1bc9a0SAchim Leubner or SAT_CHECK_POWER_MODE as ABORT */
349*4e1bc9a0SAchim Leubner {
350*4e1bc9a0SAchim Leubner agsaSgl_t *agSgl;
351*4e1bc9a0SAchim Leubner
352*4e1bc9a0SAchim Leubner /* for internal SATA command only */
353*4e1bc9a0SAchim Leubner if (satIOContext->satOrgIOContext != agNULL)
354*4e1bc9a0SAchim Leubner {
355*4e1bc9a0SAchim Leubner /* Initialize tiIORequest */
356*4e1bc9a0SAchim Leubner tdIORequestBody->tiIORequest = tiIORequest;
357*4e1bc9a0SAchim Leubner }
358*4e1bc9a0SAchim Leubner /* Initialize tiDevhandle */
359*4e1bc9a0SAchim Leubner tdIORequestBody->tiDevHandle = tiDeviceHandle;
360*4e1bc9a0SAchim Leubner
361*4e1bc9a0SAchim Leubner
362*4e1bc9a0SAchim Leubner tdIORequestBody->IOType.InitiatorRegIO.expDataLength = 0;
363*4e1bc9a0SAchim Leubner /* SGL for SATA request */
364*4e1bc9a0SAchim Leubner agSgl = &(tdIORequestBody->transport.SATA.agSATARequestBody.agSgl);
365*4e1bc9a0SAchim Leubner agSgl->len = 0;
366*4e1bc9a0SAchim Leubner
367*4e1bc9a0SAchim Leubner agSgl->sgUpper = 0;
368*4e1bc9a0SAchim Leubner agSgl->sgLower = 0;
369*4e1bc9a0SAchim Leubner agSgl->len = 0;
370*4e1bc9a0SAchim Leubner CLEAR_ESGL_EXTEND(agSgl->extReserved);
371*4e1bc9a0SAchim Leubner
372*4e1bc9a0SAchim Leubner /* Initialize LL Layer agIORequest */
373*4e1bc9a0SAchim Leubner agIORequest = &(tdIORequestBody->agIORequest);
374*4e1bc9a0SAchim Leubner agIORequest->osData = (void *) tdIORequestBody;
375*4e1bc9a0SAchim Leubner agIORequest->sdkData = agNULL; /* SA takes care of this */
376*4e1bc9a0SAchim Leubner
377*4e1bc9a0SAchim Leubner tdIORequestBody->ioStarted = agTRUE;
378*4e1bc9a0SAchim Leubner tdIORequestBody->ioCompleted = agFALSE;
379*4e1bc9a0SAchim Leubner
380*4e1bc9a0SAchim Leubner /* setting the data length */
381*4e1bc9a0SAchim Leubner agSATAReq->dataLength = 0;
382*4e1bc9a0SAchim Leubner
383*4e1bc9a0SAchim Leubner }
384*4e1bc9a0SAchim Leubner
385*4e1bc9a0SAchim Leubner tdIORequestBody->reTries = 0;
386*4e1bc9a0SAchim Leubner osti_memset(agSATAReq->scsiCDB, 0, 16);
387*4e1bc9a0SAchim Leubner osti_memcpy(agSATAReq->scsiCDB, tiScsiRequest->scsiCmnd.cdb, 16);
388*4e1bc9a0SAchim Leubner #ifdef TD_INTERNAL_DEBUG
389*4e1bc9a0SAchim Leubner tdhexdump("sataLLIOStart", (bit8 *)satIOContext->pFis, sizeof(agsaFisRegHostToDevice_t));
390*4e1bc9a0SAchim Leubner tdhexdump("sataLLIOStart LL", (bit8 *)&agSATAReq->fis.fisRegHostToDev,
391*4e1bc9a0SAchim Leubner sizeof(agsaFisRegHostToDevice_t));
392*4e1bc9a0SAchim Leubner #endif
393*4e1bc9a0SAchim Leubner
394*4e1bc9a0SAchim Leubner TI_DBG6(("sataLLIOStart: agDevHandle %p\n", agDevHandle));
395*4e1bc9a0SAchim Leubner status = saSATAStart( agRoot,
396*4e1bc9a0SAchim Leubner agIORequest,
397*4e1bc9a0SAchim Leubner tdsaRotateQnumber(tiRoot, oneDeviceData),
398*4e1bc9a0SAchim Leubner agDevHandle,
399*4e1bc9a0SAchim Leubner satIOContext->reqType,
400*4e1bc9a0SAchim Leubner agSATAReq,
401*4e1bc9a0SAchim Leubner satIOContext->sataTag,
402*4e1bc9a0SAchim Leubner ossaSATACompleted
403*4e1bc9a0SAchim Leubner );
404*4e1bc9a0SAchim Leubner
405*4e1bc9a0SAchim Leubner if (status == AGSA_RC_SUCCESS)
406*4e1bc9a0SAchim Leubner {
407*4e1bc9a0SAchim Leubner tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
408*4e1bc9a0SAchim Leubner oneDeviceData->satDevData.satPendingIO++;
409*4e1bc9a0SAchim Leubner if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
410*4e1bc9a0SAchim Leubner (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
411*4e1bc9a0SAchim Leubner {
412*4e1bc9a0SAchim Leubner oneDeviceData->satDevData.satPendingNCQIO++;
413*4e1bc9a0SAchim Leubner }
414*4e1bc9a0SAchim Leubner else
415*4e1bc9a0SAchim Leubner {
416*4e1bc9a0SAchim Leubner oneDeviceData->satDevData.satPendingNONNCQIO++;
417*4e1bc9a0SAchim Leubner }
418*4e1bc9a0SAchim Leubner
419*4e1bc9a0SAchim Leubner TDLIST_INIT_ELEMENT (&satIOContext->satIoContextLink);
420*4e1bc9a0SAchim Leubner TDLIST_ENQUEUE_AT_TAIL (&satIOContext->satIoContextLink,
421*4e1bc9a0SAchim Leubner &oneDeviceData->satDevData.satIoLinkList);
422*4e1bc9a0SAchim Leubner tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
423*4e1bc9a0SAchim Leubner // TI_DBG5(("sataLLIOStart: device %p pending IO %d\n", oneDeviceData->satDevData,oneDeviceData->satDevData.satPendingIO));
424*4e1bc9a0SAchim Leubner }
425*4e1bc9a0SAchim Leubner else
426*4e1bc9a0SAchim Leubner {
427*4e1bc9a0SAchim Leubner if (status == AGSA_RC_BUSY)
428*4e1bc9a0SAchim Leubner {
429*4e1bc9a0SAchim Leubner TI_DBG1(("sataLLIOStart: saSATAStart busy\n"));
430*4e1bc9a0SAchim Leubner }
431*4e1bc9a0SAchim Leubner else
432*4e1bc9a0SAchim Leubner {
433*4e1bc9a0SAchim Leubner TI_DBG1(("sataLLIOStart: saSATAStart failed\n"));
434*4e1bc9a0SAchim Leubner }
435*4e1bc9a0SAchim Leubner if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
436*4e1bc9a0SAchim Leubner (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
437*4e1bc9a0SAchim Leubner {
438*4e1bc9a0SAchim Leubner satTagRelease(tiRoot, pSatDevData, satIOContext->sataTag);
439*4e1bc9a0SAchim Leubner }
440*4e1bc9a0SAchim Leubner
441*4e1bc9a0SAchim Leubner /* Free the ESGL pages associated with this I/O */
442*4e1bc9a0SAchim Leubner tdIORequestBody->ioStarted = agFALSE;
443*4e1bc9a0SAchim Leubner tdIORequestBody->ioCompleted = agTRUE;
444*4e1bc9a0SAchim Leubner /*
445*4e1bc9a0SAchim Leubner * Map the SAS/SATA LL layer status to the TISA status
446*4e1bc9a0SAchim Leubner */
447*4e1bc9a0SAchim Leubner status = mapStat[status];
448*4e1bc9a0SAchim Leubner return (status);
449*4e1bc9a0SAchim Leubner }
450*4e1bc9a0SAchim Leubner
451*4e1bc9a0SAchim Leubner return (tiSuccess);
452*4e1bc9a0SAchim Leubner
453*4e1bc9a0SAchim Leubner }
454*4e1bc9a0SAchim Leubner
455*4e1bc9a0SAchim Leubner
456*4e1bc9a0SAchim Leubner /*****************************************************************************
457*4e1bc9a0SAchim Leubner *! \brief itdsataIOPrepareSGL
458*4e1bc9a0SAchim Leubner *
459*4e1bc9a0SAchim Leubner * This function is called to prepare and translate the TISA SGL information
460*4e1bc9a0SAchim Leubner * to the SAS/SATA LL layer specific SGL. This function is similar to
461*4e1bc9a0SAchim Leubner * itdssIOPrepareSGL(), except the request body reflects SATA host request.
462*4e1bc9a0SAchim Leubner *
463*4e1bc9a0SAchim Leubner * \param tiRoot: Pointer to initiator driver/port instance.
464*4e1bc9a0SAchim Leubner * \param IORequestBody: TD layer request body for the I/O.
465*4e1bc9a0SAchim Leubner * \param tiSgl1: First TISA SGL info.
466*4e1bc9a0SAchim Leubner * \param tiSgl2: Second TISA SGL info.
467*4e1bc9a0SAchim Leubner * \param sglVirtualAddr: The virtual address of the first element in
468*4e1bc9a0SAchim Leubner * tiSgl1 when tiSgl1 is used with the type tiSglList.
469*4e1bc9a0SAchim Leubner *
470*4e1bc9a0SAchim Leubner * \return:
471*4e1bc9a0SAchim Leubner *
472*4e1bc9a0SAchim Leubner * \e tiSuccess: SGL initialized successfully.
473*4e1bc9a0SAchim Leubner * \e tiError: Failed to initialize SGL.
474*4e1bc9a0SAchim Leubner *
475*4e1bc9a0SAchim Leubner *
476*4e1bc9a0SAchim Leubner *****************************************************************************/\
itdsataIOPrepareSGL(tiRoot_t * tiRoot,tdIORequestBody_t * tdIORequestBody,tiSgl_t * tiSgl1,void * sglVirtualAddr)477*4e1bc9a0SAchim Leubner osGLOBAL bit32 itdsataIOPrepareSGL(
478*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
479*4e1bc9a0SAchim Leubner tdIORequestBody_t *tdIORequestBody,
480*4e1bc9a0SAchim Leubner tiSgl_t *tiSgl1,
481*4e1bc9a0SAchim Leubner void *sglVirtualAddr
482*4e1bc9a0SAchim Leubner )
483*4e1bc9a0SAchim Leubner {
484*4e1bc9a0SAchim Leubner agsaSgl_t *agSgl;
485*4e1bc9a0SAchim Leubner
486*4e1bc9a0SAchim Leubner /* Uppper should be zero-out */
487*4e1bc9a0SAchim Leubner TI_DBG5(("itdsataIOPrepareSGL: start\n"));
488*4e1bc9a0SAchim Leubner
489*4e1bc9a0SAchim Leubner TI_DBG5(("itdsataIOPrepareSGL: tiSgl1->upper %d tiSgl1->lower %d tiSgl1->len %d\n",
490*4e1bc9a0SAchim Leubner tiSgl1->upper, tiSgl1->lower, tiSgl1->len));
491*4e1bc9a0SAchim Leubner TI_DBG5(("itdsataIOPrepareSGL: tiSgl1->type %d\n", tiSgl1->type));
492*4e1bc9a0SAchim Leubner
493*4e1bc9a0SAchim Leubner /* SGL for SATA request */
494*4e1bc9a0SAchim Leubner agSgl = &(tdIORequestBody->transport.SATA.agSATARequestBody.agSgl);
495*4e1bc9a0SAchim Leubner agSgl->len = 0;
496*4e1bc9a0SAchim Leubner
497*4e1bc9a0SAchim Leubner if (tiSgl1 == agNULL)
498*4e1bc9a0SAchim Leubner {
499*4e1bc9a0SAchim Leubner TI_DBG1(("itdsataIOPrepareSGL: Error tiSgl1 is NULL\n"));
500*4e1bc9a0SAchim Leubner return tiError;
501*4e1bc9a0SAchim Leubner }
502*4e1bc9a0SAchim Leubner
503*4e1bc9a0SAchim Leubner if (tdIORequestBody->IOType.InitiatorRegIO.expDataLength == 0)
504*4e1bc9a0SAchim Leubner {
505*4e1bc9a0SAchim Leubner TI_DBG3(("itdsataIOPrepareSGL: expDataLength is 0\n"));
506*4e1bc9a0SAchim Leubner agSgl->sgUpper = 0;
507*4e1bc9a0SAchim Leubner agSgl->sgLower = 0;
508*4e1bc9a0SAchim Leubner agSgl->len = 0;
509*4e1bc9a0SAchim Leubner CLEAR_ESGL_EXTEND(agSgl->extReserved);
510*4e1bc9a0SAchim Leubner return tiSuccess;
511*4e1bc9a0SAchim Leubner }
512*4e1bc9a0SAchim Leubner
513*4e1bc9a0SAchim Leubner agSgl->sgUpper = tiSgl1->upper;
514*4e1bc9a0SAchim Leubner agSgl->sgLower = tiSgl1->lower;
515*4e1bc9a0SAchim Leubner agSgl->len = tiSgl1->len;
516*4e1bc9a0SAchim Leubner agSgl->extReserved = tiSgl1->type;
517*4e1bc9a0SAchim Leubner
518*4e1bc9a0SAchim Leubner return tiSuccess;
519*4e1bc9a0SAchim Leubner
520*4e1bc9a0SAchim Leubner }
521*4e1bc9a0SAchim Leubner
522*4e1bc9a0SAchim Leubner /*****************************************************************************
523*4e1bc9a0SAchim Leubner *! \brief sataLLIOAbort
524*4e1bc9a0SAchim Leubner *
525*4e1bc9a0SAchim Leubner * This routine is called to initiate an I/O abort to LL layer.
526*4e1bc9a0SAchim Leubner * This function implements/encapsulates HW and LL API dependency.
527*4e1bc9a0SAchim Leubner *
528*4e1bc9a0SAchim Leubner * \param tiRoot: Pointer to TISA initiator driver/port instance.
529*4e1bc9a0SAchim Leubner * \param taskTag: Pointer to TISA I/O context to be aborted.
530*4e1bc9a0SAchim Leubner *
531*4e1bc9a0SAchim Leubner * \return:
532*4e1bc9a0SAchim Leubner *
533*4e1bc9a0SAchim Leubner * \e tiSuccess: Abort request was successfully initiated.
534*4e1bc9a0SAchim Leubner * \e tiBusy: No resources available, try again later.
535*4e1bc9a0SAchim Leubner * \e tiError: Other errors that prevent the abort request from being
536*4e1bc9a0SAchim Leubner * started..
537*4e1bc9a0SAchim Leubner *
538*4e1bc9a0SAchim Leubner *
539*4e1bc9a0SAchim Leubner *****************************************************************************/
540*4e1bc9a0SAchim Leubner #ifdef REMOVED /* not in use */
sataLLIOAbort(tiRoot_t * tiRoot,tiIORequest_t * taskTag)541*4e1bc9a0SAchim Leubner GLOBAL bit32 sataLLIOAbort (
542*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
543*4e1bc9a0SAchim Leubner tiIORequest_t *taskTag )
544*4e1bc9a0SAchim Leubner
545*4e1bc9a0SAchim Leubner {
546*4e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot;
547*4e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared;
548*4e1bc9a0SAchim Leubner agsaRoot_t *agRoot;
549*4e1bc9a0SAchim Leubner tdIORequestBody_t *tdIORequestBody;
550*4e1bc9a0SAchim Leubner agsaIORequest_t *agIORequest;
551*4e1bc9a0SAchim Leubner bit32 status;
552*4e1bc9a0SAchim Leubner
553*4e1bc9a0SAchim Leubner TI_DBG2(("sataLLIOAbort: start\n"));
554*4e1bc9a0SAchim Leubner
555*4e1bc9a0SAchim Leubner tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
556*4e1bc9a0SAchim Leubner tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
557*4e1bc9a0SAchim Leubner agRoot = &(tdsaAllShared->agRootNonInt);
558*4e1bc9a0SAchim Leubner tdIORequestBody = (tdIORequestBody_t *)taskTag->tdData;
559*4e1bc9a0SAchim Leubner agIORequest = &(tdIORequestBody->agIORequest);
560*4e1bc9a0SAchim Leubner
561*4e1bc9a0SAchim Leubner status = saSATAAbort(agRoot, 0, agIORequest);
562*4e1bc9a0SAchim Leubner
563*4e1bc9a0SAchim Leubner TI_DBG2(("sataLLIOAbort: agIORequest %p\n", agIORequest));
564*4e1bc9a0SAchim Leubner TI_DBG2(("sataLLIOAbort: saSATAAbort returns status, %x\n", status));
565*4e1bc9a0SAchim Leubner
566*4e1bc9a0SAchim Leubner if (status == AGSA_RC_SUCCESS)
567*4e1bc9a0SAchim Leubner {
568*4e1bc9a0SAchim Leubner return tiSuccess;
569*4e1bc9a0SAchim Leubner }
570*4e1bc9a0SAchim Leubner else
571*4e1bc9a0SAchim Leubner {
572*4e1bc9a0SAchim Leubner return tiError;
573*4e1bc9a0SAchim Leubner }
574*4e1bc9a0SAchim Leubner
575*4e1bc9a0SAchim Leubner }
576*4e1bc9a0SAchim Leubner #endif
577*4e1bc9a0SAchim Leubner
578*4e1bc9a0SAchim Leubner #ifdef REMOVED
579*4e1bc9a0SAchim Leubner /*****************************************************************************
580*4e1bc9a0SAchim Leubner *! \brief sataLLReset
581*4e1bc9a0SAchim Leubner *
582*4e1bc9a0SAchim Leubner * This routine is called to initiate a SATA device reset to LL layer.
583*4e1bc9a0SAchim Leubner * This function implements/encapsulates HW and LL API dependency.
584*4e1bc9a0SAchim Leubner *
585*4e1bc9a0SAchim Leubner * \param tiRoot: Pointer to TISA initiator driver/port instance.
586*4e1bc9a0SAchim Leubner * \param tiDeviceHandle: Pointer to TISA device handle for this I/O.
587*4e1bc9a0SAchim Leubner * \param option: SATA device reset option
588*4e1bc9a0SAchim Leubner *
589*4e1bc9a0SAchim Leubner * \return: None
590*4e1bc9a0SAchim Leubner *
591*4e1bc9a0SAchim Leubner *
592*4e1bc9a0SAchim Leubner *****************************************************************************/
593*4e1bc9a0SAchim Leubner /* not in use */
sataLLReset(tiRoot_t * tiRoot,tiDeviceHandle_t * tiDeviceHandle,bit32 option)594*4e1bc9a0SAchim Leubner GLOBAL void sataLLReset(
595*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
596*4e1bc9a0SAchim Leubner tiDeviceHandle_t *tiDeviceHandle,
597*4e1bc9a0SAchim Leubner bit32 option)
598*4e1bc9a0SAchim Leubner {
599*4e1bc9a0SAchim Leubner
600*4e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot;
601*4e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared;
602*4e1bc9a0SAchim Leubner tdsaDeviceData_t *oneDeviceData;
603*4e1bc9a0SAchim Leubner agsaRoot_t *agRoot;
604*4e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle;
605*4e1bc9a0SAchim Leubner
606*4e1bc9a0SAchim Leubner TI_DBG2(("sataLLReset: extry\n"));
607*4e1bc9a0SAchim Leubner
608*4e1bc9a0SAchim Leubner tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
609*4e1bc9a0SAchim Leubner tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
610*4e1bc9a0SAchim Leubner agRoot = &(tdsaAllShared->agRootNonInt);
611*4e1bc9a0SAchim Leubner oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
612*4e1bc9a0SAchim Leubner agDevHandle = oneDeviceData->agDevHandle;
613*4e1bc9a0SAchim Leubner
614*4e1bc9a0SAchim Leubner satSATADeviceReset( tiRoot,
615*4e1bc9a0SAchim Leubner oneDeviceData,
616*4e1bc9a0SAchim Leubner AGSA_PHY_HARD_RESET);
617*4e1bc9a0SAchim Leubner
618*4e1bc9a0SAchim Leubner }
619*4e1bc9a0SAchim Leubner #endif /* 0 */
620*4e1bc9a0SAchim Leubner #endif /* #ifdef SATA_ENABLE */
621