xref: /freebsd/sys/dev/pms/RefTisa/tisa/sassata/sata/host/sathw.c (revision 685dc743dc3b5645e34836464128e1c0558b404b)
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