1285242Sachim/*******************************************************************************
2285242Sachim*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3285242Sachim*
4285242Sachim*Redistribution and use in source and binary forms, with or without modification, are permitted provided
5285242Sachim*that the following conditions are met:
6285242Sachim*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7285242Sachim*following disclaimer.
8285242Sachim*2. Redistributions in binary form must reproduce the above copyright notice,
9285242Sachim*this list of conditions and the following disclaimer in the documentation and/or other materials provided
10285242Sachim*with the distribution.
11285242Sachim*
12285242Sachim*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13285242Sachim*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14285242Sachim*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15285242Sachim*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16285242Sachim*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17285242Sachim*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18285242Sachim*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19285242Sachim*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20285242Sachim
21285242Sachim********************************************************************************/
22285242Sachim/*****************************************************************************/
23285242Sachim/** \file
24285242Sachim *
25285242Sachim * The file implementing SCSI/ATA Translation (SAT) for LL Layer callback
26285242Sachim *
27285242Sachim */
28285242Sachim/*****************************************************************************/
29285242Sachim#include <sys/cdefs.h>
30285242Sachim__FBSDID("$FreeBSD: releng/11.0/sys/dev/pms/RefTisa/tisa/sassata/sata/host/ossasat.c 285242 2015-07-07 13:17:02Z achim $");
31285242Sachim#include <dev/pms/config.h>
32285242Sachim
33285242Sachim#include <dev/pms/freebsd/driver/common/osenv.h>
34285242Sachim#include <dev/pms/freebsd/driver/common/ostypes.h>
35285242Sachim#include <dev/pms/freebsd/driver/common/osdebug.h>
36285242Sachim
37285242Sachim#ifdef SATA_ENABLE
38285242Sachim
39285242Sachim#include <dev/pms/RefTisa/sallsdk/api/sa.h>
40285242Sachim#include <dev/pms/RefTisa/sallsdk/api/saapi.h>
41285242Sachim#include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
42285242Sachim
43285242Sachim#include <dev/pms/RefTisa/tisa/api/titypes.h>
44285242Sachim#include <dev/pms/RefTisa/tisa/api/ostiapi.h>
45285242Sachim#include <dev/pms/RefTisa/tisa/api/tiapi.h>
46285242Sachim#include <dev/pms/RefTisa/tisa/api/tiglobal.h>
47285242Sachim
48285242Sachim#ifdef FDS_SM
49285242Sachim#include <dev/pms/RefTisa/sat/api/sm.h>
50285242Sachim#include <dev/pms/RefTisa/sat/api/smapi.h>
51285242Sachim#include <dev/pms/RefTisa/sat/api/tdsmapi.h>
52285242Sachim#endif
53285242Sachim
54285242Sachim#ifdef FDS_DM
55285242Sachim#include <dev/pms/RefTisa/discovery/api/dm.h>
56285242Sachim#include <dev/pms/RefTisa/discovery/api/dmapi.h>
57285242Sachim#include <dev/pms/RefTisa/discovery/api/tddmapi.h>
58285242Sachim#endif
59285242Sachim
60285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
61285242Sachim#include <dev/pms/freebsd/driver/common/osstring.h>
62285242Sachim#include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
63285242Sachim
64285242Sachim#ifdef INITIATOR_DRIVER
65285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
66285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
67285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
68285242Sachim#endif
69285242Sachim
70285242Sachim#ifdef TARGET_DRIVER
71285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
72285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
73285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
74285242Sachim#endif
75285242Sachim
76285242Sachim#include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
77285242Sachim#include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
78285242Sachim
79285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sata/host/sat.h>
80285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sata/host/satproto.h>
81285242Sachim
82285242Sachim/*****************************************************************************
83285242Sachim*! \brief  ossaSATACompleted
84285242Sachim*
85285242Sachim*   This routine is called to complete a SATA request previously issued to the
86285242Sachim*    LL Layer in saSATAStart()
87285242Sachim*
88285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
89285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
90285242Sachim*  \param   agIOStatus:  Status of completed I/O.
91285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
92285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
93285242Sachim*                        length.
94285242Sachim*  \param   agParam:     Additional info based on status.
95285242Sachim*
96285242Sachim*  \return: none
97285242Sachim*
98285242Sachim*****************************************************************************/
99285242SachimGLOBAL void
100285242SachimossaSATACompleted(
101285242Sachim                  agsaRoot_t        *agRoot,
102285242Sachim                  agsaIORequest_t   *agIORequest,
103285242Sachim                  bit32             agIOStatus,
104285242Sachim                  void              *agFirstDword,
105285242Sachim                  bit32             agIOInfoLen,
106285242Sachim                  void              *agParam
107285242Sachim                  )
108285242Sachim
109285242Sachim{
110285242Sachim  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
111285242Sachim  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
112285242Sachim  tdsaRoot_t           *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
113285242Sachim  tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
114285242Sachim  tdIORequestBody_t    *tdIORequestBody;
115285242Sachim  satIOContext_t       *satIOContext;
116285242Sachim  satDeviceData_t      *pSatDevData;
117285242Sachim  tdsaDeviceData_t     *tdsaDeviceData = agNULL;
118285242Sachim  tdsaPortContext_t    *onePortContext;
119285242Sachim  tiDeviceHandle_t     *tiDeviceHandle = agNULL;
120285242Sachim  agsaDevHandle_t      *agDevHandle = agNULL;
121285242Sachim  bit32                status;
122285242Sachim  tdsaDeviceData_t     *oneDeviceData = agNULL;
123285242Sachim
124285242Sachim  TDSA_OUT_ENTER(tiRoot);
125285242Sachim
126285242Sachim  TI_DBG6(("ossaSATACompleted: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
127285242Sachim    agIORequest, agIOStatus, agIOInfoLen));
128285242Sachim
129285242Sachim  if (agIORequest == agNULL)
130285242Sachim  {
131285242Sachim    TI_DBG1(("ossaSATACompleted: agIORequest is NULL!!!!\n"));
132285242Sachim    return;
133285242Sachim  }
134285242Sachim
135285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
136285242Sachim
137285242Sachim  if (tdIORequestBody == agNULL)
138285242Sachim  {
139285242Sachim    TI_DBG1(("ossaSATACompleted: tdIORequestBody is NULL!!!!\n"));
140285242Sachim    return;
141285242Sachim  }
142285242Sachim  /* for debugging */
143285242Sachim  if (tdIORequestBody->ioCompleted == agTRUE)
144285242Sachim  {
145285242Sachim    tiDeviceHandle = tdIORequestBody->tiDevHandle;
146285242Sachim    if (tiDeviceHandle == agNULL)
147285242Sachim    {
148285242Sachim      TI_DBG1(("ossaSATACompleted: tiDeviceHandle is NULL!!!!\n"));
149285242Sachim      return;
150285242Sachim    }
151285242Sachim    tdsaDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
152285242Sachim    TI_DBG1(("ossaSATACompleted: Error!!!!!! double completion\n"));
153285242Sachim    if (tdsaDeviceData == agNULL)
154285242Sachim    {
155285242Sachim      TI_DBG1(("ossaSATACompleted: tdsaDeviceData is NULL!!!!\n"));
156285242Sachim      return;
157285242Sachim    }
158285242Sachim    TI_DBG1(("ossaSATACompleted: did %d \n", tdsaDeviceData->id));
159285242Sachim    return;
160285242Sachim  }
161285242Sachim
162285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
163285242Sachim  satIOContext    = &(tdIORequestBody->transport.SATA.satIOContext);
164285242Sachim
165285242Sachim  if (satIOContext == agNULL)
166285242Sachim  {
167285242Sachim    TI_DBG1(("ossaSATACompleted: satIOContext is NULL!!!!\n"));
168285242Sachim    return;
169285242Sachim  }
170285242Sachim
171285242Sachim  pSatDevData     = satIOContext->pSatDevData;
172285242Sachim
173285242Sachim  if (tdIORequestBody->tiDevHandle != agNULL)
174285242Sachim  {
175285242Sachim    oneDeviceData = (tdsaDeviceData_t *)tdIORequestBody->tiDevHandle->tdData;
176285242Sachim  }
177285242Sachim
178285242Sachim  if (pSatDevData == agNULL && oneDeviceData != agNULL)
179285242Sachim  {
180285242Sachim    TI_DBG1(("ossaSATACompleted: pSatDevData is NULL, loc 1, wrong\n"));
181285242Sachim    pSatDevData = &(oneDeviceData->satDevData);
182285242Sachim  }
183285242Sachim
184285242Sachim  if (pSatDevData == agNULL)
185285242Sachim  {
186285242Sachim    TI_DBG1(("ossaSATACompleted: pSatDevData is NULL loc 2, wrong\n"));
187285242Sachim    if (satIOContext->satOrgIOContext == agNULL)
188285242Sachim    {
189285242Sachim      TI_DBG1(("ossaSATACompleted: external command\n"));
190285242Sachim    }
191285242Sachim    else
192285242Sachim    {
193285242Sachim      TI_DBG1(("ossaSATACompleted: internal command\n"));
194285242Sachim    }
195285242Sachim    goto ext;
196285242Sachim  }
197285242Sachim
198285242Sachim  tdsaDeviceData  = (tdsaDeviceData_t *)pSatDevData->satSaDeviceData;
199285242Sachim  if (oneDeviceData != tdsaDeviceData)
200285242Sachim  {
201285242Sachim    if (satIOContext->satOrgIOContext == agNULL)
202285242Sachim    {
203285242Sachim      TI_DBG1(("ossaSATACompleted: diff device handle; external command\n"));
204285242Sachim    }
205285242Sachim    else
206285242Sachim    {
207285242Sachim      TI_DBG1(("ossaSATACompleted: diff device handle; internal command\n"));
208285242Sachim    }
209285242Sachim  }
210285242Sachim
211285242Sachim  if (tdsaDeviceData == agNULL)
212285242Sachim  {
213285242Sachim    TI_DBG1(("ossaSATACompleted: tdsaDeviceData is NULL!!!!\n"));
214285242Sachim    return;
215285242Sachim  }
216285242Sachim
217285242Sachim  onePortContext   = tdsaDeviceData->tdPortContext;
218285242Sachim
219285242Sachim  /* retries in OSSA_IO_XFER_OPEN_RETRY_TIMEOUT */
220285242Sachim  if (agIOStatus == OSSA_IO_XFER_OPEN_RETRY_TIMEOUT)
221285242Sachim  {
222285242Sachim    if (tdsaDeviceData->valid == agTRUE && tdsaDeviceData->registered == agTRUE &&
223285242Sachim        tdsaDeviceData->tdPortContext != agNULL )
224285242Sachim    {
225285242Sachim      if (tdIORequestBody->reTries <= OPEN_RETRY_RETRIES) /* 10 */
226285242Sachim      {
227285242Sachim        agDevHandle = tdsaDeviceData->agDevHandle;
228285242Sachim        status = saSATAStart( agRoot,
229285242Sachim                              agIORequest,
230285242Sachim                              tdsaRotateQnumber(tiRoot, tdsaDeviceData),
231285242Sachim                              agDevHandle,
232285242Sachim                              satIOContext->reqType,
233285242Sachim                              &(tdIORequestBody->transport.SATA.agSATARequestBody),
234285242Sachim                              satIOContext->sataTag,
235285242Sachim                              ossaSATACompleted);
236285242Sachim
237285242Sachim        if (status == AGSA_RC_SUCCESS)
238285242Sachim        {
239285242Sachim          TI_DBG1(("ossaSATACompleted: retried\n"));
240285242Sachim          tdIORequestBody->ioStarted = agTRUE;
241285242Sachim          tdIORequestBody->ioCompleted = agFALSE;
242285242Sachim          tdIORequestBody->reTries++;
243285242Sachim          goto ext;
244285242Sachim        }
245285242Sachim        else
246285242Sachim        {
247285242Sachim          TI_DBG1(("ossaSATACompleted: retry failed\n"));
248285242Sachim          tdIORequestBody->ioStarted = agFALSE;
249285242Sachim          tdIORequestBody->ioCompleted = agTRUE;
250285242Sachim          tdIORequestBody->reTries = 0;
251285242Sachim        }
252285242Sachim      }
253285242Sachim      else
254285242Sachim      {
255285242Sachim        /* retries is over, do nothing */
256285242Sachim        TI_DBG1(("ossaSATACompleted: retry is over and fail\n"));
257285242Sachim        tdIORequestBody->reTries = 0;
258285242Sachim      }
259285242Sachim    }
260285242Sachim    else
261285242Sachim    {
262285242Sachim      TI_DBG1(("ossaSATACompleted: incorrect device state or no portcontext\n"));
263285242Sachim      tdIORequestBody->reTries = 0;
264285242Sachim    }
265285242Sachim  } /* if OSSA_IO_XFER_OPEN_RETRY_TIMEOUT*/
266285242Sachim
267285242Sachim  /* release tag value for SATA */
268285242Sachim  if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
269285242Sachim       (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
270285242Sachim  {
271285242Sachim    satTagRelease(tiRoot, pSatDevData, satIOContext->sataTag);
272285242Sachim  }
273285242Sachim
274285242Sachim  /* send SMP_PHY_CONTROL_HARD_RESET */
275285242Sachim  if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY && tdsaAllShared->FCA)
276285242Sachim  {
277285242Sachim    if (pSatDevData->NumOfFCA <= 0) /* does SMP HARD RESET only upto one time */
278285242Sachim    {
279285242Sachim      TI_DBG1(("ossaSATACompleted: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n"));
280285242Sachim      pSatDevData->NumOfFCA++;
281285242Sachim      tdsaPhyControlSend(tiRoot,
282285242Sachim                         tdsaDeviceData,
283285242Sachim                         SMP_PHY_CONTROL_HARD_RESET,
284285242Sachim                         agNULL,
285285242Sachim                         tdsaRotateQnumber(tiRoot, tdsaDeviceData)
286285242Sachim                        );
287285242Sachim    }
288285242Sachim    else
289285242Sachim    {
290285242Sachim      /* given up after one time of SMP HARD RESET; */
291285242Sachim      TI_DBG1(("ossaSATACompleted: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; NO!!! sending HARD_RESET\n"));
292285242Sachim      if (tdsaDeviceData->registered == agTRUE && tdsaAllShared->ResetInDiscovery == 0)
293285242Sachim      {
294285242Sachim        /*
295285242Sachim          1. remove this device
296285242Sachim          2. device removal event
297285242Sachim        */
298285242Sachim        tdsaAbortAll(tiRoot, agRoot, tdsaDeviceData);
299285242Sachim        tdsaDeviceData->valid = agFALSE;
300285242Sachim        tdsaDeviceData->valid2 = agFALSE;
301285242Sachim        tdsaDeviceData->registered = agFALSE;
302285242Sachim//      pSatDevData->NumOfFCA = 0;
303285242Sachim        ostiInitiatorEvent(
304285242Sachim                            tiRoot,
305285242Sachim                            onePortContext->tiPortalContext,
306285242Sachim                            agNULL,
307285242Sachim                            tiIntrEventTypeDeviceChange,
308285242Sachim                            tiDeviceRemoval,
309285242Sachim                            agNULL
310285242Sachim                            );
311285242Sachim      }
312285242Sachim    }
313285242Sachim  }
314285242Sachim
315285242Sachim  if (agIOStatus == OSSA_IO_ABORTED)
316285242Sachim  {
317285242Sachim    /*
318285242Sachim       free abort IO request itself - agParam; done in ossaSATAEvent()
319285242Sachim    */
320285242Sachim  }
321285242Sachim  /* just for debugging */
322285242Sachim  if (agIOStatus == OSSA_IO_DS_NON_OPERATIONAL)
323285242Sachim  {
324285242Sachim    TI_DBG1(("ossaSATACompleted: agIOStatus is OSSA_IO_DS_NON_OPERATIONAL\n"));
325285242Sachim  }
326285242Sachim  if (agIOStatus == OSSA_IO_DS_IN_RECOVERY)
327285242Sachim  {
328285242Sachim    TI_DBG1(("ossaSATACompleted: agIOStatus is OSSA_IO_DS_IN_RECOVERY\n"));
329285242Sachim  }
330285242Sachim
331285242Sachim  satIOContext->satCompleteCB( agRoot,
332285242Sachim                               agIORequest,
333285242Sachim                               agIOStatus,
334285242Sachim                               agFirstDword,
335285242Sachim                               agIOInfoLen,
336285242Sachim                               agParam,
337285242Sachim                               satIOContext);
338285242Sachimext:
339285242Sachim  TDSA_OUT_LEAVE(tiRoot);
340285242Sachim}
341285242Sachim
342285242Sachim/*****************************************************************************
343285242Sachim*! \brief  satPacketCB
344285242Sachim*
345285242Sachim*   This routine is a callback function called from ossaSATACompleted().
346285242Sachim*   This CB routine deals with normal Packet command I/O SATA request.
347285242Sachim*
348285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
349285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
350285242Sachim*  \param   agIOStatus:  Status of completed I/O.
351285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
352285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
353285242Sachim*                        length.
354285242Sachim*  \param   agParam:     Additional info based on status.
355285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
356285242Sachim*
357285242Sachim*  \return: none
358285242Sachim*
359285242Sachim*****************************************************************************/
360285242Sachim
361285242Sachimvoid satPacketCB(
362285242Sachim                 agsaRoot_t        *agRoot,
363285242Sachim                 agsaIORequest_t   *agIORequest,
364285242Sachim                 bit32             agIOStatus,
365285242Sachim                 agsaFisHeader_t   *agFirstDword,
366285242Sachim                 bit32             agIOInfoLen,
367285242Sachim                 void              *agParam,
368285242Sachim                 void              *ioContext
369285242Sachim                 )
370285242Sachim{
371285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
372285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
373285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
374285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
375285242Sachim  tdIORequestBody_t       *tdIORequestBody;
376285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
377285242Sachim  satIOContext_t          *satIOContext;
378285242Sachim  satIOContext_t          *satOrgIOContext;
379285242Sachim  satIOContext_t          *satNewIOContext;
380285242Sachim  satInternalIo_t         *satIntIo;
381285242Sachim  satInternalIo_t         *satNewIntIo = agNULL;
382285242Sachim  satDeviceData_t         *satDevData;
383285242Sachim  scsiRspSense_t          *pSense;
384285242Sachim  tiIORequest_t           *tiOrgIORequest;
385285242Sachim  tiIniScsiCmnd_t         *scsiCmnd;
386285242Sachim  bit32                   interruptContext = osData->IntContext;
387285242Sachim  bit8                    bSenseKey = 0;
388285242Sachim  bit16                   bSenseCodeInfo = 0;
389285242Sachim  bit32                   status = 0;
390285242Sachim
391285242Sachim  TI_DBG4(("satPacketCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
392285242Sachim
393285242Sachim  /* internally generate tiIOContext */
394285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
395285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
396285242Sachim  satIntIo               = satIOContext->satIntIoContext;
397285242Sachim  satDevData             = satIOContext->pSatDevData;
398285242Sachim
399285242Sachim  /*ttttttthe one */
400285242Sachim  if (satIntIo == agNULL)
401285242Sachim  {
402285242Sachim    TI_DBG4(("satPacketCB: External satInternalIo_t satIntIoContext\n"));
403285242Sachim    satOrgIOContext = satIOContext;
404285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
405285242Sachim    pSense          = satOrgIOContext->pSense;
406285242Sachim    scsiCmnd        = satOrgIOContext->pScsiCmnd;
407285242Sachim  }
408285242Sachim  else
409285242Sachim  {
410285242Sachim    TI_DBG4(("satPacketCB: Internal satInternalIo_t satIntIoContext\n"));
411285242Sachim    satOrgIOContext = satIOContext->satOrgIOContext;
412285242Sachim    if (satOrgIOContext == agNULL)
413285242Sachim    {
414285242Sachim      TI_DBG4(("satPacketCB: satOrgIOContext is NULL, wrong\n"));
415285242Sachim      return;
416285242Sachim    }
417285242Sachim    else
418285242Sachim    {
419285242Sachim      TI_DBG4(("satPacketCB: satOrgIOContext is NOT NULL\n"));
420285242Sachim    }
421285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
422285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
423285242Sachim    pSense                 = satOrgIOContext->pSense;
424285242Sachim    scsiCmnd               = satOrgIOContext->pScsiCmnd;
425285242Sachim  }
426285242Sachim
427285242Sachim  /* Parse CDB */
428285242Sachim  switch(scsiCmnd->cdb[0])
429285242Sachim  {
430285242Sachim    case SCSIOPC_TEST_UNIT_READY:
431285242Sachim      //satTestUnitReadyCB(agRoot, agIORequest, agIOStatus, agFirstDword, agIOInfoLen, agParam, ioContext);
432285242Sachim      //break;
433285242Sachim    case SCSIOPC_GET_EVENT_STATUS_NOTIFICATION:
434285242Sachim      //break;
435285242Sachim    case SCSIOPC_READ_CAPACITY_10:
436285242Sachim    case SCSIOPC_READ_CAPACITY_16:
437285242Sachim      //satPacketReadCapacityCB(agRoot, agIORequest, agIOStatus, agFirstDword, agIOInfoLen, agParam, ioContext);
438285242Sachim      //break;
439285242Sachim    default:
440285242Sachim       break;
441285242Sachim   }
442285242Sachim
443285242Sachim  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
444285242Sachim
445285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
446285242Sachim  tdIORequestBody->ioStarted   = agFALSE;
447285242Sachim
448285242Sachim  /* interal structure free */
449285242Sachim  satFreeIntIoResource( tiRoot, satDevData, satIntIo);
450285242Sachim
451285242Sachim  if( agIOStatus == OSSA_IO_SUCCESS && agFirstDword == agNULL)
452285242Sachim  {
453285242Sachim    TI_DBG1(("satPacketCB: agIOStatus == OSSA_IO_SUCCESS, agFirstDword == agNULL \n"));
454285242Sachim    ostiInitiatorIOCompleted( tiRoot,
455285242Sachim                              tdIORequestBody->tiIORequest,
456285242Sachim                              tiIOSuccess,
457285242Sachim                              SCSI_STAT_GOOD,
458285242Sachim                              agNULL,
459285242Sachim                              interruptContext);
460285242Sachim  }
461285242Sachim  else if (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL)
462285242Sachim  {
463285242Sachim      TI_DBG1(("satPacketCB: wrong. agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL \n"));
464285242Sachim      satNewIntIo = satAllocIntIoResource( tiRoot,
465285242Sachim                                       tiOrgIORequest,
466285242Sachim                                       satDevData,
467285242Sachim                                       32,
468285242Sachim                                       satNewIntIo);
469285242Sachim      if (satNewIntIo == agNULL)
470285242Sachim      {
471285242Sachim          /* memory allocation failure */
472285242Sachim          /* just translate the ATAPI error register to sense information */
473285242Sachim          satTranslateATAPIErrorsToSCSIErrors(
474285242Sachim                          scsiCmnd->cdb[0],
475285242Sachim                          agFirstDword->D2H.status,
476285242Sachim                          agFirstDword->D2H.error,
477285242Sachim                          &bSenseKey,
478285242Sachim                          &bSenseCodeInfo
479285242Sachim                          );
480285242Sachim          satSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
481285242Sachim          ostiInitiatorIOCompleted( tiRoot,
482285242Sachim                                  tdIORequestBody->tiIORequest,
483285242Sachim                                  tiIOSuccess,
484285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
485285242Sachim                                  satOrgIOContext->pTiSenseData,
486285242Sachim                                  interruptContext);
487285242Sachim          TI_DBG1(("satPacketCB: momory allocation fails\n"));
488285242Sachim          return;
489285242Sachim      } /* end memory allocation */
490285242Sachim
491285242Sachim      satNewIOContext = satPrepareNewIO(satNewIntIo,
492285242Sachim                                        tiOrgIORequest,
493285242Sachim                                        satDevData,
494285242Sachim                                        scsiCmnd,
495285242Sachim                                        satOrgIOContext
496285242Sachim                                        );
497285242Sachim      /* sends request sense to ATAPI device for acquiring sense information */
498285242Sachim      status = satRequestSenseForATAPI(tiRoot,
499285242Sachim                              &satNewIntIo->satIntTiIORequest,
500285242Sachim                              satNewIOContext->ptiDeviceHandle,
501285242Sachim                              &satNewIntIo->satIntTiScsiXchg,
502285242Sachim                              satNewIOContext
503285242Sachim                              );
504285242Sachim      if (status != tiSuccess)
505285242Sachim      {
506285242Sachim          satFreeIntIoResource( tiRoot,
507285242Sachim                                satDevData,
508285242Sachim                                satNewIntIo);
509285242Sachim          /* just translate the ATAPI error register to sense information */
510285242Sachim          satTranslateATAPIErrorsToSCSIErrors(
511285242Sachim                          scsiCmnd->cdb[0],
512285242Sachim                          agFirstDword->D2H.status,
513285242Sachim                          agFirstDword->D2H.error,
514285242Sachim                          &bSenseKey,
515285242Sachim                          &bSenseCodeInfo
516285242Sachim                          );
517285242Sachim          satSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
518285242Sachim          ostiInitiatorIOCompleted( tiRoot,
519285242Sachim                                  tdIORequestBody->tiIORequest,
520285242Sachim                                  tiIOSuccess,
521285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
522285242Sachim                                  satOrgIOContext->pTiSenseData,
523285242Sachim                                  interruptContext);
524285242Sachim          TI_DBG1(("satPacketCB: failed to call satRequestSenseForATAPI()\n"));
525285242Sachim      }
526285242Sachim  }
527285242Sachim  else if (agIOStatus != OSSA_IO_SUCCESS)
528285242Sachim  {
529285242Sachim      TI_DBG1(("satPacketCB: wrong. agIOStatus != OSSA_IO_SUCCESS, status %d\n", agIOStatus));
530285242Sachim      itdsatProcessAbnormalCompletion(
531285242Sachim                    agRoot,
532285242Sachim                    agIORequest,
533285242Sachim                    agIOStatus,
534285242Sachim                    agFirstDword,
535285242Sachim                    agIOInfoLen,
536285242Sachim                    agParam,
537285242Sachim                    satIOContext);
538285242Sachim  }
539285242Sachim  else
540285242Sachim  {
541285242Sachim      TI_DBG1(("satPacketCB: Unknown error \n"));
542285242Sachim      ostiInitiatorIOCompleted( tiRoot,
543285242Sachim                                tdIORequestBody->tiIORequest,
544285242Sachim                                tiIOFailed,
545285242Sachim                                tiDetailOtherError,
546285242Sachim                                agNULL,
547285242Sachim                                interruptContext);
548285242Sachim  }
549285242Sachim}
550285242Sachim/*****************************************************************************
551285242Sachim*! \brief  satRequestSenseForATAPICB
552285242Sachim*
553285242Sachim*   This routine is a callback function called from ossaSATACompleted().
554285242Sachim*   This CB routine deals with normal non-chained data I/O SATA request.
555285242Sachim*
556285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
557285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
558285242Sachim*  \param   agIOStatus:  Status of completed I/O.
559285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
560285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
561285242Sachim*                        length.
562285242Sachim*  \param   agParam:     Additional info based on status.
563285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
564285242Sachim*
565285242Sachim*  \return: none
566285242Sachim*
567285242Sachim*****************************************************************************/
568285242Sachimvoid satRequestSenseForATAPICB(
569285242Sachim                  agsaRoot_t        *agRoot,
570285242Sachim                  agsaIORequest_t   *agIORequest,
571285242Sachim                  bit32             agIOStatus,
572285242Sachim                  agsaFisHeader_t   *agFirstDword,
573285242Sachim                  bit32             agIOInfoLen,
574285242Sachim                  void              *agParam,
575285242Sachim                  void              *ioContext
576285242Sachim                  )
577285242Sachim{
578285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
579285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
580285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
581285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
582285242Sachim  tdIORequestBody_t       *tdIORequestBody;
583285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
584285242Sachim  satIOContext_t          *satIOContext;
585285242Sachim  satIOContext_t          *satOrgIOContext;
586285242Sachim  satInternalIo_t         *satIntIo;
587285242Sachim  satDeviceData_t         *satDevData;
588285242Sachim  tiIORequest_t           *tiOrgIORequest;
589285242Sachim  bit32                   interruptContext = osData->IntContext;
590285242Sachim
591285242Sachim  TI_DBG4(("satPacketCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
592285242Sachim
593285242Sachim  /* internally generate tiIOContext */
594285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
595285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
596285242Sachim  satIntIo               = satIOContext->satIntIoContext;
597285242Sachim  satDevData             = satIOContext->pSatDevData;
598285242Sachim
599285242Sachim  /*ttttttthe one */
600285242Sachim  if (satIntIo == agNULL)
601285242Sachim  {
602285242Sachim    TI_DBG4(("satPacketCB: External satInternalIo_t satIntIoContext\n"));
603285242Sachim    satOrgIOContext = satIOContext;
604285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
605285242Sachim  }
606285242Sachim  else
607285242Sachim  {
608285242Sachim    TI_DBG4(("satPacketCB: Internal satInternalIo_t satIntIoContext\n"));
609285242Sachim    satOrgIOContext = satIOContext->satOrgIOContext;
610285242Sachim    if (satOrgIOContext == agNULL)
611285242Sachim    {
612285242Sachim      TI_DBG4(("satPacketCB: satOrgIOContext is NULL, wrong\n"));
613285242Sachim      return;
614285242Sachim    }
615285242Sachim    else
616285242Sachim    {
617285242Sachim      TI_DBG4(("satPacketCB: satOrgIOContext is NOT NULL\n"));
618285242Sachim    }
619285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
620285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
621285242Sachim  }
622285242Sachim
623285242Sachim  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
624285242Sachim
625285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
626285242Sachim  tdIORequestBody->ioStarted   = agFALSE;
627285242Sachim
628285242Sachim  /* copy the request sense buffer to original IO buffer*/
629285242Sachim  if (satIntIo != agNULL)
630285242Sachim  {
631285242Sachim    osti_memcpy(satOrgIOContext->pTiSenseData->senseData, satIntIo->satIntDmaMem.virtPtr, SENSE_DATA_LENGTH);
632285242Sachim    satOrgIOContext->pTiSenseData->senseLen = SENSE_DATA_LENGTH;
633285242Sachim    /* interal structure free */
634285242Sachim    satFreeIntIoResource( tiRoot, satDevData, satIntIo);
635285242Sachim  }
636285242Sachim
637285242Sachim  /* notify the OS to complete this SRB */
638285242Sachim  ostiInitiatorIOCompleted( tiRoot,
639285242Sachim              tiOrgIORequest,
640285242Sachim              tiIOSuccess,
641285242Sachim              SCSI_STAT_CHECK_CONDITION,
642285242Sachim              satOrgIOContext->pTiSenseData,
643285242Sachim              interruptContext);
644285242Sachim}
645285242Sachim/*****************************************************************************
646285242Sachim*! \brief  satSetFeaturesPIOCB
647285242Sachim*
648285242Sachim*   This routine is a callback function called from ossaSATACompleted().
649285242Sachim*   This CB routine deals with normal non-chained data I/O SATA request.
650285242Sachim*
651285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
652285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
653285242Sachim*  \param   agIOStatus:  Status of completed I/O.
654285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
655285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
656285242Sachim*                        length.
657285242Sachim*  \param   agParam:     Additional info based on status.
658285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
659285242Sachim*
660285242Sachim*  \return: none
661285242Sachim*
662285242Sachim*****************************************************************************/
663285242Sachimvoid satSetFeaturesPIOCB(
664285242Sachim    agsaRoot_t        *agRoot,
665285242Sachim    agsaIORequest_t   *agIORequest,
666285242Sachim    bit32             agIOStatus,
667285242Sachim    agsaFisHeader_t   *agFirstDword,
668285242Sachim    bit32             agIOInfoLen,
669285242Sachim    void              *agParam,
670285242Sachim    void              *ioContext
671285242Sachim    )
672285242Sachim{
673285242Sachim    tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
674285242Sachim    tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
675285242Sachim    tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
676285242Sachim    tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
677285242Sachim    tdIORequestBody_t       *tdIORequestBody;
678285242Sachim    tdIORequestBody_t       *tdOrgIORequestBody;
679285242Sachim    satIOContext_t          *satIOContext;
680285242Sachim    satIOContext_t          *satOrgIOContext;
681285242Sachim    satIOContext_t          *satNewIOContext;
682285242Sachim    satInternalIo_t         *satIntIo;
683285242Sachim    satInternalIo_t         *satNewIntIo = agNULL;
684285242Sachim    satDeviceData_t         *satDevData;
685285242Sachim    tiIORequest_t           *tiOrgIORequest;
686285242Sachim    tiIniScsiCmnd_t         *scsiCmnd;
687285242Sachim    bit32                   status;
688285242Sachim
689285242Sachim    TI_DBG3(("satSetFeaturesPIOCB start\n"));
690285242Sachim
691285242Sachim    /* internally generate tiIOContext */
692285242Sachim    tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
693285242Sachim    satIOContext           = (satIOContext_t *) ioContext;
694285242Sachim    satIntIo               = satIOContext->satIntIoContext;
695285242Sachim    satDevData             = satIOContext->pSatDevData;
696285242Sachim
697285242Sachim    /*ttttttthe one */
698285242Sachim    if (satIntIo == agNULL)
699285242Sachim    {
700285242Sachim        TI_DBG4(("satSetFeaturesPIOCB: External satInternalIo_t satIntIoContext\n"));
701285242Sachim        satOrgIOContext = satIOContext;
702285242Sachim        tiOrgIORequest  = tdIORequestBody->tiIORequest;
703285242Sachim        scsiCmnd        = satOrgIOContext->pScsiCmnd;
704285242Sachim    }
705285242Sachim    else
706285242Sachim    {
707285242Sachim        TI_DBG4(("satSetFeaturesPIOCB: Internal satInternalIo_t satIntIoContext\n"));
708285242Sachim        satOrgIOContext = satIOContext->satOrgIOContext;
709285242Sachim        if (satOrgIOContext == agNULL)
710285242Sachim        {
711285242Sachim            TI_DBG4(("satSetFeaturesPIOCB: satOrgIOContext is NULL, wrong\n"));
712285242Sachim            return;
713285242Sachim        }
714285242Sachim        else
715285242Sachim        {
716285242Sachim            TI_DBG4(("satSetFeaturesPIOCB: satOrgIOContext is NOT NULL\n"));
717285242Sachim        }
718285242Sachim        tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
719285242Sachim        tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
720285242Sachim        scsiCmnd               = satOrgIOContext->pScsiCmnd;
721285242Sachim    }
722285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
723285242Sachim
724285242Sachim    tdIORequestBody->ioCompleted = agTRUE;
725285242Sachim    tdIORequestBody->ioStarted   = agFALSE;
726285242Sachim
727285242Sachim    /* interal structure free */
728285242Sachim    satFreeIntIoResource(tiRoot,
729285242Sachim                         satDevData,
730285242Sachim                         satIntIo);
731285242Sachim
732285242Sachim    /*if the ATAPI device support DMA, then enble this feature*/
733285242Sachim    if (satDevData->satDMASupport && satDevData->satDMAEnabled)
734285242Sachim    {
735285242Sachim        satNewIntIo = satAllocIntIoResource( tiRoot,
736285242Sachim                                           tiOrgIORequest,
737285242Sachim                                           satDevData,
738285242Sachim                                           0,
739285242Sachim                                           satNewIntIo);
740285242Sachim        if (satNewIntIo == agNULL)
741285242Sachim        {
742285242Sachim            TI_DBG1(("satSetFeaturesPIOCB: momory allocation fails\n"));
743285242Sachim            return;
744285242Sachim        } /* end memory allocation */
745285242Sachim
746285242Sachim        satNewIOContext = satPrepareNewIO(satNewIntIo,
747285242Sachim                                          tiOrgIORequest,
748285242Sachim                                          satDevData,
749285242Sachim                                          scsiCmnd,
750285242Sachim                                          satOrgIOContext
751285242Sachim                                          );
752285242Sachim        /* sends either ATA SET FEATURES based on DMA bit */
753285242Sachim        status = satSetFeatures(tiRoot,
754285242Sachim                                &satNewIntIo->satIntTiIORequest,
755285242Sachim                                satNewIOContext->ptiDeviceHandle,
756285242Sachim                                &satNewIntIo->satIntTiScsiXchg,
757285242Sachim                                satNewIOContext,
758285242Sachim                                agTRUE
759285242Sachim                                );
760285242Sachim        if (status != tiSuccess)
761285242Sachim        {
762285242Sachim            satFreeIntIoResource( tiRoot, satDevData, satNewIntIo);
763285242Sachim            TI_DBG1(("satSetFeaturesPIOCB: failed to call satSetFeatures()\n"));
764285242Sachim        }
765285242Sachim    }
766285242Sachim}
767285242Sachim
768285242Sachim/*****************************************************************************
769285242Sachim*! \brief  satSetFeaturesCB
770285242Sachim*
771285242Sachim*   This routine is a callback function called from ossaSATACompleted().
772285242Sachim*   This CB routine deals with normal non-chained data I/O SATA request.
773285242Sachim*
774285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
775285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
776285242Sachim*  \param   agIOStatus:  Status of completed I/O.
777285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
778285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
779285242Sachim*                        length.
780285242Sachim*  \param   agParam:     Additional info based on status.
781285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
782285242Sachim*
783285242Sachim*  \return: none
784285242Sachim*
785285242Sachim*****************************************************************************/
786285242Sachimvoid satSetFeaturesCB(
787285242Sachim    agsaRoot_t        *agRoot,
788285242Sachim    agsaIORequest_t   *agIORequest,
789285242Sachim    bit32             agIOStatus,
790285242Sachim    agsaFisHeader_t   *agFirstDword,
791285242Sachim    bit32             agIOInfoLen,
792285242Sachim    void              *agParam,
793285242Sachim    void              *ioContext
794285242Sachim    )
795285242Sachim{
796285242Sachim    tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
797285242Sachim    tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
798285242Sachim    tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
799285242Sachim    tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
800285242Sachim    tdIORequestBody_t       *tdIORequestBody;
801285242Sachim    tdIORequestBody_t       *tdOrgIORequestBody = agNULL;
802285242Sachim    satIOContext_t          *satIOContext;
803285242Sachim    satIOContext_t          *satOrgIOContext;
804285242Sachim    satInternalIo_t         *satIntIo;
805285242Sachim    satDeviceData_t         *satDevData;
806285242Sachim    tdsaPortContext_t       *onePortContext = agNULL;
807285242Sachim    tiPortalContext_t       *tiPortalContext = agNULL;
808285242Sachim    tdsaDeviceData_t        *oneDeviceData = agNULL;
809285242Sachim    bit8                    PhyID =0;
810285242Sachim    TI_DBG3(("satSetFeaturesCB start\n"));
811285242Sachim
812285242Sachim    /* internally generate tiIOContext */
813285242Sachim    tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
814285242Sachim    satIOContext           = (satIOContext_t *) ioContext;
815285242Sachim    satIntIo               = satIOContext->satIntIoContext;
816285242Sachim    satDevData             = satIOContext->pSatDevData;
817285242Sachim    oneDeviceData          = (tdsaDeviceData_t *)tdIORequestBody->tiDevHandle->tdData;
818285242Sachim    onePortContext         = oneDeviceData->tdPortContext;
819285242Sachim    if (onePortContext == agNULL)
820285242Sachim    {
821285242Sachim        TI_DBG4(("satSetFeaturesCB: onePortContext is  NULL, wrong\n"));
822285242Sachim        return;
823285242Sachim    }
824285242Sachim    tiPortalContext        = onePortContext->tiPortalContext;
825285242Sachim    PhyID                  = oneDeviceData->phyID;
826285242Sachim    /*ttttttthe one */
827285242Sachim    if (satIntIo == agNULL)
828285242Sachim    {
829285242Sachim        TI_DBG4(("satSetFeaturesCB: External satInternalIo_t satIntIoContext\n"));
830285242Sachim        satOrgIOContext = satIOContext;
831285242Sachim    }
832285242Sachim    else
833285242Sachim    {
834285242Sachim        TI_DBG4(("satSetFeaturesCB: Internal satInternalIo_t satIntIoContext\n"));
835285242Sachim        satOrgIOContext = satIOContext->satOrgIOContext;
836285242Sachim        if (satOrgIOContext == agNULL)
837285242Sachim        {
838285242Sachim            TI_DBG4(("satSetFeaturesCB: satOrgIOContext is NULL, wrong\n"));
839285242Sachim            return;
840285242Sachim        }
841285242Sachim        else
842285242Sachim        {
843285242Sachim            TI_DBG4(("satSetFeaturesCB: satOrgIOContext is NOT NULL\n"));
844285242Sachim        }
845285242Sachim        tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
846285242Sachim    }
847285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
848285242Sachim
849285242Sachim    tdIORequestBody->ioCompleted = agTRUE;
850285242Sachim    tdIORequestBody->ioStarted   = agFALSE;
851285242Sachim
852285242Sachim    /* interal structure free */
853285242Sachim    satFreeIntIoResource(tiRoot,
854285242Sachim                         satDevData,
855285242Sachim                         satIntIo);
856285242Sachim
857285242Sachim
858285242Sachim    /* clean up TD layer's IORequestBody */
859285242Sachim    if (tdOrgIORequestBody!= agNULL)
860285242Sachim    {
861285242Sachim      ostiFreeMemory(tiRoot,
862285242Sachim                     tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle,
863285242Sachim                     sizeof(tdIORequestBody_t)
864285242Sachim                     );
865285242Sachim    }
866285242Sachim
867285242Sachim    if (onePortContext != agNULL)
868285242Sachim    {
869285242Sachim        /* this condition is for tdsaDiscoveryStartIDDevCB routine*/
870285242Sachim        if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
871285242Sachim        {
872285242Sachim            TI_DBG1(("satSetFeaturesCB: ID completed after discovery is done; tiDeviceArrival\n"));
873285242Sachim            /* in case registration is finished after discovery is finished */
874285242Sachim            ostiInitiatorEvent(
875285242Sachim                             tiRoot,
876285242Sachim                             tiPortalContext,
877285242Sachim                             agNULL,
878285242Sachim                             tiIntrEventTypeDeviceChange,
879285242Sachim                             tiDeviceArrival,
880285242Sachim                             agNULL
881285242Sachim                             );
882285242Sachim            return;
883285242Sachim        }
884285242Sachim        TI_DBG2(("satSetFeaturesCB: pid %d\n", tdsaAllShared->Ports[PhyID].portContext->id));
885285242Sachim        /* the below codes is for satAddSATAIDDevCB routine*/
886285242Sachim        /* notifying link up */
887285242Sachim        ostiPortEvent (
888285242Sachim                       tiRoot,
889285242Sachim                       tiPortLinkUp,
890285242Sachim                       tiSuccess,
891285242Sachim                       (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
892285242Sachim                       );
893285242Sachim         #ifdef INITIATOR_DRIVER
894285242Sachim         /* triggers discovery */
895285242Sachim         ostiPortEvent(
896285242Sachim                      tiRoot,
897285242Sachim                      tiPortDiscoveryReady,
898285242Sachim                      tiSuccess,
899285242Sachim                      (void *) tdsaAllShared->Ports[PhyID].tiPortalContext
900285242Sachim                      );
901285242Sachim        #endif
902285242Sachim    }
903285242Sachim    else
904285242Sachim    {
905285242Sachim        TI_DBG1(("satSetFeaturesCB: onePortContext is NULL, wrong\n"));
906285242Sachim    }
907285242Sachim}
908285242Sachim/*****************************************************************************
909285242Sachim*! \brief  satDeviceResetCB
910285242Sachim*
911285242Sachim*   This routine is a callback function called from ossaSATACompleted().
912285242Sachim*   This CB routine deals with normal non-chained data I/O SATA request.
913285242Sachim*
914285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
915285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
916285242Sachim*  \param   agIOStatus:  Status of completed I/O.
917285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
918285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
919285242Sachim*                        length.
920285242Sachim*  \param   agParam:     Additional info based on status.
921285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
922285242Sachim*
923285242Sachim*  \return: none
924285242Sachim*
925285242Sachim*****************************************************************************/
926285242Sachimvoid satDeviceResetCB(
927285242Sachim    agsaRoot_t        *agRoot,
928285242Sachim    agsaIORequest_t   *agIORequest,
929285242Sachim    bit32             agIOStatus,
930285242Sachim    agsaFisHeader_t   *agFirstDword,
931285242Sachim    bit32             agIOInfoLen,
932285242Sachim    void              *agParam,
933285242Sachim    void              *ioContext
934285242Sachim    )
935285242Sachim{
936285242Sachim /* callback for satResetDevice */
937285242Sachim   tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
938285242Sachim   tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
939285242Sachim   tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
940285242Sachim   tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
941285242Sachim   tdIORequestBody_t       *tdIORequestBody;
942285242Sachim   tdIORequestBody_t       *tdOrgIORequestBody = agNULL;
943285242Sachim   satIOContext_t          *satIOContext;
944285242Sachim   satIOContext_t          *satOrgIOContext;
945285242Sachim//   satIOContext_t          *satNewIOContext;
946285242Sachim   satInternalIo_t         *satIntIo;
947285242Sachim//   satInternalIo_t         *satNewIntIo = agNULL;
948285242Sachim   satDeviceData_t         *satDevData;
949285242Sachim   tiIORequest_t             *tiOrgIORequest;
950285242Sachim#ifdef  TD_DEBUG_ENABLE
951285242Sachim   bit32                     ataStatus = 0;
952285242Sachim   bit32                     ataError;
953285242Sachim   agsaFisPioSetupHeader_t   *satPIOSetupHeader = agNULL;
954285242Sachim#endif
955285242Sachim//   bit32                     status;
956285242Sachim   bit32                     report = agFALSE;
957285242Sachim   bit32                     AbortTM = agFALSE;
958285242Sachim
959285242Sachim   TI_DBG1(("satDeviceResetCB: start\n"));
960285242Sachim
961285242Sachim   TI_DBG6(("satDeviceResetCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
962285242Sachim
963285242Sachim   tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
964285242Sachim   satIOContext           = (satIOContext_t *) ioContext;
965285242Sachim   satIntIo               = satIOContext->satIntIoContext;
966285242Sachim   satDevData             = satIOContext->pSatDevData;
967285242Sachim
968285242Sachim   if (satIntIo == agNULL)
969285242Sachim   {
970285242Sachim     TI_DBG6(("satDeviceResetCB: External, OS generated\n"));
971285242Sachim     satOrgIOContext      = satIOContext;
972285242Sachim     tiOrgIORequest       = tdIORequestBody->tiIORequest;
973285242Sachim   }
974285242Sachim   else
975285242Sachim   {
976285242Sachim     TI_DBG6(("satDeviceResetCB: Internal, TD generated\n"));
977285242Sachim     satOrgIOContext        = satIOContext->satOrgIOContext;
978285242Sachim     if (satOrgIOContext == agNULL)
979285242Sachim     {
980285242Sachim       TI_DBG6(("satDeviceResetCB: satOrgIOContext is NULL, wrong\n"));
981285242Sachim       return;
982285242Sachim     }
983285242Sachim     else
984285242Sachim     {
985285242Sachim       TI_DBG6(("satDeviceResetCB: satOrgIOContext is NOT NULL\n"));
986285242Sachim     }
987285242Sachim     tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
988285242Sachim     tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
989285242Sachim   }
990285242Sachim
991285242Sachim   tdIORequestBody->ioCompleted = agTRUE;
992285242Sachim   tdIORequestBody->ioStarted = agFALSE;
993285242Sachim
994285242Sachim   if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
995285242Sachim   {
996285242Sachim     TI_DBG1(("satDeviceResetCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
997285242Sachim
998285242Sachim     if (satOrgIOContext->NotifyOS == agTRUE)
999285242Sachim     {
1000285242Sachim       ostiInitiatorEvent( tiRoot,
1001285242Sachim                           NULL,
1002285242Sachim                           NULL,
1003285242Sachim                           tiIntrEventTypeTaskManagement,
1004285242Sachim                           tiTMFailed,
1005285242Sachim                           tiOrgIORequest );
1006285242Sachim     }
1007285242Sachim
1008285242Sachim     satDevData->satTmTaskTag = agNULL;
1009285242Sachim
1010285242Sachim     satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1011285242Sachim
1012285242Sachim     satFreeIntIoResource( tiRoot,
1013285242Sachim                           satDevData,
1014285242Sachim                           satIntIo);
1015285242Sachim     return;
1016285242Sachim   }
1017285242Sachim
1018285242Sachim   if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED ||
1019285242Sachim       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION ||
1020285242Sachim       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
1021285242Sachim       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS ||
1022285242Sachim       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION ||
1023285242Sachim       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED ||
1024285242Sachim       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION ||
1025285242Sachim       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR ||
1026285242Sachim       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY
1027285242Sachim       )
1028285242Sachim   {
1029285242Sachim     TI_DBG1(("satDeviceResetCB: OSSA_IO_OPEN_CNX_ERROR\n"));
1030285242Sachim
1031285242Sachim     if (satOrgIOContext->NotifyOS == agTRUE)
1032285242Sachim     {
1033285242Sachim       ostiInitiatorEvent( tiRoot,
1034285242Sachim                           NULL,
1035285242Sachim                           NULL,
1036285242Sachim                           tiIntrEventTypeTaskManagement,
1037285242Sachim                           tiTMFailed,
1038285242Sachim                           tiOrgIORequest );
1039285242Sachim     }
1040285242Sachim
1041285242Sachim     satDevData->satTmTaskTag = agNULL;
1042285242Sachim
1043285242Sachim     satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1044285242Sachim
1045285242Sachim     satFreeIntIoResource( tiRoot,
1046285242Sachim                          satDevData,
1047285242Sachim                          satIntIo);
1048285242Sachim     return;
1049285242Sachim   }
1050285242Sachim
1051285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
1052285242Sachim   {
1053285242Sachim     /* only agsaFisPioSetup_t is expected */
1054285242Sachim#ifdef  TD_DEBUG_ENABLE
1055285242Sachim     satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
1056285242Sachim     ataStatus     = satPIOSetupHeader->status;   /* ATA Status register */
1057285242Sachim     ataError      = satPIOSetupHeader->error;    /* ATA Eror register   */
1058285242Sachim#endif
1059285242Sachim     TI_DBG1(("satDeviceResetCB: ataStatus 0x%x ataError 0x%x\n", ataStatus, ataError));
1060285242Sachim
1061285242Sachim      if (satOrgIOContext->NotifyOS == agTRUE)
1062285242Sachim      {
1063285242Sachim       ostiInitiatorEvent( tiRoot,
1064285242Sachim                           NULL,
1065285242Sachim                           NULL,
1066285242Sachim                           tiIntrEventTypeTaskManagement,
1067285242Sachim                           tiTMFailed,
1068285242Sachim                           tiOrgIORequest );
1069285242Sachim      }
1070285242Sachim
1071285242Sachim     satDevData->satTmTaskTag = agNULL;
1072285242Sachim
1073285242Sachim     satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1074285242Sachim
1075285242Sachim     satFreeIntIoResource( tiRoot,
1076285242Sachim                           satDevData,
1077285242Sachim                           satIntIo);
1078285242Sachim     return;
1079285242Sachim   }
1080285242Sachim
1081285242Sachim   /* success */
1082285242Sachim  if (satOrgIOContext->TMF == AG_ABORT_TASK)
1083285242Sachim  {
1084285242Sachim    AbortTM = agTRUE;
1085285242Sachim  }
1086285242Sachim
1087285242Sachim  if (satOrgIOContext->NotifyOS == agTRUE)
1088285242Sachim  {
1089285242Sachim    report = agTRUE;
1090285242Sachim  }
1091285242Sachim
1092285242Sachim  if (AbortTM == agTRUE)
1093285242Sachim  {
1094285242Sachim    TI_DBG1(("satDeResetDeviceCB: calling satAbort\n"));
1095285242Sachim    satAbort(agRoot, satOrgIOContext->satToBeAbortedIOContext);
1096285242Sachim  }
1097285242Sachim  satDevData->satTmTaskTag = agNULL;
1098285242Sachim
1099285242Sachim  satDevData->satDriveState = SAT_DEV_STATE_NORMAL;
1100285242Sachim
1101285242Sachim  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1102285242Sachim
1103285242Sachim  TI_DBG1(("satDeviceResetCB: satPendingIO %d satNCQMaxIO %d\n", satDevData->satPendingIO, satDevData->satNCQMaxIO ));
1104285242Sachim  TI_DBG1(("satDeviceResetCB: satPendingNCQIO %d satPendingNONNCQIO %d\n", satDevData->satPendingNCQIO, satDevData->satPendingNONNCQIO));
1105285242Sachim
1106285242Sachim  satFreeIntIoResource( tiRoot,
1107285242Sachim                        satDevData,
1108285242Sachim                        satIntIo);
1109285242Sachim
1110285242Sachim  /* clean up TD layer's IORequestBody */
1111285242Sachim  if (tdOrgIORequestBody != agNULL)
1112285242Sachim  {
1113285242Sachim    ostiFreeMemory(
1114285242Sachim                   tiRoot,
1115285242Sachim                   tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle,
1116285242Sachim                   sizeof(tdIORequestBody_t)
1117285242Sachim                   );
1118285242Sachim  }
1119285242Sachim  else
1120285242Sachim  {
1121285242Sachim    TI_DBG1(("satDeviceResetCB: tdOrgIORequestBody is NULL, wrong\n"));
1122285242Sachim  }
1123285242Sachim
1124285242Sachim
1125285242Sachim  if (report)
1126285242Sachim  {
1127285242Sachim    ostiInitiatorEvent( tiRoot,
1128285242Sachim                        NULL,
1129285242Sachim                        NULL,
1130285242Sachim                        tiIntrEventTypeTaskManagement,
1131285242Sachim                        tiTMOK,
1132285242Sachim                        tiOrgIORequest );
1133285242Sachim  }
1134285242Sachim
1135285242Sachim
1136285242Sachim  TI_DBG5(("satDeviceResetCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO));
1137285242Sachim  TI_DBG6(("satDeviceResetCB: end\n"));
1138285242Sachim  return;
1139285242Sachim}
1140285242Sachim
1141285242Sachim/*****************************************************************************
1142285242Sachim*! \brief  satExecuteDeviceDiagnosticCB
1143285242Sachim*
1144285242Sachim*   This routine is a callback function called from ossaSATACompleted().
1145285242Sachim*   This CB routine deals with normal non-chained data I/O SATA request.
1146285242Sachim*
1147285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
1148285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
1149285242Sachim*  \param   agIOStatus:  Status of completed I/O.
1150285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
1151285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
1152285242Sachim*                        length.
1153285242Sachim*  \param   agParam:     Additional info based on status.
1154285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
1155285242Sachim*
1156285242Sachim*  \return: none
1157285242Sachim*
1158285242Sachim*****************************************************************************/
1159285242Sachimvoid satExecuteDeviceDiagnosticCB(
1160285242Sachim    agsaRoot_t        *agRoot,
1161285242Sachim    agsaIORequest_t   *agIORequest,
1162285242Sachim    bit32             agIOStatus,
1163285242Sachim    agsaFisHeader_t   *agFirstDword,
1164285242Sachim    bit32             agIOInfoLen,
1165285242Sachim    void              *agParam,
1166285242Sachim    void              *ioContext
1167285242Sachim    )
1168285242Sachim{
1169285242Sachim    tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
1170285242Sachim    tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
1171285242Sachim    tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
1172285242Sachim    tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1173285242Sachim    tdIORequestBody_t       *tdIORequestBody;
1174285242Sachim    satIOContext_t          *satIOContext;
1175285242Sachim    satIOContext_t          *satOrgIOContext;
1176285242Sachim    satInternalIo_t         *satIntIo;
1177285242Sachim    satDeviceData_t         *satDevData;
1178285242Sachim
1179285242Sachim    TI_DBG3(("satExecuteDeviceDiagnosticCB start\n"));
1180285242Sachim
1181285242Sachim    /* internally generate tiIOContext */
1182285242Sachim    tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
1183285242Sachim    satIOContext           = (satIOContext_t *) ioContext;
1184285242Sachim    satIntIo               = satIOContext->satIntIoContext;
1185285242Sachim    satDevData             = satIOContext->pSatDevData;
1186285242Sachim
1187285242Sachim    /*ttttttthe one */
1188285242Sachim    if (satIntIo == agNULL)
1189285242Sachim    {
1190285242Sachim        TI_DBG4(("satExecuteDeviceDiagnosticCB: External satInternalIo_t satIntIoContext\n"));
1191285242Sachim        satOrgIOContext = satIOContext;
1192285242Sachim    }
1193285242Sachim    else
1194285242Sachim    {
1195285242Sachim        TI_DBG4(("satExecuteDeviceDiagnosticCB: Internal satInternalIo_t satIntIoContext\n"));
1196285242Sachim        satOrgIOContext = satIOContext->satOrgIOContext;
1197285242Sachim        if (satOrgIOContext == agNULL)
1198285242Sachim        {
1199285242Sachim            TI_DBG4(("satExecuteDeviceDiagnosticCB: satOrgIOContext is NULL, wrong\n"));
1200285242Sachim            return;
1201285242Sachim        }
1202285242Sachim        else
1203285242Sachim        {
1204285242Sachim            TI_DBG4(("satExecuteDeviceDiagnosticCB: satOrgIOContext is NOT NULL\n"));
1205285242Sachim        }
1206285242Sachim    }
1207285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1208285242Sachim
1209285242Sachim    tdIORequestBody->ioCompleted = agTRUE;
1210285242Sachim    tdIORequestBody->ioStarted   = agFALSE;
1211285242Sachim
1212285242Sachim    /* interal structure free */
1213285242Sachim    satFreeIntIoResource(tiRoot,
1214285242Sachim                         satDevData,
1215285242Sachim                         satIntIo);
1216285242Sachim}
1217285242Sachim/*****************************************************************************
1218285242Sachim*! \brief  satNonChainedDataIOCB
1219285242Sachim*
1220285242Sachim*   This routine is a callback function called from ossaSATACompleted().
1221285242Sachim*   This CB routine deals with normal non-chained data I/O SATA request.
1222285242Sachim*
1223285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
1224285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
1225285242Sachim*  \param   agIOStatus:  Status of completed I/O.
1226285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
1227285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
1228285242Sachim*                        length.
1229285242Sachim*  \param   agParam:     Additional info based on status.
1230285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
1231285242Sachim*
1232285242Sachim*  \return: none
1233285242Sachim*
1234285242Sachim*****************************************************************************/
1235285242Sachim
1236285242Sachimvoid satNonChainedDataIOCB(
1237285242Sachim                           agsaRoot_t        *agRoot,
1238285242Sachim                           agsaIORequest_t   *agIORequest,
1239285242Sachim                           bit32             agIOStatus,
1240285242Sachim                           agsaFisHeader_t   *agFirstDword,
1241285242Sachim                           bit32             agIOInfoLen,
1242285242Sachim                           void              *agParam,
1243285242Sachim                           void              *ioContext
1244285242Sachim                           )
1245285242Sachim{
1246285242Sachim
1247285242Sachim  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
1248285242Sachim  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
1249285242Sachim  tdsaRoot_t           *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
1250285242Sachim  tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1251285242Sachim  tdIORequestBody_t    *tdIORequestBody;
1252285242Sachim  bit32                interruptContext = osData->IntContext;
1253285242Sachim  satIOContext_t       *satIOContext;
1254285242Sachim  satInternalIo_t      *SatIntIo;
1255285242Sachim  satDeviceData_t      *SatDevData;
1256285242Sachim
1257285242Sachim  TI_DBG6(("satNonChainedDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
1258285242Sachim    agIORequest, agIOStatus, agIOInfoLen));
1259285242Sachim
1260285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
1261285242Sachim  satIOContext    = (satIOContext_t *) ioContext;
1262285242Sachim  SatIntIo               = satIOContext->satIntIoContext;
1263285242Sachim  SatDevData      = satIOContext->pSatDevData;
1264285242Sachim  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1265285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
1266285242Sachim  tdIORequestBody->ioStarted   = agFALSE;
1267285242Sachim
1268285242Sachim  /* interal structure free */
1269285242Sachim  satFreeIntIoResource( tiRoot,
1270285242Sachim                         SatDevData,
1271285242Sachim                         SatIntIo);
1272285242Sachim
1273285242Sachim  /* Process completion */
1274285242Sachim  if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen == 0))
1275285242Sachim  {
1276285242Sachim    TI_DBG5(("satNonChainedDataIOCB: success\n"));
1277285242Sachim    TI_DBG5(("satNonChainedDataIOCB: success agIORequest %p\n", agIORequest));
1278285242Sachim    /*
1279285242Sachim     * Command was completed OK, this is the normal path.
1280285242Sachim     * Now call the OS-App Specific layer about this completion.
1281285242Sachim     */
1282285242Sachim    ostiInitiatorIOCompleted( tiRoot,
1283285242Sachim                              tdIORequestBody->tiIORequest,
1284285242Sachim                              tiIOSuccess,
1285285242Sachim                              SCSI_STAT_GOOD,
1286285242Sachim                              agNULL,
1287285242Sachim                              interruptContext);
1288285242Sachim  }
1289285242Sachim  else
1290285242Sachim  {
1291285242Sachim    TI_DBG1(("satNonChainedDataIOCB: calling itdsatProcessAbnormalCompletion\n"));
1292285242Sachim    /* More checking needed */
1293285242Sachim    itdsatProcessAbnormalCompletion( agRoot,
1294285242Sachim                                     agIORequest,
1295285242Sachim                                     agIOStatus,
1296285242Sachim                                     agFirstDword,
1297285242Sachim                                     agIOInfoLen,
1298285242Sachim                                     agParam,
1299285242Sachim                                     satIOContext);
1300285242Sachim  }
1301285242Sachim
1302285242Sachim  return;
1303285242Sachim
1304285242Sachim
1305285242Sachim}
1306285242Sachim/*****************************************************************************
1307285242Sachim*! \brief  satChainedDataIOCB
1308285242Sachim*
1309285242Sachim*   This routine is a callback function called from ossaSATACompleted().
1310285242Sachim*   This CB routine deals with normal chained data I/O SATA request.
1311285242Sachim*
1312285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
1313285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
1314285242Sachim*  \param   agIOStatus:  Status of completed I/O.
1315285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
1316285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
1317285242Sachim*                        length.
1318285242Sachim*  \param   agParam:     Additional info based on status.
1319285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
1320285242Sachim*
1321285242Sachim*  \return: none
1322285242Sachim*
1323285242Sachim*****************************************************************************/
1324285242Sachimvoid satChainedDataIOCB(
1325285242Sachim                        agsaRoot_t        *agRoot,
1326285242Sachim                        agsaIORequest_t   *agIORequest,
1327285242Sachim                        bit32             agIOStatus,
1328285242Sachim                        agsaFisHeader_t   *agFirstDword,
1329285242Sachim                        bit32             agIOInfoLen,
1330285242Sachim                        void              *agParam,
1331285242Sachim                        void              *ioContext
1332285242Sachim                        )
1333285242Sachim{
1334285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
1335285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
1336285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
1337285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1338285242Sachim  tdIORequestBody_t       *tdIORequestBody;
1339285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
1340285242Sachim  satIOContext_t          *satIOContext;
1341285242Sachim  satIOContext_t          *satOrgIOContext;
1342285242Sachim  satIOContext_t          *satNewIOContext;
1343285242Sachim  satInternalIo_t         *satIntIo;
1344285242Sachim  satInternalIo_t         *satNewIntIo = agNULL;
1345285242Sachim  satDeviceData_t         *satDevData;
1346285242Sachim  scsiRspSense_t            *pSense;
1347285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
1348285242Sachim  tiIORequest_t             *tiOrgIORequest;
1349285242Sachim
1350285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
1351285242Sachim  bit32                     ataStatus = 0;
1352285242Sachim  bit32                     status = tiError;
1353285242Sachim  agsaFisRegD2HHeader_t     *statDevToHostFisHeader = agNULL;
1354285242Sachim  bit32                     dataLength;
1355285242Sachim
1356285242Sachim  TI_DBG6(("satChainedDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
1357285242Sachim           agIORequest, agIOStatus, agIOInfoLen));
1358285242Sachim
1359285242Sachim
1360285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
1361285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
1362285242Sachim  if (satIOContext == agNULL)
1363285242Sachim  {
1364285242Sachim    TI_DBG1(("satChainedDataIOCB: satIOContext is NULL\n"));
1365285242Sachim    return;
1366285242Sachim  }
1367285242Sachim  satIntIo               = satIOContext->satIntIoContext;
1368285242Sachim  satDevData             = satIOContext->pSatDevData;
1369285242Sachim  hostToDevFis           = satIOContext->pFis;
1370285242Sachim
1371285242Sachim  if (satIntIo == agNULL)
1372285242Sachim  {
1373285242Sachim    TI_DBG5(("satChainedDataIOCB: External satInternalIo_t satIntIoContext\n"));
1374285242Sachim    satOrgIOContext = satIOContext;
1375285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
1376285242Sachim    pSense          = satIOContext->pSense;
1377285242Sachim    scsiCmnd        = satIOContext->pScsiCmnd;
1378285242Sachim  }
1379285242Sachim  else
1380285242Sachim  {
1381285242Sachim    TI_DBG5(("satChainedDataIOCB: Internal satInternalIo_t satIntIoContext\n"));
1382285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
1383285242Sachim    if (satOrgIOContext == agNULL)
1384285242Sachim    {
1385285242Sachim      TI_DBG5(("satChainedDataIOCB: satOrgIOContext is NULL\n"));
1386285242Sachim    }
1387285242Sachim    else
1388285242Sachim    {
1389285242Sachim      TI_DBG5(("satChainedDataIOCB: satOrgIOContext is NOT NULL\n"));
1390285242Sachim    }
1391285242Sachim
1392285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
1393285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
1394285242Sachim
1395285242Sachim    pSense        = satOrgIOContext->pSense;
1396285242Sachim    scsiCmnd      = satOrgIOContext->pScsiCmnd;
1397285242Sachim  }
1398285242Sachim
1399285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
1400285242Sachim  tdIORequestBody->ioStarted = agFALSE;
1401285242Sachim
1402285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
1403285242Sachim  {
1404285242Sachim     TI_DBG1(("satChainedDataIOCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
1405285242Sachim     satSetSensePayload( pSense,
1406285242Sachim                        SCSI_SNSKEY_NO_SENSE,
1407285242Sachim                        0,
1408285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1409285242Sachim                        satOrgIOContext);
1410285242Sachim
1411285242Sachim     ostiInitiatorIOCompleted( tiRoot,
1412285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1413285242Sachim                              tiIOSuccess,
1414285242Sachim                              SCSI_STAT_CHECK_CONDITION,
1415285242Sachim                              satOrgIOContext->pTiSenseData,
1416285242Sachim                              satOrgIOContext->interruptContext );
1417285242Sachim
1418285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1419285242Sachim
1420285242Sachim    satFreeIntIoResource( tiRoot,
1421285242Sachim                          satDevData,
1422285242Sachim                          satIntIo);
1423285242Sachim    return;
1424285242Sachim  }
1425285242Sachim
1426285242Sachim  /*
1427285242Sachim    checking IO status, FIS type and error status
1428285242Sachim  */
1429285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
1430285242Sachim  {
1431285242Sachim    /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read
1432285242Sachim       agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write
1433285242Sachim       first, assumed to be Reg Device to Host FIS
1434285242Sachim       This is OK to just find fis type
1435285242Sachim    */
1436285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
1437285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
1438285242Sachim    /* for debugging */
1439285242Sachim    if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) &&
1440285242Sachim        (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
1441285242Sachim        (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
1442285242Sachim        )
1443285242Sachim    {
1444285242Sachim      TI_DBG1(("satChainedDataIOCB: FAILED, Wrong FIS type 0x%x\n", statDevToHostFisHeader->fisType));
1445285242Sachim    }
1446285242Sachim
1447285242Sachim    /* for debugging */
1448285242Sachim    if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
1449285242Sachim         (ataStatus & DF_ATA_STATUS_MASK)
1450285242Sachim         )
1451285242Sachim    {
1452285242Sachim      TI_DBG1(("satChainedDataIOCB: FAILED, error status and command 0x%x\n", hostToDevFis->h.command));
1453285242Sachim    }
1454285242Sachim
1455285242Sachim    /* the function below handles abort case */
1456285242Sachim    itdsatDelayedProcessAbnormalCompletion(agRoot,
1457285242Sachim                                           agIORequest,
1458285242Sachim                                           agIOStatus,
1459285242Sachim                                           agFirstDword,
1460285242Sachim                                           agIOInfoLen,
1461285242Sachim                                           agParam,
1462285242Sachim                                           satIOContext);
1463285242Sachim
1464285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1465285242Sachim    satFreeIntIoResource( tiRoot,
1466285242Sachim                          satDevData,
1467285242Sachim                          satIntIo);
1468285242Sachim    return;
1469285242Sachim  } /* end of error */
1470285242Sachim
1471285242Sachim  switch (hostToDevFis->h.command)
1472285242Sachim  {
1473285242Sachim  case SAT_READ_DMA: /* fall through */
1474285242Sachim  case SAT_READ_SECTORS: /* fall through */
1475285242Sachim  case SAT_READ_DMA_EXT: /* fall through */
1476285242Sachim  case SAT_READ_SECTORS_EXT: /* fall through */
1477285242Sachim  case SAT_READ_FPDMA_QUEUED: /* fall through */
1478285242Sachim  case SAT_WRITE_DMA: /* fall through */
1479285242Sachim  case SAT_WRITE_SECTORS:/* fall through */
1480285242Sachim  case SAT_WRITE_DMA_FUA_EXT: /* fall through */
1481285242Sachim  case SAT_WRITE_DMA_EXT: /* fall through */
1482285242Sachim  case SAT_WRITE_SECTORS_EXT: /* fall through */
1483285242Sachim  case SAT_WRITE_FPDMA_QUEUED:
1484285242Sachim
1485285242Sachim    TI_DBG5(("satChainedDataIOCB: READ/WRITE success case\n"));
1486285242Sachim
1487285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1488285242Sachim
1489285242Sachim    /* done with internally genereated SAT_SMART_RETURN_STATUS */
1490285242Sachim    satFreeIntIoResource( tiRoot,
1491285242Sachim                          satDevData,
1492285242Sachim                          satIntIo);
1493285242Sachim    /* let's loop till TL */
1494285242Sachim
1495285242Sachim    /* lba = lba + tl
1496285242Sachim       loopnum--;
1497285242Sachim       if (loopnum == 0) done
1498285242Sachim     */
1499285242Sachim    (satOrgIOContext->LoopNum)--;
1500285242Sachim    if (satOrgIOContext->LoopNum == 0)
1501285242Sachim    {
1502285242Sachim      /* done with read */
1503285242Sachim      ostiInitiatorIOCompleted( tiRoot,
1504285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1505285242Sachim                                tiIOSuccess,
1506285242Sachim                                SCSI_STAT_GOOD,
1507285242Sachim                                agNULL,
1508285242Sachim                                satOrgIOContext->interruptContext );
1509285242Sachim      return;
1510285242Sachim    }
1511285242Sachim    if (satOrgIOContext->superIOFlag)
1512285242Sachim    {
1513285242Sachim      dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
1514285242Sachim    }
1515285242Sachim    else
1516285242Sachim    {
1517285242Sachim      dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
1518285242Sachim    }
1519285242Sachim
1520285242Sachim    satNewIntIo = satAllocIntIoResource( tiRoot,
1521285242Sachim                                         tiOrgIORequest,
1522285242Sachim                                         satDevData,
1523285242Sachim                                         dataLength,
1524285242Sachim                                         satNewIntIo);
1525285242Sachim    if (satNewIntIo == agNULL)
1526285242Sachim    {
1527285242Sachim      /* memory allocation failure */
1528285242Sachim      satFreeIntIoResource( tiRoot,
1529285242Sachim                            satDevData,
1530285242Sachim                            satNewIntIo);
1531285242Sachim       ostiInitiatorIOCompleted( tiRoot,
1532285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1533285242Sachim                                tiIOFailed,
1534285242Sachim                                tiDetailOtherError,
1535285242Sachim                                agNULL,
1536285242Sachim                                satOrgIOContext->interruptContext );
1537285242Sachim
1538285242Sachim      TI_DBG1(("satChainedDataIOCB: momory allocation fails\n"));
1539285242Sachim      return;
1540285242Sachim    } /* end of memory allocation failure */
1541285242Sachim
1542285242Sachim       /*
1543285242Sachim     * Need to initialize all the fields within satIOContext
1544285242Sachim     */
1545285242Sachim
1546285242Sachim    satNewIOContext = satPrepareNewIO(
1547285242Sachim                                      satNewIntIo,
1548285242Sachim                                      tiOrgIORequest,
1549285242Sachim                                      satDevData,
1550285242Sachim                                      scsiCmnd,
1551285242Sachim                                      satOrgIOContext
1552285242Sachim                                      );
1553285242Sachim
1554285242Sachim    /* sending another ATA command */
1555285242Sachim    switch (scsiCmnd->cdb[0])
1556285242Sachim    {
1557285242Sachim    case SCSIOPC_READ_6:
1558285242Sachim      /* no loop should occur with READ6 since it fits in one ATA command */
1559285242Sachim      break;
1560285242Sachim    case SCSIOPC_READ_10: /* fall through */
1561285242Sachim    case SCSIOPC_READ_12: /* fall through */
1562285242Sachim    case SCSIOPC_READ_16: /* fall through */
1563285242Sachim      status = satRead_1( tiRoot,
1564285242Sachim                          &satNewIntIo->satIntTiIORequest,
1565285242Sachim                          satNewIOContext->ptiDeviceHandle,
1566285242Sachim                          &satNewIntIo->satIntTiScsiXchg,
1567285242Sachim                          satNewIOContext);
1568285242Sachim      break;
1569285242Sachim    case SCSIOPC_WRITE_6:
1570285242Sachim      /* no loop should occur with WRITE6 since it fits in one ATA command */
1571285242Sachim      break;
1572285242Sachim    case SCSIOPC_WRITE_10: /* fall through */
1573285242Sachim    case SCSIOPC_WRITE_12: /* fall through */
1574285242Sachim    case SCSIOPC_WRITE_16: /* fall through */
1575285242Sachim      status = satWrite_1( tiRoot,
1576285242Sachim                           &satNewIntIo->satIntTiIORequest,
1577285242Sachim                           satNewIOContext->ptiDeviceHandle,
1578285242Sachim                           &satNewIntIo->satIntTiScsiXchg,
1579285242Sachim                             satNewIOContext);
1580285242Sachim      break;
1581285242Sachim    default:
1582285242Sachim      TI_DBG1(("satChainedDataIOCB: success but default case scsi cmd 0x%x ata cmd 0x%x\n",scsiCmnd->cdb[0], hostToDevFis->h.command));
1583285242Sachim      status = tiError;
1584285242Sachim      break;
1585285242Sachim    }
1586285242Sachim
1587285242Sachim
1588285242Sachim
1589285242Sachim    if (status != tiSuccess)
1590285242Sachim    {
1591285242Sachim      satFreeIntIoResource( tiRoot,
1592285242Sachim                            satDevData,
1593285242Sachim                            satNewIntIo);
1594285242Sachim      ostiInitiatorIOCompleted( tiRoot,
1595285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1596285242Sachim                                tiIOFailed,
1597285242Sachim                                tiDetailOtherError,
1598285242Sachim                                agNULL,
1599285242Sachim                                satOrgIOContext->interruptContext );
1600285242Sachim      TI_DBG1(("satChainedDataIOCB: calling satRead10_1 fails\n"));
1601285242Sachim      return;
1602285242Sachim    }
1603285242Sachim
1604285242Sachim    break;
1605285242Sachim
1606285242Sachim
1607285242Sachim  default:
1608285242Sachim    TI_DBG1(("satChainedDataIOCB: success but default case command 0x%x\n",hostToDevFis->h.command));
1609285242Sachim    ostiInitiatorIOCompleted( tiRoot,
1610285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1611285242Sachim                              tiIOFailed,
1612285242Sachim                              tiDetailOtherError,
1613285242Sachim                              agNULL,
1614285242Sachim                              satOrgIOContext->interruptContext );
1615285242Sachim
1616285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1617285242Sachim
1618285242Sachim    satFreeIntIoResource( tiRoot,
1619285242Sachim                          satDevData,
1620285242Sachim                          satIntIo);
1621285242Sachim
1622285242Sachim    break;
1623285242Sachim  }
1624285242Sachim
1625285242Sachim
1626285242Sachim  return;
1627285242Sachim}
1628285242Sachimvoid satNonChainedWriteNVerifyCB(
1629285242Sachim                        agsaRoot_t        *agRoot,
1630285242Sachim                        agsaIORequest_t   *agIORequest,
1631285242Sachim                        bit32             agIOStatus,
1632285242Sachim                        agsaFisHeader_t   *agFirstDword,
1633285242Sachim                        bit32             agIOInfoLen,
1634285242Sachim                        void              *agParam,
1635285242Sachim                        void              *ioContext
1636285242Sachim                        )
1637285242Sachim{
1638285242Sachim
1639285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
1640285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
1641285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
1642285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1643285242Sachim  tdIORequestBody_t       *tdIORequestBody;
1644285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
1645285242Sachim  satIOContext_t          *satIOContext;
1646285242Sachim  satIOContext_t          *satOrgIOContext;
1647285242Sachim  satIOContext_t          *satNewIOContext;
1648285242Sachim  satInternalIo_t         *satIntIo;
1649285242Sachim  satInternalIo_t         *satNewIntIo = agNULL;
1650285242Sachim  satDeviceData_t         *satDevData;
1651285242Sachim  scsiRspSense_t            *pSense;
1652285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
1653285242Sachim  tiIORequest_t             *tiOrgIORequest;
1654285242Sachim
1655285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
1656285242Sachim  bit32                     ataStatus = 0;
1657285242Sachim  bit32                     status;
1658285242Sachim  tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
1659285242Sachim  agsaFisRegD2HHeader_t     *statDevToHostFisHeader = agNULL;
1660285242Sachim  agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL;
1661285242Sachim
1662285242Sachim  TI_DBG5(("satNonChainedWriteNVerifyCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
1663285242Sachim
1664285242Sachim  /* internally generate tiIOContext */
1665285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
1666285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
1667285242Sachim  satIntIo               = satIOContext->satIntIoContext;
1668285242Sachim  satDevData             = satIOContext->pSatDevData;
1669285242Sachim  hostToDevFis           = satIOContext->pFis;
1670285242Sachim
1671285242Sachim  /* SPC: Self-Test Result Log page */
1672285242Sachim  tiScsiRequest          = satIOContext->tiScsiXchg;
1673285242Sachim
1674285242Sachim  if (satIntIo == agNULL)
1675285242Sachim  {
1676285242Sachim    TI_DBG4(("satNonChainedWriteNVerifyCB: External satInternalIo_t satIntIoContext\n"));
1677285242Sachim    satOrgIOContext = satIOContext;
1678285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
1679285242Sachim    pSense          = satOrgIOContext->pSense;
1680285242Sachim    scsiCmnd        = satOrgIOContext->pScsiCmnd;
1681285242Sachim  }
1682285242Sachim  else
1683285242Sachim  {
1684285242Sachim    TI_DBG4(("satNonChainedWriteNVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
1685285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
1686285242Sachim    if (satOrgIOContext == agNULL)
1687285242Sachim    {
1688285242Sachim      TI_DBG4(("satNonChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n"));
1689285242Sachim      return;
1690285242Sachim    }
1691285242Sachim    else
1692285242Sachim    {
1693285242Sachim      TI_DBG4(("satNonChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n"));
1694285242Sachim    }
1695285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
1696285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
1697285242Sachim
1698285242Sachim    pSense        = satOrgIOContext->pSense;
1699285242Sachim    scsiCmnd      = satOrgIOContext->pScsiCmnd;
1700285242Sachim  }
1701285242Sachim
1702285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
1703285242Sachim  tdIORequestBody->ioStarted = agFALSE;
1704285242Sachim
1705285242Sachim
1706285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
1707285242Sachim  {
1708285242Sachim    TI_DBG1(("satNonChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
1709285242Sachim    ostiInitiatorIOCompleted (
1710285242Sachim                             tiRoot,
1711285242Sachim                             tiOrgIORequest,
1712285242Sachim                             tiIOFailed,
1713285242Sachim                             tiDetailOtherError,
1714285242Sachim                             agNULL,
1715285242Sachim                             satOrgIOContext->interruptContext
1716285242Sachim                             );
1717285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1718285242Sachim
1719285242Sachim    satFreeIntIoResource( tiRoot,
1720285242Sachim                          satDevData,
1721285242Sachim                          satIntIo);
1722285242Sachim    return;
1723285242Sachim  }
1724285242Sachim
1725285242Sachim
1726285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
1727285242Sachim  {
1728285242Sachim    /*
1729285242Sachim      FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
1730285242Sachim    */
1731285242Sachim    /* First, assumed to be Reg Device to Host FIS */
1732285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
1733285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
1734285242Sachim  }
1735285242Sachim
1736285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
1737285242Sachim  {
1738285242Sachim    if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS)
1739285242Sachim    {
1740285242Sachim      statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H);
1741285242Sachim
1742285242Sachim      /* Get ATA Status register */
1743285242Sachim      ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70);               /* bits 4,5,6 */
1744285242Sachim      ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07);   /* bits 0,1,2 */
1745285242Sachim
1746285242Sachim      /* ATA Eror register   */
1747285242Sachim   }
1748285242Sachim  }
1749285242Sachim
1750285242Sachim
1751285242Sachim  if( agIOStatus != OSSA_IO_SUCCESS)
1752285242Sachim  {
1753285242Sachim  /*
1754285242Sachim    checking IO status, FIS type and error status
1755285242Sachim    FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
1756285242Sachim    Both have fisType in the same location
1757285242Sachim  */
1758285242Sachim  if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
1759285242Sachim        (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) ||
1760285242Sachim       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
1761285242Sachim       )
1762285242Sachim    {
1763285242Sachim      /* for debugging */
1764285242Sachim      if( agIOStatus != OSSA_IO_SUCCESS)
1765285242Sachim      {
1766285242Sachim        TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, NOT IO_SUCCESS\n"));
1767285242Sachim      }
1768285242Sachim      else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
1769285242Sachim      {
1770285242Sachim        TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
1771285242Sachim      }
1772285242Sachim      else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
1773285242Sachim      {
1774285242Sachim        TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
1775285242Sachim      }
1776285242Sachim      else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
1777285242Sachim                (ataStatus & DF_ATA_STATUS_MASK)
1778285242Sachim                )
1779285242Sachim      {
1780285242Sachim        TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, FAILED, error status\n"));
1781285242Sachim      }
1782285242Sachim
1783285242Sachim
1784285242Sachim      /* Process abort case */
1785285242Sachim      if (agIOStatus == OSSA_IO_ABORTED)
1786285242Sachim      {
1787285242Sachim        satProcessAbort(tiRoot,
1788285242Sachim                        tiOrgIORequest,
1789285242Sachim                        satOrgIOContext
1790285242Sachim                        );
1791285242Sachim
1792285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1793285242Sachim
1794285242Sachim        satFreeIntIoResource( tiRoot,
1795285242Sachim                              satDevData,
1796285242Sachim                              satIntIo);
1797285242Sachim        return;
1798285242Sachim      }
1799285242Sachim
1800285242Sachim      /* for debugging */
1801285242Sachim      switch (hostToDevFis->h.command)
1802285242Sachim      {
1803285242Sachim      case SAT_WRITE_DMA_FUA_EXT:
1804285242Sachim        TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT\n"));
1805285242Sachim        break;
1806285242Sachim      case SAT_WRITE_DMA_EXT:
1807285242Sachim        TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT\n"));
1808285242Sachim        break;
1809285242Sachim      case SAT_WRITE_SECTORS_EXT:
1810285242Sachim        TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT\n"));
1811285242Sachim        break;
1812285242Sachim      case SAT_WRITE_FPDMA_QUEUED:
1813285242Sachim        TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED\n"));
1814285242Sachim        break;
1815285242Sachim      case SAT_READ_VERIFY_SECTORS:
1816285242Sachim        TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS\n"));
1817285242Sachim        break;
1818285242Sachim      case SAT_READ_VERIFY_SECTORS_EXT:
1819285242Sachim        TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n"));
1820285242Sachim        break;
1821285242Sachim      default:
1822285242Sachim        TI_DBG1(("satNonChainedWriteNVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command));
1823285242Sachim        break;
1824285242Sachim      }
1825285242Sachim
1826285242Sachim      satSetSensePayload( pSense,
1827285242Sachim                          SCSI_SNSKEY_NO_SENSE,
1828285242Sachim                          0,
1829285242Sachim                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1830285242Sachim                          satOrgIOContext);
1831285242Sachim
1832285242Sachim      ostiInitiatorIOCompleted( tiRoot,
1833285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1834285242Sachim                                tiIOSuccess,
1835285242Sachim                                SCSI_STAT_CHECK_CONDITION,
1836285242Sachim                                satOrgIOContext->pTiSenseData,
1837285242Sachim                                satOrgIOContext->interruptContext );
1838285242Sachim
1839285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1840285242Sachim
1841285242Sachim      satFreeIntIoResource( tiRoot,
1842285242Sachim                            satDevData,
1843285242Sachim                            satIntIo);
1844285242Sachim      return;
1845285242Sachim    } /* end error checking */
1846285242Sachim  }
1847285242Sachim
1848285242Sachim  /* process success from this point on */
1849285242Sachim
1850285242Sachim  switch (hostToDevFis->h.command)
1851285242Sachim  {
1852285242Sachim  case SAT_WRITE_DMA_FUA_EXT:
1853285242Sachim    TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT success\n"));
1854285242Sachim    break;
1855285242Sachim  case SAT_WRITE_DMA_EXT:
1856285242Sachim    TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT success\n"));
1857285242Sachim    break;
1858285242Sachim  case SAT_WRITE_SECTORS_EXT:
1859285242Sachim    TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT succes\n"));
1860285242Sachim
1861285242Sachim    break;
1862285242Sachim  case SAT_WRITE_FPDMA_QUEUED:
1863285242Sachim    TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED succes\n"));
1864285242Sachim    break;
1865285242Sachim  case SAT_READ_VERIFY_SECTORS:
1866285242Sachim    TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS succes\n"));
1867285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1868285242Sachim
1869285242Sachim    /* free */
1870285242Sachim    satFreeIntIoResource( tiRoot,
1871285242Sachim                        satDevData,
1872285242Sachim                        satIntIo);
1873285242Sachim
1874285242Sachim    /* return stat_good */
1875285242Sachim    ostiInitiatorIOCompleted( tiRoot,
1876285242Sachim                              tiOrgIORequest,
1877285242Sachim                              tiIOSuccess,
1878285242Sachim                              SCSI_STAT_GOOD,
1879285242Sachim                              agNULL,
1880285242Sachim                              satOrgIOContext->interruptContext );
1881285242Sachim    return;
1882285242Sachim    break;
1883285242Sachim  case SAT_READ_VERIFY_SECTORS_EXT:
1884285242Sachim    TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT succes\n"));
1885285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1886285242Sachim
1887285242Sachim    /* free */
1888285242Sachim    satFreeIntIoResource( tiRoot,
1889285242Sachim                        satDevData,
1890285242Sachim                        satIntIo);
1891285242Sachim
1892285242Sachim    /* return stat_good */
1893285242Sachim    ostiInitiatorIOCompleted( tiRoot,
1894285242Sachim                              tiOrgIORequest,
1895285242Sachim                              tiIOSuccess,
1896285242Sachim                              SCSI_STAT_GOOD,
1897285242Sachim                              agNULL,
1898285242Sachim                              satOrgIOContext->interruptContext );
1899285242Sachim    return;
1900285242Sachim    break;
1901285242Sachim  default:
1902285242Sachim    TI_DBG1(("satNonChainedWriteNVerifyCB:  error default case command 0x%x success\n", hostToDevFis->h.command));
1903285242Sachim
1904285242Sachim    satSetSensePayload( pSense,
1905285242Sachim                        SCSI_SNSKEY_NO_SENSE,
1906285242Sachim                        0,
1907285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1908285242Sachim                        satOrgIOContext);
1909285242Sachim
1910285242Sachim    ostiInitiatorIOCompleted( tiRoot,
1911285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1912285242Sachim                              tiIOSuccess,
1913285242Sachim                              SCSI_STAT_CHECK_CONDITION,
1914285242Sachim                              satOrgIOContext->pTiSenseData,
1915285242Sachim                              satOrgIOContext->interruptContext );
1916285242Sachim
1917285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1918285242Sachim
1919285242Sachim    satFreeIntIoResource( tiRoot,
1920285242Sachim                          satDevData,
1921285242Sachim                          satIntIo);
1922285242Sachim    return;
1923285242Sachim    break;
1924285242Sachim  }
1925285242Sachim
1926285242Sachim  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1927285242Sachim
1928285242Sachim  /* free */
1929285242Sachim  satFreeIntIoResource( tiRoot,
1930285242Sachim                        satDevData,
1931285242Sachim                        satIntIo);
1932285242Sachim
1933285242Sachim  satNewIntIo = satAllocIntIoResource( tiRoot,
1934285242Sachim                                       tiOrgIORequest,
1935285242Sachim                                       satDevData,
1936285242Sachim                                       0,
1937285242Sachim                                       satNewIntIo);
1938285242Sachim  if (satNewIntIo == agNULL)
1939285242Sachim  {
1940285242Sachim    /* memory allocation failure */
1941285242Sachim    satFreeIntIoResource( tiRoot,
1942285242Sachim                          satDevData,
1943285242Sachim                          satNewIntIo);
1944285242Sachim
1945285242Sachim    satSetSensePayload( pSense,
1946285242Sachim                        SCSI_SNSKEY_NO_SENSE,
1947285242Sachim                        0,
1948285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1949285242Sachim                        satOrgIOContext);
1950285242Sachim
1951285242Sachim    ostiInitiatorIOCompleted( tiRoot,
1952285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1953285242Sachim                              tiIOSuccess,
1954285242Sachim                              SCSI_STAT_CHECK_CONDITION,
1955285242Sachim                              satOrgIOContext->pTiSenseData,
1956285242Sachim                              satOrgIOContext->interruptContext );
1957285242Sachim    TI_DBG1(("satNonChainedWriteNVerifyCB: momory allocation fails\n"));
1958285242Sachim    return;
1959285242Sachim  } /* end memory allocation */
1960285242Sachim
1961285242Sachim  satNewIOContext = satPrepareNewIO(
1962285242Sachim                                    satNewIntIo,
1963285242Sachim                                    tiOrgIORequest,
1964285242Sachim                                    satDevData,
1965285242Sachim                                    scsiCmnd,
1966285242Sachim                                    satOrgIOContext
1967285242Sachim                                    );
1968285242Sachim
1969285242Sachim  /* sends ATA verify command(READ_VERIFY_SECTORS or READ_VERIFY_SECTORS_EXT) */
1970285242Sachim  status = satNonChainedWriteNVerify_Verify(tiRoot,
1971285242Sachim                                             &satNewIntIo->satIntTiIORequest,
1972285242Sachim                                             satNewIOContext->ptiDeviceHandle,
1973285242Sachim                                             tiScsiRequest, /* orginal from OS layer */
1974285242Sachim                                             satNewIOContext
1975285242Sachim                                             );
1976285242Sachim
1977285242Sachim
1978285242Sachim  if (status != tiSuccess)
1979285242Sachim  {
1980285242Sachim    /* sending ATA command fails */
1981285242Sachim    satFreeIntIoResource( tiRoot,
1982285242Sachim                          satDevData,
1983285242Sachim                          satNewIntIo);
1984285242Sachim    satSetSensePayload( pSense,
1985285242Sachim                        SCSI_SNSKEY_NO_SENSE,
1986285242Sachim                        0,
1987285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1988285242Sachim                        satOrgIOContext);
1989285242Sachim
1990285242Sachim    ostiInitiatorIOCompleted( tiRoot,
1991285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1992285242Sachim                              tiIOSuccess,
1993285242Sachim                              SCSI_STAT_CHECK_CONDITION,
1994285242Sachim                              satOrgIOContext->pTiSenseData,
1995285242Sachim                              satOrgIOContext->interruptContext );
1996285242Sachim    TI_DBG1(("satNonChainedWriteNVerifyCB: calling satWriteAndVerify10_1 fails\n"));
1997285242Sachim    return;
1998285242Sachim  } /* end send fails */
1999285242Sachim
2000285242Sachim  return;
2001285242Sachim}
2002285242Sachim
2003285242Sachim
2004285242Sachimvoid satChainedWriteNVerifyCB(
2005285242Sachim                        agsaRoot_t        *agRoot,
2006285242Sachim                        agsaIORequest_t   *agIORequest,
2007285242Sachim                        bit32             agIOStatus,
2008285242Sachim                        agsaFisHeader_t   *agFirstDword,
2009285242Sachim                        bit32             agIOInfoLen,
2010285242Sachim                        void              *agParam,
2011285242Sachim                        void              *ioContext
2012285242Sachim                        )
2013285242Sachim{
2014285242Sachim  /*
2015285242Sachim    send write in loop
2016285242Sachim    then, send verify in loop
2017285242Sachim  */
2018285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
2019285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
2020285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
2021285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2022285242Sachim  tdIORequestBody_t       *tdIORequestBody;
2023285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
2024285242Sachim  satIOContext_t          *satIOContext;
2025285242Sachim  satIOContext_t          *satOrgIOContext;
2026285242Sachim  satIOContext_t          *satNewIOContext;
2027285242Sachim  satInternalIo_t         *satIntIo;
2028285242Sachim  satInternalIo_t         *satNewIntIo = agNULL;
2029285242Sachim  satDeviceData_t         *satDevData;
2030285242Sachim  scsiRspSense_t            *pSense;
2031285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
2032285242Sachim  tiIORequest_t             *tiOrgIORequest;
2033285242Sachim
2034285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
2035285242Sachim  bit32                     ataStatus = 0;
2036285242Sachim  bit32                     dataLength;
2037285242Sachim  bit32                     status = tiError;
2038285242Sachim  agsaFisRegD2HHeader_t     *statDevToHostFisHeader = agNULL;
2039285242Sachim
2040285242Sachim  TI_DBG6(("satChainedWriteNVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
2041285242Sachim           agIORequest, agIOStatus, agIOInfoLen));
2042285242Sachim
2043285242Sachim
2044285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
2045285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
2046285242Sachim  satIntIo               = satIOContext->satIntIoContext;
2047285242Sachim  satDevData             = satIOContext->pSatDevData;
2048285242Sachim  hostToDevFis           = satIOContext->pFis;
2049285242Sachim
2050285242Sachim  if (satIntIo == agNULL)
2051285242Sachim  {
2052285242Sachim    TI_DBG5(("satChainedWriteNVerifyCB: External satInternalIo_t satIntIoContext\n"));
2053285242Sachim    satOrgIOContext = satIOContext;
2054285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
2055285242Sachim    pSense          = satIOContext->pSense;
2056285242Sachim    scsiCmnd        = satIOContext->pScsiCmnd;
2057285242Sachim  }
2058285242Sachim  else
2059285242Sachim  {
2060285242Sachim    TI_DBG5(("satChainedWriteNVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
2061285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
2062285242Sachim    if (satOrgIOContext == agNULL)
2063285242Sachim    {
2064285242Sachim      TI_DBG5(("satChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n"));
2065285242Sachim      return;
2066285242Sachim    }
2067285242Sachim    else
2068285242Sachim    {
2069285242Sachim      TI_DBG5(("satChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n"));
2070285242Sachim    }
2071285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
2072285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
2073285242Sachim
2074285242Sachim    pSense        = satOrgIOContext->pSense;
2075285242Sachim    scsiCmnd      = satOrgIOContext->pScsiCmnd;
2076285242Sachim  }
2077285242Sachim
2078285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
2079285242Sachim  tdIORequestBody->ioStarted = agFALSE;
2080285242Sachim
2081285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
2082285242Sachim  {
2083285242Sachim     TI_DBG1(("satChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
2084285242Sachim     satSetSensePayload( pSense,
2085285242Sachim                        SCSI_SNSKEY_NO_SENSE,
2086285242Sachim                        0,
2087285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
2088285242Sachim                        satOrgIOContext);
2089285242Sachim
2090285242Sachim     ostiInitiatorIOCompleted( tiRoot,
2091285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2092285242Sachim                              tiIOSuccess,
2093285242Sachim                              SCSI_STAT_CHECK_CONDITION,
2094285242Sachim                              satOrgIOContext->pTiSenseData,
2095285242Sachim                              satOrgIOContext->interruptContext );
2096285242Sachim
2097285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2098285242Sachim
2099285242Sachim    satFreeIntIoResource( tiRoot,
2100285242Sachim                          satDevData,
2101285242Sachim                          satIntIo);
2102285242Sachim    return;
2103285242Sachim  }
2104285242Sachim
2105285242Sachim  /*
2106285242Sachim    checking IO status, FIS type and error status
2107285242Sachim  */
2108285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
2109285242Sachim  {
2110285242Sachim    /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read
2111285242Sachim       agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write
2112285242Sachim       first, assumed to be Reg Device to Host FIS
2113285242Sachim       This is OK to just find fis type
2114285242Sachim    */
2115285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
2116285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
2117285242Sachim    /* for debugging */
2118285242Sachim    if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) &&
2119285242Sachim        (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
2120285242Sachim        (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
2121285242Sachim        )
2122285242Sachim    {
2123285242Sachim      TI_DBG1(("satChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n", statDevToHostFisHeader->fisType));
2124285242Sachim    }
2125285242Sachim
2126285242Sachim    /* for debugging */
2127285242Sachim    if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
2128285242Sachim         (ataStatus & DF_ATA_STATUS_MASK)
2129285242Sachim         )
2130285242Sachim    {
2131285242Sachim      TI_DBG1(("satChainedWriteNVerifyCB: FAILED, error status and command 0x%x\n", hostToDevFis->h.command));
2132285242Sachim    }
2133285242Sachim
2134285242Sachim    /* the function below handles abort case */
2135285242Sachim    itdsatDelayedProcessAbnormalCompletion(agRoot,
2136285242Sachim                                           agIORequest,
2137285242Sachim                                           agIOStatus,
2138285242Sachim                                           agFirstDword,
2139285242Sachim                                           agIOInfoLen,
2140285242Sachim                                           agParam,
2141285242Sachim                                           satIOContext);
2142285242Sachim
2143285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2144285242Sachim    satFreeIntIoResource( tiRoot,
2145285242Sachim                          satDevData,
2146285242Sachim                          satIntIo);
2147285242Sachim    return;
2148285242Sachim  } /* end of error */
2149285242Sachim
2150285242Sachim  /* process the success case */
2151285242Sachim  switch (hostToDevFis->h.command)
2152285242Sachim  {
2153285242Sachim  case SAT_WRITE_DMA: /* fall through */
2154285242Sachim  case SAT_WRITE_SECTORS:/* fall through */
2155285242Sachim//  case SAT_WRITE_DMA_FUA_EXT: /* fall through */
2156285242Sachim  case SAT_WRITE_DMA_EXT: /* fall through */
2157285242Sachim  case SAT_WRITE_SECTORS_EXT: /* fall through */
2158285242Sachim  case SAT_WRITE_FPDMA_QUEUED:
2159285242Sachim
2160285242Sachim    TI_DBG5(("satChainedWriteNVerifyCB: WRITE success case\n"));
2161285242Sachim
2162285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2163285242Sachim
2164285242Sachim    /* done with internally genereated SAT_SMART_RETURN_STATUS */
2165285242Sachim    satFreeIntIoResource( tiRoot,
2166285242Sachim                          satDevData,
2167285242Sachim                          satIntIo);
2168285242Sachim    /* let's loop till TL */
2169285242Sachim
2170285242Sachim
2171285242Sachim    (satOrgIOContext->LoopNum)--;
2172285242Sachim
2173285242Sachim    if (satOrgIOContext->superIOFlag)
2174285242Sachim    {
2175285242Sachim      dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2176285242Sachim    }
2177285242Sachim    else
2178285242Sachim    {
2179285242Sachim      dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2180285242Sachim    }
2181285242Sachim
2182285242Sachim    satNewIntIo = satAllocIntIoResource( tiRoot,
2183285242Sachim                                         tiOrgIORequest,
2184285242Sachim                                         satDevData,
2185285242Sachim                                         dataLength,
2186285242Sachim                                         satNewIntIo);
2187285242Sachim    if (satNewIntIo == agNULL)
2188285242Sachim    {
2189285242Sachim      /* memory allocation failure */
2190285242Sachim      satFreeIntIoResource( tiRoot,
2191285242Sachim                            satDevData,
2192285242Sachim                            satNewIntIo);
2193285242Sachim      ostiInitiatorIOCompleted( tiRoot,
2194285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2195285242Sachim                                tiIOFailed,
2196285242Sachim                                tiDetailOtherError,
2197285242Sachim                                agNULL,
2198285242Sachim                                satOrgIOContext->interruptContext );
2199285242Sachim
2200285242Sachim      TI_DBG1(("satChainedWriteNVerifyCB: momory allocation fails\n"));
2201285242Sachim      return;
2202285242Sachim    } /* end of memory allocation failure */
2203285242Sachim
2204285242Sachim    /*
2205285242Sachim     * Need to initialize all the fields within satIOContext
2206285242Sachim     */
2207285242Sachim
2208285242Sachim    satNewIOContext = satPrepareNewIO(
2209285242Sachim                                      satNewIntIo,
2210285242Sachim                                      tiOrgIORequest,
2211285242Sachim                                      satDevData,
2212285242Sachim                                      scsiCmnd,
2213285242Sachim                                      satOrgIOContext
2214285242Sachim                                      );
2215285242Sachim
2216285242Sachim    if (satOrgIOContext->LoopNum == 0)
2217285242Sachim    {
2218285242Sachim      /*
2219285242Sachim        done with write
2220285242Sachim        start with verify
2221285242Sachim      */
2222285242Sachim      satOrgIOContext->LoopNum = satOrgIOContext->LoopNum2;
2223285242Sachim      status = satChainedWriteNVerify_Start_Verify(tiRoot,
2224285242Sachim                                    &satNewIntIo->satIntTiIORequest,
2225285242Sachim                                    satNewIOContext->ptiDeviceHandle,
2226285242Sachim                                    &satNewIntIo->satIntTiScsiXchg,
2227285242Sachim                                    satNewIOContext);
2228285242Sachim    }
2229285242Sachim    else
2230285242Sachim    {
2231285242Sachim      status = satChainedWriteNVerify_Write(tiRoot,
2232285242Sachim                                    &satNewIntIo->satIntTiIORequest,
2233285242Sachim                                    satNewIOContext->ptiDeviceHandle,
2234285242Sachim                                    &satNewIntIo->satIntTiScsiXchg,
2235285242Sachim                                    satNewIOContext);
2236285242Sachim    }
2237285242Sachim
2238285242Sachim    if (status != tiSuccess)
2239285242Sachim    {
2240285242Sachim      satFreeIntIoResource( tiRoot,
2241285242Sachim                            satDevData,
2242285242Sachim                            satNewIntIo);
2243285242Sachim      ostiInitiatorIOCompleted( tiRoot,
2244285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2245285242Sachim                                tiIOFailed,
2246285242Sachim                                tiDetailOtherError,
2247285242Sachim                                agNULL,
2248285242Sachim                                satOrgIOContext->interruptContext );
2249285242Sachim      TI_DBG1(("satChainedWriteNVerifyCB: calling satChainedWriteNVerify_Write fails\n"));
2250285242Sachim      return;
2251285242Sachim    }
2252285242Sachim
2253285242Sachim    break;
2254285242Sachim
2255285242Sachim  case SAT_READ_VERIFY_SECTORS: /* fall through */
2256285242Sachim  case SAT_READ_VERIFY_SECTORS_EXT:
2257285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2258285242Sachim
2259285242Sachim    /* done with internally genereated SAT_SMART_RETURN_STATUS */
2260285242Sachim    satFreeIntIoResource( tiRoot,
2261285242Sachim                          satDevData,
2262285242Sachim                          satIntIo);
2263285242Sachim    /* let's loop till TL */
2264285242Sachim
2265285242Sachim    /* lba = lba + tl
2266285242Sachim       loopnum--;
2267285242Sachim       if (loopnum == 0) done
2268285242Sachim     */
2269285242Sachim    (satOrgIOContext->LoopNum)--;
2270285242Sachim    if (satOrgIOContext->LoopNum == 0)
2271285242Sachim    {
2272285242Sachim      /*
2273285242Sachim        done with write and verify
2274285242Sachim      */
2275285242Sachim      ostiInitiatorIOCompleted( tiRoot,
2276285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2277285242Sachim                                tiIOSuccess,
2278285242Sachim                                SCSI_STAT_GOOD,
2279285242Sachim                                agNULL,
2280285242Sachim                                satOrgIOContext->interruptContext );
2281285242Sachim      return;
2282285242Sachim    }
2283285242Sachim
2284285242Sachim    if (satOrgIOContext->superIOFlag)
2285285242Sachim    {
2286285242Sachim      dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2287285242Sachim    }
2288285242Sachim    else
2289285242Sachim    {
2290285242Sachim      dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2291285242Sachim    }
2292285242Sachim
2293285242Sachim    satNewIntIo = satAllocIntIoResource( tiRoot,
2294285242Sachim                                         tiOrgIORequest,
2295285242Sachim                                         satDevData,
2296285242Sachim                                         dataLength,
2297285242Sachim                                         satNewIntIo);
2298285242Sachim    if (satNewIntIo == agNULL)
2299285242Sachim    {
2300285242Sachim      /* memory allocation failure */
2301285242Sachim      satFreeIntIoResource( tiRoot,
2302285242Sachim                            satDevData,
2303285242Sachim                            satNewIntIo);
2304285242Sachim      ostiInitiatorIOCompleted( tiRoot,
2305285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2306285242Sachim                                tiIOFailed,
2307285242Sachim                                tiDetailOtherError,
2308285242Sachim                                agNULL,
2309285242Sachim                                satOrgIOContext->interruptContext );
2310285242Sachim
2311285242Sachim      TI_DBG1(("satChainedWriteNVerifyCB: momory allocation fails\n"));
2312285242Sachim      return;
2313285242Sachim    } /* end of memory allocation failure */
2314285242Sachim
2315285242Sachim    /*
2316285242Sachim     * Need to initialize all the fields within satIOContext
2317285242Sachim     */
2318285242Sachim
2319285242Sachim    satNewIOContext = satPrepareNewIO(
2320285242Sachim                                      satNewIntIo,
2321285242Sachim                                      tiOrgIORequest,
2322285242Sachim                                      satDevData,
2323285242Sachim                                      scsiCmnd,
2324285242Sachim                                      satOrgIOContext
2325285242Sachim                                      );
2326285242Sachim    status = satChainedWriteNVerify_Verify(tiRoot,
2327285242Sachim                                    &satNewIntIo->satIntTiIORequest,
2328285242Sachim                                    satNewIOContext->ptiDeviceHandle,
2329285242Sachim                                    &satNewIntIo->satIntTiScsiXchg,
2330285242Sachim                                    satNewIOContext);
2331285242Sachim
2332285242Sachim    if (status != tiSuccess)
2333285242Sachim    {
2334285242Sachim      satFreeIntIoResource( tiRoot,
2335285242Sachim                            satDevData,
2336285242Sachim                            satNewIntIo);
2337285242Sachim      ostiInitiatorIOCompleted( tiRoot,
2338285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2339285242Sachim                                tiIOFailed,
2340285242Sachim                                tiDetailOtherError,
2341285242Sachim                                agNULL,
2342285242Sachim                                satOrgIOContext->interruptContext );
2343285242Sachim      TI_DBG1(("satChainedWriteNVerifyCB: calling satChainedWriteNVerify_Verify fails\n"));
2344285242Sachim      return;
2345285242Sachim    }
2346285242Sachim
2347285242Sachim    break;
2348285242Sachim
2349285242Sachim  default:
2350285242Sachim    TI_DBG1(("satChainedWriteNVerifyCB: success but default case command 0x%x\n",hostToDevFis->h.command));
2351285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2352285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2353285242Sachim                              tiIOFailed,
2354285242Sachim                              tiDetailOtherError,
2355285242Sachim                              agNULL,
2356285242Sachim                              satOrgIOContext->interruptContext );
2357285242Sachim
2358285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2359285242Sachim
2360285242Sachim    satFreeIntIoResource( tiRoot,
2361285242Sachim                          satDevData,
2362285242Sachim                          satIntIo);
2363285242Sachim
2364285242Sachim    break;
2365285242Sachim  }
2366285242Sachim
2367285242Sachim
2368285242Sachim  return;
2369285242Sachim}
2370285242Sachim/*****************************************************************************
2371285242Sachim*! \brief  itdsatProcessAbnormalCompletion
2372285242Sachim*
2373285242Sachim*   This routine is called to complete error case for SATA request previously
2374285242Sachim*   issued to the LL Layer in saSATAStart()
2375285242Sachim*
2376285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
2377285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
2378285242Sachim*  \param   agIOStatus:  Status of completed I/O.
2379285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
2380285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
2381285242Sachim*                        length.
2382285242Sachim*  \param   agParam:     Additional info based on status.
2383285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
2384285242Sachim*
2385285242Sachim*  \return: none
2386285242Sachim*
2387285242Sachim*****************************************************************************/
2388285242Sachimvoid  itdsatProcessAbnormalCompletion(
2389285242Sachim                           agsaRoot_t        *agRoot,
2390285242Sachim                           agsaIORequest_t   *agIORequest,
2391285242Sachim                           bit32             agIOStatus,
2392285242Sachim                           agsaFisHeader_t   *agFirstDword,
2393285242Sachim                           bit32             agIOInfoLen,
2394285242Sachim                           void              *agParam,
2395285242Sachim                           satIOContext_t    *satIOContext
2396285242Sachim                           )
2397285242Sachim{
2398285242Sachim
2399285242Sachim  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
2400285242Sachim  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
2401285242Sachim  bit32                interruptContext = osData->IntContext;
2402285242Sachim  tdIORequestBody_t    *tdIORequestBody;
2403285242Sachim  satDeviceData_t      *pSatDevData;
2404285242Sachim  tiDeviceHandle_t     *tiDeviceHandle;
2405285242Sachim  tdsaDeviceData_t     *oneDeviceData = agNULL;
2406285242Sachim  agsaDevHandle_t      *agDevHandle = agNULL;
2407285242Sachim
2408285242Sachim  TI_DBG5(("itdsatProcessAbnormalCompletion: agIORequest=%p agIOStatus=0x%x agIOInfoLen=%d\n",
2409285242Sachim          agIORequest, agIOStatus, agIOInfoLen));
2410285242Sachim
2411285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2412285242Sachim  pSatDevData     = satIOContext->pSatDevData;
2413285242Sachim  tiDeviceHandle  = satIOContext->ptiDeviceHandle;
2414285242Sachim
2415285242Sachim  /* Get into the detail */
2416285242Sachim  switch(agIOStatus)
2417285242Sachim  {
2418285242Sachim  case OSSA_IO_SUCCESS:
2419285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS agIOInfoLen %d calling osSatIOCompleted\n", agIOInfoLen));
2420285242Sachim    /*
2421285242Sachim     * At this point agIOInfoLen should be non-zero and there is valid FIS
2422285242Sachim     * to read. Pass this info to the SAT layer in order to do the ATA status
2423285242Sachim     * to SCSI status translation.
2424285242Sachim     */
2425285242Sachim      osSatIOCompleted( tiRoot,
2426285242Sachim                        tdIORequestBody->tiIORequest,
2427285242Sachim                        agFirstDword,
2428285242Sachim                        agIOInfoLen,
2429285242Sachim                        agParam,
2430285242Sachim                        satIOContext,
2431285242Sachim                        interruptContext);
2432285242Sachim    break;
2433285242Sachim
2434285242Sachim
2435285242Sachim  case OSSA_IO_ABORTED:
2436285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED\n"));
2437285242Sachim
2438285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2439285242Sachim                              tdIORequestBody->tiIORequest,
2440285242Sachim                              tiIOFailed,
2441285242Sachim                              tiDetailAborted,
2442285242Sachim                              agNULL,
2443285242Sachim                              interruptContext);
2444285242Sachim
2445285242Sachim    if ( pSatDevData->satTmTaskTag != agNULL )
2446285242Sachim    {
2447285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: TM callback\n"));
2448285242Sachim      if (tiDeviceHandle == agNULL)
2449285242Sachim      {
2450285242Sachim        TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2451285242Sachim      }
2452285242Sachim      /* TM completed */
2453285242Sachim      ostiInitiatorEvent( tiRoot,
2454285242Sachim                          agNULL,               /* portalContext not used */
2455285242Sachim                          tiDeviceHandle,
2456285242Sachim                          tiIntrEventTypeTaskManagement,
2457285242Sachim                          tiTMOK,
2458285242Sachim                          pSatDevData->satTmTaskTag);
2459285242Sachim      /*
2460285242Sachim       * Reset flag
2461285242Sachim       */
2462285242Sachim      pSatDevData->satTmTaskTag = agNULL;
2463285242Sachim    }
2464285242Sachim
2465285242Sachim    /*
2466285242Sachim     * Check if we are in recovery mode and need to update the recovery flag
2467285242Sachim     */
2468285242Sachim    if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2469285242Sachim        (pSatDevData->satPendingIO == 0 ))
2470285242Sachim    {
2471285242Sachim      pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2472285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: STATE NORMAL.\n"));
2473285242Sachim    }
2474285242Sachim
2475285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2476285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2477285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2478285242Sachim
2479285242Sachim    break;
2480285242Sachim  case OSSA_IO_UNDERFLOW:
2481285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW\n"));
2482285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2483285242Sachim                              tdIORequestBody->tiIORequest,
2484285242Sachim                              tiIOUnderRun,
2485285242Sachim                              agIOInfoLen,
2486285242Sachim                              agNULL,
2487285242Sachim                              interruptContext);
2488285242Sachim    break;
2489285242Sachim
2490285242Sachim
2491285242Sachim  case OSSA_IO_FAILED:
2492285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED\n"));
2493285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2494285242Sachim                              tdIORequestBody->tiIORequest,
2495285242Sachim                              tiIOFailed,
2496285242Sachim                              tiDetailOtherError,
2497285242Sachim                              agNULL,
2498285242Sachim                              interruptContext);
2499285242Sachim    break;
2500285242Sachim
2501285242Sachim  case OSSA_IO_ABORT_RESET:
2502285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET\n"));
2503285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2504285242Sachim                              tdIORequestBody->tiIORequest,
2505285242Sachim                              tiIOFailed,
2506285242Sachim                              tiDetailAbortReset,
2507285242Sachim                              agNULL,
2508285242Sachim                              interruptContext);
2509285242Sachim    /*
2510285242Sachim     * Check if we are in recovery mode and need to update the recovery flag
2511285242Sachim     */
2512285242Sachim    if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2513285242Sachim        (pSatDevData->satPendingIO == 0 ))
2514285242Sachim    {
2515285242Sachim      pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2516285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: STATE NORMAL.\n"));
2517285242Sachim    }
2518285242Sachim
2519285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2520285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2521285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2522285242Sachim
2523285242Sachim    break;
2524285242Sachim
2525285242Sachim
2526285242Sachim  case OSSA_IO_NO_DEVICE:
2527285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE\n"));
2528285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2529285242Sachim                              tdIORequestBody->tiIORequest,
2530285242Sachim                              tiIOFailed,
2531285242Sachim                              tiDetailNoLogin,
2532285242Sachim                              agNULL,
2533285242Sachim                              interruptContext);
2534285242Sachim    break;
2535285242Sachim
2536285242Sachim  case OSSA_IO_PROG_ERROR:
2537285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR\n"));
2538285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2539285242Sachim                              tdIORequestBody->tiIORequest,
2540285242Sachim                              tiIOFailed,
2541285242Sachim                              tiDetailOtherError,
2542285242Sachim                              agNULL,
2543285242Sachim                              interruptContext);
2544285242Sachim    break;
2545285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */
2546285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */
2547285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */
2548285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */
2549285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */
2550285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: /* fall through */
2551285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */
2552285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */
2553285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x\n", agIOStatus));
2554285242Sachim    if (tiDeviceHandle == agNULL)
2555285242Sachim    {
2556285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2557285242Sachim      ostiInitiatorIOCompleted( tiRoot,
2558285242Sachim                                tdIORequestBody->tiIORequest,
2559285242Sachim                                tiIOFailed,
2560285242Sachim                                tiDetailOtherError,
2561285242Sachim                                agNULL,
2562285242Sachim                                interruptContext);
2563285242Sachim      return;
2564285242Sachim    }
2565285242Sachim    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2566285242Sachim    if (oneDeviceData == agNULL)
2567285242Sachim    {
2568285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2569285242Sachim    }
2570285242Sachim    else
2571285242Sachim    {
2572285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2573285242Sachim    }
2574285242Sachim
2575285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2576285242Sachim                              tdIORequestBody->tiIORequest,
2577285242Sachim                              tiIOFailed,
2578285242Sachim                              tiDetailOtherError,
2579285242Sachim                              agNULL,
2580285242Sachim                              interruptContext);
2581285242Sachim    break;
2582285242Sachim
2583285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
2584285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
2585285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2586285242Sachim                              tdIORequestBody->tiIORequest,
2587285242Sachim                              tiIOFailed,
2588285242Sachim                              tiDetailOtherError, //tiDetailNoDeviceError, //tiDetailAborted,
2589285242Sachim                              agNULL,
2590285242Sachim                              interruptContext);
2591285242Sachim    break;
2592285242Sachim
2593285242Sachim  case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */
2594285242Sachim  case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */
2595285242Sachim  case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */
2596285242Sachim  case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */
2597285242Sachim  case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */
2598285242Sachim  case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */
2599285242Sachim  case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */
2600285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x\n", agIOStatus));
2601285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2602285242Sachim                              tdIORequestBody->tiIORequest,
2603285242Sachim                              tiIOFailed,
2604285242Sachim                              tiDetailOtherError,
2605285242Sachim                              agNULL,
2606285242Sachim                              interruptContext);
2607285242Sachim    break;
2608285242Sachim  case OSSA_IO_DS_IN_ERROR:
2609285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR\n"));
2610285242Sachim    if (tiDeviceHandle == agNULL)
2611285242Sachim    {
2612285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2613285242Sachim      ostiInitiatorIOCompleted( tiRoot,
2614285242Sachim                                tdIORequestBody->tiIORequest,
2615285242Sachim                                tiIOFailed,
2616285242Sachim                                tiDetailOtherError,
2617285242Sachim                                agNULL,
2618285242Sachim                                interruptContext);
2619285242Sachim      return;
2620285242Sachim    }
2621285242Sachim    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2622285242Sachim    if (oneDeviceData == agNULL)
2623285242Sachim    {
2624285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2625285242Sachim    }
2626285242Sachim    else
2627285242Sachim    {
2628285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2629285242Sachim    }
2630285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2631285242Sachim                              tdIORequestBody->tiIORequest,
2632285242Sachim                              tiIOFailed,
2633285242Sachim                              tiDetailOtherError,
2634285242Sachim                              agNULL,
2635285242Sachim                              interruptContext);
2636285242Sachim    break;
2637285242Sachim  case OSSA_IO_DS_NON_OPERATIONAL:
2638285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL\n"));
2639285242Sachim    if (tiDeviceHandle == agNULL)
2640285242Sachim    {
2641285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2642285242Sachim      ostiInitiatorIOCompleted( tiRoot,
2643285242Sachim                                tdIORequestBody->tiIORequest,
2644285242Sachim                                tiIOFailed,
2645285242Sachim                                tiDetailOtherError,
2646285242Sachim                                agNULL,
2647285242Sachim                                interruptContext);
2648285242Sachim      return;
2649285242Sachim    }
2650285242Sachim    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2651285242Sachim    if (oneDeviceData == agNULL)
2652285242Sachim    {
2653285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2654285242Sachim    }
2655285242Sachim    else
2656285242Sachim    {
2657285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2658285242Sachim      agDevHandle = oneDeviceData->agDevHandle;
2659285242Sachim      if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
2660285242Sachim          oneDeviceData->tdPortContext != agNULL )
2661285242Sachim      {
2662285242Sachim        saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
2663285242Sachim      }
2664285242Sachim    }
2665285242Sachim
2666285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2667285242Sachim                              tdIORequestBody->tiIORequest,
2668285242Sachim                              tiIOFailed,
2669285242Sachim                              tiDetailOtherError,
2670285242Sachim                              agNULL,
2671285242Sachim                              interruptContext);
2672285242Sachim    break;
2673285242Sachim  case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */
2674285242Sachim  case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
2675285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x\n", agIOStatus));
2676285242Sachim    itdsatEncryptionHandler(agRoot,
2677285242Sachim                            agIORequest,
2678285242Sachim                            agIOStatus,
2679285242Sachim                            agIOInfoLen,
2680285242Sachim                            agParam,
2681285242Sachim                            0);
2682285242Sachim    break;
2683285242Sachim  case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */
2684285242Sachim  case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */
2685285242Sachim  case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
2686285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x\n", agIOStatus));
2687285242Sachim    itdsatDifHandler(agRoot,
2688285242Sachim                     agIORequest,
2689285242Sachim                     agIOStatus,
2690285242Sachim                     agIOInfoLen,
2691285242Sachim                     agParam,
2692285242Sachim                     0);
2693285242Sachim    break;
2694285242Sachim  default:
2695285242Sachim    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2696285242Sachim    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = unknown 0x%x\n", agIOStatus));
2697285242Sachim    if (oneDeviceData != agNULL)
2698285242Sachim    {
2699285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2700285242Sachim    }
2701285242Sachim    else
2702285242Sachim    {
2703285242Sachim      TI_DBG1(("itdsatProcessAbnormalCompletion: oneDeviceData is NULL\n"));
2704285242Sachim    }
2705285242Sachim
2706285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2707285242Sachim                              tdIORequestBody->tiIORequest,
2708285242Sachim                              tiIOFailed,
2709285242Sachim                              tiDetailOtherError,
2710285242Sachim                              agNULL,
2711285242Sachim                              interruptContext);
2712285242Sachim    break;
2713285242Sachim
2714285242Sachim  } /* switch */
2715285242Sachim}
2716285242Sachim
2717285242Sachim
2718285242Sachim/*****************************************************************************
2719285242Sachim*! \brief  itdsatDelayedProcessAbnormalCompletion
2720285242Sachim*
2721285242Sachim*   This routine is called to complete error case for SATA request previously
2722285242Sachim*   issued to the LL Layer in saSATAStart().
2723285242Sachim*   This is used when command is chained.
2724285242Sachim*
2725285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
2726285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
2727285242Sachim*  \param   agIOStatus:  Status of completed I/O.
2728285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
2729285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
2730285242Sachim*                        length.
2731285242Sachim*  \param   agParam:     Additional info based on status.
2732285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
2733285242Sachim*
2734285242Sachim*  \return: none
2735285242Sachim*
2736285242Sachim*****************************************************************************/
2737285242Sachimvoid  itdsatDelayedProcessAbnormalCompletion(
2738285242Sachim                           agsaRoot_t        *agRoot,
2739285242Sachim                           agsaIORequest_t   *agIORequest,
2740285242Sachim                           bit32             agIOStatus,
2741285242Sachim                           agsaFisHeader_t   *agFirstDword,
2742285242Sachim                           bit32             agIOInfoLen,
2743285242Sachim                           void              *agParam,
2744285242Sachim                           satIOContext_t    *satIOContext
2745285242Sachim                           )
2746285242Sachim{
2747285242Sachim
2748285242Sachim  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
2749285242Sachim  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
2750285242Sachim  bit32                interruptContext = osData->IntContext;
2751285242Sachim  tdIORequestBody_t    *tdIORequestBody;
2752285242Sachim  satDeviceData_t      *pSatDevData;
2753285242Sachim  tiDeviceHandle_t     *tiDeviceHandle;
2754285242Sachim  tdsaDeviceData_t     *oneDeviceData = agNULL;
2755285242Sachim  agsaDevHandle_t      *agDevHandle = agNULL;
2756285242Sachim
2757285242Sachim  TI_DBG5(("itdsatDelayedProcessAbnormalCompletion: agIORequest=%p agIOStatus=0x%x agIOInfoLen=%d\n",
2758285242Sachim          agIORequest, agIOStatus, agIOInfoLen));
2759285242Sachim
2760285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2761285242Sachim  pSatDevData     = satIOContext->pSatDevData;
2762285242Sachim  tiDeviceHandle  = satIOContext->ptiDeviceHandle;
2763285242Sachim
2764285242Sachim  /* Get into the detail */
2765285242Sachim  switch(agIOStatus)
2766285242Sachim  {
2767285242Sachim  case OSSA_IO_SUCCESS:
2768285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS calling osSatIOCompleted\n"));
2769285242Sachim    /* do nothing */
2770285242Sachim    break;
2771285242Sachim
2772285242Sachim
2773285242Sachim  case OSSA_IO_ABORTED:
2774285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED\n"));
2775285242Sachim
2776285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2777285242Sachim                              tdIORequestBody->tiIORequest,
2778285242Sachim                              tiIOFailed,
2779285242Sachim                              tiDetailAborted,
2780285242Sachim                              agNULL,
2781285242Sachim                              interruptContext);
2782285242Sachim
2783285242Sachim    if ( pSatDevData->satTmTaskTag != agNULL )
2784285242Sachim    {
2785285242Sachim      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: TM callback\n"));
2786285242Sachim      if (tiDeviceHandle == agNULL)
2787285242Sachim      {
2788285242Sachim        TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2789285242Sachim      }
2790285242Sachim      /* TM completed */
2791285242Sachim      ostiInitiatorEvent( tiRoot,
2792285242Sachim                          agNULL,               /* portalContext not used */
2793285242Sachim                          tiDeviceHandle,
2794285242Sachim                          tiIntrEventTypeTaskManagement,
2795285242Sachim                          tiTMOK,
2796285242Sachim                          pSatDevData->satTmTaskTag);
2797285242Sachim      /*
2798285242Sachim       * Reset flag
2799285242Sachim       */
2800285242Sachim      pSatDevData->satTmTaskTag = agNULL;
2801285242Sachim    }
2802285242Sachim
2803285242Sachim    /*
2804285242Sachim     * Check if we are in recovery mode and need to update the recovery flag
2805285242Sachim     */
2806285242Sachim    if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2807285242Sachim        (pSatDevData->satPendingIO == 0 ))
2808285242Sachim    {
2809285242Sachim      pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2810285242Sachim      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: STATE NORMAL.\n"));
2811285242Sachim    }
2812285242Sachim
2813285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2814285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2815285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2816285242Sachim
2817285242Sachim    break;
2818285242Sachim  case OSSA_IO_UNDERFLOW:
2819285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW\n"));
2820285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2821285242Sachim                              tdIORequestBody->tiIORequest,
2822285242Sachim                              tiIOUnderRun,
2823285242Sachim                              agIOInfoLen,
2824285242Sachim                              agNULL,
2825285242Sachim                              interruptContext);
2826285242Sachim    break;
2827285242Sachim
2828285242Sachim
2829285242Sachim  case OSSA_IO_FAILED:
2830285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED\n"));
2831285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2832285242Sachim                              tdIORequestBody->tiIORequest,
2833285242Sachim                              tiIOFailed,
2834285242Sachim                              tiDetailOtherError,
2835285242Sachim                              agNULL,
2836285242Sachim                              interruptContext);
2837285242Sachim    break;
2838285242Sachim
2839285242Sachim  case OSSA_IO_ABORT_RESET:
2840285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET\n"));
2841285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2842285242Sachim                              tdIORequestBody->tiIORequest,
2843285242Sachim                              tiIOFailed,
2844285242Sachim                              tiDetailAbortReset,
2845285242Sachim                              agNULL,
2846285242Sachim                              interruptContext);
2847285242Sachim    /*
2848285242Sachim     * Check if we are in recovery mode and need to update the recovery flag
2849285242Sachim     */
2850285242Sachim    if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2851285242Sachim        (pSatDevData->satPendingIO == 0 ))
2852285242Sachim    {
2853285242Sachim      pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2854285242Sachim      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: STATE NORMAL.\n"));
2855285242Sachim    }
2856285242Sachim
2857285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2858285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2859285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2860285242Sachim
2861285242Sachim    break;
2862285242Sachim
2863285242Sachim
2864285242Sachim  case OSSA_IO_NO_DEVICE:
2865285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE\n"));
2866285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2867285242Sachim                              tdIORequestBody->tiIORequest,
2868285242Sachim                              tiIOFailed,
2869285242Sachim                              tiDetailNoLogin,
2870285242Sachim                              agNULL,
2871285242Sachim                              interruptContext);
2872285242Sachim    break;
2873285242Sachim
2874285242Sachim  case OSSA_IO_PROG_ERROR:
2875285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR\n"));
2876285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2877285242Sachim                              tdIORequestBody->tiIORequest,
2878285242Sachim                              tiIOFailed,
2879285242Sachim                              tiDetailOtherError,
2880285242Sachim                              agNULL,
2881285242Sachim                              interruptContext);
2882285242Sachim    break;
2883285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */
2884285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */
2885285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */
2886285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */
2887285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */
2888285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: /* fall through */
2889285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */
2890285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */
2891285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x\n", agIOStatus));
2892285242Sachim    if (tiDeviceHandle == agNULL)
2893285242Sachim    {
2894285242Sachim      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2895285242Sachim      ostiInitiatorIOCompleted( tiRoot,
2896285242Sachim                                tdIORequestBody->tiIORequest,
2897285242Sachim                                tiIOFailed,
2898285242Sachim                                tiDetailOtherError,
2899285242Sachim                                agNULL,
2900285242Sachim                                interruptContext);
2901285242Sachim      return;
2902285242Sachim    }
2903285242Sachim    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2904285242Sachim    if (oneDeviceData == agNULL)
2905285242Sachim    {
2906285242Sachim      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2907285242Sachim    }
2908285242Sachim    else
2909285242Sachim    {
2910285242Sachim      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2911285242Sachim    }
2912285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2913285242Sachim                              tdIORequestBody->tiIORequest,
2914285242Sachim                              tiIOFailed,
2915285242Sachim                              tiDetailOtherError,
2916285242Sachim                              agNULL,
2917285242Sachim                              interruptContext);
2918285242Sachim    break;
2919285242Sachim
2920285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
2921285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
2922285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2923285242Sachim                              tdIORequestBody->tiIORequest,
2924285242Sachim                              tiIOFailed,
2925285242Sachim                              tiDetailOtherError, //tiDetailNoDeviceError, //tiDetailAborted,
2926285242Sachim                              agNULL,
2927285242Sachim                              interruptContext);
2928285242Sachim    break;
2929285242Sachim
2930285242Sachim  case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */
2931285242Sachim  case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */
2932285242Sachim  case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */
2933285242Sachim  case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */
2934285242Sachim  case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */
2935285242Sachim  case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */
2936285242Sachim  case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */
2937285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x\n", agIOStatus));
2938285242Sachim
2939285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2940285242Sachim                              tdIORequestBody->tiIORequest,
2941285242Sachim                              tiIOFailed,
2942285242Sachim                              tiDetailOtherError,
2943285242Sachim                              agNULL,
2944285242Sachim                              interruptContext);
2945285242Sachim    break;
2946285242Sachim  case OSSA_IO_DS_IN_ERROR:
2947285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR\n"));
2948285242Sachim    if (tiDeviceHandle == agNULL)
2949285242Sachim    {
2950285242Sachim      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2951285242Sachim      ostiInitiatorIOCompleted( tiRoot,
2952285242Sachim                                tdIORequestBody->tiIORequest,
2953285242Sachim                                tiIOFailed,
2954285242Sachim                                tiDetailOtherError,
2955285242Sachim                                agNULL,
2956285242Sachim                                interruptContext);
2957285242Sachim      return;
2958285242Sachim    }
2959285242Sachim    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2960285242Sachim    if (oneDeviceData == agNULL)
2961285242Sachim    {
2962285242Sachim      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2963285242Sachim    }
2964285242Sachim    else
2965285242Sachim    {
2966285242Sachim      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2967285242Sachim    }
2968285242Sachim    ostiInitiatorIOCompleted( tiRoot,
2969285242Sachim                              tdIORequestBody->tiIORequest,
2970285242Sachim                              tiIOFailed,
2971285242Sachim                              tiDetailOtherError,
2972285242Sachim                              agNULL,
2973285242Sachim                              interruptContext);
2974285242Sachim    break;
2975285242Sachim  case OSSA_IO_DS_NON_OPERATIONAL:
2976285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL\n"));
2977285242Sachim    if (tiDeviceHandle == agNULL)
2978285242Sachim    {
2979285242Sachim      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2980285242Sachim      ostiInitiatorIOCompleted( tiRoot,
2981285242Sachim                                tdIORequestBody->tiIORequest,
2982285242Sachim                                tiIOFailed,
2983285242Sachim                                tiDetailOtherError,
2984285242Sachim                                agNULL,
2985285242Sachim                                interruptContext);
2986285242Sachim      return;
2987285242Sachim    }
2988285242Sachim    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2989285242Sachim    if (oneDeviceData == agNULL)
2990285242Sachim    {
2991285242Sachim      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2992285242Sachim    }
2993285242Sachim    else
2994285242Sachim    {
2995285242Sachim      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2996285242Sachim      agDevHandle = oneDeviceData->agDevHandle;
2997285242Sachim      if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
2998285242Sachim          oneDeviceData->tdPortContext != agNULL )
2999285242Sachim      {
3000285242Sachim        saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
3001285242Sachim      }
3002285242Sachim    }
3003285242Sachim    ostiInitiatorIOCompleted( tiRoot,
3004285242Sachim                              tdIORequestBody->tiIORequest,
3005285242Sachim                              tiIOFailed,
3006285242Sachim                              tiDetailOtherError,
3007285242Sachim                              agNULL,
3008285242Sachim                              interruptContext);
3009285242Sachim    break;
3010285242Sachim  case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */
3011285242Sachim  case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
3012285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x\n", agIOStatus));
3013285242Sachim    itdsatEncryptionHandler(agRoot,
3014285242Sachim                            agIORequest,
3015285242Sachim                            agIOStatus,
3016285242Sachim                            agIOInfoLen,
3017285242Sachim                            agParam,
3018285242Sachim                            0);
3019285242Sachim      break;
3020285242Sachim  case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */
3021285242Sachim  case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */
3022285242Sachim  case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
3023285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x\n", agIOStatus));
3024285242Sachim    itdsatDifHandler(agRoot,
3025285242Sachim                     agIORequest,
3026285242Sachim                     agIOStatus,
3027285242Sachim                     agIOInfoLen,
3028285242Sachim                     agParam,
3029285242Sachim                     0);
3030285242Sachim      break;
3031285242Sachim  default:
3032285242Sachim    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = unknown\n"));
3033285242Sachim    ostiInitiatorIOCompleted( tiRoot,
3034285242Sachim                              tdIORequestBody->tiIORequest,
3035285242Sachim                              tiIOFailed,
3036285242Sachim                              tiDetailOtherError,
3037285242Sachim                              agNULL,
3038285242Sachim                              interruptContext);
3039285242Sachim    break;
3040285242Sachim
3041285242Sachim  } /* switch */
3042285242Sachim}
3043285242Sachim
3044285242Sachim/*****************************************************************************
3045285242Sachim*! \brief itdsatEncryptionHandler
3046285242Sachim*
3047285242Sachim*  Purpose:  This function processes I/Os completed and returned by SATA lower
3048285242Sachim*            layer with any encryption specific agIOStatus.
3049285242Sachim*
3050285242Sachim*  \param  agRoot:            pointer to port instance
3051285242Sachim*  \param  agIORequest:       pointer to I/O request
3052285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3053285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3054285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3055285242Sachim*                             of abort request
3056285242Sachim*  \return: None
3057285242Sachim*
3058285242Sachim*
3059285242Sachim*****************************************************************************/
3060285242SachimosGLOBAL void
3061285242SachimitdsatEncryptionHandler(
3062285242Sachim                       agsaRoot_t              *agRoot,
3063285242Sachim                       agsaIORequest_t         *agIORequest,
3064285242Sachim                       bit32                   agIOStatus,
3065285242Sachim                       bit32                   agIOInfoLen,
3066285242Sachim                       void                    *agParam,
3067285242Sachim                       bit32                   agOtherInfo
3068285242Sachim                       )
3069285242Sachim{
3070285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3071285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3072285242Sachim  bit32                  intContext = osData->IntContext;
3073285242Sachim  bit32                  errorDetail = tiDetailOtherError;
3074285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3075285242Sachim  TI_DBG1(("itdsatEncryptionHandler: start\n"));
3076285242Sachim  TI_DBG1(("itdsatEncryptionHandler: agIOStatus 0x%x\n", agIOStatus));
3077285242Sachim
3078285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3079285242Sachim
3080285242Sachim  switch (agIOStatus)
3081285242Sachim  {
3082285242Sachim  case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
3083285242Sachim      TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS\n"));
3084285242Sachim      errorDetail = tiDetailDekKeyCacheMiss;
3085285242Sachim      break;
3086285242Sachim  case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID:
3087285242Sachim      TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID\n"));
3088285242Sachim      errorDetail = tiDetailCipherModeInvalid;
3089285242Sachim      break;
3090285242Sachim  case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH:
3091285242Sachim      TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH\n"));
3092285242Sachim      errorDetail = tiDetailDekIVMismatch;
3093285242Sachim      break;
3094285242Sachim  case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR:
3095285242Sachim      TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR\n"));
3096285242Sachim      errorDetail = tiDetailDekRamInterfaceError;
3097285242Sachim      break;
3098285242Sachim  default:
3099285242Sachim      TI_DBG1(("itdsatEncryptionHandler: other error!!! 0x%x\n", agIOStatus));
3100285242Sachim      errorDetail = tiDetailOtherError;
3101285242Sachim      break;
3102285242Sachim  }
3103285242Sachim
3104285242Sachim  ostiInitiatorIOCompleted (
3105285242Sachim                            tiRoot,
3106285242Sachim                            tdIORequestBody->tiIORequest,
3107285242Sachim                            tiIOEncryptError,
3108285242Sachim                            errorDetail,
3109285242Sachim                            agNULL,
3110285242Sachim                            intContext
3111285242Sachim                            );
3112285242Sachim  return;
3113285242Sachim}
3114285242Sachim
3115285242Sachim/*****************************************************************************
3116285242Sachim*! \brief itdsatDifHandler
3117285242Sachim*
3118285242Sachim*  Purpose:  This function processes I/Os completed and returned by SATA lower
3119285242Sachim*            layer with any DIF specific agIOStatus.
3120285242Sachim*
3121285242Sachim*  \param  agRoot:            pointer to port instance
3122285242Sachim*  \param  agIORequest:       pointer to I/O request
3123285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3124285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3125285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3126285242Sachim*                             of abort request
3127285242Sachim*  \return: None
3128285242Sachim*
3129285242Sachim*
3130285242Sachim*****************************************************************************/
3131285242SachimosGLOBAL void
3132285242SachimitdsatDifHandler(
3133285242Sachim                 agsaRoot_t              *agRoot,
3134285242Sachim                 agsaIORequest_t         *agIORequest,
3135285242Sachim                 bit32                   agIOStatus,
3136285242Sachim                 bit32                   agIOInfoLen,
3137285242Sachim                 void                    *agParam,
3138285242Sachim                 bit32                   agOtherInfo
3139285242Sachim                )
3140285242Sachim{
3141285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3142285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3143285242Sachim  bit32                  intContext = osData->IntContext;
3144285242Sachim  bit32                  errorDetail = tiDetailOtherError;
3145285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3146285242Sachim#ifdef  TD_DEBUG_ENABLE
3147285242Sachim  agsaDifDetails_t       *DifDetail;
3148285242Sachim#endif
3149285242Sachim
3150285242Sachim  TI_DBG2(("itdsatDifHandler: start\n"));
3151285242Sachim  TI_DBG2(("itdsatDifHandler: agIOStatus 0x%x\n", agIOStatus));
3152285242Sachim
3153285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3154285242Sachim#ifdef  TD_DEBUG_ENABLE
3155285242Sachim  DifDetail = (agsaDifDetails_t *)agParam;
3156285242Sachim#endif
3157285242Sachim  switch (agIOStatus)
3158285242Sachim  {
3159285242Sachim  case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
3160285242Sachim      TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH\n"));
3161285242Sachim      errorDetail = tiDetailDifAppTagMismatch;
3162285242Sachim      break;
3163285242Sachim  case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
3164285242Sachim      TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH\n"));
3165285242Sachim      errorDetail = tiDetailDifRefTagMismatch;
3166285242Sachim      break;
3167285242Sachim  case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
3168285242Sachim      TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH\n"));
3169285242Sachim      errorDetail = tiDetailDifCrcMismatch;
3170285242Sachim      break;
3171285242Sachim  default:
3172285242Sachim      TI_DBG1(("itdsatDifHandler: other error!!! 0x%x\n", agIOStatus));
3173285242Sachim      errorDetail = tiDetailOtherError;
3174285242Sachim      break;
3175285242Sachim  }
3176285242Sachim
3177285242Sachim  TI_DBG1(("smsatDifHandler: DIF detail UpperLBA 0x%08x LowerLBA 0x%08x\n", DifDetail->UpperLBA, DifDetail->LowerLBA));
3178285242Sachim
3179285242Sachim  ostiInitiatorIOCompleted (
3180285242Sachim                            tiRoot,
3181285242Sachim                            tdIORequestBody->tiIORequest,
3182285242Sachim                            tiIODifError,
3183285242Sachim                            errorDetail,
3184285242Sachim                            agNULL,
3185285242Sachim                            intContext
3186285242Sachim                            );
3187285242Sachim  return;
3188285242Sachim}
3189285242Sachim
3190285242Sachim/*****************************************************************************/
3191285242Sachim/*! \brief satProcessAbort
3192285242Sachim *
3193285242Sachim *  This function processes abort.
3194285242Sachim *
3195285242Sachim *  \param   tiRoot:           Pointer to TISA initiator driver/port instance.
3196285242Sachim *  \param   tiIORequest:      Pointer to TISA I/O request context for this I/O.
3197285242Sachim *  \param   satIOContext_t:   Pointer to the SAT IO Context
3198285242Sachim *
3199285242Sachim *  \return
3200285242Sachim *           None
3201285242Sachim */
3202285242Sachim/*****************************************************************************/
3203285242Sachimvoid  satProcessAbort(
3204285242Sachim                      tiRoot_t          *tiRoot,
3205285242Sachim                      tiIORequest_t     *tiIORequest,
3206285242Sachim                      satIOContext_t    *satIOContext
3207285242Sachim                      )
3208285242Sachim{
3209285242Sachim  satDeviceData_t           *pSatDevData;
3210285242Sachim  //tiDeviceHandle_t          *tiDeviceHandle;
3211285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
3212285242Sachim
3213285242Sachim  TI_DBG5(("satProcessAbort: start\n"));
3214285242Sachim
3215285242Sachim  pSatDevData     = satIOContext->pSatDevData;
3216285242Sachim  //tiDeviceHandle  = satIOContext->ptiDeviceHandle;
3217285242Sachim  hostToDevFis    = satIOContext->pFis;
3218285242Sachim  if ( (hostToDevFis->h.command == SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE) &&
3219285242Sachim       (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
3220285242Sachim      )
3221285242Sachim  {
3222285242Sachim    /* no completion for send diagnotic in background. It is done in satSendDiagnostic() */
3223285242Sachim    ostiInitiatorIOCompleted( tiRoot,
3224285242Sachim                              tiIORequest,
3225285242Sachim                              tiIOFailed,
3226285242Sachim                              tiDetailAborted,
3227285242Sachim                              agNULL,
3228285242Sachim                              satIOContext->interruptContext);
3229285242Sachim  }
3230285242Sachim
3231285242Sachim  if ( pSatDevData->satTmTaskTag != agNULL )
3232285242Sachim  {
3233285242Sachim    TI_DBG1(("satProcessAbort: TM callback\n"));
3234285242Sachim    /*
3235285242Sachim     * Reset flag
3236285242Sachim     */
3237285242Sachim    pSatDevData->satTmTaskTag = agNULL;
3238285242Sachim  }
3239285242Sachim
3240285242Sachim  /*
3241285242Sachim   * Check if we are in recovery mode and need to update the recovery flag
3242285242Sachim   */
3243285242Sachim  if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
3244285242Sachim      (pSatDevData->satPendingIO == 0 ))
3245285242Sachim  {
3246285242Sachim    pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
3247285242Sachim    TI_DBG1(("satProcessAbort: STATE NORMAL.\n"));
3248285242Sachim  }
3249285242Sachim  TI_DBG1(("satProcessAbort: satDriveState %d\n", pSatDevData->satDriveState));
3250285242Sachim  TI_DBG1(("satProcessAbort: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
3251285242Sachim  TI_DBG1(("satProcessAbort: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
3252285242Sachim
3253285242Sachim
3254285242Sachim
3255285242Sachim  return;
3256285242Sachim}
3257285242Sachim
3258285242Sachim/*****************************************************************************
3259285242Sachim*! \brief  satNonDataIOCB
3260285242Sachim*
3261285242Sachim*   This routine is a callback function called from ossaSATACompleted().
3262285242Sachim*   This CB routine deals with non-data I/O SATA request.
3263285242Sachim*
3264285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
3265285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
3266285242Sachim*  \param   agIOStatus:  Status of completed I/O.
3267285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
3268285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
3269285242Sachim*                        length.
3270285242Sachim*  \param   agParam:     Additional info based on status.
3271285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
3272285242Sachim*
3273285242Sachim*  \return: none
3274285242Sachim*
3275285242Sachim*****************************************************************************/
3276285242Sachimvoid satNonDataIOCB(
3277285242Sachim                    agsaRoot_t        *agRoot,
3278285242Sachim                    agsaIORequest_t   *agIORequest,
3279285242Sachim                    bit32             agIOStatus,
3280285242Sachim                    agsaFisHeader_t   *agFirstDword,
3281285242Sachim                    bit32             agIOInfoLen,
3282285242Sachim                    void              *agParam,
3283285242Sachim                    void              *ioContext
3284285242Sachim                    )
3285285242Sachim{
3286285242Sachim
3287285242Sachim  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
3288285242Sachim  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
3289285242Sachim  tdsaRoot_t           *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
3290285242Sachim  tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3291285242Sachim  tdIORequestBody_t    *tdIORequestBody;
3292285242Sachim  bit32                interruptContext = osData->IntContext;
3293285242Sachim  satIOContext_t       *satIOContext;
3294285242Sachim
3295285242Sachim  TI_DBG5(("satNonDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
3296285242Sachim    agIORequest, agIOStatus, agIOInfoLen));
3297285242Sachim
3298285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3299285242Sachim  satIOContext    = (satIOContext_t *) ioContext;
3300285242Sachim  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
3301285242Sachim
3302285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
3303285242Sachim  tdIORequestBody->ioStarted = agFALSE;
3304285242Sachim
3305285242Sachim  /* Process completion */
3306285242Sachim  if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen==0))
3307285242Sachim  {
3308285242Sachim    /*
3309285242Sachim     * !!! We expect that agIOInfoLen should be non-zero !!!!.
3310285242Sachim     * Now call the OS-App Specific layer about this unexpected completion.
3311285242Sachim     */
3312285242Sachim    TI_DBG1(("satNonDataIOCB: *** ERROR***  agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
3313285242Sachim      agIORequest, agIOStatus, agIOInfoLen));
3314285242Sachim
3315285242Sachim    ostiInitiatorIOCompleted( tiRoot,
3316285242Sachim                              tdIORequestBody->tiIORequest,
3317285242Sachim                              tiIOFailed,
3318285242Sachim                              tiDetailOtherError,
3319285242Sachim                              agNULL,
3320285242Sachim                              interruptContext);
3321285242Sachim  }
3322285242Sachim  else
3323285242Sachim  {
3324285242Sachim    /* More checking needed, for non-data IO this should be the normal case */
3325285242Sachim    itdsatProcessAbnormalCompletion( agRoot,
3326285242Sachim                                     agIORequest,
3327285242Sachim                                     agIOStatus,
3328285242Sachim                                     agFirstDword,
3329285242Sachim                                     agIOInfoLen,
3330285242Sachim                                     agParam,
3331285242Sachim                                     satIOContext);
3332285242Sachim  }
3333285242Sachim
3334285242Sachim}
3335285242Sachim
3336285242Sachim/*****************************************************************************
3337285242Sachim*! \brief  tdssSATADeviceTypeDecode
3338285242Sachim*
3339285242Sachim*   This routine decodes ATA signature
3340285242Sachim*
3341285242Sachim*  \param   pSignature:       ATA signature
3342285242Sachim*
3343285242Sachim*
3344285242Sachim*  \return:
3345285242Sachim*          TRUE if ATA signature
3346285242Sachim*          FALSE otherwise
3347285242Sachim*
3348285242Sachim*****************************************************************************/
3349285242Sachim/*
3350285242Sachim  ATA p65
3351285242Sachim  PM p65
3352285242Sachim  SATAII p79, p80
3353285242Sachim */
3354285242SachimGLOBAL bit32
3355285242SachimtdssSATADeviceTypeDecode(
3356285242Sachim                         bit8  *pSignature
3357285242Sachim                         )
3358285242Sachim{
3359285242Sachim  bit32 deviceType = UNKNOWN_DEVICE;
3360285242Sachim
3361285242Sachim  if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3362285242Sachim       && (pSignature)[2] == 0x00 && (pSignature)[3] == 0x00
3363285242Sachim       && (pSignature)[4] == 0xA0 )    /* this is the signature of a Hitachi SATA HDD*/
3364285242Sachim  {
3365285242Sachim    deviceType = SATA_ATA_DEVICE;
3366285242Sachim  }
3367285242Sachim  else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3368285242Sachim      && (pSignature)[2] == 0x00 && (pSignature)[3] == 0x00
3369285242Sachim      && (pSignature)[4] == 0x00 )
3370285242Sachim  {
3371285242Sachim    deviceType = SATA_ATA_DEVICE;
3372285242Sachim  }
3373285242Sachim  else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3374285242Sachim          && (pSignature)[2] == 0x14 && (pSignature)[3] == 0xEB
3375285242Sachim          && ( (pSignature)[4] == 0x00 || (pSignature)[4] == 0x10) )
3376285242Sachim  {
3377285242Sachim    deviceType = SATA_ATAPI_DEVICE;
3378285242Sachim  }
3379285242Sachim  else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3380285242Sachim          && (pSignature)[2] == 0x69 && (pSignature)[3] == 0x96
3381285242Sachim          && (pSignature)[4] == 0x00 )
3382285242Sachim  {
3383285242Sachim    deviceType = SATA_PM_DEVICE;
3384285242Sachim  }
3385285242Sachim  else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3386285242Sachim          && (pSignature)[2] == 0x3C && (pSignature)[3] == 0xC3
3387285242Sachim          && (pSignature)[4] == 0x00 )
3388285242Sachim  {
3389285242Sachim    deviceType = SATA_SEMB_DEVICE;
3390285242Sachim  }
3391285242Sachim  else if ( (pSignature)[0] == 0xFF && (pSignature)[1] == 0xFF
3392285242Sachim          && (pSignature)[2] == 0xFF && (pSignature)[3] == 0xFF
3393285242Sachim          && (pSignature)[4] == 0xFF )
3394285242Sachim  {
3395285242Sachim    deviceType = SATA_SEMB_WO_SEP_DEVICE;
3396285242Sachim  }
3397285242Sachim
3398285242Sachim  return deviceType;
3399285242Sachim}
3400285242Sachim
3401285242Sachim/*****************************************************************************
3402285242Sachim*! \brief ossaDiscoverSataCB
3403285242Sachim*
3404285242Sachim*  Purpose:  This function is called by lower layer to inform TD layer of
3405285242Sachim*            STP/SATA discovery results
3406285242Sachim*
3407285242Sachim*
3408285242Sachim*  \param   agRoot         Pointer to chip/driver Instance.
3409285242Sachim*  \param   agPortContext  Pointer to the port context of TD and Lower layer
3410285242Sachim*  \param   event          event type
3411285242Sachim*  \param   pParm1         Pointer to data associated with event
3412285242Sachim*  \param   pParm2         Pointer to data associated with event
3413285242Sachim*
3414285242Sachim*  \return: none
3415285242Sachim*
3416285242Sachim*  \note -  For details, refer to SAS/SATA Low-Level API Specification
3417285242Sachim*
3418285242Sachim*****************************************************************************/
3419285242Sachim
3420285242SachimosGLOBAL void ossaDiscoverSataCB( agsaRoot_t        *agRoot,
3421285242Sachim                                  agsaPortContext_t *agPortContext,
3422285242Sachim                                  bit32             event,
3423285242Sachim                                  void              *pParm1,
3424285242Sachim                                  void              *pParm2
3425285242Sachim                                  )
3426285242Sachim{
3427285242Sachim  tdsaRootOsData_t      *osData;
3428285242Sachim  tiRoot_t              *tiRoot;
3429285242Sachim  tdsaPortContext_t     *onePortContext;
3430285242Sachim  tdsaDeviceData_t      *oneDeviceData;
3431285242Sachim  agsaDevHandle_t       *agDevHandle;
3432285242Sachim  agsaSATADeviceInfo_t  *agSATADeviceInfo;
3433285242Sachim  tiPortalContext_t     *tiPortalContext;
3434285242Sachim
3435285242Sachim  bit32                 devicetype = UNKNOWN_DEVICE;
3436285242Sachim
3437285242Sachim  osData          = (tdsaRootOsData_t *)agRoot->osData;
3438285242Sachim  tiRoot          = (tiRoot_t *)osData->tiRoot;
3439285242Sachim
3440285242Sachim  TI_DBG5(("ossaDiscoverSataCB: start\n"));
3441285242Sachim
3442285242Sachim  if (agPortContext == agNULL)
3443285242Sachim  {
3444285242Sachim    TI_DBG1(("ossaDiscoverSataCB: NULL agsaPortContext; wrong\n"));
3445285242Sachim    return;
3446285242Sachim  }
3447285242Sachim
3448285242Sachim  onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
3449285242Sachim  tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext;
3450285242Sachim
3451285242Sachim  switch ( event )
3452285242Sachim  {
3453285242Sachim    case OSSA_DISCOVER_STARTED:
3454285242Sachim    {
3455285242Sachim      TI_DBG5(("ossaDiscoverSataCB: STARTED\n"));
3456285242Sachim      /* Do nothing */
3457285242Sachim      break;
3458285242Sachim    }
3459285242Sachim
3460285242Sachim    case OSSA_DISCOVER_FOUND_DEVICE:
3461285242Sachim    {
3462285242Sachim      TI_DBG5(("ossaDiscoverSataCB: ***** FOUND DEVICE\n"));
3463285242Sachim      agDevHandle      = (agsaDevHandle_t *) pParm1;
3464285242Sachim      agSATADeviceInfo = (agsaSATADeviceInfo_t *) pParm2;
3465285242Sachim
3466285242Sachim      /* parse the device type */
3467285242Sachim      devicetype = tdssSATADeviceTypeDecode(agSATADeviceInfo->signature);
3468285242Sachim
3469285242Sachim
3470285242Sachim      /* for now, TD handles only ATA Device or ATAPI Device */
3471285242Sachim      if (devicetype == SATA_ATA_DEVICE || devicetype == SATA_ATAPI_DEVICE)
3472285242Sachim      {
3473285242Sachim        TI_DBG5(("ossaDiscoverSataCB: ***** adding ....\n"));
3474285242Sachim        /* Add SATA device */
3475285242Sachim        tdssAddSATAToSharedcontext( onePortContext,
3476285242Sachim                                    agRoot,
3477285242Sachim                                    agDevHandle,
3478285242Sachim                                    agSATADeviceInfo,
3479285242Sachim                                    agTRUE,
3480285242Sachim                                    agSATADeviceInfo->stpPhyIdentifier
3481285242Sachim                                    );
3482285242Sachim#ifdef INITIATOR_DRIVER
3483285242Sachim        ostiInitiatorEvent(
3484285242Sachim                           tiRoot,
3485285242Sachim                           tiPortalContext,
3486285242Sachim                           agNULL,
3487285242Sachim                           tiIntrEventTypeDeviceChange,
3488285242Sachim                           tiDeviceArrival,
3489285242Sachim                           agNULL
3490285242Sachim                           );
3491285242Sachim#endif
3492285242Sachim      } /* end of ATA_ATA_DEVICE or ATA_ATAPI_DEVICE */
3493285242Sachim      else
3494285242Sachim      {
3495285242Sachim        TI_DBG5(("ossaDiscoverSataCB: ***** not adding ..... devicetype 0x%x\n", devicetype));
3496285242Sachim      }
3497285242Sachim      break;
3498285242Sachim    }
3499285242Sachim
3500285242Sachim    case OSSA_DISCOVER_REMOVED_DEVICE:
3501285242Sachim    {
3502285242Sachim      TI_DBG1(("ossaDiscoverSataCB: REMOVED_DEVICE\n"));
3503285242Sachim      agDevHandle      = (agsaDevHandle_t *) pParm1;
3504285242Sachim      agSATADeviceInfo = (agsaSATADeviceInfo_t *) pParm2;
3505285242Sachim
3506285242Sachim      oneDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
3507285242Sachim
3508285242Sachim      TI_DBG1(("ossaDiscoverSataCB: signature: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
3509285242Sachim        agSATADeviceInfo->signature[0], agSATADeviceInfo->signature[1],
3510285242Sachim        agSATADeviceInfo->signature[2], agSATADeviceInfo->signature[3],
3511285242Sachim        agSATADeviceInfo->signature[4], agSATADeviceInfo->signature[5],
3512285242Sachim        agSATADeviceInfo->signature[6], agSATADeviceInfo->signature[7] ));
3513285242Sachim
3514285242Sachim      if (oneDeviceData == agNULL)
3515285242Sachim      {
3516285242Sachim        TI_DBG1(("ossaDiscoverSataCB: Wrong. DevHandle->osData is NULL but is being removed\n"));
3517285242Sachim      }
3518285242Sachim      tdssRemoveSATAFromSharedcontext( onePortContext,
3519285242Sachim                                       oneDeviceData,
3520285242Sachim                                       agRoot
3521285242Sachim                                       );
3522285242Sachim      agDevHandle->osData = agNULL;
3523285242Sachim#ifdef INITIATOR_DRIVER
3524285242Sachim      ostiInitiatorEvent(
3525285242Sachim                         tiRoot,
3526285242Sachim                         tiPortalContext,
3527285242Sachim                         agNULL,
3528285242Sachim                         tiIntrEventTypeDeviceChange,
3529285242Sachim                         tiDeviceRemoval,
3530285242Sachim                         agNULL
3531285242Sachim                         );
3532285242Sachim#endif
3533285242Sachim      break;
3534285242Sachim    }
3535285242Sachim
3536285242Sachim    case OSSA_DISCOVER_COMPLETE:
3537285242Sachim    {
3538285242Sachim      TI_DBG1(("ossaDiscoverSataCB: COMPLETE\n"));
3539285242Sachim      onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED;
3540285242Sachim      TI_DBG6(("ossaDiscoverSataCB: COMPLETE pid %d\n", onePortContext->id));
3541285242Sachim
3542285242Sachim      /* Let OS-Apps specific layer know discovery has been successfully complete */
3543285242Sachim      ostiInitiatorEvent( tiRoot,
3544285242Sachim                          tiPortalContext,
3545285242Sachim                          agNULL,
3546285242Sachim                          tiIntrEventTypeDiscovery,
3547285242Sachim                          tiDiscOK,
3548285242Sachim                          agNULL );
3549285242Sachim      break;
3550285242Sachim    }
3551285242Sachim
3552285242Sachim    case OSSA_DISCOVER_ABORT:
3553285242Sachim    {
3554285242Sachim      TI_DBG1(("ossaDiscoverSataCB: OSSA_DISCOVER_ABORT\n"));
3555285242Sachim      /* Let OS-Apps specific layer know discovery has failed */
3556285242Sachim      ostiInitiatorEvent( tiRoot,
3557285242Sachim                          tiPortalContext,
3558285242Sachim                          agNULL,
3559285242Sachim                          tiIntrEventTypeDiscovery,
3560285242Sachim                          tiDiscFailed,
3561285242Sachim                          agNULL );
3562285242Sachim
3563285242Sachim      break;
3564285242Sachim     }
3565285242Sachim
3566285242Sachim    default:
3567285242Sachim    {
3568285242Sachim       TI_DBG1(("ossaDiscoverSataCB: error default event 0x%x\n", event));
3569285242Sachim      /* Let OS-Apps specific layer know discovery has failed */
3570285242Sachim      ostiInitiatorEvent( tiRoot,
3571285242Sachim                          tiPortalContext,
3572285242Sachim                          agNULL,
3573285242Sachim                          tiIntrEventTypeDiscovery,
3574285242Sachim                          tiDiscFailed,
3575285242Sachim                          agNULL );
3576285242Sachim      break;
3577285242Sachim    }
3578285242Sachim
3579285242Sachim  } /* end of switch */
3580285242Sachim
3581285242Sachim  return;
3582285242Sachim}
3583285242Sachim
3584285242Sachim/*****************************************************************************
3585285242Sachim*! \brief tdssAddSataToSharedcontext
3586285242Sachim*
3587285242Sachim*  Purpose:  This function adds a discovered SATA device to a device list of
3588285242Sachim*            a port context
3589285242Sachim*
3590285242Sachim*  \param   tsddPortContext_Instance Pointer to the target port context
3591285242Sachim*  \param   agRoot                   Pointer to the root data structure of
3592285242Sachim*                                    TD and Lower layer
3593285242Sachim*  \param   agDevHandle              Pointer to a device handle
3594285242Sachim*  \param   agSATADeviceInfo         Pointer to SATA device info structure
3595285242Sachim*  \param   registered               indication flag for registration to LL
3596285242Sachim*
3597285242Sachim*  \Return: none
3598285242Sachim*
3599285242Sachim*****************************************************************************/
3600285242Sachim/* split into devicedata allocation/registration and sending identify device data */
3601285242SachimosGLOBAL void
3602285242SachimtdssAddSATAToSharedcontext( tdsaPortContext_t    *tdsaPortContext_Instance,
3603285242Sachim                            agsaRoot_t           *agRoot,
3604285242Sachim                            agsaDevHandle_t      *agDevHandle,
3605285242Sachim                            agsaSATADeviceInfo_t *agSATADeviceInfo,
3606285242Sachim                            bit32                 registered,
3607285242Sachim                            bit8                  phyID
3608285242Sachim                            )
3609285242Sachim{
3610285242Sachim  tdsaPortContext_t           *onePortContext = agNULL;
3611285242Sachim  tdList_t                    *PortContextList;
3612285242Sachim  tdsaDeviceData_t            *oneDeviceData = agNULL;
3613285242Sachim  tdList_t                    *DeviceListList = agNULL;
3614285242Sachim  tdsaRootOsData_t            *osData = (tdsaRootOsData_t *)agRoot->osData;
3615285242Sachim  tiRoot_t                    *tiRoot = (tiRoot_t *)osData->tiRoot;
3616285242Sachim  tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
3617285242Sachim  tdsaContext_t               *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3618285242Sachim  satDeviceData_t             *pSatDevData;
3619285242Sachim  bit32                       Indenom = tdsaAllShared->QueueConfig.numInboundQueues;
3620285242Sachim  bit32                       Outdenom = tdsaAllShared->QueueConfig.numOutboundQueues;
3621285242Sachim  bit8                        dev_s_rate = 0;
3622285242Sachim  bit8                        sasorsata = 1;
3623285242Sachim  bit8                        connectionRate;
3624285242Sachim  bit8                        flag = 0;
3625285242Sachim  bit8                        TLR = 0;
3626285242Sachim  bit32                       found = agFALSE;
3627285242Sachim  TI_DBG5(("tdssAddSataToSharedcontext: start\n"));
3628285242Sachim
3629285242Sachim  /*
3630285242Sachim   * Find a right portcontext, then get devicedata from FreeLink in DeviceList.
3631285242Sachim   * Then, add the devicedata to the portcontext.
3632285242Sachim   */
3633285242Sachim
3634285242Sachim  /* Find a right portcontext */
3635285242Sachim  PortContextList = tdsaAllShared->MainPortContextList.flink;
3636285242Sachim  while (PortContextList != &(tdsaAllShared->MainPortContextList))
3637285242Sachim  {
3638285242Sachim    onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList);
3639285242Sachim    if (onePortContext == tdsaPortContext_Instance)
3640285242Sachim    {
3641285242Sachim      TI_DBG5(("tdssAddSataToSharedcontext: found; oneportContext ID %d\n",
3642285242Sachim        onePortContext->id));
3643285242Sachim      found = agTRUE;
3644285242Sachim      break;
3645285242Sachim    }
3646285242Sachim    PortContextList = PortContextList->flink;
3647285242Sachim  }
3648285242Sachim
3649285242Sachim  if (found == agFALSE)
3650285242Sachim  {
3651285242Sachim    TI_DBG1(("tdssAddSataToSharedcontext: No corressponding tdsaPortContext\n"));
3652285242Sachim    return;
3653285242Sachim  }
3654285242Sachim
3655285242Sachim  /*
3656285242Sachim   1. add the devicedata
3657285242Sachim   2. Send Identify Device Data
3658285242Sachim   3. In CB of Identify Device Data (satAddSATAIDDevCB), finds out the devicedata is new or old
3659285242Sachim  */
3660285242Sachim
3661285242Sachim
3662285242Sachim  tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
3663285242Sachim  if (!TDLIST_NOT_EMPTY(&(tdsaAllShared->FreeDeviceList)))
3664285242Sachim  {
3665285242Sachim    tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
3666285242Sachim    TI_DBG1(("tdssAddSataToSharedcontext: ERROR empty DeviceData FreeLink\n"));
3667285242Sachim    /* notifying link up */
3668285242Sachim    ostiPortEvent (
3669285242Sachim                   tiRoot,
3670285242Sachim                   tiPortLinkUp,
3671285242Sachim                   tiSuccess,
3672285242Sachim                   (void *)tdsaAllShared->Ports[phyID].tiPortalContext
3673285242Sachim                   );
3674285242Sachim#ifdef INITIATOR_DRIVER
3675285242Sachim    /* triggers discovery */
3676285242Sachim    ostiPortEvent(
3677285242Sachim                  tiRoot,
3678285242Sachim                  tiPortDiscoveryReady,
3679285242Sachim                  tiSuccess,
3680285242Sachim                  (void *) tdsaAllShared->Ports[phyID].tiPortalContext
3681285242Sachim                  );
3682285242Sachim#endif
3683285242Sachim    return;
3684285242Sachim  }
3685285242Sachim
3686285242Sachim  TDLIST_DEQUEUE_FROM_HEAD(&DeviceListList, &(tdsaAllShared->FreeDeviceList));
3687285242Sachim  tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
3688285242Sachim  oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, FreeLink, DeviceListList);
3689285242Sachim  TDLIST_DEQUEUE_THIS(&(oneDeviceData->FreeLink));
3690285242Sachim
3691285242Sachim  TI_DBG1(("tdssAddSataToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
3692285242Sachim  oneDeviceData->InQID = oneDeviceData->id % Indenom;
3693285242Sachim  oneDeviceData->OutQID = oneDeviceData->id % Outdenom;
3694285242Sachim
3695285242Sachim  pSatDevData = (satDeviceData_t *)&(oneDeviceData->satDevData);
3696285242Sachim  pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
3697285242Sachim  pSatDevData->satPendingIO = 0;
3698285242Sachim  pSatDevData->satNCQMaxIO = 0;
3699285242Sachim  pSatDevData->satPendingNCQIO = 0;
3700285242Sachim  pSatDevData->satPendingNONNCQIO = 0;
3701285242Sachim  pSatDevData->IDDeviceValid = agFALSE;
3702285242Sachim  pSatDevData->satDeviceType = tdssSATADeviceTypeDecode(onePortContext->remoteSignature);
3703285242Sachim
3704285242Sachim  osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
3705285242Sachim
3706285242Sachim  onePortContext->Count++;
3707285242Sachim  oneDeviceData->DeviceType = TD_SATA_DEVICE; // either TD_SAS_DEVICE or TD_SATA_DEVICE
3708285242Sachim  oneDeviceData->agRoot = agRoot;
3709285242Sachim//  oneDeviceData->agDevHandle = agDevHandle;
3710285242Sachim
3711285242Sachim//  agDevHandle->osData = oneDeviceData; /* TD layer */
3712285242Sachim  oneDeviceData->tdPortContext = onePortContext;
3713285242Sachim  oneDeviceData->valid = agTRUE;
3714285242Sachim
3715285242Sachim  oneDeviceData->directlyAttached = agTRUE;
3716285242Sachim  oneDeviceData->initiator_ssp_stp_smp = 0;
3717285242Sachim  oneDeviceData->target_ssp_stp_smp = 0x1; /* setting SATA device bit */
3718285242Sachim  oneDeviceData->phyID = phyID;
3719285242Sachim
3720285242Sachim  /* parse sasIDframe to fill in agDeviceInfo */
3721285242Sachim  flag = (bit8)((phyID << 4) | TLR);
3722285242Sachim  DEVINFO_PUT_SMPTO(&oneDeviceData->agDeviceInfo, DEFAULT_SMP_TIMEOUT);
3723285242Sachim  DEVINFO_PUT_ITNEXUSTO(&oneDeviceData->agDeviceInfo, (bit16)tdsaAllShared->itNexusTimeout);
3724285242Sachim  DEVINFO_PUT_FBS(&oneDeviceData->agDeviceInfo, 0);
3725285242Sachim  //temp
3726285242Sachim  //DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, 0);
3727285242Sachim  DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, flag);
3728285242Sachim
3729285242Sachim  sasorsata = SATA_DEVICE_TYPE; /* SATA disk */
3730285242Sachim  connectionRate = onePortContext->LinkRate;
3731285242Sachim  dev_s_rate = (bit8)(dev_s_rate | (sasorsata << 4));
3732285242Sachim  dev_s_rate = (bit8)(dev_s_rate | connectionRate);
3733285242Sachim  DEVINFO_PUT_DEV_S_RATE(&oneDeviceData->agDeviceInfo, dev_s_rate);
3734285242Sachim
3735285242Sachim  DEVINFO_PUT_SAS_ADDRESSLO(
3736285242Sachim                            &oneDeviceData->agDeviceInfo,
3737285242Sachim                            0
3738285242Sachim                            );
3739285242Sachim  DEVINFO_PUT_SAS_ADDRESSHI(
3740285242Sachim                            &oneDeviceData->agDeviceInfo,
3741285242Sachim                            0
3742285242Sachim                            );
3743285242Sachim
3744285242Sachim  if (pSatDevData->satDeviceType == SATA_ATAPI_DEVICE )
3745285242Sachim  {
3746285242Sachim     oneDeviceData->agDeviceInfo.flag |= ATAPI_DEVICE_FLAG; /* ATAPI device flag*/
3747285242Sachim  }
3748285242Sachim
3749285242Sachim  oneDeviceData->agContext.osData = oneDeviceData;
3750285242Sachim  oneDeviceData->agContext.sdkData = agNULL;
3751285242Sachim
3752285242Sachim  if (oneDeviceData->registered == agFALSE)
3753285242Sachim  {
3754285242Sachim    saRegisterNewDevice(  /* tdssAddSATAToSharedcontext  */
3755285242Sachim                        agRoot,
3756285242Sachim                        &oneDeviceData->agContext,
3757285242Sachim                        0,/*tdsaRotateQnumber(tiRoot, oneDeviceData),*/
3758285242Sachim                        &oneDeviceData->agDeviceInfo,
3759285242Sachim                        onePortContext->agPortContext,
3760285242Sachim                        0
3761285242Sachim                        );
3762285242Sachim  }
3763285242Sachim  return;
3764285242Sachim}
3765285242Sachim/*****************************************************************************
3766285242Sachim*! \brief tdssRetrySATAID
3767285242Sachim*
3768285242Sachim*  Purpose:  This function retries identify device data to directly attached SATA
3769285242Sachim*            device after device registration
3770285242Sachim*
3771285242Sachim*  \param   tiRoot:           Pointer to TISA initiator driver/port instance.
3772285242Sachim*  \param   oneDeviceData     Pointer to a device data
3773285242Sachim*  \Return: none
3774285242Sachim*
3775285242Sachim*****************************************************************************/
3776285242SachimosGLOBAL void
3777285242SachimtdssRetrySATAID( tiRoot_t             *tiRoot,
3778285242Sachim                 tdsaDeviceData_t     *oneDeviceData
3779285242Sachim               )
3780285242Sachim{
3781285242Sachim  tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
3782285242Sachim  tdsaContext_t               *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3783285242Sachim  void                        *osMemHandle;
3784285242Sachim  tdIORequestBody_t           *tdIORequestBody;
3785285242Sachim  bit32                       PhysUpper32;
3786285242Sachim  bit32                       PhysLower32;
3787285242Sachim  bit32                       memAllocStatus;
3788285242Sachim  agsaIORequest_t             *agIORequest = agNULL; /* identify device data itself */
3789285242Sachim  satIOContext_t              *satIOContext = agNULL;
3790285242Sachim  bit32                       status;
3791285242Sachim
3792285242Sachim  TI_DBG5(("tdssRetrySATAID: start\n"));
3793285242Sachim  /* allocate identify device data and sends it */
3794285242Sachim  /* allocation tdIORequestBody and pass it to satTM() */
3795285242Sachim  memAllocStatus = ostiAllocMemory(
3796285242Sachim                                   tiRoot,
3797285242Sachim                                   &osMemHandle,
3798285242Sachim                                   (void **)&tdIORequestBody,
3799285242Sachim                                   &PhysUpper32,
3800285242Sachim                                   &PhysLower32,
3801285242Sachim                                   8,
3802285242Sachim                                   sizeof(tdIORequestBody_t),
3803285242Sachim                                   agTRUE
3804285242Sachim                                   );
3805285242Sachim
3806285242Sachim  if (memAllocStatus != tiSuccess)
3807285242Sachim  {
3808285242Sachim    TI_DBG1(("tdssRetrySATAID: ostiAllocMemory failed... loc 2\n"));
3809285242Sachim    /* notifying link up */
3810285242Sachim    ostiPortEvent (
3811285242Sachim                   tiRoot,
3812285242Sachim                   tiPortLinkUp,
3813285242Sachim                   tiSuccess,
3814285242Sachim                   (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3815285242Sachim                   );
3816285242Sachim#ifdef INITIATOR_DRIVER
3817285242Sachim    /* triggers discovery */
3818285242Sachim    ostiPortEvent(
3819285242Sachim                  tiRoot,
3820285242Sachim                  tiPortDiscoveryReady,
3821285242Sachim                  tiSuccess,
3822285242Sachim                  (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3823285242Sachim                  );
3824285242Sachim#endif
3825285242Sachim
3826285242Sachim    return;
3827285242Sachim  }
3828285242Sachim
3829285242Sachim  if (tdIORequestBody == agNULL)
3830285242Sachim  {
3831285242Sachim    TI_DBG1(("tdssRetrySATAID: ostiAllocMemory returned NULL tdIORequestBody loc 2\n"));
3832285242Sachim    /* notifying link up */
3833285242Sachim    ostiPortEvent (
3834285242Sachim                   tiRoot,
3835285242Sachim                   tiPortLinkUp,
3836285242Sachim                   tiSuccess,
3837285242Sachim                   (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3838285242Sachim                   );
3839285242Sachim#ifdef INITIATOR_DRIVER
3840285242Sachim    /* triggers discovery */
3841285242Sachim    ostiPortEvent(
3842285242Sachim                  tiRoot,
3843285242Sachim                  tiPortDiscoveryReady,
3844285242Sachim                  tiSuccess,
3845285242Sachim                  (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3846285242Sachim                  );
3847285242Sachim#endif
3848285242Sachim
3849285242Sachim    return;
3850285242Sachim  }
3851285242Sachim
3852285242Sachim  /* setup identify device data IO structure */
3853285242Sachim  tdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
3854285242Sachim  tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL;
3855285242Sachim  tdIORequestBody->IOType.InitiatorTMIO.TaskTag = agNULL;
3856285242Sachim
3857285242Sachim  /* initialize tiDevhandle */
3858285242Sachim  tdIORequestBody->tiDevHandle = &(oneDeviceData->tiDeviceHandle);
3859285242Sachim  tdIORequestBody->tiDevHandle->tdData = oneDeviceData;
3860285242Sachim
3861285242Sachim  /* initialize tiIORequest */
3862285242Sachim  tdIORequestBody->tiIORequest = agNULL;
3863285242Sachim
3864285242Sachim  /* initialize agIORequest */
3865285242Sachim  agIORequest = &(tdIORequestBody->agIORequest);
3866285242Sachim  agIORequest->osData = (void *) tdIORequestBody;
3867285242Sachim  agIORequest->sdkData = agNULL; /* SA takes care of this */
3868285242Sachim
3869285242Sachim  /* set up satIOContext */
3870285242Sachim  satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
3871285242Sachim  satIOContext->pSatDevData   = &(oneDeviceData->satDevData);
3872285242Sachim  satIOContext->pFis          =
3873285242Sachim    &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
3874285242Sachim
3875285242Sachim
3876285242Sachim  satIOContext->tiRequestBody = tdIORequestBody;
3877285242Sachim  satIOContext->ptiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
3878285242Sachim  satIOContext->tiScsiXchg = agNULL;
3879285242Sachim  satIOContext->satIntIoContext  = agNULL;
3880285242Sachim  satIOContext->satOrgIOContext  = agNULL;
3881285242Sachim
3882285242Sachim  /* followings are used only for internal IO */
3883285242Sachim  satIOContext->currentLBA = 0;
3884285242Sachim  satIOContext->OrgTL = 0;
3885285242Sachim
3886285242Sachim
3887285242Sachim  satIOContext->satToBeAbortedIOContext = agNULL;
3888285242Sachim
3889285242Sachim  satIOContext->NotifyOS = agFALSE;
3890285242Sachim
3891285242Sachim  satIOContext->pid = tdsaAllShared->Ports[oneDeviceData->phyID].portContext->id;
3892285242Sachim
3893285242Sachim  status = satAddSATAStartIDDev(tiRoot,
3894285242Sachim                                agNULL,
3895285242Sachim                                &(oneDeviceData->tiDeviceHandle),
3896285242Sachim                                agNULL,
3897285242Sachim                                satIOContext
3898285242Sachim                                );
3899285242Sachim
3900285242Sachim  /* assumption; always new device data */
3901285242Sachim
3902285242Sachim
3903285242Sachim  if (status == tiSuccess)
3904285242Sachim  {
3905285242Sachim    TI_DBG6(("tdssRetrySATAID: successfully sent identify device data\n"));
3906285242Sachim    TI_DBG6(("tdssRetrySATAID: one case did %d \n", oneDeviceData->id));
3907285242Sachim  }
3908285242Sachim  else
3909285242Sachim  {
3910285242Sachim    TI_DBG1(("tdssRetrySATAID: failed in sending identify device data\n"));
3911285242Sachim    /* put onedevicedata back to free list */
3912285242Sachim    tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
3913285242Sachim    TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
3914285242Sachim    tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
3915285242Sachim    /* notifying link up */
3916285242Sachim    ostiPortEvent (
3917285242Sachim                   tiRoot,
3918285242Sachim                   tiPortLinkUp,
3919285242Sachim                   tiSuccess,
3920285242Sachim                   (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3921285242Sachim                   );
3922285242Sachim#ifdef INITIATOR_DRIVER
3923285242Sachim    /* triggers discovery */
3924285242Sachim    ostiPortEvent(
3925285242Sachim                  tiRoot,
3926285242Sachim                  tiPortDiscoveryReady,
3927285242Sachim                  tiSuccess,
3928285242Sachim                  (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3929285242Sachim                  );
3930285242Sachim#endif
3931285242Sachim
3932285242Sachim  }
3933285242Sachim
3934285242Sachim  return;
3935285242Sachim}
3936285242Sachim
3937285242Sachim/*****************************************************************************
3938285242Sachim*! \brief tdssSubAddSATAToSharedcontext
3939285242Sachim*
3940285242Sachim*  Purpose:  This function sends identify device data to directly attached SATA
3941285242Sachim*            device after device registration
3942285242Sachim*
3943285242Sachim*  \param   tiRoot:           Pointer to TISA initiator driver/port instance.
3944285242Sachim*  \param   oneDeviceData     Pointer to a device data
3945285242Sachim*  \Return: none
3946285242Sachim*
3947285242Sachim*****************************************************************************/
3948285242SachimosGLOBAL void
3949285242SachimtdssSubAddSATAToSharedcontext( tiRoot_t             *tiRoot,
3950285242Sachim                               tdsaDeviceData_t     *oneDeviceData
3951285242Sachim                              )
3952285242Sachim{
3953285242Sachim  tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
3954285242Sachim  tdsaContext_t               *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3955285242Sachim  void                        *osMemHandle;
3956285242Sachim  tdIORequestBody_t           *tdIORequestBody;
3957285242Sachim  bit32                       PhysUpper32;
3958285242Sachim  bit32                       PhysLower32;
3959285242Sachim  bit32                       memAllocStatus;
3960285242Sachim  agsaIORequest_t             *agIORequest = agNULL; /* identify device data itself */
3961285242Sachim  satIOContext_t              *satIOContext = agNULL;
3962285242Sachim  bit32                       status;
3963285242Sachim
3964285242Sachim  TI_DBG1(("tdssSubAddSATAToSharedcontext: start\n"));
3965285242Sachim  /* allocate identify device data and sends it */
3966285242Sachim  /* allocation tdIORequestBody and pass it to satTM() */
3967285242Sachim  memAllocStatus = ostiAllocMemory(
3968285242Sachim                                   tiRoot,
3969285242Sachim                                   &osMemHandle,
3970285242Sachim                                   (void **)&tdIORequestBody,
3971285242Sachim                                   &PhysUpper32,
3972285242Sachim                                   &PhysLower32,
3973285242Sachim                                   8,
3974285242Sachim                                   sizeof(tdIORequestBody_t),
3975285242Sachim                                   agTRUE
3976285242Sachim                                   );
3977285242Sachim
3978285242Sachim  if (memAllocStatus != tiSuccess)
3979285242Sachim  {
3980285242Sachim    TI_DBG1(("tdssSubAddSATAToSharedcontext: ostiAllocMemory failed... loc 2\n"));
3981285242Sachim    /* notifying link up */
3982285242Sachim    ostiPortEvent (
3983285242Sachim                   tiRoot,
3984285242Sachim                   tiPortLinkUp,
3985285242Sachim                   tiSuccess,
3986285242Sachim                   (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3987285242Sachim                   );
3988285242Sachim#ifdef INITIATOR_DRIVER
3989285242Sachim    /* triggers discovery */
3990285242Sachim    ostiPortEvent(
3991285242Sachim                  tiRoot,
3992285242Sachim                  tiPortDiscoveryReady,
3993285242Sachim                  tiSuccess,
3994285242Sachim                  (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3995285242Sachim                  );
3996285242Sachim#endif
3997285242Sachim
3998285242Sachim    return;
3999285242Sachim  }
4000285242Sachim
4001285242Sachim  if (tdIORequestBody == agNULL)
4002285242Sachim  {
4003285242Sachim    TI_DBG1(("tdssSubAddSATAToSharedcontext: ostiAllocMemory returned NULL tdIORequestBody loc 2\n"));
4004285242Sachim    /* notifying link up */
4005285242Sachim    ostiPortEvent (
4006285242Sachim                   tiRoot,
4007285242Sachim                   tiPortLinkUp,
4008285242Sachim                   tiSuccess,
4009285242Sachim                   (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4010285242Sachim                   );
4011285242Sachim#ifdef INITIATOR_DRIVER
4012285242Sachim    /* triggers discovery */
4013285242Sachim    ostiPortEvent(
4014285242Sachim                  tiRoot,
4015285242Sachim                  tiPortDiscoveryReady,
4016285242Sachim                  tiSuccess,
4017285242Sachim                  (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4018285242Sachim                  );
4019285242Sachim#endif
4020285242Sachim
4021285242Sachim    return;
4022285242Sachim  }
4023285242Sachim
4024285242Sachim  /* setup identify device data IO structure */
4025285242Sachim  tdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
4026285242Sachim  tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL;
4027285242Sachim  tdIORequestBody->IOType.InitiatorTMIO.TaskTag = agNULL;
4028285242Sachim
4029285242Sachim  /* initialize tiDevhandle */
4030285242Sachim  tdIORequestBody->tiDevHandle = &(oneDeviceData->tiDeviceHandle);
4031285242Sachim  tdIORequestBody->tiDevHandle->tdData = oneDeviceData;
4032285242Sachim
4033285242Sachim  /* initialize tiIORequest */
4034285242Sachim  tdIORequestBody->tiIORequest = agNULL;
4035285242Sachim
4036285242Sachim  /* initialize agIORequest */
4037285242Sachim  agIORequest = &(tdIORequestBody->agIORequest);
4038285242Sachim  agIORequest->osData = (void *) tdIORequestBody;
4039285242Sachim  agIORequest->sdkData = agNULL; /* SA takes care of this */
4040285242Sachim
4041285242Sachim  /* set up satIOContext */
4042285242Sachim  satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
4043285242Sachim  satIOContext->pSatDevData   = &(oneDeviceData->satDevData);
4044285242Sachim  satIOContext->pFis          =
4045285242Sachim    &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
4046285242Sachim
4047285242Sachim
4048285242Sachim  satIOContext->tiRequestBody = tdIORequestBody;
4049285242Sachim  satIOContext->ptiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
4050285242Sachim  satIOContext->tiScsiXchg = agNULL;
4051285242Sachim  satIOContext->satIntIoContext  = agNULL;
4052285242Sachim  satIOContext->satOrgIOContext  = agNULL;
4053285242Sachim
4054285242Sachim  /* followings are used only for internal IO */
4055285242Sachim  satIOContext->currentLBA = 0;
4056285242Sachim  satIOContext->OrgTL = 0;
4057285242Sachim
4058285242Sachim
4059285242Sachim  satIOContext->satToBeAbortedIOContext = agNULL;
4060285242Sachim
4061285242Sachim  satIOContext->NotifyOS = agFALSE;
4062285242Sachim
4063285242Sachim  satIOContext->pid = tdsaAllShared->Ports[oneDeviceData->phyID].portContext->id;
4064285242Sachim
4065285242Sachim  status = satAddSATAStartIDDev(tiRoot,
4066285242Sachim                                agNULL,
4067285242Sachim                                &(oneDeviceData->tiDeviceHandle),
4068285242Sachim                                agNULL,
4069285242Sachim                                satIOContext
4070285242Sachim                                );
4071285242Sachim
4072285242Sachim  /* assumption; always new device data */
4073285242Sachim
4074285242Sachim
4075285242Sachim  if (status == tiSuccess)
4076285242Sachim  {
4077285242Sachim    TI_DBG6(("tdssSubAddSATAToSharedcontext: successfully sent identify device data\n"));
4078285242Sachim
4079285242Sachim    /* Add the devicedata to the mainlink */
4080285242Sachim    tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
4081285242Sachim    TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList));
4082285242Sachim    tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
4083285242Sachim    TI_DBG6(("tdssSubAddSATAToSharedcontext: one case did %d \n", oneDeviceData->id));
4084285242Sachim  }
4085285242Sachim  else
4086285242Sachim  {
4087285242Sachim    TI_DBG1(("tdssSubAddSATAToSharedcontext: failed in sending identify device data\n"));
4088285242Sachim    /* put onedevicedata back to free list */
4089285242Sachim    tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
4090285242Sachim    TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
4091285242Sachim    tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
4092285242Sachim    /* notifying link up */
4093285242Sachim    ostiPortEvent (
4094285242Sachim                   tiRoot,
4095285242Sachim                   tiPortLinkUp,
4096285242Sachim                   tiSuccess,
4097285242Sachim                   (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4098285242Sachim                   );
4099285242Sachim#ifdef INITIATOR_DRIVER
4100285242Sachim    /* triggers discovery */
4101285242Sachim    ostiPortEvent(
4102285242Sachim                  tiRoot,
4103285242Sachim                  tiPortDiscoveryReady,
4104285242Sachim                  tiSuccess,
4105285242Sachim                  (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4106285242Sachim                  );
4107285242Sachim#endif
4108285242Sachim
4109285242Sachim  }
4110285242Sachim
4111285242Sachim  return;
4112285242Sachim}
4113285242Sachim
4114285242Sachim
4115285242Sachim/*****************************************************************************
4116285242Sachim*! \brief tdssRemoveSATAFromSharedcontext
4117285242Sachim*
4118285242Sachim*  Purpose:  This function removes a discovered device from a device list of
4119285242Sachim*            a port context
4120285242Sachim*
4121285242Sachim*  \param   tsddPortContext_Ins      Pointer to the target port context
4122285242Sachim*  \param   tdsaDeviceData_Ins       Pointer to the target device
4123285242Sachim*  \param   agRoot                   Pointer to the root data structure of
4124285242Sachim*                                    TD and Lower layer
4125285242Sachim
4126285242Sachim*
4127285242Sachim*  \Return: none
4128285242Sachim*
4129285242Sachim*****************************************************************************/
4130285242SachimosGLOBAL void
4131285242SachimtdssRemoveSATAFromSharedcontext(
4132285242Sachim                               tdsaPortContext_t *tdsaPortContext_Ins,
4133285242Sachim                               tdsaDeviceData_t  *tdsaDeviceData_ins,
4134285242Sachim                               agsaRoot_t        *agRoot
4135285242Sachim                               )
4136285242Sachim{
4137285242Sachim  TI_DBG1(("tdssRemoveSATAFromSharedcontex: start\n"));
4138285242Sachim  return;
4139285242Sachim}
4140285242Sachim
4141285242Sachim
4142285242Sachim/*****************************************************************************
4143285242Sachim*! \brief satSetDevInfo
4144285242Sachim*
4145285242Sachim*  Purpose:  Based on ATA identify device data, this functions sets fields of
4146285242Sachim*            device data maintained in TD layer
4147285242Sachim*
4148285242Sachim*  \param   satDevData          Pointer to a device data
4149285242Sachim*  \param   SATAIdData          Pointer to ATA identify device data
4150285242Sachim*
4151285242Sachim*
4152285242Sachim*  \Return: none
4153285242Sachim*
4154285242Sachim*****************************************************************************/
4155285242Sachimvoid satSetDevInfo(
4156285242Sachim                   satDeviceData_t           *satDevData,
4157285242Sachim                   agsaSATAIdentifyData_t    *SATAIdData
4158285242Sachim                   )
4159285242Sachim{
4160285242Sachim  TI_DBG3(("satSetDevInfo: start\n"));
4161285242Sachim
4162285242Sachim  satDevData->satDriveState = SAT_DEV_STATE_NORMAL;
4163285242Sachim  satDevData->satFormatState = agFALSE;
4164285242Sachim  satDevData->satDeviceFaultState = agFALSE;
4165285242Sachim  satDevData->satTmTaskTag  = agNULL;
4166285242Sachim  satDevData->satAbortAfterReset = agFALSE;
4167285242Sachim  satDevData->satAbortCalled = agFALSE;
4168285242Sachim  satDevData->satSectorDone  = 0;
4169285242Sachim
4170285242Sachim  /* Qeueu depth, Word 75 */
4171285242Sachim  satDevData->satNCQMaxIO = SATAIdData->queueDepth + 1;
4172285242Sachim  TI_DBG3(("satSetDevInfo: max queue depth %d\n",satDevData->satNCQMaxIO));
4173285242Sachim
4174285242Sachim  /* Support NCQ, if Word 76 bit 8 is set */
4175285242Sachim  if (SATAIdData->sataCapabilities & 0x100)
4176285242Sachim  {
4177285242Sachim    TI_DBG3(("satSetDevInfo: device supports NCQ\n"));
4178285242Sachim    satDevData->satNCQ   = agTRUE;
4179285242Sachim  }
4180285242Sachim  else
4181285242Sachim  {
4182285242Sachim    TI_DBG3(("satSetDevInfo: no NCQ\n"));
4183285242Sachim    satDevData->satNCQ = agFALSE;
4184285242Sachim  }
4185285242Sachim
4186285242Sachim  /* Support 48 bit addressing, if Word 83 bit 10 and Word 86 bit 10 are set */
4187285242Sachim  if ((SATAIdData->commandSetSupported1 & 0x400) &&
4188285242Sachim      (SATAIdData->commandSetFeatureEnabled1 & 0x400) )
4189285242Sachim  {
4190285242Sachim    TI_DBG3(("satSetDevInfo: support 48 bit addressing\n"));
4191285242Sachim    satDevData->sat48BitSupport = agTRUE;
4192285242Sachim  }
4193285242Sachim  else
4194285242Sachim  {
4195285242Sachim    TI_DBG3(("satSetDevInfo: NO 48 bit addressing\n"));
4196285242Sachim    satDevData->sat48BitSupport = agFALSE;
4197285242Sachim  }
4198285242Sachim
4199285242Sachim  /* Support SMART Self Test, word84 bit 1 */
4200285242Sachim  if (SATAIdData->commandSetFeatureSupportedExt & 0x02)
4201285242Sachim  {
4202285242Sachim    TI_DBG3(("satSetDevInfo: SMART self-test supported \n"));
4203285242Sachim    satDevData->satSMARTSelfTest   = agTRUE;
4204285242Sachim  }
4205285242Sachim  else
4206285242Sachim  {
4207285242Sachim    TI_DBG3(("satSetDevInfo: no SMART self-test suppored\n"));
4208285242Sachim    satDevData->satSMARTSelfTest = agFALSE;
4209285242Sachim  }
4210285242Sachim
4211285242Sachim
4212285242Sachim
4213285242Sachim  /* Support SMART feature set, word82 bit 0 */
4214285242Sachim  if (SATAIdData->commandSetSupported & 0x01)
4215285242Sachim  {
4216285242Sachim    TI_DBG3(("satSetDevInfo: SMART feature set supported \n"));
4217285242Sachim    satDevData->satSMARTFeatureSet   = agTRUE;
4218285242Sachim  }
4219285242Sachim  else
4220285242Sachim  {
4221285242Sachim    TI_DBG3(("satSetDevInfo: no SMART feature set suppored\n"));
4222285242Sachim    satDevData->satSMARTFeatureSet = agFALSE;
4223285242Sachim  }
4224285242Sachim
4225285242Sachim
4226285242Sachim
4227285242Sachim  /* Support SMART enabled, word85 bit 0 */
4228285242Sachim  if (SATAIdData->commandSetFeatureEnabled & 0x01)
4229285242Sachim  {
4230285242Sachim    TI_DBG3(("satSetDevInfo: SMART enabled \n"));
4231285242Sachim    satDevData->satSMARTEnabled   = agTRUE;
4232285242Sachim  }
4233285242Sachim  else
4234285242Sachim  {
4235285242Sachim    TI_DBG3(("satSetDevInfo: no SMART enabled\n"));
4236285242Sachim    satDevData->satSMARTEnabled = agFALSE;
4237285242Sachim  }
4238285242Sachim
4239285242Sachim  satDevData->satVerifyState = 0;
4240285242Sachim
4241285242Sachim  /* Removable Media feature set support, word82 bit 2 */
4242285242Sachim  if (SATAIdData->commandSetSupported & 0x4)
4243285242Sachim  {
4244285242Sachim    TI_DBG3(("satSetDevInfo: Removable Media supported \n"));
4245285242Sachim    satDevData->satRemovableMedia   = agTRUE;
4246285242Sachim  }
4247285242Sachim  else
4248285242Sachim  {
4249285242Sachim    TI_DBG3(("satSetDevInfo: no Removable Media suppored\n"));
4250285242Sachim    satDevData->satRemovableMedia = agFALSE;
4251285242Sachim  }
4252285242Sachim
4253285242Sachim  /* Removable Media feature set enabled, word 85, bit 2 */
4254285242Sachim  if (SATAIdData->commandSetFeatureEnabled & 0x4)
4255285242Sachim  {
4256285242Sachim    TI_DBG3(("satSetDevInfo: Removable Media enabled\n"));
4257285242Sachim    satDevData->satRemovableMediaEnabled   = agTRUE;
4258285242Sachim  }
4259285242Sachim  else
4260285242Sachim  {
4261285242Sachim    TI_DBG3(("satSetDevInfo: no Removable Media enabled\n"));
4262285242Sachim    satDevData->satRemovableMediaEnabled = agFALSE;
4263285242Sachim  }
4264285242Sachim
4265285242Sachim  /* DMA Support, word49 bit8 */
4266285242Sachim  if (SATAIdData->dma_lba_iod_ios_stimer & 0x100)
4267285242Sachim  {
4268285242Sachim    TI_DBG3(("satSetDevInfo: DMA supported \n"));
4269285242Sachim    satDevData->satDMASupport   = agTRUE;
4270285242Sachim  }
4271285242Sachim  else
4272285242Sachim  {
4273285242Sachim    TI_DBG3(("satSetDevInfo: no DMA suppored\n"));
4274285242Sachim    satDevData->satDMASupport = agFALSE;
4275285242Sachim  }
4276285242Sachim
4277285242Sachim  /* DMA Enabled, word88 bit0-6, bit8-14*/
4278285242Sachim  /* 0x7F7F = 0111 1111 0111 1111*/
4279285242Sachim  if (SATAIdData->ultraDMAModes & 0x7F7F)
4280285242Sachim  {
4281285242Sachim    TI_DBG3(("satSetDevInfo: DMA enabled \n"));
4282285242Sachim    satDevData->satDMAEnabled   = agTRUE;
4283285242Sachim  }
4284285242Sachim  else
4285285242Sachim  {
4286285242Sachim    TI_DBG3(("satSetDevInfo: no DMA enabled\n"));
4287285242Sachim    satDevData->satDMAEnabled = agFALSE;
4288285242Sachim  }
4289285242Sachim
4290285242Sachim  /*
4291285242Sachim    setting MaxUserAddrSectors: max user addressable setctors
4292285242Sachim    word60 - 61, should be 0x 0F FF FF FF
4293285242Sachim  */
4294285242Sachim  satDevData->satMaxUserAddrSectors
4295285242Sachim    = (SATAIdData->numOfUserAddressableSectorsHi << (8*2) )
4296285242Sachim    + SATAIdData->numOfUserAddressableSectorsLo;
4297285242Sachim  TI_DBG3(("satSetDevInfo: MaxUserAddrSectors 0x%x decimal %d\n", satDevData->satMaxUserAddrSectors, satDevData->satMaxUserAddrSectors));
4298285242Sachim  /* Support DMADIR, if Word 62 bit 8 is set */
4299285242Sachim  if (SATAIdData->word62_74[0] & 0x8000)
4300285242Sachim  {
4301285242Sachim     TI_DBG3(("satSetDevInfo: DMADIR enabled\n"));
4302285242Sachim     satDevData->satDMADIRSupport   = agTRUE;
4303285242Sachim  }
4304285242Sachim  else
4305285242Sachim  {
4306285242Sachim     TI_DBG3(("satSetDevInfo: DMADIR disabled\n"));
4307285242Sachim     satDevData->satDMADIRSupport   = agFALSE;
4308285242Sachim  }
4309285242Sachim
4310285242Sachim
4311285242Sachim  /* write cache enabled for caching mode page SAT Table 67 p69, word85 bit5 */
4312285242Sachim  if (SATAIdData->commandSetFeatureEnabled & 0x20)
4313285242Sachim  {
4314285242Sachim    TI_DBG3(("satSetDevInfo: write cache enabled\n"));
4315285242Sachim    satDevData->satWriteCacheEnabled   = agTRUE;
4316285242Sachim  }
4317285242Sachim  else
4318285242Sachim  {
4319285242Sachim    TI_DBG3(("satSetDevInfo: no write cache enabled\n"));
4320285242Sachim    satDevData->satWriteCacheEnabled = agFALSE;
4321285242Sachim  }
4322285242Sachim
4323285242Sachim  /* look ahead enabled for caching mode page SAT Table 67 p69, word85 bit6 */
4324285242Sachim  if (SATAIdData->commandSetFeatureEnabled & 0x40)
4325285242Sachim  {
4326285242Sachim    TI_DBG3(("satSetDevInfo: look ahead enabled\n"));
4327285242Sachim    satDevData->satLookAheadEnabled   = agTRUE;
4328285242Sachim  }
4329285242Sachim  else
4330285242Sachim  {
4331285242Sachim    TI_DBG3(("satSetDevInfo: no look ahead enabled\n"));
4332285242Sachim    satDevData->satLookAheadEnabled = agFALSE;
4333285242Sachim  }
4334285242Sachim
4335285242Sachim  /* Support WWN, if Word 87 bit 8 is set */
4336285242Sachim  if (SATAIdData->commandSetFeatureDefault & 0x100)
4337285242Sachim  {
4338285242Sachim    TI_DBG3(("satSetDevInfo: device supports WWN\n"));
4339285242Sachim    satDevData->satWWNSupport   = agTRUE;
4340285242Sachim  }
4341285242Sachim  else
4342285242Sachim  {
4343285242Sachim    TI_DBG3(("satSetDevInfo: no WWN\n"));
4344285242Sachim    satDevData->satWWNSupport = agFALSE;
4345285242Sachim  }
4346285242Sachim
4347285242Sachim
4348285242Sachim  return;
4349285242Sachim}
4350285242Sachim
4351285242Sachim/*****************************************************************************
4352285242Sachim*! \brief  satInquiryCB
4353285242Sachim*
4354285242Sachim*   This routine is a callback function for satInquiry()
4355285242Sachim*
4356285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
4357285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
4358285242Sachim*  \param   agIOStatus:  Status of completed I/O.
4359285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
4360285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
4361285242Sachim*                        length.
4362285242Sachim*  \param   agParam:     Additional info based on status.
4363285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
4364285242Sachim*
4365285242Sachim*  \return: none
4366285242Sachim*
4367285242Sachim*****************************************************************************/
4368285242Sachimvoid satInquiryCB(
4369285242Sachim                   agsaRoot_t        *agRoot,
4370285242Sachim                   agsaIORequest_t   *agIORequest,
4371285242Sachim                   bit32             agIOStatus,
4372285242Sachim                   agsaFisHeader_t   *agFirstDword,
4373285242Sachim                   bit32             agIOInfoLen,
4374285242Sachim                   void              *agParam,
4375285242Sachim                   void              *ioContext
4376285242Sachim                   )
4377285242Sachim{
4378285242Sachim  /*
4379285242Sachim    In the process of Inquiry
4380285242Sachim    Process SAT_IDENTIFY_DEVICE
4381285242Sachim  */
4382285242Sachim  tdsaRootOsData_t         *osData = (tdsaRootOsData_t *)agRoot->osData;
4383285242Sachim  tiRoot_t                 *tiRoot = (tiRoot_t *)osData->tiRoot;
4384285242Sachim  tdsaRoot_t               *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
4385285242Sachim  tdsaContext_t            *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
4386285242Sachim  tdIORequestBody_t        *tdIORequestBody;
4387285242Sachim  tdIORequestBody_t        *tdOrgIORequestBody;
4388285242Sachim  satIOContext_t           *satIOContext;
4389285242Sachim  satIOContext_t           *satOrgIOContext;
4390285242Sachim  satInternalIo_t          *satIntIo;
4391285242Sachim  satDeviceData_t          *satDevData;
4392285242Sachim#ifdef  TD_DEBUG_ENABLE
4393285242Sachim  tdsaDeviceData_t         *tdsaDeviceData;
4394285242Sachim  bit32                     ataStatus = 0;
4395285242Sachim  bit32                     ataError;
4396285242Sachim  agsaFisPioSetupHeader_t  *satPIOSetupHeader = agNULL;
4397285242Sachim#endif
4398285242Sachim  scsiRspSense_t           *pSense;
4399285242Sachim  tiIniScsiCmnd_t          *scsiCmnd;
4400285242Sachim  tiIORequest_t            *tiOrgIORequest;
4401285242Sachim  tiScsiInitiatorRequest_t *tiScsiRequest; /* TD's tiScsiXchg */
4402285242Sachim  tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* OS's tiScsiXchg */
4403285242Sachim  agsaSATAIdentifyData_t   *pSATAIdData;
4404285242Sachim  bit8                     *pInquiry;
4405285242Sachim  bit8                      page = 0xFF;
4406285242Sachim  bit16                    *tmpptr,tmpptr_tmp;
4407285242Sachim  bit32                     x;
4408285242Sachim  bit32                     lenReceived;
4409285242Sachim  bit32                     lenNeeded = 0;
4410285242Sachim
4411285242Sachim  TI_DBG6(("satInquiryCB: start\n"));
4412285242Sachim  TI_DBG6(("satInquiryCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
4413285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
4414285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
4415285242Sachim  satIntIo               = satIOContext->satIntIoContext;
4416285242Sachim  satDevData             = satIOContext->pSatDevData;
4417285242Sachim#ifdef  TD_DEBUG_ENABLE
4418285242Sachim  tdsaDeviceData         = (tdsaDeviceData_t *)satDevData->satSaDeviceData;
4419285242Sachim#endif
4420285242Sachim  tiScsiRequest          = satIOContext->tiScsiXchg;
4421285242Sachim  if (satIntIo == agNULL)
4422285242Sachim  {
4423285242Sachim    TI_DBG6(("satInquiryCB: External, OS generated\n"));
4424285242Sachim    pSense               = satIOContext->pSense;
4425285242Sachim    scsiCmnd             = satIOContext->pScsiCmnd;
4426285242Sachim    satOrgIOContext      = satIOContext;
4427285242Sachim    tiOrgIORequest       = tdIORequestBody->tiIORequest;
4428285242Sachim  }
4429285242Sachim  else
4430285242Sachim  {
4431285242Sachim    TI_DBG6(("satInquiryCB: Internal, TD generated\n"));
4432285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
4433285242Sachim    if (satOrgIOContext == agNULL)
4434285242Sachim    {
4435285242Sachim      TI_DBG1(("satInquiryCB: satOrgIOContext is NULL, wrong\n"));
4436285242Sachim      return;
4437285242Sachim    }
4438285242Sachim    else
4439285242Sachim    {
4440285242Sachim      TI_DBG6(("satInquiryCB: satOrgIOContext is NOT NULL\n"));
4441285242Sachim    }
4442285242Sachim    tdOrgIORequestBody    = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
4443285242Sachim    tiOrgIORequest        = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
4444285242Sachim    pSense                = satOrgIOContext->pSense;
4445285242Sachim    scsiCmnd              = satOrgIOContext->pScsiCmnd;
4446285242Sachim  }
4447285242Sachim
4448285242Sachim  tiOrgScsiRequest        = satOrgIOContext->tiScsiXchg;
4449285242Sachim  pInquiry                = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
4450285242Sachim
4451285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
4452285242Sachim  tdIORequestBody->ioStarted = agFALSE;
4453285242Sachim
4454285242Sachim  TI_DBG3(("satInquiryCB: did %d\n", tdsaDeviceData->id));
4455285242Sachim
4456285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
4457285242Sachim  {
4458285242Sachim    TI_DBG1(("satInquiryCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
4459285242Sachim    if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY)
4460285242Sachim    {
4461285242Sachim      TI_DBG1(("satInquiryCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
4462285242Sachim      /* should NOT be retried */
4463285242Sachim      ostiInitiatorIOCompleted (
4464285242Sachim                                tiRoot,
4465285242Sachim                                tiOrgIORequest,
4466285242Sachim                                tiIOFailed,
4467285242Sachim                                tiDetailNoLogin,
4468285242Sachim                                agNULL,
4469285242Sachim                                satOrgIOContext->interruptContext
4470285242Sachim                                );
4471285242Sachim    }
4472285242Sachim    else
4473285242Sachim    {
4474285242Sachim      TI_DBG1(("satInquiryCB: NOT OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
4475285242Sachim      ostiInitiatorIOCompleted (
4476285242Sachim                                tiRoot,
4477285242Sachim                                tiOrgIORequest,
4478285242Sachim                                tiIOFailed,
4479285242Sachim                                tiDetailNoLogin,
4480285242Sachim                                agNULL,
4481285242Sachim                                satOrgIOContext->interruptContext
4482285242Sachim                               );
4483285242Sachim    }
4484285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4485285242Sachim
4486285242Sachim    satFreeIntIoResource( tiRoot,
4487285242Sachim                          satDevData,
4488285242Sachim                          satIntIo);
4489285242Sachim    return;
4490285242Sachim  }
4491285242Sachim  if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED ||
4492285242Sachim      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION ||
4493285242Sachim      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
4494285242Sachim      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS ||
4495285242Sachim      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION ||
4496285242Sachim      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED ||
4497285242Sachim      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION ||
4498285242Sachim      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR ||
4499285242Sachim      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY
4500285242Sachim      )
4501285242Sachim  {
4502285242Sachim    TI_DBG1(("satInquiryCB: OSSA_IO_OPEN_CNX_ERROR\n"));
4503285242Sachim
4504285242Sachim    ostiInitiatorIOCompleted (
4505285242Sachim                             tiRoot,
4506285242Sachim                             tiOrgIORequest,
4507285242Sachim                             tiIOFailed,
4508285242Sachim                             tiDetailNoLogin,
4509285242Sachim                             agNULL,
4510285242Sachim                             satOrgIOContext->interruptContext
4511285242Sachim                             );
4512285242Sachim
4513285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4514285242Sachim
4515285242Sachim    satFreeIntIoResource( tiRoot,
4516285242Sachim                         satDevData,
4517285242Sachim                         satIntIo);
4518285242Sachim    return;
4519285242Sachim  }
4520285242Sachim
4521285242Sachim if ( agIOStatus != OSSA_IO_SUCCESS ||
4522285242Sachim      (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0)
4523285242Sachim    )
4524285242Sachim {
4525285242Sachim#ifdef  TD_DEBUG_ENABLE
4526285242Sachim   // only agsaFisPioSetup_t is expected
4527285242Sachim   satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
4528285242Sachim   ataStatus         = satPIOSetupHeader->status;   // ATA Status register
4529285242Sachim   ataError          = satPIOSetupHeader->error;    // ATA Eror register
4530285242Sachim#endif
4531285242Sachim   TI_DBG1(("satInquiryCB: ataStatus 0x%x ataError 0x%x\n", ataStatus, ataError));
4532285242Sachim   /* Process abort case */
4533285242Sachim   if (agIOStatus == OSSA_IO_ABORTED)
4534285242Sachim   {
4535285242Sachim     satProcessAbort(tiRoot,
4536285242Sachim                     tiOrgIORequest,
4537285242Sachim                     satOrgIOContext
4538285242Sachim                     );
4539285242Sachim
4540285242Sachim     satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4541285242Sachim
4542285242Sachim     satFreeIntIoResource( tiRoot,
4543285242Sachim                           satDevData,
4544285242Sachim                           satIntIo);
4545285242Sachim     return;
4546285242Sachim   }
4547285242Sachim
4548285242Sachim    ostiInitiatorIOCompleted (
4549285242Sachim                             tiRoot,
4550285242Sachim                             tiOrgIORequest,
4551285242Sachim                             tiIOFailed,
4552285242Sachim                             tiDetailOtherError,
4553285242Sachim                             agNULL,
4554285242Sachim                             satOrgIOContext->interruptContext
4555285242Sachim                             );
4556285242Sachim
4557285242Sachim   satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4558285242Sachim
4559285242Sachim   satFreeIntIoResource( tiRoot,
4560285242Sachim                         satDevData,
4561285242Sachim                         satIntIo);
4562285242Sachim   return;
4563285242Sachim  }
4564285242Sachim
4565285242Sachim /* success */
4566285242Sachim
4567285242Sachim
4568285242Sachim /* Convert to host endian */
4569285242Sachim tmpptr = (bit16*)(tiScsiRequest->sglVirtualAddr);
4570285242Sachim for (x=0; x < sizeof(agsaSATAIdentifyData_t)/sizeof(bit16); x++)
4571285242Sachim {
4572285242Sachim   OSSA_READ_LE_16(AGROOT, &tmpptr_tmp, tmpptr, 0);
4573285242Sachim   *tmpptr = tmpptr_tmp;
4574285242Sachim   tmpptr++;
4575285242Sachim   /*Print tmpptr_tmp here for debugging purpose*/
4576285242Sachim }
4577285242Sachim
4578285242Sachim pSATAIdData = (agsaSATAIdentifyData_t *)(tiScsiRequest->sglVirtualAddr);
4579285242Sachim
4580285242Sachim TI_DBG5(("satInquiryCB: OS satOrgIOContext %p \n", satOrgIOContext));
4581285242Sachim TI_DBG5(("satInquiryCB: TD satIOContext %p \n", satIOContext));
4582285242Sachim TI_DBG5(("satInquiryCB: OS tiScsiXchg %p \n", satOrgIOContext->tiScsiXchg));
4583285242Sachim TI_DBG5(("satInquiryCB: TD tiScsiXchg %p \n", satIOContext->tiScsiXchg));
4584285242Sachim
4585285242Sachim /* copy ID Dev data to satDevData */
4586285242Sachim satDevData->satIdentifyData = *pSATAIdData;
4587285242Sachim satDevData->IDDeviceValid = agTRUE;
4588285242Sachim#ifdef TD_INTERNAL_DEBUG
4589285242Sachim tdhexdump("satInquiryCB ID Dev data",(bit8 *)pSATAIdData, sizeof(agsaSATAIdentifyData_t));
4590285242Sachim tdhexdump("satInquiryCB Device ID Dev data",(bit8 *)&satDevData->satIdentifyData, sizeof(agsaSATAIdentifyData_t));
4591285242Sachim#endif
4592285242Sachim// tdhexdump("satInquiryCB Device ID Dev data",(bit8 *)&satDevData->satIdentifyData, sizeof(agsaSATAIdentifyData_t));
4593285242Sachim
4594285242Sachim /* set satDevData fields from IndentifyData */
4595285242Sachim satSetDevInfo(satDevData,pSATAIdData);
4596285242Sachim
4597285242Sachim  lenReceived = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4];
4598285242Sachim
4599285242Sachim  /* SPC-4, spec 6.4 p 141 */
4600285242Sachim  /* EVPD bit == 0 */
4601285242Sachim  if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK))
4602285242Sachim  {
4603285242Sachim    /* Returns the standard INQUIRY data */
4604285242Sachim    lenNeeded = STANDARD_INQUIRY_SIZE;
4605285242Sachim
4606285242Sachim
4607285242Sachim    satInquiryStandard(pInquiry, pSATAIdData, scsiCmnd);
4608285242Sachim    //tdhexdump("satInquiryCB ***standard***", (bit8 *)pInquiry, 36);
4609285242Sachim
4610285242Sachim  }
4611285242Sachim  else
4612285242Sachim  {
4613285242Sachim    /* EVPD bit != 0 && PAGE CODE != 0 */
4614285242Sachim    /* returns the pages of vital product data information */
4615285242Sachim
4616285242Sachim    /* we must support page 00h, 83h and 89h */
4617285242Sachim    page = scsiCmnd->cdb[2];
4618285242Sachim    if ((page != INQUIRY_SUPPORTED_VPD_PAGE) &&
4619285242Sachim        (page != INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE) &&
4620285242Sachim        (page != INQUIRY_ATA_INFORMATION_VPD_PAGE))
4621285242Sachim    {
4622285242Sachim      satSetSensePayload( pSense,
4623285242Sachim                          SCSI_SNSKEY_ILLEGAL_REQUEST,
4624285242Sachim                          0,
4625285242Sachim                          SCSI_SNSCODE_INVALID_FIELD_IN_CDB,
4626285242Sachim                          satOrgIOContext);
4627285242Sachim
4628285242Sachim      ostiInitiatorIOCompleted( tiRoot,
4629285242Sachim                                tiOrgIORequest,
4630285242Sachim                                tiIOSuccess,
4631285242Sachim                                SCSI_STAT_CHECK_CONDITION,
4632285242Sachim                                satOrgIOContext->pTiSenseData,
4633285242Sachim                                satOrgIOContext->interruptContext );
4634285242Sachim
4635285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4636285242Sachim
4637285242Sachim      satFreeIntIoResource( tiRoot,
4638285242Sachim                       satDevData,
4639285242Sachim                       satIntIo);
4640285242Sachim      TI_DBG1(("satInquiryCB: invalid PAGE CODE 0x%x\n", page));
4641285242Sachim      return;
4642285242Sachim    }
4643285242Sachim
4644285242Sachim    /* checking length */
4645285242Sachim    switch (page)
4646285242Sachim    {
4647285242Sachim    case INQUIRY_SUPPORTED_VPD_PAGE:
4648285242Sachim      lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 36 */
4649285242Sachim      break;
4650285242Sachim    case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4651285242Sachim      if (satDevData->satWWNSupport)
4652285242Sachim      {
4653285242Sachim        lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */
4654285242Sachim      }
4655285242Sachim      else
4656285242Sachim      {
4657285242Sachim        lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */
4658285242Sachim      }
4659285242Sachim      break;
4660285242Sachim    case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4661285242Sachim      lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */
4662285242Sachim      break;
4663285242Sachim    default:
4664285242Sachim      TI_DBG1(("satInquiryCB: wrong!!! invalid PAGE CODE 0x%x\n", page));
4665285242Sachim      break;
4666285242Sachim    }
4667285242Sachim
4668285242Sachim
4669285242Sachim    /*
4670285242Sachim     * Fill in the Inquiry data depending on what Inquiry data we are returning.
4671285242Sachim     */
4672285242Sachim    switch (page)
4673285242Sachim    {
4674285242Sachim    case INQUIRY_SUPPORTED_VPD_PAGE:
4675285242Sachim      satInquiryPage0(pInquiry, pSATAIdData);
4676285242Sachim      break;
4677285242Sachim    case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4678285242Sachim      satInquiryPage83(pInquiry, pSATAIdData, satDevData);
4679285242Sachim      break;
4680285242Sachim    case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4681285242Sachim      satInquiryPage89(pInquiry, pSATAIdData, satDevData);
4682285242Sachim      break;
4683285242Sachim    default:
4684285242Sachim      TI_DBG1(("satInquiryCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page));
4685285242Sachim      break;
4686285242Sachim    }
4687285242Sachim  } /* else */
4688285242Sachim
4689285242Sachim  TI_DBG6(("satInquiryCB: calling ostiInitiatorIOCompleted\n"));
4690285242Sachim
4691285242Sachim  if (lenReceived > lenNeeded)
4692285242Sachim  {
4693285242Sachim    TI_DBG6(("satInquiryCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n",
4694285242Sachim        lenNeeded, lenReceived, tiOrgIORequest));
4695285242Sachim
4696285242Sachim    ostiInitiatorIOCompleted( tiRoot,
4697285242Sachim                              tiOrgIORequest,
4698285242Sachim                              tiIOUnderRun,
4699285242Sachim                              lenReceived - lenNeeded,
4700285242Sachim                              agNULL,
4701285242Sachim                              satOrgIOContext->interruptContext );
4702285242Sachim  }
4703285242Sachim  else
4704285242Sachim  {
4705285242Sachim    ostiInitiatorIOCompleted( tiRoot,
4706285242Sachim                              tiOrgIORequest,
4707285242Sachim                              tiIOSuccess,
4708285242Sachim                              SCSI_STAT_GOOD,
4709285242Sachim                              agNULL,
4710285242Sachim                              satOrgIOContext->interruptContext);
4711285242Sachim  }
4712285242Sachim
4713285242Sachim  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4714285242Sachim
4715285242Sachim  satFreeIntIoResource( tiRoot,
4716285242Sachim                        satDevData,
4717285242Sachim                        satIntIo);
4718285242Sachim  TI_DBG5(("satInquiryCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO));
4719285242Sachim  TI_DBG6(("satInquiryCB: end\n"));
4720285242Sachim  return;
4721285242Sachim}
4722285242Sachim
4723285242Sachim
4724285242Sachim/*****************************************************************************/
4725285242Sachim/*! \brief satInquiryIntCB.
4726285242Sachim *
4727285242Sachim *  This function is part of INQUIRY SAT implementation. This is called when
4728285242Sachim *  ATA identify device data is available.
4729285242Sachim *
4730285242Sachim *  \param   tiRoot:           Pointer to TISA initiator driver/port instance.
4731285242Sachim *  \param   tiIORequest:      Pointer to TISA I/O request context for this I/O.
4732285242Sachim *  \param   tiDeviceHandle:   Pointer to TISA device handle for this I/O.
4733285242Sachim *  \param   tiScsiRequest:    Pointer to TISA SCSI I/O request and SGL list.
4734285242Sachim *  \param   satIOContext_t:   Pointer to the SAT IO Context
4735285242Sachim *
4736285242Sachim *  \return If command is started successfully
4737285242Sachim *    - \e tiSuccess:     I/O request successfully initiated.
4738285242Sachim *    - \e tiBusy:        No resources available, try again later.
4739285242Sachim *    - \e tiIONoDevice:  Invalid device handle.
4740285242Sachim *    - \e tiError:       Other errors.
4741285242Sachim */
4742285242Sachim/*****************************************************************************/
4743285242Sachimvoid satInquiryIntCB(
4744285242Sachim                   tiRoot_t                  *tiRoot,
4745285242Sachim                   tiIORequest_t             *tiIORequest,
4746285242Sachim                   tiDeviceHandle_t          *tiDeviceHandle,
4747285242Sachim                   tiScsiInitiatorRequest_t *tiScsiRequest,
4748285242Sachim                   satIOContext_t            *satIOContext
4749285242Sachim                   )
4750285242Sachim{
4751285242Sachim  scsiRspSense_t            *pSense;
4752285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
4753285242Sachim  satDeviceData_t           *satDevData;
4754285242Sachim  agsaSATAIdentifyData_t    *pSATAIdData;
4755285242Sachim
4756285242Sachim  bit8                      *pInquiry;
4757285242Sachim  bit8                      page = 0xFF;
4758285242Sachim  bit32                     lenReceived;
4759285242Sachim  bit32                     lenNeeded = 0;
4760285242Sachim
4761285242Sachim  TI_DBG6(("satInquiryIntCB: start\n"));
4762285242Sachim
4763285242Sachim  pSense      = satIOContext->pSense;
4764285242Sachim  scsiCmnd    = &tiScsiRequest->scsiCmnd;
4765285242Sachim  pInquiry    = (bit8 *) tiScsiRequest->sglVirtualAddr;
4766285242Sachim  satDevData = satIOContext->pSatDevData;
4767285242Sachim  pSATAIdData = &satDevData->satIdentifyData;
4768285242Sachim
4769285242Sachim
4770285242Sachim  lenReceived = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4];
4771285242Sachim
4772285242Sachim  /* SPC-4, spec 6.4 p 141 */
4773285242Sachim  /* EVPD bit == 0 */
4774285242Sachim  if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK))
4775285242Sachim  {
4776285242Sachim    /* Returns the standard INQUIRY data */
4777285242Sachim    lenNeeded = STANDARD_INQUIRY_SIZE;
4778285242Sachim
4779285242Sachim     satInquiryStandard(pInquiry, pSATAIdData, scsiCmnd);
4780285242Sachim    //tdhexdump("satInquiryIntCB ***standard***", (bit8 *)pInquiry, 36);
4781285242Sachim
4782285242Sachim  }
4783285242Sachim  else
4784285242Sachim  {
4785285242Sachim    /* EVPD bit != 0 && PAGE CODE != 0 */
4786285242Sachim    /* returns the pages of vital product data information */
4787285242Sachim
4788285242Sachim    /* we must support page 00h, 83h and 89h */
4789285242Sachim    page = scsiCmnd->cdb[2];
4790285242Sachim    if ((page != INQUIRY_SUPPORTED_VPD_PAGE) &&
4791285242Sachim        (page != INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE) &&
4792285242Sachim        (page != INQUIRY_ATA_INFORMATION_VPD_PAGE) &&
4793285242Sachim        (page != INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE))
4794285242Sachim    {
4795285242Sachim      satSetSensePayload( pSense,
4796285242Sachim                          SCSI_SNSKEY_ILLEGAL_REQUEST,
4797285242Sachim                          0,
4798285242Sachim                          SCSI_SNSCODE_INVALID_FIELD_IN_CDB,
4799285242Sachim                          satIOContext);
4800285242Sachim
4801285242Sachim      ostiInitiatorIOCompleted( tiRoot,
4802285242Sachim                                tiIORequest,
4803285242Sachim                                tiIOSuccess,
4804285242Sachim                                SCSI_STAT_CHECK_CONDITION,
4805285242Sachim                                satIOContext->pTiSenseData,
4806285242Sachim                                satIOContext->interruptContext );
4807285242Sachim
4808285242Sachim      TI_DBG1(("satInquiryIntCB: invalid PAGE CODE 0x%x\n", page));
4809285242Sachim      return;
4810285242Sachim    }
4811285242Sachim
4812285242Sachim    /* checking length */
4813285242Sachim    switch (page)
4814285242Sachim    {
4815285242Sachim    case INQUIRY_SUPPORTED_VPD_PAGE:
4816285242Sachim      lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 36 */
4817285242Sachim      break;
4818285242Sachim    case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4819285242Sachim      if (satDevData->satWWNSupport)
4820285242Sachim      {
4821285242Sachim        lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */
4822285242Sachim      }
4823285242Sachim      else
4824285242Sachim      {
4825285242Sachim        lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */
4826285242Sachim      }
4827285242Sachim      break;
4828285242Sachim    case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4829285242Sachim      lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */
4830285242Sachim      break;
4831285242Sachim    case INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE:
4832285242Sachim      lenNeeded = SATA_PAGE80_INQUIRY_SIZE; /* 24 */
4833285242Sachim      break;
4834285242Sachim
4835285242Sachim    default:
4836285242Sachim      TI_DBG1(("satInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page));
4837285242Sachim      break;
4838285242Sachim    }
4839285242Sachim
4840285242Sachim
4841285242Sachim    /*
4842285242Sachim     * Fill in the Inquiry data depending on what Inquiry data we are returning.
4843285242Sachim     */
4844285242Sachim    switch (page)
4845285242Sachim    {
4846285242Sachim    case INQUIRY_SUPPORTED_VPD_PAGE:
4847285242Sachim      satInquiryPage0(pInquiry, pSATAIdData);
4848285242Sachim      break;
4849285242Sachim    case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4850285242Sachim      satInquiryPage83(pInquiry, pSATAIdData, satDevData);
4851285242Sachim      break;
4852285242Sachim    case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4853285242Sachim      satInquiryPage89(pInquiry, pSATAIdData, satDevData);
4854285242Sachim      break;
4855285242Sachim    case INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE:
4856285242Sachim      satInquiryPage80(pInquiry, pSATAIdData);
4857285242Sachim      break;
4858285242Sachim    default:
4859285242Sachim      TI_DBG1(("satInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page));
4860285242Sachim      break;
4861285242Sachim    }
4862285242Sachim  } /* else */
4863285242Sachim
4864285242Sachim  TI_DBG6(("satInquiryIntCB: calling ostiInitiatorIOCompleted\n"));
4865285242Sachim
4866285242Sachim  if (lenReceived > lenNeeded)
4867285242Sachim  {
4868285242Sachim    TI_DBG6(("satInquiryIntCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n",
4869285242Sachim        lenNeeded, lenReceived, tiIORequest));
4870285242Sachim
4871285242Sachim    ostiInitiatorIOCompleted( tiRoot,
4872285242Sachim                              tiIORequest,
4873285242Sachim                              tiIOUnderRun,
4874285242Sachim                              lenReceived - lenNeeded,
4875285242Sachim                              agNULL,
4876285242Sachim                              satIOContext->interruptContext );
4877285242Sachim  }
4878285242Sachim  else
4879285242Sachim  {
4880285242Sachim    ostiInitiatorIOCompleted( tiRoot,
4881285242Sachim                            tiIORequest,
4882285242Sachim                            tiIOSuccess,
4883285242Sachim                            SCSI_STAT_GOOD,
4884285242Sachim                            agNULL,
4885285242Sachim                            satIOContext->interruptContext);
4886285242Sachim  }
4887285242Sachim
4888285242Sachim  TI_DBG5(("satInquiryIntCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO));
4889285242Sachim  TI_DBG6(("satInquiryIntCB: end\n"));
4890285242Sachim  return;
4891285242Sachim}
4892285242Sachim
4893285242Sachim
4894285242Sachim/*****************************************************************************
4895285242Sachim*! \brief  satVerify10CB
4896285242Sachim*
4897285242Sachim*   This routine is a callback function called from ossaSATACompleted().
4898285242Sachim*   This CB routine deals with Verify(10) completion.
4899285242Sachim*
4900285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
4901285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
4902285242Sachim*  \param   agIOStatus:  Status of completed I/O.
4903285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
4904285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
4905285242Sachim*                        length.
4906285242Sachim*  \param   agParam:     Additional info based on status.
4907285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
4908285242Sachim*
4909285242Sachim*  \return: none
4910285242Sachim*
4911285242Sachim*****************************************************************************/
4912285242Sachimvoid satVerify10CB(
4913285242Sachim                   agsaRoot_t        *agRoot,
4914285242Sachim                   agsaIORequest_t   *agIORequest,
4915285242Sachim                   bit32             agIOStatus,
4916285242Sachim                   agsaFisHeader_t   *agFirstDword,
4917285242Sachim                   bit32             agIOInfoLen,
4918285242Sachim                   void              *agParam,
4919285242Sachim                   void              *ioContext
4920285242Sachim                   )
4921285242Sachim{
4922285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
4923285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
4924285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
4925285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
4926285242Sachim  tdIORequestBody_t       *tdIORequestBody;
4927285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
4928285242Sachim  satIOContext_t          *satIOContext;
4929285242Sachim  satIOContext_t          *satOrgIOContext;
4930285242Sachim  satInternalIo_t         *satIntIo;
4931285242Sachim  satDeviceData_t         *satDevData;
4932285242Sachim  scsiRspSense_t            *pSense;
4933285242Sachim  tiIORequest_t             *tiOrgIORequest;
4934285242Sachim
4935285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
4936285242Sachim  bit32                     ataStatus = 0;
4937285242Sachim  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
4938285242Sachim
4939285242Sachim  TI_DBG5(("satVerify10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
4940285242Sachim
4941285242Sachim  /* internally generate tiIOContext */
4942285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
4943285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
4944285242Sachim  satIntIo               = satIOContext->satIntIoContext;
4945285242Sachim  satDevData             = satIOContext->pSatDevData;
4946285242Sachim  hostToDevFis           = satIOContext->pFis;
4947285242Sachim
4948285242Sachim  if (satIntIo == agNULL)
4949285242Sachim  {
4950285242Sachim    TI_DBG4(("satVerify10CB: External satInternalIo_t satIntIoContext\n"));
4951285242Sachim    satOrgIOContext = satIOContext;
4952285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
4953285242Sachim    pSense          = satIOContext->pSense;
4954285242Sachim  }
4955285242Sachim  else
4956285242Sachim  {
4957285242Sachim    TI_DBG4(("satVerify10CB: Internal satInternalIo_t satIntIoContext\n"));
4958285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
4959285242Sachim    if (satOrgIOContext == agNULL)
4960285242Sachim    {
4961285242Sachim      TI_DBG4(("satVerify10CB: satOrgIOContext is NULL, wrong\n"));
4962285242Sachim      return;
4963285242Sachim    }
4964285242Sachim    else
4965285242Sachim    {
4966285242Sachim      TI_DBG4(("satVerify10CB: satOrgIOContext is NOT NULL\n"));
4967285242Sachim    }
4968285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
4969285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
4970285242Sachim    pSense        = satOrgIOContext->pSense;
4971285242Sachim  }
4972285242Sachim
4973285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
4974285242Sachim  tdIORequestBody->ioStarted = agFALSE;
4975285242Sachim
4976285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
4977285242Sachim  {
4978285242Sachim     TI_DBG1(("satVerify10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
4979285242Sachim     satSetSensePayload( pSense,
4980285242Sachim                        SCSI_SNSKEY_NO_SENSE,
4981285242Sachim                        0,
4982285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
4983285242Sachim                        satOrgIOContext);
4984285242Sachim
4985285242Sachim     ostiInitiatorIOCompleted( tiRoot,
4986285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
4987285242Sachim                              tiIOSuccess,
4988285242Sachim                              SCSI_STAT_CHECK_CONDITION,
4989285242Sachim                              satOrgIOContext->pTiSenseData,
4990285242Sachim                              satOrgIOContext->interruptContext );
4991285242Sachim
4992285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4993285242Sachim
4994285242Sachim    satFreeIntIoResource( tiRoot,
4995285242Sachim                          satDevData,
4996285242Sachim                          satIntIo);
4997285242Sachim    return;
4998285242Sachim  }
4999285242Sachim
5000285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
5001285242Sachim  {
5002285242Sachim    /* only agsaFisRegDeviceToHost_t is expected */
5003285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5004285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
5005285242Sachim  }
5006285242Sachim
5007285242Sachim  if( agIOStatus != OSSA_IO_SUCCESS)
5008285242Sachim  {
5009285242Sachim  if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5010285242Sachim       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5011285242Sachim       )
5012285242Sachim  {
5013285242Sachim    /* for debugging */
5014285242Sachim    if( agIOStatus != OSSA_IO_SUCCESS)
5015285242Sachim    {
5016285242Sachim      TI_DBG1(("satVerify10CB: FAILED, NOT IO_SUCCESS\n"));
5017285242Sachim    }
5018285242Sachim    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5019285242Sachim    {
5020285242Sachim      TI_DBG1(("satVerify10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5021285242Sachim    }
5022285242Sachim    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5023285242Sachim              (ataStatus & DF_ATA_STATUS_MASK)
5024285242Sachim              )
5025285242Sachim    {
5026285242Sachim      TI_DBG1(("satVerify10CB: FAILED, FAILED, error status\n"));
5027285242Sachim    }
5028285242Sachim
5029285242Sachim    /* Process abort case */
5030285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
5031285242Sachim    {
5032285242Sachim      satProcessAbort(tiRoot,
5033285242Sachim                      tiOrgIORequest,
5034285242Sachim                      satOrgIOContext
5035285242Sachim                      );
5036285242Sachim
5037285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5038285242Sachim
5039285242Sachim      satFreeIntIoResource( tiRoot,
5040285242Sachim                            satDevData,
5041285242Sachim                            satIntIo);
5042285242Sachim      return;
5043285242Sachim    }
5044285242Sachim
5045285242Sachim    /* for debugging */
5046285242Sachim    switch (hostToDevFis->h.command)
5047285242Sachim    {
5048285242Sachim    case SAT_READ_VERIFY_SECTORS_EXT:
5049285242Sachim      TI_DBG1(("satVerify10CB: SAT_READ_VERIFY_SECTORS_EXT\n"));
5050285242Sachim      break;
5051285242Sachim    default:
5052285242Sachim      TI_DBG1(("satVerify10CB: error default case command 0x%x\n", hostToDevFis->h.command));
5053285242Sachim      break;
5054285242Sachim    }
5055285242Sachim
5056285242Sachim    satSetSensePayload( pSense,
5057285242Sachim                        SCSI_SNSKEY_NO_SENSE,
5058285242Sachim                        0,
5059285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5060285242Sachim                        satOrgIOContext);
5061285242Sachim
5062285242Sachim    ostiInitiatorIOCompleted( tiRoot,
5063285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5064285242Sachim                              tiIOSuccess,
5065285242Sachim                              SCSI_STAT_CHECK_CONDITION,
5066285242Sachim                              satOrgIOContext->pTiSenseData,
5067285242Sachim                              satOrgIOContext->interruptContext );
5068285242Sachim
5069285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5070285242Sachim
5071285242Sachim    satFreeIntIoResource( tiRoot,
5072285242Sachim                          satDevData,
5073285242Sachim                          satIntIo);
5074285242Sachim    return;
5075285242Sachim  } /* end error checking */
5076285242Sachim  }
5077285242Sachim
5078285242Sachim  /* process success from this point on */
5079285242Sachim  switch (hostToDevFis->h.command)
5080285242Sachim  {
5081285242Sachim  case SAT_READ_VERIFY_SECTORS_EXT:
5082285242Sachim    TI_DBG5(("satVerify10CB: SAT_WRITE_DMA_EXT success \n"));
5083285242Sachim
5084285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5085285242Sachim
5086285242Sachim    satFreeIntIoResource( tiRoot,
5087285242Sachim                          satDevData,
5088285242Sachim                          satIntIo);
5089285242Sachim
5090285242Sachim    ostiInitiatorIOCompleted( tiRoot,
5091285242Sachim                              tiOrgIORequest,
5092285242Sachim                              tiIOSuccess,
5093285242Sachim                              SCSI_STAT_GOOD,
5094285242Sachim                              agNULL,
5095285242Sachim                              satOrgIOContext->interruptContext);
5096285242Sachim    break;
5097285242Sachim  default:
5098285242Sachim    TI_DBG1(("satVerify10CB: success but error default case command 0x%x\n", hostToDevFis->h.command));
5099285242Sachim
5100285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5101285242Sachim
5102285242Sachim    satFreeIntIoResource( tiRoot,
5103285242Sachim                          satDevData,
5104285242Sachim                          satIntIo);
5105285242Sachim
5106285242Sachim    satSetSensePayload( pSense,
5107285242Sachim                        SCSI_SNSKEY_NO_SENSE,
5108285242Sachim                        0,
5109285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5110285242Sachim                        satOrgIOContext);
5111285242Sachim
5112285242Sachim    ostiInitiatorIOCompleted( tiRoot,
5113285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5114285242Sachim                              tiIOSuccess,
5115285242Sachim                              SCSI_STAT_CHECK_CONDITION,
5116285242Sachim                              satOrgIOContext->pTiSenseData,
5117285242Sachim                              satOrgIOContext->interruptContext );
5118285242Sachim
5119285242Sachim    break;
5120285242Sachim  }
5121285242Sachim
5122285242Sachim  return;
5123285242Sachim}
5124285242Sachim
5125285242Sachim/* similar to satVerify10CB */
5126285242Sachimvoid satNonChainedVerifyCB(
5127285242Sachim                           agsaRoot_t        *agRoot,
5128285242Sachim                           agsaIORequest_t   *agIORequest,
5129285242Sachim                           bit32             agIOStatus,
5130285242Sachim                           agsaFisHeader_t   *agFirstDword,
5131285242Sachim                           bit32             agIOInfoLen,
5132285242Sachim                           agsaFrameHandle_t agFrameHandle,
5133285242Sachim                           void              *ioContext
5134285242Sachim                           )
5135285242Sachim{
5136285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
5137285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
5138285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
5139285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5140285242Sachim  tdIORequestBody_t       *tdIORequestBody;
5141285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
5142285242Sachim  satIOContext_t          *satIOContext;
5143285242Sachim  satIOContext_t          *satOrgIOContext;
5144285242Sachim  satInternalIo_t         *satIntIo;
5145285242Sachim  satDeviceData_t         *satDevData;
5146285242Sachim  scsiRspSense_t            *pSense;
5147285242Sachim  tiIORequest_t             *tiOrgIORequest;
5148285242Sachim
5149285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
5150285242Sachim  bit32                     ataStatus = 0;
5151285242Sachim  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
5152285242Sachim
5153285242Sachim  TI_DBG5(("satNonChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5154285242Sachim
5155285242Sachim  /* internally generate tiIOContext */
5156285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
5157285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
5158285242Sachim  satIntIo               = satIOContext->satIntIoContext;
5159285242Sachim  satDevData             = satIOContext->pSatDevData;
5160285242Sachim  hostToDevFis           = satIOContext->pFis;
5161285242Sachim
5162285242Sachim  if (satIntIo == agNULL)
5163285242Sachim  {
5164285242Sachim    TI_DBG4(("satNonChainedVerifyCB: External satInternalIo_t satIntIoContext\n"));
5165285242Sachim    satOrgIOContext = satIOContext;
5166285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
5167285242Sachim    pSense          = satIOContext->pSense;
5168285242Sachim  }
5169285242Sachim  else
5170285242Sachim  {
5171285242Sachim    TI_DBG4(("satNonChainedVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
5172285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
5173285242Sachim    if (satOrgIOContext == agNULL)
5174285242Sachim    {
5175285242Sachim      TI_DBG4(("satNonChainedVerifyCB: satOrgIOContext is NULL, wrong\n"));
5176285242Sachim      return;
5177285242Sachim    }
5178285242Sachim    else
5179285242Sachim    {
5180285242Sachim      TI_DBG4(("satNonChainedVerifyCB: satOrgIOContext is NOT NULL\n"));
5181285242Sachim    }
5182285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
5183285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
5184285242Sachim    pSense        = satOrgIOContext->pSense;
5185285242Sachim  }
5186285242Sachim
5187285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
5188285242Sachim  tdIORequestBody->ioStarted = agFALSE;
5189285242Sachim
5190285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5191285242Sachim  {
5192285242Sachim     TI_DBG1(("satNonChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
5193285242Sachim     satSetSensePayload( pSense,
5194285242Sachim                        SCSI_SNSKEY_NO_SENSE,
5195285242Sachim                        0,
5196285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5197285242Sachim                        satOrgIOContext);
5198285242Sachim
5199285242Sachim     ostiInitiatorIOCompleted( tiRoot,
5200285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5201285242Sachim                              tiIOSuccess,
5202285242Sachim                              SCSI_STAT_CHECK_CONDITION,
5203285242Sachim                              satOrgIOContext->pTiSenseData,
5204285242Sachim                              satOrgIOContext->interruptContext );
5205285242Sachim
5206285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5207285242Sachim
5208285242Sachim    satFreeIntIoResource( tiRoot,
5209285242Sachim                          satDevData,
5210285242Sachim                          satIntIo);
5211285242Sachim    return;
5212285242Sachim  }
5213285242Sachim
5214285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
5215285242Sachim  {
5216285242Sachim    /* only agsaFisRegDeviceToHost_t is expected */
5217285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5218285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
5219285242Sachim  }
5220285242Sachim
5221285242Sachim  if( agIOStatus != OSSA_IO_SUCCESS)
5222285242Sachim  {
5223285242Sachim    if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5224285242Sachim         ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5225285242Sachim         )
5226285242Sachim    {
5227285242Sachim      /* for debugging */
5228285242Sachim      if( agIOStatus != OSSA_IO_SUCCESS)
5229285242Sachim      {
5230285242Sachim        TI_DBG1(("satNonChainedVerifyCB: FAILED, NOT IO_SUCCESS\n"));
5231285242Sachim      }
5232285242Sachim      else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5233285242Sachim      {
5234285242Sachim        TI_DBG1(("satNonChainedVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5235285242Sachim      }
5236285242Sachim      else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5237285242Sachim                (ataStatus & DF_ATA_STATUS_MASK)
5238285242Sachim                )
5239285242Sachim      {
5240285242Sachim        TI_DBG1(("satNonChainedVerifyCB: FAILED, FAILED, error status\n"));
5241285242Sachim      }
5242285242Sachim
5243285242Sachim      /* Process abort case */
5244285242Sachim      if (agIOStatus == OSSA_IO_ABORTED)
5245285242Sachim      {
5246285242Sachim        satProcessAbort(tiRoot,
5247285242Sachim                        tiOrgIORequest,
5248285242Sachim                        satOrgIOContext
5249285242Sachim                        );
5250285242Sachim
5251285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5252285242Sachim
5253285242Sachim        satFreeIntIoResource( tiRoot,
5254285242Sachim                              satDevData,
5255285242Sachim                              satIntIo);
5256285242Sachim        return;
5257285242Sachim      }
5258285242Sachim
5259285242Sachim      /* for debugging */
5260285242Sachim      switch (hostToDevFis->h.command)
5261285242Sachim      {
5262285242Sachim      case SAT_READ_VERIFY_SECTORS:
5263285242Sachim        TI_DBG1(("satNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS\n"));
5264285242Sachim        break;
5265285242Sachim      case SAT_READ_VERIFY_SECTORS_EXT:
5266285242Sachim        TI_DBG1(("satNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n"));
5267285242Sachim        break;
5268285242Sachim      default:
5269285242Sachim        TI_DBG1(("satNonChainedVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command));
5270285242Sachim        break;
5271285242Sachim      }
5272285242Sachim
5273285242Sachim      satSetSensePayload( pSense,
5274285242Sachim                          SCSI_SNSKEY_NO_SENSE,
5275285242Sachim                          0,
5276285242Sachim                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5277285242Sachim                          satOrgIOContext);
5278285242Sachim
5279285242Sachim      ostiInitiatorIOCompleted( tiRoot,
5280285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5281285242Sachim                                tiIOSuccess,
5282285242Sachim                                SCSI_STAT_CHECK_CONDITION,
5283285242Sachim                                satOrgIOContext->pTiSenseData,
5284285242Sachim                                satOrgIOContext->interruptContext );
5285285242Sachim
5286285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5287285242Sachim
5288285242Sachim      satFreeIntIoResource( tiRoot,
5289285242Sachim                            satDevData,
5290285242Sachim                            satIntIo);
5291285242Sachim      return;
5292285242Sachim    } /* end error checking */
5293285242Sachim  }
5294285242Sachim
5295285242Sachim  /* process success from this point on */
5296285242Sachim  switch (hostToDevFis->h.command)
5297285242Sachim  {
5298285242Sachim  case SAT_READ_VERIFY_SECTORS: /* fall through */
5299285242Sachim  case SAT_READ_VERIFY_SECTORS_EXT:
5300285242Sachim    TI_DBG5(("satNonChainedVerifyCB: SAT_WRITE_DMA_EXT success \n"));
5301285242Sachim
5302285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5303285242Sachim
5304285242Sachim    satFreeIntIoResource( tiRoot,
5305285242Sachim                          satDevData,
5306285242Sachim                          satIntIo);
5307285242Sachim
5308285242Sachim    ostiInitiatorIOCompleted( tiRoot,
5309285242Sachim                              tiOrgIORequest,
5310285242Sachim                              tiIOSuccess,
5311285242Sachim                              SCSI_STAT_GOOD,
5312285242Sachim                              agNULL,
5313285242Sachim                              satOrgIOContext->interruptContext);
5314285242Sachim    break;
5315285242Sachim  default:
5316285242Sachim    TI_DBG1(("satNonChainedVerifyCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
5317285242Sachim
5318285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5319285242Sachim
5320285242Sachim    satFreeIntIoResource( tiRoot,
5321285242Sachim                          satDevData,
5322285242Sachim                          satIntIo);
5323285242Sachim
5324285242Sachim    satSetSensePayload( pSense,
5325285242Sachim                        SCSI_SNSKEY_NO_SENSE,
5326285242Sachim                        0,
5327285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5328285242Sachim                        satOrgIOContext);
5329285242Sachim
5330285242Sachim    ostiInitiatorIOCompleted( tiRoot,
5331285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5332285242Sachim                              tiIOSuccess,
5333285242Sachim                              SCSI_STAT_CHECK_CONDITION,
5334285242Sachim                              satOrgIOContext->pTiSenseData,
5335285242Sachim                              satOrgIOContext->interruptContext );
5336285242Sachim
5337285242Sachim    break;
5338285242Sachim  }
5339285242Sachim
5340285242Sachim  return;
5341285242Sachim}
5342285242Sachim
5343285242Sachimvoid satChainedVerifyCB(
5344285242Sachim                           agsaRoot_t        *agRoot,
5345285242Sachim                           agsaIORequest_t   *agIORequest,
5346285242Sachim                           bit32             agIOStatus,
5347285242Sachim                           agsaFisHeader_t   *agFirstDword,
5348285242Sachim                           bit32             agIOInfoLen,
5349285242Sachim                           agsaFrameHandle_t agFrameHandle,
5350285242Sachim                           void              *ioContext
5351285242Sachim                           )
5352285242Sachim{
5353285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
5354285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
5355285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
5356285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5357285242Sachim  tdIORequestBody_t       *tdIORequestBody;
5358285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
5359285242Sachim  satIOContext_t          *satIOContext;
5360285242Sachim  satIOContext_t          *satOrgIOContext;
5361285242Sachim  satIOContext_t          *satNewIOContext;
5362285242Sachim  satInternalIo_t         *satIntIo;
5363285242Sachim  satInternalIo_t         *satNewIntIo = agNULL;
5364285242Sachim  satDeviceData_t         *satDevData;
5365285242Sachim  scsiRspSense_t            *pSense;
5366285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
5367285242Sachim  tiIORequest_t             *tiOrgIORequest;
5368285242Sachim
5369285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
5370285242Sachim  bit32                     ataStatus = 0;
5371285242Sachim  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
5372285242Sachim  bit32                     status = tiError;
5373285242Sachim  bit32                     dataLength;
5374285242Sachim
5375285242Sachim  TI_DBG5(("satChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5376285242Sachim
5377285242Sachim  /* internally generate tiIOContext */
5378285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
5379285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
5380285242Sachim  satIntIo               = satIOContext->satIntIoContext;
5381285242Sachim  satDevData             = satIOContext->pSatDevData;
5382285242Sachim  hostToDevFis           = satIOContext->pFis;
5383285242Sachim
5384285242Sachim  if (satIntIo == agNULL)
5385285242Sachim  {
5386285242Sachim    TI_DBG4(("satChainedVerifyCB: External satInternalIo_t satIntIoContext\n"));
5387285242Sachim    satOrgIOContext = satIOContext;
5388285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
5389285242Sachim    pSense          = satIOContext->pSense;
5390285242Sachim    scsiCmnd        = satIOContext->pScsiCmnd;
5391285242Sachim  }
5392285242Sachim  else
5393285242Sachim  {
5394285242Sachim    TI_DBG4(("satChainedVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
5395285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
5396285242Sachim    if (satOrgIOContext == agNULL)
5397285242Sachim    {
5398285242Sachim      TI_DBG4(("satChainedVerifyCB: satOrgIOContext is NULL, wrong\n"));
5399285242Sachim      return;
5400285242Sachim    }
5401285242Sachim    else
5402285242Sachim    {
5403285242Sachim      TI_DBG4(("satChainedVerifyCB: satOrgIOContext is NOT NULL\n"));
5404285242Sachim    }
5405285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
5406285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
5407285242Sachim    pSense        = satOrgIOContext->pSense;
5408285242Sachim    scsiCmnd      = satOrgIOContext->pScsiCmnd;
5409285242Sachim  }
5410285242Sachim
5411285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
5412285242Sachim  tdIORequestBody->ioStarted = agFALSE;
5413285242Sachim
5414285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5415285242Sachim  {
5416285242Sachim     TI_DBG1(("satChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
5417285242Sachim     satSetSensePayload( pSense,
5418285242Sachim                        SCSI_SNSKEY_NO_SENSE,
5419285242Sachim                        0,
5420285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5421285242Sachim                        satOrgIOContext);
5422285242Sachim
5423285242Sachim     ostiInitiatorIOCompleted( tiRoot,
5424285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5425285242Sachim                              tiIOSuccess,
5426285242Sachim                              SCSI_STAT_CHECK_CONDITION,
5427285242Sachim                              satOrgIOContext->pTiSenseData,
5428285242Sachim                              satOrgIOContext->interruptContext );
5429285242Sachim
5430285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5431285242Sachim
5432285242Sachim    satFreeIntIoResource( tiRoot,
5433285242Sachim                          satDevData,
5434285242Sachim                          satIntIo);
5435285242Sachim    return;
5436285242Sachim  }
5437285242Sachim
5438285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
5439285242Sachim  {
5440285242Sachim    /* only agsaFisRegDeviceToHost_t is expected */
5441285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5442285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
5443285242Sachim  }
5444285242Sachim
5445285242Sachim  if( agIOStatus != OSSA_IO_SUCCESS)
5446285242Sachim  {
5447285242Sachim    if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5448285242Sachim         ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5449285242Sachim         )
5450285242Sachim    {
5451285242Sachim      /* for debugging */
5452285242Sachim      if( agIOStatus != OSSA_IO_SUCCESS)
5453285242Sachim      {
5454285242Sachim        TI_DBG1(("satChainedVerifyCB: FAILED, NOT IO_SUCCESS\n"));
5455285242Sachim      }
5456285242Sachim      else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5457285242Sachim      {
5458285242Sachim        TI_DBG1(("satChainedVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5459285242Sachim      }
5460285242Sachim      else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5461285242Sachim                (ataStatus & DF_ATA_STATUS_MASK)
5462285242Sachim                )
5463285242Sachim      {
5464285242Sachim        TI_DBG1(("satChainedVerifyCB: FAILED, FAILED, error status\n"));
5465285242Sachim      }
5466285242Sachim
5467285242Sachim      /* Process abort case */
5468285242Sachim      if (agIOStatus == OSSA_IO_ABORTED)
5469285242Sachim      {
5470285242Sachim        satProcessAbort(tiRoot,
5471285242Sachim                        tiOrgIORequest,
5472285242Sachim                        satOrgIOContext
5473285242Sachim                        );
5474285242Sachim
5475285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5476285242Sachim
5477285242Sachim        satFreeIntIoResource( tiRoot,
5478285242Sachim                              satDevData,
5479285242Sachim                              satIntIo);
5480285242Sachim        return;
5481285242Sachim      }
5482285242Sachim
5483285242Sachim      /* for debugging */
5484285242Sachim      switch (hostToDevFis->h.command)
5485285242Sachim      {
5486285242Sachim      case SAT_READ_VERIFY_SECTORS:
5487285242Sachim        TI_DBG1(("satChainedVerifyCB: SAT_READ_VERIFY_SECTORS\n"));
5488285242Sachim        break;
5489285242Sachim      case SAT_READ_VERIFY_SECTORS_EXT:
5490285242Sachim        TI_DBG1(("satChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n"));
5491285242Sachim        break;
5492285242Sachim      default:
5493285242Sachim        TI_DBG1(("satChainedVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command));
5494285242Sachim        break;
5495285242Sachim      }
5496285242Sachim
5497285242Sachim      satSetSensePayload( pSense,
5498285242Sachim                          SCSI_SNSKEY_NO_SENSE,
5499285242Sachim                          0,
5500285242Sachim                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5501285242Sachim                          satOrgIOContext);
5502285242Sachim
5503285242Sachim      ostiInitiatorIOCompleted( tiRoot,
5504285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5505285242Sachim                                tiIOSuccess,
5506285242Sachim                                SCSI_STAT_CHECK_CONDITION,
5507285242Sachim                                satOrgIOContext->pTiSenseData,
5508285242Sachim                                satOrgIOContext->interruptContext );
5509285242Sachim
5510285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5511285242Sachim
5512285242Sachim      satFreeIntIoResource( tiRoot,
5513285242Sachim                            satDevData,
5514285242Sachim                            satIntIo);
5515285242Sachim      return;
5516285242Sachim    } /* end error checking */
5517285242Sachim  }
5518285242Sachim
5519285242Sachim  /* process success from this point on */
5520285242Sachim  switch (hostToDevFis->h.command)
5521285242Sachim  {
5522285242Sachim  case SAT_READ_VERIFY_SECTORS: /* fall through */
5523285242Sachim  case SAT_READ_VERIFY_SECTORS_EXT:
5524285242Sachim    TI_DBG5(("satChainedVerifyCB: SAT_WRITE_DMA_EXT success \n"));
5525285242Sachim
5526285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5527285242Sachim
5528285242Sachim    satFreeIntIoResource( tiRoot,
5529285242Sachim                          satDevData,
5530285242Sachim                          satIntIo);
5531285242Sachim
5532285242Sachim    /* let's loop till TL */
5533285242Sachim
5534285242Sachim    /* lba = lba + tl
5535285242Sachim       loopnum--;
5536285242Sachim       if (loopnum == 0) done
5537285242Sachim     */
5538285242Sachim    (satOrgIOContext->LoopNum)--;
5539285242Sachim    if (satOrgIOContext->LoopNum == 0)
5540285242Sachim    {
5541285242Sachim      /*
5542285242Sachim        done with write and verify
5543285242Sachim      */
5544285242Sachim      ostiInitiatorIOCompleted( tiRoot,
5545285242Sachim
5546285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5547285242Sachim                                tiIOSuccess,
5548285242Sachim                                SCSI_STAT_GOOD,
5549285242Sachim                                agNULL,
5550285242Sachim                                satOrgIOContext->interruptContext );
5551285242Sachim      return;
5552285242Sachim    }
5553285242Sachim
5554285242Sachim    if (satOrgIOContext->superIOFlag)
5555285242Sachim    {
5556285242Sachim      dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
5557285242Sachim    }
5558285242Sachim    else
5559285242Sachim    {
5560285242Sachim      dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
5561285242Sachim    }
5562285242Sachim
5563285242Sachim    satNewIntIo = satAllocIntIoResource( tiRoot,
5564285242Sachim                                         tiOrgIORequest,
5565285242Sachim                                         satDevData,
5566285242Sachim                                         dataLength,
5567285242Sachim                                         satNewIntIo);
5568285242Sachim    if (satNewIntIo == agNULL)
5569285242Sachim    {
5570285242Sachim      /* memory allocation failure */
5571285242Sachim      satFreeIntIoResource( tiRoot,
5572285242Sachim                            satDevData,
5573285242Sachim                            satNewIntIo);
5574285242Sachim      ostiInitiatorIOCompleted( tiRoot,
5575285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5576285242Sachim                                tiIOFailed,
5577285242Sachim                                tiDetailOtherError,
5578285242Sachim                                agNULL,
5579285242Sachim                                satOrgIOContext->interruptContext );
5580285242Sachim
5581285242Sachim      TI_DBG1(("satChainedVerifyCB: momory allocation fails\n"));
5582285242Sachim      return;
5583285242Sachim    } /* end of memory allocation failure */
5584285242Sachim
5585285242Sachim    /*
5586285242Sachim     * Need to initialize all the fields within satIOContext
5587285242Sachim     */
5588285242Sachim
5589285242Sachim    satNewIOContext = satPrepareNewIO(
5590285242Sachim                                      satNewIntIo,
5591285242Sachim                                      tiOrgIORequest,
5592285242Sachim                                      satDevData,
5593285242Sachim                                      scsiCmnd,
5594285242Sachim                                      satOrgIOContext
5595285242Sachim                                      );
5596285242Sachim    status = satChainedVerify(tiRoot,
5597285242Sachim                                    &satNewIntIo->satIntTiIORequest,
5598285242Sachim                                    satNewIOContext->ptiDeviceHandle,
5599285242Sachim                                    &satNewIntIo->satIntTiScsiXchg,
5600285242Sachim                                    satNewIOContext);
5601285242Sachim
5602285242Sachim    if (status != tiSuccess)
5603285242Sachim    {
5604285242Sachim      satFreeIntIoResource( tiRoot,
5605285242Sachim                            satDevData,
5606285242Sachim                            satNewIntIo);
5607285242Sachim      ostiInitiatorIOCompleted( tiRoot,
5608285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5609285242Sachim                                tiIOFailed,
5610285242Sachim                                tiDetailOtherError,
5611285242Sachim                                agNULL,
5612285242Sachim                                satOrgIOContext->interruptContext );
5613285242Sachim      TI_DBG1(("satChainedVerifyCB: calling satChainedVerify fails\n"));
5614285242Sachim      return;
5615285242Sachim    }
5616285242Sachim
5617285242Sachim    break;
5618285242Sachim  default:
5619285242Sachim    TI_DBG1(("satChainedVerifyCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
5620285242Sachim
5621285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5622285242Sachim
5623285242Sachim    satFreeIntIoResource( tiRoot,
5624285242Sachim                          satDevData,
5625285242Sachim                          satIntIo);
5626285242Sachim
5627285242Sachim    satSetSensePayload( pSense,
5628285242Sachim                        SCSI_SNSKEY_NO_SENSE,
5629285242Sachim                        0,
5630285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5631285242Sachim                        satOrgIOContext);
5632285242Sachim
5633285242Sachim    ostiInitiatorIOCompleted( tiRoot,
5634285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5635285242Sachim                              tiIOSuccess,
5636285242Sachim                              SCSI_STAT_CHECK_CONDITION,
5637285242Sachim                              satOrgIOContext->pTiSenseData,
5638285242Sachim                              satOrgIOContext->interruptContext );
5639285242Sachim
5640285242Sachim    break;
5641285242Sachim  }
5642285242Sachim  return;
5643285242Sachim}
5644285242Sachim
5645285242Sachim/*****************************************************************************
5646285242Sachim*! \brief  satTestUnitReadyCB
5647285242Sachim*
5648285242Sachim*   This routine is a callback function for satTestUnitReady()
5649285242Sachim*
5650285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
5651285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
5652285242Sachim*  \param   agIOStatus:  Status of completed I/O.
5653285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
5654285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
5655285242Sachim*                        length.
5656285242Sachim*  \param   agParam:     Additional info based on status.
5657285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
5658285242Sachim*
5659285242Sachim*  \return: none
5660285242Sachim*
5661285242Sachim*****************************************************************************/
5662285242Sachimvoid satTestUnitReadyCB(
5663285242Sachim                        agsaRoot_t        *agRoot,
5664285242Sachim                        agsaIORequest_t   *agIORequest,
5665285242Sachim                        bit32             agIOStatus,
5666285242Sachim                        agsaFisHeader_t   *agFirstDword,
5667285242Sachim                        bit32             agIOInfoLen,
5668285242Sachim                        void              *agParam,
5669285242Sachim                        void              *ioContext
5670285242Sachim                        )
5671285242Sachim{
5672285242Sachim  /*
5673285242Sachim    In the process of TestUnitReady
5674285242Sachim    Process SAT_GET_MEDIA_STATUS
5675285242Sachim    Process SAT_CHECK_POWER_MODE
5676285242Sachim  */
5677285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
5678285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
5679285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
5680285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5681285242Sachim  tdIORequestBody_t       *tdIORequestBody;
5682285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
5683285242Sachim  satIOContext_t          *satIOContext;
5684285242Sachim  satIOContext_t          *satOrgIOContext;
5685285242Sachim  satIOContext_t          *satNewIOContext;
5686285242Sachim  satInternalIo_t         *satIntIo;
5687285242Sachim  satInternalIo_t         *satNewIntIo = agNULL;
5688285242Sachim  satDeviceData_t         *satDevData;
5689285242Sachim  scsiRspSense_t            *pSense;
5690285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
5691285242Sachim  tiIORequest_t             *tiOrgIORequest;
5692285242Sachim
5693285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
5694285242Sachim  bit32                     ataStatus = 0;
5695285242Sachim  bit32                     ataError;
5696285242Sachim
5697285242Sachim  bit32                     status;
5698285242Sachim  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
5699285242Sachim
5700285242Sachim  TI_DBG6(("satTestUnitReadyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5701285242Sachim
5702285242Sachim  /* internally generate tiIOContext */
5703285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
5704285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
5705285242Sachim  satIntIo               = satIOContext->satIntIoContext;
5706285242Sachim  satDevData             = satIOContext->pSatDevData;
5707285242Sachim  hostToDevFis           = satIOContext->pFis;
5708285242Sachim
5709285242Sachim  if (satIntIo == agNULL)
5710285242Sachim  {
5711285242Sachim    TI_DBG5(("satTestUnitReadyCB: no internal satInternalIo_t satIntIoContext\n"));
5712285242Sachim    pSense        = satIOContext->pSense;
5713285242Sachim    scsiCmnd      = satIOContext->pScsiCmnd;
5714285242Sachim    satOrgIOContext = satIOContext;
5715285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
5716285242Sachim  }
5717285242Sachim  else
5718285242Sachim  {
5719285242Sachim    TI_DBG5(("satTestUnitReadyCB: yes internal satInternalIo_t satIntIoContext\n"));
5720285242Sachim
5721285242Sachim    /* orginal tiIOContext */
5722285242Sachim    tiOrgIORequest         = (tiIORequest_t *)satIOContext->satIntIoContext->satOrgTiIORequest;
5723285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)tiOrgIORequest->tdData;
5724285242Sachim    satOrgIOContext        = &(tdOrgIORequestBody->transport.SATA.satIOContext);
5725285242Sachim
5726285242Sachim    pSense        = satOrgIOContext->pSense;
5727285242Sachim    scsiCmnd      = satOrgIOContext->pScsiCmnd;
5728285242Sachim  }
5729285242Sachim
5730285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
5731285242Sachim  tdIORequestBody->ioStarted = agFALSE;
5732285242Sachim
5733285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5734285242Sachim  {
5735285242Sachim     TI_DBG1(("satTestUnitReadyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
5736285242Sachim    satSetSensePayload( pSense,
5737285242Sachim                          SCSI_SNSKEY_NOT_READY,
5738285242Sachim                          0,
5739285242Sachim                          SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5740285242Sachim                          satOrgIOContext);
5741285242Sachim
5742285242Sachim    ostiInitiatorIOCompleted( tiRoot,
5743285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5744285242Sachim                                tiIOSuccess,
5745285242Sachim                                SCSI_STAT_CHECK_CONDITION,
5746285242Sachim                                satOrgIOContext->pTiSenseData,
5747285242Sachim                                satOrgIOContext->interruptContext );
5748285242Sachim
5749285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5750285242Sachim
5751285242Sachim    satFreeIntIoResource( tiRoot,
5752285242Sachim                            satDevData,
5753285242Sachim                            satIntIo);
5754285242Sachim
5755285242Sachim    return;
5756285242Sachim  }
5757285242Sachim  /*
5758285242Sachim    HW checks an error for us and the results is agIOStatus
5759285242Sachim  */
5760285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
5761285242Sachim  {
5762285242Sachim    /* only agsaFisRegDeviceToHost_t is expected */
5763285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5764285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
5765285242Sachim    ataError      = statDevToHostFisHeader->error;    /* ATA Eror register   */
5766285242Sachim
5767285242Sachim    if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5768285242Sachim    {
5769285242Sachim      TI_DBG1(("satTestUnitReadyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5770285242Sachim    }
5771285242Sachim    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5772285242Sachim              (ataStatus & DF_ATA_STATUS_MASK)
5773285242Sachim            )
5774285242Sachim    {
5775285242Sachim      TI_DBG1(("satTestUnitReadyCB: FAILED, FAILED, error status\n"));
5776285242Sachim    }
5777285242Sachim
5778285242Sachim    /* Process abort case */
5779285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
5780285242Sachim    {
5781285242Sachim      satProcessAbort(tiRoot,
5782285242Sachim                      tiOrgIORequest,
5783285242Sachim                      satOrgIOContext
5784285242Sachim                      );
5785285242Sachim
5786285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5787285242Sachim
5788285242Sachim      satFreeIntIoResource( tiRoot,
5789285242Sachim                            satDevData,
5790285242Sachim                            satIntIo);
5791285242Sachim      return;
5792285242Sachim    }
5793285242Sachim
5794285242Sachim    switch (hostToDevFis->h.command)
5795285242Sachim    {
5796285242Sachim    case SAT_GET_MEDIA_STATUS:
5797285242Sachim      TI_DBG1(("satTestUnitReadyCB: SAT_GET_MEDIA_STATUS failed \n"));
5798285242Sachim
5799285242Sachim      /* checking NM bit */
5800285242Sachim      if (ataError & SCSI_NM_MASK)
5801285242Sachim      {
5802285242Sachim        satSetSensePayload( pSense,
5803285242Sachim                            SCSI_SNSKEY_NOT_READY,
5804285242Sachim                            0,
5805285242Sachim                            SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
5806285242Sachim                            satOrgIOContext);
5807285242Sachim      }
5808285242Sachim      else
5809285242Sachim      {
5810285242Sachim        satSetSensePayload( pSense,
5811285242Sachim                            SCSI_SNSKEY_NOT_READY,
5812285242Sachim                            0,
5813285242Sachim                            SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5814285242Sachim                            satOrgIOContext);
5815285242Sachim      }
5816285242Sachim
5817285242Sachim      ostiInitiatorIOCompleted( tiRoot,
5818285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5819285242Sachim                                tiIOSuccess,
5820285242Sachim                                SCSI_STAT_CHECK_CONDITION,
5821285242Sachim                                satOrgIOContext->pTiSenseData,
5822285242Sachim                                satOrgIOContext->interruptContext );
5823285242Sachim
5824285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5825285242Sachim
5826285242Sachim      satFreeIntIoResource( tiRoot,
5827285242Sachim                            satDevData,
5828285242Sachim                            satIntIo);
5829285242Sachim      break;
5830285242Sachim    case SAT_CHECK_POWER_MODE:
5831285242Sachim      TI_DBG1(("satTestUnitReadyCB: SAT_CHECK_POWER_MODE failed \n"));
5832285242Sachim      satSetSensePayload( pSense,
5833285242Sachim                          SCSI_SNSKEY_NOT_READY,
5834285242Sachim                          0,
5835285242Sachim                          SCSI_SNSCODE_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION,
5836285242Sachim                          satOrgIOContext);
5837285242Sachim
5838285242Sachim      ostiInitiatorIOCompleted( tiRoot,
5839285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5840285242Sachim                                tiIOSuccess,
5841285242Sachim                                SCSI_STAT_CHECK_CONDITION,
5842285242Sachim                                satOrgIOContext->pTiSenseData,
5843285242Sachim                                satOrgIOContext->interruptContext );
5844285242Sachim
5845285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5846285242Sachim
5847285242Sachim      satFreeIntIoResource( tiRoot,
5848285242Sachim                            satDevData,
5849285242Sachim                            satIntIo);
5850285242Sachim      break;
5851285242Sachim    default:
5852285242Sachim      TI_DBG1(("satTestUnitReadyCB: default failed command %d\n", hostToDevFis->h.command));
5853285242Sachim
5854285242Sachim      satSetSensePayload( pSense,
5855285242Sachim                          SCSI_SNSKEY_NOT_READY,
5856285242Sachim                          0,
5857285242Sachim                          SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5858285242Sachim                          satOrgIOContext);
5859285242Sachim
5860285242Sachim      ostiInitiatorIOCompleted( tiRoot,
5861285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5862285242Sachim                                tiIOSuccess,
5863285242Sachim                                SCSI_STAT_CHECK_CONDITION,
5864285242Sachim                                satOrgIOContext->pTiSenseData,
5865285242Sachim                                satOrgIOContext->interruptContext );
5866285242Sachim
5867285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5868285242Sachim
5869285242Sachim      satFreeIntIoResource( tiRoot,
5870285242Sachim                            satDevData,
5871285242Sachim                            satIntIo);
5872285242Sachim      break;
5873285242Sachim
5874285242Sachim    }
5875285242Sachim    return;
5876285242Sachim  }/* end error */
5877285242Sachim
5878285242Sachim  /* ATA command completes sucessfully */
5879285242Sachim  switch (hostToDevFis->h.command)
5880285242Sachim  {
5881285242Sachim  case SAT_GET_MEDIA_STATUS:
5882285242Sachim
5883285242Sachim    TI_DBG5(("satTestUnitReadyCB: SAT_GET_MEDIA_STATUS success\n"));
5884285242Sachim
5885285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5886285242Sachim
5887285242Sachim    satFreeIntIoResource( tiRoot,
5888285242Sachim                          satDevData,
5889285242Sachim                          satIntIo);
5890285242Sachim
5891285242Sachim    satNewIntIo = satAllocIntIoResource( tiRoot,
5892285242Sachim                                         tiOrgIORequest,
5893285242Sachim                                         satDevData,
5894285242Sachim                                         0,
5895285242Sachim                                         satNewIntIo);
5896285242Sachim    if (satNewIntIo == agNULL)
5897285242Sachim    {
5898285242Sachim      /* memory allocation failure */
5899285242Sachim      satFreeIntIoResource( tiRoot,
5900285242Sachim                            satDevData,
5901285242Sachim                            satNewIntIo);
5902285242Sachim      satSetSensePayload( pSense,
5903285242Sachim                          SCSI_SNSKEY_NOT_READY,
5904285242Sachim                          0,
5905285242Sachim                          SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5906285242Sachim                          satOrgIOContext);
5907285242Sachim
5908285242Sachim      ostiInitiatorIOCompleted( tiRoot,
5909285242Sachim                                tiOrgIORequest,
5910285242Sachim                                tiIOSuccess,
5911285242Sachim                                SCSI_STAT_CHECK_CONDITION,
5912285242Sachim                                satOrgIOContext->pTiSenseData,
5913285242Sachim                                satOrgIOContext->interruptContext );
5914285242Sachim
5915285242Sachim      TI_DBG1(("satTestUnitReadyCB: momory allocation fails\n"));
5916285242Sachim      return;
5917285242Sachim    }
5918285242Sachim
5919285242Sachim    /*
5920285242Sachim     * Need to initialize all the fields within satIOContext
5921285242Sachim     */
5922285242Sachim
5923285242Sachim    satNewIOContext = satPrepareNewIO(
5924285242Sachim                                      satNewIntIo,
5925285242Sachim                                      tiOrgIORequest,
5926285242Sachim                                      satDevData,
5927285242Sachim                                      scsiCmnd,
5928285242Sachim                                      satOrgIOContext
5929285242Sachim                                      );
5930285242Sachim
5931285242Sachim    /* sends SAT_CHECK_POWER_MODE */
5932285242Sachim    status = satTestUnitReady_1( tiRoot,
5933285242Sachim                               &satNewIntIo->satIntTiIORequest,
5934285242Sachim                               satNewIOContext->ptiDeviceHandle,
5935285242Sachim                               &satNewIntIo->satIntTiScsiXchg,
5936285242Sachim                               satNewIOContext);
5937285242Sachim
5938285242Sachim   if (status != tiSuccess)
5939285242Sachim   {
5940285242Sachim     /* sending SAT_CHECK_POWER_MODE fails */
5941285242Sachim     satFreeIntIoResource( tiRoot,
5942285242Sachim                           satDevData,
5943285242Sachim                           satNewIntIo);
5944285242Sachim     satSetSensePayload( pSense,
5945285242Sachim                         SCSI_SNSKEY_NOT_READY,
5946285242Sachim                         0,
5947285242Sachim                         SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5948285242Sachim                         satOrgIOContext);
5949285242Sachim
5950285242Sachim     ostiInitiatorIOCompleted( tiRoot,
5951285242Sachim                               tiOrgIORequest,
5952285242Sachim                               tiIOSuccess,
5953285242Sachim                               SCSI_STAT_CHECK_CONDITION,
5954285242Sachim                               satOrgIOContext->pTiSenseData,
5955285242Sachim                               satOrgIOContext->interruptContext );
5956285242Sachim
5957285242Sachim      TI_DBG1(("satTestUnitReadyCB: calling satTestUnitReady_1 fails\n"));
5958285242Sachim      return;
5959285242Sachim   }
5960285242Sachim
5961285242Sachim    break;
5962285242Sachim  case SAT_CHECK_POWER_MODE:
5963285242Sachim    TI_DBG5(("satTestUnitReadyCB: SAT_CHECK_POWER_MODE success\n"));
5964285242Sachim
5965285242Sachim
5966285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5967285242Sachim
5968285242Sachim    satFreeIntIoResource( tiRoot,
5969285242Sachim                          satDevData,
5970285242Sachim                          satIntIo);
5971285242Sachim
5972285242Sachim    /* returns good status */
5973285242Sachim    ostiInitiatorIOCompleted( tiRoot,
5974285242Sachim                              tiOrgIORequest,
5975285242Sachim                              tiIOSuccess,
5976285242Sachim                              SCSI_STAT_GOOD,
5977285242Sachim                              agNULL,
5978285242Sachim                              satOrgIOContext->interruptContext );
5979285242Sachim
5980285242Sachim    break;
5981285242Sachim  default:
5982285242Sachim    TI_DBG1(("satTestUnitReadyCB: default success command %d\n", hostToDevFis->h.command));
5983285242Sachim    satSetSensePayload( pSense,
5984285242Sachim                        SCSI_SNSKEY_NOT_READY,
5985285242Sachim                        0,
5986285242Sachim                        SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5987285242Sachim                        satOrgIOContext);
5988285242Sachim
5989285242Sachim    ostiInitiatorIOCompleted( tiRoot,
5990285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5991285242Sachim                              tiIOSuccess,
5992285242Sachim                              SCSI_STAT_CHECK_CONDITION,
5993285242Sachim                              satOrgIOContext->pTiSenseData,
5994285242Sachim                              satOrgIOContext->interruptContext );
5995285242Sachim
5996285242Sachim
5997285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5998285242Sachim
5999285242Sachim    satFreeIntIoResource( tiRoot,
6000285242Sachim                          satDevData,
6001285242Sachim                          satIntIo);
6002285242Sachim    break;
6003285242Sachim  }
6004285242Sachim
6005285242Sachim  return;
6006285242Sachim}
6007285242Sachim
6008285242Sachim/*****************************************************************************
6009285242Sachim*! \brief  satWriteSame10CB
6010285242Sachim*
6011285242Sachim*   This routine is a callback function for satWriteSame10()
6012285242Sachim*
6013285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
6014285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
6015285242Sachim*  \param   agIOStatus:  Status of completed I/O.
6016285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
6017285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
6018285242Sachim*                        length.
6019285242Sachim*  \param   agParam:     Additional info based on status.
6020285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
6021285242Sachim*
6022285242Sachim*  \return: none
6023285242Sachim*
6024285242Sachim*****************************************************************************/
6025285242Sachimvoid satWriteSame10CB(
6026285242Sachim                      agsaRoot_t        *agRoot,
6027285242Sachim                      agsaIORequest_t   *agIORequest,
6028285242Sachim                      bit32             agIOStatus,
6029285242Sachim                      agsaFisHeader_t   *agFirstDword,
6030285242Sachim                      bit32             agIOInfoLen,
6031285242Sachim                      void              *agParam,
6032285242Sachim                      void              *ioContext
6033285242Sachim                      )
6034285242Sachim{
6035285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
6036285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
6037285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
6038285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6039285242Sachim  tdIORequestBody_t       *tdIORequestBody;
6040285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
6041285242Sachim  tdIORequestBody_t       *tdNewIORequestBody;
6042285242Sachim  satIOContext_t          *satIOContext;
6043285242Sachim  satIOContext_t          *satOrgIOContext;
6044285242Sachim  satIOContext_t          *satNewIOContext;
6045285242Sachim  satInternalIo_t         *satIntIo;
6046285242Sachim  satInternalIo_t         *satNewIntIo = agNULL;
6047285242Sachim  satDeviceData_t         *satDevData;
6048285242Sachim  scsiRspSense_t            *pSense;
6049285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
6050285242Sachim  tiIORequest_t             *tiOrgIORequest;
6051285242Sachim
6052285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
6053285242Sachim  bit32                     ataStatus = 0;
6054285242Sachim  bit32                     status;
6055285242Sachim
6056285242Sachim  bit32                     sectorcount = 0;
6057285242Sachim  bit32                     lba = 0, tl = 0;
6058285242Sachim  agsaFisRegD2HHeader_t     *statDevToHostFisHeader = agNULL;
6059285242Sachim  agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL;
6060285242Sachim
6061285242Sachim  TI_DBG5(("satWriteSame10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
6062285242Sachim
6063285242Sachim  /* internally generate tiIOContext */
6064285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
6065285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
6066285242Sachim  satIntIo               = satIOContext->satIntIoContext;
6067285242Sachim  satDevData             = satIOContext->pSatDevData;
6068285242Sachim  hostToDevFis           = satIOContext->pFis;
6069285242Sachim
6070285242Sachim  if (satIntIo == agNULL)
6071285242Sachim  {
6072285242Sachim    TI_DBG4(("satWriteSame10CB: External satInternalIo_t satIntIoContext\n"));
6073285242Sachim    satOrgIOContext = satIOContext;
6074285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
6075285242Sachim    pSense          = satIOContext->pSense;
6076285242Sachim    scsiCmnd        = satIOContext->pScsiCmnd;
6077285242Sachim  }
6078285242Sachim  else
6079285242Sachim  {
6080285242Sachim    TI_DBG4(("satWriteSame10CB: Internal satInternalIo_t satIntIoContext\n"));
6081285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
6082285242Sachim    if (satOrgIOContext == agNULL)
6083285242Sachim    {
6084285242Sachim      TI_DBG4(("satWriteSame10CB: satOrgIOContext is NULL, wrong\n"));
6085285242Sachim      return;
6086285242Sachim    }
6087285242Sachim    else
6088285242Sachim    {
6089285242Sachim      TI_DBG4(("satWriteSame10CB: satOrgIOContext is NOT NULL\n"));
6090285242Sachim    }
6091285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
6092285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
6093285242Sachim
6094285242Sachim    pSense        = satOrgIOContext->pSense;
6095285242Sachim    scsiCmnd      = satOrgIOContext->pScsiCmnd;
6096285242Sachim  }
6097285242Sachim
6098285242Sachim
6099285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
6100285242Sachim  tdIORequestBody->ioStarted = agFALSE;
6101285242Sachim
6102285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
6103285242Sachim  {
6104285242Sachim     TI_DBG1(("satWriteSame10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
6105285242Sachim     satSetSensePayload( pSense,
6106285242Sachim                        SCSI_SNSKEY_NO_SENSE,
6107285242Sachim                        0,
6108285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6109285242Sachim                        satOrgIOContext);
6110285242Sachim
6111285242Sachim     ostiInitiatorIOCompleted( tiRoot,
6112285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6113285242Sachim                              tiIOSuccess,
6114285242Sachim                              SCSI_STAT_CHECK_CONDITION,
6115285242Sachim                              satOrgIOContext->pTiSenseData,
6116285242Sachim                              satOrgIOContext->interruptContext );
6117285242Sachim
6118285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6119285242Sachim
6120285242Sachim    satFreeIntIoResource( tiRoot,
6121285242Sachim                          satDevData,
6122285242Sachim                          satIntIo);
6123285242Sachim    return;
6124285242Sachim  }
6125285242Sachim
6126285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
6127285242Sachim  {
6128285242Sachim    /* FP, DMA and PIO write */
6129285242Sachim    /* First, assumed to be Reg Device to Host FIS */
6130285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
6131285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
6132285242Sachim  }
6133285242Sachim
6134285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
6135285242Sachim  {
6136285242Sachim    if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS)
6137285242Sachim    {
6138285242Sachim      statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H);
6139285242Sachim
6140285242Sachim      /* Get ATA Status register */
6141285242Sachim      ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70);               /* bits 4,5,6 */
6142285242Sachim      ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07);   /* bits 0,1,2 */
6143285242Sachim
6144285242Sachim      /* ATA Eror register   */
6145285242Sachim
6146285242Sachim    }
6147285242Sachim  }
6148285242Sachim
6149285242Sachim  if( agIOStatus != OSSA_IO_SUCCESS)
6150285242Sachim  {
6151285242Sachim  /*
6152285242Sachim    checking IO status, FIS type and error status
6153285242Sachim    FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
6154285242Sachim  */
6155285242Sachim  if (  ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
6156285242Sachim        (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) ||
6157285242Sachim       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
6158285242Sachim       )
6159285242Sachim  {
6160285242Sachim    /* for debugging */
6161285242Sachim    if( agIOStatus != OSSA_IO_SUCCESS)
6162285242Sachim    {
6163285242Sachim      TI_DBG1(("satWriteSame10CB: FAILED, NOT IO_SUCCESS\n"));
6164285242Sachim    }
6165285242Sachim    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
6166285242Sachim    {
6167285242Sachim      TI_DBG1(("satWriteSame10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
6168285242Sachim    }
6169285242Sachim    else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
6170285242Sachim    {
6171285242Sachim      TI_DBG1(("satWriteSame10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
6172285242Sachim    }
6173285242Sachim    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
6174285242Sachim              (ataStatus & DF_ATA_STATUS_MASK)
6175285242Sachim              )
6176285242Sachim    {
6177285242Sachim      TI_DBG1(("satWriteSame10CB: FAILED, FAILED, error status\n"));
6178285242Sachim    }
6179285242Sachim
6180285242Sachim    /* Process abort case */
6181285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
6182285242Sachim    {
6183285242Sachim      satProcessAbort(tiRoot,
6184285242Sachim                      tiOrgIORequest,
6185285242Sachim                      satOrgIOContext
6186285242Sachim                      );
6187285242Sachim
6188285242Sachim
6189285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6190285242Sachim
6191285242Sachim      satFreeIntIoResource( tiRoot,
6192285242Sachim                            satDevData,
6193285242Sachim                            satIntIo);
6194285242Sachim      return;
6195285242Sachim    }
6196285242Sachim
6197285242Sachim    /* for debugging */
6198285242Sachim    switch (hostToDevFis->h.command)
6199285242Sachim    {
6200285242Sachim    case SAT_WRITE_DMA_EXT:
6201285242Sachim      TI_DBG1(("satWriteSame10CB: SAT_WRITE_DMA_EXT\n"));
6202285242Sachim      break;
6203285242Sachim    case SAT_WRITE_SECTORS_EXT:
6204285242Sachim      TI_DBG1(("satWriteSame10CB: SAT_WRITE_SECTORS_EXT\n"));
6205285242Sachim      break;
6206285242Sachim    case SAT_WRITE_FPDMA_QUEUED:
6207285242Sachim      TI_DBG1(("satWriteSame10CB: SAT_WRITE_FPDMA_QUEUED\n"));
6208285242Sachim      break;
6209285242Sachim    default:
6210285242Sachim      TI_DBG1(("satWriteSame10CB: error default case command 0x%x\n", hostToDevFis->h.command));
6211285242Sachim      break;
6212285242Sachim    }
6213285242Sachim
6214285242Sachim    satSetSensePayload( pSense,
6215285242Sachim                        SCSI_SNSKEY_NO_SENSE,
6216285242Sachim                        0,
6217285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6218285242Sachim                        satOrgIOContext);
6219285242Sachim
6220285242Sachim    ostiInitiatorIOCompleted( tiRoot,
6221285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6222285242Sachim                              tiIOSuccess,
6223285242Sachim                              SCSI_STAT_CHECK_CONDITION,
6224285242Sachim                              satOrgIOContext->pTiSenseData,
6225285242Sachim                              satOrgIOContext->interruptContext );
6226285242Sachim
6227285242Sachim
6228285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6229285242Sachim
6230285242Sachim    satFreeIntIoResource( tiRoot,
6231285242Sachim                          satDevData,
6232285242Sachim                          satIntIo);
6233285242Sachim    return;
6234285242Sachim  } /* end error */
6235285242Sachim  }
6236285242Sachim
6237285242Sachim  /* process success from this point on */
6238285242Sachim  /*
6239285242Sachim    note: inefficient implementation until a single block can be manipulated
6240285242Sachim  */
6241285242Sachim
6242285242Sachim  if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
6243285242Sachim  {
6244285242Sachim    TI_DBG5(("satWriteSame10CB: SAT_WRITE_DMA_EXT success\n"));
6245285242Sachim  }
6246285242Sachim  else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
6247285242Sachim  {
6248285242Sachim    TI_DBG5(("satWriteSame10CB: SAT_WRITE_SECTORS_EXT success\n"));
6249285242Sachim  }
6250285242Sachim  else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
6251285242Sachim  {
6252285242Sachim    TI_DBG5(("satWriteSame10CB: SAT_WRITE_FPDMA_QUEUED success\n"));
6253285242Sachim  }
6254285242Sachim  else
6255285242Sachim  {
6256285242Sachim    TI_DBG1(("satWriteSame10CB: error case command 0x%x success\n", hostToDevFis->h.command));
6257285242Sachim    satSetSensePayload( pSense,
6258285242Sachim                        SCSI_SNSKEY_NO_SENSE,
6259285242Sachim                        0,
6260285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6261285242Sachim                        satOrgIOContext);
6262285242Sachim
6263285242Sachim    ostiInitiatorIOCompleted( tiRoot,
6264285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6265285242Sachim                              tiIOSuccess,
6266285242Sachim                              SCSI_STAT_CHECK_CONDITION,
6267285242Sachim                              satOrgIOContext->pTiSenseData,
6268285242Sachim                              satOrgIOContext->interruptContext );
6269285242Sachim
6270285242Sachim
6271285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6272285242Sachim
6273285242Sachim    satFreeIntIoResource( tiRoot,
6274285242Sachim                          satDevData,
6275285242Sachim                          satIntIo);
6276285242Sachim    return;
6277285242Sachim  }
6278285242Sachim
6279285242Sachim
6280285242Sachim  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6281285242Sachim
6282285242Sachim  /* free */
6283285242Sachim  satFreeIntIoResource( tiRoot,
6284285242Sachim                        satDevData,
6285285242Sachim                        satIntIo);
6286285242Sachim
6287285242Sachim  /*
6288285242Sachim    increment LBA by one, keeping the same sector count(1)
6289285242Sachim    sends another ATA command with the changed parameters
6290285242Sachim  */
6291285242Sachim
6292285242Sachim  tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
6293285242Sachim  satDevData->satSectorDone++;
6294285242Sachim  tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
6295285242Sachim
6296285242Sachim  TI_DBG1(("satWriteSame10CB: sectordone %d\n", satDevData->satSectorDone));
6297285242Sachim
6298285242Sachim  lba = (scsiCmnd->cdb[2] << (8*3)) + (scsiCmnd->cdb[3] << (8*2))
6299285242Sachim      + (scsiCmnd->cdb[4] << 8) + scsiCmnd->cdb[5];
6300285242Sachim  tl = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8];
6301285242Sachim
6302285242Sachim  TI_DBG5(("satWriteSame10CB: lba 0x%x tl 0x%x\n", lba, tl));
6303285242Sachim
6304285242Sachim  if (tl == 0)
6305285242Sachim  {
6306285242Sachim    /* (satDevData->satMaxUserAddrSectors - 1) - lba*/
6307285242Sachim    sectorcount = (0x0FFFFFFF - 1) - lba;
6308285242Sachim  }
6309285242Sachim  else
6310285242Sachim  {
6311285242Sachim    sectorcount = tl;
6312285242Sachim  }
6313285242Sachim
6314285242Sachim  if (sectorcount <= 0)
6315285242Sachim  {
6316285242Sachim    satSetSensePayload( pSense,
6317285242Sachim                        SCSI_SNSKEY_NO_SENSE,
6318285242Sachim                        0,
6319285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6320285242Sachim                        satOrgIOContext);
6321285242Sachim
6322285242Sachim    ostiInitiatorIOCompleted( tiRoot,
6323285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6324285242Sachim                              tiIOSuccess,
6325285242Sachim                              SCSI_STAT_CHECK_CONDITION,
6326285242Sachim                              satOrgIOContext->pTiSenseData,
6327285242Sachim                              satOrgIOContext->interruptContext );
6328285242Sachim    TI_DBG1(("satWriteSame10CB: incorrect sectorcount 0x%x\n", sectorcount));
6329285242Sachim    return;
6330285242Sachim  }
6331285242Sachim
6332285242Sachim  if (sectorcount == satDevData->satSectorDone)
6333285242Sachim  {
6334285242Sachim    /*
6335285242Sachim      done with writesame
6336285242Sachim    */
6337285242Sachim    TI_DBG1(("satWriteSame10CB: return writesame done\n"));
6338285242Sachim    satDevData->satSectorDone = 0;
6339285242Sachim
6340285242Sachim    ostiInitiatorIOCompleted( tiRoot,
6341285242Sachim                              tiOrgIORequest,
6342285242Sachim                              tiIOSuccess,
6343285242Sachim                              SCSI_STAT_GOOD,
6344285242Sachim                              agNULL,
6345285242Sachim                              satOrgIOContext->interruptContext );
6346285242Sachim  }
6347285242Sachim  else
6348285242Sachim  {
6349285242Sachim    /* sends another ATA command */
6350285242Sachim    if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
6351285242Sachim    {
6352285242Sachim      TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_DMA_EXT\n"));
6353285242Sachim    }
6354285242Sachim    else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
6355285242Sachim    {
6356285242Sachim      TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_SECTORS_EXT\n"));
6357285242Sachim    }
6358285242Sachim    else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
6359285242Sachim    {
6360285242Sachim      TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_FPDMA_QUEUED\n"));
6361285242Sachim    }
6362285242Sachim
6363285242Sachim    satNewIntIo = satAllocIntIoResource( tiRoot,
6364285242Sachim                                         tiOrgIORequest,
6365285242Sachim                                         satDevData,
6366285242Sachim                                         0,
6367285242Sachim                                         satNewIntIo);
6368285242Sachim    if (satNewIntIo == agNULL)
6369285242Sachim    {
6370285242Sachim      /* memory allocation failure */
6371285242Sachim      satFreeIntIoResource( tiRoot,
6372285242Sachim                            satDevData,
6373285242Sachim                            satNewIntIo);
6374285242Sachim
6375285242Sachim      satSetSensePayload( pSense,
6376285242Sachim                          SCSI_SNSKEY_NO_SENSE,
6377285242Sachim                          0,
6378285242Sachim                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6379285242Sachim                          satOrgIOContext);
6380285242Sachim
6381285242Sachim      ostiInitiatorIOCompleted( tiRoot,
6382285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6383285242Sachim                                tiIOSuccess,
6384285242Sachim                                SCSI_STAT_CHECK_CONDITION,
6385285242Sachim                                satOrgIOContext->pTiSenseData,
6386285242Sachim                                satOrgIOContext->interruptContext );
6387285242Sachim      TI_DBG1(("satWriteSame10CB: momory allocation fails\n"));
6388285242Sachim      return;
6389285242Sachim    } /* end memory allocation */
6390285242Sachim
6391285242Sachim    /* the one to be used */
6392285242Sachim    tdNewIORequestBody = satNewIntIo->satIntRequestBody;
6393285242Sachim    satNewIOContext = &tdNewIORequestBody->transport.SATA.satIOContext;
6394285242Sachim
6395285242Sachim    satNewIOContext->pSatDevData   = satDevData;
6396285242Sachim    satNewIOContext->pFis          = &tdNewIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev;
6397285242Sachim    satNewIOContext->pScsiCmnd     = &satNewIntIo->satIntTiScsiXchg.scsiCmnd;
6398285242Sachim    /* saves scsi command for LBA and number of blocks */
6399285242Sachim    osti_memcpy(satNewIOContext->pScsiCmnd, scsiCmnd, sizeof(tiIniScsiCmnd_t));
6400285242Sachim    satNewIOContext->pSense        = &tdNewIORequestBody->transport.SATA.sensePayload;
6401285242Sachim    satNewIOContext->pTiSenseData  = &tdNewIORequestBody->transport.SATA.tiSenseData;
6402285242Sachim    satNewIOContext->pTiSenseData->senseData = satNewIOContext->pSense;
6403285242Sachim    satNewIOContext->tiRequestBody = satNewIntIo->satIntRequestBody;
6404285242Sachim    satNewIOContext->interruptContext = satNewIOContext->interruptContext;
6405285242Sachim    satNewIOContext->satIntIoContext  = satNewIntIo;
6406285242Sachim    satNewIOContext->ptiDeviceHandle = satIOContext->ptiDeviceHandle;
6407285242Sachim    /* saves tiScsiXchg; only for writesame10() */
6408285242Sachim    satNewIOContext->tiScsiXchg = satOrgIOContext->tiScsiXchg;
6409285242Sachim
6410285242Sachim    if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
6411285242Sachim    {
6412285242Sachim      status = satWriteSame10_1( tiRoot,
6413285242Sachim                                 &satNewIntIo->satIntTiIORequest,
6414285242Sachim                                 satNewIOContext->ptiDeviceHandle,
6415285242Sachim                                 &satNewIntIo->satIntTiScsiXchg,
6416285242Sachim                                 satNewIOContext,
6417285242Sachim                                 lba + satDevData->satSectorDone
6418285242Sachim                                 );
6419285242Sachim    }
6420285242Sachim    else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
6421285242Sachim    {
6422285242Sachim      status = satWriteSame10_2( tiRoot,
6423285242Sachim                                 &satNewIntIo->satIntTiIORequest,
6424285242Sachim                                 satNewIOContext->ptiDeviceHandle,
6425285242Sachim                                 &satNewIntIo->satIntTiScsiXchg,
6426285242Sachim                                 satNewIOContext,
6427285242Sachim                                 lba + satDevData->satSectorDone
6428285242Sachim                                 );
6429285242Sachim    }
6430285242Sachim    else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
6431285242Sachim    {
6432285242Sachim      status = satWriteSame10_3( tiRoot,
6433285242Sachim                                 &satNewIntIo->satIntTiIORequest,
6434285242Sachim                                 satNewIOContext->ptiDeviceHandle,
6435285242Sachim                                 &satNewIntIo->satIntTiScsiXchg,
6436285242Sachim                                 satNewIOContext,
6437285242Sachim                                 lba + satDevData->satSectorDone
6438285242Sachim                                 );
6439285242Sachim    }
6440285242Sachim    else
6441285242Sachim    {
6442285242Sachim      status = tiError;
6443285242Sachim      TI_DBG1(("satWriteSame10CB: sucess but error in command 0x%x\n", hostToDevFis->h.command));
6444285242Sachim    }
6445285242Sachim
6446285242Sachim    if (status != tiSuccess)
6447285242Sachim    {
6448285242Sachim      /* sending ATA command fails */
6449285242Sachim      satFreeIntIoResource( tiRoot,
6450285242Sachim                            satDevData,
6451285242Sachim                            satNewIntIo);
6452285242Sachim      satSetSensePayload( pSense,
6453285242Sachim                          SCSI_SNSKEY_NO_SENSE,
6454285242Sachim                          0,
6455285242Sachim                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6456285242Sachim                          satOrgIOContext);
6457285242Sachim
6458285242Sachim      ostiInitiatorIOCompleted( tiRoot,
6459285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6460285242Sachim                                tiIOSuccess,
6461285242Sachim                                SCSI_STAT_CHECK_CONDITION,
6462285242Sachim                                satOrgIOContext->pTiSenseData,
6463285242Sachim                                satOrgIOContext->interruptContext );
6464285242Sachim      TI_DBG1(("satWriteSame10CB:calling satWriteSame10_1 fails\n"));
6465285242Sachim      return;
6466285242Sachim    } /* end send fails */
6467285242Sachim
6468285242Sachim  } /* end sends another ATA command */
6469285242Sachim
6470285242Sachim  return;
6471285242Sachim}
6472285242Sachim/*****************************************************************************
6473285242Sachim*! \brief  satStartStopUnitCB
6474285242Sachim*
6475285242Sachim*   This routine is a callback function called from ossaSATACompleted().
6476285242Sachim*   This CB routine deals with Send Diagnostic completion.
6477285242Sachim*
6478285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
6479285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
6480285242Sachim*  \param   agIOStatus:  Status of completed I/O.
6481285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
6482285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
6483285242Sachim*                        length.
6484285242Sachim*  \param   agParam:     Additional info based on status.
6485285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
6486285242Sachim*
6487285242Sachim*  \return: none
6488285242Sachim*
6489285242Sachim*****************************************************************************/
6490285242Sachimvoid satStartStopUnitCB(
6491285242Sachim                        agsaRoot_t        *agRoot,
6492285242Sachim                        agsaIORequest_t   *agIORequest,
6493285242Sachim                        bit32             agIOStatus,
6494285242Sachim                        agsaFisHeader_t   *agFirstDword,
6495285242Sachim                        bit32             agIOInfoLen,
6496285242Sachim                        void              *agParam,
6497285242Sachim                        void              *ioContext
6498285242Sachim                        )
6499285242Sachim{
6500285242Sachim  /*
6501285242Sachim    In the process of StartStopUnit
6502285242Sachim    Process FLUSH CACHE (EXT)
6503285242Sachim    Process STANDBY
6504285242Sachim    Process READ VERIFY SECTOR(S) EXT
6505285242Sachim    Process MEDIA EJECT
6506285242Sachim  */
6507285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
6508285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
6509285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
6510285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6511285242Sachim  tdIORequestBody_t       *tdIORequestBody;
6512285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
6513285242Sachim  satIOContext_t          *satIOContext;
6514285242Sachim  satIOContext_t          *satOrgIOContext;
6515285242Sachim  satIOContext_t          *satNewIOContext;
6516285242Sachim  satInternalIo_t         *satIntIo;
6517285242Sachim  satInternalIo_t         *satNewIntIo = agNULL;
6518285242Sachim  satDeviceData_t         *satDevData;
6519285242Sachim  scsiRspSense_t            *pSense;
6520285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
6521285242Sachim  tiIORequest_t             *tiOrgIORequest;
6522285242Sachim
6523285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
6524285242Sachim  bit32                     ataStatus = 0;
6525285242Sachim  bit32                     status;
6526285242Sachim  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
6527285242Sachim
6528285242Sachim  TI_DBG5(("satStartStopUnitCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
6529285242Sachim
6530285242Sachim  /* internally generate tiIOContext */
6531285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
6532285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
6533285242Sachim  satIntIo               = satIOContext->satIntIoContext;
6534285242Sachim  satDevData             = satIOContext->pSatDevData;
6535285242Sachim  hostToDevFis           = satIOContext->pFis;
6536285242Sachim
6537285242Sachim  if (satIntIo == agNULL)
6538285242Sachim  {
6539285242Sachim    TI_DBG4(("satStartStopUnitCB: External satInternalIo_t satIntIoContext\n"));
6540285242Sachim    satOrgIOContext = satIOContext;
6541285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
6542285242Sachim    pSense          = satIOContext->pSense;
6543285242Sachim    scsiCmnd        = satIOContext->pScsiCmnd;
6544285242Sachim  }
6545285242Sachim  else
6546285242Sachim  {
6547285242Sachim    TI_DBG4(("satStartStopUnitCB: Internal satInternalIo_t satIntIoContext\n"));
6548285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
6549285242Sachim    if (satOrgIOContext == agNULL)
6550285242Sachim    {
6551285242Sachim      TI_DBG4(("satStartStopUnitCB: satOrgIOContext is NULL, wrong\n"));
6552285242Sachim      return;
6553285242Sachim    }
6554285242Sachim    else
6555285242Sachim    {
6556285242Sachim      TI_DBG4(("satStartStopUnitCB: satOrgIOContext is NOT NULL\n"));
6557285242Sachim    }
6558285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
6559285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
6560285242Sachim
6561285242Sachim    pSense        = satOrgIOContext->pSense;
6562285242Sachim    scsiCmnd      = satOrgIOContext->pScsiCmnd;
6563285242Sachim  }
6564285242Sachim
6565285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
6566285242Sachim  tdIORequestBody->ioStarted = agFALSE;
6567285242Sachim
6568285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
6569285242Sachim  {
6570285242Sachim     TI_DBG1(("satStartStopUnitCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
6571285242Sachim
6572285242Sachim      /* IMMED == 0 */
6573285242Sachim      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6574285242Sachim      {
6575285242Sachim        TI_DBG1(("satStartStopUnitCB: immed bit 0\n"));
6576285242Sachim        satSetSensePayload( pSense,
6577285242Sachim                            SCSI_SNSKEY_ABORTED_COMMAND,
6578285242Sachim                            0,
6579285242Sachim                            SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6580285242Sachim                            satOrgIOContext);
6581285242Sachim
6582285242Sachim        ostiInitiatorIOCompleted( tiRoot,
6583285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6584285242Sachim                                  tiIOSuccess,
6585285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
6586285242Sachim                                  satOrgIOContext->pTiSenseData,
6587285242Sachim                                  satOrgIOContext->interruptContext );
6588285242Sachim
6589285242Sachim
6590285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6591285242Sachim        satFreeIntIoResource( tiRoot,
6592285242Sachim                              satDevData,
6593285242Sachim                              satIntIo);
6594285242Sachim      }
6595285242Sachim      /* IMMED == 1 */
6596285242Sachim      if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6597285242Sachim      {
6598285242Sachim        TI_DBG1(("satStartStopUnitCB: immed bit 1\n"));
6599285242Sachim        satSetDeferredSensePayload( pSense,
6600285242Sachim                                    SCSI_SNSKEY_ABORTED_COMMAND,
6601285242Sachim                                    0,
6602285242Sachim                                    SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6603285242Sachim                                    satOrgIOContext);
6604285242Sachim
6605285242Sachim        ostiInitiatorIOCompleted( tiRoot,
6606285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6607285242Sachim                                  tiIOSuccess,
6608285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
6609285242Sachim                                  satOrgIOContext->pTiSenseData,
6610285242Sachim                                  satOrgIOContext->interruptContext );
6611285242Sachim
6612285242Sachim
6613285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6614285242Sachim        satFreeIntIoResource( tiRoot,
6615285242Sachim                              satDevData,
6616285242Sachim                              satIntIo);
6617285242Sachim     }
6618285242Sachim
6619285242Sachim
6620285242Sachim
6621285242Sachim    return;
6622285242Sachim  }
6623285242Sachim
6624285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
6625285242Sachim  {
6626285242Sachim    /* only agsaFisRegDeviceToHost_t is expected */
6627285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
6628285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
6629285242Sachim  }
6630285242Sachim  /*
6631285242Sachim    checking IO status, FIS type and error status
6632285242Sachim  */
6633285242Sachim  if( agIOStatus != OSSA_IO_SUCCESS)
6634285242Sachim  {
6635285242Sachim  if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
6636285242Sachim      ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
6637285242Sachim      )
6638285242Sachim  {
6639285242Sachim    /* for debugging */
6640285242Sachim    if( agIOStatus != OSSA_IO_SUCCESS)
6641285242Sachim    {
6642285242Sachim      TI_DBG1(("satStartStopUnitCB: FAILED, NOT IO_SUCCESS\n"));
6643285242Sachim    }
6644285242Sachim    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
6645285242Sachim    {
6646285242Sachim      TI_DBG1(("satStartStopUnitCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
6647285242Sachim    }
6648285242Sachim    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
6649285242Sachim         (ataStatus & DF_ATA_STATUS_MASK)
6650285242Sachim         )
6651285242Sachim    {
6652285242Sachim      TI_DBG1(("satStartStopUnitCB: FAILED, FAILED, error status\n"));
6653285242Sachim    }
6654285242Sachim
6655285242Sachim
6656285242Sachim    /* Process abort case */
6657285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
6658285242Sachim    {
6659285242Sachim      satProcessAbort(tiRoot,
6660285242Sachim                      tiOrgIORequest,
6661285242Sachim                      satOrgIOContext
6662285242Sachim                      );
6663285242Sachim
6664285242Sachim
6665285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6666285242Sachim
6667285242Sachim      satFreeIntIoResource( tiRoot,
6668285242Sachim                            satDevData,
6669285242Sachim                            satIntIo);
6670285242Sachim      return;
6671285242Sachim    }
6672285242Sachim
6673285242Sachim    switch (hostToDevFis->h.command)
6674285242Sachim    {
6675285242Sachim    case SAT_FLUSH_CACHE: /* fall through */
6676285242Sachim    case SAT_FLUSH_CACHE_EXT:
6677285242Sachim      TI_DBG1(("satStartStopUnitCB: SAT_FLUSH_CACHE(_EXT)\n"));
6678285242Sachim      /* check immed bit in scsi command */
6679285242Sachim      /* IMMED == 0 */
6680285242Sachim      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6681285242Sachim      {
6682285242Sachim        satSetSensePayload( pSense,
6683285242Sachim                            SCSI_SNSKEY_ABORTED_COMMAND,
6684285242Sachim                            0,
6685285242Sachim                            SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6686285242Sachim                            satOrgIOContext);
6687285242Sachim
6688285242Sachim        ostiInitiatorIOCompleted( tiRoot,
6689285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6690285242Sachim                                  tiIOSuccess,
6691285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
6692285242Sachim                                  satOrgIOContext->pTiSenseData,
6693285242Sachim                                  satOrgIOContext->interruptContext );
6694285242Sachim
6695285242Sachim
6696285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6697285242Sachim
6698285242Sachim        satFreeIntIoResource( tiRoot,
6699285242Sachim                              satDevData,
6700285242Sachim                              satIntIo);
6701285242Sachim      }
6702285242Sachim      /* IMMED == 1 */
6703285242Sachim      if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6704285242Sachim      {
6705285242Sachim        satSetDeferredSensePayload( pSense,
6706285242Sachim                                    SCSI_SNSKEY_ABORTED_COMMAND,
6707285242Sachim                                    0,
6708285242Sachim                                    SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6709285242Sachim                                    satOrgIOContext);
6710285242Sachim
6711285242Sachim        ostiInitiatorIOCompleted( tiRoot,
6712285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6713285242Sachim                                  tiIOSuccess,
6714285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
6715285242Sachim                                  satOrgIOContext->pTiSenseData,
6716285242Sachim                                  satOrgIOContext->interruptContext );
6717285242Sachim
6718285242Sachim
6719285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6720285242Sachim
6721285242Sachim        satFreeIntIoResource( tiRoot,
6722285242Sachim                              satDevData,
6723285242Sachim                              satIntIo);
6724285242Sachim      }
6725285242Sachim      break;
6726285242Sachim    case SAT_STANDBY:
6727285242Sachim      TI_DBG5(("satStartStopUnitCB: SAT_STANDBY\n"));
6728285242Sachim      /* check immed bit in scsi command */
6729285242Sachim      /* IMMED == 0 */
6730285242Sachim      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6731285242Sachim      {
6732285242Sachim        satSetSensePayload( pSense,
6733285242Sachim                            SCSI_SNSKEY_ABORTED_COMMAND,
6734285242Sachim                            0,
6735285242Sachim                            SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6736285242Sachim                            satOrgIOContext);
6737285242Sachim
6738285242Sachim        ostiInitiatorIOCompleted( tiRoot,
6739285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6740285242Sachim                                  tiIOSuccess,
6741285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
6742285242Sachim                                  satOrgIOContext->pTiSenseData,
6743285242Sachim                                  satOrgIOContext->interruptContext );
6744285242Sachim
6745285242Sachim
6746285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6747285242Sachim
6748285242Sachim        satFreeIntIoResource( tiRoot,
6749285242Sachim                              satDevData,
6750285242Sachim                              satIntIo);
6751285242Sachim      }
6752285242Sachim      /* IMMED == 1 */
6753285242Sachim      if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6754285242Sachim      {
6755285242Sachim        satSetDeferredSensePayload( pSense,
6756285242Sachim                                    SCSI_SNSKEY_ABORTED_COMMAND,
6757285242Sachim                                    0,
6758285242Sachim                                    SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6759285242Sachim                                    satOrgIOContext);
6760285242Sachim
6761285242Sachim        ostiInitiatorIOCompleted( tiRoot,
6762285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6763285242Sachim                                  tiIOSuccess,
6764285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
6765285242Sachim                                  satOrgIOContext->pTiSenseData,
6766285242Sachim                                  satOrgIOContext->interruptContext );
6767285242Sachim
6768285242Sachim
6769285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6770285242Sachim
6771285242Sachim        satFreeIntIoResource( tiRoot,
6772285242Sachim                              satDevData,
6773285242Sachim                              satIntIo);
6774285242Sachim      }
6775285242Sachim      break;
6776285242Sachim    case SAT_READ_VERIFY_SECTORS:     /* fall through */
6777285242Sachim    case SAT_READ_VERIFY_SECTORS_EXT:
6778285242Sachim      TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT)\n"));
6779285242Sachim       /* IMMED == 0 */
6780285242Sachim      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6781285242Sachim      {
6782285242Sachim        satSetSensePayload( pSense,
6783285242Sachim                            SCSI_SNSKEY_ABORTED_COMMAND,
6784285242Sachim                            0,
6785285242Sachim                            SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6786285242Sachim                            satOrgIOContext);
6787285242Sachim
6788285242Sachim        ostiInitiatorIOCompleted( tiRoot,
6789285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6790285242Sachim                                  tiIOSuccess,
6791285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
6792285242Sachim                                  satOrgIOContext->pTiSenseData,
6793285242Sachim                                  satOrgIOContext->interruptContext );
6794285242Sachim
6795285242Sachim
6796285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6797285242Sachim
6798285242Sachim        satFreeIntIoResource( tiRoot,
6799285242Sachim                              satDevData,
6800285242Sachim                              satIntIo);
6801285242Sachim      }
6802285242Sachim      /* IMMED == 1 */
6803285242Sachim      if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6804285242Sachim      {
6805285242Sachim        satSetDeferredSensePayload( pSense,
6806285242Sachim                                    SCSI_SNSKEY_ABORTED_COMMAND,
6807285242Sachim                                    0,
6808285242Sachim                                    SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6809285242Sachim                                    satOrgIOContext);
6810285242Sachim
6811285242Sachim        ostiInitiatorIOCompleted( tiRoot,
6812285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6813285242Sachim                                  tiIOSuccess,
6814285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
6815285242Sachim                                  satOrgIOContext->pTiSenseData,
6816285242Sachim                                  satOrgIOContext->interruptContext );
6817285242Sachim
6818285242Sachim
6819285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6820285242Sachim
6821285242Sachim        satFreeIntIoResource( tiRoot,
6822285242Sachim                              satDevData,
6823285242Sachim                              satIntIo);
6824285242Sachim      }
6825285242Sachim      break;
6826285242Sachim    case SAT_MEDIA_EJECT:
6827285242Sachim      TI_DBG5(("satStartStopUnitCB: SAT_MEDIA_EJECT\n"));
6828285242Sachim       /* IMMED == 0 */
6829285242Sachim      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6830285242Sachim      {
6831285242Sachim        satSetSensePayload( pSense,
6832285242Sachim                            SCSI_SNSKEY_ABORTED_COMMAND,
6833285242Sachim                            0,
6834285242Sachim                            SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED,
6835285242Sachim                            satOrgIOContext);
6836285242Sachim
6837285242Sachim        ostiInitiatorIOCompleted( tiRoot,
6838285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6839285242Sachim                                  tiIOSuccess,
6840285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
6841285242Sachim                                  satOrgIOContext->pTiSenseData,
6842285242Sachim                                  satOrgIOContext->interruptContext );
6843285242Sachim
6844285242Sachim
6845285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6846285242Sachim
6847285242Sachim        satFreeIntIoResource( tiRoot,
6848285242Sachim                              satDevData,
6849285242Sachim                              satIntIo);
6850285242Sachim      }
6851285242Sachim      /* IMMED == 1 */
6852285242Sachim      if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6853285242Sachim      {
6854285242Sachim        satSetDeferredSensePayload( pSense,
6855285242Sachim                                    SCSI_SNSKEY_ABORTED_COMMAND,
6856285242Sachim                                    0,
6857285242Sachim                                    SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED,
6858285242Sachim                                    satOrgIOContext);
6859285242Sachim
6860285242Sachim        ostiInitiatorIOCompleted( tiRoot,
6861285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6862285242Sachim                                  tiIOSuccess,
6863285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
6864285242Sachim                                  satOrgIOContext->pTiSenseData,
6865285242Sachim                                  satOrgIOContext->interruptContext );
6866285242Sachim
6867285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6868285242Sachim
6869285242Sachim        satFreeIntIoResource( tiRoot,
6870285242Sachim                              satDevData,
6871285242Sachim                              satIntIo);
6872285242Sachim      }
6873285242Sachim      break;
6874285242Sachim    default:
6875285242Sachim      /* unspecified case, return no sense and no addition info */
6876285242Sachim      TI_DBG5(("satStartStopUnitCB: default command %d\n", hostToDevFis->h.command));
6877285242Sachim      satSetSensePayload( pSense,
6878285242Sachim                          SCSI_SNSKEY_NO_SENSE,
6879285242Sachim                          0,
6880285242Sachim                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6881285242Sachim                          satOrgIOContext);
6882285242Sachim
6883285242Sachim      ostiInitiatorIOCompleted( tiRoot,
6884285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6885285242Sachim                                tiIOSuccess,
6886285242Sachim                                SCSI_STAT_CHECK_CONDITION,
6887285242Sachim                                satOrgIOContext->pTiSenseData,
6888285242Sachim                                satOrgIOContext->interruptContext );
6889285242Sachim
6890285242Sachim
6891285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6892285242Sachim
6893285242Sachim      satFreeIntIoResource( tiRoot,
6894285242Sachim                            satDevData,
6895285242Sachim                            satIntIo);
6896285242Sachim      break;
6897285242Sachim    } /* switch */
6898285242Sachim
6899285242Sachim    return;
6900285242Sachim  } /* error check */
6901285242Sachim  }
6902285242Sachim
6903285242Sachim  /* ATA command completes sucessfully */
6904285242Sachim  switch (hostToDevFis->h.command)
6905285242Sachim  {
6906285242Sachim  case SAT_FLUSH_CACHE: /* fall through */
6907285242Sachim  case SAT_FLUSH_CACHE_EXT:
6908285242Sachim    TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n"));
6909285242Sachim
6910285242Sachim
6911285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6912285242Sachim
6913285242Sachim    /* done with SAT_FLUSH_CACHE(_EXT) */
6914285242Sachim    satFreeIntIoResource( tiRoot,
6915285242Sachim                          satDevData,
6916285242Sachim                          satIntIo);
6917285242Sachim
6918285242Sachim    /* at this point, successful SAT_READ_VERIFY_SECTORS(_EXT)
6919285242Sachim       send SAT_SATNDBY
6920285242Sachim    */
6921285242Sachim    satNewIntIo = satAllocIntIoResource( tiRoot,
6922285242Sachim                                         tiOrgIORequest,
6923285242Sachim                                         satDevData,
6924285242Sachim                                         0,
6925285242Sachim                                         satNewIntIo);
6926285242Sachim    if (satNewIntIo == agNULL)
6927285242Sachim    {
6928285242Sachim      /* memory allocation failure */
6929285242Sachim      satFreeIntIoResource( tiRoot,
6930285242Sachim                            satDevData,
6931285242Sachim                            satNewIntIo);
6932285242Sachim      /* IMMED == 0 */
6933285242Sachim      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6934285242Sachim      {
6935285242Sachim        satSetSensePayload( pSense,
6936285242Sachim                            SCSI_SNSKEY_ABORTED_COMMAND,
6937285242Sachim                            0,
6938285242Sachim                            SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6939285242Sachim                            satOrgIOContext);
6940285242Sachim      }
6941285242Sachim      else   /* IMMED == 1 */
6942285242Sachim      {
6943285242Sachim        satSetDeferredSensePayload( pSense,
6944285242Sachim                                    SCSI_SNSKEY_ABORTED_COMMAND,
6945285242Sachim                                    0,
6946285242Sachim                                    SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6947285242Sachim                                    satOrgIOContext);
6948285242Sachim      }
6949285242Sachim      ostiInitiatorIOCompleted( tiRoot,
6950285242Sachim                                tiOrgIORequest,
6951285242Sachim                                tiIOSuccess,
6952285242Sachim                                SCSI_STAT_CHECK_CONDITION,
6953285242Sachim                                satOrgIOContext->pTiSenseData,
6954285242Sachim                                satOrgIOContext->interruptContext );
6955285242Sachim
6956285242Sachim      TI_DBG1(("satStartStopUnitCB: momory allocation fails\n"));
6957285242Sachim      return;
6958285242Sachim    } /* end of memory allocation failure */
6959285242Sachim
6960285242Sachim    /*
6961285242Sachim     * Need to initialize all the fields within satIOContext
6962285242Sachim     */
6963285242Sachim
6964285242Sachim    satNewIOContext = satPrepareNewIO(
6965285242Sachim                                      satNewIntIo,
6966285242Sachim                                      tiOrgIORequest,
6967285242Sachim                                      satDevData,
6968285242Sachim                                      scsiCmnd,
6969285242Sachim                                      satOrgIOContext
6970285242Sachim                                      );
6971285242Sachim
6972285242Sachim    /* sending SAT_STANDBY */
6973285242Sachim    status = satStartStopUnit_1( tiRoot,
6974285242Sachim                                &satNewIntIo->satIntTiIORequest,
6975285242Sachim                                satNewIOContext->ptiDeviceHandle,
6976285242Sachim                                &satNewIntIo->satIntTiScsiXchg,
6977285242Sachim                                satNewIOContext);
6978285242Sachim
6979285242Sachim    if (status != tiSuccess)
6980285242Sachim    {
6981285242Sachim      /* sending SAT_CHECK_POWER_MODE fails */
6982285242Sachim      satFreeIntIoResource( tiRoot,
6983285242Sachim                            satDevData,
6984285242Sachim                            satNewIntIo);
6985285242Sachim
6986285242Sachim      /* IMMED == 0 */
6987285242Sachim      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6988285242Sachim      {
6989285242Sachim        satSetSensePayload( pSense,
6990285242Sachim                            SCSI_SNSKEY_ABORTED_COMMAND,
6991285242Sachim                            0,
6992285242Sachim                            SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6993285242Sachim                            satOrgIOContext);
6994285242Sachim      }
6995285242Sachim      else   /* IMMED == 1 */
6996285242Sachim      {
6997285242Sachim        satSetDeferredSensePayload( pSense,
6998285242Sachim                                    SCSI_SNSKEY_ABORTED_COMMAND,
6999285242Sachim                                    0,
7000285242Sachim                                    SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
7001285242Sachim                                    satOrgIOContext);
7002285242Sachim      }
7003285242Sachim      ostiInitiatorIOCompleted( tiRoot,
7004285242Sachim                                tiOrgIORequest,
7005285242Sachim                                tiIOSuccess,
7006285242Sachim                                SCSI_STAT_CHECK_CONDITION,
7007285242Sachim                                satOrgIOContext->pTiSenseData,
7008285242Sachim                                satOrgIOContext->interruptContext );
7009285242Sachim
7010285242Sachim      TI_DBG1(("satStartStopUnitCB: calling satStartStopUnit_1 fails\n"));
7011285242Sachim      return;
7012285242Sachim    }
7013285242Sachim    break;
7014285242Sachim  case SAT_STANDBY:
7015285242Sachim    TI_DBG5(("satStartStopUnitCB: SAT_STANDBY success case\n"));
7016285242Sachim
7017285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7018285242Sachim
7019285242Sachim    /* done with SAT_STANDBY */
7020285242Sachim    satFreeIntIoResource( tiRoot,
7021285242Sachim                          satDevData,
7022285242Sachim                          satIntIo);
7023285242Sachim    /*
7024285242Sachim      if immed == 0, return good status
7025285242Sachim     */
7026285242Sachim    /* IMMED == 0 */
7027285242Sachim    if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
7028285242Sachim    {
7029285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7030285242Sachim                                tiOrgIORequest,
7031285242Sachim                                tiIOSuccess,
7032285242Sachim                                SCSI_STAT_GOOD,
7033285242Sachim                                agNULL,
7034285242Sachim                                satOrgIOContext->interruptContext );
7035285242Sachim    }
7036285242Sachim    satDevData->satStopState = agTRUE;
7037285242Sachim    break;
7038285242Sachim  case SAT_READ_VERIFY_SECTORS:     /* fall through */
7039285242Sachim  case SAT_READ_VERIFY_SECTORS_EXT:
7040285242Sachim    TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n"));
7041285242Sachim
7042285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7043285242Sachim
7044285242Sachim    /* done with SAT_READ_VERIFY_SECTORS(_EXT) */
7045285242Sachim    satFreeIntIoResource( tiRoot,
7046285242Sachim                          satDevData,
7047285242Sachim                          satIntIo);
7048285242Sachim    /*
7049285242Sachim      if immed == 0, return good status
7050285242Sachim     */
7051285242Sachim    if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
7052285242Sachim    {
7053285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7054285242Sachim                                tiOrgIORequest,
7055285242Sachim                                tiIOSuccess,
7056285242Sachim                                SCSI_STAT_GOOD,
7057285242Sachim                                agNULL,
7058285242Sachim                                satOrgIOContext->interruptContext );
7059285242Sachim    }
7060285242Sachim    /*
7061285242Sachim      if immed == 0, return good status
7062285242Sachim     */
7063285242Sachim    /*
7064285242Sachim      don't forget to check and set driver state; Active power state
7065285242Sachim    */
7066285242Sachim    satDevData->satStopState = agFALSE;
7067285242Sachim    break;
7068285242Sachim  case SAT_MEDIA_EJECT:
7069285242Sachim    TI_DBG5(("satStartStopUnitCB: SAT_MEDIA_EJECT success case\n"));
7070285242Sachim
7071285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7072285242Sachim
7073285242Sachim    /* done with SAT_READ_VERIFY_SECTORS(_EXT) */
7074285242Sachim    satFreeIntIoResource( tiRoot,
7075285242Sachim                          satDevData,
7076285242Sachim                          satIntIo);
7077285242Sachim    /*
7078285242Sachim      if immed == 0, return good status
7079285242Sachim     */
7080285242Sachim    if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
7081285242Sachim    {
7082285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7083285242Sachim                                tiOrgIORequest,
7084285242Sachim                                tiIOSuccess,
7085285242Sachim                                SCSI_STAT_GOOD,
7086285242Sachim                                agNULL,
7087285242Sachim                                satOrgIOContext->interruptContext );
7088285242Sachim    }
7089285242Sachim    break;
7090285242Sachim  default:
7091285242Sachim    TI_DBG1(("satStartStopUnitCB:success but  error default case command 0x%x\n", hostToDevFis->h.command));
7092285242Sachim
7093285242Sachim    /* unspecified case, return no sense and no addition info */
7094285242Sachim    satSetSensePayload( pSense,
7095285242Sachim                        SCSI_SNSKEY_NO_SENSE,
7096285242Sachim                        0,
7097285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
7098285242Sachim                        satOrgIOContext);
7099285242Sachim
7100285242Sachim    ostiInitiatorIOCompleted( tiRoot,
7101285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7102285242Sachim                              tiIOSuccess,
7103285242Sachim                              SCSI_STAT_CHECK_CONDITION,
7104285242Sachim                              satOrgIOContext->pTiSenseData,
7105285242Sachim                              satOrgIOContext->interruptContext );
7106285242Sachim
7107285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7108285242Sachim
7109285242Sachim    satFreeIntIoResource( tiRoot,
7110285242Sachim                          satDevData,
7111285242Sachim                          satIntIo);
7112285242Sachim    break;
7113285242Sachim  }
7114285242Sachim  return;
7115285242Sachim}
7116285242Sachim
7117285242Sachim/*****************************************************************************
7118285242Sachim*! \brief  satSendDiagnosticCB
7119285242Sachim*
7120285242Sachim*   This routine is a callback function called from ossaSATACompleted().
7121285242Sachim*   This CB routine deals with Send Diagnostic completion.
7122285242Sachim*
7123285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
7124285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
7125285242Sachim*  \param   agIOStatus:  Status of completed I/O.
7126285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
7127285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
7128285242Sachim*                        length.
7129285242Sachim*  \param   agParam:     Additional info based on status.
7130285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
7131285242Sachim*
7132285242Sachim*  \return: none
7133285242Sachim*
7134285242Sachim*****************************************************************************/
7135285242Sachimvoid satSendDiagnosticCB(
7136285242Sachim                         agsaRoot_t        *agRoot,
7137285242Sachim                         agsaIORequest_t   *agIORequest,
7138285242Sachim                         bit32             agIOStatus,
7139285242Sachim                         agsaFisHeader_t   *agFirstDword,
7140285242Sachim                         bit32             agIOInfoLen,
7141285242Sachim                         void              *agParam,
7142285242Sachim                         void              *ioContext
7143285242Sachim                         )
7144285242Sachim{
7145285242Sachim  /*
7146285242Sachim    In the process of SendDiagnotic
7147285242Sachim    Process READ VERIFY SECTOR(S) EXT two time
7148285242Sachim    Process SMART ECECUTE OFF-LINE IMMEDIATE
7149285242Sachim  */
7150285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
7151285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
7152285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
7153285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
7154285242Sachim  tdIORequestBody_t       *tdIORequestBody;
7155285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
7156285242Sachim  satIOContext_t          *satIOContext;
7157285242Sachim  satIOContext_t          *satOrgIOContext;
7158285242Sachim  satIOContext_t          *satNewIOContext;
7159285242Sachim  satInternalIo_t         *satIntIo;
7160285242Sachim  satInternalIo_t         *satNewIntIo = agNULL;
7161285242Sachim  satDeviceData_t         *satDevData;
7162285242Sachim  scsiRspSense_t            *pSense;
7163285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
7164285242Sachim  tiIORequest_t             *tiOrgIORequest;
7165285242Sachim
7166285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
7167285242Sachim  bit32                     ataStatus = 0;
7168285242Sachim  bit32                     status;
7169285242Sachim  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
7170285242Sachim
7171285242Sachim
7172285242Sachim  TI_DBG5(("satSendDiagnosticCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
7173285242Sachim
7174285242Sachim  /* internally generate tiIOContext */
7175285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
7176285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
7177285242Sachim  satIntIo               = satIOContext->satIntIoContext;
7178285242Sachim  satDevData             = satIOContext->pSatDevData;
7179285242Sachim  hostToDevFis           = satIOContext->pFis;
7180285242Sachim
7181285242Sachim  if (satIntIo == agNULL)
7182285242Sachim  {
7183285242Sachim    TI_DBG4(("satSendDiagnosticCB: External satInternalIo_t satIntIoContext\n"));
7184285242Sachim    satOrgIOContext = satIOContext;
7185285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
7186285242Sachim    pSense          = satOrgIOContext->pSense;
7187285242Sachim    scsiCmnd        = satOrgIOContext->pScsiCmnd;
7188285242Sachim  }
7189285242Sachim  else
7190285242Sachim  {
7191285242Sachim    TI_DBG4(("satSendDiagnosticCB: Internal satInternalIo_t satIntIoContext\n"));
7192285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
7193285242Sachim    if (satOrgIOContext == agNULL)
7194285242Sachim    {
7195285242Sachim      TI_DBG4(("satSendDiagnosticCB: satOrgIOContext is NULL, wrong\n"));
7196285242Sachim      return;
7197285242Sachim    }
7198285242Sachim    else
7199285242Sachim    {
7200285242Sachim      TI_DBG4(("satSendDiagnosticCB: satOrgIOContext is NOT NULL\n"));
7201285242Sachim    }
7202285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
7203285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
7204285242Sachim    pSense                 = satOrgIOContext->pSense;
7205285242Sachim    scsiCmnd               = satOrgIOContext->pScsiCmnd;
7206285242Sachim  }
7207285242Sachim
7208285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
7209285242Sachim  tdIORequestBody->ioStarted = agFALSE;
7210285242Sachim
7211285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
7212285242Sachim  {
7213285242Sachim     TI_DBG1(("satSendDiagnosticCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
7214285242Sachim     satDevData->satVerifyState = 0;
7215285242Sachim     satDevData->satBGPendingDiag = agFALSE;
7216285242Sachim
7217285242Sachim    if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
7218285242Sachim    {
7219285242Sachim      /* no completion for background send diagnotic. It is done in satSendDiagnostic() */
7220285242Sachim      ostiInitiatorIOCompleted (
7221285242Sachim                                tiRoot,
7222285242Sachim                                tiOrgIORequest,
7223285242Sachim                                tiIOFailed,
7224285242Sachim                                tiDetailOtherError,
7225285242Sachim                                agNULL,
7226285242Sachim                                satOrgIOContext->interruptContext
7227285242Sachim                               );
7228285242Sachim     }
7229285242Sachim     satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7230285242Sachim
7231285242Sachim     satFreeIntIoResource( tiRoot,
7232285242Sachim                            satDevData,
7233285242Sachim                            satIntIo);
7234285242Sachim    return;
7235285242Sachim
7236285242Sachim  }
7237285242Sachim
7238285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
7239285242Sachim  {
7240285242Sachim    /* only agsaFisRegDeviceToHost_t is expected */
7241285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
7242285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
7243285242Sachim  }
7244285242Sachim
7245285242Sachim  TI_DBG5(("satSendDiagnosticCB: fis command 0x%x\n", hostToDevFis->h.command));
7246285242Sachim
7247285242Sachim  if( agIOStatus != OSSA_IO_SUCCESS)
7248285242Sachim  {
7249285242Sachim  /*
7250285242Sachim    checking IO status, FIS type and error status
7251285242Sachim  */
7252285242Sachim  satDevData->satVerifyState = 0;
7253285242Sachim  satDevData->satBGPendingDiag = agFALSE;
7254285242Sachim
7255285242Sachim  if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
7256285242Sachim      ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
7257285242Sachim      )
7258285242Sachim  {
7259285242Sachim
7260285242Sachim    /* for debugging */
7261285242Sachim    if( agIOStatus != OSSA_IO_SUCCESS)
7262285242Sachim    {
7263285242Sachim      if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) ||
7264285242Sachim           (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7265285242Sachim      {
7266285242Sachim        TI_DBG1(("satSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_READ_VERIFY_SECTORS(_EXT)\n"));
7267285242Sachim      }
7268285242Sachim      else
7269285242Sachim      {
7270285242Sachim        TI_DBG1(("satSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n"));
7271285242Sachim      }
7272285242Sachim    }
7273285242Sachim
7274285242Sachim    /* for debugging */
7275285242Sachim    if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
7276285242Sachim    {
7277285242Sachim      if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) ||
7278285242Sachim           (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7279285242Sachim      {
7280285242Sachim        TI_DBG1(("satSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_READ_VERIFY_SECTORS(_EXT)\n", statDevToHostFisHeader->fisType));
7281285242Sachim      }
7282285242Sachim      else
7283285242Sachim      {
7284285242Sachim        TI_DBG1(("satSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n",statDevToHostFisHeader->fisType));
7285285242Sachim      }
7286285242Sachim    }
7287285242Sachim
7288285242Sachim    /* for debugging */
7289285242Sachim    if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
7290285242Sachim         (ataStatus & DF_ATA_STATUS_MASK)
7291285242Sachim         )
7292285242Sachim    {
7293285242Sachim      if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) ||
7294285242Sachim           (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7295285242Sachim      {
7296285242Sachim        TI_DBG1(("satSendDiagnosticCB: FAILED, error status and SAT_READ_VERIFY_SECTORS(_EXT)\n"));
7297285242Sachim      }
7298285242Sachim      else
7299285242Sachim      {
7300285242Sachim        TI_DBG1(("satSendDiagnosticCB: FAILED, error status and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n"));
7301285242Sachim      }
7302285242Sachim    }
7303285242Sachim
7304285242Sachim    /* Process abort case */
7305285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
7306285242Sachim    {
7307285242Sachim      satProcessAbort(tiRoot,
7308285242Sachim                      tiOrgIORequest,
7309285242Sachim                      satOrgIOContext
7310285242Sachim                      );
7311285242Sachim
7312285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7313285242Sachim
7314285242Sachim      satFreeIntIoResource( tiRoot,
7315285242Sachim                            satDevData,
7316285242Sachim                            satIntIo);
7317285242Sachim      return;
7318285242Sachim    }
7319285242Sachim
7320285242Sachim    if ( (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS) ||
7321285242Sachim         (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7322285242Sachim    {
7323285242Sachim      /* report using the original tiIOrequst */
7324285242Sachim      /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */
7325285242Sachim      satSetSensePayload( pSense,
7326285242Sachim                          SCSI_SNSKEY_HARDWARE_ERROR,
7327285242Sachim                          0,
7328285242Sachim                          SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7329285242Sachim                          satOrgIOContext);
7330285242Sachim
7331285242Sachim      ostiInitiatorIOCompleted( tiRoot,
7332285242Sachim                                tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7333285242Sachim                                tiIOSuccess,
7334285242Sachim                                SCSI_STAT_CHECK_CONDITION,
7335285242Sachim                                satOrgIOContext->pTiSenseData,
7336285242Sachim                                satOrgIOContext->interruptContext );
7337285242Sachim
7338285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7339285242Sachim
7340285242Sachim      satFreeIntIoResource( tiRoot,
7341285242Sachim                            satDevData,
7342285242Sachim                            satIntIo);
7343285242Sachim      return;
7344285242Sachim    }
7345285242Sachim    else
7346285242Sachim    {
7347285242Sachim      /* report using the original tiIOrequst */
7348285242Sachim      /* failed during sending SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
7349285242Sachim      satSetSensePayload( pSense,
7350285242Sachim                          SCSI_SNSKEY_HARDWARE_ERROR,
7351285242Sachim                          0,
7352285242Sachim                          SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7353285242Sachim                          satOrgIOContext);
7354285242Sachim
7355285242Sachim      if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
7356285242Sachim      {
7357285242Sachim        /* no completion for background send diagnotic. It is done in satSendDiagnostic() */
7358285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7359285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7360285242Sachim                                  tiIOSuccess,
7361285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
7362285242Sachim                                  satOrgIOContext->pTiSenseData,
7363285242Sachim                                  satOrgIOContext->interruptContext );
7364285242Sachim
7365285242Sachim      }
7366285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7367285242Sachim
7368285242Sachim      satFreeIntIoResource( tiRoot,
7369285242Sachim                            satDevData,
7370285242Sachim                            satIntIo);
7371285242Sachim      return;
7372285242Sachim    }
7373285242Sachim  }
7374285242Sachim  }
7375285242Sachim
7376285242Sachim  /* processing success case */
7377285242Sachim  switch (hostToDevFis->h.command)
7378285242Sachim  {
7379285242Sachim  case SAT_READ_VERIFY_SECTORS:     /* fall through */
7380285242Sachim  case SAT_READ_VERIFY_SECTORS_EXT:
7381285242Sachim    TI_DBG5(("satSendDiagnosticCB: SAT_READ_VERIFY_SECTORS(_EXT) case\n"));
7382285242Sachim    tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
7383285242Sachim    satDevData->satVerifyState++;
7384285242Sachim    tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
7385285242Sachim    TI_DBG5(("satSendDiagnosticCB: satVerifyState %d\n",satDevData->satVerifyState));
7386285242Sachim
7387285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7388285242Sachim
7389285242Sachim    /* done with internally genereated AT_READ_VERIFY_SECTORS(_EXT) */
7390285242Sachim    satFreeIntIoResource( tiRoot,
7391285242Sachim                          satDevData,
7392285242Sachim                          satIntIo);
7393285242Sachim
7394285242Sachim    if (satDevData->satVerifyState == 3)
7395285242Sachim    {
7396285242Sachim      /* reset satVerifyState */
7397285242Sachim      satDevData->satVerifyState = 0;
7398285242Sachim      /* return GOOD status */
7399285242Sachim      TI_DBG5(("satSendDiagnosticCB: return GOOD status\n"));
7400285242Sachim      ostiInitiatorIOCompleted( tiRoot,
7401285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7402285242Sachim                                tiIOSuccess,
7403285242Sachim                                SCSI_STAT_GOOD,
7404285242Sachim                                agNULL,
7405285242Sachim                                satOrgIOContext->interruptContext );
7406285242Sachim     return;
7407285242Sachim    }
7408285242Sachim    else
7409285242Sachim    {
7410285242Sachim
7411285242Sachim      /* prepare SAT_READ_VERIFY_SECTORS(_EXT) */
7412285242Sachim      satNewIntIo = satAllocIntIoResource( tiRoot,
7413285242Sachim                                           tiOrgIORequest,
7414285242Sachim                                           satDevData,
7415285242Sachim                                           0,
7416285242Sachim                                           satNewIntIo);
7417285242Sachim      if (satNewIntIo == agNULL)
7418285242Sachim      {
7419285242Sachim        /* reset satVerifyState */
7420285242Sachim        satDevData->satVerifyState = 0;
7421285242Sachim        /* memory allocation failure */
7422285242Sachim        satFreeIntIoResource( tiRoot,
7423285242Sachim                              satDevData,
7424285242Sachim                              satNewIntIo);
7425285242Sachim
7426285242Sachim        /* failed as a part of sending SAT_READ_VERIFY_SECTORS(_EXT) */
7427285242Sachim        satSetSensePayload( pSense,
7428285242Sachim                            SCSI_SNSKEY_HARDWARE_ERROR,
7429285242Sachim                            0,
7430285242Sachim                            SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7431285242Sachim                            satOrgIOContext);
7432285242Sachim
7433285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7434285242Sachim                                  tiOrgIORequest,
7435285242Sachim                                  tiIOSuccess,
7436285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
7437285242Sachim                                  satOrgIOContext->pTiSenseData,
7438285242Sachim                                  satOrgIOContext->interruptContext );
7439285242Sachim
7440285242Sachim        TI_DBG1(("satSendDiagnosticCB: momory allocation fails\n"));
7441285242Sachim        return;
7442285242Sachim      } /* end of memory allocation failure */
7443285242Sachim
7444285242Sachim      /*
7445285242Sachim       * Need to initialize all the fields within satIOContext
7446285242Sachim       */
7447285242Sachim
7448285242Sachim      satNewIOContext = satPrepareNewIO(
7449285242Sachim                                        satNewIntIo,
7450285242Sachim                                        tiOrgIORequest,
7451285242Sachim                                        satDevData,
7452285242Sachim                                        scsiCmnd,
7453285242Sachim                                        satOrgIOContext
7454285242Sachim                                        );
7455285242Sachim
7456285242Sachim      if (satDevData->satVerifyState == 1)
7457285242Sachim      {
7458285242Sachim        /* sending SAT_CHECK_POWER_MODE */
7459285242Sachim        status = satSendDiagnostic_1( tiRoot,
7460285242Sachim                                      &satNewIntIo->satIntTiIORequest,
7461285242Sachim                                      satNewIOContext->ptiDeviceHandle,
7462285242Sachim                                      &satNewIntIo->satIntTiScsiXchg,
7463285242Sachim                                      satNewIOContext);
7464285242Sachim      }
7465285242Sachim      else
7466285242Sachim      {
7467285242Sachim        /* satDevData->satVerifyState == 2 */
7468285242Sachim        status = satSendDiagnostic_2( tiRoot,
7469285242Sachim                                      &satNewIntIo->satIntTiIORequest,
7470285242Sachim                                      satNewIOContext->ptiDeviceHandle,
7471285242Sachim                                      &satNewIntIo->satIntTiScsiXchg,
7472285242Sachim                                      satNewIOContext);
7473285242Sachim      }
7474285242Sachim
7475285242Sachim      if (status != tiSuccess)
7476285242Sachim      {
7477285242Sachim        /* sending SAT_READ_VERIFY_SECTORS(_EXT) fails */
7478285242Sachim        satFreeIntIoResource( tiRoot,
7479285242Sachim                              satDevData,
7480285242Sachim                              satNewIntIo);
7481285242Sachim
7482285242Sachim        /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */
7483285242Sachim        satSetSensePayload( pSense,
7484285242Sachim                            SCSI_SNSKEY_HARDWARE_ERROR,
7485285242Sachim                            0,
7486285242Sachim                            SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7487285242Sachim                            satOrgIOContext);
7488285242Sachim
7489285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7490285242Sachim                                  tiOrgIORequest,
7491285242Sachim                                  tiIOSuccess,
7492285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
7493285242Sachim                                  satOrgIOContext->pTiSenseData,
7494285242Sachim                                  satOrgIOContext->interruptContext );
7495285242Sachim
7496285242Sachim        /* reset satVerifyState */
7497285242Sachim        satDevData->satVerifyState = 0;
7498285242Sachim        TI_DBG1(("satSendDiagnosticCB: calling satSendDiagnostic_1 or _2 fails\n"));
7499285242Sachim        return;
7500285242Sachim      }
7501285242Sachim    } /* satDevData->satVerifyState == 1 or 2 */
7502285242Sachim
7503285242Sachim    break;
7504285242Sachim  case SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE:
7505285242Sachim    TI_DBG5(("satSendDiagnosticCB: SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE case\n"));
7506285242Sachim
7507285242Sachim    satDevData->satBGPendingDiag = agFALSE;
7508285242Sachim
7509285242Sachim    if (hostToDevFis->d.lbaLow == 0x01 || hostToDevFis->d.lbaLow == 0x02)
7510285242Sachim    {
7511285242Sachim      /* for background send diagnostic, no completion here. It is done already. */
7512285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7513285242Sachim
7514285242Sachim      /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
7515285242Sachim      satFreeIntIoResource( tiRoot,
7516285242Sachim                            satDevData,
7517285242Sachim                            satIntIo);
7518285242Sachim      TI_DBG5(("satSendDiagnosticCB: returning but no IOCompleted\n"));
7519285242Sachim    }
7520285242Sachim    else
7521285242Sachim    {
7522285242Sachim      TI_DBG5(("satSendDiagnosticCB: returning good status for senddiagnostic\n"));
7523285242Sachim      ostiInitiatorIOCompleted( tiRoot,
7524285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7525285242Sachim                                tiIOSuccess,
7526285242Sachim                                SCSI_STAT_GOOD,
7527285242Sachim                                agNULL,
7528285242Sachim                                satOrgIOContext->interruptContext );
7529285242Sachim
7530285242Sachim
7531285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7532285242Sachim
7533285242Sachim      /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
7534285242Sachim      satFreeIntIoResource( tiRoot,
7535285242Sachim                            satDevData,
7536285242Sachim                            satIntIo);
7537285242Sachim    }
7538285242Sachim
7539285242Sachim    break;
7540285242Sachim  default:
7541285242Sachim    TI_DBG1(("satSendDiagnosticCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
7542285242Sachim    /* unspecified case, return no sense and no addition info */
7543285242Sachim    satSetSensePayload( pSense,
7544285242Sachim                        SCSI_SNSKEY_NO_SENSE,
7545285242Sachim                        0,
7546285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
7547285242Sachim                        satOrgIOContext);
7548285242Sachim
7549285242Sachim    ostiInitiatorIOCompleted( tiRoot,
7550285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7551285242Sachim                              tiIOSuccess,
7552285242Sachim                              SCSI_STAT_CHECK_CONDITION,
7553285242Sachim                              satOrgIOContext->pTiSenseData,
7554285242Sachim                              satOrgIOContext->interruptContext );
7555285242Sachim
7556285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7557285242Sachim
7558285242Sachim    satFreeIntIoResource( tiRoot,
7559285242Sachim                          satDevData,
7560285242Sachim                          satIntIo);
7561285242Sachim    break;
7562285242Sachim  }
7563285242Sachim  return;
7564285242Sachim}
7565285242Sachim/*****************************************************************************
7566285242Sachim*! \brief  satRequestSenseCB
7567285242Sachim*
7568285242Sachim*   This routine is a callback function called from ossaSATACompleted().
7569285242Sachim*   This CB routine deals with Request Sense completion.
7570285242Sachim*
7571285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
7572285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
7573285242Sachim*  \param   agIOStatus:  Status of completed I/O.
7574285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
7575285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
7576285242Sachim*                        length.
7577285242Sachim*  \param   agParam:     Additional info based on status.
7578285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
7579285242Sachim*
7580285242Sachim*  \return: none
7581285242Sachim*
7582285242Sachim*****************************************************************************/
7583285242Sachim/*
7584285242Sachim  CB for internnaly generated SMART_RETURN_STATUS and SAT_CHECK_POWER_MODE
7585285242Sachim  in the process of RequestSense
7586285242Sachim
7587285242Sachim*/
7588285242Sachimvoid satRequestSenseCB(
7589285242Sachim                        agsaRoot_t        *agRoot,
7590285242Sachim                        agsaIORequest_t   *agIORequest,
7591285242Sachim                        bit32             agIOStatus,
7592285242Sachim                        agsaFisHeader_t   *agFirstDword,
7593285242Sachim                        bit32             agIOInfoLen,
7594285242Sachim                        void              *agParam,
7595285242Sachim                        void              *ioContext
7596285242Sachim                        )
7597285242Sachim{
7598285242Sachim  /* ATA Vol 1, p299 SAT_SMART_RETURN_STATUS */
7599285242Sachim  /*
7600285242Sachim    if threshold exceeds, return SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE
7601285242Sachim    else call satRequestSense_1 to send CHECK_POWER_MODE
7602285242Sachim  */
7603285242Sachim
7604285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
7605285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
7606285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
7607285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
7608285242Sachim  tdIORequestBody_t       *tdIORequestBody;
7609285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
7610285242Sachim  satIOContext_t          *satIOContext;
7611285242Sachim  satIOContext_t          *satOrgIOContext;
7612285242Sachim  satIOContext_t          *satNewIOContext;
7613285242Sachim  satInternalIo_t         *satIntIo;
7614285242Sachim  satInternalIo_t         *satNewIntIo = agNULL;
7615285242Sachim  satDeviceData_t         *satDevData;
7616285242Sachim  scsiRspSense_t            *pSense;
7617285242Sachim  tiIORequest_t             *tiOrgIORequest;
7618285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
7619285242Sachim
7620285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
7621285242Sachim  bit32                     ataStatus = 0;
7622285242Sachim  bit32                     status;
7623285242Sachim  agsaFisRegD2HHeader_t     *statDevToHostFisHeader = agNULL;
7624285242Sachim  agsaFisRegD2HData_t       statDevToHostFisData;
7625285242Sachim  bit32                     lenReceived = 0;
7626285242Sachim  bit32                     dataLength;
7627285242Sachim
7628285242Sachim  TI_DBG4(("satRequestSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
7629285242Sachim
7630285242Sachim  /* internally generate tiIOContext */
7631285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
7632285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
7633285242Sachim  satIntIo               = satIOContext->satIntIoContext;
7634285242Sachim  satDevData             = satIOContext->pSatDevData;
7635285242Sachim  hostToDevFis           = satIOContext->pFis;
7636285242Sachim
7637285242Sachim  /*ttttttthe one */
7638285242Sachim  if (satIntIo == agNULL)
7639285242Sachim  {
7640285242Sachim    TI_DBG4(("satRequestSenseCB: External satInternalIo_t satIntIoContext\n"));
7641285242Sachim    satOrgIOContext = satIOContext;
7642285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
7643285242Sachim    if (satOrgIOContext->superIOFlag)
7644285242Sachim    {
7645285242Sachim      pSense = (scsiRspSense_t *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7646285242Sachim    }
7647285242Sachim    else
7648285242Sachim    {
7649285242Sachim      pSense = (scsiRspSense_t *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7650285242Sachim    }
7651285242Sachim    scsiCmnd = satOrgIOContext->pScsiCmnd;
7652285242Sachim  }
7653285242Sachim  else
7654285242Sachim  {
7655285242Sachim    TI_DBG4(("satRequestSenseCB: Internal satInternalIo_t satIntIoContext\n"));
7656285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
7657285242Sachim    if (satOrgIOContext == agNULL)
7658285242Sachim    {
7659285242Sachim      TI_DBG4(("satRequestSenseCB: satOrgIOContext is NULL, wrong\n"));
7660285242Sachim      return;
7661285242Sachim    }
7662285242Sachim    else
7663285242Sachim    {
7664285242Sachim      TI_DBG4(("satRequestSenseCB: satOrgIOContext is NOT NULL\n"));
7665285242Sachim    }
7666285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
7667285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
7668285242Sachim
7669285242Sachim    if (satOrgIOContext->superIOFlag)
7670285242Sachim    {
7671285242Sachim      pSense = (scsiRspSense_t *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7672285242Sachim    }
7673285242Sachim    else
7674285242Sachim    {
7675285242Sachim      pSense = (scsiRspSense_t *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7676285242Sachim    }
7677285242Sachim    scsiCmnd = satOrgIOContext->pScsiCmnd;
7678285242Sachim  }
7679285242Sachim
7680285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
7681285242Sachim  tdIORequestBody->ioStarted = agFALSE;
7682285242Sachim
7683285242Sachim  TI_DBG4(("satRequestSenseCB: fis command 0x%x\n", hostToDevFis->h.command));
7684285242Sachim
7685285242Sachim  lenReceived = scsiCmnd->cdb[4];
7686285242Sachim  TI_DBG1(("satRequestSenseCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived));
7687285242Sachim
7688285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
7689285242Sachim  {
7690285242Sachim    TI_DBG1(("satRequestSenseCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
7691285242Sachim    ostiInitiatorIOCompleted (
7692285242Sachim                             tiRoot,
7693285242Sachim                             tiOrgIORequest,
7694285242Sachim                             tiIOFailed,
7695285242Sachim                             tiDetailOtherError,
7696285242Sachim                             agNULL,
7697285242Sachim                             satOrgIOContext->interruptContext
7698285242Sachim                             );
7699285242Sachim
7700285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7701285242Sachim
7702285242Sachim    satFreeIntIoResource( tiRoot,
7703285242Sachim                          satDevData,
7704285242Sachim                          satIntIo);
7705285242Sachim
7706285242Sachim    return;
7707285242Sachim  }
7708285242Sachim
7709285242Sachim  /*
7710285242Sachim    checking IO status, FIS type and error status
7711285242Sachim  */
7712285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
7713285242Sachim  {
7714285242Sachim    /* only agsaFisRegDeviceToHost_t is expected */
7715285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
7716285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
7717285242Sachim
7718285242Sachim    /* for debugging */
7719285242Sachim    if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
7720285242Sachim    {
7721285242Sachim      if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
7722285242Sachim      {
7723285242Sachim        TI_DBG1(("satRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_RETURN_STATU\n", statDevToHostFisHeader->fisType));
7724285242Sachim      }
7725285242Sachim      else
7726285242Sachim      {
7727285242Sachim        TI_DBG1(("satRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_CHECK_POWER_MODE\n",statDevToHostFisHeader->fisType));
7728285242Sachim      }
7729285242Sachim    }
7730285242Sachim
7731285242Sachim    /* for debugging */
7732285242Sachim    if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
7733285242Sachim         (ataStatus & DF_ATA_STATUS_MASK)
7734285242Sachim         )
7735285242Sachim    {
7736285242Sachim      if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
7737285242Sachim      {
7738285242Sachim        TI_DBG1(("satRequestSenseCB: FAILED, error status and SAT_SMART_RETURN_STATU\n"));
7739285242Sachim      }
7740285242Sachim      else
7741285242Sachim      {
7742285242Sachim        TI_DBG1(("satRequestSenseCB: FAILED, error status and SAT_CHECK_POWER_MODE\n"));
7743285242Sachim      }
7744285242Sachim    }
7745285242Sachim
7746285242Sachim    /* Process abort case */
7747285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
7748285242Sachim    {
7749285242Sachim      satProcessAbort(tiRoot,
7750285242Sachim                      tiOrgIORequest,
7751285242Sachim                      satOrgIOContext
7752285242Sachim                      );
7753285242Sachim
7754285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7755285242Sachim
7756285242Sachim      satFreeIntIoResource( tiRoot,
7757285242Sachim                            satDevData,
7758285242Sachim                            satIntIo);
7759285242Sachim      return;
7760285242Sachim    }
7761285242Sachim
7762285242Sachim    if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
7763285242Sachim    {
7764285242Sachim      /* report using the original tiIOrequst */
7765285242Sachim      /* failed during sending SMART RETURN STATUS */
7766285242Sachim      satSetSensePayload( pSense,
7767285242Sachim                          SCSI_SNSKEY_NO_SENSE,
7768285242Sachim                          0,
7769285242Sachim                          SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE,
7770285242Sachim                          satOrgIOContext);
7771285242Sachim
7772285242Sachim      if (SENSE_DATA_LENGTH < lenReceived)
7773285242Sachim      {
7774285242Sachim        /* underrun */
7775285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7776285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7777285242Sachim                                  tiIOUnderRun,
7778285242Sachim                                  lenReceived - SENSE_DATA_LENGTH,
7779285242Sachim                                  agNULL,
7780285242Sachim                                  satOrgIOContext->interruptContext );
7781285242Sachim      }
7782285242Sachim      else
7783285242Sachim      {
7784285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7785285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7786285242Sachim                                  tiIOSuccess,
7787285242Sachim                                  SCSI_STAT_GOOD,
7788285242Sachim                                  agNULL,
7789285242Sachim                                  satOrgIOContext->interruptContext );
7790285242Sachim      }
7791285242Sachim    }
7792285242Sachim    else
7793285242Sachim    {
7794285242Sachim      /* report using the original tiIOrequst */
7795285242Sachim      /* failed during sending SAT_CHECK_POWER_MODE */
7796285242Sachim      satSetSensePayload( pSense,
7797285242Sachim                          SCSI_SNSKEY_NO_SENSE,
7798285242Sachim                          0,
7799285242Sachim                          SCSI_SNSCODE_LOW_POWER_CONDITION_ON,
7800285242Sachim                          satOrgIOContext);
7801285242Sachim
7802285242Sachim      if (SENSE_DATA_LENGTH < lenReceived)
7803285242Sachim      {
7804285242Sachim        /* underrun */
7805285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7806285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7807285242Sachim                                  tiIOUnderRun,
7808285242Sachim                                  lenReceived - SENSE_DATA_LENGTH,
7809285242Sachim                                  agNULL,
7810285242Sachim                                  satOrgIOContext->interruptContext );
7811285242Sachim       }
7812285242Sachim       else
7813285242Sachim       {
7814285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7815285242Sachim                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7816285242Sachim                                  tiIOSuccess,
7817285242Sachim                                  SCSI_STAT_GOOD,
7818285242Sachim                                  agNULL,
7819285242Sachim                                  satOrgIOContext->interruptContext );
7820285242Sachim       }
7821285242Sachim    }
7822285242Sachim
7823285242Sachim
7824285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7825285242Sachim
7826285242Sachim    satFreeIntIoResource( tiRoot,
7827285242Sachim                            satDevData,
7828285242Sachim                            satIntIo);
7829285242Sachim    return;
7830285242Sachim  }
7831285242Sachim
7832285242Sachim  saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t));
7833285242Sachim
7834285242Sachim  switch (hostToDevFis->h.command)
7835285242Sachim  {
7836285242Sachim  case SAT_SMART_RETURN_STATUS:
7837285242Sachim    TI_DBG4(("satRequestSenseCB: SAT_SMART_RETURN_STATUS case\n"));
7838285242Sachim    if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C)
7839285242Sachim    {
7840285242Sachim      /* threshold exceeds */
7841285242Sachim      TI_DBG1(("satRequestSenseCB: threshold exceeds\n"));
7842285242Sachim
7843285242Sachim
7844285242Sachim      /* report using the original tiIOrequst */
7845285242Sachim      /* failed during sending SMART RETURN STATUS */
7846285242Sachim      satSetSensePayload( pSense,
7847285242Sachim                          SCSI_SNSKEY_NO_SENSE,
7848285242Sachim                          0,
7849285242Sachim                          SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE,
7850285242Sachim                          satOrgIOContext);
7851285242Sachim
7852285242Sachim      if (SENSE_DATA_LENGTH < lenReceived)
7853285242Sachim      {
7854285242Sachim        /* underrun */
7855285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7856285242Sachim                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7857285242Sachim                                  tiIOUnderRun,
7858285242Sachim                                  lenReceived - SENSE_DATA_LENGTH,
7859285242Sachim                                  agNULL,
7860285242Sachim                                  satOrgIOContext->interruptContext );                                     }
7861285242Sachim      else
7862285242Sachim      {
7863285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7864285242Sachim                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7865285242Sachim                                  tiIOSuccess,
7866285242Sachim                                  SCSI_STAT_GOOD,
7867285242Sachim                                  agNULL,
7868285242Sachim                                  satOrgIOContext->interruptContext );                                     }
7869285242Sachim
7870285242Sachim
7871285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7872285242Sachim
7873285242Sachim      satFreeIntIoResource( tiRoot,
7874285242Sachim                            satDevData,
7875285242Sachim                            satIntIo);
7876285242Sachim      return;
7877285242Sachim    }
7878285242Sachim
7879285242Sachim
7880285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7881285242Sachim
7882285242Sachim    /* done with internally genereated SAT_SMART_RETURN_STATUS */
7883285242Sachim    satFreeIntIoResource( tiRoot,
7884285242Sachim                          satDevData,
7885285242Sachim                          satIntIo);
7886285242Sachim
7887285242Sachim    /* at this point, successful SMART_RETURN_STATUS
7888285242Sachim       xmit SAT_CHECK_POWER_MODE
7889285242Sachim    */
7890285242Sachim    if (satOrgIOContext->superIOFlag)
7891285242Sachim    {
7892285242Sachim      dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
7893285242Sachim    }
7894285242Sachim    else
7895285242Sachim    {
7896285242Sachim      dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
7897285242Sachim    }
7898285242Sachim
7899285242Sachim    satNewIntIo = satAllocIntIoResource( tiRoot,
7900285242Sachim                                         tiOrgIORequest,
7901285242Sachim                                         satDevData,
7902285242Sachim                                         dataLength,
7903285242Sachim                                         satNewIntIo);
7904285242Sachim    if (satNewIntIo == agNULL)
7905285242Sachim    {
7906285242Sachim      /* memory allocation failure */
7907285242Sachim      satFreeIntIoResource( tiRoot,
7908285242Sachim                            satDevData,
7909285242Sachim                            satNewIntIo);
7910285242Sachim
7911285242Sachim      /* failed as a part of sending SMART RETURN STATUS */
7912285242Sachim      satSetSensePayload( pSense,
7913285242Sachim                          SCSI_SNSKEY_NO_SENSE,
7914285242Sachim                          0,
7915285242Sachim                          SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE,
7916285242Sachim                          satOrgIOContext);
7917285242Sachim
7918285242Sachim      if (SENSE_DATA_LENGTH < lenReceived)
7919285242Sachim      {
7920285242Sachim        /* underrun */
7921285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7922285242Sachim                                  tiOrgIORequest,
7923285242Sachim                                  tiIOUnderRun,
7924285242Sachim                                  lenReceived - SENSE_DATA_LENGTH,
7925285242Sachim                                  agNULL,
7926285242Sachim                                  satOrgIOContext->interruptContext );
7927285242Sachim      }
7928285242Sachim      else
7929285242Sachim      {
7930285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7931285242Sachim                                  tiOrgIORequest,
7932285242Sachim                                  tiIOSuccess,
7933285242Sachim                                  SCSI_STAT_GOOD,
7934285242Sachim                                  agNULL,
7935285242Sachim                                  satOrgIOContext->interruptContext );
7936285242Sachim      }
7937285242Sachim
7938285242Sachim      TI_DBG1(("satRequestSenseCB: momory allocation fails\n"));
7939285242Sachim      return;
7940285242Sachim    } /* end of memory allocation failure */
7941285242Sachim
7942285242Sachim
7943285242Sachim    /*
7944285242Sachim     * Need to initialize all the fields within satIOContext
7945285242Sachim     */
7946285242Sachim
7947285242Sachim    satNewIOContext = satPrepareNewIO(
7948285242Sachim                                      satNewIntIo,
7949285242Sachim                                      tiOrgIORequest,
7950285242Sachim                                      satDevData,
7951285242Sachim                                      scsiCmnd,
7952285242Sachim                                      satOrgIOContext
7953285242Sachim                                      );
7954285242Sachim
7955285242Sachim    /* sending SAT_CHECK_POWER_MODE */
7956285242Sachim    status = satRequestSense_1( tiRoot,
7957285242Sachim                               &satNewIntIo->satIntTiIORequest,
7958285242Sachim                               satNewIOContext->ptiDeviceHandle,
7959285242Sachim                               &satNewIntIo->satIntTiScsiXchg,
7960285242Sachim                               satNewIOContext);
7961285242Sachim
7962285242Sachim    if (status != tiSuccess)
7963285242Sachim    {
7964285242Sachim      /* sending SAT_CHECK_POWER_MODE fails */
7965285242Sachim      satFreeIntIoResource( tiRoot,
7966285242Sachim                            satDevData,
7967285242Sachim                            satNewIntIo);
7968285242Sachim
7969285242Sachim      /* failed during sending SAT_CHECK_POWER_MODE */
7970285242Sachim      satSetSensePayload( pSense,
7971285242Sachim                          SCSI_SNSKEY_NO_SENSE,
7972285242Sachim                          0,
7973285242Sachim                          SCSI_SNSCODE_LOW_POWER_CONDITION_ON,
7974285242Sachim                          satOrgIOContext);
7975285242Sachim
7976285242Sachim      if (SENSE_DATA_LENGTH < lenReceived)
7977285242Sachim      {
7978285242Sachim        /* underrun */
7979285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7980285242Sachim                                  tiOrgIORequest,
7981285242Sachim                                  tiIOUnderRun,
7982285242Sachim                                  lenReceived - SENSE_DATA_LENGTH,
7983285242Sachim                                  agNULL,
7984285242Sachim                                  satOrgIOContext->interruptContext );
7985285242Sachim      }
7986285242Sachim      else
7987285242Sachim      {
7988285242Sachim        ostiInitiatorIOCompleted( tiRoot,
7989285242Sachim                                  tiOrgIORequest,
7990285242Sachim                                  tiIOSuccess,
7991285242Sachim                                  SCSI_STAT_GOOD,
7992285242Sachim                                  agNULL,
7993285242Sachim                                  satOrgIOContext->interruptContext );
7994285242Sachim      }
7995285242Sachim
7996285242Sachim      TI_DBG1(("satRequestSenseCB: calling satRequestSense_1 fails\n"));
7997285242Sachim      return;
7998285242Sachim    }
7999285242Sachim
8000285242Sachim    break;
8001285242Sachim  case SAT_CHECK_POWER_MODE:
8002285242Sachim    TI_DBG4(("satRequestSenseCB: SAT_CHECK_POWER_MODE case\n"));
8003285242Sachim
8004285242Sachim    /* check ATA STANDBY state */
8005285242Sachim    if (statDevToHostFisData.sectorCount == 0x00)
8006285242Sachim    {
8007285242Sachim      /* in STANDBY */
8008285242Sachim      TI_DBG1(("satRequestSenseCB: in standby\n"));
8009285242Sachim
8010285242Sachim
8011285242Sachim      /* report using the original tiIOrequst */
8012285242Sachim      /* failed during sending SAT_CHECK_POWER_MODE */
8013285242Sachim      satSetSensePayload( pSense,
8014285242Sachim                          SCSI_SNSKEY_NO_SENSE,
8015285242Sachim                          0,
8016285242Sachim                          SCSI_SNSCODE_LOW_POWER_CONDITION_ON,
8017285242Sachim                          satOrgIOContext);
8018285242Sachim
8019285242Sachim      if (SENSE_DATA_LENGTH < lenReceived)
8020285242Sachim      {
8021285242Sachim        /* underrun */
8022285242Sachim        ostiInitiatorIOCompleted( tiRoot,
8023285242Sachim                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8024285242Sachim                                  tiIOUnderRun,
8025285242Sachim                                  lenReceived - SENSE_DATA_LENGTH,
8026285242Sachim                                  agNULL,
8027285242Sachim                                  satOrgIOContext->interruptContext );
8028285242Sachim      }
8029285242Sachim      else
8030285242Sachim      {
8031285242Sachim        ostiInitiatorIOCompleted( tiRoot,
8032285242Sachim                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8033285242Sachim                                  tiIOSuccess,
8034285242Sachim                                  SCSI_STAT_GOOD,
8035285242Sachim                                  agNULL,
8036285242Sachim                                  satOrgIOContext->interruptContext );
8037285242Sachim      }
8038285242Sachim
8039285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8040285242Sachim
8041285242Sachim      satFreeIntIoResource( tiRoot,
8042285242Sachim                            satDevData,
8043285242Sachim                            satIntIo);
8044285242Sachim      return;
8045285242Sachim    }
8046285242Sachim
8047285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8048285242Sachim
8049285242Sachim    /* done with internnaly generated SAT_CHECK_POWER_MODE */
8050285242Sachim    satFreeIntIoResource( tiRoot,
8051285242Sachim                          satDevData,
8052285242Sachim                          satIntIo);
8053285242Sachim
8054285242Sachim    if (satDevData->satFormatState == agTRUE)
8055285242Sachim    {
8056285242Sachim      TI_DBG1(("satRequestSenseCB: in format\n"));
8057285242Sachim
8058285242Sachim
8059285242Sachim      /* report using the original tiIOrequst */
8060285242Sachim      satSetSensePayload( pSense,
8061285242Sachim                          SCSI_SNSKEY_NOT_READY,
8062285242Sachim                          0,
8063285242Sachim                          SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_FORMAT_IN_PROGRESS,
8064285242Sachim                          satOrgIOContext);
8065285242Sachim
8066285242Sachim      if (SENSE_DATA_LENGTH < lenReceived)
8067285242Sachim      {
8068285242Sachim        /* underrun */
8069285242Sachim        ostiInitiatorIOCompleted( tiRoot,
8070285242Sachim                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8071285242Sachim                                  tiIOUnderRun,
8072285242Sachim                                  lenReceived - SENSE_DATA_LENGTH,
8073285242Sachim                                  agNULL,
8074285242Sachim                                  satOrgIOContext->interruptContext );
8075285242Sachim      }
8076285242Sachim      else
8077285242Sachim      {
8078285242Sachim        ostiInitiatorIOCompleted( tiRoot,
8079285242Sachim                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8080285242Sachim                                  tiIOSuccess,
8081285242Sachim                                  SCSI_STAT_GOOD,
8082285242Sachim                                  agNULL,
8083285242Sachim                                  satOrgIOContext->interruptContext );
8084285242Sachim      }
8085285242Sachim
8086285242Sachim      return;
8087285242Sachim    }
8088285242Sachim
8089285242Sachim    /* normal: returns good status for requestsense */
8090285242Sachim    /* report using the original tiIOrequst */
8091285242Sachim    satSetSensePayload( pSense,
8092285242Sachim                        SCSI_SNSKEY_NO_SENSE,
8093285242Sachim                        0,
8094285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8095285242Sachim                        satOrgIOContext);
8096285242Sachim    TI_DBG4(("satRequestSenseCB: returning good status for requestsense\n"));
8097285242Sachim    if (SENSE_DATA_LENGTH < lenReceived)
8098285242Sachim    {
8099285242Sachim      /* underrun */
8100285242Sachim      TI_DBG6(("satRequestSenseCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n",
8101285242Sachim        SENSE_DATA_LENGTH, lenReceived, tiOrgIORequest));
8102285242Sachim      ostiInitiatorIOCompleted( tiRoot,
8103285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8104285242Sachim                                tiIOUnderRun,
8105285242Sachim                                lenReceived - SENSE_DATA_LENGTH,
8106285242Sachim                                agNULL,
8107285242Sachim                                satOrgIOContext->interruptContext );
8108285242Sachim
8109285242Sachim    }
8110285242Sachim    else
8111285242Sachim    {
8112285242Sachim      ostiInitiatorIOCompleted( tiRoot,
8113285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8114285242Sachim                                tiIOSuccess,
8115285242Sachim                                SCSI_STAT_GOOD,
8116285242Sachim                                agNULL,
8117285242Sachim                                satOrgIOContext->interruptContext );
8118285242Sachim    }
8119285242Sachim
8120285242Sachim    break;
8121285242Sachim  default:
8122285242Sachim     TI_DBG1(("satRequestSenseCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
8123285242Sachim     /* pSense here is a part of satOrgIOContext */
8124285242Sachim     pSense = satOrgIOContext->pTiSenseData->senseData;
8125285242Sachim     satOrgIOContext->pTiSenseData->senseLen = SENSE_DATA_LENGTH;
8126285242Sachim     /* unspecified case, return no sense and no addition info */
8127285242Sachim     satSetSensePayload( pSense,
8128285242Sachim                         SCSI_SNSKEY_NO_SENSE,
8129285242Sachim                         0,
8130285242Sachim                         SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8131285242Sachim                         satOrgIOContext);
8132285242Sachim
8133285242Sachim     ostiInitiatorIOCompleted( tiRoot,
8134285242Sachim                               tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8135285242Sachim                               tiIOSuccess,
8136285242Sachim                               SCSI_STAT_CHECK_CONDITION,
8137285242Sachim                               satOrgIOContext->pTiSenseData,
8138285242Sachim                               satOrgIOContext->interruptContext );
8139285242Sachim
8140285242Sachim     satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8141285242Sachim
8142285242Sachim     satFreeIntIoResource( tiRoot,
8143285242Sachim                           satDevData,
8144285242Sachim                           satIntIo);
8145285242Sachim    break;
8146285242Sachim  } /* switch */
8147285242Sachim
8148285242Sachim  return;
8149285242Sachim}
8150285242Sachim
8151285242Sachim/*****************************************************************************
8152285242Sachim*! \brief  satSynchronizeCache10n16CB
8153285242Sachim*
8154285242Sachim*   This routine is a callback function for satSynchronizeCache10 and
8155285242Sachim*   satSynchronizeCache1016()
8156285242Sachim*
8157285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
8158285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
8159285242Sachim*  \param   agIOStatus:  Status of completed I/O.
8160285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
8161285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8162285242Sachim*                        length.
8163285242Sachim*  \param   agParam:     Additional info based on status.
8164285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
8165285242Sachim*
8166285242Sachim*  \return: none
8167285242Sachim*
8168285242Sachim*****************************************************************************/
8169285242Sachimvoid satSynchronizeCache10n16CB(
8170285242Sachim                                agsaRoot_t        *agRoot,
8171285242Sachim                                agsaIORequest_t   *agIORequest,
8172285242Sachim                                bit32             agIOStatus,
8173285242Sachim                                agsaFisHeader_t   *agFirstDword,
8174285242Sachim                                bit32             agIOInfoLen,
8175285242Sachim                                void              *agParam,
8176285242Sachim                                void              *ioContext
8177285242Sachim                                )
8178285242Sachim{
8179285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
8180285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
8181285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
8182285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8183285242Sachim  tdIORequestBody_t       *tdIORequestBody;
8184285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
8185285242Sachim  satIOContext_t          *satIOContext;
8186285242Sachim  satIOContext_t          *satOrgIOContext;
8187285242Sachim  satInternalIo_t         *satIntIo;
8188285242Sachim  satDeviceData_t         *satDevData;
8189285242Sachim
8190285242Sachim  scsiRspSense_t            *pSense;
8191285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
8192285242Sachim  tiIORequest_t             *tiOrgIORequest;
8193285242Sachim
8194285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
8195285242Sachim  bit32                     ataStatus = 0;
8196285242Sachim  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
8197285242Sachim
8198285242Sachim  TI_DBG5(("satSynchronizeCache10n16CB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
8199285242Sachim
8200285242Sachim  /* internally generate tiIOContext */
8201285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
8202285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
8203285242Sachim  satIntIo               = satIOContext->satIntIoContext;
8204285242Sachim  satDevData             = satIOContext->pSatDevData;
8205285242Sachim  hostToDevFis           = satIOContext->pFis;
8206285242Sachim
8207285242Sachim  /* SPC: Self-Test Result Log page */
8208285242Sachim
8209285242Sachim  if (satIntIo == agNULL)
8210285242Sachim  {
8211285242Sachim    TI_DBG4(("satSynchronizeCache10n16CB: External satInternalIo_t satIntIoContext\n"));
8212285242Sachim    satOrgIOContext = satIOContext;
8213285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
8214285242Sachim    pSense          = satIOContext->pSense;
8215285242Sachim    scsiCmnd        = satIOContext->pScsiCmnd;
8216285242Sachim  }
8217285242Sachim  else
8218285242Sachim  {
8219285242Sachim    TI_DBG4(("satSynchronizeCache10n16CB: Internal satInternalIo_t satIntIoContext\n"));
8220285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
8221285242Sachim    if (satOrgIOContext == agNULL)
8222285242Sachim    {
8223285242Sachim      TI_DBG4(("satSynchronizeCache10n16CB: satOrgIOContext is NULL, wrong\n"));
8224285242Sachim      return;
8225285242Sachim    }
8226285242Sachim    else
8227285242Sachim    {
8228285242Sachim      TI_DBG4(("satSynchronizeCache10n16CB: satOrgIOContext is NOT NULL\n"));
8229285242Sachim    }
8230285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
8231285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
8232285242Sachim
8233285242Sachim    pSense        = satOrgIOContext->pSense;
8234285242Sachim    scsiCmnd      = satOrgIOContext->pScsiCmnd;
8235285242Sachim  }
8236285242Sachim
8237285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
8238285242Sachim  tdIORequestBody->ioStarted = agFALSE;
8239285242Sachim
8240285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
8241285242Sachim  {
8242285242Sachim    TI_DBG1(("satSynchronizeCache10n16CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
8243285242Sachim
8244285242Sachim    ostiInitiatorIOCompleted (
8245285242Sachim                             tiRoot,
8246285242Sachim                             tiOrgIORequest,
8247285242Sachim                             tiIOFailed,
8248285242Sachim                             tiDetailOtherError,
8249285242Sachim                             agNULL,
8250285242Sachim                             satOrgIOContext->interruptContext
8251285242Sachim                             );
8252285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8253285242Sachim
8254285242Sachim    satFreeIntIoResource( tiRoot,
8255285242Sachim                          satDevData,
8256285242Sachim                          satIntIo);
8257285242Sachim    return;
8258285242Sachim  }
8259285242Sachim
8260285242Sachim  if( agIOStatus != OSSA_IO_SUCCESS)
8261285242Sachim  {
8262285242Sachim    /* only agsaFisRegDeviceToHost_t is expected */
8263285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
8264285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
8265285242Sachim  }
8266285242Sachim
8267285242Sachim  if( agIOStatus != OSSA_IO_SUCCESS)
8268285242Sachim  {
8269285242Sachim  if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
8270285242Sachim       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
8271285242Sachim       )
8272285242Sachim  {
8273285242Sachim    /* for debugging */
8274285242Sachim    if( agIOStatus != OSSA_IO_SUCCESS)
8275285242Sachim    {
8276285242Sachim      TI_DBG1(("satSynchronizeCache10n16CB: FAILED, NOT IO_SUCCESS\n"));
8277285242Sachim    }
8278285242Sachim    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
8279285242Sachim    {
8280285242Sachim      TI_DBG1(("satSynchronizeCache10n16CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
8281285242Sachim    }
8282285242Sachim    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
8283285242Sachim              (ataStatus & DF_ATA_STATUS_MASK)
8284285242Sachim              )
8285285242Sachim    {
8286285242Sachim      TI_DBG1(("satSynchronizeCache10n16CB: FAILED, FAILED, error status\n"));
8287285242Sachim    }
8288285242Sachim
8289285242Sachim
8290285242Sachim    /* Process abort case */
8291285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
8292285242Sachim    {
8293285242Sachim      satProcessAbort(tiRoot,
8294285242Sachim                      tiOrgIORequest,
8295285242Sachim                      satOrgIOContext
8296285242Sachim                      );
8297285242Sachim
8298285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8299285242Sachim
8300285242Sachim      satFreeIntIoResource( tiRoot,
8301285242Sachim                            satDevData,
8302285242Sachim                            satIntIo);
8303285242Sachim      return;
8304285242Sachim    }
8305285242Sachim
8306285242Sachim    switch (hostToDevFis->h.command)
8307285242Sachim    {
8308285242Sachim    case SAT_FLUSH_CACHE:
8309285242Sachim      TI_DBG1(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE failed\n"));
8310285242Sachim      /* checking IMMED bit */
8311285242Sachim      if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)
8312285242Sachim      {
8313285242Sachim        satSetDeferredSensePayload( pSense,
8314285242Sachim                                    SCSI_SNSKEY_NO_SENSE,
8315285242Sachim                                    0,
8316285242Sachim                                    SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8317285242Sachim                                    satOrgIOContext);
8318285242Sachim      }
8319285242Sachim      else
8320285242Sachim      {
8321285242Sachim        satSetDeferredSensePayload( pSense,
8322285242Sachim                                    SCSI_SNSKEY_NO_SENSE,
8323285242Sachim                                    0,
8324285242Sachim                                    SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8325285242Sachim                                    satOrgIOContext);
8326285242Sachim      }
8327285242Sachim
8328285242Sachim
8329285242Sachim      ostiInitiatorIOCompleted( tiRoot,
8330285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8331285242Sachim                                tiIOSuccess,
8332285242Sachim                                SCSI_STAT_CHECK_CONDITION,
8333285242Sachim                                satOrgIOContext->pTiSenseData,
8334285242Sachim                                satOrgIOContext->interruptContext );
8335285242Sachim
8336285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8337285242Sachim
8338285242Sachim      satFreeIntIoResource( tiRoot,
8339285242Sachim                            satDevData,
8340285242Sachim                            satIntIo);
8341285242Sachim      return;
8342285242Sachim      break;
8343285242Sachim    case SAT_FLUSH_CACHE_EXT:
8344285242Sachim      TI_DBG1(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT failed\n"));
8345285242Sachim       /* checking IMMED bit */
8346285242Sachim      if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)
8347285242Sachim      {
8348285242Sachim        satSetDeferredSensePayload( pSense,
8349285242Sachim                                    SCSI_SNSKEY_NO_SENSE,
8350285242Sachim                                    0,
8351285242Sachim                                    SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8352285242Sachim                                    satOrgIOContext);
8353285242Sachim      }
8354285242Sachim      else
8355285242Sachim      {
8356285242Sachim        satSetDeferredSensePayload( pSense,
8357285242Sachim                                    SCSI_SNSKEY_NO_SENSE,
8358285242Sachim                                    0,
8359285242Sachim                                    SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8360285242Sachim                                    satOrgIOContext);
8361285242Sachim      }
8362285242Sachim
8363285242Sachim
8364285242Sachim      ostiInitiatorIOCompleted( tiRoot,
8365285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8366285242Sachim                                tiIOSuccess,
8367285242Sachim                                SCSI_STAT_CHECK_CONDITION,
8368285242Sachim                                satOrgIOContext->pTiSenseData,
8369285242Sachim                                satOrgIOContext->interruptContext );
8370285242Sachim
8371285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8372285242Sachim
8373285242Sachim      satFreeIntIoResource( tiRoot,
8374285242Sachim                            satDevData,
8375285242Sachim                            satIntIo);
8376285242Sachim      return;
8377285242Sachim      break;
8378285242Sachim    default:
8379285242Sachim      TI_DBG1(("satSynchronizeCache10n16CB: error unknown command 0x%x\n", hostToDevFis->h.command));
8380285242Sachim      satSetSensePayload( pSense,
8381285242Sachim                          SCSI_SNSKEY_NO_SENSE,
8382285242Sachim                          0,
8383285242Sachim                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8384285242Sachim                          satOrgIOContext);
8385285242Sachim
8386285242Sachim
8387285242Sachim      ostiInitiatorIOCompleted( tiRoot,
8388285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8389285242Sachim                                tiIOSuccess,
8390285242Sachim                                SCSI_STAT_CHECK_CONDITION,
8391285242Sachim                                satOrgIOContext->pTiSenseData,
8392285242Sachim                                satOrgIOContext->interruptContext );
8393285242Sachim
8394285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8395285242Sachim
8396285242Sachim      satFreeIntIoResource( tiRoot,
8397285242Sachim                            satDevData,
8398285242Sachim                            satIntIo);
8399285242Sachim      return;
8400285242Sachim      break;
8401285242Sachim    }
8402285242Sachim
8403285242Sachim    return;
8404285242Sachim  } /* end of error checking */
8405285242Sachim  }
8406285242Sachim
8407285242Sachim  /* prcessing the success case */
8408285242Sachim  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8409285242Sachim
8410285242Sachim  satFreeIntIoResource( tiRoot,
8411285242Sachim                        satDevData,
8412285242Sachim                        satIntIo);
8413285242Sachim
8414285242Sachim
8415285242Sachim  switch (hostToDevFis->h.command)
8416285242Sachim  {
8417285242Sachim  case SAT_FLUSH_CACHE:
8418285242Sachim    TI_DBG5(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE success\n"));
8419285242Sachim
8420285242Sachim    /* checking IMMED bit */
8421285242Sachim    if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK))
8422285242Sachim    {
8423285242Sachim      ostiInitiatorIOCompleted( tiRoot,
8424285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8425285242Sachim                                tiIOSuccess,
8426285242Sachim                                SCSI_STAT_GOOD,
8427285242Sachim                                agNULL,
8428285242Sachim                                satOrgIOContext->interruptContext );
8429285242Sachim      return;
8430285242Sachim    }
8431285242Sachim
8432285242Sachim
8433285242Sachim    break;
8434285242Sachim  case SAT_FLUSH_CACHE_EXT:
8435285242Sachim    TI_DBG5(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT success\n"));
8436285242Sachim
8437285242Sachim    /* checking IMMED bit */
8438285242Sachim    if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK))
8439285242Sachim    {
8440285242Sachim      ostiInitiatorIOCompleted( tiRoot,
8441285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8442285242Sachim                                tiIOSuccess,
8443285242Sachim                                SCSI_STAT_GOOD,
8444285242Sachim                                agNULL,
8445285242Sachim                                satOrgIOContext->interruptContext );
8446285242Sachim      return;
8447285242Sachim    }
8448285242Sachim
8449285242Sachim    break;
8450285242Sachim  default:
8451285242Sachim    TI_DBG5(("satSynchronizeCache10n16CB: error unknown command 0x%x\n", hostToDevFis->h.command));
8452285242Sachim    satSetSensePayload( pSense,
8453285242Sachim                        SCSI_SNSKEY_NO_SENSE,
8454285242Sachim                        0,
8455285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8456285242Sachim                        satOrgIOContext);
8457285242Sachim
8458285242Sachim
8459285242Sachim    ostiInitiatorIOCompleted( tiRoot,
8460285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8461285242Sachim                              tiIOSuccess,
8462285242Sachim                              SCSI_STAT_CHECK_CONDITION,
8463285242Sachim                              satOrgIOContext->pTiSenseData,
8464285242Sachim                              satOrgIOContext->interruptContext );
8465285242Sachim
8466285242Sachim    return;
8467285242Sachim    break;
8468285242Sachim  }
8469285242Sachim
8470285242Sachim  return;
8471285242Sachim}
8472285242Sachim
8473285242Sachim/*****************************************************************************
8474285242Sachim*! \brief  satModeSelect6n10CB
8475285242Sachim*
8476285242Sachim*   This routine is a callback function for satModeSelect6() and
8477285242Sachim*   satModeSelect10()
8478285242Sachim*
8479285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
8480285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
8481285242Sachim*  \param   agIOStatus:  Status of completed I/O.
8482285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
8483285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8484285242Sachim*                        length.
8485285242Sachim*  \param   agParam:     Additional info based on status.
8486285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
8487285242Sachim*
8488285242Sachim*  \return: none
8489285242Sachim*
8490285242Sachim*****************************************************************************/
8491285242Sachimvoid satModeSelect6n10CB(
8492285242Sachim                         agsaRoot_t        *agRoot,
8493285242Sachim                         agsaIORequest_t   *agIORequest,
8494285242Sachim                         bit32             agIOStatus,
8495285242Sachim                         agsaFisHeader_t   *agFirstDword,
8496285242Sachim                         bit32             agIOInfoLen,
8497285242Sachim                         void              *agParam,
8498285242Sachim                         void              *ioContext
8499285242Sachim                         )
8500285242Sachim{
8501285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
8502285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
8503285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
8504285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8505285242Sachim  tdIORequestBody_t       *tdIORequestBody;
8506285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
8507285242Sachim  satIOContext_t          *satIOContext;
8508285242Sachim  satIOContext_t          *satOrgIOContext;
8509285242Sachim  satIOContext_t          *satNewIOContext;
8510285242Sachim  satInternalIo_t         *satIntIo;
8511285242Sachim  satInternalIo_t         *satNewIntIo = agNULL;
8512285242Sachim  satDeviceData_t         *satDevData;
8513285242Sachim  scsiRspSense_t            *pSense;
8514285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
8515285242Sachim  tiIORequest_t             *tiOrgIORequest;
8516285242Sachim
8517285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
8518285242Sachim  bit32                     ataStatus = 0;
8519285242Sachim  bit32                     status;
8520285242Sachim  tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
8521285242Sachim  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
8522285242Sachim
8523285242Sachim  TI_DBG5(("satModeSelect6n10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
8524285242Sachim
8525285242Sachim  /* internally generate tiIOContext */
8526285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
8527285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
8528285242Sachim  satIntIo               = satIOContext->satIntIoContext;
8529285242Sachim  satDevData             = satIOContext->pSatDevData;
8530285242Sachim  hostToDevFis           = satIOContext->pFis;
8531285242Sachim
8532285242Sachim  if (satIntIo == agNULL)
8533285242Sachim  {
8534285242Sachim    TI_DBG4(("satModeSelect6n10CB: External satInternalIo_t satIntIoContext\n"));
8535285242Sachim    satOrgIOContext = satIOContext;
8536285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
8537285242Sachim    tiScsiRequest   = satOrgIOContext->tiScsiXchg;
8538285242Sachim    pSense          = satOrgIOContext->pSense;
8539285242Sachim    scsiCmnd        = satOrgIOContext->pScsiCmnd;
8540285242Sachim  }
8541285242Sachim  else
8542285242Sachim  {
8543285242Sachim    TI_DBG4(("satModeSelect6n10CB: Internal satInternalIo_t satIntIoContext\n"));
8544285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
8545285242Sachim    if (satOrgIOContext == agNULL)
8546285242Sachim    {
8547285242Sachim      TI_DBG4(("satModeSelect6n10CB: satOrgIOContext is NULL, wrong\n"));
8548285242Sachim      return;
8549285242Sachim    }
8550285242Sachim    else
8551285242Sachim    {
8552285242Sachim      TI_DBG4(("satModeSelect6n10CB: satOrgIOContext is NOT NULL\n"));
8553285242Sachim    }
8554285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
8555285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
8556285242Sachim
8557285242Sachim    tiScsiRequest = satOrgIOContext->tiScsiXchg;
8558285242Sachim    pSense        = satOrgIOContext->pSense;
8559285242Sachim    scsiCmnd      = satOrgIOContext->pScsiCmnd;
8560285242Sachim  }
8561285242Sachim
8562285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
8563285242Sachim  tdIORequestBody->ioStarted = agFALSE;
8564285242Sachim
8565285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
8566285242Sachim  {
8567285242Sachim    TI_DBG1(("satModeSelect6n10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
8568285242Sachim    ostiInitiatorIOCompleted (
8569285242Sachim                             tiRoot,
8570285242Sachim                             tiOrgIORequest,
8571285242Sachim                             tiIOFailed,
8572285242Sachim                             tiDetailOtherError,
8573285242Sachim                             agNULL,
8574285242Sachim                             satOrgIOContext->interruptContext
8575285242Sachim                             );
8576285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8577285242Sachim
8578285242Sachim    satFreeIntIoResource( tiRoot,
8579285242Sachim                          satDevData,
8580285242Sachim                          satIntIo);
8581285242Sachim    return;
8582285242Sachim  }
8583285242Sachim
8584285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
8585285242Sachim  {
8586285242Sachim    /* only agsaFisRegDeviceToHost_t is expected */
8587285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
8588285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
8589285242Sachim  }
8590285242Sachim
8591285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
8592285242Sachim  {
8593285242Sachim  if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
8594285242Sachim       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
8595285242Sachim       )
8596285242Sachim  {
8597285242Sachim    /* for debugging */
8598285242Sachim    if( agIOStatus != OSSA_IO_SUCCESS)
8599285242Sachim    {
8600285242Sachim      TI_DBG1(("satModeSelect6n10CB FAILED, NOT IO_SUCCESS\n"));
8601285242Sachim    }
8602285242Sachim    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
8603285242Sachim    {
8604285242Sachim      TI_DBG1(("satModeSelect6n10CB FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
8605285242Sachim    }
8606285242Sachim    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
8607285242Sachim              (ataStatus & DF_ATA_STATUS_MASK)
8608285242Sachim              )
8609285242Sachim    {
8610285242Sachim      TI_DBG1(("satModeSelect6n10CB FAILED, FAILED, error status\n"));
8611285242Sachim    }
8612285242Sachim
8613285242Sachim    /* Process abort case */
8614285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
8615285242Sachim    {
8616285242Sachim      satProcessAbort(tiRoot,
8617285242Sachim                      tiOrgIORequest,
8618285242Sachim                      satOrgIOContext
8619285242Sachim                      );
8620285242Sachim
8621285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8622285242Sachim
8623285242Sachim      satFreeIntIoResource( tiRoot,
8624285242Sachim                            satDevData,
8625285242Sachim                            satIntIo);
8626285242Sachim      return;
8627285242Sachim    }
8628285242Sachim
8629285242Sachim    /* for debugging */
8630285242Sachim    if (hostToDevFis->h.command == SAT_SET_FEATURES)
8631285242Sachim    {
8632285242Sachim      if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02))
8633285242Sachim      {
8634285242Sachim        TI_DBG1(("satModeSelect6n10CB 1 SAT_SET_FEATURES failed, feature 0x%x\n", hostToDevFis->h.features));
8635285242Sachim      }
8636285242Sachim      else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55))
8637285242Sachim      {
8638285242Sachim        TI_DBG1(("ssatModeSelect6n10CB 2 SAT_SET_FEATURES failed, feature 0x%x\n", hostToDevFis->h.features));
8639285242Sachim      }
8640285242Sachim      else
8641285242Sachim      {
8642285242Sachim        TI_DBG1(("satModeSelect6n10CB error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8643285242Sachim      }
8644285242Sachim    }
8645285242Sachim    else if (hostToDevFis->h.command == SAT_SMART)
8646285242Sachim    {
8647285242Sachim      if ((hostToDevFis->h.features == SAT_SMART_ENABLE_OPERATIONS) || (hostToDevFis->h.features == SAT_SMART_DISABLE_OPERATIONS))
8648285242Sachim      {
8649285242Sachim        TI_DBG1(("satModeSelect6n10CB SAT_SMART_ENABLE/DISABLE_OPERATIONS failed, feature 0x%x\n", hostToDevFis->h.features));
8650285242Sachim      }
8651285242Sachim      else
8652285242Sachim      {
8653285242Sachim        TI_DBG1(("satModeSelect6n10CB error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8654285242Sachim      }
8655285242Sachim    }
8656285242Sachim    else
8657285242Sachim    {
8658285242Sachim      TI_DBG1(("satModeSelect6n10CB error default case command 0x%x\n", hostToDevFis->h.command));
8659285242Sachim    }
8660285242Sachim
8661285242Sachim
8662285242Sachim    satSetSensePayload( pSense,
8663285242Sachim                        SCSI_SNSKEY_NO_SENSE,
8664285242Sachim                        0,
8665285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8666285242Sachim                        satOrgIOContext);
8667285242Sachim
8668285242Sachim    ostiInitiatorIOCompleted( tiRoot,
8669285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8670285242Sachim                              tiIOSuccess,
8671285242Sachim                              SCSI_STAT_CHECK_CONDITION,
8672285242Sachim                              satOrgIOContext->pTiSenseData,
8673285242Sachim                              satOrgIOContext->interruptContext );
8674285242Sachim
8675285242Sachim
8676285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8677285242Sachim
8678285242Sachim    satFreeIntIoResource( tiRoot,
8679285242Sachim                          satDevData,
8680285242Sachim                          satIntIo);
8681285242Sachim    return;
8682285242Sachim  } /* error checking */
8683285242Sachim  }
8684285242Sachim
8685285242Sachim
8686285242Sachim  /* prcessing the success case */
8687285242Sachim
8688285242Sachim
8689285242Sachim  if (hostToDevFis->h.command == SAT_SET_FEATURES)
8690285242Sachim  {
8691285242Sachim    if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02))
8692285242Sachim    {
8693285242Sachim      TI_DBG5(("satModeSelect6n10CB 1 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features));
8694285242Sachim
8695285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8696285242Sachim
8697285242Sachim      satFreeIntIoResource( tiRoot,
8698285242Sachim                            satDevData,
8699285242Sachim                            satIntIo);
8700285242Sachim
8701285242Sachim      satNewIntIo = satAllocIntIoResource( tiRoot,
8702285242Sachim                                           tiOrgIORequest,
8703285242Sachim                                           satDevData,
8704285242Sachim                                           0,
8705285242Sachim                                           satNewIntIo);
8706285242Sachim      if (satNewIntIo == agNULL)
8707285242Sachim      {
8708285242Sachim        /* memory allocation failure */
8709285242Sachim        satFreeIntIoResource( tiRoot,
8710285242Sachim                              satDevData,
8711285242Sachim                              satNewIntIo);
8712285242Sachim
8713285242Sachim        satSetSensePayload( pSense,
8714285242Sachim                            SCSI_SNSKEY_NO_SENSE,
8715285242Sachim                            0,
8716285242Sachim                            SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8717285242Sachim                            satOrgIOContext);
8718285242Sachim
8719285242Sachim        ostiInitiatorIOCompleted( tiRoot,
8720285242Sachim                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8721285242Sachim                                  tiIOSuccess,
8722285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
8723285242Sachim                                  satOrgIOContext->pTiSenseData,
8724285242Sachim                                  satOrgIOContext->interruptContext );
8725285242Sachim        TI_DBG1(("satModeSelect6n10CB: momory allocation fails\n"));
8726285242Sachim        return;
8727285242Sachim      } /* end memory allocation */
8728285242Sachim
8729285242Sachim      satNewIOContext = satPrepareNewIO(
8730285242Sachim                                        satNewIntIo,
8731285242Sachim                                        tiOrgIORequest,
8732285242Sachim                                        satDevData,
8733285242Sachim                                        scsiCmnd,
8734285242Sachim                                        satOrgIOContext
8735285242Sachim                                        );
8736285242Sachim      /* sends either ATA SET FEATURES based on DRA bit */
8737285242Sachim      status = satModeSelect6n10_1( tiRoot,
8738285242Sachim                                 &satNewIntIo->satIntTiIORequest,
8739285242Sachim                                 satNewIOContext->ptiDeviceHandle,
8740285242Sachim                                 tiScsiRequest, /* orginal from OS layer */
8741285242Sachim                                 satNewIOContext
8742285242Sachim                                 );
8743285242Sachim
8744285242Sachim      if (status != tiSuccess)
8745285242Sachim      {
8746285242Sachim        /* sending ATA command fails */
8747285242Sachim        satFreeIntIoResource( tiRoot,
8748285242Sachim                              satDevData,
8749285242Sachim                              satNewIntIo);
8750285242Sachim        satSetSensePayload( pSense,
8751285242Sachim                            SCSI_SNSKEY_NO_SENSE,
8752285242Sachim                            0,
8753285242Sachim                            SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8754285242Sachim                            satOrgIOContext);
8755285242Sachim
8756285242Sachim        ostiInitiatorIOCompleted( tiRoot,
8757285242Sachim                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8758285242Sachim                                  tiIOSuccess,
8759285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
8760285242Sachim                                  satOrgIOContext->pTiSenseData,
8761285242Sachim                                  satOrgIOContext->interruptContext );
8762285242Sachim        TI_DBG1(("satModeSelect6n10CB calling satModeSelect6_1 fails\n"));
8763285242Sachim        return;
8764285242Sachim      } /* end send fails */
8765285242Sachim      return;
8766285242Sachim    }
8767285242Sachim    else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55))
8768285242Sachim    {
8769285242Sachim      TI_DBG5(("satModeSelect6n10CB 2 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features));
8770285242Sachim
8771285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8772285242Sachim
8773285242Sachim      satFreeIntIoResource( tiRoot,
8774285242Sachim                            satDevData,
8775285242Sachim                            satIntIo);
8776285242Sachim
8777285242Sachim      /* return stat_good */
8778285242Sachim      ostiInitiatorIOCompleted( tiRoot,
8779285242Sachim                                tiOrgIORequest,
8780285242Sachim                                tiIOSuccess,
8781285242Sachim                                SCSI_STAT_GOOD,
8782285242Sachim                                agNULL,
8783285242Sachim                                satOrgIOContext->interruptContext );
8784285242Sachim      return;
8785285242Sachim    }
8786285242Sachim    else
8787285242Sachim    {
8788285242Sachim      TI_DBG1(("satModeSelect6n10CB error unknown command success 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8789285242Sachim
8790285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8791285242Sachim
8792285242Sachim      satFreeIntIoResource( tiRoot,
8793285242Sachim                            satDevData,
8794285242Sachim                            satIntIo);
8795285242Sachim      satSetSensePayload( pSense,
8796285242Sachim                          SCSI_SNSKEY_NO_SENSE,
8797285242Sachim                          0,
8798285242Sachim                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8799285242Sachim                          satOrgIOContext);
8800285242Sachim
8801285242Sachim      ostiInitiatorIOCompleted( tiRoot,
8802285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8803285242Sachim                                tiIOSuccess,
8804285242Sachim                                SCSI_STAT_CHECK_CONDITION,
8805285242Sachim                                satOrgIOContext->pTiSenseData,
8806285242Sachim                                satOrgIOContext->interruptContext );
8807285242Sachim      return;
8808285242Sachim    }
8809285242Sachim  }
8810285242Sachim  else if (hostToDevFis->h.command == SAT_SMART_ENABLE_OPERATIONS ||
8811285242Sachim             hostToDevFis->h.command == SAT_SMART_DISABLE_OPERATIONS
8812285242Sachim            )
8813285242Sachim  {
8814285242Sachim    if ((hostToDevFis->h.features == 0xD8) || (hostToDevFis->h.features == 0xD9))
8815285242Sachim    {
8816285242Sachim      TI_DBG5(("satModeSelect6n10CB SAT_SMART_ENABLE/DISABLE_OPERATIONS success, feature 0x%x\n", hostToDevFis->h.features));
8817285242Sachim
8818285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8819285242Sachim
8820285242Sachim      satFreeIntIoResource( tiRoot,
8821285242Sachim                            satDevData,
8822285242Sachim                            satIntIo);
8823285242Sachim      /* return stat_good */
8824285242Sachim      ostiInitiatorIOCompleted( tiRoot,
8825285242Sachim                                tiOrgIORequest,
8826285242Sachim                                tiIOSuccess,
8827285242Sachim                                SCSI_STAT_GOOD,
8828285242Sachim                                agNULL,
8829285242Sachim                                satOrgIOContext->interruptContext );
8830285242Sachim      return;
8831285242Sachim    }
8832285242Sachim    else
8833285242Sachim    {
8834285242Sachim      TI_DBG1(("satModeSelect6n10CB error unknown command failed 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8835285242Sachim
8836285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8837285242Sachim
8838285242Sachim      satFreeIntIoResource( tiRoot,
8839285242Sachim                            satDevData,
8840285242Sachim                            satIntIo);
8841285242Sachim      satSetSensePayload( pSense,
8842285242Sachim                          SCSI_SNSKEY_NO_SENSE,
8843285242Sachim                          0,
8844285242Sachim                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8845285242Sachim                          satOrgIOContext);
8846285242Sachim
8847285242Sachim      ostiInitiatorIOCompleted( tiRoot,
8848285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8849285242Sachim                                tiIOSuccess,
8850285242Sachim                                SCSI_STAT_CHECK_CONDITION,
8851285242Sachim                                satOrgIOContext->pTiSenseData,
8852285242Sachim                                satOrgIOContext->interruptContext );
8853285242Sachim      return;
8854285242Sachim    }
8855285242Sachim  }
8856285242Sachim
8857285242Sachim  else
8858285242Sachim  {
8859285242Sachim    TI_DBG1(("satModeSelect6n10CB error default case command success 0x%x\n", hostToDevFis->h.command));
8860285242Sachim
8861285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8862285242Sachim
8863285242Sachim    satFreeIntIoResource( tiRoot,
8864285242Sachim                          satDevData,
8865285242Sachim                          satIntIo);
8866285242Sachim
8867285242Sachim    satSetSensePayload( pSense,
8868285242Sachim                        SCSI_SNSKEY_NO_SENSE,
8869285242Sachim                        0,
8870285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8871285242Sachim                        satOrgIOContext);
8872285242Sachim
8873285242Sachim    ostiInitiatorIOCompleted( tiRoot,
8874285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8875285242Sachim                              tiIOSuccess,
8876285242Sachim                              SCSI_STAT_CHECK_CONDITION,
8877285242Sachim                              satOrgIOContext->pTiSenseData,
8878285242Sachim                              satOrgIOContext->interruptContext );
8879285242Sachim    return;
8880285242Sachim  }
8881285242Sachim
8882285242Sachim  return;
8883285242Sachim}
8884285242Sachim
8885285242Sachim/*****************************************************************************
8886285242Sachim*! \brief  satSMARTEnableCB
8887285242Sachim*
8888285242Sachim*   This routine is a callback function for satSMARTEnable()
8889285242Sachim*
8890285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
8891285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
8892285242Sachim*  \param   agIOStatus:  Status of completed I/O.
8893285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
8894285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8895285242Sachim*                        length.
8896285242Sachim*  \param   agParam:     Additional info based on status.
8897285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
8898285242Sachim*
8899285242Sachim*  \return: none
8900285242Sachim*
8901285242Sachim*****************************************************************************/
8902285242Sachimvoid satSMARTEnableCB(
8903285242Sachim                      agsaRoot_t        *agRoot,
8904285242Sachim                      agsaIORequest_t   *agIORequest,
8905285242Sachim                      bit32             agIOStatus,
8906285242Sachim                      agsaFisHeader_t   *agFirstDword,
8907285242Sachim                      bit32             agIOInfoLen,
8908285242Sachim                      void              *agParam,
8909285242Sachim                      void              *ioContext
8910285242Sachim                      )
8911285242Sachim{
8912285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
8913285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
8914285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
8915285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8916285242Sachim  tdIORequestBody_t       *tdIORequestBody;
8917285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
8918285242Sachim  satIOContext_t          *satIOContext;
8919285242Sachim  satIOContext_t          *satOrgIOContext;
8920285242Sachim  satIOContext_t          *satNewIOContext;
8921285242Sachim  satInternalIo_t         *satIntIo;
8922285242Sachim  satInternalIo_t         *satNewIntIo = agNULL;
8923285242Sachim  satDeviceData_t         *satDevData;
8924285242Sachim  tiIORequest_t             *tiOrgIORequest;
8925285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
8926285242Sachim  bit32                     status;
8927285242Sachim
8928285242Sachim  TI_DBG4(("satSMARTEnableCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
8929285242Sachim
8930285242Sachim  /* internally generate tiIOContext */
8931285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
8932285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
8933285242Sachim  satIntIo               = satIOContext->satIntIoContext;
8934285242Sachim  satDevData             = satIOContext->pSatDevData;
8935285242Sachim
8936285242Sachim  /*ttttttthe one */
8937285242Sachim  if (satIntIo == agNULL)
8938285242Sachim  {
8939285242Sachim    TI_DBG4(("satSMARTEnableCB: External satInternalIo_t satIntIoContext\n"));
8940285242Sachim    satOrgIOContext = satIOContext;
8941285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
8942285242Sachim    scsiCmnd        = satOrgIOContext->pScsiCmnd;
8943285242Sachim  }
8944285242Sachim  else
8945285242Sachim  {
8946285242Sachim    TI_DBG4(("satSMARTEnableCB: Internal satInternalIo_t satIntIoContext\n"));
8947285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
8948285242Sachim    if (satOrgIOContext == agNULL)
8949285242Sachim    {
8950285242Sachim      TI_DBG4(("satSMARTEnableCB: satOrgIOContext is NULL, wrong\n"));
8951285242Sachim      return;
8952285242Sachim    }
8953285242Sachim    else
8954285242Sachim    {
8955285242Sachim      TI_DBG4(("satSMARTEnableCB: satOrgIOContext is NOT NULL\n"));
8956285242Sachim    }
8957285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
8958285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
8959285242Sachim
8960285242Sachim    scsiCmnd               = satOrgIOContext->pScsiCmnd;
8961285242Sachim  }
8962285242Sachim
8963285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
8964285242Sachim  tdIORequestBody->ioStarted = agFALSE;
8965285242Sachim
8966285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
8967285242Sachim  {
8968285242Sachim    TI_DBG1(("satSMARTEnableCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
8969285242Sachim    ostiInitiatorIOCompleted (
8970285242Sachim                             tiRoot,
8971285242Sachim                             tiOrgIORequest,
8972285242Sachim                             tiIOFailed,
8973285242Sachim                             tiDetailOtherError,
8974285242Sachim                             agNULL,
8975285242Sachim                             satOrgIOContext->interruptContext
8976285242Sachim                             );
8977285242Sachim
8978285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8979285242Sachim
8980285242Sachim    satFreeIntIoResource( tiRoot,
8981285242Sachim                          satDevData,
8982285242Sachim                          satIntIo);
8983285242Sachim
8984285242Sachim    return;
8985285242Sachim  }
8986285242Sachim
8987285242Sachim  /*
8988285242Sachim    checking IO status, FIS type and error status
8989285242Sachim  */
8990285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
8991285242Sachim  {
8992285242Sachim    TI_DBG1(("satSMARTEnableCB: not success status, status %d\n", agIOStatus));
8993285242Sachim    ostiInitiatorIOCompleted (
8994285242Sachim                             tiRoot,
8995285242Sachim                             tiOrgIORequest,
8996285242Sachim                             tiIOFailed,
8997285242Sachim                             tiDetailOtherError,
8998285242Sachim                             agNULL,
8999285242Sachim                             satOrgIOContext->interruptContext
9000285242Sachim                             );
9001285242Sachim
9002285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9003285242Sachim
9004285242Sachim    satFreeIntIoResource( tiRoot,
9005285242Sachim                          satDevData,
9006285242Sachim                          satIntIo);
9007285242Sachim
9008285242Sachim    return;
9009285242Sachim  }
9010285242Sachim
9011285242Sachim  /* process success case */
9012285242Sachim  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9013285242Sachim
9014285242Sachim  satFreeIntIoResource( tiRoot,
9015285242Sachim                        satDevData,
9016285242Sachim                        satIntIo);
9017285242Sachim
9018285242Sachim  satNewIntIo = satAllocIntIoResource( tiRoot,
9019285242Sachim                                       tiOrgIORequest,
9020285242Sachim                                       satDevData,
9021285242Sachim                                       512,
9022285242Sachim                                       satNewIntIo);
9023285242Sachim
9024285242Sachim  if (satNewIntIo == agNULL)
9025285242Sachim  {
9026285242Sachim    /* memory allocation failure */
9027285242Sachim    satFreeIntIoResource( tiRoot,
9028285242Sachim                          satDevData,
9029285242Sachim                          satNewIntIo);
9030285242Sachim
9031285242Sachim    ostiInitiatorIOCompleted (
9032285242Sachim                             tiRoot,
9033285242Sachim                             tiOrgIORequest,
9034285242Sachim                             tiIOFailed,
9035285242Sachim                             tiDetailOtherError,
9036285242Sachim                             agNULL,
9037285242Sachim                             satOrgIOContext->interruptContext
9038285242Sachim                             );
9039285242Sachim    return;
9040285242Sachim  }
9041285242Sachim
9042285242Sachim  satNewIOContext = satPrepareNewIO(
9043285242Sachim                                    satNewIntIo,
9044285242Sachim                                    tiOrgIORequest,
9045285242Sachim                                    satDevData,
9046285242Sachim                                    scsiCmnd,
9047285242Sachim                                    satOrgIOContext
9048285242Sachim                                    );
9049285242Sachim
9050285242Sachim  status = satLogSense_1(tiRoot,
9051285242Sachim                        &satNewIntIo->satIntTiIORequest,
9052285242Sachim                        satNewIOContext->ptiDeviceHandle,
9053285242Sachim                        &satNewIntIo->satIntTiScsiXchg,
9054285242Sachim                        satNewIOContext);
9055285242Sachim
9056285242Sachim  if (status != tiSuccess)
9057285242Sachim  {
9058285242Sachim    /* sending SAT_CHECK_POWER_MODE fails */
9059285242Sachim    satFreeIntIoResource( tiRoot,
9060285242Sachim                          satDevData,
9061285242Sachim                          satNewIntIo);
9062285242Sachim
9063285242Sachim    ostiInitiatorIOCompleted (
9064285242Sachim                             tiRoot,
9065285242Sachim                             tiOrgIORequest,
9066285242Sachim                             tiIOFailed,
9067285242Sachim                             tiDetailOtherError,
9068285242Sachim                             agNULL,
9069285242Sachim                             satOrgIOContext->interruptContext
9070285242Sachim                             );
9071285242Sachim
9072285242Sachim    return;
9073285242Sachim  }
9074285242Sachim
9075285242Sachim  return;
9076285242Sachim}
9077285242Sachim
9078285242Sachim
9079285242Sachim/*****************************************************************************
9080285242Sachim*! \brief  satLogSenseCB
9081285242Sachim*
9082285242Sachim*   This routine is a callback function for satLogSense()
9083285242Sachim*
9084285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
9085285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
9086285242Sachim*  \param   agIOStatus:  Status of completed I/O.
9087285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
9088285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
9089285242Sachim*                        length.
9090285242Sachim*  \param   agParam:     Additional info based on status.
9091285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
9092285242Sachim*
9093285242Sachim*  \return: none
9094285242Sachim*
9095285242Sachim*****************************************************************************/
9096285242Sachimvoid satLogSenseCB(
9097285242Sachim                   agsaRoot_t        *agRoot,
9098285242Sachim                   agsaIORequest_t   *agIORequest,
9099285242Sachim                   bit32             agIOStatus,
9100285242Sachim                   agsaFisHeader_t   *agFirstDword,
9101285242Sachim                   bit32             agIOInfoLen,
9102285242Sachim                   void              *agParam,
9103285242Sachim                   void              *ioContext
9104285242Sachim                )
9105285242Sachim{
9106285242Sachim
9107285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
9108285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
9109285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
9110285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
9111285242Sachim  tdIORequestBody_t       *tdIORequestBody;
9112285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
9113285242Sachim  satIOContext_t          *satIOContext;
9114285242Sachim  satIOContext_t          *satOrgIOContext;
9115285242Sachim  satInternalIo_t         *satIntIo;
9116285242Sachim  satDeviceData_t         *satDevData;
9117285242Sachim
9118285242Sachim  scsiRspSense_t            *pSense;
9119285242Sachim  tiIORequest_t             *tiOrgIORequest;
9120285242Sachim
9121285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
9122285242Sachim  bit32                     ataStatus = 0;
9123285242Sachim  tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
9124285242Sachim  tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* tiScsiXchg */
9125285242Sachim  satReadLogExtSelfTest_t   *virtAddr1;
9126285242Sachim  satSmartReadLogSelfTest_t *virtAddr2;
9127285242Sachim  bit8                      *pLogPage;
9128285242Sachim  bit8                      SelfTestExecutionStatus = 0;
9129285242Sachim  bit32                     i = 0;
9130285242Sachim
9131285242Sachim  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
9132285242Sachim  agsaFisRegD2HData_t      statDevToHostFisData;
9133285242Sachim  tiIniScsiCmnd_t          *scsiCmnd;
9134285242Sachim  bit32                     lenReceived = 0;
9135285242Sachim
9136285242Sachim  TI_DBG5(("satLogSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
9137285242Sachim
9138285242Sachim  /* internally generate tiIOContext */
9139285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
9140285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
9141285242Sachim  if (satIOContext == agNULL)
9142285242Sachim  {
9143285242Sachim    TI_DBG1(("satLogSenseCB: satIOContext is NULL\n"));
9144285242Sachim    return;
9145285242Sachim  }
9146285242Sachim  satIntIo               = satIOContext->satIntIoContext;
9147285242Sachim  satDevData             = satIOContext->pSatDevData;
9148285242Sachim  hostToDevFis           = satIOContext->pFis;
9149285242Sachim
9150285242Sachim  if (satIntIo == agNULL)
9151285242Sachim  {
9152285242Sachim    TI_DBG4(("satLogSenseCB: External satInternalIo_t satIntIoContext\n"));
9153285242Sachim    satOrgIOContext = satIOContext;
9154285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
9155285242Sachim    pSense          = satOrgIOContext->pSense;
9156285242Sachim    tiOrgScsiRequest   = satOrgIOContext->tiScsiXchg;
9157285242Sachim    /* SCSI command response payload to OS layer */
9158285242Sachim    pLogPage        = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9159285242Sachim    /* ATA command response payload */
9160285242Sachim    tiScsiRequest   = satOrgIOContext->tiScsiXchg;
9161285242Sachim    scsiCmnd        = satOrgIOContext->pScsiCmnd;
9162285242Sachim  }
9163285242Sachim  else
9164285242Sachim  {
9165285242Sachim    TI_DBG4(("satLogSenseCB: Internal satInternalIo_t satIntIoContext\n"));
9166285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
9167285242Sachim    if (satOrgIOContext == agNULL)
9168285242Sachim    {
9169285242Sachim      TI_DBG4(("satLogSenseCB: satOrgIOContext is NULL\n"));
9170285242Sachim    }
9171285242Sachim    else
9172285242Sachim    {
9173285242Sachim      TI_DBG4(("satLogSenseCB: satOrgIOContext is NOT NULL\n"));
9174285242Sachim    }
9175285242Sachim
9176285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
9177285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
9178285242Sachim
9179285242Sachim    pSense        = satOrgIOContext->pSense;
9180285242Sachim    tiOrgScsiRequest   = satOrgIOContext->tiScsiXchg;
9181285242Sachim    /* SCSI command response payload to OS layer */
9182285242Sachim    pLogPage        = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9183285242Sachim    /* ATA command response payload */
9184285242Sachim    tiScsiRequest   =  (tiScsiInitiatorRequest_t *)&(satIntIo->satIntTiScsiXchg);
9185285242Sachim    scsiCmnd        = satOrgIOContext->pScsiCmnd;
9186285242Sachim  }
9187285242Sachim
9188285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
9189285242Sachim  tdIORequestBody->ioStarted = agFALSE;
9190285242Sachim
9191285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
9192285242Sachim  {
9193285242Sachim    TI_DBG1(("satLogSenseCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
9194285242Sachim    ostiInitiatorIOCompleted (
9195285242Sachim                             tiRoot,
9196285242Sachim                             tiOrgIORequest,
9197285242Sachim                             tiIOFailed,
9198285242Sachim                             tiDetailOtherError,
9199285242Sachim                             agNULL,
9200285242Sachim                             satOrgIOContext->interruptContext
9201285242Sachim                             );
9202285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9203285242Sachim
9204285242Sachim    satFreeIntIoResource( tiRoot,
9205285242Sachim                          satDevData,
9206285242Sachim                          satIntIo);
9207285242Sachim    return;
9208285242Sachim  }
9209285242Sachim
9210285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
9211285242Sachim  {
9212285242Sachim    /* non-data and pio read -> device to host and pio setup fis are expected */
9213285242Sachim    /*
9214285242Sachim      first, assumed to be Reg Device to Host FIS
9215285242Sachim      This is OK to just find fis type
9216285242Sachim    */
9217285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
9218285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
9219285242Sachim  }
9220285242Sachim
9221285242Sachim  if( agIOStatus != OSSA_IO_SUCCESS)
9222285242Sachim  {
9223285242Sachim  if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
9224285242Sachim        (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)) ||
9225285242Sachim       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
9226285242Sachim       )
9227285242Sachim  {
9228285242Sachim    /* for debugging */
9229285242Sachim    if( agIOStatus != OSSA_IO_SUCCESS)
9230285242Sachim    {
9231285242Sachim      TI_DBG1(("satLogSenseCB: FAILED, NOT IO_SUCCESS\n"));
9232285242Sachim    }
9233285242Sachim    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
9234285242Sachim    {
9235285242Sachim      TI_DBG1(("satLogSenseCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
9236285242Sachim    }
9237285242Sachim    else if (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)
9238285242Sachim    {
9239285242Sachim      TI_DBG1(("satLogSenseCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
9240285242Sachim    }
9241285242Sachim    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
9242285242Sachim              (ataStatus & DF_ATA_STATUS_MASK)
9243285242Sachim              )
9244285242Sachim    {
9245285242Sachim      TI_DBG1(("satLogSenseCB: FAILED, FAILED, error status\n"));
9246285242Sachim    }
9247285242Sachim
9248285242Sachim    /* Process abort case */
9249285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
9250285242Sachim    {
9251285242Sachim      satProcessAbort(tiRoot,
9252285242Sachim                      tiOrgIORequest,
9253285242Sachim                      satOrgIOContext
9254285242Sachim                      );
9255285242Sachim
9256285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9257285242Sachim
9258285242Sachim      satFreeIntIoResource( tiRoot,
9259285242Sachim                            satDevData,
9260285242Sachim                            satIntIo);
9261285242Sachim      return;
9262285242Sachim    }
9263285242Sachim
9264285242Sachim    /* for debugging */
9265285242Sachim    if (hostToDevFis->h.command == SAT_READ_LOG_EXT)
9266285242Sachim    {
9267285242Sachim      TI_DBG1(("satLogSenseCB: SAT_READ_LOG_EXT failed\n"));
9268285242Sachim    }
9269285242Sachim    else if (hostToDevFis->h.command == SAT_SMART)
9270285242Sachim    {
9271285242Sachim      if (hostToDevFis->h.features == SAT_SMART_READ_LOG)
9272285242Sachim      {
9273285242Sachim        TI_DBG1(("satLogSenseCB: SAT_SMART_READ_LOG failed\n"));
9274285242Sachim      }
9275285242Sachim      else if (hostToDevFis->h.features == SAT_SMART_RETURN_STATUS)
9276285242Sachim      {
9277285242Sachim        TI_DBG1(("satLogSenseCB: SAT_SMART_RETURN_STATUS failed\n"));
9278285242Sachim      }
9279285242Sachim      else
9280285242Sachim      {
9281285242Sachim        TI_DBG1(("satLogSenseCB: error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
9282285242Sachim      }
9283285242Sachim    }
9284285242Sachim    else
9285285242Sachim    {
9286285242Sachim      TI_DBG1(("satLogSenseCB: error default case command 0x%x\n", hostToDevFis->h.command));
9287285242Sachim    }
9288285242Sachim
9289285242Sachim    satSetSensePayload( pSense,
9290285242Sachim                        SCSI_SNSKEY_NO_SENSE,
9291285242Sachim                        0,
9292285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9293285242Sachim                        satOrgIOContext);
9294285242Sachim
9295285242Sachim    ostiInitiatorIOCompleted( tiRoot,
9296285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9297285242Sachim                              tiIOSuccess,
9298285242Sachim                              SCSI_STAT_CHECK_CONDITION,
9299285242Sachim                              satOrgIOContext->pTiSenseData,
9300285242Sachim                              satOrgIOContext->interruptContext );
9301285242Sachim
9302285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9303285242Sachim
9304285242Sachim    satFreeIntIoResource( tiRoot,
9305285242Sachim                          satDevData,
9306285242Sachim                          satIntIo);
9307285242Sachim    return;
9308285242Sachim
9309285242Sachim  } /* error checking */
9310285242Sachim  }
9311285242Sachim
9312285242Sachim  /* prcessing the success case */
9313285242Sachim  saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t));
9314285242Sachim
9315285242Sachim  lenReceived = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8];
9316285242Sachim  TI_DBG5(("satLogSenseCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived));
9317285242Sachim
9318285242Sachim
9319285242Sachim  if (hostToDevFis->h.command == SAT_READ_LOG_EXT)
9320285242Sachim  {
9321285242Sachim    TI_DBG5(("satLogSenseCB: SAT_READ_LOG_EXT success\n"));
9322285242Sachim
9323285242Sachim    /* process log data and sends it to upper */
9324285242Sachim
9325285242Sachim    /* ATA: Extended Self-Test Log */
9326285242Sachim    virtAddr1  = (satReadLogExtSelfTest_t *)(tiScsiRequest->sglVirtualAddr);
9327285242Sachim    /*
9328285242Sachim      ATA/ATAPI VOLII, p197, 287
9329285242Sachim      self-test execution status (4 bits); ((virtAddr1->byte[5] & 0xF0) >> 4)
9330285242Sachim    */
9331285242Sachim    SelfTestExecutionStatus  = (bit8)(((virtAddr1->byte[5] & 0xF0) >> 4));
9332285242Sachim
9333285242Sachim    /* fills in the log page from ATA log page */
9334285242Sachim    /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */
9335285242Sachim    pLogPage[0] = 0x10; /* page code */
9336285242Sachim    pLogPage[1] = 0;
9337285242Sachim    pLogPage[2] = 0x01;    /* 0x190, page length */
9338285242Sachim    pLogPage[3] = 0x90;
9339285242Sachim
9340285242Sachim    /* SPC-4, Table 217 */
9341285242Sachim    pLogPage[4] = 0;    /* Parameter Code */
9342285242Sachim    pLogPage[5] = 0x01; /* Parameter Code,  unspecfied but ... */
9343285242Sachim    pLogPage[6] = 3;    /* unspecified but ... */
9344285242Sachim    pLogPage[7] = 0x10; /* Parameter Length */
9345285242Sachim    pLogPage[8] = (bit8)(0 | ((virtAddr1->byte[5] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */
9346285242Sachim    pLogPage[9] = 0;    /* self test number */
9347285242Sachim    pLogPage[10] = virtAddr1->byte[7];    /* time stamp, MSB */
9348285242Sachim    pLogPage[11] = virtAddr1->byte[6];    /* time stamp, LSB */
9349285242Sachim
9350285242Sachim    pLogPage[12] = 0;    /* address of first failure MSB*/
9351285242Sachim    pLogPage[13] = 0;    /* address of first failure */
9352285242Sachim    pLogPage[14] = virtAddr1->byte[14];    /* address of first failure */
9353285242Sachim    pLogPage[15] = virtAddr1->byte[13];    /* address of first failure */
9354285242Sachim    pLogPage[16] = virtAddr1->byte[12];    /* address of first failure */
9355285242Sachim    pLogPage[17] = virtAddr1->byte[11];    /* address of first failure */
9356285242Sachim    pLogPage[18] = virtAddr1->byte[10];    /* address of first failure */
9357285242Sachim    pLogPage[19] = virtAddr1->byte[9];    /* address of first failure LSB */
9358285242Sachim
9359285242Sachim    /* SAT rev8 Table75, p 76 */
9360285242Sachim    switch (SelfTestExecutionStatus)
9361285242Sachim    {
9362285242Sachim    case 0:
9363285242Sachim      pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9364285242Sachim      pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9365285242Sachim      pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9366285242Sachim      break;
9367285242Sachim    case 1:
9368285242Sachim      pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9369285242Sachim      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9370285242Sachim      pLogPage[22] = 0x81;
9371285242Sachim      break;
9372285242Sachim    case 2:
9373285242Sachim      pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9374285242Sachim      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9375285242Sachim      pLogPage[22] = 0x82;
9376285242Sachim      break;
9377285242Sachim    case 3:
9378285242Sachim      pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9379285242Sachim      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9380285242Sachim      pLogPage[22] = 0x83;
9381285242Sachim      break;
9382285242Sachim    case 4:
9383285242Sachim      pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9384285242Sachim      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9385285242Sachim      pLogPage[22] = 0x84;
9386285242Sachim    break;
9387285242Sachim    case 5:
9388285242Sachim      pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9389285242Sachim      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9390285242Sachim      pLogPage[22] = 0x85;
9391285242Sachim      break;
9392285242Sachim    case 6:
9393285242Sachim      pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9394285242Sachim      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9395285242Sachim      pLogPage[22] = 0x86;
9396285242Sachim      break;
9397285242Sachim    case 7:
9398285242Sachim      pLogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR;
9399285242Sachim      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9400285242Sachim      pLogPage[22] = 0x87;
9401285242Sachim      break;
9402285242Sachim    case 8:
9403285242Sachim      pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9404285242Sachim      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9405285242Sachim      pLogPage[22] = 0x88;
9406285242Sachim      break;
9407285242Sachim    case 9: /* fall through */
9408285242Sachim    case 10:/* fall through */
9409285242Sachim    case 11:/* fall through */
9410285242Sachim    case 12:/* fall through */
9411285242Sachim    case 13:/* fall through */
9412285242Sachim    case 14:
9413285242Sachim      pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9414285242Sachim      pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9415285242Sachim      pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9416285242Sachim      break;
9417285242Sachim    case 15:
9418285242Sachim      pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9419285242Sachim      pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9420285242Sachim      pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9421285242Sachim      break;
9422285242Sachim    default:
9423285242Sachim      TI_DBG1(("satLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x\n", SelfTestExecutionStatus));
9424285242Sachim
9425285242Sachim      satSetSensePayload( pSense,
9426285242Sachim                          SCSI_SNSKEY_NO_SENSE,
9427285242Sachim                          0,
9428285242Sachim                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9429285242Sachim                          satOrgIOContext);
9430285242Sachim
9431285242Sachim      ostiInitiatorIOCompleted( tiRoot,
9432285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9433285242Sachim                                tiIOSuccess,
9434285242Sachim                                SCSI_STAT_CHECK_CONDITION,
9435285242Sachim                                satOrgIOContext->pTiSenseData,
9436285242Sachim                                satOrgIOContext->interruptContext );
9437285242Sachim
9438285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9439285242Sachim
9440285242Sachim      satFreeIntIoResource( tiRoot,
9441285242Sachim                            satDevData,
9442285242Sachim                            satIntIo);
9443285242Sachim
9444285242Sachim      return;
9445285242Sachim    }
9446285242Sachim
9447285242Sachim    pLogPage[23] = 0;    /* vendor specific */
9448285242Sachim
9449285242Sachim    /* the rest of Self-test results log */
9450285242Sachim    /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/
9451285242Sachim    for (i=24;i<=403;i++)
9452285242Sachim    {
9453285242Sachim      pLogPage[i] = 0;    /* vendor specific */
9454285242Sachim    }
9455285242Sachim
9456285242Sachim    if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < lenReceived)
9457285242Sachim    {
9458285242Sachim      TI_DBG6(("satLogSenseCB: 1st underrun lenReceived %d len %d \n", lenReceived, SELFTEST_RESULTS_LOG_PAGE_LENGTH));
9459285242Sachim
9460285242Sachim      /* underrun */
9461285242Sachim      ostiInitiatorIOCompleted( tiRoot,
9462285242Sachim                                tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9463285242Sachim                                tiIOUnderRun,
9464285242Sachim                                lenReceived - SELFTEST_RESULTS_LOG_PAGE_LENGTH,
9465285242Sachim                                agNULL,
9466285242Sachim                                satOrgIOContext->interruptContext );
9467285242Sachim
9468285242Sachim    }
9469285242Sachim    else
9470285242Sachim    {
9471285242Sachim      ostiInitiatorIOCompleted( tiRoot,
9472285242Sachim                              tiOrgIORequest,
9473285242Sachim                              tiIOSuccess,
9474285242Sachim                              SCSI_STAT_GOOD,
9475285242Sachim                              agNULL,
9476285242Sachim                              satOrgIOContext->interruptContext);
9477285242Sachim    }
9478285242Sachim
9479285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9480285242Sachim
9481285242Sachim    satFreeIntIoResource( tiRoot,
9482285242Sachim                          satDevData,
9483285242Sachim                          satIntIo);
9484285242Sachim
9485285242Sachim    return;
9486285242Sachim  }
9487285242Sachim  else if (hostToDevFis->h.command == SAT_SMART_READ_LOG
9488285242Sachim           || hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
9489285242Sachim  {
9490285242Sachim    if (hostToDevFis->h.features == 0xd5)
9491285242Sachim    {
9492285242Sachim      TI_DBG5(("satLogSenseCB: SAT_SMART_READ_LOG success\n"));
9493285242Sachim      /* process log data and sends it to upper */
9494285242Sachim
9495285242Sachim      /* ATA: Extended Self-Test Log */
9496285242Sachim      virtAddr2  = (satSmartReadLogSelfTest_t *)(tiScsiRequest->sglVirtualAddr);
9497285242Sachim      /*
9498285242Sachim        SPC-4, p197, 287
9499285242Sachim        self-test execution status (4 bits); ((virtAddr2->byte[3] & 0xF0) >> 4)
9500285242Sachim      */
9501285242Sachim      SelfTestExecutionStatus  = (bit8)(((virtAddr2->byte[3] & 0xF0) >> 4));
9502285242Sachim
9503285242Sachim      /* fills in the log page from ATA log page */
9504285242Sachim      /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */
9505285242Sachim      pLogPage[0] = 0x10;    /* page code */
9506285242Sachim      pLogPage[1] = 0;
9507285242Sachim      pLogPage[2] = 0x01;    /* 0x190, page length */
9508285242Sachim      pLogPage[3] = 0x90;    /* 0x190, page length */
9509285242Sachim
9510285242Sachim      /* SPC-4, Table 217 */
9511285242Sachim      pLogPage[4] = 0;    /* Parameter Code */
9512285242Sachim      pLogPage[5] = 0x01; /* Parameter Code unspecfied but ... */
9513285242Sachim      pLogPage[6] = 3;    /* unspecified but ... */
9514285242Sachim      pLogPage[7] = 0x10; /* Parameter Length */
9515285242Sachim      pLogPage[8] = (bit8)(0 | ((virtAddr2->byte[3] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */
9516285242Sachim      pLogPage[9] = 0;    /* self test number */
9517285242Sachim      pLogPage[10] = virtAddr2->byte[5];    /* time stamp, MSB */
9518285242Sachim      pLogPage[11] = virtAddr2->byte[4];    /* time stamp, LSB */
9519285242Sachim
9520285242Sachim      pLogPage[12] = 0;    /* address of first failure MSB*/
9521285242Sachim      pLogPage[13] = 0;    /* address of first failure */
9522285242Sachim      pLogPage[14] = 0;    /* address of first failure */
9523285242Sachim      pLogPage[15] = 0;    /* address of first failure */
9524285242Sachim      pLogPage[16] = virtAddr2->byte[10];    /* address of first failure */
9525285242Sachim      pLogPage[17] = virtAddr2->byte[9];    /* address of first failure */
9526285242Sachim      pLogPage[18] = virtAddr2->byte[8];    /* address of first failure */
9527285242Sachim      pLogPage[19] = virtAddr2->byte[7];    /* address of first failure LSB */
9528285242Sachim
9529285242Sachim      /* SAT rev8 Table75, p 76 */
9530285242Sachim      switch (SelfTestExecutionStatus)
9531285242Sachim      {
9532285242Sachim      case 0:
9533285242Sachim        pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9534285242Sachim        pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9535285242Sachim        pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9536285242Sachim        break;
9537285242Sachim      case 1:
9538285242Sachim        pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9539285242Sachim        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9540285242Sachim        pLogPage[22] = 0x81;
9541285242Sachim        break;
9542285242Sachim      case 2:
9543285242Sachim        pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9544285242Sachim        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9545285242Sachim        pLogPage[22] = 0x82;
9546285242Sachim        break;
9547285242Sachim      case 3:
9548285242Sachim        pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9549285242Sachim        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9550285242Sachim        pLogPage[22] = 0x83;
9551285242Sachim        break;
9552285242Sachim      case 4:
9553285242Sachim        pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9554285242Sachim        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9555285242Sachim        pLogPage[22] = 0x84;
9556285242Sachim        break;
9557285242Sachim      case 5:
9558285242Sachim        pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9559285242Sachim        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9560285242Sachim        pLogPage[22] = 0x85;
9561285242Sachim        break;
9562285242Sachim      case 6:
9563285242Sachim        pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9564285242Sachim        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9565285242Sachim        pLogPage[22] = 0x86;
9566285242Sachim        break;
9567285242Sachim      case 7:
9568285242Sachim        pLogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR;
9569285242Sachim        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9570285242Sachim        pLogPage[22] = 0x87;
9571285242Sachim        break;
9572285242Sachim      case 8:
9573285242Sachim        pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9574285242Sachim        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9575285242Sachim        pLogPage[22] = 0x88;
9576285242Sachim        break;
9577285242Sachim      case 9: /* fall through */
9578285242Sachim      case 10:/* fall through */
9579285242Sachim      case 11:/* fall through */
9580285242Sachim      case 12:/* fall through */
9581285242Sachim      case 13:/* fall through */
9582285242Sachim      case 14:
9583285242Sachim        /* unspecified */
9584285242Sachim        pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9585285242Sachim        pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9586285242Sachim        pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9587285242Sachim        break;
9588285242Sachim      case 15:
9589285242Sachim        pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9590285242Sachim        pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9591285242Sachim        pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9592285242Sachim        break;
9593285242Sachim      default:
9594285242Sachim        TI_DBG1(("satLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x\n", SelfTestExecutionStatus));
9595285242Sachim
9596285242Sachim        satSetSensePayload( pSense,
9597285242Sachim                            SCSI_SNSKEY_NO_SENSE,
9598285242Sachim                            0,
9599285242Sachim                            SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9600285242Sachim                            satOrgIOContext);
9601285242Sachim
9602285242Sachim        ostiInitiatorIOCompleted( tiRoot,
9603285242Sachim                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9604285242Sachim                                  tiIOSuccess,
9605285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
9606285242Sachim                                  satOrgIOContext->pTiSenseData,
9607285242Sachim                                  satOrgIOContext->interruptContext );
9608285242Sachim
9609285242Sachim        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9610285242Sachim
9611285242Sachim        satFreeIntIoResource( tiRoot,
9612285242Sachim                              satDevData,
9613285242Sachim                              satIntIo);
9614285242Sachim
9615285242Sachim        return;
9616285242Sachim      }
9617285242Sachim
9618285242Sachim      pLogPage[23] = 0;    /* vendor specific */
9619285242Sachim
9620285242Sachim      /* the rest of Self-test results log */
9621285242Sachim      /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/
9622285242Sachim      for (i=24;i<=403;i++)
9623285242Sachim      {
9624285242Sachim        pLogPage[i] = 0;    /* vendor specific */
9625285242Sachim      }
9626285242Sachim
9627285242Sachim      if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < lenReceived)
9628285242Sachim      {
9629285242Sachim        TI_DBG6(("satLogSenseCB: 2nd underrun lenReceived %d len %d \n", lenReceived, SELFTEST_RESULTS_LOG_PAGE_LENGTH));
9630285242Sachim
9631285242Sachim        /* underrun */
9632285242Sachim        ostiInitiatorIOCompleted( tiRoot,
9633285242Sachim                                tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9634285242Sachim                                tiIOUnderRun,
9635285242Sachim                                lenReceived - SELFTEST_RESULTS_LOG_PAGE_LENGTH,
9636285242Sachim                                agNULL,
9637285242Sachim                                satOrgIOContext->interruptContext );
9638285242Sachim
9639285242Sachim      }
9640285242Sachim      else
9641285242Sachim      {
9642285242Sachim        ostiInitiatorIOCompleted( tiRoot,
9643285242Sachim                                tiOrgIORequest,
9644285242Sachim                                tiIOSuccess,
9645285242Sachim                                SCSI_STAT_GOOD,
9646285242Sachim                                agNULL,
9647285242Sachim                                satOrgIOContext->interruptContext);
9648285242Sachim      }
9649285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9650285242Sachim
9651285242Sachim      satFreeIntIoResource( tiRoot,
9652285242Sachim                            satDevData,
9653285242Sachim                            satIntIo);
9654285242Sachim
9655285242Sachim      return;
9656285242Sachim    }
9657285242Sachim    else if (hostToDevFis->h.features == 0xda)
9658285242Sachim    {
9659285242Sachim      TI_DBG5(("satLogSenseCB: SAT_SMART_RETURN_STATUS success\n"));
9660285242Sachim
9661285242Sachim      /* fills in the log page from ATA output */
9662285242Sachim      /* SPC-4, 7.2.5, Table 209, 211, p 255 */
9663285242Sachim      pLogPage[0] = 0x2F;    /* page code unspecified */
9664285242Sachim      pLogPage[1] = 0;       /* reserved */
9665285242Sachim      pLogPage[2] = 0;       /* page length */
9666285242Sachim      pLogPage[3] = 0x07;    /* page length */
9667285242Sachim
9668285242Sachim      /*
9669285242Sachim        SPC-4, 7.2.5, Table 211, p 255
9670285242Sachim        no vendor specific field
9671285242Sachim       */
9672285242Sachim      pLogPage[4] = 0;    /* Parameter Code */
9673285242Sachim      pLogPage[5] = 0;    /* Parameter Code unspecfied but to do: */
9674285242Sachim      pLogPage[6] = 0;    /* unspecified */
9675285242Sachim      pLogPage[7] = 0x03; /* Parameter length, unspecified */
9676285242Sachim
9677285242Sachim      /* SAT rev8, 10.2.3.1 Table 72, p 73 */
9678285242Sachim      if (statDevToHostFisData.lbaMid == 0x4F || statDevToHostFisData.lbaHigh == 0xC2)
9679285242Sachim      {
9680285242Sachim        pLogPage[8] = 0;   /* Sense code */
9681285242Sachim        pLogPage[9] = 0;   /* Sense code qualifier */
9682285242Sachim      }
9683285242Sachim      else if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C)
9684285242Sachim      {
9685285242Sachim        pLogPage[8] = 0x5D;   /* Sense code */
9686285242Sachim        pLogPage[9] = 0x10;   /* Sense code qualifier */
9687285242Sachim      }
9688285242Sachim
9689285242Sachim      /* Assumption: No support for SCT */
9690285242Sachim      pLogPage[10] = 0xFF; /* Most Recent Temperature Reading */
9691285242Sachim
9692285242Sachim      if (INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH < lenReceived)
9693285242Sachim      {
9694285242Sachim        TI_DBG6(("satLogSenseCB: 3rd underrun lenReceived %d len %d \n", lenReceived, INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH));
9695285242Sachim
9696285242Sachim        /* underrun */
9697285242Sachim        ostiInitiatorIOCompleted( tiRoot,
9698285242Sachim                                tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9699285242Sachim                                tiIOUnderRun,
9700285242Sachim                                lenReceived - INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH,
9701285242Sachim                                agNULL,
9702285242Sachim                                satOrgIOContext->interruptContext );
9703285242Sachim
9704285242Sachim      }
9705285242Sachim      else
9706285242Sachim      {
9707285242Sachim        ostiInitiatorIOCompleted( tiRoot,
9708285242Sachim                                tiOrgIORequest,
9709285242Sachim                                tiIOSuccess,
9710285242Sachim                                SCSI_STAT_GOOD,
9711285242Sachim                                agNULL,
9712285242Sachim                                satOrgIOContext->interruptContext);
9713285242Sachim      }
9714285242Sachim
9715285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9716285242Sachim
9717285242Sachim      satFreeIntIoResource( tiRoot,
9718285242Sachim                            satDevData,
9719285242Sachim                            satIntIo);
9720285242Sachim
9721285242Sachim
9722285242Sachim      return;
9723285242Sachim    }
9724285242Sachim    else
9725285242Sachim    {
9726285242Sachim      TI_DBG1(("satLogSenseCB: error unknown command success 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
9727285242Sachim      satSetSensePayload( pSense,
9728285242Sachim                          SCSI_SNSKEY_NO_SENSE,
9729285242Sachim                          0,
9730285242Sachim                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9731285242Sachim                          satOrgIOContext);
9732285242Sachim
9733285242Sachim      ostiInitiatorIOCompleted( tiRoot,
9734285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9735285242Sachim                                tiIOSuccess,
9736285242Sachim                                SCSI_STAT_CHECK_CONDITION,
9737285242Sachim                                satOrgIOContext->pTiSenseData,
9738285242Sachim                                satOrgIOContext->interruptContext );
9739285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9740285242Sachim
9741285242Sachim      satFreeIntIoResource( tiRoot,
9742285242Sachim                            satDevData,
9743285242Sachim                            satIntIo);
9744285242Sachim
9745285242Sachim      return;
9746285242Sachim    }
9747285242Sachim  }
9748285242Sachim  else
9749285242Sachim  {
9750285242Sachim    TI_DBG1(("satLogSenseCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
9751285242Sachim    satSetSensePayload( pSense,
9752285242Sachim                        SCSI_SNSKEY_NO_SENSE,
9753285242Sachim                        0,
9754285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9755285242Sachim                        satOrgIOContext);
9756285242Sachim
9757285242Sachim    ostiInitiatorIOCompleted( tiRoot,
9758285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9759285242Sachim                              tiIOSuccess,
9760285242Sachim                              SCSI_STAT_CHECK_CONDITION,
9761285242Sachim                              satOrgIOContext->pTiSenseData,
9762285242Sachim                              satOrgIOContext->interruptContext );
9763285242Sachim
9764285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9765285242Sachim
9766285242Sachim    satFreeIntIoResource( tiRoot,
9767285242Sachim                          satDevData,
9768285242Sachim                          satIntIo);
9769285242Sachim
9770285242Sachim    return;
9771285242Sachim  }
9772285242Sachim
9773285242Sachim  return;
9774285242Sachim}
9775285242Sachim
9776285242Sachim/*****************************************************************************
9777285242Sachim*! \brief  satReadMediaSerialNumberCB
9778285242Sachim*
9779285242Sachim*   This routine is a callback function called from ossaSATACompleted().
9780285242Sachim*   This CB routine deals with Read Media Serial Number completion.
9781285242Sachim*
9782285242Sachim*  \param   agRoot:       Handles for this instance of SAS/SATA hardware
9783285242Sachim*  \param   agIORequest:  Pointer to the LL I/O request context for this I/O.
9784285242Sachim*  \param   agIOStatus:   Status of completed I/O.
9785285242Sachim*  \param   agSATAParm1:  Additional info based on status.
9786285242Sachim*  \param   agIOInfoLen:  Length in bytes of overrun/underrun residual or FIS
9787285242Sachim*                         length.
9788285242Sachim*  \param   ioContext:    Pointer to satIOContext_t.
9789285242Sachim*
9790285242Sachim*  \return: none
9791285242Sachim*
9792285242Sachim*****************************************************************************/
9793285242Sachimvoid satReadMediaSerialNumberCB(
9794285242Sachim                        agsaRoot_t        *agRoot,
9795285242Sachim                        agsaIORequest_t   *agIORequest,
9796285242Sachim                        bit32             agIOStatus,
9797285242Sachim                        agsaFisHeader_t   *agFirstDword,
9798285242Sachim                        bit32             agIOInfoLen,
9799285242Sachim                        agsaFrameHandle_t agFrameHandle,
9800285242Sachim                        void              *ioContext
9801285242Sachim                        )
9802285242Sachim{
9803285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
9804285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
9805285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
9806285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
9807285242Sachim  tdIORequestBody_t       *tdIORequestBody;
9808285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
9809285242Sachim  satIOContext_t          *satIOContext;
9810285242Sachim  satIOContext_t          *satOrgIOContext;
9811285242Sachim  satInternalIo_t         *satIntIo;
9812285242Sachim  satDeviceData_t         *satDevData;
9813285242Sachim
9814285242Sachim  scsiRspSense_t          *pSense;
9815285242Sachim  tiIORequest_t           *tiOrgIORequest;
9816285242Sachim
9817285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
9818285242Sachim  tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* tiScsiXchg */
9819285242Sachim  bit8                      *pMediaSerialNumber;
9820285242Sachim
9821285242Sachim  tiIniScsiCmnd_t          *scsiCmnd;
9822285242Sachim  bit32                    lenReceived = 0;
9823285242Sachim
9824285242Sachim  TI_DBG4(("satReadMediaSerialNumberCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
9825285242Sachim
9826285242Sachim  /* internally generate tiIOContext */
9827285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
9828285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
9829285242Sachim  satIntIo               = satIOContext->satIntIoContext;
9830285242Sachim  satDevData             = satIOContext->pSatDevData;
9831285242Sachim  hostToDevFis           = satIOContext->pFis;
9832285242Sachim
9833285242Sachim  if (satIntIo == agNULL)
9834285242Sachim  {
9835285242Sachim    TI_DBG4(("satReadMediaSerialNumberCB: External satInternalIo_t satIntIoContext\n"));
9836285242Sachim    satOrgIOContext = satIOContext;
9837285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
9838285242Sachim    pSense          = satOrgIOContext->pSense;
9839285242Sachim    tiOrgScsiRequest          = satOrgIOContext->tiScsiXchg;
9840285242Sachim    /* SCSI command response payload to OS layer */
9841285242Sachim    pMediaSerialNumber        = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9842285242Sachim    /* ATA command response payload */
9843285242Sachim    scsiCmnd        = satOrgIOContext->pScsiCmnd;
9844285242Sachim
9845285242Sachim
9846285242Sachim  }
9847285242Sachim  else
9848285242Sachim  {
9849285242Sachim    TI_DBG4(("satReadMediaSerialNumberCB: Internal satInternalIo_t satIntIoContext\n"));
9850285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
9851285242Sachim    if (satOrgIOContext == agNULL)
9852285242Sachim    {
9853285242Sachim      TI_DBG4(("satReadMediaSerialNumberCB: satOrgIOContext is NULL, wrong\n"));
9854285242Sachim      return;
9855285242Sachim    }
9856285242Sachim    else
9857285242Sachim    {
9858285242Sachim      TI_DBG4(("satReadMediaSerialNumberCB: satOrgIOContext is NOT NULL\n"));
9859285242Sachim    }
9860285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
9861285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
9862285242Sachim
9863285242Sachim    pSense        = satOrgIOContext->pSense;
9864285242Sachim    tiOrgScsiRequest   = satOrgIOContext->tiScsiXchg;
9865285242Sachim    /* SCSI command response payload to OS layer */
9866285242Sachim    pMediaSerialNumber        = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9867285242Sachim    /* ATA command response payload */
9868285242Sachim    scsiCmnd        = satOrgIOContext->pScsiCmnd;
9869285242Sachim  }
9870285242Sachim
9871285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
9872285242Sachim  tdIORequestBody->ioStarted = agFALSE;
9873285242Sachim
9874285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
9875285242Sachim  {
9876285242Sachim    TI_DBG1(("satReadMediaSerialNumberCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
9877285242Sachim    ostiInitiatorIOCompleted (
9878285242Sachim                             tiRoot,
9879285242Sachim                             tiOrgIORequest,
9880285242Sachim                             tiIOFailed,
9881285242Sachim                             tiDetailOtherError,
9882285242Sachim                             agNULL,
9883285242Sachim                             satOrgIOContext->interruptContext
9884285242Sachim                             );
9885285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9886285242Sachim
9887285242Sachim    satFreeIntIoResource( tiRoot,
9888285242Sachim                          satDevData,
9889285242Sachim                          satIntIo);
9890285242Sachim    return;
9891285242Sachim  }
9892285242Sachim
9893285242Sachim  if( agIOStatus != OSSA_IO_SUCCESS)
9894285242Sachim  {
9895285242Sachim    /* Process abort case */
9896285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
9897285242Sachim    {
9898285242Sachim      satProcessAbort(tiRoot,
9899285242Sachim                      tiOrgIORequest,
9900285242Sachim                      satOrgIOContext
9901285242Sachim                      );
9902285242Sachim
9903285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9904285242Sachim
9905285242Sachim      satFreeIntIoResource( tiRoot,
9906285242Sachim                            satDevData,
9907285242Sachim                            satIntIo);
9908285242Sachim      return;
9909285242Sachim    }
9910285242Sachim    satSetSensePayload( pSense,
9911285242Sachim                        SCSI_SNSKEY_NOT_READY,
9912285242Sachim                        0,
9913285242Sachim                        SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
9914285242Sachim                        satOrgIOContext);
9915285242Sachim
9916285242Sachim    ostiInitiatorIOCompleted( tiRoot,
9917285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9918285242Sachim                              tiIOSuccess,
9919285242Sachim                              SCSI_STAT_CHECK_CONDITION,
9920285242Sachim                              satOrgIOContext->pTiSenseData,
9921285242Sachim                              satOrgIOContext->interruptContext );
9922285242Sachim
9923285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9924285242Sachim
9925285242Sachim    satFreeIntIoResource( tiRoot,
9926285242Sachim                          satDevData,
9927285242Sachim                          satIntIo);
9928285242Sachim    return;
9929285242Sachim  }
9930285242Sachim
9931285242Sachim  /* process success case */
9932285242Sachim  lenReceived = (scsiCmnd->cdb[6] << (8*3)) + (scsiCmnd->cdb[7] << (8*2))
9933285242Sachim                + (scsiCmnd->cdb[8] << 8) + scsiCmnd->cdb[9];
9934285242Sachim  TI_DBG5(("satReadMediaSerialNumberCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived));
9935285242Sachim
9936285242Sachim  if (hostToDevFis->h.command == SAT_READ_SECTORS ||
9937285242Sachim      hostToDevFis->h.command == SAT_READ_SECTORS_EXT
9938285242Sachim     )
9939285242Sachim  {
9940285242Sachim    pMediaSerialNumber[0] = 0;
9941285242Sachim    pMediaSerialNumber[1] = 0;
9942285242Sachim    pMediaSerialNumber[2] = 0;
9943285242Sachim    pMediaSerialNumber[3] = 4;
9944285242Sachim    pMediaSerialNumber[4] = 0;
9945285242Sachim    pMediaSerialNumber[5] = 0;
9946285242Sachim    pMediaSerialNumber[6] = 0;
9947285242Sachim    pMediaSerialNumber[7] = 0;
9948285242Sachim
9949285242Sachim    if (ZERO_MEDIA_SERIAL_NUMBER_LENGTH < lenReceived)
9950285242Sachim    {
9951285242Sachim      TI_DBG1(("satReadMediaSerialNumberCB: 1st underrun lenReceived %d len %d \n", lenReceived, ZERO_MEDIA_SERIAL_NUMBER_LENGTH));
9952285242Sachim
9953285242Sachim      /* underrun */
9954285242Sachim      ostiInitiatorIOCompleted( tiRoot,
9955285242Sachim                                tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9956285242Sachim                                tiIOUnderRun,
9957285242Sachim                                lenReceived - ZERO_MEDIA_SERIAL_NUMBER_LENGTH,
9958285242Sachim                                agNULL,
9959285242Sachim                                satOrgIOContext->interruptContext );
9960285242Sachim
9961285242Sachim    }
9962285242Sachim    else
9963285242Sachim    {
9964285242Sachim      ostiInitiatorIOCompleted( tiRoot,
9965285242Sachim                              tiOrgIORequest,
9966285242Sachim                              tiIOSuccess,
9967285242Sachim                              SCSI_STAT_GOOD,
9968285242Sachim                              agNULL,
9969285242Sachim                              satOrgIOContext->interruptContext);
9970285242Sachim    }
9971285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9972285242Sachim
9973285242Sachim    satFreeIntIoResource( tiRoot,
9974285242Sachim                          satDevData,
9975285242Sachim                          satIntIo);
9976285242Sachim    return;
9977285242Sachim  }
9978285242Sachim  else
9979285242Sachim  {
9980285242Sachim    TI_DBG1(("satReadMediaSerialNumberCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
9981285242Sachim    satSetSensePayload( pSense,
9982285242Sachim                        SCSI_SNSKEY_NO_SENSE,
9983285242Sachim                        0,
9984285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9985285242Sachim                        satOrgIOContext);
9986285242Sachim
9987285242Sachim    ostiInitiatorIOCompleted( tiRoot,
9988285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9989285242Sachim                              tiIOSuccess,
9990285242Sachim                              SCSI_STAT_CHECK_CONDITION,
9991285242Sachim                              satOrgIOContext->pTiSenseData,
9992285242Sachim                              satOrgIOContext->interruptContext );
9993285242Sachim
9994285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9995285242Sachim
9996285242Sachim    satFreeIntIoResource( tiRoot,
9997285242Sachim                          satDevData,
9998285242Sachim                          satIntIo);
9999285242Sachim
10000285242Sachim    return;
10001285242Sachim  }
10002285242Sachim  return;
10003285242Sachim}
10004285242Sachim
10005285242Sachim/*****************************************************************************
10006285242Sachim*! \brief  satReadBufferCB
10007285242Sachim*
10008285242Sachim*   This routine is a callback function called from ossaSATACompleted().
10009285242Sachim*   This CB routine deals with Read Buffer.
10010285242Sachim*
10011285242Sachim*  \param   agRoot:       Handles for this instance of SAS/SATA hardware
10012285242Sachim*  \param   agIORequest:  Pointer to the LL I/O request context for this I/O.
10013285242Sachim*  \param   agIOStatus:   Status of completed I/O.
10014285242Sachim*  \param   agSATAParm1:  Additional info based on status.
10015285242Sachim*  \param   agIOInfoLen:  Length in bytes of overrun/underrun residual or FIS
10016285242Sachim*                         length.
10017285242Sachim*  \param   ioContext:    Pointer to satIOContext_t.
10018285242Sachim*
10019285242Sachim*  \return: none
10020285242Sachim*
10021285242Sachim*****************************************************************************/
10022285242Sachimvoid satReadBufferCB(
10023285242Sachim                        agsaRoot_t        *agRoot,
10024285242Sachim                        agsaIORequest_t   *agIORequest,
10025285242Sachim                        bit32             agIOStatus,
10026285242Sachim                        agsaFisHeader_t   *agFirstDword,
10027285242Sachim                        bit32             agIOInfoLen,
10028285242Sachim                        agsaFrameHandle_t agFrameHandle,
10029285242Sachim                        void              *ioContext
10030285242Sachim                        )
10031285242Sachim{
10032285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
10033285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
10034285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
10035285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10036285242Sachim  tdIORequestBody_t       *tdIORequestBody;
10037285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
10038285242Sachim  satIOContext_t          *satIOContext;
10039285242Sachim  satIOContext_t          *satOrgIOContext;
10040285242Sachim  satInternalIo_t         *satIntIo;
10041285242Sachim  satDeviceData_t         *satDevData;
10042285242Sachim  scsiRspSense_t          *pSense;
10043285242Sachim  tiIORequest_t           *tiOrgIORequest;
10044285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
10045285242Sachim
10046285242Sachim  TI_DBG4(("satReadBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
10047285242Sachim
10048285242Sachim  /* internally generate tiIOContext */
10049285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
10050285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
10051285242Sachim  satIntIo               = satIOContext->satIntIoContext;
10052285242Sachim  satDevData             = satIOContext->pSatDevData;
10053285242Sachim  hostToDevFis           = satIOContext->pFis;
10054285242Sachim
10055285242Sachim
10056285242Sachim  if (satIntIo == agNULL)
10057285242Sachim  {
10058285242Sachim    TI_DBG4(("satReadBufferCB: External satInternalIo_t satIntIoContext\n"));
10059285242Sachim    satOrgIOContext = satIOContext;
10060285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
10061285242Sachim    pSense          = satOrgIOContext->pSense;
10062285242Sachim
10063285242Sachim    /* SCSI command response payload to OS layer */
10064285242Sachim
10065285242Sachim    /* ATA command response payload */
10066285242Sachim
10067285242Sachim  }
10068285242Sachim  else
10069285242Sachim  {
10070285242Sachim    TI_DBG4(("satReadBufferCB: Internal satInternalIo_t satIntIoContext\n"));
10071285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
10072285242Sachim    if (satOrgIOContext == agNULL)
10073285242Sachim    {
10074285242Sachim      TI_DBG4(("satReadBufferCB: satOrgIOContext is NULL, wrong\n"));
10075285242Sachim      return;
10076285242Sachim    }
10077285242Sachim    else
10078285242Sachim    {
10079285242Sachim      TI_DBG4(("satReadBufferCB: satOrgIOContext is NOT NULL\n"));
10080285242Sachim    }
10081285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
10082285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
10083285242Sachim
10084285242Sachim    pSense        = satOrgIOContext->pSense;
10085285242Sachim
10086285242Sachim    /* SCSI command response payload to OS layer */
10087285242Sachim
10088285242Sachim    /* ATA command response payload */
10089285242Sachim
10090285242Sachim  }
10091285242Sachim
10092285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
10093285242Sachim  tdIORequestBody->ioStarted = agFALSE;
10094285242Sachim
10095285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
10096285242Sachim  {
10097285242Sachim    TI_DBG1(("satReadBufferCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
10098285242Sachim    ostiInitiatorIOCompleted (
10099285242Sachim                             tiRoot,
10100285242Sachim                             tiOrgIORequest,
10101285242Sachim                             tiIOFailed,
10102285242Sachim                             tiDetailOtherError,
10103285242Sachim                             agNULL,
10104285242Sachim                             satOrgIOContext->interruptContext
10105285242Sachim                             );
10106285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10107285242Sachim
10108285242Sachim    satFreeIntIoResource( tiRoot,
10109285242Sachim                          satDevData,
10110285242Sachim                          satIntIo);
10111285242Sachim    return;
10112285242Sachim  }
10113285242Sachim
10114285242Sachim  if( agIOStatus != OSSA_IO_SUCCESS)
10115285242Sachim  {
10116285242Sachim    /* Process abort case */
10117285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
10118285242Sachim    {
10119285242Sachim      satProcessAbort(tiRoot,
10120285242Sachim                      tiOrgIORequest,
10121285242Sachim                      satOrgIOContext
10122285242Sachim                      );
10123285242Sachim
10124285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10125285242Sachim
10126285242Sachim      satFreeIntIoResource( tiRoot,
10127285242Sachim                            satDevData,
10128285242Sachim                            satIntIo);
10129285242Sachim      return;
10130285242Sachim    }
10131285242Sachim    satSetSensePayload( pSense,
10132285242Sachim                        SCSI_SNSKEY_NOT_READY,
10133285242Sachim                        0,
10134285242Sachim                        SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
10135285242Sachim                        satOrgIOContext);
10136285242Sachim
10137285242Sachim    ostiInitiatorIOCompleted( tiRoot,
10138285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10139285242Sachim                              tiIOSuccess,
10140285242Sachim                              SCSI_STAT_CHECK_CONDITION,
10141285242Sachim                              satOrgIOContext->pTiSenseData,
10142285242Sachim                              satOrgIOContext->interruptContext );
10143285242Sachim
10144285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10145285242Sachim
10146285242Sachim    satFreeIntIoResource( tiRoot,
10147285242Sachim                          satDevData,
10148285242Sachim                          satIntIo);
10149285242Sachim    return;
10150285242Sachim  }
10151285242Sachim
10152285242Sachim  /* process success case */
10153285242Sachim  if (hostToDevFis->h.command == SAT_READ_BUFFER )
10154285242Sachim  {
10155285242Sachim
10156285242Sachim    ostiInitiatorIOCompleted( tiRoot,
10157285242Sachim                              tiOrgIORequest,
10158285242Sachim                              tiIOSuccess,
10159285242Sachim                              SCSI_STAT_GOOD,
10160285242Sachim                              agNULL,
10161285242Sachim                              satOrgIOContext->interruptContext);
10162285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10163285242Sachim
10164285242Sachim    satFreeIntIoResource( tiRoot,
10165285242Sachim                          satDevData,
10166285242Sachim                          satIntIo);
10167285242Sachim    return;
10168285242Sachim  }
10169285242Sachim  else
10170285242Sachim  {
10171285242Sachim    TI_DBG1(("satReadBufferCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
10172285242Sachim    satSetSensePayload( pSense,
10173285242Sachim                        SCSI_SNSKEY_NO_SENSE,
10174285242Sachim                        0,
10175285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
10176285242Sachim                        satOrgIOContext);
10177285242Sachim
10178285242Sachim    ostiInitiatorIOCompleted( tiRoot,
10179285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10180285242Sachim                              tiIOSuccess,
10181285242Sachim                              SCSI_STAT_CHECK_CONDITION,
10182285242Sachim                              satOrgIOContext->pTiSenseData,
10183285242Sachim                              satOrgIOContext->interruptContext );
10184285242Sachim
10185285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10186285242Sachim
10187285242Sachim    satFreeIntIoResource( tiRoot,
10188285242Sachim                          satDevData,
10189285242Sachim                          satIntIo);
10190285242Sachim
10191285242Sachim    return;
10192285242Sachim  }
10193285242Sachim
10194285242Sachim  return;
10195285242Sachim}
10196285242Sachim
10197285242Sachim/*****************************************************************************
10198285242Sachim*! \brief  satWriteBufferCB
10199285242Sachim*
10200285242Sachim*   This routine is a callback function called from ossaSATACompleted().
10201285242Sachim*   This CB routine deals with Write Buffer.
10202285242Sachim*
10203285242Sachim*  \param   agRoot:       Handles for this instance of SAS/SATA hardware
10204285242Sachim*  \param   agIORequest:  Pointer to the LL I/O request context for this I/O.
10205285242Sachim*  \param   agIOStatus:   Status of completed I/O.
10206285242Sachim*  \param   agSATAParm1:  Additional info based on status.
10207285242Sachim*  \param   agIOInfoLen:  Length in bytes of overrun/underrun residual or FIS
10208285242Sachim*                         length.
10209285242Sachim*  \param   ioContext:    Pointer to satIOContext_t.
10210285242Sachim*
10211285242Sachim*  \return: none
10212285242Sachim*
10213285242Sachim*****************************************************************************/
10214285242Sachimvoid satWriteBufferCB(
10215285242Sachim                        agsaRoot_t        *agRoot,
10216285242Sachim                        agsaIORequest_t   *agIORequest,
10217285242Sachim                        bit32             agIOStatus,
10218285242Sachim                        agsaFisHeader_t   *agFirstDword,
10219285242Sachim                        bit32             agIOInfoLen,
10220285242Sachim                        agsaFrameHandle_t agFrameHandle,
10221285242Sachim                        void              *ioContext
10222285242Sachim                        )
10223285242Sachim{
10224285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
10225285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
10226285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
10227285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10228285242Sachim  tdIORequestBody_t       *tdIORequestBody;
10229285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
10230285242Sachim  satIOContext_t          *satIOContext;
10231285242Sachim  satIOContext_t          *satOrgIOContext;
10232285242Sachim  satInternalIo_t         *satIntIo;
10233285242Sachim  satDeviceData_t         *satDevData;
10234285242Sachim  scsiRspSense_t          *pSense;
10235285242Sachim  tiIORequest_t           *tiOrgIORequest;
10236285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
10237285242Sachim
10238285242Sachim  TI_DBG4(("satWriteBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
10239285242Sachim
10240285242Sachim  /* internally generate tiIOContext */
10241285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
10242285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
10243285242Sachim  satIntIo               = satIOContext->satIntIoContext;
10244285242Sachim  satDevData             = satIOContext->pSatDevData;
10245285242Sachim  hostToDevFis           = satIOContext->pFis;
10246285242Sachim
10247285242Sachim
10248285242Sachim  if (satIntIo == agNULL)
10249285242Sachim  {
10250285242Sachim    TI_DBG4(("satWriteBufferCB: External satInternalIo_t satIntIoContext\n"));
10251285242Sachim    satOrgIOContext = satIOContext;
10252285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
10253285242Sachim    pSense          = satOrgIOContext->pSense;
10254285242Sachim    /* SCSI command response payload to OS layer */
10255285242Sachim
10256285242Sachim    /* ATA command response payload */
10257285242Sachim
10258285242Sachim  }
10259285242Sachim  else
10260285242Sachim  {
10261285242Sachim    TI_DBG4(("satWriteBufferCB: Internal satInternalIo_t satIntIoContext\n"));
10262285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
10263285242Sachim    if (satOrgIOContext == agNULL)
10264285242Sachim    {
10265285242Sachim      TI_DBG4(("satWriteBufferCB: satOrgIOContext is NULL, wrong\n"));
10266285242Sachim      return;
10267285242Sachim    }
10268285242Sachim    else
10269285242Sachim    {
10270285242Sachim      TI_DBG4(("satWriteBufferCB: satOrgIOContext is NOT NULL\n"));
10271285242Sachim    }
10272285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
10273285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
10274285242Sachim
10275285242Sachim    pSense        = satOrgIOContext->pSense;
10276285242Sachim    /* SCSI command response payload to OS layer */
10277285242Sachim
10278285242Sachim    /* ATA command response payload */
10279285242Sachim
10280285242Sachim  }
10281285242Sachim
10282285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
10283285242Sachim  tdIORequestBody->ioStarted = agFALSE;
10284285242Sachim
10285285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
10286285242Sachim  {
10287285242Sachim    TI_DBG1(("satWriteBufferCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
10288285242Sachim    ostiInitiatorIOCompleted (
10289285242Sachim                             tiRoot,
10290285242Sachim                             tiOrgIORequest,
10291285242Sachim                             tiIOFailed,
10292285242Sachim                             tiDetailOtherError,
10293285242Sachim                             agNULL,
10294285242Sachim                             satOrgIOContext->interruptContext
10295285242Sachim                             );
10296285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10297285242Sachim
10298285242Sachim    satFreeIntIoResource( tiRoot,
10299285242Sachim                          satDevData,
10300285242Sachim                          satIntIo);
10301285242Sachim    return;
10302285242Sachim  }
10303285242Sachim
10304285242Sachim  if( agIOStatus != OSSA_IO_SUCCESS)
10305285242Sachim  {
10306285242Sachim    /* Process abort case */
10307285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
10308285242Sachim    {
10309285242Sachim      satProcessAbort(tiRoot,
10310285242Sachim                      tiOrgIORequest,
10311285242Sachim                      satOrgIOContext
10312285242Sachim                      );
10313285242Sachim
10314285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10315285242Sachim
10316285242Sachim      satFreeIntIoResource( tiRoot,
10317285242Sachim                            satDevData,
10318285242Sachim                            satIntIo);
10319285242Sachim      return;
10320285242Sachim    }
10321285242Sachim    satSetSensePayload( pSense,
10322285242Sachim                        SCSI_SNSKEY_NOT_READY,
10323285242Sachim                        0,
10324285242Sachim                        SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
10325285242Sachim                        satOrgIOContext);
10326285242Sachim
10327285242Sachim    ostiInitiatorIOCompleted( tiRoot,
10328285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10329285242Sachim                              tiIOSuccess,
10330285242Sachim                              SCSI_STAT_CHECK_CONDITION,
10331285242Sachim                              satOrgIOContext->pTiSenseData,
10332285242Sachim                              satOrgIOContext->interruptContext );
10333285242Sachim
10334285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10335285242Sachim
10336285242Sachim    satFreeIntIoResource( tiRoot,
10337285242Sachim                          satDevData,
10338285242Sachim                          satIntIo);
10339285242Sachim    return;
10340285242Sachim  }
10341285242Sachim  /* process success case */
10342285242Sachim  if (hostToDevFis->h.command == SAT_WRITE_BUFFER )
10343285242Sachim  {
10344285242Sachim
10345285242Sachim    ostiInitiatorIOCompleted( tiRoot,
10346285242Sachim                              tiOrgIORequest,
10347285242Sachim                              tiIOSuccess,
10348285242Sachim                              SCSI_STAT_GOOD,
10349285242Sachim                              agNULL,
10350285242Sachim                              satOrgIOContext->interruptContext);
10351285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10352285242Sachim
10353285242Sachim    satFreeIntIoResource( tiRoot,
10354285242Sachim                          satDevData,
10355285242Sachim                          satIntIo);
10356285242Sachim    return;
10357285242Sachim  }
10358285242Sachim  else
10359285242Sachim  {
10360285242Sachim    TI_DBG1(("satWriteBufferCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
10361285242Sachim    satSetSensePayload( pSense,
10362285242Sachim                        SCSI_SNSKEY_NO_SENSE,
10363285242Sachim                        0,
10364285242Sachim                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
10365285242Sachim                        satOrgIOContext);
10366285242Sachim
10367285242Sachim    ostiInitiatorIOCompleted( tiRoot,
10368285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10369285242Sachim                              tiIOSuccess,
10370285242Sachim                              SCSI_STAT_CHECK_CONDITION,
10371285242Sachim                              satOrgIOContext->pTiSenseData,
10372285242Sachim                              satOrgIOContext->interruptContext );
10373285242Sachim
10374285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10375285242Sachim
10376285242Sachim    satFreeIntIoResource( tiRoot,
10377285242Sachim                          satDevData,
10378285242Sachim                          satIntIo);
10379285242Sachim
10380285242Sachim    return;
10381285242Sachim  }
10382285242Sachim
10383285242Sachim  return;
10384285242Sachim}
10385285242Sachim
10386285242Sachim/*****************************************************************************
10387285242Sachim*! \brief  satReassignBlocksCB
10388285242Sachim*
10389285242Sachim*   This routine is a callback function called from ossaSATACompleted().
10390285242Sachim*   This CB routine deals with Reassign Blocks.
10391285242Sachim*
10392285242Sachim*  \param   agRoot:       Handles for this instance of SAS/SATA hardware
10393285242Sachim*  \param   agIORequest:  Pointer to the LL I/O request context for this I/O.
10394285242Sachim*  \param   agIOStatus:   Status of completed I/O.
10395285242Sachim*  \param   agSATAParm1:  Additional info based on status.
10396285242Sachim*  \param   agIOInfoLen:  Length in bytes of overrun/underrun residual or FIS
10397285242Sachim*                         length.
10398285242Sachim*  \param   ioContext:    Pointer to satIOContext_t.
10399285242Sachim*
10400285242Sachim*  \return: none
10401285242Sachim*
10402285242Sachim*****************************************************************************/
10403285242Sachimvoid satReassignBlocksCB(
10404285242Sachim                        agsaRoot_t        *agRoot,
10405285242Sachim                        agsaIORequest_t   *agIORequest,
10406285242Sachim                        bit32             agIOStatus,
10407285242Sachim                        agsaFisHeader_t   *agFirstDword,
10408285242Sachim                        bit32             agIOInfoLen,
10409285242Sachim                        agsaFrameHandle_t agFrameHandle,
10410285242Sachim                        void              *ioContext
10411285242Sachim                        )
10412285242Sachim{
10413285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
10414285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
10415285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
10416285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10417285242Sachim  tdIORequestBody_t       *tdIORequestBody;
10418285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
10419285242Sachim  satIOContext_t          *satIOContext;
10420285242Sachim  satIOContext_t          *satOrgIOContext;
10421285242Sachim  satIOContext_t          *satNewIOContext;
10422285242Sachim  satInternalIo_t         *satIntIo;
10423285242Sachim  satInternalIo_t         *satNewIntIo = agNULL;
10424285242Sachim  satDeviceData_t         *satDevData;
10425285242Sachim
10426285242Sachim  scsiRspSense_t            *pSense;
10427285242Sachim  tiIniScsiCmnd_t           *scsiCmnd;
10428285242Sachim  tiIORequest_t             *tiOrgIORequest;
10429285242Sachim
10430285242Sachim  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
10431285242Sachim  bit32                     ataStatus = 0;
10432285242Sachim  bit32                     status;
10433285242Sachim  tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
10434285242Sachim  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
10435285242Sachim
10436285242Sachim  TI_DBG5(("satReassignBlocksCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
10437285242Sachim
10438285242Sachim  /* internally generate tiIOContext */
10439285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
10440285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
10441285242Sachim  satIntIo               = satIOContext->satIntIoContext;
10442285242Sachim  satDevData             = satIOContext->pSatDevData;
10443285242Sachim  hostToDevFis           = satIOContext->pFis;
10444285242Sachim
10445285242Sachim  if (satIntIo == agNULL)
10446285242Sachim  {
10447285242Sachim    TI_DBG4(("satReassignBlocksCB: External satInternalIo_t satIntIoContext\n"));
10448285242Sachim    satOrgIOContext = satIOContext;
10449285242Sachim    tiOrgIORequest  = tdIORequestBody->tiIORequest;
10450285242Sachim    tiScsiRequest   = satOrgIOContext->tiScsiXchg;
10451285242Sachim    pSense          = satOrgIOContext->pSense;
10452285242Sachim    scsiCmnd        = satOrgIOContext->pScsiCmnd;
10453285242Sachim  }
10454285242Sachim  else
10455285242Sachim  {
10456285242Sachim    TI_DBG4(("satReassignBlocksCB: Internal satInternalIo_t satIntIoContext\n"));
10457285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
10458285242Sachim    if (satOrgIOContext == agNULL)
10459285242Sachim    {
10460285242Sachim      TI_DBG4(("satReassignBlocksCB: satOrgIOContext is NULL, Wrong\n"));
10461285242Sachim      return;
10462285242Sachim    }
10463285242Sachim    else
10464285242Sachim    {
10465285242Sachim      TI_DBG4(("satReassignBlocksCB: satOrgIOContext is NOT NULL, Wrong\n"));
10466285242Sachim    }
10467285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
10468285242Sachim    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
10469285242Sachim
10470285242Sachim    tiScsiRequest = satOrgIOContext->tiScsiXchg;
10471285242Sachim    pSense        = satOrgIOContext->pSense;
10472285242Sachim    scsiCmnd      = satOrgIOContext->pScsiCmnd;
10473285242Sachim  }
10474285242Sachim
10475285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
10476285242Sachim  tdIORequestBody->ioStarted = agFALSE;
10477285242Sachim
10478285242Sachim  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
10479285242Sachim  {
10480285242Sachim    TI_DBG1(("satReassignBlocksCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
10481285242Sachim    ostiInitiatorIOCompleted (
10482285242Sachim                             tiRoot,
10483285242Sachim                             tiOrgIORequest,
10484285242Sachim                             tiIOFailed,
10485285242Sachim                             tiDetailOtherError,
10486285242Sachim                             agNULL,
10487285242Sachim                             satOrgIOContext->interruptContext
10488285242Sachim                             );
10489285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10490285242Sachim
10491285242Sachim    satFreeIntIoResource( tiRoot,
10492285242Sachim                          satDevData,
10493285242Sachim                          satIntIo);
10494285242Sachim    return;
10495285242Sachim  }
10496285242Sachim
10497285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
10498285242Sachim  {
10499285242Sachim    /* only agsaFisRegDeviceToHost_t is expected */
10500285242Sachim    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
10501285242Sachim    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
10502285242Sachim  }
10503285242Sachim
10504285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
10505285242Sachim  {
10506285242Sachim  if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
10507285242Sachim       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
10508285242Sachim       )
10509285242Sachim  {
10510285242Sachim    /* for debugging */
10511285242Sachim    if( agIOStatus != OSSA_IO_SUCCESS)
10512285242Sachim    {
10513285242Sachim      TI_DBG1(("satReassignBlocksCB FAILED, NOT IO_SUCCESS\n"));
10514285242Sachim    }
10515285242Sachim    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
10516285242Sachim    {
10517285242Sachim      TI_DBG1(("satReassignBlocksCB FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
10518285242Sachim    }
10519285242Sachim    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
10520285242Sachim              (ataStatus & DF_ATA_STATUS_MASK)
10521285242Sachim              )
10522285242Sachim    {
10523285242Sachim      TI_DBG1(("satReassignBlocksCB FAILED, FAILED, error status\n"));
10524285242Sachim    }
10525285242Sachim
10526285242Sachim    /* Process abort case */
10527285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
10528285242Sachim    {
10529285242Sachim      satProcessAbort(tiRoot,
10530285242Sachim                      tiOrgIORequest,
10531285242Sachim                      satOrgIOContext
10532285242Sachim                      );
10533285242Sachim
10534285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10535285242Sachim
10536285242Sachim      satFreeIntIoResource( tiRoot,
10537285242Sachim                            satDevData,
10538285242Sachim                            satIntIo);
10539285242Sachim      return;
10540285242Sachim    }
10541285242Sachim
10542285242Sachim    /* for debugging */
10543285242Sachim    if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS ||
10544285242Sachim        hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT
10545285242Sachim       )
10546285242Sachim    {
10547285242Sachim      TI_DBG1(("satReassignBlocksCB SAT_READ_VERIFY_SECTORS(_EXT) failed\n"));
10548285242Sachim      /* Verify failed; send Write with same LBA */
10549285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10550285242Sachim
10551285242Sachim      satFreeIntIoResource( tiRoot,
10552285242Sachim                            satDevData,
10553285242Sachim                            satIntIo);
10554285242Sachim
10555285242Sachim      satNewIntIo = satAllocIntIoResource( tiRoot,
10556285242Sachim                                           tiOrgIORequest,
10557285242Sachim                                           satDevData,
10558285242Sachim                                           512, /* writing 1 sector */
10559285242Sachim                                           satNewIntIo);
10560285242Sachim      if (satNewIntIo == agNULL)
10561285242Sachim      {
10562285242Sachim        /* memory allocation failure */
10563285242Sachim        satFreeIntIoResource( tiRoot,
10564285242Sachim                              satDevData,
10565285242Sachim                              satNewIntIo);
10566285242Sachim
10567285242Sachim        satSetSensePayload( pSense,
10568285242Sachim                            SCSI_SNSKEY_HARDWARE_ERROR,
10569285242Sachim                            0,
10570285242Sachim                            SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10571285242Sachim                            satOrgIOContext);
10572285242Sachim
10573285242Sachim        ostiInitiatorIOCompleted( tiRoot,
10574285242Sachim                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10575285242Sachim                                  tiIOSuccess,
10576285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
10577285242Sachim                                  satOrgIOContext->pTiSenseData,
10578285242Sachim                                  satOrgIOContext->interruptContext );
10579285242Sachim        TI_DBG1(("satReassignBlocksCB: momory allocation fails\n"));
10580285242Sachim        return;
10581285242Sachim      } /* end memory allocation */
10582285242Sachim
10583285242Sachim      satNewIOContext = satPrepareNewIO(
10584285242Sachim                                        satNewIntIo,
10585285242Sachim                                        tiOrgIORequest,
10586285242Sachim                                        satDevData,
10587285242Sachim                                        scsiCmnd,
10588285242Sachim                                        satOrgIOContext
10589285242Sachim                                        );
10590285242Sachim
10591285242Sachim      /* send Write with same LBA */
10592285242Sachim      status = satReassignBlocks_2(
10593285242Sachim                                   tiRoot,
10594285242Sachim                                   &satNewIntIo->satIntTiIORequest,
10595285242Sachim                                   satNewIOContext->ptiDeviceHandle,
10596285242Sachim                                   &satNewIntIo->satIntTiScsiXchg,
10597285242Sachim                                   satNewIOContext,
10598285242Sachim                                   satOrgIOContext->LBA
10599285242Sachim                                 );
10600285242Sachim
10601285242Sachim      if (status != tiSuccess)
10602285242Sachim      {
10603285242Sachim        /* sending ATA command fails */
10604285242Sachim        satFreeIntIoResource( tiRoot,
10605285242Sachim                              satDevData,
10606285242Sachim                              satNewIntIo);
10607285242Sachim        satSetSensePayload( pSense,
10608285242Sachim                            SCSI_SNSKEY_HARDWARE_ERROR,
10609285242Sachim                            0,
10610285242Sachim                            SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10611285242Sachim                            satOrgIOContext);
10612285242Sachim
10613285242Sachim        ostiInitiatorIOCompleted( tiRoot,
10614285242Sachim                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10615285242Sachim                                  tiIOSuccess,
10616285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
10617285242Sachim                                  satOrgIOContext->pTiSenseData,
10618285242Sachim                                  satOrgIOContext->interruptContext );
10619285242Sachim        TI_DBG1(("satReassignBlocksCB calling fail 1\n"));
10620285242Sachim        return;
10621285242Sachim      } /* end send fails */
10622285242Sachim
10623285242Sachim      return;
10624285242Sachim    }
10625285242Sachim    else if (hostToDevFis->h.command == SAT_WRITE_DMA ||
10626285242Sachim             hostToDevFis->h.command == SAT_WRITE_SECTORS ||
10627285242Sachim             hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
10628285242Sachim             hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
10629285242Sachim             hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
10630285242Sachim             )
10631285242Sachim    {
10632285242Sachim      TI_DBG1(("satReassignBlocksCB SAT_WRITE failed\n"));
10633285242Sachim      /* fall through */
10634285242Sachim    }
10635285242Sachim    else
10636285242Sachim    {
10637285242Sachim      TI_DBG1(("satReassignBlocksCB error default case unexpected command 0x%x\n", hostToDevFis->h.command));
10638285242Sachim    }
10639285242Sachim
10640285242Sachim
10641285242Sachim    satSetSensePayload( pSense,
10642285242Sachim                        SCSI_SNSKEY_HARDWARE_ERROR,
10643285242Sachim                        0,
10644285242Sachim                        SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10645285242Sachim                        satOrgIOContext);
10646285242Sachim
10647285242Sachim    ostiInitiatorIOCompleted( tiRoot,
10648285242Sachim                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10649285242Sachim                              tiIOSuccess,
10650285242Sachim                              SCSI_STAT_CHECK_CONDITION,
10651285242Sachim                              satOrgIOContext->pTiSenseData,
10652285242Sachim                              satOrgIOContext->interruptContext );
10653285242Sachim
10654285242Sachim
10655285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10656285242Sachim
10657285242Sachim    satFreeIntIoResource( tiRoot,
10658285242Sachim                          satDevData,
10659285242Sachim                          satIntIo);
10660285242Sachim    return;
10661285242Sachim  } /* error checking */
10662285242Sachim  }
10663285242Sachim
10664285242Sachim
10665285242Sachim  /* prcessing the success case */
10666285242Sachim  if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS ||
10667285242Sachim      hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT ||
10668285242Sachim      hostToDevFis->h.command == SAT_WRITE_DMA ||
10669285242Sachim      hostToDevFis->h.command == SAT_WRITE_SECTORS ||
10670285242Sachim      hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
10671285242Sachim      hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
10672285242Sachim      hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
10673285242Sachim      )
10674285242Sachim  {
10675285242Sachim    /* next LBA; verify */
10676285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10677285242Sachim
10678285242Sachim    satFreeIntIoResource( tiRoot,
10679285242Sachim                          satDevData,
10680285242Sachim                          satIntIo);
10681285242Sachim
10682285242Sachim    if (satOrgIOContext->ParmIndex >= satOrgIOContext->ParmLen)
10683285242Sachim    {
10684285242Sachim      TI_DBG5(("satReassignBlocksCB: GOOD status\n"));
10685285242Sachim      /* return stat_good */
10686285242Sachim      ostiInitiatorIOCompleted( tiRoot,
10687285242Sachim                                tiOrgIORequest,
10688285242Sachim                                tiIOSuccess,
10689285242Sachim                                SCSI_STAT_GOOD,
10690285242Sachim                                agNULL,
10691285242Sachim                                satOrgIOContext->interruptContext );
10692285242Sachim      return;
10693285242Sachim    }
10694285242Sachim    else
10695285242Sachim    {
10696285242Sachim      TI_DBG5(("satReassignBlocksCB: processing next LBA\n"));
10697285242Sachim      satNewIntIo = satAllocIntIoResource( tiRoot,
10698285242Sachim                                           tiOrgIORequest,
10699285242Sachim                                           satDevData,
10700285242Sachim                                           0,
10701285242Sachim                                           satNewIntIo);
10702285242Sachim      if (satNewIntIo == agNULL)
10703285242Sachim      {
10704285242Sachim        /* memory allocation failure */
10705285242Sachim        satFreeIntIoResource( tiRoot,
10706285242Sachim                              satDevData,
10707285242Sachim                              satNewIntIo);
10708285242Sachim
10709285242Sachim        satSetSensePayload( pSense,
10710285242Sachim                            SCSI_SNSKEY_HARDWARE_ERROR,
10711285242Sachim                            0,
10712285242Sachim                            SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10713285242Sachim                            satOrgIOContext);
10714285242Sachim
10715285242Sachim        ostiInitiatorIOCompleted( tiRoot,
10716285242Sachim                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10717285242Sachim                                  tiIOSuccess,
10718285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
10719285242Sachim                                  satOrgIOContext->pTiSenseData,
10720285242Sachim                                  satOrgIOContext->interruptContext );
10721285242Sachim        TI_DBG1(("satReassignBlocksCB: momory allocation fails\n"));
10722285242Sachim        return;
10723285242Sachim      } /* end memory allocation */
10724285242Sachim
10725285242Sachim      satNewIOContext = satPrepareNewIO(
10726285242Sachim                                        satNewIntIo,
10727285242Sachim                                        tiOrgIORequest,
10728285242Sachim                                        satDevData,
10729285242Sachim                                        scsiCmnd,
10730285242Sachim                                        satOrgIOContext
10731285242Sachim                                        );
10732285242Sachim
10733285242Sachim      /* send Verify with the next LBA */
10734285242Sachim      status = satReassignBlocks_1(
10735285242Sachim                                   tiRoot,
10736285242Sachim                                   &satNewIntIo->satIntTiIORequest,
10737285242Sachim                                   satNewIOContext->ptiDeviceHandle,
10738285242Sachim                                   tiScsiRequest, /* orginal from OS layer */
10739285242Sachim                                   satNewIOContext,
10740285242Sachim                                   satOrgIOContext
10741285242Sachim                                   );
10742285242Sachim
10743285242Sachim      if (status != tiSuccess)
10744285242Sachim      {
10745285242Sachim        /* sending ATA command fails */
10746285242Sachim        satFreeIntIoResource( tiRoot,
10747285242Sachim                              satDevData,
10748285242Sachim                              satNewIntIo);
10749285242Sachim        satSetSensePayload( pSense,
10750285242Sachim                            SCSI_SNSKEY_HARDWARE_ERROR,
10751285242Sachim                            0,
10752285242Sachim                            SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10753285242Sachim                            satOrgIOContext);
10754285242Sachim
10755285242Sachim        ostiInitiatorIOCompleted( tiRoot,
10756285242Sachim                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10757285242Sachim                                  tiIOSuccess,
10758285242Sachim                                  SCSI_STAT_CHECK_CONDITION,
10759285242Sachim                                  satOrgIOContext->pTiSenseData,
10760285242Sachim                                  satOrgIOContext->interruptContext );
10761285242Sachim        TI_DBG1(("satReassignBlocksCB calling satModeSelect6_1 fails\n"));
10762285242Sachim        return;
10763285242Sachim      } /* end send fails */
10764285242Sachim    } /* else */
10765285242Sachim    return;
10766285242Sachim
10767285242Sachim  }
10768285242Sachim  else if (hostToDevFis->h.command == SAT_WRITE_DMA ||
10769285242Sachim           hostToDevFis->h.command == SAT_WRITE_SECTORS ||
10770285242Sachim           hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
10771285242Sachim           hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
10772285242Sachim           hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
10773285242Sachim           )
10774285242Sachim  {
10775285242Sachim    /* next LBA; verify */
10776285242Sachim  }
10777285242Sachim  else
10778285242Sachim  {
10779285242Sachim      TI_DBG1(("satReassignBlocksCB error unknown command success 0x%x \n", hostToDevFis->h.command));
10780285242Sachim
10781285242Sachim      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10782285242Sachim
10783285242Sachim      satFreeIntIoResource( tiRoot,
10784285242Sachim                            satDevData,
10785285242Sachim                            satIntIo);
10786285242Sachim      satSetSensePayload( pSense,
10787285242Sachim                          SCSI_SNSKEY_HARDWARE_ERROR,
10788285242Sachim                          0,
10789285242Sachim                          SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10790285242Sachim                          satOrgIOContext);
10791285242Sachim
10792285242Sachim      ostiInitiatorIOCompleted( tiRoot,
10793285242Sachim                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10794285242Sachim                                tiIOSuccess,
10795285242Sachim                                SCSI_STAT_CHECK_CONDITION,
10796285242Sachim                                satOrgIOContext->pTiSenseData,
10797285242Sachim                                satOrgIOContext->interruptContext );
10798285242Sachim      return;
10799285242Sachim  }
10800285242Sachim  return;
10801285242Sachim}
10802285242Sachim/*****************************************************************************
10803285242Sachim*! \brief  satReadLogExtCB
10804285242Sachim*
10805285242Sachim*   This routine is a callback function called from ossaSATACompleted().
10806285242Sachim*   This CB routine deals READ LOG EXT completion.
10807285242Sachim*
10808285242Sachim*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
10809285242Sachim*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
10810285242Sachim*  \param   agIOStatus:  Status of completed I/O.
10811285242Sachim*  \param   agFirstDword:Pointer to the four bytes of FIS.
10812285242Sachim*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
10813285242Sachim*                        length.
10814285242Sachim*  \param   agParam:     Additional info based on status.
10815285242Sachim*  \param   ioContext:   Pointer to satIOContext_t.
10816285242Sachim*
10817285242Sachim*  \return: none
10818285242Sachim*
10819285242Sachim*****************************************************************************/
10820285242Sachim/*
10821285242Sachim  SATAII spec p42
10822285242Sachim
10823285242Sachim*/
10824285242Sachimvoid satReadLogExtCB(
10825285242Sachim                     agsaRoot_t        *agRoot,
10826285242Sachim                     agsaIORequest_t   *agIORequest,
10827285242Sachim                     bit32             agIOStatus,
10828285242Sachim                     agsaFisHeader_t   *agFirstDword,
10829285242Sachim                     bit32             agIOInfoLen,
10830285242Sachim                     void              *agParam,
10831285242Sachim                     void              *ioContext
10832285242Sachim                     )
10833285242Sachim
10834285242Sachim{
10835285242Sachim
10836285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
10837285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
10838285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
10839285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10840285242Sachim  tdIORequestBody_t       *tdIORequestBody;
10841285242Sachim  satIOContext_t          *satReadLogExtIOContext;
10842285242Sachim  satInternalIo_t         *satIntIo;
10843285242Sachim  satDeviceData_t         *satDevData;
10844285242Sachim  tdsaDeviceData_t        *tdsaDeviceData;
10845285242Sachim  agsaIORequest_t         *agAbortIORequest;
10846285242Sachim  tdIORequestBody_t       *tdAbortIORequestBody;
10847285242Sachim  bit32                   PhysUpper32;
10848285242Sachim  bit32                   PhysLower32;
10849285242Sachim  bit32                   memAllocStatus;
10850285242Sachim  void                    *osMemHandle;
10851285242Sachim
10852285242Sachim  TI_DBG1(("satReadLogExtCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
10853285242Sachim    agIORequest, agIOStatus, agIOInfoLen));
10854285242Sachim
10855285242Sachim  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
10856285242Sachim  satReadLogExtIOContext = (satIOContext_t *) ioContext;
10857285242Sachim  satIntIo               = satReadLogExtIOContext->satIntIoContext;
10858285242Sachim  satDevData             = satReadLogExtIOContext->pSatDevData;
10859285242Sachim  tdsaDeviceData         = (tdsaDeviceData_t *)satDevData->satSaDeviceData;
10860285242Sachim
10861285242Sachim  TI_DBG1(("satReadLogExtCB: did %d\n", tdsaDeviceData->id));
10862285242Sachim  satDecrementPendingIO(tiRoot, tdsaAllShared, satReadLogExtIOContext);
10863285242Sachim
10864285242Sachim
10865285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
10866285242Sachim  tdIORequestBody->ioStarted = agFALSE;
10867285242Sachim
10868285242Sachim  /*
10869285242Sachim   * If READ LOG EXT failed, we issue device reset.
10870285242Sachim   */
10871285242Sachim  if ( agIOStatus != OSSA_IO_SUCCESS ||
10872285242Sachim       (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0)
10873285242Sachim     )
10874285242Sachim  {
10875285242Sachim    TI_DBG1(("satReadLogExtCB: FAILED.\n"));
10876285242Sachim
10877285242Sachim    satFreeIntIoResource( tiRoot,
10878285242Sachim                          satDevData,
10879285242Sachim                          satIntIo);
10880285242Sachim    /* Abort I/O after completion of device reset */
10881285242Sachim    satDevData->satAbortAfterReset = agTRUE;
10882285242Sachim#ifdef NOT_YET
10883285242Sachim    /* needs to investigate this case */
10884285242Sachim    /* no report to OS layer */
10885285242Sachim    satSubTM(tiRoot,
10886285242Sachim             satReadLogExtIOContext->ptiDeviceHandle,
10887285242Sachim             TD_INTERNAL_TM_RESET,
10888285242Sachim             agNULL,
10889285242Sachim             agNULL,
10890285242Sachim             agNULL,
10891285242Sachim             agFALSE);
10892285242Sachim#endif
10893285242Sachim    return;
10894285242Sachim  }
10895285242Sachim
10896285242Sachim
10897285242Sachim  /***************************************************************************
10898285242Sachim   * The following steps take place when READ LOG EXT successfully completed.
10899285242Sachim   ***************************************************************************/
10900285242Sachim
10901285242Sachim  /************************************************************************
10902285242Sachim   *
10903285242Sachim   * 1. Issue abort to LL layer to all other pending I/Os for the same SATA
10904285242Sachim   *    drive.
10905285242Sachim   *
10906285242Sachim   * 2. Free resource allocated for the internally generated READ LOG EXT.
10907285242Sachim   *
10908285242Sachim   * 3. At the completion of abort, in the context of ossaSATACompleted(),
10909285242Sachim   *    return the I/O with error status to the OS-App Specific layer.
10910285242Sachim   *    When all I/O aborts are completed, clear SATA device flag to
10911285242Sachim   *    indicate ready to process new request.
10912285242Sachim   *
10913285242Sachim   ***********************************************************************/
10914285242Sachim
10915285242Sachim  /*
10916285242Sachim   * Issue abort to LL layer to all other pending I/Os for the same SATA drive
10917285242Sachim   */
10918285242Sachim  /*
10919285242Sachim    replace the single IO abort with device abort
10920285242Sachim  */
10921285242Sachim
10922285242Sachim  TI_DBG1(("satReadLogExtCB: issuing saSATAAbort. Device Abort\n"));
10923285242Sachim  /* do not deregister this device */
10924285242Sachim  tdsaDeviceData->OSAbortAll = agTRUE;
10925285242Sachim
10926285242Sachim  /* allocating agIORequest for abort itself */
10927285242Sachim  memAllocStatus = ostiAllocMemory(
10928285242Sachim                                   tiRoot,
10929285242Sachim                                   &osMemHandle,
10930285242Sachim                                   (void **)&tdAbortIORequestBody,
10931285242Sachim                                   &PhysUpper32,
10932285242Sachim                                   &PhysLower32,
10933285242Sachim                                   8,
10934285242Sachim                                   sizeof(tdIORequestBody_t),
10935285242Sachim                                   agTRUE
10936285242Sachim                                   );
10937285242Sachim
10938285242Sachim  if (memAllocStatus != tiSuccess)
10939285242Sachim  {
10940285242Sachim    /* let os process IO */
10941285242Sachim    TI_DBG1(("satReadLogExtCB: ostiAllocMemory failed...\n"));
10942285242Sachim    return;
10943285242Sachim  }
10944285242Sachim
10945285242Sachim  if (tdAbortIORequestBody == agNULL)
10946285242Sachim  {
10947285242Sachim    /* let os process IO */
10948285242Sachim    TI_DBG1(("satReadLogExtCB: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
10949285242Sachim    return;
10950285242Sachim  }
10951285242Sachim
10952285242Sachim  /* setup task management structure */
10953285242Sachim  tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
10954285242Sachim  tdAbortIORequestBody->tiDevHandle = (tiDeviceHandle_t *)&(tdsaDeviceData->tiDeviceHandle);
10955285242Sachim  /* initialize agIORequest */
10956285242Sachim  agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
10957285242Sachim  agAbortIORequest->osData = (void *) tdAbortIORequestBody;
10958285242Sachim  agAbortIORequest->sdkData = agNULL; /* LL takes care of this */
10959285242Sachim
10960285242Sachim  /*
10961285242Sachim   * Issue abort
10962285242Sachim   */
10963285242Sachim  saSATAAbort( agRoot, agAbortIORequest, 0, tdsaDeviceData->agDevHandle, 1, agNULL, agNULL);
10964285242Sachim
10965285242Sachim
10966285242Sachim  /*
10967285242Sachim   * Free resource allocated for the internally generated READ LOG EXT.
10968285242Sachim   */
10969285242Sachim  satFreeIntIoResource( tiRoot,
10970285242Sachim                        satDevData,
10971285242Sachim                        satIntIo);
10972285242Sachim
10973285242Sachim  /*
10974285242Sachim   * Sequence of recovery continue at some other context:
10975285242Sachim   * At the completion of abort, in the context of ossaSATACompleted(),
10976285242Sachim   * return the I/O with error status to the OS-App Specific layer.
10977285242Sachim   * When all I/O aborts are completed, clear SATA device flag to
10978285242Sachim   * indicate ready to process new request.
10979285242Sachim   */
10980285242Sachim
10981285242Sachim   satDevData->satDriveState = SAT_DEV_STATE_NORMAL;
10982285242Sachim
10983285242Sachim   TI_DBG1(("satReadLogExtCB: end return\n"));
10984285242Sachim   return;
10985285242Sachim}
10986285242Sachim
10987285242Sachim#ifndef FDS_SM
10988285242Sachim/*****************************************************************************
10989285242Sachim*! \brief  ossaSATAEvent
10990285242Sachim*
10991285242Sachim*   This routine is called to notify the OS Layer of an event associated with
10992285242Sachim*   SATA port or SATA device
10993285242Sachim*
10994285242Sachim*  \param   agRoot:        Handles for this instance of SAS/SATA hardware
10995285242Sachim*  \param   agIORequest:   Pointer to the LL I/O request context for this I/O.
10996285242Sachim*  \param   agPortContext  Pointer to the port context of TD and Lower layer
10997285242Sachim*  \param   agDevHandle:   Pointer to a device handle
10998285242Sachim*  \param   event:         event type
10999285242Sachim*
11000285242Sachim*  \return: none
11001285242Sachim*
11002285242Sachim*****************************************************************************/
11003285242SachimosGLOBAL void ossaSATAEvent(
11004285242Sachim                        agsaRoot_t              *agRoot,
11005285242Sachim                        agsaIORequest_t         *agIORequest,
11006285242Sachim                        agsaPortContext_t       *agPortContext,
11007285242Sachim                        agsaDevHandle_t         *agDevHandle,
11008285242Sachim                        bit32                   event,
11009285242Sachim                        bit32                   agIOInfoLen,
11010285242Sachim                        void                    *agParam
11011285242Sachim                           )
11012285242Sachim{
11013285242Sachim
11014285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
11015285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
11016285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
11017285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
11018285242Sachim  bit32                   interruptContext = osData->IntContext;
11019285242Sachim  tdsaDeviceData_t        *pDeviceData;
11020285242Sachim  satDeviceData_t         *pSatDevData;
11021285242Sachim  satInternalIo_t         *satIntIo = agNULL;
11022285242Sachim  bit32                   status;
11023285242Sachim  satIOContext_t          *satIOContext2;
11024285242Sachim  tdIORequestBody_t       *tdIORequestBody;
11025285242Sachim  tiDeviceHandle_t        *tiDeviceHandle;
11026285242Sachim  tiIORequest_t           tiIORequestTMP;
11027285242Sachim  agsaDifDetails_t        agDifDetails;
11028285242Sachim  bit8                    framePayload[256];
11029285242Sachim  bit16                   frameOffset = 0;
11030285242Sachim  bit16                   frameLen = 0;
11031285242Sachim
11032285242Sachim  /* new */
11033285242Sachim  tdsaDeviceData_t        *tdsaDeviceData = agNULL;
11034285242Sachim  satIOContext_t          *satIOContext;
11035285242Sachim  tdsaPortContext_t       *onePortContext;
11036285242Sachim
11037285242Sachim  if (event == OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE)
11038285242Sachim  {
11039285242Sachim
11040285242Sachim    /**************************************************************************
11041285242Sachim     *
11042285242Sachim     * !!!! See Section 13.5.2.4 of SATA 2.5 specs.                       !!!!
11043285242Sachim     * !!!! If the NCQ error ends up here, it means that the device sent  !!!!
11044285242Sachim     * !!!! Register Device To Host FIS (which does not have SActive      !!!!
11045285242Sachim     * !!!! register) instead of Set Device Bit FIS (which has SActive    !!!!
11046285242Sachim     * !!!! register). The routine osSatIOCompleted() deals with the case !!!!
11047285242Sachim     * !!!! where Set Device Bit FIS was sent by the device.              !!!!
11048285242Sachim     *
11049285242Sachim     * For NCQ we need to issue READ LOG EXT command with log page 10h
11050285242Sachim     * to get the error and to allow other I/Os to continue.
11051285242Sachim     *
11052285242Sachim     * Here is the basic flow or sequence of error recovery, this sequence is
11053285242Sachim     * similar to the one described in SATA 2.5:
11054285242Sachim     *
11055285242Sachim     * 1. Set SATA device flag to indicate error condition and returning busy
11056285242Sachim     *    for all new request.
11057285242Sachim     *
11058285242Sachim     * 2. Prepare READ LOG EXT page 10h command. Set flag to indicate that
11059285242Sachim     *    the failed I/O has NOT been returned to the OS Layer. Send command.
11060285242Sachim     *
11061285242Sachim     * 3. When the device receives READ LOG EXT page 10h request all other
11062285242Sachim     *    pending I/O are implicitly aborted. No completion (aborted) status
11063285242Sachim     *    will be sent to the host for these aborted commands.
11064285242Sachim     *
11065285242Sachim     * 4. SATL receives the completion for READ LOG EXT command in
11066285242Sachim     *    satReadLogExtCB(). Steps 5,6,7,8 below are the step 1,2,3,4 in
11067285242Sachim     *    satReadLogExtCB().
11068285242Sachim     *
11069285242Sachim     * 5. Check flag that indicates whether the failed I/O has been returned
11070285242Sachim     *    to the OS Layer. If not, search the I/O context in device data
11071285242Sachim     *    looking for a matched tag. Then return the completion of the failed
11072285242Sachim     *    NCQ command with the appopriate/trasnlated SCSI status.
11073285242Sachim     *
11074285242Sachim     * 6. Issue abort to LL layer to all other pending I/Os for the same SATA
11075285242Sachim     *    drive.
11076285242Sachim     *
11077285242Sachim     * 7. Free resource allocated for the internally generated READ LOG EXT.
11078285242Sachim     *
11079285242Sachim     * 8. At the completion of abort, in the context of ossaSATACompleted(),
11080285242Sachim     *    return the I/O with error status to the OS-App Specific layer.
11081285242Sachim     *    When all I/O aborts are completed, clear SATA device flag to
11082285242Sachim     *    indicate ready to process new request.
11083285242Sachim     *
11084285242Sachim     *************************************************************************/
11085285242Sachim
11086285242Sachim    pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
11087285242Sachim    pSatDevData = &pDeviceData->satDevData;
11088285242Sachim    tiDeviceHandle  = &((tdsaDeviceData_t *)(pSatDevData->satSaDeviceData))->tiDeviceHandle;
11089285242Sachim
11090285242Sachim    TI_DBG1(("ossaSATAEvent: did %d\n", pDeviceData->id));
11091285242Sachim
11092285242Sachim    if (pSatDevData->satDriveState == SAT_DEV_STATE_NORMAL)
11093285242Sachim    {
11094285242Sachim      TI_DBG1(("ossaSATAEvent: NCQ ERROR agDevHandle=%p.\n", agDevHandle ));
11095285242Sachim
11096285242Sachim      /* Set flag to indicate we are in recovery */
11097285242Sachim      pSatDevData->satDriveState = SAT_DEV_STATE_IN_RECOVERY;
11098285242Sachim
11099285242Sachim      /*
11100285242Sachim       * Allocate resource for READ LOG EXIT page 10h
11101285242Sachim       */
11102285242Sachim      satIntIo = satAllocIntIoResource( tiRoot,
11103285242Sachim                                        &(tiIORequestTMP), /* anything but NULL */
11104285242Sachim                                        pSatDevData,
11105285242Sachim                                        sizeof (satReadLogExtPage10h_t),
11106285242Sachim                                        satIntIo);
11107285242Sachim
11108285242Sachim      /*
11109285242Sachim       * If we cannot allocate resource to do the normal NCQ recovery, we
11110285242Sachim       * will do SATA device reset.
11111285242Sachim       */
11112285242Sachim      if (satIntIo == agNULL)
11113285242Sachim      {
11114285242Sachim        /* Abort I/O after completion of device reset */
11115285242Sachim        pSatDevData->satAbortAfterReset = agTRUE;
11116285242Sachim        TI_DBG1(("ossaSATAEvent: can't send RLE due to resource lack\n"));
11117285242Sachim
11118285242Sachim#ifdef NOT_YET
11119285242Sachim        /* needs to investigate this case */
11120285242Sachim        /* no report to OS layer */
11121285242Sachim        satSubTM(tiRoot,
11122285242Sachim                 tiDeviceHandle,
11123285242Sachim                 TD_INTERNAL_TM_RESET,
11124285242Sachim                 agNULL,
11125285242Sachim                 agNULL,
11126285242Sachim                 agNULL,
11127285242Sachim                 agFALSE);
11128285242Sachim#endif
11129285242Sachim
11130285242Sachim        return;
11131285242Sachim      }
11132285242Sachim
11133285242Sachim
11134285242Sachim      /*
11135285242Sachim       * Clear flag to indicate that the failed I/O has NOT been returned to the
11136285242Sachim       * OS-App specific Layer.
11137285242Sachim       */
11138285242Sachim      satIntIo->satIntFlag = 0;
11139285242Sachim
11140285242Sachim      /* compare to satPrepareNewIO() */
11141285242Sachim      /* Send READ LOG EXIT page 10h command */
11142285242Sachim
11143285242Sachim      /*
11144285242Sachim       * Need to initialize all the fields within satIOContext except
11145285242Sachim       * reqType and satCompleteCB which will be set depending on cmd.
11146285242Sachim       */
11147285242Sachim
11148285242Sachim      tdIORequestBody = (tdIORequestBody_t *)satIntIo->satIntRequestBody;
11149285242Sachim      satIOContext2 = &(tdIORequestBody->transport.SATA.satIOContext);
11150285242Sachim
11151285242Sachim      satIOContext2->pSatDevData   = pSatDevData;
11152285242Sachim      satIOContext2->pFis          = &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
11153285242Sachim      satIOContext2->pScsiCmnd     = &(satIntIo->satIntTiScsiXchg.scsiCmnd);
11154285242Sachim      satIOContext2->pSense        = &(tdIORequestBody->transport.SATA.sensePayload);
11155285242Sachim      satIOContext2->pTiSenseData  = &(tdIORequestBody->transport.SATA.tiSenseData);
11156285242Sachim      satIOContext2->pTiSenseData->senseData = satIOContext2->pSense;
11157285242Sachim
11158285242Sachim      satIOContext2->tiRequestBody = satIntIo->satIntRequestBody;
11159285242Sachim      satIOContext2->interruptContext = interruptContext;
11160285242Sachim      satIOContext2->satIntIoContext  = satIntIo;
11161285242Sachim
11162285242Sachim      satIOContext2->ptiDeviceHandle = tiDeviceHandle;
11163285242Sachim      satIOContext2->satOrgIOContext = agNULL;
11164285242Sachim      satIOContext2->tiScsiXchg = agNULL;
11165285242Sachim
11166285242Sachim      status = satSendReadLogExt( tiRoot,
11167285242Sachim                                  &satIntIo->satIntTiIORequest,
11168285242Sachim                                  tiDeviceHandle,
11169285242Sachim                                  &satIntIo->satIntTiScsiXchg,
11170285242Sachim                                  satIOContext2);
11171285242Sachim
11172285242Sachim      if (status !=tiSuccess)
11173285242Sachim      {
11174285242Sachim        TI_DBG1(("ossaSATAEvent: can't send RLE due to LL api failure\n"));
11175285242Sachim        satFreeIntIoResource( tiRoot,
11176285242Sachim                              pSatDevData,
11177285242Sachim                              satIntIo);
11178285242Sachim        /* Abort I/O after completion of device reset */
11179285242Sachim        pSatDevData->satAbortAfterReset = agTRUE;
11180285242Sachim#ifdef NOT_YET
11181285242Sachim        /* needs to investigate this case */
11182285242Sachim        /* no report to OS layer */
11183285242Sachim        satSubTM(tiRoot,
11184285242Sachim                 tiDeviceHandle,
11185285242Sachim                 TD_INTERNAL_TM_RESET,
11186285242Sachim                 agNULL,
11187285242Sachim                 agNULL,
11188285242Sachim                 agNULL,
11189285242Sachim                 agFALSE);
11190285242Sachim#endif
11191285242Sachim
11192285242Sachim        return;
11193285242Sachim      }
11194285242Sachim    }
11195285242Sachim    else
11196285242Sachim    {
11197285242Sachim      TI_DBG1(("ossaSATAEvent: NCQ ERROR but recovery in progress\n"));
11198285242Sachim    }
11199285242Sachim
11200285242Sachim  }
11201285242Sachim  else if (event == OSSA_IO_XFER_CMD_FRAME_ISSUED)
11202285242Sachim  {
11203285242Sachim    TI_DBG1(("ossaSATAEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED\n"));
11204285242Sachim  }
11205285242Sachim  else if (event == OSSA_IO_XFER_PIO_SETUP_ERROR)
11206285242Sachim  {
11207285242Sachim    TI_DBG1(("ossaSATAEvent: OSSA_IO_XFER_PIO_SETUP_ERROR\n"));
11208285242Sachim
11209285242Sachim  }
11210285242Sachim  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED)
11211285242Sachim  {
11212285242Sachim    TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED\n"));
11213285242Sachim  }
11214285242Sachim  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO)
11215285242Sachim  {
11216285242Sachim    TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO\n"));
11217285242Sachim  }
11218285242Sachim  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST)
11219285242Sachim  {
11220285242Sachim    TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST\n"));
11221285242Sachim  }
11222285242Sachim  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE)
11223285242Sachim  {
11224285242Sachim    TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE\n"));
11225285242Sachim  }
11226285242Sachim  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED)
11227285242Sachim  {
11228285242Sachim    TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED\n"));
11229285242Sachim  }
11230285242Sachim  else if (event == OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH)
11231285242Sachim  {
11232285242Sachim    TI_DBG1(("ossaSATAEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH\n"));
11233285242Sachim  }
11234285242Sachim  else if (event == OSSA_IO_XFR_ERROR_DIF_MISMATCH || event == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH  ||
11235285242Sachim           event == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH || event == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH)
11236285242Sachim  {
11237285242Sachim    TI_DBG1(("ossaSSPEvent: DIF related, event 0x%x\n", event));
11238285242Sachim    /* process DIF detail information */
11239285242Sachim    TI_DBG2(("ossaSSPEvent: agIOInfoLen %d\n", agIOInfoLen));
11240285242Sachim    if (agParam == agNULL)
11241285242Sachim    {
11242285242Sachim      TI_DBG2(("ossaSSPEvent: agParam is NULL!!!\n"));
11243285242Sachim      return;
11244285242Sachim    }
11245285242Sachim    if (agIOInfoLen < sizeof(agsaDifDetails_t))
11246285242Sachim    {
11247285242Sachim      TI_DBG2(("ossaSSPEvent: wrong agIOInfoLen!!! agIOInfoLen %d sizeof(agsaDifDetails_t) %d\n", agIOInfoLen, sizeof(agsaDifDetails_t)));
11248285242Sachim      return;
11249285242Sachim    }
11250285242Sachim    /* reads agsaDifDetails_t */
11251285242Sachim    saFrameReadBlock(agRoot, agParam, 0, &agDifDetails, sizeof(agsaDifDetails_t));
11252285242Sachim    frameOffset = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF);
11253285242Sachim    frameLen = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF0000) >> 16;
11254285242Sachim
11255285242Sachim    TI_DBG2(("ossaSSPEvent: UpperLBA 0x%08x LowerLBA 0x%08x\n", agDifDetails.UpperLBA, agDifDetails.LowerLBA));
11256285242Sachim    TI_DBG2(("ossaSSPEvent: SASAddrHI 0x%08x SASAddrLO 0x%08x\n",
11257285242Sachim             TD_GET_SAS_ADDRESSHI(agDifDetails.sasAddressHi), TD_GET_SAS_ADDRESSLO(agDifDetails.sasAddressLo)));
11258285242Sachim    TI_DBG2(("ossaSSPEvent: DIF error mask 0x%x Device ID 0x%x\n",
11259285242Sachim             (agDifDetails.DIFErrDevID) & 0xFF, (agDifDetails.DIFErrDevID & 0xFFFF0000) >> 16));
11260285242Sachim    if (frameLen != 0 && frameLen <= 256)
11261285242Sachim    {
11262285242Sachim      saFrameReadBlock(agRoot, agParam, sizeof(agsaDifDetails_t), framePayload, frameLen);
11263285242Sachim      tdhexdump("ossaSSPEvent frame", framePayload, frameLen);
11264285242Sachim    }
11265285242Sachim  }
11266285242Sachim  else
11267285242Sachim  {
11268285242Sachim    TI_DBG1(("ossaSATAEvent: ERROR event %d agDevHandle=%p.\n", event, agDevHandle ));
11269285242Sachim
11270285242Sachim    tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
11271285242Sachim    satIOContext    = &(tdIORequestBody->transport.SATA.satIOContext);
11272285242Sachim    pSatDevData     = satIOContext->pSatDevData;
11273285242Sachim    tdsaDeviceData  = (tdsaDeviceData_t *)pSatDevData->satSaDeviceData;
11274285242Sachim    onePortContext   = tdsaDeviceData->tdPortContext;
11275285242Sachim    TI_DBG1(("ossaSATAEvent: did %d\n", tdsaDeviceData->id));
11276285242Sachim
11277285242Sachim    /* send SMP_PHY_CONTROL_HARD_RESET */
11278285242Sachim    if (event == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY && tdsaAllShared->FCA)
11279285242Sachim    {
11280285242Sachim      if (pSatDevData->NumOfFCA <= 0) /* does SMP HARD RESET only upto one time */
11281285242Sachim      {
11282285242Sachim        TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n"));
11283285242Sachim        pSatDevData->NumOfFCA++;
11284285242Sachim        tdsaPhyControlSend(tiRoot,
11285285242Sachim                           tdsaDeviceData,
11286285242Sachim                           SMP_PHY_CONTROL_HARD_RESET,
11287285242Sachim                           agNULL);
11288285242Sachim      }
11289285242Sachim      else
11290285242Sachim      {
11291285242Sachim        /* given up after one time of SMP HARD RESET; */
11292285242Sachim        TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; NO!!! sending HARD_RESET\n"));
11293285242Sachim        if (tdsaDeviceData->registered == agTRUE && tdsaAllShared->ResetInDiscovery == 0)
11294285242Sachim        {
11295285242Sachim          /*
11296285242Sachim            1. remove this device
11297285242Sachim            2. device removal event
11298285242Sachim          */
11299285242Sachim          tdsaAbortAll(tiRoot, agRoot, tdsaDeviceData);
11300285242Sachim          tdsaDeviceData->valid = agFALSE;
11301285242Sachim          tdsaDeviceData->valid2 = agFALSE;
11302285242Sachim          tdsaDeviceData->registered = agFALSE;
11303285242Sachim          ostiInitiatorEvent(
11304285242Sachim                             tiRoot,
11305285242Sachim                             onePortContext->tiPortalContext,
11306285242Sachim                             agNULL,
11307285242Sachim                             tiIntrEventTypeDeviceChange,
11308285242Sachim                             tiDeviceRemoval,
11309285242Sachim                             agNULL
11310285242Sachim                             );
11311285242Sachim        }
11312285242Sachim      }
11313285242Sachim    }
11314285242Sachim
11315285242Sachim  }
11316285242Sachim}
11317285242Sachim#endif /* FDS_SM */
11318285242Sachim
11319285242Sachim/*****************************************************************************
11320285242Sachim*! \brief  itdsatErrorSATAEventHandle
11321285242Sachim*
11322285242Sachim*   This routine is called to handle SATA error event
11323285242Sachim*
11324285242Sachim*  \param   agRoot:        Handles for this instance of SAS/SATA hardware
11325285242Sachim*  \param   agIORequest:   Pointer to the LL I/O request context for this I/O.
11326285242Sachim*  \param   agPortContext  Pointer to the port context of TD and Lower layer
11327285242Sachim*  \param   agDevHandle:   Pointer to a device handle
11328285242Sachim*  \param   event:         event type
11329285242Sachim*  \param   ioContext:     Pointer to satIOContext_t
11330285242Sachim*
11331285242Sachim*  \return: none
11332285242Sachim*
11333285242Sachim*****************************************************************************/
11334285242SachimosGLOBAL void  itdsatErrorSATAEventHandle(
11335285242Sachim                                          agsaRoot_t        *agRoot,
11336285242Sachim                                          agsaIORequest_t   *agIORequest,
11337285242Sachim                                          agsaPortContext_t *agPortContext,
11338285242Sachim                                          agsaDevHandle_t   *agDevHandle,
11339285242Sachim                                          bit32             event,
11340285242Sachim                                          satIOContext_t    *ioContext
11341285242Sachim                                          )
11342285242Sachim{
11343285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
11344285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
11345285242Sachim  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
11346285242Sachim  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
11347285242Sachim  tdIORequestBody_t       *tdOrgIORequestBody;
11348285242Sachim  satIOContext_t          *satIOContext;
11349285242Sachim  satIOContext_t          *satOrgIOContext;
11350285242Sachim  satInternalIo_t         *satIntIo;
11351285242Sachim  satDeviceData_t         *satDevData;
11352285242Sachim  bit32                   interruptContext = osData->IntContext;
11353285242Sachim
11354285242Sachim  TI_DBG1(("itdsatErrorSATAEventHandle: start\n"));
11355285242Sachim  satIOContext           = (satIOContext_t *) ioContext;
11356285242Sachim  satIntIo               = satIOContext->satIntIoContext;
11357285242Sachim  satDevData             = satIOContext->pSatDevData;
11358285242Sachim
11359285242Sachim
11360285242Sachim  TI_DBG1(("itdsatErrorSATAEventHandle: event 0x%x\n", event));
11361285242Sachim
11362285242Sachim  if (satIntIo == agNULL)
11363285242Sachim  {
11364285242Sachim    TI_DBG1(("itdsatErrorSATAEventHandle: External, OS generated\n"));
11365285242Sachim    satOrgIOContext      = satIOContext;
11366285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
11367285242Sachim
11368285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
11369285242Sachim
11370285242Sachim    satFreeIntIoResource( tiRoot,
11371285242Sachim                          satDevData,
11372285242Sachim                          satIntIo);
11373285242Sachim
11374285242Sachim    if (event == OSSA_IO_OVERFLOW)
11375285242Sachim    {
11376285242Sachim      TI_DBG1(("itdsatErrorSATAEventHandle: tiIOOverRun\n"));
11377285242Sachim      ostiInitiatorIOCompleted( tiRoot,
11378285242Sachim                                tdOrgIORequestBody->tiIORequest,
11379285242Sachim                                tiIOOverRun,
11380285242Sachim                                0,
11381285242Sachim                                agNULL,
11382285242Sachim                                interruptContext);
11383285242Sachim    }
11384285242Sachim    else
11385285242Sachim    {
11386285242Sachim      TI_DBG1(("itdsatErrorSATAEventHandle: else\n"));
11387285242Sachim      ostiInitiatorIOCompleted( tiRoot,
11388285242Sachim                                tdOrgIORequestBody->tiIORequest,
11389285242Sachim                                tiIOFailed,
11390285242Sachim                                tiDetailOtherError,
11391285242Sachim                                agNULL,
11392285242Sachim                                interruptContext);
11393285242Sachim    }
11394285242Sachim  }
11395285242Sachim  else
11396285242Sachim  {
11397285242Sachim    TI_DBG1(("itdsatErrorSATAEventHandle: Internal, TD generated\n"));
11398285242Sachim    satOrgIOContext        = satIOContext->satOrgIOContext;
11399285242Sachim    if (satOrgIOContext == agNULL)
11400285242Sachim    {
11401285242Sachim      TI_DBG1(("itdsatErrorSATAEventHandle: satOrgIOContext is NULL, wrong\n"));
11402285242Sachim      return;
11403285242Sachim    }
11404285242Sachim    else
11405285242Sachim    {
11406285242Sachim      TI_DBG6(("itdsatErrorSATAEventHandle: satOrgIOContext is NOT NULL\n"));
11407285242Sachim    }
11408285242Sachim    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
11409285242Sachim    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
11410285242Sachim
11411285242Sachim    satFreeIntIoResource( tiRoot,
11412285242Sachim                          satDevData,
11413285242Sachim                          satIntIo);
11414285242Sachim
11415285242Sachim    /* clean up TD layer's IORequestBody */
11416285242Sachim    ostiFreeMemory(
11417285242Sachim                   tiRoot,
11418285242Sachim                   tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11419285242Sachim                   sizeof(tdIORequestBody_t)
11420285242Sachim           );
11421285242Sachim
11422285242Sachim  }
11423285242Sachim  return;
11424285242Sachim}
11425285242Sachim
11426285242SachimosGLOBAL void ossaSATAAbortCB(
11427285242Sachim                              agsaRoot_t        *agRoot,
11428285242Sachim                              agsaIORequest_t   *agIORequest,
11429285242Sachim                              bit32             flag,
11430285242Sachim                              bit32             status)
11431285242Sachim{
11432285242Sachim  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
11433285242Sachim  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
11434285242Sachim  tdIORequestBody_t       *tdAbortIORequestBody = agNULL;
11435285242Sachim  tdsaDeviceData_t        *oneDeviceData        = agNULL;
11436285242Sachim  tiDeviceHandle_t        *tiDeviceHandle       = agNULL;
11437285242Sachim  tiIORequest_t           *taskTag              = agNULL;
11438285242Sachim
11439285242Sachim  TI_DBG1(("ossaSATAAbortCB: start\n"));
11440285242Sachim
11441285242Sachim  tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
11442285242Sachim  if (tdAbortIORequestBody == agNULL)
11443285242Sachim  {
11444285242Sachim    TI_DBG1(("ossaSATAAbortCB: tdAbortIORequestBody is NULL warning!!!!\n"));
11445285242Sachim    return;
11446285242Sachim  }
11447285242Sachim
11448285242Sachim  if (flag == 2)
11449285242Sachim  {
11450285242Sachim    /* abort per port */
11451285242Sachim    TI_DBG1(("ossaSATAAbortCB: abort per port\n"));
11452285242Sachim  }
11453285242Sachim  else if (flag == 1)
11454285242Sachim  {
11455285242Sachim    TI_DBG1(("ossaSATAAbortCB: abort all\n"));
11456285242Sachim    tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
11457285242Sachim    if (tiDeviceHandle == agNULL)
11458285242Sachim    {
11459285242Sachim      TI_DBG1(("ossaSATAAbortCB: tiDeviceHandle is NULL warning!!!!\n"));
11460285242Sachim      ostiFreeMemory(
11461285242Sachim               tiRoot,
11462285242Sachim               tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11463285242Sachim               sizeof(tdIORequestBody_t)
11464285242Sachim               );
11465285242Sachim      return;
11466285242Sachim    }
11467285242Sachim
11468285242Sachim    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
11469285242Sachim    if (oneDeviceData == agNULL)
11470285242Sachim    {
11471285242Sachim      TI_DBG1(("ossaSATAAbortCB: oneDeviceData is NULL warning!!!!\n"));
11472285242Sachim      ostiFreeMemory(
11473285242Sachim               tiRoot,
11474285242Sachim               tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11475285242Sachim               sizeof(tdIORequestBody_t)
11476285242Sachim               );
11477285242Sachim      return;
11478285242Sachim    }
11479285242Sachim
11480285242Sachim    if (status == OSSA_IO_SUCCESS)
11481285242Sachim    {
11482285242Sachim      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_SUCCESS\n"));
11483285242Sachim      /* clean up TD layer's IORequestBody */
11484285242Sachim      if (oneDeviceData->OSAbortAll == agTRUE)
11485285242Sachim      {
11486285242Sachim        oneDeviceData->OSAbortAll = agFALSE;
11487285242Sachim        ostiInitiatorEvent( tiRoot,
11488285242Sachim                            agNULL,
11489285242Sachim                            tiDeviceHandle,
11490285242Sachim                            tiIntrEventTypeLocalAbort,
11491285242Sachim                            tiAbortOK,
11492285242Sachim                            agNULL);
11493285242Sachim      }
11494285242Sachim      else
11495285242Sachim      {
11496285242Sachim        TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11497285242Sachim        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11498285242Sachim      }
11499285242Sachim      /* callback to OS layer here ??? */
11500285242Sachim      TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11501285242Sachim      ostiFreeMemory(
11502285242Sachim                   tiRoot,
11503285242Sachim                   tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11504285242Sachim                   sizeof(tdIORequestBody_t)
11505285242Sachim                   );
11506285242Sachim
11507285242Sachim    }
11508285242Sachim    else if (status == OSSA_IO_NOT_VALID)
11509285242Sachim    {
11510285242Sachim      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NOT_VALID\n"));
11511285242Sachim      /*
11512285242Sachim        Nothing is reproted to OS layer
11513285242Sachim      */
11514285242Sachim      if (oneDeviceData->OSAbortAll == agTRUE)
11515285242Sachim      {
11516285242Sachim        oneDeviceData->OSAbortAll = agFALSE;
11517285242Sachim        ostiInitiatorEvent( tiRoot,
11518285242Sachim                            agNULL,
11519285242Sachim                            tiDeviceHandle,
11520285242Sachim                            tiIntrEventTypeLocalAbort,
11521285242Sachim                            tiAbortFailed,
11522285242Sachim                            agNULL );
11523285242Sachim      }
11524285242Sachim      else
11525285242Sachim      {
11526285242Sachim        TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11527285242Sachim        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11528285242Sachim      }
11529285242Sachim      TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11530285242Sachim      ostiFreeMemory(
11531285242Sachim                     tiRoot,
11532285242Sachim                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11533285242Sachim                     sizeof(tdIORequestBody_t)
11534285242Sachim                     );
11535285242Sachim    }
11536285242Sachim    else if (status == OSSA_IO_NO_DEVICE)
11537285242Sachim    {
11538285242Sachim      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NO_DEVICE\n"));
11539285242Sachim      /*
11540285242Sachim        Nothing is reproted to OS layer
11541285242Sachim      */
11542285242Sachim      if (oneDeviceData->OSAbortAll == agTRUE)
11543285242Sachim      {
11544285242Sachim        oneDeviceData->OSAbortAll = agFALSE;
11545285242Sachim        ostiInitiatorEvent( tiRoot,
11546285242Sachim                            agNULL,
11547285242Sachim                            tiDeviceHandle,
11548285242Sachim                            tiIntrEventTypeLocalAbort,
11549285242Sachim                            tiAbortInProgress,
11550285242Sachim                            agNULL );
11551285242Sachim      }
11552285242Sachim      else
11553285242Sachim      {
11554285242Sachim        TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11555285242Sachim        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11556285242Sachim      }
11557285242Sachim      TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11558285242Sachim      ostiFreeMemory(
11559285242Sachim                     tiRoot,
11560285242Sachim                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11561285242Sachim                     sizeof(tdIORequestBody_t)
11562285242Sachim                     );
11563285242Sachim    }
11564285242Sachim    else if (status == OSSA_IO_ABORT_IN_PROGRESS)
11565285242Sachim    {
11566285242Sachim      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
11567285242Sachim      /*
11568285242Sachim        Nothing is reproted to OS layer
11569285242Sachim      */
11570285242Sachim      if (oneDeviceData->OSAbortAll == agTRUE)
11571285242Sachim      {
11572285242Sachim        oneDeviceData->OSAbortAll = agFALSE;
11573285242Sachim        ostiInitiatorEvent( tiRoot,
11574285242Sachim                            agNULL,
11575285242Sachim                            tiDeviceHandle,
11576285242Sachim                            tiIntrEventTypeLocalAbort,
11577285242Sachim                            tiAbortInProgress,
11578285242Sachim                            agNULL );
11579285242Sachim      }
11580285242Sachim      else
11581285242Sachim      {
11582285242Sachim        TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11583285242Sachim        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11584285242Sachim      }
11585285242Sachim      TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11586285242Sachim      ostiFreeMemory(
11587285242Sachim                     tiRoot,
11588285242Sachim                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11589285242Sachim                     sizeof(tdIORequestBody_t)
11590285242Sachim                     );
11591285242Sachim    }
11592285242Sachim    else
11593285242Sachim    {
11594285242Sachim      TI_DBG1(("ossaSATAAbortCB: unspecified status 0x%x\n", status ));
11595285242Sachim      /*
11596285242Sachim        Nothing is reproted to OS layer
11597285242Sachim      */
11598285242Sachim      if (oneDeviceData->OSAbortAll == agTRUE)
11599285242Sachim      {
11600285242Sachim        oneDeviceData->OSAbortAll = agFALSE;
11601285242Sachim        ostiInitiatorEvent( tiRoot,
11602285242Sachim                            agNULL,
11603285242Sachim                            tiDeviceHandle,
11604285242Sachim                            tiIntrEventTypeLocalAbort,
11605285242Sachim                            tiAbortInProgress,
11606285242Sachim                            agNULL );
11607285242Sachim      }
11608285242Sachim      else
11609285242Sachim      {
11610285242Sachim        TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11611285242Sachim        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11612285242Sachim      }
11613285242Sachim      TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11614285242Sachim      ostiFreeMemory(
11615285242Sachim                     tiRoot,
11616285242Sachim                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11617285242Sachim                     sizeof(tdIORequestBody_t)
11618285242Sachim                     );
11619285242Sachim    }
11620285242Sachim  }
11621285242Sachim  else if (flag == 0)
11622285242Sachim  {
11623285242Sachim    TI_DBG1(("ossaSATAAbortCB: abort one\n"));
11624285242Sachim    taskTag = tdAbortIORequestBody->tiIOToBeAbortedRequest;
11625285242Sachim
11626285242Sachim    if (status == OSSA_IO_SUCCESS)
11627285242Sachim    {
11628285242Sachim      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_SUCCESS\n"));
11629285242Sachim
11630285242Sachim      ostiInitiatorEvent( tiRoot,
11631285242Sachim                          agNULL,
11632285242Sachim                          agNULL,
11633285242Sachim                          tiIntrEventTypeLocalAbort,
11634285242Sachim                          tiAbortOK,
11635285242Sachim                          taskTag );
11636285242Sachim      ostiFreeMemory(
11637285242Sachim                     tiRoot,
11638285242Sachim                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11639285242Sachim                     sizeof(tdIORequestBody_t)
11640285242Sachim                     );
11641285242Sachim
11642285242Sachim    }
11643285242Sachim    else if (status == OSSA_IO_NOT_VALID)
11644285242Sachim    {
11645285242Sachim      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NOT_VALID\n"));
11646285242Sachim
11647285242Sachim      ostiInitiatorEvent( tiRoot,
11648285242Sachim                          agNULL,
11649285242Sachim                          agNULL,
11650285242Sachim                          tiIntrEventTypeLocalAbort,
11651285242Sachim                          tiAbortFailed,
11652285242Sachim                          taskTag );
11653285242Sachim
11654285242Sachim      ostiFreeMemory(
11655285242Sachim                     tiRoot,
11656285242Sachim                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11657285242Sachim                     sizeof(tdIORequestBody_t)
11658285242Sachim                     );
11659285242Sachim    }
11660285242Sachim    else if (status == OSSA_IO_NO_DEVICE)
11661285242Sachim    {
11662285242Sachim      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NO_DEVICE\n"));
11663285242Sachim
11664285242Sachim      ostiInitiatorEvent( tiRoot,
11665285242Sachim                          agNULL,
11666285242Sachim                          agNULL,
11667285242Sachim                          tiIntrEventTypeLocalAbort,
11668285242Sachim                          tiAbortInProgress,
11669285242Sachim                          taskTag );
11670285242Sachim
11671285242Sachim      ostiFreeMemory(
11672285242Sachim                     tiRoot,
11673285242Sachim                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11674285242Sachim                     sizeof(tdIORequestBody_t)
11675285242Sachim                     );
11676285242Sachim    }
11677285242Sachim    else if (status == OSSA_IO_ABORT_IN_PROGRESS)
11678285242Sachim    {
11679285242Sachim      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
11680285242Sachim
11681285242Sachim      ostiInitiatorEvent( tiRoot,
11682285242Sachim                          agNULL,
11683285242Sachim                          agNULL,
11684285242Sachim                          tiIntrEventTypeLocalAbort,
11685285242Sachim                          tiAbortInProgress,
11686285242Sachim                          taskTag );
11687285242Sachim
11688285242Sachim      ostiFreeMemory(
11689285242Sachim                     tiRoot,
11690285242Sachim                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11691285242Sachim                     sizeof(tdIORequestBody_t)
11692285242Sachim                     );
11693285242Sachim    }
11694285242Sachim    else
11695285242Sachim    {
11696285242Sachim      TI_DBG1(("ossaSATAAbortCB: unspecified status 0x%x\n", status ));
11697285242Sachim
11698285242Sachim      ostiInitiatorEvent( tiRoot,
11699285242Sachim                          agNULL,
11700285242Sachim                          agNULL,
11701285242Sachim                          tiIntrEventTypeLocalAbort,
11702285242Sachim                          tiAbortFailed,
11703285242Sachim                          taskTag );
11704285242Sachim
11705285242Sachim      ostiFreeMemory(
11706285242Sachim                     tiRoot,
11707285242Sachim                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11708285242Sachim                     sizeof(tdIORequestBody_t)
11709285242Sachim                     );
11710285242Sachim    }
11711285242Sachim  }
11712285242Sachim  else
11713285242Sachim  {
11714285242Sachim    TI_DBG1(("ossaSATAAbortCB: wrong flag %d\n", flag));
11715285242Sachim  }
11716285242Sachim  return;
11717285242Sachim}
11718285242Sachim
11719285242Sachim/*****************************************************************************
11720285242Sachim*! \brief  ossaSATADeviceResetCB
11721285242Sachim*
11722285242Sachim*   This routine is called to complete a SATA device reset request previously
11723285242Sachim*   issued to the LL Layer in saSATADeviceReset().
11724285242Sachim*
11725285242Sachim*  \param agRoot:      Handles for this instance of SAS/SATA hardware
11726285242Sachim*  \param agDevHandle: Pointer to a device handle
11727285242Sachim*  \param resetStatus: Reset status:
11728285242Sachim*                      OSSA_SUCCESS: The reset operation completed successfully.
11729285242Sachim*                      OSSA_FAILURE: The reset operation failed.
11730285242Sachim*  \param resetparm:  Pointer to the Device-To-Host FIS received from the device.
11731285242Sachim*
11732285242Sachim*  \return: none
11733285242Sachim*
11734285242Sachim*****************************************************************************/
11735285242SachimosGLOBAL void
11736285242SachimossaSATADeviceResetCB(
11737285242Sachim                      agsaRoot_t        *agRoot,
11738285242Sachim                      agsaDevHandle_t   *agDevHandle,
11739285242Sachim                      bit32             resetStatus,
11740285242Sachim                      void              *resetparm)
11741285242Sachim{
11742285242Sachim  bit32               tiResetStatus;
11743285242Sachim  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
11744285242Sachim  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
11745285242Sachim  tdsaDeviceData_t    *pDeviceData;
11746285242Sachim  tiDeviceHandle_t    *tiDeviceHandle;
11747285242Sachim
11748285242Sachim  TI_DBG1(("ossaSATADeviceResetCB: agDevHandle=%p resetStatus=0x%x\n",
11749285242Sachim      agDevHandle, resetStatus ));
11750285242Sachim
11751285242Sachim  pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
11752285242Sachim  tiDeviceHandle = &(pDeviceData->tiDeviceHandle);
11753285242Sachim
11754285242Sachim  if (resetStatus == OSSA_SUCCESS )
11755285242Sachim    tiResetStatus = tiSuccess;
11756285242Sachim  else
11757285242Sachim    tiResetStatus = tiError;
11758285242Sachim
11759285242Sachim  osSatResetCB( tiRoot,
11760285242Sachim                tiDeviceHandle,
11761285242Sachim                tiResetStatus,
11762285242Sachim                resetparm);
11763285242Sachim
11764285242Sachim}
11765285242Sachim
11766285242Sachim
11767285242Sachim/*****************************************************************************/
11768285242Sachim/*! \brief satDecrementPendingIO
11769285242Sachim *
11770285242Sachim *  This function decrements the number of pending IO's
11771285242Sachim *
11772285242Sachim *  \param   tiRoot:           Pointer to TISA initiator driver/port instance.
11773285242Sachim *  \param   tdsaAllShared:    Pointer to TD context.
11774285242Sachim *  \param   satIOContext_t:   Pointer to the SAT IO Context
11775285242Sachim *
11776285242Sachim *  \return
11777285242Sachim *          None
11778285242Sachim */
11779285242Sachim/*****************************************************************************/
11780285242SachimGLOBAL void
11781285242SachimsatDecrementPendingIO(
11782285242Sachim                      tiRoot_t                *tiRoot,
11783285242Sachim                      tdsaContext_t           *tdsaAllShared,
11784285242Sachim                      satIOContext_t          *satIOContext
11785285242Sachim                      )
11786285242Sachim{
11787285242Sachim  satDeviceData_t         *satDevData;
11788285242Sachim
11789285242Sachim  TI_DBG4(("satDecrementPendingIO: start\n"));
11790285242Sachim
11791285242Sachim  satDevData             = satIOContext->pSatDevData;
11792285242Sachim
11793285242Sachim  if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
11794285242Sachim       (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
11795285242Sachim  {
11796285242Sachim    tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
11797285242Sachim    satDevData->satPendingNCQIO--;
11798285242Sachim    satIOContext->pSatDevData->satPendingIO--;
11799285242Sachim    TDLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink);
11800285242Sachim    tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
11801285242Sachim  }
11802285242Sachim  else
11803285242Sachim  {
11804285242Sachim    tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
11805285242Sachim    satDevData->satPendingNONNCQIO--;
11806285242Sachim    satIOContext->pSatDevData->satPendingIO--;
11807285242Sachim    TDLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink);
11808285242Sachim    tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
11809285242Sachim  }
11810285242Sachim
11811285242Sachim  return;
11812285242Sachim}
11813285242Sachim
11814285242SachimGLOBAL void
11815285242SachimsatTranslateATAPIErrorsToSCSIErrors(
11816285242Sachim    bit8   bCommand,
11817285242Sachim    bit8   bATAStatus,
11818285242Sachim    bit8   bATAError,
11819285242Sachim    bit8   *pSenseKey,
11820285242Sachim    bit16  *pSenseCodeInfo
11821285242Sachim    )
11822285242Sachim{
11823285242Sachim    if (pSenseKey == agNULL || pSenseCodeInfo == agNULL)
11824285242Sachim    {
11825285242Sachim        TI_DBG0(("TranslateATAErrorsToSCSIErros: pSenseKey == agNULL || pSenseCodeInfo == agNULL\n"));
11826285242Sachim        return;
11827285242Sachim    }
11828285242Sachim
11829285242Sachim    if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & NM_ATA_ERROR_MASK))
11830285242Sachim    {
11831285242Sachim      *pSenseKey = SCSI_SNSKEY_NOT_READY;
11832285242Sachim      *pSenseCodeInfo = 0x3a00;
11833285242Sachim    }
11834285242Sachim    else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & ABRT_ATA_ERROR_MASK))
11835285242Sachim    {
11836285242Sachim      *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND;
11837285242Sachim      *pSenseCodeInfo = 0;
11838285242Sachim    }
11839285242Sachim    else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & MCR_ATA_ERROR_MASK))
11840285242Sachim    {
11841285242Sachim      *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION;
11842285242Sachim      *pSenseCodeInfo = 0x5a01;
11843285242Sachim    }
11844285242Sachim    else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & IDNF_ATA_ERROR_MASK))
11845285242Sachim    {
11846285242Sachim      *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR;
11847285242Sachim      *pSenseCodeInfo = 0x1401;
11848285242Sachim    }
11849285242Sachim    else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & MC_ATA_ERROR_MASK))
11850285242Sachim    {
11851285242Sachim      *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION;
11852285242Sachim      *pSenseCodeInfo = 0x2800;
11853285242Sachim    }
11854285242Sachim    else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & UNC_ATA_ERROR_MASK))
11855285242Sachim    {
11856285242Sachim      /*READ*/
11857285242Sachim      *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR;
11858285242Sachim      *pSenseCodeInfo = 0x1100;
11859285242Sachim
11860285242Sachim      /*add WRITE here */
11861285242Sachim    }
11862285242Sachim    else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & ICRC_ATA_ERROR_MASK))
11863285242Sachim    {
11864285242Sachim      *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND;
11865285242Sachim      *pSenseCodeInfo = 0x4703;
11866285242Sachim    }
11867285242Sachim    else if((bATAStatus & DF_ATA_STATUS_MASK))
11868285242Sachim    {
11869285242Sachim      *pSenseKey = SCSI_SNSKEY_HARDWARE_ERROR;
11870285242Sachim      *pSenseCodeInfo = 0x4400;
11871285242Sachim    }
11872285242Sachim    else
11873285242Sachim    {
11874285242Sachim      TI_DBG0(("unhandled ata error: bATAStatus = 0x%x, bATAError = 0x%x\n",
11875285242Sachim                 bATAStatus, bATAError));
11876285242Sachim    }
11877285242Sachim
11878285242Sachim}
11879285242Sachim
11880285242Sachim#endif /* #ifdef SATA_ENABLE */
11881285242Sachim
11882