1/*******************************************************************************
2*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3*
4*Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*that the following conditions are met:
6*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*following disclaimer.
8*2. Redistributions in binary form must reproduce the above copyright notice,
9*this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*with the distribution.
11*
12*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20
21********************************************************************************/
22/*****************************************************************************/
23/** \file
24 *
25 * The file implementing SCSI/ATA Translation (SAT) for LL Layer callback
26 *
27 */
28/*****************************************************************************/
29#include <sys/cdefs.h>
30__FBSDID("$FreeBSD$");
31#include <dev/pms/config.h>
32
33#include <dev/pms/freebsd/driver/common/osenv.h>
34#include <dev/pms/freebsd/driver/common/ostypes.h>
35#include <dev/pms/freebsd/driver/common/osdebug.h>
36
37#ifdef SATA_ENABLE
38
39#include <dev/pms/RefTisa/sallsdk/api/sa.h>
40#include <dev/pms/RefTisa/sallsdk/api/saapi.h>
41#include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
42
43#include <dev/pms/RefTisa/tisa/api/titypes.h>
44#include <dev/pms/RefTisa/tisa/api/ostiapi.h>
45#include <dev/pms/RefTisa/tisa/api/tiapi.h>
46#include <dev/pms/RefTisa/tisa/api/tiglobal.h>
47
48#ifdef FDS_SM
49#include <dev/pms/RefTisa/sat/api/sm.h>
50#include <dev/pms/RefTisa/sat/api/smapi.h>
51#include <dev/pms/RefTisa/sat/api/tdsmapi.h>
52#endif
53
54#ifdef FDS_DM
55#include <dev/pms/RefTisa/discovery/api/dm.h>
56#include <dev/pms/RefTisa/discovery/api/dmapi.h>
57#include <dev/pms/RefTisa/discovery/api/tddmapi.h>
58#endif
59
60#include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
61#include <dev/pms/freebsd/driver/common/osstring.h>
62#include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
63
64#ifdef INITIATOR_DRIVER
65#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
66#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
67#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
68#endif
69
70#ifdef TARGET_DRIVER
71#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
72#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
73#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
74#endif
75
76#include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
77#include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
78
79#include <dev/pms/RefTisa/tisa/sassata/sata/host/sat.h>
80#include <dev/pms/RefTisa/tisa/sassata/sata/host/satproto.h>
81
82/*****************************************************************************
83*! \brief  ossaSATACompleted
84*
85*   This routine is called to complete a SATA request previously issued to the
86*    LL Layer in saSATAStart()
87*
88*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
89*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
90*  \param   agIOStatus:  Status of completed I/O.
91*  \param   agFirstDword:Pointer to the four bytes of FIS.
92*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
93*                        length.
94*  \param   agParam:     Additional info based on status.
95*
96*  \return: none
97*
98*****************************************************************************/
99GLOBAL void
100ossaSATACompleted(
101                  agsaRoot_t        *agRoot,
102                  agsaIORequest_t   *agIORequest,
103                  bit32             agIOStatus,
104                  void              *agFirstDword,
105                  bit32             agIOInfoLen,
106                  void              *agParam
107                  )
108
109{
110  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
111  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
112  tdsaRoot_t           *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
113  tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
114  tdIORequestBody_t    *tdIORequestBody;
115  satIOContext_t       *satIOContext;
116  satDeviceData_t      *pSatDevData;
117  tdsaDeviceData_t     *tdsaDeviceData = agNULL;
118  tdsaPortContext_t    *onePortContext;
119  tiDeviceHandle_t     *tiDeviceHandle = agNULL;
120  agsaDevHandle_t      *agDevHandle = agNULL;
121  bit32                status;
122  tdsaDeviceData_t     *oneDeviceData = agNULL;
123
124  TDSA_OUT_ENTER(tiRoot);
125
126  TI_DBG6(("ossaSATACompleted: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
127    agIORequest, agIOStatus, agIOInfoLen));
128
129  if (agIORequest == agNULL)
130  {
131    TI_DBG1(("ossaSATACompleted: agIORequest is NULL!!!!\n"));
132    return;
133  }
134
135  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
136
137  if (tdIORequestBody == agNULL)
138  {
139    TI_DBG1(("ossaSATACompleted: tdIORequestBody is NULL!!!!\n"));
140    return;
141  }
142  /* for debugging */
143  if (tdIORequestBody->ioCompleted == agTRUE)
144  {
145    tiDeviceHandle = tdIORequestBody->tiDevHandle;
146    if (tiDeviceHandle == agNULL)
147    {
148      TI_DBG1(("ossaSATACompleted: tiDeviceHandle is NULL!!!!\n"));
149      return;
150    }
151    tdsaDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
152    TI_DBG1(("ossaSATACompleted: Error!!!!!! double completion\n"));
153    if (tdsaDeviceData == agNULL)
154    {
155      TI_DBG1(("ossaSATACompleted: tdsaDeviceData is NULL!!!!\n"));
156      return;
157    }
158    TI_DBG1(("ossaSATACompleted: did %d \n", tdsaDeviceData->id));
159    return;
160  }
161
162  tdIORequestBody->ioCompleted = agTRUE;
163  satIOContext    = &(tdIORequestBody->transport.SATA.satIOContext);
164
165  if (satIOContext == agNULL)
166  {
167    TI_DBG1(("ossaSATACompleted: satIOContext is NULL!!!!\n"));
168    return;
169  }
170
171  pSatDevData     = satIOContext->pSatDevData;
172
173  if (tdIORequestBody->tiDevHandle != agNULL)
174  {
175    oneDeviceData = (tdsaDeviceData_t *)tdIORequestBody->tiDevHandle->tdData;
176  }
177
178  if (pSatDevData == agNULL && oneDeviceData != agNULL)
179  {
180    TI_DBG1(("ossaSATACompleted: pSatDevData is NULL, loc 1, wrong\n"));
181    pSatDevData = &(oneDeviceData->satDevData);
182  }
183
184  if (pSatDevData == agNULL)
185  {
186    TI_DBG1(("ossaSATACompleted: pSatDevData is NULL loc 2, wrong\n"));
187    if (satIOContext->satOrgIOContext == agNULL)
188    {
189      TI_DBG1(("ossaSATACompleted: external command\n"));
190    }
191    else
192    {
193      TI_DBG1(("ossaSATACompleted: internal command\n"));
194    }
195    goto ext;
196  }
197
198  tdsaDeviceData  = (tdsaDeviceData_t *)pSatDevData->satSaDeviceData;
199  if (oneDeviceData != tdsaDeviceData)
200  {
201    if (satIOContext->satOrgIOContext == agNULL)
202    {
203      TI_DBG1(("ossaSATACompleted: diff device handle; external command\n"));
204    }
205    else
206    {
207      TI_DBG1(("ossaSATACompleted: diff device handle; internal command\n"));
208    }
209  }
210
211  if (tdsaDeviceData == agNULL)
212  {
213    TI_DBG1(("ossaSATACompleted: tdsaDeviceData is NULL!!!!\n"));
214    return;
215  }
216
217  onePortContext   = tdsaDeviceData->tdPortContext;
218
219  /* retries in OSSA_IO_XFER_OPEN_RETRY_TIMEOUT */
220  if (agIOStatus == OSSA_IO_XFER_OPEN_RETRY_TIMEOUT)
221  {
222    if (tdsaDeviceData->valid == agTRUE && tdsaDeviceData->registered == agTRUE &&
223        tdsaDeviceData->tdPortContext != agNULL )
224    {
225      if (tdIORequestBody->reTries <= OPEN_RETRY_RETRIES) /* 10 */
226      {
227        agDevHandle = tdsaDeviceData->agDevHandle;
228        status = saSATAStart( agRoot,
229                              agIORequest,
230                              tdsaRotateQnumber(tiRoot, tdsaDeviceData),
231                              agDevHandle,
232                              satIOContext->reqType,
233                              &(tdIORequestBody->transport.SATA.agSATARequestBody),
234                              satIOContext->sataTag,
235                              ossaSATACompleted);
236
237        if (status == AGSA_RC_SUCCESS)
238        {
239          TI_DBG1(("ossaSATACompleted: retried\n"));
240          tdIORequestBody->ioStarted = agTRUE;
241          tdIORequestBody->ioCompleted = agFALSE;
242          tdIORequestBody->reTries++;
243          goto ext;
244        }
245        else
246        {
247          TI_DBG1(("ossaSATACompleted: retry failed\n"));
248          tdIORequestBody->ioStarted = agFALSE;
249          tdIORequestBody->ioCompleted = agTRUE;
250          tdIORequestBody->reTries = 0;
251        }
252      }
253      else
254      {
255        /* retries is over, do nothing */
256        TI_DBG1(("ossaSATACompleted: retry is over and fail\n"));
257        tdIORequestBody->reTries = 0;
258      }
259    }
260    else
261    {
262      TI_DBG1(("ossaSATACompleted: incorrect device state or no portcontext\n"));
263      tdIORequestBody->reTries = 0;
264    }
265  } /* if OSSA_IO_XFER_OPEN_RETRY_TIMEOUT*/
266
267  /* release tag value for SATA */
268  if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
269       (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
270  {
271    satTagRelease(tiRoot, pSatDevData, satIOContext->sataTag);
272  }
273
274  /* send SMP_PHY_CONTROL_HARD_RESET */
275  if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY && tdsaAllShared->FCA)
276  {
277    if (pSatDevData->NumOfFCA <= 0) /* does SMP HARD RESET only upto one time */
278    {
279      TI_DBG1(("ossaSATACompleted: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n"));
280      pSatDevData->NumOfFCA++;
281      tdsaPhyControlSend(tiRoot,
282                         tdsaDeviceData,
283                         SMP_PHY_CONTROL_HARD_RESET,
284                         agNULL,
285                         tdsaRotateQnumber(tiRoot, tdsaDeviceData)
286                        );
287    }
288    else
289    {
290      /* given up after one time of SMP HARD RESET; */
291      TI_DBG1(("ossaSATACompleted: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; NO!!! sending HARD_RESET\n"));
292      if (tdsaDeviceData->registered == agTRUE && tdsaAllShared->ResetInDiscovery == 0)
293      {
294        /*
295          1. remove this device
296          2. device removal event
297        */
298        tdsaAbortAll(tiRoot, agRoot, tdsaDeviceData);
299        tdsaDeviceData->valid = agFALSE;
300        tdsaDeviceData->valid2 = agFALSE;
301        tdsaDeviceData->registered = agFALSE;
302//      pSatDevData->NumOfFCA = 0;
303        ostiInitiatorEvent(
304                            tiRoot,
305                            onePortContext->tiPortalContext,
306                            agNULL,
307                            tiIntrEventTypeDeviceChange,
308                            tiDeviceRemoval,
309                            agNULL
310                            );
311      }
312    }
313  }
314
315  if (agIOStatus == OSSA_IO_ABORTED)
316  {
317    /*
318       free abort IO request itself - agParam; done in ossaSATAEvent()
319    */
320  }
321  /* just for debugging */
322  if (agIOStatus == OSSA_IO_DS_NON_OPERATIONAL)
323  {
324    TI_DBG1(("ossaSATACompleted: agIOStatus is OSSA_IO_DS_NON_OPERATIONAL\n"));
325  }
326  if (agIOStatus == OSSA_IO_DS_IN_RECOVERY)
327  {
328    TI_DBG1(("ossaSATACompleted: agIOStatus is OSSA_IO_DS_IN_RECOVERY\n"));
329  }
330
331  satIOContext->satCompleteCB( agRoot,
332                               agIORequest,
333                               agIOStatus,
334                               agFirstDword,
335                               agIOInfoLen,
336                               agParam,
337                               satIOContext);
338ext:
339  TDSA_OUT_LEAVE(tiRoot);
340}
341
342/*****************************************************************************
343*! \brief  satPacketCB
344*
345*   This routine is a callback function called from ossaSATACompleted().
346*   This CB routine deals with normal Packet command I/O SATA request.
347*
348*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
349*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
350*  \param   agIOStatus:  Status of completed I/O.
351*  \param   agFirstDword:Pointer to the four bytes of FIS.
352*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
353*                        length.
354*  \param   agParam:     Additional info based on status.
355*  \param   ioContext:   Pointer to satIOContext_t.
356*
357*  \return: none
358*
359*****************************************************************************/
360
361void satPacketCB(
362                 agsaRoot_t        *agRoot,
363                 agsaIORequest_t   *agIORequest,
364                 bit32             agIOStatus,
365                 agsaFisHeader_t   *agFirstDword,
366                 bit32             agIOInfoLen,
367                 void              *agParam,
368                 void              *ioContext
369                 )
370{
371  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
372  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
373  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
374  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
375  tdIORequestBody_t       *tdIORequestBody;
376  tdIORequestBody_t       *tdOrgIORequestBody;
377  satIOContext_t          *satIOContext;
378  satIOContext_t          *satOrgIOContext;
379  satIOContext_t          *satNewIOContext;
380  satInternalIo_t         *satIntIo;
381  satInternalIo_t         *satNewIntIo = agNULL;
382  satDeviceData_t         *satDevData;
383  scsiRspSense_t          *pSense;
384  tiIORequest_t           *tiOrgIORequest;
385  tiIniScsiCmnd_t         *scsiCmnd;
386  bit32                   interruptContext = osData->IntContext;
387  bit8                    bSenseKey = 0;
388  bit16                   bSenseCodeInfo = 0;
389  bit32                   status = 0;
390
391  TI_DBG4(("satPacketCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
392
393  /* internally generate tiIOContext */
394  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
395  satIOContext           = (satIOContext_t *) ioContext;
396  satIntIo               = satIOContext->satIntIoContext;
397  satDevData             = satIOContext->pSatDevData;
398
399  /*ttttttthe one */
400  if (satIntIo == agNULL)
401  {
402    TI_DBG4(("satPacketCB: External satInternalIo_t satIntIoContext\n"));
403    satOrgIOContext = satIOContext;
404    tiOrgIORequest  = tdIORequestBody->tiIORequest;
405    pSense          = satOrgIOContext->pSense;
406    scsiCmnd        = satOrgIOContext->pScsiCmnd;
407  }
408  else
409  {
410    TI_DBG4(("satPacketCB: Internal satInternalIo_t satIntIoContext\n"));
411    satOrgIOContext = satIOContext->satOrgIOContext;
412    if (satOrgIOContext == agNULL)
413    {
414      TI_DBG4(("satPacketCB: satOrgIOContext is NULL, wrong\n"));
415      return;
416    }
417    else
418    {
419      TI_DBG4(("satPacketCB: satOrgIOContext is NOT NULL\n"));
420    }
421    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
422    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
423    pSense                 = satOrgIOContext->pSense;
424    scsiCmnd               = satOrgIOContext->pScsiCmnd;
425  }
426
427  /* Parse CDB */
428  switch(scsiCmnd->cdb[0])
429  {
430    case SCSIOPC_TEST_UNIT_READY:
431      //satTestUnitReadyCB(agRoot, agIORequest, agIOStatus, agFirstDword, agIOInfoLen, agParam, ioContext);
432      //break;
433    case SCSIOPC_GET_EVENT_STATUS_NOTIFICATION:
434      //break;
435    case SCSIOPC_READ_CAPACITY_10:
436    case SCSIOPC_READ_CAPACITY_16:
437      //satPacketReadCapacityCB(agRoot, agIORequest, agIOStatus, agFirstDword, agIOInfoLen, agParam, ioContext);
438      //break;
439    default:
440       break;
441   }
442
443  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
444
445  tdIORequestBody->ioCompleted = agTRUE;
446  tdIORequestBody->ioStarted   = agFALSE;
447
448  /* interal structure free */
449  satFreeIntIoResource( tiRoot, satDevData, satIntIo);
450
451  if( agIOStatus == OSSA_IO_SUCCESS && agFirstDword == agNULL)
452  {
453    TI_DBG1(("satPacketCB: agIOStatus == OSSA_IO_SUCCESS, agFirstDword == agNULL \n"));
454    ostiInitiatorIOCompleted( tiRoot,
455                              tdIORequestBody->tiIORequest,
456                              tiIOSuccess,
457                              SCSI_STAT_GOOD,
458                              agNULL,
459                              interruptContext);
460  }
461  else if (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL)
462  {
463      TI_DBG1(("satPacketCB: wrong. agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL \n"));
464      satNewIntIo = satAllocIntIoResource( tiRoot,
465                                       tiOrgIORequest,
466                                       satDevData,
467                                       32,
468                                       satNewIntIo);
469      if (satNewIntIo == agNULL)
470      {
471          /* memory allocation failure */
472          /* just translate the ATAPI error register to sense information */
473          satTranslateATAPIErrorsToSCSIErrors(
474                          scsiCmnd->cdb[0],
475                          agFirstDword->D2H.status,
476                          agFirstDword->D2H.error,
477                          &bSenseKey,
478                          &bSenseCodeInfo
479                          );
480          satSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
481          ostiInitiatorIOCompleted( tiRoot,
482                                  tdIORequestBody->tiIORequest,
483                                  tiIOSuccess,
484                                  SCSI_STAT_CHECK_CONDITION,
485                                  satOrgIOContext->pTiSenseData,
486                                  interruptContext);
487          TI_DBG1(("satPacketCB: momory allocation fails\n"));
488          return;
489      } /* end memory allocation */
490
491      satNewIOContext = satPrepareNewIO(satNewIntIo,
492                                        tiOrgIORequest,
493                                        satDevData,
494                                        scsiCmnd,
495                                        satOrgIOContext
496                                        );
497      /* sends request sense to ATAPI device for acquiring sense information */
498      status = satRequestSenseForATAPI(tiRoot,
499                              &satNewIntIo->satIntTiIORequest,
500                              satNewIOContext->ptiDeviceHandle,
501                              &satNewIntIo->satIntTiScsiXchg,
502                              satNewIOContext
503                              );
504      if (status != tiSuccess)
505      {
506          satFreeIntIoResource( tiRoot,
507                                satDevData,
508                                satNewIntIo);
509          /* just translate the ATAPI error register to sense information */
510          satTranslateATAPIErrorsToSCSIErrors(
511                          scsiCmnd->cdb[0],
512                          agFirstDword->D2H.status,
513                          agFirstDword->D2H.error,
514                          &bSenseKey,
515                          &bSenseCodeInfo
516                          );
517          satSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
518          ostiInitiatorIOCompleted( tiRoot,
519                                  tdIORequestBody->tiIORequest,
520                                  tiIOSuccess,
521                                  SCSI_STAT_CHECK_CONDITION,
522                                  satOrgIOContext->pTiSenseData,
523                                  interruptContext);
524          TI_DBG1(("satPacketCB: failed to call satRequestSenseForATAPI()\n"));
525      }
526  }
527  else if (agIOStatus != OSSA_IO_SUCCESS)
528  {
529      TI_DBG1(("satPacketCB: wrong. agIOStatus != OSSA_IO_SUCCESS, status %d\n", agIOStatus));
530      itdsatProcessAbnormalCompletion(
531                    agRoot,
532                    agIORequest,
533                    agIOStatus,
534                    agFirstDword,
535                    agIOInfoLen,
536                    agParam,
537                    satIOContext);
538  }
539  else
540  {
541      TI_DBG1(("satPacketCB: Unknown error \n"));
542      ostiInitiatorIOCompleted( tiRoot,
543                                tdIORequestBody->tiIORequest,
544                                tiIOFailed,
545                                tiDetailOtherError,
546                                agNULL,
547                                interruptContext);
548  }
549}
550/*****************************************************************************
551*! \brief  satRequestSenseForATAPICB
552*
553*   This routine is a callback function called from ossaSATACompleted().
554*   This CB routine deals with normal non-chained data I/O SATA request.
555*
556*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
557*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
558*  \param   agIOStatus:  Status of completed I/O.
559*  \param   agFirstDword:Pointer to the four bytes of FIS.
560*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
561*                        length.
562*  \param   agParam:     Additional info based on status.
563*  \param   ioContext:   Pointer to satIOContext_t.
564*
565*  \return: none
566*
567*****************************************************************************/
568void satRequestSenseForATAPICB(
569                  agsaRoot_t        *agRoot,
570                  agsaIORequest_t   *agIORequest,
571                  bit32             agIOStatus,
572                  agsaFisHeader_t   *agFirstDword,
573                  bit32             agIOInfoLen,
574                  void              *agParam,
575                  void              *ioContext
576                  )
577{
578  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
579  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
580  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
581  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
582  tdIORequestBody_t       *tdIORequestBody;
583  tdIORequestBody_t       *tdOrgIORequestBody;
584  satIOContext_t          *satIOContext;
585  satIOContext_t          *satOrgIOContext;
586  satInternalIo_t         *satIntIo;
587  satDeviceData_t         *satDevData;
588  tiIORequest_t           *tiOrgIORequest;
589  bit32                   interruptContext = osData->IntContext;
590
591  TI_DBG4(("satPacketCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
592
593  /* internally generate tiIOContext */
594  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
595  satIOContext           = (satIOContext_t *) ioContext;
596  satIntIo               = satIOContext->satIntIoContext;
597  satDevData             = satIOContext->pSatDevData;
598
599  /*ttttttthe one */
600  if (satIntIo == agNULL)
601  {
602    TI_DBG4(("satPacketCB: External satInternalIo_t satIntIoContext\n"));
603    satOrgIOContext = satIOContext;
604    tiOrgIORequest  = tdIORequestBody->tiIORequest;
605  }
606  else
607  {
608    TI_DBG4(("satPacketCB: Internal satInternalIo_t satIntIoContext\n"));
609    satOrgIOContext = satIOContext->satOrgIOContext;
610    if (satOrgIOContext == agNULL)
611    {
612      TI_DBG4(("satPacketCB: satOrgIOContext is NULL, wrong\n"));
613      return;
614    }
615    else
616    {
617      TI_DBG4(("satPacketCB: satOrgIOContext is NOT NULL\n"));
618    }
619    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
620    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
621  }
622
623  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
624
625  tdIORequestBody->ioCompleted = agTRUE;
626  tdIORequestBody->ioStarted   = agFALSE;
627
628  /* copy the request sense buffer to original IO buffer*/
629  if (satIntIo != agNULL)
630  {
631    osti_memcpy(satOrgIOContext->pTiSenseData->senseData, satIntIo->satIntDmaMem.virtPtr, SENSE_DATA_LENGTH);
632    satOrgIOContext->pTiSenseData->senseLen = SENSE_DATA_LENGTH;
633    /* interal structure free */
634    satFreeIntIoResource( tiRoot, satDevData, satIntIo);
635  }
636
637  /* notify the OS to complete this SRB */
638  ostiInitiatorIOCompleted( tiRoot,
639              tiOrgIORequest,
640              tiIOSuccess,
641              SCSI_STAT_CHECK_CONDITION,
642              satOrgIOContext->pTiSenseData,
643              interruptContext);
644}
645/*****************************************************************************
646*! \brief  satSetFeaturesPIOCB
647*
648*   This routine is a callback function called from ossaSATACompleted().
649*   This CB routine deals with normal non-chained data I/O SATA request.
650*
651*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
652*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
653*  \param   agIOStatus:  Status of completed I/O.
654*  \param   agFirstDword:Pointer to the four bytes of FIS.
655*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
656*                        length.
657*  \param   agParam:     Additional info based on status.
658*  \param   ioContext:   Pointer to satIOContext_t.
659*
660*  \return: none
661*
662*****************************************************************************/
663void satSetFeaturesPIOCB(
664    agsaRoot_t        *agRoot,
665    agsaIORequest_t   *agIORequest,
666    bit32             agIOStatus,
667    agsaFisHeader_t   *agFirstDword,
668    bit32             agIOInfoLen,
669    void              *agParam,
670    void              *ioContext
671    )
672{
673    tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
674    tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
675    tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
676    tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
677    tdIORequestBody_t       *tdIORequestBody;
678    tdIORequestBody_t       *tdOrgIORequestBody;
679    satIOContext_t          *satIOContext;
680    satIOContext_t          *satOrgIOContext;
681    satIOContext_t          *satNewIOContext;
682    satInternalIo_t         *satIntIo;
683    satInternalIo_t         *satNewIntIo = agNULL;
684    satDeviceData_t         *satDevData;
685    tiIORequest_t           *tiOrgIORequest;
686    tiIniScsiCmnd_t         *scsiCmnd;
687    bit32                   status;
688
689    TI_DBG3(("satSetFeaturesPIOCB start\n"));
690
691    /* internally generate tiIOContext */
692    tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
693    satIOContext           = (satIOContext_t *) ioContext;
694    satIntIo               = satIOContext->satIntIoContext;
695    satDevData             = satIOContext->pSatDevData;
696
697    /*ttttttthe one */
698    if (satIntIo == agNULL)
699    {
700        TI_DBG4(("satSetFeaturesPIOCB: External satInternalIo_t satIntIoContext\n"));
701        satOrgIOContext = satIOContext;
702        tiOrgIORequest  = tdIORequestBody->tiIORequest;
703        scsiCmnd        = satOrgIOContext->pScsiCmnd;
704    }
705    else
706    {
707        TI_DBG4(("satSetFeaturesPIOCB: Internal satInternalIo_t satIntIoContext\n"));
708        satOrgIOContext = satIOContext->satOrgIOContext;
709        if (satOrgIOContext == agNULL)
710        {
711            TI_DBG4(("satSetFeaturesPIOCB: satOrgIOContext is NULL, wrong\n"));
712            return;
713        }
714        else
715        {
716            TI_DBG4(("satSetFeaturesPIOCB: satOrgIOContext is NOT NULL\n"));
717        }
718        tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
719        tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
720        scsiCmnd               = satOrgIOContext->pScsiCmnd;
721    }
722    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
723
724    tdIORequestBody->ioCompleted = agTRUE;
725    tdIORequestBody->ioStarted   = agFALSE;
726
727    /* interal structure free */
728    satFreeIntIoResource(tiRoot,
729                         satDevData,
730                         satIntIo);
731
732    /*if the ATAPI device support DMA, then enble this feature*/
733    if (satDevData->satDMASupport && satDevData->satDMAEnabled)
734    {
735        satNewIntIo = satAllocIntIoResource( tiRoot,
736                                           tiOrgIORequest,
737                                           satDevData,
738                                           0,
739                                           satNewIntIo);
740        if (satNewIntIo == agNULL)
741        {
742            TI_DBG1(("satSetFeaturesPIOCB: momory allocation fails\n"));
743            return;
744        } /* end memory allocation */
745
746        satNewIOContext = satPrepareNewIO(satNewIntIo,
747                                          tiOrgIORequest,
748                                          satDevData,
749                                          scsiCmnd,
750                                          satOrgIOContext
751                                          );
752        /* sends either ATA SET FEATURES based on DMA bit */
753        status = satSetFeatures(tiRoot,
754                                &satNewIntIo->satIntTiIORequest,
755                                satNewIOContext->ptiDeviceHandle,
756                                &satNewIntIo->satIntTiScsiXchg,
757                                satNewIOContext,
758                                agTRUE
759                                );
760        if (status != tiSuccess)
761        {
762            satFreeIntIoResource( tiRoot, satDevData, satNewIntIo);
763            TI_DBG1(("satSetFeaturesPIOCB: failed to call satSetFeatures()\n"));
764        }
765    }
766}
767
768/*****************************************************************************
769*! \brief  satSetFeaturesCB
770*
771*   This routine is a callback function called from ossaSATACompleted().
772*   This CB routine deals with normal non-chained data I/O SATA request.
773*
774*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
775*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
776*  \param   agIOStatus:  Status of completed I/O.
777*  \param   agFirstDword:Pointer to the four bytes of FIS.
778*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
779*                        length.
780*  \param   agParam:     Additional info based on status.
781*  \param   ioContext:   Pointer to satIOContext_t.
782*
783*  \return: none
784*
785*****************************************************************************/
786void satSetFeaturesCB(
787    agsaRoot_t        *agRoot,
788    agsaIORequest_t   *agIORequest,
789    bit32             agIOStatus,
790    agsaFisHeader_t   *agFirstDword,
791    bit32             agIOInfoLen,
792    void              *agParam,
793    void              *ioContext
794    )
795{
796    tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
797    tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
798    tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
799    tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
800    tdIORequestBody_t       *tdIORequestBody;
801    tdIORequestBody_t       *tdOrgIORequestBody = agNULL;
802    satIOContext_t          *satIOContext;
803    satIOContext_t          *satOrgIOContext;
804    satInternalIo_t         *satIntIo;
805    satDeviceData_t         *satDevData;
806    tdsaPortContext_t       *onePortContext = agNULL;
807    tiPortalContext_t       *tiPortalContext = agNULL;
808    tdsaDeviceData_t        *oneDeviceData = agNULL;
809    bit8                    PhyID =0;
810    TI_DBG3(("satSetFeaturesCB start\n"));
811
812    /* internally generate tiIOContext */
813    tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
814    satIOContext           = (satIOContext_t *) ioContext;
815    satIntIo               = satIOContext->satIntIoContext;
816    satDevData             = satIOContext->pSatDevData;
817    oneDeviceData          = (tdsaDeviceData_t *)tdIORequestBody->tiDevHandle->tdData;
818    onePortContext         = oneDeviceData->tdPortContext;
819    if (onePortContext == agNULL)
820    {
821        TI_DBG4(("satSetFeaturesCB: onePortContext is  NULL, wrong\n"));
822        return;
823    }
824    tiPortalContext        = onePortContext->tiPortalContext;
825    PhyID                  = oneDeviceData->phyID;
826    /*ttttttthe one */
827    if (satIntIo == agNULL)
828    {
829        TI_DBG4(("satSetFeaturesCB: External satInternalIo_t satIntIoContext\n"));
830        satOrgIOContext = satIOContext;
831    }
832    else
833    {
834        TI_DBG4(("satSetFeaturesCB: Internal satInternalIo_t satIntIoContext\n"));
835        satOrgIOContext = satIOContext->satOrgIOContext;
836        if (satOrgIOContext == agNULL)
837        {
838            TI_DBG4(("satSetFeaturesCB: satOrgIOContext is NULL, wrong\n"));
839            return;
840        }
841        else
842        {
843            TI_DBG4(("satSetFeaturesCB: satOrgIOContext is NOT NULL\n"));
844        }
845        tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
846    }
847    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
848
849    tdIORequestBody->ioCompleted = agTRUE;
850    tdIORequestBody->ioStarted   = agFALSE;
851
852    /* interal structure free */
853    satFreeIntIoResource(tiRoot,
854                         satDevData,
855                         satIntIo);
856
857
858    /* clean up TD layer's IORequestBody */
859    if (tdOrgIORequestBody!= agNULL)
860    {
861      ostiFreeMemory(tiRoot,
862                     tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle,
863                     sizeof(tdIORequestBody_t)
864                     );
865    }
866
867    if (onePortContext != agNULL)
868    {
869        /* this condition is for tdsaDiscoveryStartIDDevCB routine*/
870        if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
871        {
872            TI_DBG1(("satSetFeaturesCB: ID completed after discovery is done; tiDeviceArrival\n"));
873            /* in case registration is finished after discovery is finished */
874            ostiInitiatorEvent(
875                             tiRoot,
876                             tiPortalContext,
877                             agNULL,
878                             tiIntrEventTypeDeviceChange,
879                             tiDeviceArrival,
880                             agNULL
881                             );
882            return;
883        }
884        TI_DBG2(("satSetFeaturesCB: pid %d\n", tdsaAllShared->Ports[PhyID].portContext->id));
885        /* the below codes is for satAddSATAIDDevCB routine*/
886        /* notifying link up */
887        ostiPortEvent (
888                       tiRoot,
889                       tiPortLinkUp,
890                       tiSuccess,
891                       (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
892                       );
893         #ifdef INITIATOR_DRIVER
894         /* triggers discovery */
895         ostiPortEvent(
896                      tiRoot,
897                      tiPortDiscoveryReady,
898                      tiSuccess,
899                      (void *) tdsaAllShared->Ports[PhyID].tiPortalContext
900                      );
901        #endif
902    }
903    else
904    {
905        TI_DBG1(("satSetFeaturesCB: onePortContext is NULL, wrong\n"));
906    }
907}
908/*****************************************************************************
909*! \brief  satDeviceResetCB
910*
911*   This routine is a callback function called from ossaSATACompleted().
912*   This CB routine deals with normal non-chained data I/O SATA request.
913*
914*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
915*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
916*  \param   agIOStatus:  Status of completed I/O.
917*  \param   agFirstDword:Pointer to the four bytes of FIS.
918*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
919*                        length.
920*  \param   agParam:     Additional info based on status.
921*  \param   ioContext:   Pointer to satIOContext_t.
922*
923*  \return: none
924*
925*****************************************************************************/
926void satDeviceResetCB(
927    agsaRoot_t        *agRoot,
928    agsaIORequest_t   *agIORequest,
929    bit32             agIOStatus,
930    agsaFisHeader_t   *agFirstDword,
931    bit32             agIOInfoLen,
932    void              *agParam,
933    void              *ioContext
934    )
935{
936 /* callback for satResetDevice */
937   tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
938   tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
939   tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
940   tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
941   tdIORequestBody_t       *tdIORequestBody;
942   tdIORequestBody_t       *tdOrgIORequestBody = agNULL;
943   satIOContext_t          *satIOContext;
944   satIOContext_t          *satOrgIOContext;
945//   satIOContext_t          *satNewIOContext;
946   satInternalIo_t         *satIntIo;
947//   satInternalIo_t         *satNewIntIo = agNULL;
948   satDeviceData_t         *satDevData;
949   tiIORequest_t             *tiOrgIORequest;
950#ifdef  TD_DEBUG_ENABLE
951   bit32                     ataStatus = 0;
952   bit32                     ataError;
953   agsaFisPioSetupHeader_t   *satPIOSetupHeader = agNULL;
954#endif
955//   bit32                     status;
956   bit32                     report = agFALSE;
957   bit32                     AbortTM = agFALSE;
958
959   TI_DBG1(("satDeviceResetCB: start\n"));
960
961   TI_DBG6(("satDeviceResetCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
962
963   tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
964   satIOContext           = (satIOContext_t *) ioContext;
965   satIntIo               = satIOContext->satIntIoContext;
966   satDevData             = satIOContext->pSatDevData;
967
968   if (satIntIo == agNULL)
969   {
970     TI_DBG6(("satDeviceResetCB: External, OS generated\n"));
971     satOrgIOContext      = satIOContext;
972     tiOrgIORequest       = tdIORequestBody->tiIORequest;
973   }
974   else
975   {
976     TI_DBG6(("satDeviceResetCB: Internal, TD generated\n"));
977     satOrgIOContext        = satIOContext->satOrgIOContext;
978     if (satOrgIOContext == agNULL)
979     {
980       TI_DBG6(("satDeviceResetCB: satOrgIOContext is NULL, wrong\n"));
981       return;
982     }
983     else
984     {
985       TI_DBG6(("satDeviceResetCB: satOrgIOContext is NOT NULL\n"));
986     }
987     tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
988     tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
989   }
990
991   tdIORequestBody->ioCompleted = agTRUE;
992   tdIORequestBody->ioStarted = agFALSE;
993
994   if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
995   {
996     TI_DBG1(("satDeviceResetCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
997
998     if (satOrgIOContext->NotifyOS == agTRUE)
999     {
1000       ostiInitiatorEvent( tiRoot,
1001                           NULL,
1002                           NULL,
1003                           tiIntrEventTypeTaskManagement,
1004                           tiTMFailed,
1005                           tiOrgIORequest );
1006     }
1007
1008     satDevData->satTmTaskTag = agNULL;
1009
1010     satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1011
1012     satFreeIntIoResource( tiRoot,
1013                           satDevData,
1014                           satIntIo);
1015     return;
1016   }
1017
1018   if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED ||
1019       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION ||
1020       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
1021       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS ||
1022       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION ||
1023       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED ||
1024       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION ||
1025       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR ||
1026       agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY
1027       )
1028   {
1029     TI_DBG1(("satDeviceResetCB: OSSA_IO_OPEN_CNX_ERROR\n"));
1030
1031     if (satOrgIOContext->NotifyOS == agTRUE)
1032     {
1033       ostiInitiatorEvent( tiRoot,
1034                           NULL,
1035                           NULL,
1036                           tiIntrEventTypeTaskManagement,
1037                           tiTMFailed,
1038                           tiOrgIORequest );
1039     }
1040
1041     satDevData->satTmTaskTag = agNULL;
1042
1043     satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1044
1045     satFreeIntIoResource( tiRoot,
1046                          satDevData,
1047                          satIntIo);
1048     return;
1049   }
1050
1051  if (agIOStatus != OSSA_IO_SUCCESS)
1052   {
1053     /* only agsaFisPioSetup_t is expected */
1054#ifdef  TD_DEBUG_ENABLE
1055     satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
1056     ataStatus     = satPIOSetupHeader->status;   /* ATA Status register */
1057     ataError      = satPIOSetupHeader->error;    /* ATA Eror register   */
1058#endif
1059     TI_DBG1(("satDeviceResetCB: ataStatus 0x%x ataError 0x%x\n", ataStatus, ataError));
1060
1061      if (satOrgIOContext->NotifyOS == agTRUE)
1062      {
1063       ostiInitiatorEvent( tiRoot,
1064                           NULL,
1065                           NULL,
1066                           tiIntrEventTypeTaskManagement,
1067                           tiTMFailed,
1068                           tiOrgIORequest );
1069      }
1070
1071     satDevData->satTmTaskTag = agNULL;
1072
1073     satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1074
1075     satFreeIntIoResource( tiRoot,
1076                           satDevData,
1077                           satIntIo);
1078     return;
1079   }
1080
1081   /* success */
1082  if (satOrgIOContext->TMF == AG_ABORT_TASK)
1083  {
1084    AbortTM = agTRUE;
1085  }
1086
1087  if (satOrgIOContext->NotifyOS == agTRUE)
1088  {
1089    report = agTRUE;
1090  }
1091
1092  if (AbortTM == agTRUE)
1093  {
1094    TI_DBG1(("satDeResetDeviceCB: calling satAbort\n"));
1095    satAbort(agRoot, satOrgIOContext->satToBeAbortedIOContext);
1096  }
1097  satDevData->satTmTaskTag = agNULL;
1098
1099  satDevData->satDriveState = SAT_DEV_STATE_NORMAL;
1100
1101  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1102
1103  TI_DBG1(("satDeviceResetCB: satPendingIO %d satNCQMaxIO %d\n", satDevData->satPendingIO, satDevData->satNCQMaxIO ));
1104  TI_DBG1(("satDeviceResetCB: satPendingNCQIO %d satPendingNONNCQIO %d\n", satDevData->satPendingNCQIO, satDevData->satPendingNONNCQIO));
1105
1106  satFreeIntIoResource( tiRoot,
1107                        satDevData,
1108                        satIntIo);
1109
1110  /* clean up TD layer's IORequestBody */
1111  if (tdOrgIORequestBody != agNULL)
1112  {
1113    ostiFreeMemory(
1114                   tiRoot,
1115                   tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle,
1116                   sizeof(tdIORequestBody_t)
1117                   );
1118  }
1119  else
1120  {
1121    TI_DBG1(("satDeviceResetCB: tdOrgIORequestBody is NULL, wrong\n"));
1122  }
1123
1124
1125  if (report)
1126  {
1127    ostiInitiatorEvent( tiRoot,
1128                        NULL,
1129                        NULL,
1130                        tiIntrEventTypeTaskManagement,
1131                        tiTMOK,
1132                        tiOrgIORequest );
1133  }
1134
1135
1136  TI_DBG5(("satDeviceResetCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO));
1137  TI_DBG6(("satDeviceResetCB: end\n"));
1138  return;
1139}
1140
1141/*****************************************************************************
1142*! \brief  satExecuteDeviceDiagnosticCB
1143*
1144*   This routine is a callback function called from ossaSATACompleted().
1145*   This CB routine deals with normal non-chained data I/O SATA request.
1146*
1147*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
1148*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
1149*  \param   agIOStatus:  Status of completed I/O.
1150*  \param   agFirstDword:Pointer to the four bytes of FIS.
1151*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
1152*                        length.
1153*  \param   agParam:     Additional info based on status.
1154*  \param   ioContext:   Pointer to satIOContext_t.
1155*
1156*  \return: none
1157*
1158*****************************************************************************/
1159void satExecuteDeviceDiagnosticCB(
1160    agsaRoot_t        *agRoot,
1161    agsaIORequest_t   *agIORequest,
1162    bit32             agIOStatus,
1163    agsaFisHeader_t   *agFirstDword,
1164    bit32             agIOInfoLen,
1165    void              *agParam,
1166    void              *ioContext
1167    )
1168{
1169    tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
1170    tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
1171    tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
1172    tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1173    tdIORequestBody_t       *tdIORequestBody;
1174    satIOContext_t          *satIOContext;
1175    satIOContext_t          *satOrgIOContext;
1176    satInternalIo_t         *satIntIo;
1177    satDeviceData_t         *satDevData;
1178
1179    TI_DBG3(("satExecuteDeviceDiagnosticCB start\n"));
1180
1181    /* internally generate tiIOContext */
1182    tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
1183    satIOContext           = (satIOContext_t *) ioContext;
1184    satIntIo               = satIOContext->satIntIoContext;
1185    satDevData             = satIOContext->pSatDevData;
1186
1187    /*ttttttthe one */
1188    if (satIntIo == agNULL)
1189    {
1190        TI_DBG4(("satExecuteDeviceDiagnosticCB: External satInternalIo_t satIntIoContext\n"));
1191        satOrgIOContext = satIOContext;
1192    }
1193    else
1194    {
1195        TI_DBG4(("satExecuteDeviceDiagnosticCB: Internal satInternalIo_t satIntIoContext\n"));
1196        satOrgIOContext = satIOContext->satOrgIOContext;
1197        if (satOrgIOContext == agNULL)
1198        {
1199            TI_DBG4(("satExecuteDeviceDiagnosticCB: satOrgIOContext is NULL, wrong\n"));
1200            return;
1201        }
1202        else
1203        {
1204            TI_DBG4(("satExecuteDeviceDiagnosticCB: satOrgIOContext is NOT NULL\n"));
1205        }
1206    }
1207    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1208
1209    tdIORequestBody->ioCompleted = agTRUE;
1210    tdIORequestBody->ioStarted   = agFALSE;
1211
1212    /* interal structure free */
1213    satFreeIntIoResource(tiRoot,
1214                         satDevData,
1215                         satIntIo);
1216}
1217/*****************************************************************************
1218*! \brief  satNonChainedDataIOCB
1219*
1220*   This routine is a callback function called from ossaSATACompleted().
1221*   This CB routine deals with normal non-chained data I/O SATA request.
1222*
1223*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
1224*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
1225*  \param   agIOStatus:  Status of completed I/O.
1226*  \param   agFirstDword:Pointer to the four bytes of FIS.
1227*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
1228*                        length.
1229*  \param   agParam:     Additional info based on status.
1230*  \param   ioContext:   Pointer to satIOContext_t.
1231*
1232*  \return: none
1233*
1234*****************************************************************************/
1235
1236void satNonChainedDataIOCB(
1237                           agsaRoot_t        *agRoot,
1238                           agsaIORequest_t   *agIORequest,
1239                           bit32             agIOStatus,
1240                           agsaFisHeader_t   *agFirstDword,
1241                           bit32             agIOInfoLen,
1242                           void              *agParam,
1243                           void              *ioContext
1244                           )
1245{
1246
1247  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
1248  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
1249  tdsaRoot_t           *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
1250  tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1251  tdIORequestBody_t    *tdIORequestBody;
1252  bit32                interruptContext = osData->IntContext;
1253  satIOContext_t       *satIOContext;
1254  satInternalIo_t      *SatIntIo;
1255  satDeviceData_t      *SatDevData;
1256
1257  TI_DBG6(("satNonChainedDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
1258    agIORequest, agIOStatus, agIOInfoLen));
1259
1260  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
1261  satIOContext    = (satIOContext_t *) ioContext;
1262  SatIntIo               = satIOContext->satIntIoContext;
1263  SatDevData      = satIOContext->pSatDevData;
1264  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1265  tdIORequestBody->ioCompleted = agTRUE;
1266  tdIORequestBody->ioStarted   = agFALSE;
1267
1268  /* interal structure free */
1269  satFreeIntIoResource( tiRoot,
1270                         SatDevData,
1271                         SatIntIo);
1272
1273  /* Process completion */
1274  if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen == 0))
1275  {
1276    TI_DBG5(("satNonChainedDataIOCB: success\n"));
1277    TI_DBG5(("satNonChainedDataIOCB: success agIORequest %p\n", agIORequest));
1278    /*
1279     * Command was completed OK, this is the normal path.
1280     * Now call the OS-App Specific layer about this completion.
1281     */
1282    ostiInitiatorIOCompleted( tiRoot,
1283                              tdIORequestBody->tiIORequest,
1284                              tiIOSuccess,
1285                              SCSI_STAT_GOOD,
1286                              agNULL,
1287                              interruptContext);
1288  }
1289  else
1290  {
1291    TI_DBG1(("satNonChainedDataIOCB: calling itdsatProcessAbnormalCompletion\n"));
1292    /* More checking needed */
1293    itdsatProcessAbnormalCompletion( agRoot,
1294                                     agIORequest,
1295                                     agIOStatus,
1296                                     agFirstDword,
1297                                     agIOInfoLen,
1298                                     agParam,
1299                                     satIOContext);
1300  }
1301
1302  return;
1303
1304
1305}
1306/*****************************************************************************
1307*! \brief  satChainedDataIOCB
1308*
1309*   This routine is a callback function called from ossaSATACompleted().
1310*   This CB routine deals with normal chained data I/O SATA request.
1311*
1312*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
1313*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
1314*  \param   agIOStatus:  Status of completed I/O.
1315*  \param   agFirstDword:Pointer to the four bytes of FIS.
1316*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
1317*                        length.
1318*  \param   agParam:     Additional info based on status.
1319*  \param   ioContext:   Pointer to satIOContext_t.
1320*
1321*  \return: none
1322*
1323*****************************************************************************/
1324void satChainedDataIOCB(
1325                        agsaRoot_t        *agRoot,
1326                        agsaIORequest_t   *agIORequest,
1327                        bit32             agIOStatus,
1328                        agsaFisHeader_t   *agFirstDword,
1329                        bit32             agIOInfoLen,
1330                        void              *agParam,
1331                        void              *ioContext
1332                        )
1333{
1334  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
1335  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
1336  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
1337  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1338  tdIORequestBody_t       *tdIORequestBody;
1339  tdIORequestBody_t       *tdOrgIORequestBody;
1340  satIOContext_t          *satIOContext;
1341  satIOContext_t          *satOrgIOContext;
1342  satIOContext_t          *satNewIOContext;
1343  satInternalIo_t         *satIntIo;
1344  satInternalIo_t         *satNewIntIo = agNULL;
1345  satDeviceData_t         *satDevData;
1346  scsiRspSense_t            *pSense;
1347  tiIniScsiCmnd_t           *scsiCmnd;
1348  tiIORequest_t             *tiOrgIORequest;
1349
1350  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
1351  bit32                     ataStatus = 0;
1352  bit32                     status = tiError;
1353  agsaFisRegD2HHeader_t     *statDevToHostFisHeader = agNULL;
1354  bit32                     dataLength;
1355
1356  TI_DBG6(("satChainedDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
1357           agIORequest, agIOStatus, agIOInfoLen));
1358
1359
1360  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
1361  satIOContext           = (satIOContext_t *) ioContext;
1362  if (satIOContext == agNULL)
1363  {
1364    TI_DBG1(("satChainedDataIOCB: satIOContext is NULL\n"));
1365    return;
1366  }
1367  satIntIo               = satIOContext->satIntIoContext;
1368  satDevData             = satIOContext->pSatDevData;
1369  hostToDevFis           = satIOContext->pFis;
1370
1371  if (satIntIo == agNULL)
1372  {
1373    TI_DBG5(("satChainedDataIOCB: External satInternalIo_t satIntIoContext\n"));
1374    satOrgIOContext = satIOContext;
1375    tiOrgIORequest  = tdIORequestBody->tiIORequest;
1376    pSense          = satIOContext->pSense;
1377    scsiCmnd        = satIOContext->pScsiCmnd;
1378  }
1379  else
1380  {
1381    TI_DBG5(("satChainedDataIOCB: Internal satInternalIo_t satIntIoContext\n"));
1382    satOrgIOContext        = satIOContext->satOrgIOContext;
1383    if (satOrgIOContext == agNULL)
1384    {
1385      TI_DBG5(("satChainedDataIOCB: satOrgIOContext is NULL\n"));
1386    }
1387    else
1388    {
1389      TI_DBG5(("satChainedDataIOCB: satOrgIOContext is NOT NULL\n"));
1390    }
1391
1392    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
1393    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
1394
1395    pSense        = satOrgIOContext->pSense;
1396    scsiCmnd      = satOrgIOContext->pScsiCmnd;
1397  }
1398
1399  tdIORequestBody->ioCompleted = agTRUE;
1400  tdIORequestBody->ioStarted = agFALSE;
1401
1402  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
1403  {
1404     TI_DBG1(("satChainedDataIOCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
1405     satSetSensePayload( pSense,
1406                        SCSI_SNSKEY_NO_SENSE,
1407                        0,
1408                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1409                        satOrgIOContext);
1410
1411     ostiInitiatorIOCompleted( tiRoot,
1412                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1413                              tiIOSuccess,
1414                              SCSI_STAT_CHECK_CONDITION,
1415                              satOrgIOContext->pTiSenseData,
1416                              satOrgIOContext->interruptContext );
1417
1418    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1419
1420    satFreeIntIoResource( tiRoot,
1421                          satDevData,
1422                          satIntIo);
1423    return;
1424  }
1425
1426  /*
1427    checking IO status, FIS type and error status
1428  */
1429  if (agIOStatus != OSSA_IO_SUCCESS)
1430  {
1431    /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read
1432       agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write
1433       first, assumed to be Reg Device to Host FIS
1434       This is OK to just find fis type
1435    */
1436    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
1437    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
1438    /* for debugging */
1439    if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) &&
1440        (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
1441        (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
1442        )
1443    {
1444      TI_DBG1(("satChainedDataIOCB: FAILED, Wrong FIS type 0x%x\n", statDevToHostFisHeader->fisType));
1445    }
1446
1447    /* for debugging */
1448    if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
1449         (ataStatus & DF_ATA_STATUS_MASK)
1450         )
1451    {
1452      TI_DBG1(("satChainedDataIOCB: FAILED, error status and command 0x%x\n", hostToDevFis->h.command));
1453    }
1454
1455    /* the function below handles abort case */
1456    itdsatDelayedProcessAbnormalCompletion(agRoot,
1457                                           agIORequest,
1458                                           agIOStatus,
1459                                           agFirstDword,
1460                                           agIOInfoLen,
1461                                           agParam,
1462                                           satIOContext);
1463
1464    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1465    satFreeIntIoResource( tiRoot,
1466                          satDevData,
1467                          satIntIo);
1468    return;
1469  } /* end of error */
1470
1471  switch (hostToDevFis->h.command)
1472  {
1473  case SAT_READ_DMA: /* fall through */
1474  case SAT_READ_SECTORS: /* fall through */
1475  case SAT_READ_DMA_EXT: /* fall through */
1476  case SAT_READ_SECTORS_EXT: /* fall through */
1477  case SAT_READ_FPDMA_QUEUED: /* fall through */
1478  case SAT_WRITE_DMA: /* fall through */
1479  case SAT_WRITE_SECTORS:/* fall through */
1480  case SAT_WRITE_DMA_FUA_EXT: /* fall through */
1481  case SAT_WRITE_DMA_EXT: /* fall through */
1482  case SAT_WRITE_SECTORS_EXT: /* fall through */
1483  case SAT_WRITE_FPDMA_QUEUED:
1484
1485    TI_DBG5(("satChainedDataIOCB: READ/WRITE success case\n"));
1486
1487    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1488
1489    /* done with internally genereated SAT_SMART_RETURN_STATUS */
1490    satFreeIntIoResource( tiRoot,
1491                          satDevData,
1492                          satIntIo);
1493    /* let's loop till TL */
1494
1495    /* lba = lba + tl
1496       loopnum--;
1497       if (loopnum == 0) done
1498     */
1499    (satOrgIOContext->LoopNum)--;
1500    if (satOrgIOContext->LoopNum == 0)
1501    {
1502      /* done with read */
1503      ostiInitiatorIOCompleted( tiRoot,
1504                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1505                                tiIOSuccess,
1506                                SCSI_STAT_GOOD,
1507                                agNULL,
1508                                satOrgIOContext->interruptContext );
1509      return;
1510    }
1511    if (satOrgIOContext->superIOFlag)
1512    {
1513      dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
1514    }
1515    else
1516    {
1517      dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
1518    }
1519
1520    satNewIntIo = satAllocIntIoResource( tiRoot,
1521                                         tiOrgIORequest,
1522                                         satDevData,
1523                                         dataLength,
1524                                         satNewIntIo);
1525    if (satNewIntIo == agNULL)
1526    {
1527      /* memory allocation failure */
1528      satFreeIntIoResource( tiRoot,
1529                            satDevData,
1530                            satNewIntIo);
1531       ostiInitiatorIOCompleted( tiRoot,
1532                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1533                                tiIOFailed,
1534                                tiDetailOtherError,
1535                                agNULL,
1536                                satOrgIOContext->interruptContext );
1537
1538      TI_DBG1(("satChainedDataIOCB: momory allocation fails\n"));
1539      return;
1540    } /* end of memory allocation failure */
1541
1542       /*
1543     * Need to initialize all the fields within satIOContext
1544     */
1545
1546    satNewIOContext = satPrepareNewIO(
1547                                      satNewIntIo,
1548                                      tiOrgIORequest,
1549                                      satDevData,
1550                                      scsiCmnd,
1551                                      satOrgIOContext
1552                                      );
1553
1554    /* sending another ATA command */
1555    switch (scsiCmnd->cdb[0])
1556    {
1557    case SCSIOPC_READ_6:
1558      /* no loop should occur with READ6 since it fits in one ATA command */
1559      break;
1560    case SCSIOPC_READ_10: /* fall through */
1561    case SCSIOPC_READ_12: /* fall through */
1562    case SCSIOPC_READ_16: /* fall through */
1563      status = satRead_1( tiRoot,
1564                          &satNewIntIo->satIntTiIORequest,
1565                          satNewIOContext->ptiDeviceHandle,
1566                          &satNewIntIo->satIntTiScsiXchg,
1567                          satNewIOContext);
1568      break;
1569    case SCSIOPC_WRITE_6:
1570      /* no loop should occur with WRITE6 since it fits in one ATA command */
1571      break;
1572    case SCSIOPC_WRITE_10: /* fall through */
1573    case SCSIOPC_WRITE_12: /* fall through */
1574    case SCSIOPC_WRITE_16: /* fall through */
1575      status = satWrite_1( tiRoot,
1576                           &satNewIntIo->satIntTiIORequest,
1577                           satNewIOContext->ptiDeviceHandle,
1578                           &satNewIntIo->satIntTiScsiXchg,
1579                             satNewIOContext);
1580      break;
1581    default:
1582      TI_DBG1(("satChainedDataIOCB: success but default case scsi cmd 0x%x ata cmd 0x%x\n",scsiCmnd->cdb[0], hostToDevFis->h.command));
1583      status = tiError;
1584      break;
1585    }
1586
1587
1588
1589    if (status != tiSuccess)
1590    {
1591      satFreeIntIoResource( tiRoot,
1592                            satDevData,
1593                            satNewIntIo);
1594      ostiInitiatorIOCompleted( tiRoot,
1595                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1596                                tiIOFailed,
1597                                tiDetailOtherError,
1598                                agNULL,
1599                                satOrgIOContext->interruptContext );
1600      TI_DBG1(("satChainedDataIOCB: calling satRead10_1 fails\n"));
1601      return;
1602    }
1603
1604    break;
1605
1606
1607  default:
1608    TI_DBG1(("satChainedDataIOCB: success but default case command 0x%x\n",hostToDevFis->h.command));
1609    ostiInitiatorIOCompleted( tiRoot,
1610                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1611                              tiIOFailed,
1612                              tiDetailOtherError,
1613                              agNULL,
1614                              satOrgIOContext->interruptContext );
1615
1616    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1617
1618    satFreeIntIoResource( tiRoot,
1619                          satDevData,
1620                          satIntIo);
1621
1622    break;
1623  }
1624
1625
1626  return;
1627}
1628void satNonChainedWriteNVerifyCB(
1629                        agsaRoot_t        *agRoot,
1630                        agsaIORequest_t   *agIORequest,
1631                        bit32             agIOStatus,
1632                        agsaFisHeader_t   *agFirstDword,
1633                        bit32             agIOInfoLen,
1634                        void              *agParam,
1635                        void              *ioContext
1636                        )
1637{
1638
1639  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
1640  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
1641  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
1642  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1643  tdIORequestBody_t       *tdIORequestBody;
1644  tdIORequestBody_t       *tdOrgIORequestBody;
1645  satIOContext_t          *satIOContext;
1646  satIOContext_t          *satOrgIOContext;
1647  satIOContext_t          *satNewIOContext;
1648  satInternalIo_t         *satIntIo;
1649  satInternalIo_t         *satNewIntIo = agNULL;
1650  satDeviceData_t         *satDevData;
1651  scsiRspSense_t            *pSense;
1652  tiIniScsiCmnd_t           *scsiCmnd;
1653  tiIORequest_t             *tiOrgIORequest;
1654
1655  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
1656  bit32                     ataStatus = 0;
1657  bit32                     status;
1658  tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
1659  agsaFisRegD2HHeader_t     *statDevToHostFisHeader = agNULL;
1660  agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL;
1661
1662  TI_DBG5(("satNonChainedWriteNVerifyCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
1663
1664  /* internally generate tiIOContext */
1665  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
1666  satIOContext           = (satIOContext_t *) ioContext;
1667  satIntIo               = satIOContext->satIntIoContext;
1668  satDevData             = satIOContext->pSatDevData;
1669  hostToDevFis           = satIOContext->pFis;
1670
1671  /* SPC: Self-Test Result Log page */
1672  tiScsiRequest          = satIOContext->tiScsiXchg;
1673
1674  if (satIntIo == agNULL)
1675  {
1676    TI_DBG4(("satNonChainedWriteNVerifyCB: External satInternalIo_t satIntIoContext\n"));
1677    satOrgIOContext = satIOContext;
1678    tiOrgIORequest  = tdIORequestBody->tiIORequest;
1679    pSense          = satOrgIOContext->pSense;
1680    scsiCmnd        = satOrgIOContext->pScsiCmnd;
1681  }
1682  else
1683  {
1684    TI_DBG4(("satNonChainedWriteNVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
1685    satOrgIOContext        = satIOContext->satOrgIOContext;
1686    if (satOrgIOContext == agNULL)
1687    {
1688      TI_DBG4(("satNonChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n"));
1689      return;
1690    }
1691    else
1692    {
1693      TI_DBG4(("satNonChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n"));
1694    }
1695    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
1696    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
1697
1698    pSense        = satOrgIOContext->pSense;
1699    scsiCmnd      = satOrgIOContext->pScsiCmnd;
1700  }
1701
1702  tdIORequestBody->ioCompleted = agTRUE;
1703  tdIORequestBody->ioStarted = agFALSE;
1704
1705
1706  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
1707  {
1708    TI_DBG1(("satNonChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
1709    ostiInitiatorIOCompleted (
1710                             tiRoot,
1711                             tiOrgIORequest,
1712                             tiIOFailed,
1713                             tiDetailOtherError,
1714                             agNULL,
1715                             satOrgIOContext->interruptContext
1716                             );
1717    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1718
1719    satFreeIntIoResource( tiRoot,
1720                          satDevData,
1721                          satIntIo);
1722    return;
1723  }
1724
1725
1726  if (agIOStatus != OSSA_IO_SUCCESS)
1727  {
1728    /*
1729      FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
1730    */
1731    /* First, assumed to be Reg Device to Host FIS */
1732    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
1733    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
1734  }
1735
1736  if (agIOStatus != OSSA_IO_SUCCESS)
1737  {
1738    if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS)
1739    {
1740      statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H);
1741
1742      /* Get ATA Status register */
1743      ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70);               /* bits 4,5,6 */
1744      ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07);   /* bits 0,1,2 */
1745
1746      /* ATA Eror register   */
1747   }
1748  }
1749
1750
1751  if( agIOStatus != OSSA_IO_SUCCESS)
1752  {
1753  /*
1754    checking IO status, FIS type and error status
1755    FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
1756    Both have fisType in the same location
1757  */
1758  if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
1759        (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) ||
1760       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
1761       )
1762    {
1763      /* for debugging */
1764      if( agIOStatus != OSSA_IO_SUCCESS)
1765      {
1766        TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, NOT IO_SUCCESS\n"));
1767      }
1768      else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
1769      {
1770        TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
1771      }
1772      else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
1773      {
1774        TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
1775      }
1776      else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
1777                (ataStatus & DF_ATA_STATUS_MASK)
1778                )
1779      {
1780        TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, FAILED, error status\n"));
1781      }
1782
1783
1784      /* Process abort case */
1785      if (agIOStatus == OSSA_IO_ABORTED)
1786      {
1787        satProcessAbort(tiRoot,
1788                        tiOrgIORequest,
1789                        satOrgIOContext
1790                        );
1791
1792        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1793
1794        satFreeIntIoResource( tiRoot,
1795                              satDevData,
1796                              satIntIo);
1797        return;
1798      }
1799
1800      /* for debugging */
1801      switch (hostToDevFis->h.command)
1802      {
1803      case SAT_WRITE_DMA_FUA_EXT:
1804        TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT\n"));
1805        break;
1806      case SAT_WRITE_DMA_EXT:
1807        TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT\n"));
1808        break;
1809      case SAT_WRITE_SECTORS_EXT:
1810        TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT\n"));
1811        break;
1812      case SAT_WRITE_FPDMA_QUEUED:
1813        TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED\n"));
1814        break;
1815      case SAT_READ_VERIFY_SECTORS:
1816        TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS\n"));
1817        break;
1818      case SAT_READ_VERIFY_SECTORS_EXT:
1819        TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n"));
1820        break;
1821      default:
1822        TI_DBG1(("satNonChainedWriteNVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command));
1823        break;
1824      }
1825
1826      satSetSensePayload( pSense,
1827                          SCSI_SNSKEY_NO_SENSE,
1828                          0,
1829                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1830                          satOrgIOContext);
1831
1832      ostiInitiatorIOCompleted( tiRoot,
1833                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1834                                tiIOSuccess,
1835                                SCSI_STAT_CHECK_CONDITION,
1836                                satOrgIOContext->pTiSenseData,
1837                                satOrgIOContext->interruptContext );
1838
1839      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1840
1841      satFreeIntIoResource( tiRoot,
1842                            satDevData,
1843                            satIntIo);
1844      return;
1845    } /* end error checking */
1846  }
1847
1848  /* process success from this point on */
1849
1850  switch (hostToDevFis->h.command)
1851  {
1852  case SAT_WRITE_DMA_FUA_EXT:
1853    TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT success\n"));
1854    break;
1855  case SAT_WRITE_DMA_EXT:
1856    TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT success\n"));
1857    break;
1858  case SAT_WRITE_SECTORS_EXT:
1859    TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT succes\n"));
1860
1861    break;
1862  case SAT_WRITE_FPDMA_QUEUED:
1863    TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED succes\n"));
1864    break;
1865  case SAT_READ_VERIFY_SECTORS:
1866    TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS succes\n"));
1867    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1868
1869    /* free */
1870    satFreeIntIoResource( tiRoot,
1871                        satDevData,
1872                        satIntIo);
1873
1874    /* return stat_good */
1875    ostiInitiatorIOCompleted( tiRoot,
1876                              tiOrgIORequest,
1877                              tiIOSuccess,
1878                              SCSI_STAT_GOOD,
1879                              agNULL,
1880                              satOrgIOContext->interruptContext );
1881    return;
1882    break;
1883  case SAT_READ_VERIFY_SECTORS_EXT:
1884    TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT succes\n"));
1885    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1886
1887    /* free */
1888    satFreeIntIoResource( tiRoot,
1889                        satDevData,
1890                        satIntIo);
1891
1892    /* return stat_good */
1893    ostiInitiatorIOCompleted( tiRoot,
1894                              tiOrgIORequest,
1895                              tiIOSuccess,
1896                              SCSI_STAT_GOOD,
1897                              agNULL,
1898                              satOrgIOContext->interruptContext );
1899    return;
1900    break;
1901  default:
1902    TI_DBG1(("satNonChainedWriteNVerifyCB:  error default case command 0x%x success\n", hostToDevFis->h.command));
1903
1904    satSetSensePayload( pSense,
1905                        SCSI_SNSKEY_NO_SENSE,
1906                        0,
1907                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1908                        satOrgIOContext);
1909
1910    ostiInitiatorIOCompleted( tiRoot,
1911                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1912                              tiIOSuccess,
1913                              SCSI_STAT_CHECK_CONDITION,
1914                              satOrgIOContext->pTiSenseData,
1915                              satOrgIOContext->interruptContext );
1916
1917    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1918
1919    satFreeIntIoResource( tiRoot,
1920                          satDevData,
1921                          satIntIo);
1922    return;
1923    break;
1924  }
1925
1926  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1927
1928  /* free */
1929  satFreeIntIoResource( tiRoot,
1930                        satDevData,
1931                        satIntIo);
1932
1933  satNewIntIo = satAllocIntIoResource( tiRoot,
1934                                       tiOrgIORequest,
1935                                       satDevData,
1936                                       0,
1937                                       satNewIntIo);
1938  if (satNewIntIo == agNULL)
1939  {
1940    /* memory allocation failure */
1941    satFreeIntIoResource( tiRoot,
1942                          satDevData,
1943                          satNewIntIo);
1944
1945    satSetSensePayload( pSense,
1946                        SCSI_SNSKEY_NO_SENSE,
1947                        0,
1948                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1949                        satOrgIOContext);
1950
1951    ostiInitiatorIOCompleted( tiRoot,
1952                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1953                              tiIOSuccess,
1954                              SCSI_STAT_CHECK_CONDITION,
1955                              satOrgIOContext->pTiSenseData,
1956                              satOrgIOContext->interruptContext );
1957    TI_DBG1(("satNonChainedWriteNVerifyCB: momory allocation fails\n"));
1958    return;
1959  } /* end memory allocation */
1960
1961  satNewIOContext = satPrepareNewIO(
1962                                    satNewIntIo,
1963                                    tiOrgIORequest,
1964                                    satDevData,
1965                                    scsiCmnd,
1966                                    satOrgIOContext
1967                                    );
1968
1969  /* sends ATA verify command(READ_VERIFY_SECTORS or READ_VERIFY_SECTORS_EXT) */
1970  status = satNonChainedWriteNVerify_Verify(tiRoot,
1971                                             &satNewIntIo->satIntTiIORequest,
1972                                             satNewIOContext->ptiDeviceHandle,
1973                                             tiScsiRequest, /* orginal from OS layer */
1974                                             satNewIOContext
1975                                             );
1976
1977
1978  if (status != tiSuccess)
1979  {
1980    /* sending ATA command fails */
1981    satFreeIntIoResource( tiRoot,
1982                          satDevData,
1983                          satNewIntIo);
1984    satSetSensePayload( pSense,
1985                        SCSI_SNSKEY_NO_SENSE,
1986                        0,
1987                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1988                        satOrgIOContext);
1989
1990    ostiInitiatorIOCompleted( tiRoot,
1991                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1992                              tiIOSuccess,
1993                              SCSI_STAT_CHECK_CONDITION,
1994                              satOrgIOContext->pTiSenseData,
1995                              satOrgIOContext->interruptContext );
1996    TI_DBG1(("satNonChainedWriteNVerifyCB: calling satWriteAndVerify10_1 fails\n"));
1997    return;
1998  } /* end send fails */
1999
2000  return;
2001}
2002
2003
2004void satChainedWriteNVerifyCB(
2005                        agsaRoot_t        *agRoot,
2006                        agsaIORequest_t   *agIORequest,
2007                        bit32             agIOStatus,
2008                        agsaFisHeader_t   *agFirstDword,
2009                        bit32             agIOInfoLen,
2010                        void              *agParam,
2011                        void              *ioContext
2012                        )
2013{
2014  /*
2015    send write in loop
2016    then, send verify in loop
2017  */
2018  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
2019  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
2020  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
2021  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2022  tdIORequestBody_t       *tdIORequestBody;
2023  tdIORequestBody_t       *tdOrgIORequestBody;
2024  satIOContext_t          *satIOContext;
2025  satIOContext_t          *satOrgIOContext;
2026  satIOContext_t          *satNewIOContext;
2027  satInternalIo_t         *satIntIo;
2028  satInternalIo_t         *satNewIntIo = agNULL;
2029  satDeviceData_t         *satDevData;
2030  scsiRspSense_t            *pSense;
2031  tiIniScsiCmnd_t           *scsiCmnd;
2032  tiIORequest_t             *tiOrgIORequest;
2033
2034  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
2035  bit32                     ataStatus = 0;
2036  bit32                     dataLength;
2037  bit32                     status = tiError;
2038  agsaFisRegD2HHeader_t     *statDevToHostFisHeader = agNULL;
2039
2040  TI_DBG6(("satChainedWriteNVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
2041           agIORequest, agIOStatus, agIOInfoLen));
2042
2043
2044  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
2045  satIOContext           = (satIOContext_t *) ioContext;
2046  satIntIo               = satIOContext->satIntIoContext;
2047  satDevData             = satIOContext->pSatDevData;
2048  hostToDevFis           = satIOContext->pFis;
2049
2050  if (satIntIo == agNULL)
2051  {
2052    TI_DBG5(("satChainedWriteNVerifyCB: External satInternalIo_t satIntIoContext\n"));
2053    satOrgIOContext = satIOContext;
2054    tiOrgIORequest  = tdIORequestBody->tiIORequest;
2055    pSense          = satIOContext->pSense;
2056    scsiCmnd        = satIOContext->pScsiCmnd;
2057  }
2058  else
2059  {
2060    TI_DBG5(("satChainedWriteNVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
2061    satOrgIOContext        = satIOContext->satOrgIOContext;
2062    if (satOrgIOContext == agNULL)
2063    {
2064      TI_DBG5(("satChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n"));
2065      return;
2066    }
2067    else
2068    {
2069      TI_DBG5(("satChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n"));
2070    }
2071    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
2072    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
2073
2074    pSense        = satOrgIOContext->pSense;
2075    scsiCmnd      = satOrgIOContext->pScsiCmnd;
2076  }
2077
2078  tdIORequestBody->ioCompleted = agTRUE;
2079  tdIORequestBody->ioStarted = agFALSE;
2080
2081  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
2082  {
2083     TI_DBG1(("satChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
2084     satSetSensePayload( pSense,
2085                        SCSI_SNSKEY_NO_SENSE,
2086                        0,
2087                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
2088                        satOrgIOContext);
2089
2090     ostiInitiatorIOCompleted( tiRoot,
2091                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2092                              tiIOSuccess,
2093                              SCSI_STAT_CHECK_CONDITION,
2094                              satOrgIOContext->pTiSenseData,
2095                              satOrgIOContext->interruptContext );
2096
2097    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2098
2099    satFreeIntIoResource( tiRoot,
2100                          satDevData,
2101                          satIntIo);
2102    return;
2103  }
2104
2105  /*
2106    checking IO status, FIS type and error status
2107  */
2108  if (agIOStatus != OSSA_IO_SUCCESS)
2109  {
2110    /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read
2111       agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write
2112       first, assumed to be Reg Device to Host FIS
2113       This is OK to just find fis type
2114    */
2115    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
2116    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
2117    /* for debugging */
2118    if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) &&
2119        (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
2120        (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
2121        )
2122    {
2123      TI_DBG1(("satChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n", statDevToHostFisHeader->fisType));
2124    }
2125
2126    /* for debugging */
2127    if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
2128         (ataStatus & DF_ATA_STATUS_MASK)
2129         )
2130    {
2131      TI_DBG1(("satChainedWriteNVerifyCB: FAILED, error status and command 0x%x\n", hostToDevFis->h.command));
2132    }
2133
2134    /* the function below handles abort case */
2135    itdsatDelayedProcessAbnormalCompletion(agRoot,
2136                                           agIORequest,
2137                                           agIOStatus,
2138                                           agFirstDword,
2139                                           agIOInfoLen,
2140                                           agParam,
2141                                           satIOContext);
2142
2143    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2144    satFreeIntIoResource( tiRoot,
2145                          satDevData,
2146                          satIntIo);
2147    return;
2148  } /* end of error */
2149
2150  /* process the success case */
2151  switch (hostToDevFis->h.command)
2152  {
2153  case SAT_WRITE_DMA: /* fall through */
2154  case SAT_WRITE_SECTORS:/* fall through */
2155//  case SAT_WRITE_DMA_FUA_EXT: /* fall through */
2156  case SAT_WRITE_DMA_EXT: /* fall through */
2157  case SAT_WRITE_SECTORS_EXT: /* fall through */
2158  case SAT_WRITE_FPDMA_QUEUED:
2159
2160    TI_DBG5(("satChainedWriteNVerifyCB: WRITE success case\n"));
2161
2162    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2163
2164    /* done with internally genereated SAT_SMART_RETURN_STATUS */
2165    satFreeIntIoResource( tiRoot,
2166                          satDevData,
2167                          satIntIo);
2168    /* let's loop till TL */
2169
2170
2171    (satOrgIOContext->LoopNum)--;
2172
2173    if (satOrgIOContext->superIOFlag)
2174    {
2175      dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2176    }
2177    else
2178    {
2179      dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2180    }
2181
2182    satNewIntIo = satAllocIntIoResource( tiRoot,
2183                                         tiOrgIORequest,
2184                                         satDevData,
2185                                         dataLength,
2186                                         satNewIntIo);
2187    if (satNewIntIo == agNULL)
2188    {
2189      /* memory allocation failure */
2190      satFreeIntIoResource( tiRoot,
2191                            satDevData,
2192                            satNewIntIo);
2193      ostiInitiatorIOCompleted( tiRoot,
2194                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2195                                tiIOFailed,
2196                                tiDetailOtherError,
2197                                agNULL,
2198                                satOrgIOContext->interruptContext );
2199
2200      TI_DBG1(("satChainedWriteNVerifyCB: momory allocation fails\n"));
2201      return;
2202    } /* end of memory allocation failure */
2203
2204    /*
2205     * Need to initialize all the fields within satIOContext
2206     */
2207
2208    satNewIOContext = satPrepareNewIO(
2209                                      satNewIntIo,
2210                                      tiOrgIORequest,
2211                                      satDevData,
2212                                      scsiCmnd,
2213                                      satOrgIOContext
2214                                      );
2215
2216    if (satOrgIOContext->LoopNum == 0)
2217    {
2218      /*
2219        done with write
2220        start with verify
2221      */
2222      satOrgIOContext->LoopNum = satOrgIOContext->LoopNum2;
2223      status = satChainedWriteNVerify_Start_Verify(tiRoot,
2224                                    &satNewIntIo->satIntTiIORequest,
2225                                    satNewIOContext->ptiDeviceHandle,
2226                                    &satNewIntIo->satIntTiScsiXchg,
2227                                    satNewIOContext);
2228    }
2229    else
2230    {
2231      status = satChainedWriteNVerify_Write(tiRoot,
2232                                    &satNewIntIo->satIntTiIORequest,
2233                                    satNewIOContext->ptiDeviceHandle,
2234                                    &satNewIntIo->satIntTiScsiXchg,
2235                                    satNewIOContext);
2236    }
2237
2238    if (status != tiSuccess)
2239    {
2240      satFreeIntIoResource( tiRoot,
2241                            satDevData,
2242                            satNewIntIo);
2243      ostiInitiatorIOCompleted( tiRoot,
2244                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2245                                tiIOFailed,
2246                                tiDetailOtherError,
2247                                agNULL,
2248                                satOrgIOContext->interruptContext );
2249      TI_DBG1(("satChainedWriteNVerifyCB: calling satChainedWriteNVerify_Write fails\n"));
2250      return;
2251    }
2252
2253    break;
2254
2255  case SAT_READ_VERIFY_SECTORS: /* fall through */
2256  case SAT_READ_VERIFY_SECTORS_EXT:
2257    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2258
2259    /* done with internally genereated SAT_SMART_RETURN_STATUS */
2260    satFreeIntIoResource( tiRoot,
2261                          satDevData,
2262                          satIntIo);
2263    /* let's loop till TL */
2264
2265    /* lba = lba + tl
2266       loopnum--;
2267       if (loopnum == 0) done
2268     */
2269    (satOrgIOContext->LoopNum)--;
2270    if (satOrgIOContext->LoopNum == 0)
2271    {
2272      /*
2273        done with write and verify
2274      */
2275      ostiInitiatorIOCompleted( tiRoot,
2276                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2277                                tiIOSuccess,
2278                                SCSI_STAT_GOOD,
2279                                agNULL,
2280                                satOrgIOContext->interruptContext );
2281      return;
2282    }
2283
2284    if (satOrgIOContext->superIOFlag)
2285    {
2286      dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2287    }
2288    else
2289    {
2290      dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2291    }
2292
2293    satNewIntIo = satAllocIntIoResource( tiRoot,
2294                                         tiOrgIORequest,
2295                                         satDevData,
2296                                         dataLength,
2297                                         satNewIntIo);
2298    if (satNewIntIo == agNULL)
2299    {
2300      /* memory allocation failure */
2301      satFreeIntIoResource( tiRoot,
2302                            satDevData,
2303                            satNewIntIo);
2304      ostiInitiatorIOCompleted( tiRoot,
2305                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2306                                tiIOFailed,
2307                                tiDetailOtherError,
2308                                agNULL,
2309                                satOrgIOContext->interruptContext );
2310
2311      TI_DBG1(("satChainedWriteNVerifyCB: momory allocation fails\n"));
2312      return;
2313    } /* end of memory allocation failure */
2314
2315    /*
2316     * Need to initialize all the fields within satIOContext
2317     */
2318
2319    satNewIOContext = satPrepareNewIO(
2320                                      satNewIntIo,
2321                                      tiOrgIORequest,
2322                                      satDevData,
2323                                      scsiCmnd,
2324                                      satOrgIOContext
2325                                      );
2326    status = satChainedWriteNVerify_Verify(tiRoot,
2327                                    &satNewIntIo->satIntTiIORequest,
2328                                    satNewIOContext->ptiDeviceHandle,
2329                                    &satNewIntIo->satIntTiScsiXchg,
2330                                    satNewIOContext);
2331
2332    if (status != tiSuccess)
2333    {
2334      satFreeIntIoResource( tiRoot,
2335                            satDevData,
2336                            satNewIntIo);
2337      ostiInitiatorIOCompleted( tiRoot,
2338                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2339                                tiIOFailed,
2340                                tiDetailOtherError,
2341                                agNULL,
2342                                satOrgIOContext->interruptContext );
2343      TI_DBG1(("satChainedWriteNVerifyCB: calling satChainedWriteNVerify_Verify fails\n"));
2344      return;
2345    }
2346
2347    break;
2348
2349  default:
2350    TI_DBG1(("satChainedWriteNVerifyCB: success but default case command 0x%x\n",hostToDevFis->h.command));
2351    ostiInitiatorIOCompleted( tiRoot,
2352                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2353                              tiIOFailed,
2354                              tiDetailOtherError,
2355                              agNULL,
2356                              satOrgIOContext->interruptContext );
2357
2358    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2359
2360    satFreeIntIoResource( tiRoot,
2361                          satDevData,
2362                          satIntIo);
2363
2364    break;
2365  }
2366
2367
2368  return;
2369}
2370/*****************************************************************************
2371*! \brief  itdsatProcessAbnormalCompletion
2372*
2373*   This routine is called to complete error case for SATA request previously
2374*   issued to the LL Layer in saSATAStart()
2375*
2376*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
2377*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
2378*  \param   agIOStatus:  Status of completed I/O.
2379*  \param   agFirstDword:Pointer to the four bytes of FIS.
2380*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
2381*                        length.
2382*  \param   agParam:     Additional info based on status.
2383*  \param   ioContext:   Pointer to satIOContext_t.
2384*
2385*  \return: none
2386*
2387*****************************************************************************/
2388void  itdsatProcessAbnormalCompletion(
2389                           agsaRoot_t        *agRoot,
2390                           agsaIORequest_t   *agIORequest,
2391                           bit32             agIOStatus,
2392                           agsaFisHeader_t   *agFirstDword,
2393                           bit32             agIOInfoLen,
2394                           void              *agParam,
2395                           satIOContext_t    *satIOContext
2396                           )
2397{
2398
2399  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
2400  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
2401  bit32                interruptContext = osData->IntContext;
2402  tdIORequestBody_t    *tdIORequestBody;
2403  satDeviceData_t      *pSatDevData;
2404  tiDeviceHandle_t     *tiDeviceHandle;
2405  tdsaDeviceData_t     *oneDeviceData = agNULL;
2406  agsaDevHandle_t      *agDevHandle = agNULL;
2407
2408  TI_DBG5(("itdsatProcessAbnormalCompletion: agIORequest=%p agIOStatus=0x%x agIOInfoLen=%d\n",
2409          agIORequest, agIOStatus, agIOInfoLen));
2410
2411  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2412  pSatDevData     = satIOContext->pSatDevData;
2413  tiDeviceHandle  = satIOContext->ptiDeviceHandle;
2414
2415  /* Get into the detail */
2416  switch(agIOStatus)
2417  {
2418  case OSSA_IO_SUCCESS:
2419    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS agIOInfoLen %d calling osSatIOCompleted\n", agIOInfoLen));
2420    /*
2421     * At this point agIOInfoLen should be non-zero and there is valid FIS
2422     * to read. Pass this info to the SAT layer in order to do the ATA status
2423     * to SCSI status translation.
2424     */
2425      osSatIOCompleted( tiRoot,
2426                        tdIORequestBody->tiIORequest,
2427                        agFirstDword,
2428                        agIOInfoLen,
2429                        agParam,
2430                        satIOContext,
2431                        interruptContext);
2432    break;
2433
2434
2435  case OSSA_IO_ABORTED:
2436    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED\n"));
2437
2438    ostiInitiatorIOCompleted( tiRoot,
2439                              tdIORequestBody->tiIORequest,
2440                              tiIOFailed,
2441                              tiDetailAborted,
2442                              agNULL,
2443                              interruptContext);
2444
2445    if ( pSatDevData->satTmTaskTag != agNULL )
2446    {
2447      TI_DBG1(("itdsatProcessAbnormalCompletion: TM callback\n"));
2448      if (tiDeviceHandle == agNULL)
2449      {
2450        TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2451      }
2452      /* TM completed */
2453      ostiInitiatorEvent( tiRoot,
2454                          agNULL,               /* portalContext not used */
2455                          tiDeviceHandle,
2456                          tiIntrEventTypeTaskManagement,
2457                          tiTMOK,
2458                          pSatDevData->satTmTaskTag);
2459      /*
2460       * Reset flag
2461       */
2462      pSatDevData->satTmTaskTag = agNULL;
2463    }
2464
2465    /*
2466     * Check if we are in recovery mode and need to update the recovery flag
2467     */
2468    if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2469        (pSatDevData->satPendingIO == 0 ))
2470    {
2471      pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2472      TI_DBG1(("itdsatProcessAbnormalCompletion: STATE NORMAL.\n"));
2473    }
2474
2475    TI_DBG1(("itdsatProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2476    TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2477    TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2478
2479    break;
2480  case OSSA_IO_UNDERFLOW:
2481    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW\n"));
2482    ostiInitiatorIOCompleted( tiRoot,
2483                              tdIORequestBody->tiIORequest,
2484                              tiIOUnderRun,
2485                              agIOInfoLen,
2486                              agNULL,
2487                              interruptContext);
2488    break;
2489
2490
2491  case OSSA_IO_FAILED:
2492    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED\n"));
2493    ostiInitiatorIOCompleted( tiRoot,
2494                              tdIORequestBody->tiIORequest,
2495                              tiIOFailed,
2496                              tiDetailOtherError,
2497                              agNULL,
2498                              interruptContext);
2499    break;
2500
2501  case OSSA_IO_ABORT_RESET:
2502    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET\n"));
2503    ostiInitiatorIOCompleted( tiRoot,
2504                              tdIORequestBody->tiIORequest,
2505                              tiIOFailed,
2506                              tiDetailAbortReset,
2507                              agNULL,
2508                              interruptContext);
2509    /*
2510     * Check if we are in recovery mode and need to update the recovery flag
2511     */
2512    if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2513        (pSatDevData->satPendingIO == 0 ))
2514    {
2515      pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2516      TI_DBG1(("itdsatProcessAbnormalCompletion: STATE NORMAL.\n"));
2517    }
2518
2519    TI_DBG1(("itdsatProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2520    TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2521    TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2522
2523    break;
2524
2525
2526  case OSSA_IO_NO_DEVICE:
2527    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE\n"));
2528    ostiInitiatorIOCompleted( tiRoot,
2529                              tdIORequestBody->tiIORequest,
2530                              tiIOFailed,
2531                              tiDetailNoLogin,
2532                              agNULL,
2533                              interruptContext);
2534    break;
2535
2536  case OSSA_IO_PROG_ERROR:
2537    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR\n"));
2538    ostiInitiatorIOCompleted( tiRoot,
2539                              tdIORequestBody->tiIORequest,
2540                              tiIOFailed,
2541                              tiDetailOtherError,
2542                              agNULL,
2543                              interruptContext);
2544    break;
2545  case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */
2546  case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */
2547  case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */
2548  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */
2549  case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */
2550  case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: /* fall through */
2551  case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */
2552  case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */
2553    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x\n", agIOStatus));
2554    if (tiDeviceHandle == agNULL)
2555    {
2556      TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2557      ostiInitiatorIOCompleted( tiRoot,
2558                                tdIORequestBody->tiIORequest,
2559                                tiIOFailed,
2560                                tiDetailOtherError,
2561                                agNULL,
2562                                interruptContext);
2563      return;
2564    }
2565    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2566    if (oneDeviceData == agNULL)
2567    {
2568      TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2569    }
2570    else
2571    {
2572      TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2573    }
2574
2575    ostiInitiatorIOCompleted( tiRoot,
2576                              tdIORequestBody->tiIORequest,
2577                              tiIOFailed,
2578                              tiDetailOtherError,
2579                              agNULL,
2580                              interruptContext);
2581    break;
2582
2583  case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
2584    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
2585    ostiInitiatorIOCompleted( tiRoot,
2586                              tdIORequestBody->tiIORequest,
2587                              tiIOFailed,
2588                              tiDetailOtherError, //tiDetailNoDeviceError, //tiDetailAborted,
2589                              agNULL,
2590                              interruptContext);
2591    break;
2592
2593  case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */
2594  case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */
2595  case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */
2596  case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */
2597  case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */
2598  case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */
2599  case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */
2600    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x\n", agIOStatus));
2601    ostiInitiatorIOCompleted( tiRoot,
2602                              tdIORequestBody->tiIORequest,
2603                              tiIOFailed,
2604                              tiDetailOtherError,
2605                              agNULL,
2606                              interruptContext);
2607    break;
2608  case OSSA_IO_DS_IN_ERROR:
2609    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR\n"));
2610    if (tiDeviceHandle == agNULL)
2611    {
2612      TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2613      ostiInitiatorIOCompleted( tiRoot,
2614                                tdIORequestBody->tiIORequest,
2615                                tiIOFailed,
2616                                tiDetailOtherError,
2617                                agNULL,
2618                                interruptContext);
2619      return;
2620    }
2621    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2622    if (oneDeviceData == agNULL)
2623    {
2624      TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2625    }
2626    else
2627    {
2628      TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2629    }
2630    ostiInitiatorIOCompleted( tiRoot,
2631                              tdIORequestBody->tiIORequest,
2632                              tiIOFailed,
2633                              tiDetailOtherError,
2634                              agNULL,
2635                              interruptContext);
2636    break;
2637  case OSSA_IO_DS_NON_OPERATIONAL:
2638    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL\n"));
2639    if (tiDeviceHandle == agNULL)
2640    {
2641      TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2642      ostiInitiatorIOCompleted( tiRoot,
2643                                tdIORequestBody->tiIORequest,
2644                                tiIOFailed,
2645                                tiDetailOtherError,
2646                                agNULL,
2647                                interruptContext);
2648      return;
2649    }
2650    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2651    if (oneDeviceData == agNULL)
2652    {
2653      TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2654    }
2655    else
2656    {
2657      TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2658      agDevHandle = oneDeviceData->agDevHandle;
2659      if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
2660          oneDeviceData->tdPortContext != agNULL )
2661      {
2662        saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
2663      }
2664    }
2665
2666    ostiInitiatorIOCompleted( tiRoot,
2667                              tdIORequestBody->tiIORequest,
2668                              tiIOFailed,
2669                              tiDetailOtherError,
2670                              agNULL,
2671                              interruptContext);
2672    break;
2673  case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */
2674  case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
2675    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x\n", agIOStatus));
2676    itdsatEncryptionHandler(agRoot,
2677                            agIORequest,
2678                            agIOStatus,
2679                            agIOInfoLen,
2680                            agParam,
2681                            0);
2682    break;
2683  case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */
2684  case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */
2685  case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
2686    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x\n", agIOStatus));
2687    itdsatDifHandler(agRoot,
2688                     agIORequest,
2689                     agIOStatus,
2690                     agIOInfoLen,
2691                     agParam,
2692                     0);
2693    break;
2694  default:
2695    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2696    TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = unknown 0x%x\n", agIOStatus));
2697    if (oneDeviceData != agNULL)
2698    {
2699      TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2700    }
2701    else
2702    {
2703      TI_DBG1(("itdsatProcessAbnormalCompletion: oneDeviceData is NULL\n"));
2704    }
2705
2706    ostiInitiatorIOCompleted( tiRoot,
2707                              tdIORequestBody->tiIORequest,
2708                              tiIOFailed,
2709                              tiDetailOtherError,
2710                              agNULL,
2711                              interruptContext);
2712    break;
2713
2714  } /* switch */
2715}
2716
2717
2718/*****************************************************************************
2719*! \brief  itdsatDelayedProcessAbnormalCompletion
2720*
2721*   This routine is called to complete error case for SATA request previously
2722*   issued to the LL Layer in saSATAStart().
2723*   This is used when command is chained.
2724*
2725*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
2726*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
2727*  \param   agIOStatus:  Status of completed I/O.
2728*  \param   agFirstDword:Pointer to the four bytes of FIS.
2729*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
2730*                        length.
2731*  \param   agParam:     Additional info based on status.
2732*  \param   ioContext:   Pointer to satIOContext_t.
2733*
2734*  \return: none
2735*
2736*****************************************************************************/
2737void  itdsatDelayedProcessAbnormalCompletion(
2738                           agsaRoot_t        *agRoot,
2739                           agsaIORequest_t   *agIORequest,
2740                           bit32             agIOStatus,
2741                           agsaFisHeader_t   *agFirstDword,
2742                           bit32             agIOInfoLen,
2743                           void              *agParam,
2744                           satIOContext_t    *satIOContext
2745                           )
2746{
2747
2748  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
2749  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
2750  bit32                interruptContext = osData->IntContext;
2751  tdIORequestBody_t    *tdIORequestBody;
2752  satDeviceData_t      *pSatDevData;
2753  tiDeviceHandle_t     *tiDeviceHandle;
2754  tdsaDeviceData_t     *oneDeviceData = agNULL;
2755  agsaDevHandle_t      *agDevHandle = agNULL;
2756
2757  TI_DBG5(("itdsatDelayedProcessAbnormalCompletion: agIORequest=%p agIOStatus=0x%x agIOInfoLen=%d\n",
2758          agIORequest, agIOStatus, agIOInfoLen));
2759
2760  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2761  pSatDevData     = satIOContext->pSatDevData;
2762  tiDeviceHandle  = satIOContext->ptiDeviceHandle;
2763
2764  /* Get into the detail */
2765  switch(agIOStatus)
2766  {
2767  case OSSA_IO_SUCCESS:
2768    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS calling osSatIOCompleted\n"));
2769    /* do nothing */
2770    break;
2771
2772
2773  case OSSA_IO_ABORTED:
2774    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED\n"));
2775
2776    ostiInitiatorIOCompleted( tiRoot,
2777                              tdIORequestBody->tiIORequest,
2778                              tiIOFailed,
2779                              tiDetailAborted,
2780                              agNULL,
2781                              interruptContext);
2782
2783    if ( pSatDevData->satTmTaskTag != agNULL )
2784    {
2785      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: TM callback\n"));
2786      if (tiDeviceHandle == agNULL)
2787      {
2788        TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2789      }
2790      /* TM completed */
2791      ostiInitiatorEvent( tiRoot,
2792                          agNULL,               /* portalContext not used */
2793                          tiDeviceHandle,
2794                          tiIntrEventTypeTaskManagement,
2795                          tiTMOK,
2796                          pSatDevData->satTmTaskTag);
2797      /*
2798       * Reset flag
2799       */
2800      pSatDevData->satTmTaskTag = agNULL;
2801    }
2802
2803    /*
2804     * Check if we are in recovery mode and need to update the recovery flag
2805     */
2806    if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2807        (pSatDevData->satPendingIO == 0 ))
2808    {
2809      pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2810      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: STATE NORMAL.\n"));
2811    }
2812
2813    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2814    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2815    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2816
2817    break;
2818  case OSSA_IO_UNDERFLOW:
2819    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW\n"));
2820    ostiInitiatorIOCompleted( tiRoot,
2821                              tdIORequestBody->tiIORequest,
2822                              tiIOUnderRun,
2823                              agIOInfoLen,
2824                              agNULL,
2825                              interruptContext);
2826    break;
2827
2828
2829  case OSSA_IO_FAILED:
2830    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED\n"));
2831    ostiInitiatorIOCompleted( tiRoot,
2832                              tdIORequestBody->tiIORequest,
2833                              tiIOFailed,
2834                              tiDetailOtherError,
2835                              agNULL,
2836                              interruptContext);
2837    break;
2838
2839  case OSSA_IO_ABORT_RESET:
2840    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET\n"));
2841    ostiInitiatorIOCompleted( tiRoot,
2842                              tdIORequestBody->tiIORequest,
2843                              tiIOFailed,
2844                              tiDetailAbortReset,
2845                              agNULL,
2846                              interruptContext);
2847    /*
2848     * Check if we are in recovery mode and need to update the recovery flag
2849     */
2850    if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2851        (pSatDevData->satPendingIO == 0 ))
2852    {
2853      pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2854      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: STATE NORMAL.\n"));
2855    }
2856
2857    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2858    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2859    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2860
2861    break;
2862
2863
2864  case OSSA_IO_NO_DEVICE:
2865    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE\n"));
2866    ostiInitiatorIOCompleted( tiRoot,
2867                              tdIORequestBody->tiIORequest,
2868                              tiIOFailed,
2869                              tiDetailNoLogin,
2870                              agNULL,
2871                              interruptContext);
2872    break;
2873
2874  case OSSA_IO_PROG_ERROR:
2875    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR\n"));
2876    ostiInitiatorIOCompleted( tiRoot,
2877                              tdIORequestBody->tiIORequest,
2878                              tiIOFailed,
2879                              tiDetailOtherError,
2880                              agNULL,
2881                              interruptContext);
2882    break;
2883  case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */
2884  case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */
2885  case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */
2886  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */
2887  case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */
2888  case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: /* fall through */
2889  case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */
2890  case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */
2891    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x\n", agIOStatus));
2892    if (tiDeviceHandle == agNULL)
2893    {
2894      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2895      ostiInitiatorIOCompleted( tiRoot,
2896                                tdIORequestBody->tiIORequest,
2897                                tiIOFailed,
2898                                tiDetailOtherError,
2899                                agNULL,
2900                                interruptContext);
2901      return;
2902    }
2903    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2904    if (oneDeviceData == agNULL)
2905    {
2906      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2907    }
2908    else
2909    {
2910      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2911    }
2912    ostiInitiatorIOCompleted( tiRoot,
2913                              tdIORequestBody->tiIORequest,
2914                              tiIOFailed,
2915                              tiDetailOtherError,
2916                              agNULL,
2917                              interruptContext);
2918    break;
2919
2920  case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
2921    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
2922    ostiInitiatorIOCompleted( tiRoot,
2923                              tdIORequestBody->tiIORequest,
2924                              tiIOFailed,
2925                              tiDetailOtherError, //tiDetailNoDeviceError, //tiDetailAborted,
2926                              agNULL,
2927                              interruptContext);
2928    break;
2929
2930  case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */
2931  case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */
2932  case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */
2933  case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */
2934  case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */
2935  case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */
2936  case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */
2937    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x\n", agIOStatus));
2938
2939    ostiInitiatorIOCompleted( tiRoot,
2940                              tdIORequestBody->tiIORequest,
2941                              tiIOFailed,
2942                              tiDetailOtherError,
2943                              agNULL,
2944                              interruptContext);
2945    break;
2946  case OSSA_IO_DS_IN_ERROR:
2947    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR\n"));
2948    if (tiDeviceHandle == agNULL)
2949    {
2950      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2951      ostiInitiatorIOCompleted( tiRoot,
2952                                tdIORequestBody->tiIORequest,
2953                                tiIOFailed,
2954                                tiDetailOtherError,
2955                                agNULL,
2956                                interruptContext);
2957      return;
2958    }
2959    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2960    if (oneDeviceData == agNULL)
2961    {
2962      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2963    }
2964    else
2965    {
2966      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2967    }
2968    ostiInitiatorIOCompleted( tiRoot,
2969                              tdIORequestBody->tiIORequest,
2970                              tiIOFailed,
2971                              tiDetailOtherError,
2972                              agNULL,
2973                              interruptContext);
2974    break;
2975  case OSSA_IO_DS_NON_OPERATIONAL:
2976    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL\n"));
2977    if (tiDeviceHandle == agNULL)
2978    {
2979      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2980      ostiInitiatorIOCompleted( tiRoot,
2981                                tdIORequestBody->tiIORequest,
2982                                tiIOFailed,
2983                                tiDetailOtherError,
2984                                agNULL,
2985                                interruptContext);
2986      return;
2987    }
2988    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2989    if (oneDeviceData == agNULL)
2990    {
2991      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2992    }
2993    else
2994    {
2995      TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2996      agDevHandle = oneDeviceData->agDevHandle;
2997      if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
2998          oneDeviceData->tdPortContext != agNULL )
2999      {
3000        saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
3001      }
3002    }
3003    ostiInitiatorIOCompleted( tiRoot,
3004                              tdIORequestBody->tiIORequest,
3005                              tiIOFailed,
3006                              tiDetailOtherError,
3007                              agNULL,
3008                              interruptContext);
3009    break;
3010  case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */
3011  case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
3012    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x\n", agIOStatus));
3013    itdsatEncryptionHandler(agRoot,
3014                            agIORequest,
3015                            agIOStatus,
3016                            agIOInfoLen,
3017                            agParam,
3018                            0);
3019      break;
3020  case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */
3021  case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */
3022  case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
3023    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x\n", agIOStatus));
3024    itdsatDifHandler(agRoot,
3025                     agIORequest,
3026                     agIOStatus,
3027                     agIOInfoLen,
3028                     agParam,
3029                     0);
3030      break;
3031  default:
3032    TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = unknown\n"));
3033    ostiInitiatorIOCompleted( tiRoot,
3034                              tdIORequestBody->tiIORequest,
3035                              tiIOFailed,
3036                              tiDetailOtherError,
3037                              agNULL,
3038                              interruptContext);
3039    break;
3040
3041  } /* switch */
3042}
3043
3044/*****************************************************************************
3045*! \brief itdsatEncryptionHandler
3046*
3047*  Purpose:  This function processes I/Os completed and returned by SATA lower
3048*            layer with any encryption specific agIOStatus.
3049*
3050*  \param  agRoot:            pointer to port instance
3051*  \param  agIORequest:       pointer to I/O request
3052*  \param  agIOStatus:        I/O status given by LL layer
3053*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3054*  \param  agParam            A Handle used to refer to the response frame or handle
3055*                             of abort request
3056*  \return: None
3057*
3058*
3059*****************************************************************************/
3060osGLOBAL void
3061itdsatEncryptionHandler(
3062                       agsaRoot_t              *agRoot,
3063                       agsaIORequest_t         *agIORequest,
3064                       bit32                   agIOStatus,
3065                       bit32                   agIOInfoLen,
3066                       void                    *agParam,
3067                       bit32                   agOtherInfo
3068                       )
3069{
3070  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3071  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3072  bit32                  intContext = osData->IntContext;
3073  bit32                  errorDetail = tiDetailOtherError;
3074  tdIORequestBody_t      *tdIORequestBody;
3075  TI_DBG1(("itdsatEncryptionHandler: start\n"));
3076  TI_DBG1(("itdsatEncryptionHandler: agIOStatus 0x%x\n", agIOStatus));
3077
3078  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3079
3080  switch (agIOStatus)
3081  {
3082  case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
3083      TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS\n"));
3084      errorDetail = tiDetailDekKeyCacheMiss;
3085      break;
3086  case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID:
3087      TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID\n"));
3088      errorDetail = tiDetailCipherModeInvalid;
3089      break;
3090  case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH:
3091      TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH\n"));
3092      errorDetail = tiDetailDekIVMismatch;
3093      break;
3094  case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR:
3095      TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR\n"));
3096      errorDetail = tiDetailDekRamInterfaceError;
3097      break;
3098  default:
3099      TI_DBG1(("itdsatEncryptionHandler: other error!!! 0x%x\n", agIOStatus));
3100      errorDetail = tiDetailOtherError;
3101      break;
3102  }
3103
3104  ostiInitiatorIOCompleted (
3105                            tiRoot,
3106                            tdIORequestBody->tiIORequest,
3107                            tiIOEncryptError,
3108                            errorDetail,
3109                            agNULL,
3110                            intContext
3111                            );
3112  return;
3113}
3114
3115/*****************************************************************************
3116*! \brief itdsatDifHandler
3117*
3118*  Purpose:  This function processes I/Os completed and returned by SATA lower
3119*            layer with any DIF specific agIOStatus.
3120*
3121*  \param  agRoot:            pointer to port instance
3122*  \param  agIORequest:       pointer to I/O request
3123*  \param  agIOStatus:        I/O status given by LL layer
3124*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3125*  \param  agParam            A Handle used to refer to the response frame or handle
3126*                             of abort request
3127*  \return: None
3128*
3129*
3130*****************************************************************************/
3131osGLOBAL void
3132itdsatDifHandler(
3133                 agsaRoot_t              *agRoot,
3134                 agsaIORequest_t         *agIORequest,
3135                 bit32                   agIOStatus,
3136                 bit32                   agIOInfoLen,
3137                 void                    *agParam,
3138                 bit32                   agOtherInfo
3139                )
3140{
3141  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3142  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3143  bit32                  intContext = osData->IntContext;
3144  bit32                  errorDetail = tiDetailOtherError;
3145  tdIORequestBody_t      *tdIORequestBody;
3146#ifdef  TD_DEBUG_ENABLE
3147  agsaDifDetails_t       *DifDetail;
3148#endif
3149
3150  TI_DBG2(("itdsatDifHandler: start\n"));
3151  TI_DBG2(("itdsatDifHandler: agIOStatus 0x%x\n", agIOStatus));
3152
3153  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3154#ifdef  TD_DEBUG_ENABLE
3155  DifDetail = (agsaDifDetails_t *)agParam;
3156#endif
3157  switch (agIOStatus)
3158  {
3159  case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
3160      TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH\n"));
3161      errorDetail = tiDetailDifAppTagMismatch;
3162      break;
3163  case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
3164      TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH\n"));
3165      errorDetail = tiDetailDifRefTagMismatch;
3166      break;
3167  case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
3168      TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH\n"));
3169      errorDetail = tiDetailDifCrcMismatch;
3170      break;
3171  default:
3172      TI_DBG1(("itdsatDifHandler: other error!!! 0x%x\n", agIOStatus));
3173      errorDetail = tiDetailOtherError;
3174      break;
3175  }
3176
3177  TI_DBG1(("smsatDifHandler: DIF detail UpperLBA 0x%08x LowerLBA 0x%08x\n", DifDetail->UpperLBA, DifDetail->LowerLBA));
3178
3179  ostiInitiatorIOCompleted (
3180                            tiRoot,
3181                            tdIORequestBody->tiIORequest,
3182                            tiIODifError,
3183                            errorDetail,
3184                            agNULL,
3185                            intContext
3186                            );
3187  return;
3188}
3189
3190/*****************************************************************************/
3191/*! \brief satProcessAbort
3192 *
3193 *  This function processes abort.
3194 *
3195 *  \param   tiRoot:           Pointer to TISA initiator driver/port instance.
3196 *  \param   tiIORequest:      Pointer to TISA I/O request context for this I/O.
3197 *  \param   satIOContext_t:   Pointer to the SAT IO Context
3198 *
3199 *  \return
3200 *           None
3201 */
3202/*****************************************************************************/
3203void  satProcessAbort(
3204                      tiRoot_t          *tiRoot,
3205                      tiIORequest_t     *tiIORequest,
3206                      satIOContext_t    *satIOContext
3207                      )
3208{
3209  satDeviceData_t           *pSatDevData;
3210  //tiDeviceHandle_t          *tiDeviceHandle;
3211  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
3212
3213  TI_DBG5(("satProcessAbort: start\n"));
3214
3215  pSatDevData     = satIOContext->pSatDevData;
3216  //tiDeviceHandle  = satIOContext->ptiDeviceHandle;
3217  hostToDevFis    = satIOContext->pFis;
3218  if ( (hostToDevFis->h.command == SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE) &&
3219       (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
3220      )
3221  {
3222    /* no completion for send diagnotic in background. It is done in satSendDiagnostic() */
3223    ostiInitiatorIOCompleted( tiRoot,
3224                              tiIORequest,
3225                              tiIOFailed,
3226                              tiDetailAborted,
3227                              agNULL,
3228                              satIOContext->interruptContext);
3229  }
3230
3231  if ( pSatDevData->satTmTaskTag != agNULL )
3232  {
3233    TI_DBG1(("satProcessAbort: TM callback\n"));
3234    /*
3235     * Reset flag
3236     */
3237    pSatDevData->satTmTaskTag = agNULL;
3238  }
3239
3240  /*
3241   * Check if we are in recovery mode and need to update the recovery flag
3242   */
3243  if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
3244      (pSatDevData->satPendingIO == 0 ))
3245  {
3246    pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
3247    TI_DBG1(("satProcessAbort: STATE NORMAL.\n"));
3248  }
3249  TI_DBG1(("satProcessAbort: satDriveState %d\n", pSatDevData->satDriveState));
3250  TI_DBG1(("satProcessAbort: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
3251  TI_DBG1(("satProcessAbort: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
3252
3253
3254
3255  return;
3256}
3257
3258/*****************************************************************************
3259*! \brief  satNonDataIOCB
3260*
3261*   This routine is a callback function called from ossaSATACompleted().
3262*   This CB routine deals with non-data I/O SATA request.
3263*
3264*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
3265*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
3266*  \param   agIOStatus:  Status of completed I/O.
3267*  \param   agFirstDword:Pointer to the four bytes of FIS.
3268*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
3269*                        length.
3270*  \param   agParam:     Additional info based on status.
3271*  \param   ioContext:   Pointer to satIOContext_t.
3272*
3273*  \return: none
3274*
3275*****************************************************************************/
3276void satNonDataIOCB(
3277                    agsaRoot_t        *agRoot,
3278                    agsaIORequest_t   *agIORequest,
3279                    bit32             agIOStatus,
3280                    agsaFisHeader_t   *agFirstDword,
3281                    bit32             agIOInfoLen,
3282                    void              *agParam,
3283                    void              *ioContext
3284                    )
3285{
3286
3287  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
3288  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
3289  tdsaRoot_t           *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
3290  tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3291  tdIORequestBody_t    *tdIORequestBody;
3292  bit32                interruptContext = osData->IntContext;
3293  satIOContext_t       *satIOContext;
3294
3295  TI_DBG5(("satNonDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
3296    agIORequest, agIOStatus, agIOInfoLen));
3297
3298  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3299  satIOContext    = (satIOContext_t *) ioContext;
3300  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
3301
3302  tdIORequestBody->ioCompleted = agTRUE;
3303  tdIORequestBody->ioStarted = agFALSE;
3304
3305  /* Process completion */
3306  if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen==0))
3307  {
3308    /*
3309     * !!! We expect that agIOInfoLen should be non-zero !!!!.
3310     * Now call the OS-App Specific layer about this unexpected completion.
3311     */
3312    TI_DBG1(("satNonDataIOCB: *** ERROR***  agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
3313      agIORequest, agIOStatus, agIOInfoLen));
3314
3315    ostiInitiatorIOCompleted( tiRoot,
3316                              tdIORequestBody->tiIORequest,
3317                              tiIOFailed,
3318                              tiDetailOtherError,
3319                              agNULL,
3320                              interruptContext);
3321  }
3322  else
3323  {
3324    /* More checking needed, for non-data IO this should be the normal case */
3325    itdsatProcessAbnormalCompletion( agRoot,
3326                                     agIORequest,
3327                                     agIOStatus,
3328                                     agFirstDword,
3329                                     agIOInfoLen,
3330                                     agParam,
3331                                     satIOContext);
3332  }
3333
3334}
3335
3336/*****************************************************************************
3337*! \brief  tdssSATADeviceTypeDecode
3338*
3339*   This routine decodes ATA signature
3340*
3341*  \param   pSignature:       ATA signature
3342*
3343*
3344*  \return:
3345*          TRUE if ATA signature
3346*          FALSE otherwise
3347*
3348*****************************************************************************/
3349/*
3350  ATA p65
3351  PM p65
3352  SATAII p79, p80
3353 */
3354GLOBAL bit32
3355tdssSATADeviceTypeDecode(
3356                         bit8  *pSignature
3357                         )
3358{
3359  bit32 deviceType = UNKNOWN_DEVICE;
3360
3361  if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3362       && (pSignature)[2] == 0x00 && (pSignature)[3] == 0x00
3363       && (pSignature)[4] == 0xA0 )    /* this is the signature of a Hitachi SATA HDD*/
3364  {
3365    deviceType = SATA_ATA_DEVICE;
3366  }
3367  else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3368      && (pSignature)[2] == 0x00 && (pSignature)[3] == 0x00
3369      && (pSignature)[4] == 0x00 )
3370  {
3371    deviceType = SATA_ATA_DEVICE;
3372  }
3373  else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3374          && (pSignature)[2] == 0x14 && (pSignature)[3] == 0xEB
3375          && ( (pSignature)[4] == 0x00 || (pSignature)[4] == 0x10) )
3376  {
3377    deviceType = SATA_ATAPI_DEVICE;
3378  }
3379  else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3380          && (pSignature)[2] == 0x69 && (pSignature)[3] == 0x96
3381          && (pSignature)[4] == 0x00 )
3382  {
3383    deviceType = SATA_PM_DEVICE;
3384  }
3385  else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3386          && (pSignature)[2] == 0x3C && (pSignature)[3] == 0xC3
3387          && (pSignature)[4] == 0x00 )
3388  {
3389    deviceType = SATA_SEMB_DEVICE;
3390  }
3391  else if ( (pSignature)[0] == 0xFF && (pSignature)[1] == 0xFF
3392          && (pSignature)[2] == 0xFF && (pSignature)[3] == 0xFF
3393          && (pSignature)[4] == 0xFF )
3394  {
3395    deviceType = SATA_SEMB_WO_SEP_DEVICE;
3396  }
3397
3398  return deviceType;
3399}
3400
3401/*****************************************************************************
3402*! \brief ossaDiscoverSataCB
3403*
3404*  Purpose:  This function is called by lower layer to inform TD layer of
3405*            STP/SATA discovery results
3406*
3407*
3408*  \param   agRoot         Pointer to chip/driver Instance.
3409*  \param   agPortContext  Pointer to the port context of TD and Lower layer
3410*  \param   event          event type
3411*  \param   pParm1         Pointer to data associated with event
3412*  \param   pParm2         Pointer to data associated with event
3413*
3414*  \return: none
3415*
3416*  \note -  For details, refer to SAS/SATA Low-Level API Specification
3417*
3418*****************************************************************************/
3419
3420osGLOBAL void ossaDiscoverSataCB( agsaRoot_t        *agRoot,
3421                                  agsaPortContext_t *agPortContext,
3422                                  bit32             event,
3423                                  void              *pParm1,
3424                                  void              *pParm2
3425                                  )
3426{
3427  tdsaRootOsData_t      *osData;
3428  tiRoot_t              *tiRoot;
3429  tdsaPortContext_t     *onePortContext;
3430  tdsaDeviceData_t      *oneDeviceData;
3431  agsaDevHandle_t       *agDevHandle;
3432  agsaSATADeviceInfo_t  *agSATADeviceInfo;
3433  tiPortalContext_t     *tiPortalContext;
3434
3435  bit32                 devicetype = UNKNOWN_DEVICE;
3436
3437  osData          = (tdsaRootOsData_t *)agRoot->osData;
3438  tiRoot          = (tiRoot_t *)osData->tiRoot;
3439
3440  TI_DBG5(("ossaDiscoverSataCB: start\n"));
3441
3442  if (agPortContext == agNULL)
3443  {
3444    TI_DBG1(("ossaDiscoverSataCB: NULL agsaPortContext; wrong\n"));
3445    return;
3446  }
3447
3448  onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
3449  tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext;
3450
3451  switch ( event )
3452  {
3453    case OSSA_DISCOVER_STARTED:
3454    {
3455      TI_DBG5(("ossaDiscoverSataCB: STARTED\n"));
3456      /* Do nothing */
3457      break;
3458    }
3459
3460    case OSSA_DISCOVER_FOUND_DEVICE:
3461    {
3462      TI_DBG5(("ossaDiscoverSataCB: ***** FOUND DEVICE\n"));
3463      agDevHandle      = (agsaDevHandle_t *) pParm1;
3464      agSATADeviceInfo = (agsaSATADeviceInfo_t *) pParm2;
3465
3466      /* parse the device type */
3467      devicetype = tdssSATADeviceTypeDecode(agSATADeviceInfo->signature);
3468
3469
3470      /* for now, TD handles only ATA Device or ATAPI Device */
3471      if (devicetype == SATA_ATA_DEVICE || devicetype == SATA_ATAPI_DEVICE)
3472      {
3473        TI_DBG5(("ossaDiscoverSataCB: ***** adding ....\n"));
3474        /* Add SATA device */
3475        tdssAddSATAToSharedcontext( onePortContext,
3476                                    agRoot,
3477                                    agDevHandle,
3478                                    agSATADeviceInfo,
3479                                    agTRUE,
3480                                    agSATADeviceInfo->stpPhyIdentifier
3481                                    );
3482#ifdef INITIATOR_DRIVER
3483        ostiInitiatorEvent(
3484                           tiRoot,
3485                           tiPortalContext,
3486                           agNULL,
3487                           tiIntrEventTypeDeviceChange,
3488                           tiDeviceArrival,
3489                           agNULL
3490                           );
3491#endif
3492      } /* end of ATA_ATA_DEVICE or ATA_ATAPI_DEVICE */
3493      else
3494      {
3495        TI_DBG5(("ossaDiscoverSataCB: ***** not adding ..... devicetype 0x%x\n", devicetype));
3496      }
3497      break;
3498    }
3499
3500    case OSSA_DISCOVER_REMOVED_DEVICE:
3501    {
3502      TI_DBG1(("ossaDiscoverSataCB: REMOVED_DEVICE\n"));
3503      agDevHandle      = (agsaDevHandle_t *) pParm1;
3504      agSATADeviceInfo = (agsaSATADeviceInfo_t *) pParm2;
3505
3506      oneDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
3507
3508      TI_DBG1(("ossaDiscoverSataCB: signature: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
3509        agSATADeviceInfo->signature[0], agSATADeviceInfo->signature[1],
3510        agSATADeviceInfo->signature[2], agSATADeviceInfo->signature[3],
3511        agSATADeviceInfo->signature[4], agSATADeviceInfo->signature[5],
3512        agSATADeviceInfo->signature[6], agSATADeviceInfo->signature[7] ));
3513
3514      if (oneDeviceData == agNULL)
3515      {
3516        TI_DBG1(("ossaDiscoverSataCB: Wrong. DevHandle->osData is NULL but is being removed\n"));
3517      }
3518      tdssRemoveSATAFromSharedcontext( onePortContext,
3519                                       oneDeviceData,
3520                                       agRoot
3521                                       );
3522      agDevHandle->osData = agNULL;
3523#ifdef INITIATOR_DRIVER
3524      ostiInitiatorEvent(
3525                         tiRoot,
3526                         tiPortalContext,
3527                         agNULL,
3528                         tiIntrEventTypeDeviceChange,
3529                         tiDeviceRemoval,
3530                         agNULL
3531                         );
3532#endif
3533      break;
3534    }
3535
3536    case OSSA_DISCOVER_COMPLETE:
3537    {
3538      TI_DBG1(("ossaDiscoverSataCB: COMPLETE\n"));
3539      onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED;
3540      TI_DBG6(("ossaDiscoverSataCB: COMPLETE pid %d\n", onePortContext->id));
3541
3542      /* Let OS-Apps specific layer know discovery has been successfully complete */
3543      ostiInitiatorEvent( tiRoot,
3544                          tiPortalContext,
3545                          agNULL,
3546                          tiIntrEventTypeDiscovery,
3547                          tiDiscOK,
3548                          agNULL );
3549      break;
3550    }
3551
3552    case OSSA_DISCOVER_ABORT:
3553    {
3554      TI_DBG1(("ossaDiscoverSataCB: OSSA_DISCOVER_ABORT\n"));
3555      /* Let OS-Apps specific layer know discovery has failed */
3556      ostiInitiatorEvent( tiRoot,
3557                          tiPortalContext,
3558                          agNULL,
3559                          tiIntrEventTypeDiscovery,
3560                          tiDiscFailed,
3561                          agNULL );
3562
3563      break;
3564     }
3565
3566    default:
3567    {
3568       TI_DBG1(("ossaDiscoverSataCB: error default event 0x%x\n", event));
3569      /* Let OS-Apps specific layer know discovery has failed */
3570      ostiInitiatorEvent( tiRoot,
3571                          tiPortalContext,
3572                          agNULL,
3573                          tiIntrEventTypeDiscovery,
3574                          tiDiscFailed,
3575                          agNULL );
3576      break;
3577    }
3578
3579  } /* end of switch */
3580
3581  return;
3582}
3583
3584/*****************************************************************************
3585*! \brief tdssAddSataToSharedcontext
3586*
3587*  Purpose:  This function adds a discovered SATA device to a device list of
3588*            a port context
3589*
3590*  \param   tsddPortContext_Instance Pointer to the target port context
3591*  \param   agRoot                   Pointer to the root data structure of
3592*                                    TD and Lower layer
3593*  \param   agDevHandle              Pointer to a device handle
3594*  \param   agSATADeviceInfo         Pointer to SATA device info structure
3595*  \param   registered               indication flag for registration to LL
3596*
3597*  \Return: none
3598*
3599*****************************************************************************/
3600/* split into devicedata allocation/registration and sending identify device data */
3601osGLOBAL void
3602tdssAddSATAToSharedcontext( tdsaPortContext_t    *tdsaPortContext_Instance,
3603                            agsaRoot_t           *agRoot,
3604                            agsaDevHandle_t      *agDevHandle,
3605                            agsaSATADeviceInfo_t *agSATADeviceInfo,
3606                            bit32                 registered,
3607                            bit8                  phyID
3608                            )
3609{
3610  tdsaPortContext_t           *onePortContext = agNULL;
3611  tdList_t                    *PortContextList;
3612  tdsaDeviceData_t            *oneDeviceData = agNULL;
3613  tdList_t                    *DeviceListList = agNULL;
3614  tdsaRootOsData_t            *osData = (tdsaRootOsData_t *)agRoot->osData;
3615  tiRoot_t                    *tiRoot = (tiRoot_t *)osData->tiRoot;
3616  tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
3617  tdsaContext_t               *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3618  satDeviceData_t             *pSatDevData;
3619  bit32                       Indenom = tdsaAllShared->QueueConfig.numInboundQueues;
3620  bit32                       Outdenom = tdsaAllShared->QueueConfig.numOutboundQueues;
3621  bit8                        dev_s_rate = 0;
3622  bit8                        sasorsata = 1;
3623  bit8                        connectionRate;
3624  bit8                        flag = 0;
3625  bit8                        TLR = 0;
3626  bit32                       found = agFALSE;
3627  TI_DBG5(("tdssAddSataToSharedcontext: start\n"));
3628
3629  /*
3630   * Find a right portcontext, then get devicedata from FreeLink in DeviceList.
3631   * Then, add the devicedata to the portcontext.
3632   */
3633
3634  /* Find a right portcontext */
3635  PortContextList = tdsaAllShared->MainPortContextList.flink;
3636  while (PortContextList != &(tdsaAllShared->MainPortContextList))
3637  {
3638    onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList);
3639    if (onePortContext == tdsaPortContext_Instance)
3640    {
3641      TI_DBG5(("tdssAddSataToSharedcontext: found; oneportContext ID %d\n",
3642        onePortContext->id));
3643      found = agTRUE;
3644      break;
3645    }
3646    PortContextList = PortContextList->flink;
3647  }
3648
3649  if (found == agFALSE)
3650  {
3651    TI_DBG1(("tdssAddSataToSharedcontext: No corressponding tdsaPortContext\n"));
3652    return;
3653  }
3654
3655  /*
3656   1. add the devicedata
3657   2. Send Identify Device Data
3658   3. In CB of Identify Device Data (satAddSATAIDDevCB), finds out the devicedata is new or old
3659  */
3660
3661
3662  tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
3663  if (!TDLIST_NOT_EMPTY(&(tdsaAllShared->FreeDeviceList)))
3664  {
3665    tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
3666    TI_DBG1(("tdssAddSataToSharedcontext: ERROR empty DeviceData FreeLink\n"));
3667    /* notifying link up */
3668    ostiPortEvent (
3669                   tiRoot,
3670                   tiPortLinkUp,
3671                   tiSuccess,
3672                   (void *)tdsaAllShared->Ports[phyID].tiPortalContext
3673                   );
3674#ifdef INITIATOR_DRIVER
3675    /* triggers discovery */
3676    ostiPortEvent(
3677                  tiRoot,
3678                  tiPortDiscoveryReady,
3679                  tiSuccess,
3680                  (void *) tdsaAllShared->Ports[phyID].tiPortalContext
3681                  );
3682#endif
3683    return;
3684  }
3685
3686  TDLIST_DEQUEUE_FROM_HEAD(&DeviceListList, &(tdsaAllShared->FreeDeviceList));
3687  tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
3688  oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, FreeLink, DeviceListList);
3689  TDLIST_DEQUEUE_THIS(&(oneDeviceData->FreeLink));
3690
3691  TI_DBG1(("tdssAddSataToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
3692  oneDeviceData->InQID = oneDeviceData->id % Indenom;
3693  oneDeviceData->OutQID = oneDeviceData->id % Outdenom;
3694
3695  pSatDevData = (satDeviceData_t *)&(oneDeviceData->satDevData);
3696  pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
3697  pSatDevData->satPendingIO = 0;
3698  pSatDevData->satNCQMaxIO = 0;
3699  pSatDevData->satPendingNCQIO = 0;
3700  pSatDevData->satPendingNONNCQIO = 0;
3701  pSatDevData->IDDeviceValid = agFALSE;
3702  pSatDevData->satDeviceType = tdssSATADeviceTypeDecode(onePortContext->remoteSignature);
3703
3704  osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
3705
3706  onePortContext->Count++;
3707  oneDeviceData->DeviceType = TD_SATA_DEVICE; // either TD_SAS_DEVICE or TD_SATA_DEVICE
3708  oneDeviceData->agRoot = agRoot;
3709//  oneDeviceData->agDevHandle = agDevHandle;
3710
3711//  agDevHandle->osData = oneDeviceData; /* TD layer */
3712  oneDeviceData->tdPortContext = onePortContext;
3713  oneDeviceData->valid = agTRUE;
3714
3715  oneDeviceData->directlyAttached = agTRUE;
3716  oneDeviceData->initiator_ssp_stp_smp = 0;
3717  oneDeviceData->target_ssp_stp_smp = 0x1; /* setting SATA device bit */
3718  oneDeviceData->phyID = phyID;
3719
3720  /* parse sasIDframe to fill in agDeviceInfo */
3721  flag = (bit8)((phyID << 4) | TLR);
3722  DEVINFO_PUT_SMPTO(&oneDeviceData->agDeviceInfo, DEFAULT_SMP_TIMEOUT);
3723  DEVINFO_PUT_ITNEXUSTO(&oneDeviceData->agDeviceInfo, (bit16)tdsaAllShared->itNexusTimeout);
3724  DEVINFO_PUT_FBS(&oneDeviceData->agDeviceInfo, 0);
3725  //temp
3726  //DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, 0);
3727  DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, flag);
3728
3729  sasorsata = SATA_DEVICE_TYPE; /* SATA disk */
3730  connectionRate = onePortContext->LinkRate;
3731  dev_s_rate = (bit8)(dev_s_rate | (sasorsata << 4));
3732  dev_s_rate = (bit8)(dev_s_rate | connectionRate);
3733  DEVINFO_PUT_DEV_S_RATE(&oneDeviceData->agDeviceInfo, dev_s_rate);
3734
3735  DEVINFO_PUT_SAS_ADDRESSLO(
3736                            &oneDeviceData->agDeviceInfo,
3737                            0
3738                            );
3739  DEVINFO_PUT_SAS_ADDRESSHI(
3740                            &oneDeviceData->agDeviceInfo,
3741                            0
3742                            );
3743
3744  if (pSatDevData->satDeviceType == SATA_ATAPI_DEVICE )
3745  {
3746     oneDeviceData->agDeviceInfo.flag |= ATAPI_DEVICE_FLAG; /* ATAPI device flag*/
3747  }
3748
3749  oneDeviceData->agContext.osData = oneDeviceData;
3750  oneDeviceData->agContext.sdkData = agNULL;
3751
3752  if (oneDeviceData->registered == agFALSE)
3753  {
3754    saRegisterNewDevice(  /* tdssAddSATAToSharedcontext  */
3755                        agRoot,
3756                        &oneDeviceData->agContext,
3757                        0,/*tdsaRotateQnumber(tiRoot, oneDeviceData),*/
3758                        &oneDeviceData->agDeviceInfo,
3759                        onePortContext->agPortContext,
3760                        0
3761                        );
3762  }
3763  return;
3764}
3765/*****************************************************************************
3766*! \brief tdssRetrySATAID
3767*
3768*  Purpose:  This function retries identify device data to directly attached SATA
3769*            device after device registration
3770*
3771*  \param   tiRoot:           Pointer to TISA initiator driver/port instance.
3772*  \param   oneDeviceData     Pointer to a device data
3773*  \Return: none
3774*
3775*****************************************************************************/
3776osGLOBAL void
3777tdssRetrySATAID( tiRoot_t             *tiRoot,
3778                 tdsaDeviceData_t     *oneDeviceData
3779               )
3780{
3781  tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
3782  tdsaContext_t               *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3783  void                        *osMemHandle;
3784  tdIORequestBody_t           *tdIORequestBody;
3785  bit32                       PhysUpper32;
3786  bit32                       PhysLower32;
3787  bit32                       memAllocStatus;
3788  agsaIORequest_t             *agIORequest = agNULL; /* identify device data itself */
3789  satIOContext_t              *satIOContext = agNULL;
3790  bit32                       status;
3791
3792  TI_DBG5(("tdssRetrySATAID: start\n"));
3793  /* allocate identify device data and sends it */
3794  /* allocation tdIORequestBody and pass it to satTM() */
3795  memAllocStatus = ostiAllocMemory(
3796                                   tiRoot,
3797                                   &osMemHandle,
3798                                   (void **)&tdIORequestBody,
3799                                   &PhysUpper32,
3800                                   &PhysLower32,
3801                                   8,
3802                                   sizeof(tdIORequestBody_t),
3803                                   agTRUE
3804                                   );
3805
3806  if (memAllocStatus != tiSuccess)
3807  {
3808    TI_DBG1(("tdssRetrySATAID: ostiAllocMemory failed... loc 2\n"));
3809    /* notifying link up */
3810    ostiPortEvent (
3811                   tiRoot,
3812                   tiPortLinkUp,
3813                   tiSuccess,
3814                   (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3815                   );
3816#ifdef INITIATOR_DRIVER
3817    /* triggers discovery */
3818    ostiPortEvent(
3819                  tiRoot,
3820                  tiPortDiscoveryReady,
3821                  tiSuccess,
3822                  (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3823                  );
3824#endif
3825
3826    return;
3827  }
3828
3829  if (tdIORequestBody == agNULL)
3830  {
3831    TI_DBG1(("tdssRetrySATAID: ostiAllocMemory returned NULL tdIORequestBody loc 2\n"));
3832    /* notifying link up */
3833    ostiPortEvent (
3834                   tiRoot,
3835                   tiPortLinkUp,
3836                   tiSuccess,
3837                   (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3838                   );
3839#ifdef INITIATOR_DRIVER
3840    /* triggers discovery */
3841    ostiPortEvent(
3842                  tiRoot,
3843                  tiPortDiscoveryReady,
3844                  tiSuccess,
3845                  (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3846                  );
3847#endif
3848
3849    return;
3850  }
3851
3852  /* setup identify device data IO structure */
3853  tdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
3854  tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL;
3855  tdIORequestBody->IOType.InitiatorTMIO.TaskTag = agNULL;
3856
3857  /* initialize tiDevhandle */
3858  tdIORequestBody->tiDevHandle = &(oneDeviceData->tiDeviceHandle);
3859  tdIORequestBody->tiDevHandle->tdData = oneDeviceData;
3860
3861  /* initialize tiIORequest */
3862  tdIORequestBody->tiIORequest = agNULL;
3863
3864  /* initialize agIORequest */
3865  agIORequest = &(tdIORequestBody->agIORequest);
3866  agIORequest->osData = (void *) tdIORequestBody;
3867  agIORequest->sdkData = agNULL; /* SA takes care of this */
3868
3869  /* set up satIOContext */
3870  satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
3871  satIOContext->pSatDevData   = &(oneDeviceData->satDevData);
3872  satIOContext->pFis          =
3873    &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
3874
3875
3876  satIOContext->tiRequestBody = tdIORequestBody;
3877  satIOContext->ptiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
3878  satIOContext->tiScsiXchg = agNULL;
3879  satIOContext->satIntIoContext  = agNULL;
3880  satIOContext->satOrgIOContext  = agNULL;
3881
3882  /* followings are used only for internal IO */
3883  satIOContext->currentLBA = 0;
3884  satIOContext->OrgTL = 0;
3885
3886
3887  satIOContext->satToBeAbortedIOContext = agNULL;
3888
3889  satIOContext->NotifyOS = agFALSE;
3890
3891  satIOContext->pid = tdsaAllShared->Ports[oneDeviceData->phyID].portContext->id;
3892
3893  status = satAddSATAStartIDDev(tiRoot,
3894                                agNULL,
3895                                &(oneDeviceData->tiDeviceHandle),
3896                                agNULL,
3897                                satIOContext
3898                                );
3899
3900  /* assumption; always new device data */
3901
3902
3903  if (status == tiSuccess)
3904  {
3905    TI_DBG6(("tdssRetrySATAID: successfully sent identify device data\n"));
3906    TI_DBG6(("tdssRetrySATAID: one case did %d \n", oneDeviceData->id));
3907  }
3908  else
3909  {
3910    TI_DBG1(("tdssRetrySATAID: failed in sending identify device data\n"));
3911    /* put onedevicedata back to free list */
3912    tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
3913    TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
3914    tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
3915    /* notifying link up */
3916    ostiPortEvent (
3917                   tiRoot,
3918                   tiPortLinkUp,
3919                   tiSuccess,
3920                   (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3921                   );
3922#ifdef INITIATOR_DRIVER
3923    /* triggers discovery */
3924    ostiPortEvent(
3925                  tiRoot,
3926                  tiPortDiscoveryReady,
3927                  tiSuccess,
3928                  (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3929                  );
3930#endif
3931
3932  }
3933
3934  return;
3935}
3936
3937/*****************************************************************************
3938*! \brief tdssSubAddSATAToSharedcontext
3939*
3940*  Purpose:  This function sends identify device data to directly attached SATA
3941*            device after device registration
3942*
3943*  \param   tiRoot:           Pointer to TISA initiator driver/port instance.
3944*  \param   oneDeviceData     Pointer to a device data
3945*  \Return: none
3946*
3947*****************************************************************************/
3948osGLOBAL void
3949tdssSubAddSATAToSharedcontext( tiRoot_t             *tiRoot,
3950                               tdsaDeviceData_t     *oneDeviceData
3951                              )
3952{
3953  tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
3954  tdsaContext_t               *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3955  void                        *osMemHandle;
3956  tdIORequestBody_t           *tdIORequestBody;
3957  bit32                       PhysUpper32;
3958  bit32                       PhysLower32;
3959  bit32                       memAllocStatus;
3960  agsaIORequest_t             *agIORequest = agNULL; /* identify device data itself */
3961  satIOContext_t              *satIOContext = agNULL;
3962  bit32                       status;
3963
3964  TI_DBG1(("tdssSubAddSATAToSharedcontext: start\n"));
3965  /* allocate identify device data and sends it */
3966  /* allocation tdIORequestBody and pass it to satTM() */
3967  memAllocStatus = ostiAllocMemory(
3968                                   tiRoot,
3969                                   &osMemHandle,
3970                                   (void **)&tdIORequestBody,
3971                                   &PhysUpper32,
3972                                   &PhysLower32,
3973                                   8,
3974                                   sizeof(tdIORequestBody_t),
3975                                   agTRUE
3976                                   );
3977
3978  if (memAllocStatus != tiSuccess)
3979  {
3980    TI_DBG1(("tdssSubAddSATAToSharedcontext: ostiAllocMemory failed... loc 2\n"));
3981    /* notifying link up */
3982    ostiPortEvent (
3983                   tiRoot,
3984                   tiPortLinkUp,
3985                   tiSuccess,
3986                   (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3987                   );
3988#ifdef INITIATOR_DRIVER
3989    /* triggers discovery */
3990    ostiPortEvent(
3991                  tiRoot,
3992                  tiPortDiscoveryReady,
3993                  tiSuccess,
3994                  (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3995                  );
3996#endif
3997
3998    return;
3999  }
4000
4001  if (tdIORequestBody == agNULL)
4002  {
4003    TI_DBG1(("tdssSubAddSATAToSharedcontext: ostiAllocMemory returned NULL tdIORequestBody loc 2\n"));
4004    /* notifying link up */
4005    ostiPortEvent (
4006                   tiRoot,
4007                   tiPortLinkUp,
4008                   tiSuccess,
4009                   (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4010                   );
4011#ifdef INITIATOR_DRIVER
4012    /* triggers discovery */
4013    ostiPortEvent(
4014                  tiRoot,
4015                  tiPortDiscoveryReady,
4016                  tiSuccess,
4017                  (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4018                  );
4019#endif
4020
4021    return;
4022  }
4023
4024  /* setup identify device data IO structure */
4025  tdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
4026  tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL;
4027  tdIORequestBody->IOType.InitiatorTMIO.TaskTag = agNULL;
4028
4029  /* initialize tiDevhandle */
4030  tdIORequestBody->tiDevHandle = &(oneDeviceData->tiDeviceHandle);
4031  tdIORequestBody->tiDevHandle->tdData = oneDeviceData;
4032
4033  /* initialize tiIORequest */
4034  tdIORequestBody->tiIORequest = agNULL;
4035
4036  /* initialize agIORequest */
4037  agIORequest = &(tdIORequestBody->agIORequest);
4038  agIORequest->osData = (void *) tdIORequestBody;
4039  agIORequest->sdkData = agNULL; /* SA takes care of this */
4040
4041  /* set up satIOContext */
4042  satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
4043  satIOContext->pSatDevData   = &(oneDeviceData->satDevData);
4044  satIOContext->pFis          =
4045    &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
4046
4047
4048  satIOContext->tiRequestBody = tdIORequestBody;
4049  satIOContext->ptiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
4050  satIOContext->tiScsiXchg = agNULL;
4051  satIOContext->satIntIoContext  = agNULL;
4052  satIOContext->satOrgIOContext  = agNULL;
4053
4054  /* followings are used only for internal IO */
4055  satIOContext->currentLBA = 0;
4056  satIOContext->OrgTL = 0;
4057
4058
4059  satIOContext->satToBeAbortedIOContext = agNULL;
4060
4061  satIOContext->NotifyOS = agFALSE;
4062
4063  satIOContext->pid = tdsaAllShared->Ports[oneDeviceData->phyID].portContext->id;
4064
4065  status = satAddSATAStartIDDev(tiRoot,
4066                                agNULL,
4067                                &(oneDeviceData->tiDeviceHandle),
4068                                agNULL,
4069                                satIOContext
4070                                );
4071
4072  /* assumption; always new device data */
4073
4074
4075  if (status == tiSuccess)
4076  {
4077    TI_DBG6(("tdssSubAddSATAToSharedcontext: successfully sent identify device data\n"));
4078
4079    /* Add the devicedata to the mainlink */
4080    tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
4081    TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList));
4082    tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
4083    TI_DBG6(("tdssSubAddSATAToSharedcontext: one case did %d \n", oneDeviceData->id));
4084  }
4085  else
4086  {
4087    TI_DBG1(("tdssSubAddSATAToSharedcontext: failed in sending identify device data\n"));
4088    /* put onedevicedata back to free list */
4089    tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
4090    TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
4091    tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
4092    /* notifying link up */
4093    ostiPortEvent (
4094                   tiRoot,
4095                   tiPortLinkUp,
4096                   tiSuccess,
4097                   (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4098                   );
4099#ifdef INITIATOR_DRIVER
4100    /* triggers discovery */
4101    ostiPortEvent(
4102                  tiRoot,
4103                  tiPortDiscoveryReady,
4104                  tiSuccess,
4105                  (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4106                  );
4107#endif
4108
4109  }
4110
4111  return;
4112}
4113
4114
4115/*****************************************************************************
4116*! \brief tdssRemoveSATAFromSharedcontext
4117*
4118*  Purpose:  This function removes a discovered device from a device list of
4119*            a port context
4120*
4121*  \param   tsddPortContext_Ins      Pointer to the target port context
4122*  \param   tdsaDeviceData_Ins       Pointer to the target device
4123*  \param   agRoot                   Pointer to the root data structure of
4124*                                    TD and Lower layer
4125
4126*
4127*  \Return: none
4128*
4129*****************************************************************************/
4130osGLOBAL void
4131tdssRemoveSATAFromSharedcontext(
4132                               tdsaPortContext_t *tdsaPortContext_Ins,
4133                               tdsaDeviceData_t  *tdsaDeviceData_ins,
4134                               agsaRoot_t        *agRoot
4135                               )
4136{
4137  TI_DBG1(("tdssRemoveSATAFromSharedcontex: start\n"));
4138  return;
4139}
4140
4141
4142/*****************************************************************************
4143*! \brief satSetDevInfo
4144*
4145*  Purpose:  Based on ATA identify device data, this functions sets fields of
4146*            device data maintained in TD layer
4147*
4148*  \param   satDevData          Pointer to a device data
4149*  \param   SATAIdData          Pointer to ATA identify device data
4150*
4151*
4152*  \Return: none
4153*
4154*****************************************************************************/
4155void satSetDevInfo(
4156                   satDeviceData_t           *satDevData,
4157                   agsaSATAIdentifyData_t    *SATAIdData
4158                   )
4159{
4160  TI_DBG3(("satSetDevInfo: start\n"));
4161
4162  satDevData->satDriveState = SAT_DEV_STATE_NORMAL;
4163  satDevData->satFormatState = agFALSE;
4164  satDevData->satDeviceFaultState = agFALSE;
4165  satDevData->satTmTaskTag  = agNULL;
4166  satDevData->satAbortAfterReset = agFALSE;
4167  satDevData->satAbortCalled = agFALSE;
4168  satDevData->satSectorDone  = 0;
4169
4170  /* Qeueu depth, Word 75 */
4171  satDevData->satNCQMaxIO = SATAIdData->queueDepth + 1;
4172  TI_DBG3(("satSetDevInfo: max queue depth %d\n",satDevData->satNCQMaxIO));
4173
4174  /* Support NCQ, if Word 76 bit 8 is set */
4175  if (SATAIdData->sataCapabilities & 0x100)
4176  {
4177    TI_DBG3(("satSetDevInfo: device supports NCQ\n"));
4178    satDevData->satNCQ   = agTRUE;
4179  }
4180  else
4181  {
4182    TI_DBG3(("satSetDevInfo: no NCQ\n"));
4183    satDevData->satNCQ = agFALSE;
4184  }
4185
4186  /* Support 48 bit addressing, if Word 83 bit 10 and Word 86 bit 10 are set */
4187  if ((SATAIdData->commandSetSupported1 & 0x400) &&
4188      (SATAIdData->commandSetFeatureEnabled1 & 0x400) )
4189  {
4190    TI_DBG3(("satSetDevInfo: support 48 bit addressing\n"));
4191    satDevData->sat48BitSupport = agTRUE;
4192  }
4193  else
4194  {
4195    TI_DBG3(("satSetDevInfo: NO 48 bit addressing\n"));
4196    satDevData->sat48BitSupport = agFALSE;
4197  }
4198
4199  /* Support SMART Self Test, word84 bit 1 */
4200  if (SATAIdData->commandSetFeatureSupportedExt & 0x02)
4201  {
4202    TI_DBG3(("satSetDevInfo: SMART self-test supported \n"));
4203    satDevData->satSMARTSelfTest   = agTRUE;
4204  }
4205  else
4206  {
4207    TI_DBG3(("satSetDevInfo: no SMART self-test suppored\n"));
4208    satDevData->satSMARTSelfTest = agFALSE;
4209  }
4210
4211
4212
4213  /* Support SMART feature set, word82 bit 0 */
4214  if (SATAIdData->commandSetSupported & 0x01)
4215  {
4216    TI_DBG3(("satSetDevInfo: SMART feature set supported \n"));
4217    satDevData->satSMARTFeatureSet   = agTRUE;
4218  }
4219  else
4220  {
4221    TI_DBG3(("satSetDevInfo: no SMART feature set suppored\n"));
4222    satDevData->satSMARTFeatureSet = agFALSE;
4223  }
4224
4225
4226
4227  /* Support SMART enabled, word85 bit 0 */
4228  if (SATAIdData->commandSetFeatureEnabled & 0x01)
4229  {
4230    TI_DBG3(("satSetDevInfo: SMART enabled \n"));
4231    satDevData->satSMARTEnabled   = agTRUE;
4232  }
4233  else
4234  {
4235    TI_DBG3(("satSetDevInfo: no SMART enabled\n"));
4236    satDevData->satSMARTEnabled = agFALSE;
4237  }
4238
4239  satDevData->satVerifyState = 0;
4240
4241  /* Removable Media feature set support, word82 bit 2 */
4242  if (SATAIdData->commandSetSupported & 0x4)
4243  {
4244    TI_DBG3(("satSetDevInfo: Removable Media supported \n"));
4245    satDevData->satRemovableMedia   = agTRUE;
4246  }
4247  else
4248  {
4249    TI_DBG3(("satSetDevInfo: no Removable Media suppored\n"));
4250    satDevData->satRemovableMedia = agFALSE;
4251  }
4252
4253  /* Removable Media feature set enabled, word 85, bit 2 */
4254  if (SATAIdData->commandSetFeatureEnabled & 0x4)
4255  {
4256    TI_DBG3(("satSetDevInfo: Removable Media enabled\n"));
4257    satDevData->satRemovableMediaEnabled   = agTRUE;
4258  }
4259  else
4260  {
4261    TI_DBG3(("satSetDevInfo: no Removable Media enabled\n"));
4262    satDevData->satRemovableMediaEnabled = agFALSE;
4263  }
4264
4265  /* DMA Support, word49 bit8 */
4266  if (SATAIdData->dma_lba_iod_ios_stimer & 0x100)
4267  {
4268    TI_DBG3(("satSetDevInfo: DMA supported \n"));
4269    satDevData->satDMASupport   = agTRUE;
4270  }
4271  else
4272  {
4273    TI_DBG3(("satSetDevInfo: no DMA suppored\n"));
4274    satDevData->satDMASupport = agFALSE;
4275  }
4276
4277  /* DMA Enabled, word88 bit0-6, bit8-14*/
4278  /* 0x7F7F = 0111 1111 0111 1111*/
4279  if (SATAIdData->ultraDMAModes & 0x7F7F)
4280  {
4281    TI_DBG3(("satSetDevInfo: DMA enabled \n"));
4282    satDevData->satDMAEnabled   = agTRUE;
4283  }
4284  else
4285  {
4286    TI_DBG3(("satSetDevInfo: no DMA enabled\n"));
4287    satDevData->satDMAEnabled = agFALSE;
4288  }
4289
4290  /*
4291    setting MaxUserAddrSectors: max user addressable setctors
4292    word60 - 61, should be 0x 0F FF FF FF
4293  */
4294  satDevData->satMaxUserAddrSectors
4295    = (SATAIdData->numOfUserAddressableSectorsHi << (8*2) )
4296    + SATAIdData->numOfUserAddressableSectorsLo;
4297  TI_DBG3(("satSetDevInfo: MaxUserAddrSectors 0x%x decimal %d\n", satDevData->satMaxUserAddrSectors, satDevData->satMaxUserAddrSectors));
4298  /* Support DMADIR, if Word 62 bit 8 is set */
4299  if (SATAIdData->word62_74[0] & 0x8000)
4300  {
4301     TI_DBG3(("satSetDevInfo: DMADIR enabled\n"));
4302     satDevData->satDMADIRSupport   = agTRUE;
4303  }
4304  else
4305  {
4306     TI_DBG3(("satSetDevInfo: DMADIR disabled\n"));
4307     satDevData->satDMADIRSupport   = agFALSE;
4308  }
4309
4310
4311  /* write cache enabled for caching mode page SAT Table 67 p69, word85 bit5 */
4312  if (SATAIdData->commandSetFeatureEnabled & 0x20)
4313  {
4314    TI_DBG3(("satSetDevInfo: write cache enabled\n"));
4315    satDevData->satWriteCacheEnabled   = agTRUE;
4316  }
4317  else
4318  {
4319    TI_DBG3(("satSetDevInfo: no write cache enabled\n"));
4320    satDevData->satWriteCacheEnabled = agFALSE;
4321  }
4322
4323  /* look ahead enabled for caching mode page SAT Table 67 p69, word85 bit6 */
4324  if (SATAIdData->commandSetFeatureEnabled & 0x40)
4325  {
4326    TI_DBG3(("satSetDevInfo: look ahead enabled\n"));
4327    satDevData->satLookAheadEnabled   = agTRUE;
4328  }
4329  else
4330  {
4331    TI_DBG3(("satSetDevInfo: no look ahead enabled\n"));
4332    satDevData->satLookAheadEnabled = agFALSE;
4333  }
4334
4335  /* Support WWN, if Word 87 bit 8 is set */
4336  if (SATAIdData->commandSetFeatureDefault & 0x100)
4337  {
4338    TI_DBG3(("satSetDevInfo: device supports WWN\n"));
4339    satDevData->satWWNSupport   = agTRUE;
4340  }
4341  else
4342  {
4343    TI_DBG3(("satSetDevInfo: no WWN\n"));
4344    satDevData->satWWNSupport = agFALSE;
4345  }
4346
4347
4348  return;
4349}
4350
4351/*****************************************************************************
4352*! \brief  satInquiryCB
4353*
4354*   This routine is a callback function for satInquiry()
4355*
4356*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
4357*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
4358*  \param   agIOStatus:  Status of completed I/O.
4359*  \param   agFirstDword:Pointer to the four bytes of FIS.
4360*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
4361*                        length.
4362*  \param   agParam:     Additional info based on status.
4363*  \param   ioContext:   Pointer to satIOContext_t.
4364*
4365*  \return: none
4366*
4367*****************************************************************************/
4368void satInquiryCB(
4369                   agsaRoot_t        *agRoot,
4370                   agsaIORequest_t   *agIORequest,
4371                   bit32             agIOStatus,
4372                   agsaFisHeader_t   *agFirstDword,
4373                   bit32             agIOInfoLen,
4374                   void              *agParam,
4375                   void              *ioContext
4376                   )
4377{
4378  /*
4379    In the process of Inquiry
4380    Process SAT_IDENTIFY_DEVICE
4381  */
4382  tdsaRootOsData_t         *osData = (tdsaRootOsData_t *)agRoot->osData;
4383  tiRoot_t                 *tiRoot = (tiRoot_t *)osData->tiRoot;
4384  tdsaRoot_t               *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
4385  tdsaContext_t            *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
4386  tdIORequestBody_t        *tdIORequestBody;
4387  tdIORequestBody_t        *tdOrgIORequestBody;
4388  satIOContext_t           *satIOContext;
4389  satIOContext_t           *satOrgIOContext;
4390  satInternalIo_t          *satIntIo;
4391  satDeviceData_t          *satDevData;
4392#ifdef  TD_DEBUG_ENABLE
4393  tdsaDeviceData_t         *tdsaDeviceData;
4394  bit32                     ataStatus = 0;
4395  bit32                     ataError;
4396  agsaFisPioSetupHeader_t  *satPIOSetupHeader = agNULL;
4397#endif
4398  scsiRspSense_t           *pSense;
4399  tiIniScsiCmnd_t          *scsiCmnd;
4400  tiIORequest_t            *tiOrgIORequest;
4401  tiScsiInitiatorRequest_t *tiScsiRequest; /* TD's tiScsiXchg */
4402  tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* OS's tiScsiXchg */
4403  agsaSATAIdentifyData_t   *pSATAIdData;
4404  bit8                     *pInquiry;
4405  bit8                      page = 0xFF;
4406  bit16                    *tmpptr,tmpptr_tmp;
4407  bit32                     x;
4408  bit32                     lenReceived;
4409  bit32                     lenNeeded = 0;
4410
4411  TI_DBG6(("satInquiryCB: start\n"));
4412  TI_DBG6(("satInquiryCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
4413  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
4414  satIOContext           = (satIOContext_t *) ioContext;
4415  satIntIo               = satIOContext->satIntIoContext;
4416  satDevData             = satIOContext->pSatDevData;
4417#ifdef  TD_DEBUG_ENABLE
4418  tdsaDeviceData         = (tdsaDeviceData_t *)satDevData->satSaDeviceData;
4419#endif
4420  tiScsiRequest          = satIOContext->tiScsiXchg;
4421  if (satIntIo == agNULL)
4422  {
4423    TI_DBG6(("satInquiryCB: External, OS generated\n"));
4424    pSense               = satIOContext->pSense;
4425    scsiCmnd             = satIOContext->pScsiCmnd;
4426    satOrgIOContext      = satIOContext;
4427    tiOrgIORequest       = tdIORequestBody->tiIORequest;
4428  }
4429  else
4430  {
4431    TI_DBG6(("satInquiryCB: Internal, TD generated\n"));
4432    satOrgIOContext        = satIOContext->satOrgIOContext;
4433    if (satOrgIOContext == agNULL)
4434    {
4435      TI_DBG1(("satInquiryCB: satOrgIOContext is NULL, wrong\n"));
4436      return;
4437    }
4438    else
4439    {
4440      TI_DBG6(("satInquiryCB: satOrgIOContext is NOT NULL\n"));
4441    }
4442    tdOrgIORequestBody    = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
4443    tiOrgIORequest        = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
4444    pSense                = satOrgIOContext->pSense;
4445    scsiCmnd              = satOrgIOContext->pScsiCmnd;
4446  }
4447
4448  tiOrgScsiRequest        = satOrgIOContext->tiScsiXchg;
4449  pInquiry                = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
4450
4451  tdIORequestBody->ioCompleted = agTRUE;
4452  tdIORequestBody->ioStarted = agFALSE;
4453
4454  TI_DBG3(("satInquiryCB: did %d\n", tdsaDeviceData->id));
4455
4456  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
4457  {
4458    TI_DBG1(("satInquiryCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
4459    if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY)
4460    {
4461      TI_DBG1(("satInquiryCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
4462      /* should NOT be retried */
4463      ostiInitiatorIOCompleted (
4464                                tiRoot,
4465                                tiOrgIORequest,
4466                                tiIOFailed,
4467                                tiDetailNoLogin,
4468                                agNULL,
4469                                satOrgIOContext->interruptContext
4470                                );
4471    }
4472    else
4473    {
4474      TI_DBG1(("satInquiryCB: NOT OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
4475      ostiInitiatorIOCompleted (
4476                                tiRoot,
4477                                tiOrgIORequest,
4478                                tiIOFailed,
4479                                tiDetailNoLogin,
4480                                agNULL,
4481                                satOrgIOContext->interruptContext
4482                               );
4483    }
4484    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4485
4486    satFreeIntIoResource( tiRoot,
4487                          satDevData,
4488                          satIntIo);
4489    return;
4490  }
4491  if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED ||
4492      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION ||
4493      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
4494      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS ||
4495      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION ||
4496      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED ||
4497      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION ||
4498      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR ||
4499      agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY
4500      )
4501  {
4502    TI_DBG1(("satInquiryCB: OSSA_IO_OPEN_CNX_ERROR\n"));
4503
4504    ostiInitiatorIOCompleted (
4505                             tiRoot,
4506                             tiOrgIORequest,
4507                             tiIOFailed,
4508                             tiDetailNoLogin,
4509                             agNULL,
4510                             satOrgIOContext->interruptContext
4511                             );
4512
4513    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4514
4515    satFreeIntIoResource( tiRoot,
4516                         satDevData,
4517                         satIntIo);
4518    return;
4519  }
4520
4521 if ( agIOStatus != OSSA_IO_SUCCESS ||
4522      (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0)
4523    )
4524 {
4525#ifdef  TD_DEBUG_ENABLE
4526   // only agsaFisPioSetup_t is expected
4527   satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
4528   ataStatus         = satPIOSetupHeader->status;   // ATA Status register
4529   ataError          = satPIOSetupHeader->error;    // ATA Eror register
4530#endif
4531   TI_DBG1(("satInquiryCB: ataStatus 0x%x ataError 0x%x\n", ataStatus, ataError));
4532   /* Process abort case */
4533   if (agIOStatus == OSSA_IO_ABORTED)
4534   {
4535     satProcessAbort(tiRoot,
4536                     tiOrgIORequest,
4537                     satOrgIOContext
4538                     );
4539
4540     satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4541
4542     satFreeIntIoResource( tiRoot,
4543                           satDevData,
4544                           satIntIo);
4545     return;
4546   }
4547
4548    ostiInitiatorIOCompleted (
4549                             tiRoot,
4550                             tiOrgIORequest,
4551                             tiIOFailed,
4552                             tiDetailOtherError,
4553                             agNULL,
4554                             satOrgIOContext->interruptContext
4555                             );
4556
4557   satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4558
4559   satFreeIntIoResource( tiRoot,
4560                         satDevData,
4561                         satIntIo);
4562   return;
4563  }
4564
4565 /* success */
4566
4567
4568 /* Convert to host endian */
4569 tmpptr = (bit16*)(tiScsiRequest->sglVirtualAddr);
4570 for (x=0; x < sizeof(agsaSATAIdentifyData_t)/sizeof(bit16); x++)
4571 {
4572   OSSA_READ_LE_16(AGROOT, &tmpptr_tmp, tmpptr, 0);
4573   *tmpptr = tmpptr_tmp;
4574   tmpptr++;
4575   /*Print tmpptr_tmp here for debugging purpose*/
4576 }
4577
4578 pSATAIdData = (agsaSATAIdentifyData_t *)(tiScsiRequest->sglVirtualAddr);
4579
4580 TI_DBG5(("satInquiryCB: OS satOrgIOContext %p \n", satOrgIOContext));
4581 TI_DBG5(("satInquiryCB: TD satIOContext %p \n", satIOContext));
4582 TI_DBG5(("satInquiryCB: OS tiScsiXchg %p \n", satOrgIOContext->tiScsiXchg));
4583 TI_DBG5(("satInquiryCB: TD tiScsiXchg %p \n", satIOContext->tiScsiXchg));
4584
4585 /* copy ID Dev data to satDevData */
4586 satDevData->satIdentifyData = *pSATAIdData;
4587 satDevData->IDDeviceValid = agTRUE;
4588#ifdef TD_INTERNAL_DEBUG
4589 tdhexdump("satInquiryCB ID Dev data",(bit8 *)pSATAIdData, sizeof(agsaSATAIdentifyData_t));
4590 tdhexdump("satInquiryCB Device ID Dev data",(bit8 *)&satDevData->satIdentifyData, sizeof(agsaSATAIdentifyData_t));
4591#endif
4592// tdhexdump("satInquiryCB Device ID Dev data",(bit8 *)&satDevData->satIdentifyData, sizeof(agsaSATAIdentifyData_t));
4593
4594 /* set satDevData fields from IndentifyData */
4595 satSetDevInfo(satDevData,pSATAIdData);
4596
4597  lenReceived = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4];
4598
4599  /* SPC-4, spec 6.4 p 141 */
4600  /* EVPD bit == 0 */
4601  if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK))
4602  {
4603    /* Returns the standard INQUIRY data */
4604    lenNeeded = STANDARD_INQUIRY_SIZE;
4605
4606
4607    satInquiryStandard(pInquiry, pSATAIdData, scsiCmnd);
4608    //tdhexdump("satInquiryCB ***standard***", (bit8 *)pInquiry, 36);
4609
4610  }
4611  else
4612  {
4613    /* EVPD bit != 0 && PAGE CODE != 0 */
4614    /* returns the pages of vital product data information */
4615
4616    /* we must support page 00h, 83h and 89h */
4617    page = scsiCmnd->cdb[2];
4618    if ((page != INQUIRY_SUPPORTED_VPD_PAGE) &&
4619        (page != INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE) &&
4620        (page != INQUIRY_ATA_INFORMATION_VPD_PAGE))
4621    {
4622      satSetSensePayload( pSense,
4623                          SCSI_SNSKEY_ILLEGAL_REQUEST,
4624                          0,
4625                          SCSI_SNSCODE_INVALID_FIELD_IN_CDB,
4626                          satOrgIOContext);
4627
4628      ostiInitiatorIOCompleted( tiRoot,
4629                                tiOrgIORequest,
4630                                tiIOSuccess,
4631                                SCSI_STAT_CHECK_CONDITION,
4632                                satOrgIOContext->pTiSenseData,
4633                                satOrgIOContext->interruptContext );
4634
4635      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4636
4637      satFreeIntIoResource( tiRoot,
4638                       satDevData,
4639                       satIntIo);
4640      TI_DBG1(("satInquiryCB: invalid PAGE CODE 0x%x\n", page));
4641      return;
4642    }
4643
4644    /* checking length */
4645    switch (page)
4646    {
4647    case INQUIRY_SUPPORTED_VPD_PAGE:
4648      lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 36 */
4649      break;
4650    case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4651      if (satDevData->satWWNSupport)
4652      {
4653        lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */
4654      }
4655      else
4656      {
4657        lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */
4658      }
4659      break;
4660    case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4661      lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */
4662      break;
4663    default:
4664      TI_DBG1(("satInquiryCB: wrong!!! invalid PAGE CODE 0x%x\n", page));
4665      break;
4666    }
4667
4668
4669    /*
4670     * Fill in the Inquiry data depending on what Inquiry data we are returning.
4671     */
4672    switch (page)
4673    {
4674    case INQUIRY_SUPPORTED_VPD_PAGE:
4675      satInquiryPage0(pInquiry, pSATAIdData);
4676      break;
4677    case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4678      satInquiryPage83(pInquiry, pSATAIdData, satDevData);
4679      break;
4680    case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4681      satInquiryPage89(pInquiry, pSATAIdData, satDevData);
4682      break;
4683    default:
4684      TI_DBG1(("satInquiryCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page));
4685      break;
4686    }
4687  } /* else */
4688
4689  TI_DBG6(("satInquiryCB: calling ostiInitiatorIOCompleted\n"));
4690
4691  if (lenReceived > lenNeeded)
4692  {
4693    TI_DBG6(("satInquiryCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n",
4694        lenNeeded, lenReceived, tiOrgIORequest));
4695
4696    ostiInitiatorIOCompleted( tiRoot,
4697                              tiOrgIORequest,
4698                              tiIOUnderRun,
4699                              lenReceived - lenNeeded,
4700                              agNULL,
4701                              satOrgIOContext->interruptContext );
4702  }
4703  else
4704  {
4705    ostiInitiatorIOCompleted( tiRoot,
4706                              tiOrgIORequest,
4707                              tiIOSuccess,
4708                              SCSI_STAT_GOOD,
4709                              agNULL,
4710                              satOrgIOContext->interruptContext);
4711  }
4712
4713  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4714
4715  satFreeIntIoResource( tiRoot,
4716                        satDevData,
4717                        satIntIo);
4718  TI_DBG5(("satInquiryCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO));
4719  TI_DBG6(("satInquiryCB: end\n"));
4720  return;
4721}
4722
4723
4724/*****************************************************************************/
4725/*! \brief satInquiryIntCB.
4726 *
4727 *  This function is part of INQUIRY SAT implementation. This is called when
4728 *  ATA identify device data is available.
4729 *
4730 *  \param   tiRoot:           Pointer to TISA initiator driver/port instance.
4731 *  \param   tiIORequest:      Pointer to TISA I/O request context for this I/O.
4732 *  \param   tiDeviceHandle:   Pointer to TISA device handle for this I/O.
4733 *  \param   tiScsiRequest:    Pointer to TISA SCSI I/O request and SGL list.
4734 *  \param   satIOContext_t:   Pointer to the SAT IO Context
4735 *
4736 *  \return If command is started successfully
4737 *    - \e tiSuccess:     I/O request successfully initiated.
4738 *    - \e tiBusy:        No resources available, try again later.
4739 *    - \e tiIONoDevice:  Invalid device handle.
4740 *    - \e tiError:       Other errors.
4741 */
4742/*****************************************************************************/
4743void satInquiryIntCB(
4744                   tiRoot_t                  *tiRoot,
4745                   tiIORequest_t             *tiIORequest,
4746                   tiDeviceHandle_t          *tiDeviceHandle,
4747                   tiScsiInitiatorRequest_t *tiScsiRequest,
4748                   satIOContext_t            *satIOContext
4749                   )
4750{
4751  scsiRspSense_t            *pSense;
4752  tiIniScsiCmnd_t           *scsiCmnd;
4753  satDeviceData_t           *satDevData;
4754  agsaSATAIdentifyData_t    *pSATAIdData;
4755
4756  bit8                      *pInquiry;
4757  bit8                      page = 0xFF;
4758  bit32                     lenReceived;
4759  bit32                     lenNeeded = 0;
4760
4761  TI_DBG6(("satInquiryIntCB: start\n"));
4762
4763  pSense      = satIOContext->pSense;
4764  scsiCmnd    = &tiScsiRequest->scsiCmnd;
4765  pInquiry    = (bit8 *) tiScsiRequest->sglVirtualAddr;
4766  satDevData = satIOContext->pSatDevData;
4767  pSATAIdData = &satDevData->satIdentifyData;
4768
4769
4770  lenReceived = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4];
4771
4772  /* SPC-4, spec 6.4 p 141 */
4773  /* EVPD bit == 0 */
4774  if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK))
4775  {
4776    /* Returns the standard INQUIRY data */
4777    lenNeeded = STANDARD_INQUIRY_SIZE;
4778
4779     satInquiryStandard(pInquiry, pSATAIdData, scsiCmnd);
4780    //tdhexdump("satInquiryIntCB ***standard***", (bit8 *)pInquiry, 36);
4781
4782  }
4783  else
4784  {
4785    /* EVPD bit != 0 && PAGE CODE != 0 */
4786    /* returns the pages of vital product data information */
4787
4788    /* we must support page 00h, 83h and 89h */
4789    page = scsiCmnd->cdb[2];
4790    if ((page != INQUIRY_SUPPORTED_VPD_PAGE) &&
4791        (page != INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE) &&
4792        (page != INQUIRY_ATA_INFORMATION_VPD_PAGE) &&
4793        (page != INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE))
4794    {
4795      satSetSensePayload( pSense,
4796                          SCSI_SNSKEY_ILLEGAL_REQUEST,
4797                          0,
4798                          SCSI_SNSCODE_INVALID_FIELD_IN_CDB,
4799                          satIOContext);
4800
4801      ostiInitiatorIOCompleted( tiRoot,
4802                                tiIORequest,
4803                                tiIOSuccess,
4804                                SCSI_STAT_CHECK_CONDITION,
4805                                satIOContext->pTiSenseData,
4806                                satIOContext->interruptContext );
4807
4808      TI_DBG1(("satInquiryIntCB: invalid PAGE CODE 0x%x\n", page));
4809      return;
4810    }
4811
4812    /* checking length */
4813    switch (page)
4814    {
4815    case INQUIRY_SUPPORTED_VPD_PAGE:
4816      lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 36 */
4817      break;
4818    case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4819      if (satDevData->satWWNSupport)
4820      {
4821        lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */
4822      }
4823      else
4824      {
4825        lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */
4826      }
4827      break;
4828    case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4829      lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */
4830      break;
4831    case INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE:
4832      lenNeeded = SATA_PAGE80_INQUIRY_SIZE; /* 24 */
4833      break;
4834
4835    default:
4836      TI_DBG1(("satInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page));
4837      break;
4838    }
4839
4840
4841    /*
4842     * Fill in the Inquiry data depending on what Inquiry data we are returning.
4843     */
4844    switch (page)
4845    {
4846    case INQUIRY_SUPPORTED_VPD_PAGE:
4847      satInquiryPage0(pInquiry, pSATAIdData);
4848      break;
4849    case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4850      satInquiryPage83(pInquiry, pSATAIdData, satDevData);
4851      break;
4852    case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4853      satInquiryPage89(pInquiry, pSATAIdData, satDevData);
4854      break;
4855    case INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE:
4856      satInquiryPage80(pInquiry, pSATAIdData);
4857      break;
4858    default:
4859      TI_DBG1(("satInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page));
4860      break;
4861    }
4862  } /* else */
4863
4864  TI_DBG6(("satInquiryIntCB: calling ostiInitiatorIOCompleted\n"));
4865
4866  if (lenReceived > lenNeeded)
4867  {
4868    TI_DBG6(("satInquiryIntCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n",
4869        lenNeeded, lenReceived, tiIORequest));
4870
4871    ostiInitiatorIOCompleted( tiRoot,
4872                              tiIORequest,
4873                              tiIOUnderRun,
4874                              lenReceived - lenNeeded,
4875                              agNULL,
4876                              satIOContext->interruptContext );
4877  }
4878  else
4879  {
4880    ostiInitiatorIOCompleted( tiRoot,
4881                            tiIORequest,
4882                            tiIOSuccess,
4883                            SCSI_STAT_GOOD,
4884                            agNULL,
4885                            satIOContext->interruptContext);
4886  }
4887
4888  TI_DBG5(("satInquiryIntCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO));
4889  TI_DBG6(("satInquiryIntCB: end\n"));
4890  return;
4891}
4892
4893
4894/*****************************************************************************
4895*! \brief  satVerify10CB
4896*
4897*   This routine is a callback function called from ossaSATACompleted().
4898*   This CB routine deals with Verify(10) completion.
4899*
4900*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
4901*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
4902*  \param   agIOStatus:  Status of completed I/O.
4903*  \param   agFirstDword:Pointer to the four bytes of FIS.
4904*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
4905*                        length.
4906*  \param   agParam:     Additional info based on status.
4907*  \param   ioContext:   Pointer to satIOContext_t.
4908*
4909*  \return: none
4910*
4911*****************************************************************************/
4912void satVerify10CB(
4913                   agsaRoot_t        *agRoot,
4914                   agsaIORequest_t   *agIORequest,
4915                   bit32             agIOStatus,
4916                   agsaFisHeader_t   *agFirstDword,
4917                   bit32             agIOInfoLen,
4918                   void              *agParam,
4919                   void              *ioContext
4920                   )
4921{
4922  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
4923  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
4924  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
4925  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
4926  tdIORequestBody_t       *tdIORequestBody;
4927  tdIORequestBody_t       *tdOrgIORequestBody;
4928  satIOContext_t          *satIOContext;
4929  satIOContext_t          *satOrgIOContext;
4930  satInternalIo_t         *satIntIo;
4931  satDeviceData_t         *satDevData;
4932  scsiRspSense_t            *pSense;
4933  tiIORequest_t             *tiOrgIORequest;
4934
4935  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
4936  bit32                     ataStatus = 0;
4937  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
4938
4939  TI_DBG5(("satVerify10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
4940
4941  /* internally generate tiIOContext */
4942  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
4943  satIOContext           = (satIOContext_t *) ioContext;
4944  satIntIo               = satIOContext->satIntIoContext;
4945  satDevData             = satIOContext->pSatDevData;
4946  hostToDevFis           = satIOContext->pFis;
4947
4948  if (satIntIo == agNULL)
4949  {
4950    TI_DBG4(("satVerify10CB: External satInternalIo_t satIntIoContext\n"));
4951    satOrgIOContext = satIOContext;
4952    tiOrgIORequest  = tdIORequestBody->tiIORequest;
4953    pSense          = satIOContext->pSense;
4954  }
4955  else
4956  {
4957    TI_DBG4(("satVerify10CB: Internal satInternalIo_t satIntIoContext\n"));
4958    satOrgIOContext        = satIOContext->satOrgIOContext;
4959    if (satOrgIOContext == agNULL)
4960    {
4961      TI_DBG4(("satVerify10CB: satOrgIOContext is NULL, wrong\n"));
4962      return;
4963    }
4964    else
4965    {
4966      TI_DBG4(("satVerify10CB: satOrgIOContext is NOT NULL\n"));
4967    }
4968    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
4969    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
4970    pSense        = satOrgIOContext->pSense;
4971  }
4972
4973  tdIORequestBody->ioCompleted = agTRUE;
4974  tdIORequestBody->ioStarted = agFALSE;
4975
4976  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
4977  {
4978     TI_DBG1(("satVerify10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
4979     satSetSensePayload( pSense,
4980                        SCSI_SNSKEY_NO_SENSE,
4981                        0,
4982                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
4983                        satOrgIOContext);
4984
4985     ostiInitiatorIOCompleted( tiRoot,
4986                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
4987                              tiIOSuccess,
4988                              SCSI_STAT_CHECK_CONDITION,
4989                              satOrgIOContext->pTiSenseData,
4990                              satOrgIOContext->interruptContext );
4991
4992    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4993
4994    satFreeIntIoResource( tiRoot,
4995                          satDevData,
4996                          satIntIo);
4997    return;
4998  }
4999
5000  if (agIOStatus != OSSA_IO_SUCCESS)
5001  {
5002    /* only agsaFisRegDeviceToHost_t is expected */
5003    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5004    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
5005  }
5006
5007  if( agIOStatus != OSSA_IO_SUCCESS)
5008  {
5009  if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5010       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5011       )
5012  {
5013    /* for debugging */
5014    if( agIOStatus != OSSA_IO_SUCCESS)
5015    {
5016      TI_DBG1(("satVerify10CB: FAILED, NOT IO_SUCCESS\n"));
5017    }
5018    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5019    {
5020      TI_DBG1(("satVerify10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5021    }
5022    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5023              (ataStatus & DF_ATA_STATUS_MASK)
5024              )
5025    {
5026      TI_DBG1(("satVerify10CB: FAILED, FAILED, error status\n"));
5027    }
5028
5029    /* Process abort case */
5030    if (agIOStatus == OSSA_IO_ABORTED)
5031    {
5032      satProcessAbort(tiRoot,
5033                      tiOrgIORequest,
5034                      satOrgIOContext
5035                      );
5036
5037      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5038
5039      satFreeIntIoResource( tiRoot,
5040                            satDevData,
5041                            satIntIo);
5042      return;
5043    }
5044
5045    /* for debugging */
5046    switch (hostToDevFis->h.command)
5047    {
5048    case SAT_READ_VERIFY_SECTORS_EXT:
5049      TI_DBG1(("satVerify10CB: SAT_READ_VERIFY_SECTORS_EXT\n"));
5050      break;
5051    default:
5052      TI_DBG1(("satVerify10CB: error default case command 0x%x\n", hostToDevFis->h.command));
5053      break;
5054    }
5055
5056    satSetSensePayload( pSense,
5057                        SCSI_SNSKEY_NO_SENSE,
5058                        0,
5059                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5060                        satOrgIOContext);
5061
5062    ostiInitiatorIOCompleted( tiRoot,
5063                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5064                              tiIOSuccess,
5065                              SCSI_STAT_CHECK_CONDITION,
5066                              satOrgIOContext->pTiSenseData,
5067                              satOrgIOContext->interruptContext );
5068
5069    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5070
5071    satFreeIntIoResource( tiRoot,
5072                          satDevData,
5073                          satIntIo);
5074    return;
5075  } /* end error checking */
5076  }
5077
5078  /* process success from this point on */
5079  switch (hostToDevFis->h.command)
5080  {
5081  case SAT_READ_VERIFY_SECTORS_EXT:
5082    TI_DBG5(("satVerify10CB: SAT_WRITE_DMA_EXT success \n"));
5083
5084    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5085
5086    satFreeIntIoResource( tiRoot,
5087                          satDevData,
5088                          satIntIo);
5089
5090    ostiInitiatorIOCompleted( tiRoot,
5091                              tiOrgIORequest,
5092                              tiIOSuccess,
5093                              SCSI_STAT_GOOD,
5094                              agNULL,
5095                              satOrgIOContext->interruptContext);
5096    break;
5097  default:
5098    TI_DBG1(("satVerify10CB: success but error default case command 0x%x\n", hostToDevFis->h.command));
5099
5100    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5101
5102    satFreeIntIoResource( tiRoot,
5103                          satDevData,
5104                          satIntIo);
5105
5106    satSetSensePayload( pSense,
5107                        SCSI_SNSKEY_NO_SENSE,
5108                        0,
5109                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5110                        satOrgIOContext);
5111
5112    ostiInitiatorIOCompleted( tiRoot,
5113                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5114                              tiIOSuccess,
5115                              SCSI_STAT_CHECK_CONDITION,
5116                              satOrgIOContext->pTiSenseData,
5117                              satOrgIOContext->interruptContext );
5118
5119    break;
5120  }
5121
5122  return;
5123}
5124
5125/* similar to satVerify10CB */
5126void satNonChainedVerifyCB(
5127                           agsaRoot_t        *agRoot,
5128                           agsaIORequest_t   *agIORequest,
5129                           bit32             agIOStatus,
5130                           agsaFisHeader_t   *agFirstDword,
5131                           bit32             agIOInfoLen,
5132                           agsaFrameHandle_t agFrameHandle,
5133                           void              *ioContext
5134                           )
5135{
5136  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
5137  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
5138  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
5139  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5140  tdIORequestBody_t       *tdIORequestBody;
5141  tdIORequestBody_t       *tdOrgIORequestBody;
5142  satIOContext_t          *satIOContext;
5143  satIOContext_t          *satOrgIOContext;
5144  satInternalIo_t         *satIntIo;
5145  satDeviceData_t         *satDevData;
5146  scsiRspSense_t            *pSense;
5147  tiIORequest_t             *tiOrgIORequest;
5148
5149  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
5150  bit32                     ataStatus = 0;
5151  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
5152
5153  TI_DBG5(("satNonChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5154
5155  /* internally generate tiIOContext */
5156  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
5157  satIOContext           = (satIOContext_t *) ioContext;
5158  satIntIo               = satIOContext->satIntIoContext;
5159  satDevData             = satIOContext->pSatDevData;
5160  hostToDevFis           = satIOContext->pFis;
5161
5162  if (satIntIo == agNULL)
5163  {
5164    TI_DBG4(("satNonChainedVerifyCB: External satInternalIo_t satIntIoContext\n"));
5165    satOrgIOContext = satIOContext;
5166    tiOrgIORequest  = tdIORequestBody->tiIORequest;
5167    pSense          = satIOContext->pSense;
5168  }
5169  else
5170  {
5171    TI_DBG4(("satNonChainedVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
5172    satOrgIOContext        = satIOContext->satOrgIOContext;
5173    if (satOrgIOContext == agNULL)
5174    {
5175      TI_DBG4(("satNonChainedVerifyCB: satOrgIOContext is NULL, wrong\n"));
5176      return;
5177    }
5178    else
5179    {
5180      TI_DBG4(("satNonChainedVerifyCB: satOrgIOContext is NOT NULL\n"));
5181    }
5182    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
5183    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
5184    pSense        = satOrgIOContext->pSense;
5185  }
5186
5187  tdIORequestBody->ioCompleted = agTRUE;
5188  tdIORequestBody->ioStarted = agFALSE;
5189
5190  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5191  {
5192     TI_DBG1(("satNonChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
5193     satSetSensePayload( pSense,
5194                        SCSI_SNSKEY_NO_SENSE,
5195                        0,
5196                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5197                        satOrgIOContext);
5198
5199     ostiInitiatorIOCompleted( tiRoot,
5200                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5201                              tiIOSuccess,
5202                              SCSI_STAT_CHECK_CONDITION,
5203                              satOrgIOContext->pTiSenseData,
5204                              satOrgIOContext->interruptContext );
5205
5206    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5207
5208    satFreeIntIoResource( tiRoot,
5209                          satDevData,
5210                          satIntIo);
5211    return;
5212  }
5213
5214  if (agIOStatus != OSSA_IO_SUCCESS)
5215  {
5216    /* only agsaFisRegDeviceToHost_t is expected */
5217    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5218    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
5219  }
5220
5221  if( agIOStatus != OSSA_IO_SUCCESS)
5222  {
5223    if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5224         ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5225         )
5226    {
5227      /* for debugging */
5228      if( agIOStatus != OSSA_IO_SUCCESS)
5229      {
5230        TI_DBG1(("satNonChainedVerifyCB: FAILED, NOT IO_SUCCESS\n"));
5231      }
5232      else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5233      {
5234        TI_DBG1(("satNonChainedVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5235      }
5236      else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5237                (ataStatus & DF_ATA_STATUS_MASK)
5238                )
5239      {
5240        TI_DBG1(("satNonChainedVerifyCB: FAILED, FAILED, error status\n"));
5241      }
5242
5243      /* Process abort case */
5244      if (agIOStatus == OSSA_IO_ABORTED)
5245      {
5246        satProcessAbort(tiRoot,
5247                        tiOrgIORequest,
5248                        satOrgIOContext
5249                        );
5250
5251        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5252
5253        satFreeIntIoResource( tiRoot,
5254                              satDevData,
5255                              satIntIo);
5256        return;
5257      }
5258
5259      /* for debugging */
5260      switch (hostToDevFis->h.command)
5261      {
5262      case SAT_READ_VERIFY_SECTORS:
5263        TI_DBG1(("satNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS\n"));
5264        break;
5265      case SAT_READ_VERIFY_SECTORS_EXT:
5266        TI_DBG1(("satNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n"));
5267        break;
5268      default:
5269        TI_DBG1(("satNonChainedVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command));
5270        break;
5271      }
5272
5273      satSetSensePayload( pSense,
5274                          SCSI_SNSKEY_NO_SENSE,
5275                          0,
5276                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5277                          satOrgIOContext);
5278
5279      ostiInitiatorIOCompleted( tiRoot,
5280                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5281                                tiIOSuccess,
5282                                SCSI_STAT_CHECK_CONDITION,
5283                                satOrgIOContext->pTiSenseData,
5284                                satOrgIOContext->interruptContext );
5285
5286      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5287
5288      satFreeIntIoResource( tiRoot,
5289                            satDevData,
5290                            satIntIo);
5291      return;
5292    } /* end error checking */
5293  }
5294
5295  /* process success from this point on */
5296  switch (hostToDevFis->h.command)
5297  {
5298  case SAT_READ_VERIFY_SECTORS: /* fall through */
5299  case SAT_READ_VERIFY_SECTORS_EXT:
5300    TI_DBG5(("satNonChainedVerifyCB: SAT_WRITE_DMA_EXT success \n"));
5301
5302    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5303
5304    satFreeIntIoResource( tiRoot,
5305                          satDevData,
5306                          satIntIo);
5307
5308    ostiInitiatorIOCompleted( tiRoot,
5309                              tiOrgIORequest,
5310                              tiIOSuccess,
5311                              SCSI_STAT_GOOD,
5312                              agNULL,
5313                              satOrgIOContext->interruptContext);
5314    break;
5315  default:
5316    TI_DBG1(("satNonChainedVerifyCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
5317
5318    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5319
5320    satFreeIntIoResource( tiRoot,
5321                          satDevData,
5322                          satIntIo);
5323
5324    satSetSensePayload( pSense,
5325                        SCSI_SNSKEY_NO_SENSE,
5326                        0,
5327                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5328                        satOrgIOContext);
5329
5330    ostiInitiatorIOCompleted( tiRoot,
5331                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5332                              tiIOSuccess,
5333                              SCSI_STAT_CHECK_CONDITION,
5334                              satOrgIOContext->pTiSenseData,
5335                              satOrgIOContext->interruptContext );
5336
5337    break;
5338  }
5339
5340  return;
5341}
5342
5343void satChainedVerifyCB(
5344                           agsaRoot_t        *agRoot,
5345                           agsaIORequest_t   *agIORequest,
5346                           bit32             agIOStatus,
5347                           agsaFisHeader_t   *agFirstDword,
5348                           bit32             agIOInfoLen,
5349                           agsaFrameHandle_t agFrameHandle,
5350                           void              *ioContext
5351                           )
5352{
5353  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
5354  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
5355  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
5356  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5357  tdIORequestBody_t       *tdIORequestBody;
5358  tdIORequestBody_t       *tdOrgIORequestBody;
5359  satIOContext_t          *satIOContext;
5360  satIOContext_t          *satOrgIOContext;
5361  satIOContext_t          *satNewIOContext;
5362  satInternalIo_t         *satIntIo;
5363  satInternalIo_t         *satNewIntIo = agNULL;
5364  satDeviceData_t         *satDevData;
5365  scsiRspSense_t            *pSense;
5366  tiIniScsiCmnd_t           *scsiCmnd;
5367  tiIORequest_t             *tiOrgIORequest;
5368
5369  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
5370  bit32                     ataStatus = 0;
5371  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
5372  bit32                     status = tiError;
5373  bit32                     dataLength;
5374
5375  TI_DBG5(("satChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5376
5377  /* internally generate tiIOContext */
5378  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
5379  satIOContext           = (satIOContext_t *) ioContext;
5380  satIntIo               = satIOContext->satIntIoContext;
5381  satDevData             = satIOContext->pSatDevData;
5382  hostToDevFis           = satIOContext->pFis;
5383
5384  if (satIntIo == agNULL)
5385  {
5386    TI_DBG4(("satChainedVerifyCB: External satInternalIo_t satIntIoContext\n"));
5387    satOrgIOContext = satIOContext;
5388    tiOrgIORequest  = tdIORequestBody->tiIORequest;
5389    pSense          = satIOContext->pSense;
5390    scsiCmnd        = satIOContext->pScsiCmnd;
5391  }
5392  else
5393  {
5394    TI_DBG4(("satChainedVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
5395    satOrgIOContext        = satIOContext->satOrgIOContext;
5396    if (satOrgIOContext == agNULL)
5397    {
5398      TI_DBG4(("satChainedVerifyCB: satOrgIOContext is NULL, wrong\n"));
5399      return;
5400    }
5401    else
5402    {
5403      TI_DBG4(("satChainedVerifyCB: satOrgIOContext is NOT NULL\n"));
5404    }
5405    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
5406    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
5407    pSense        = satOrgIOContext->pSense;
5408    scsiCmnd      = satOrgIOContext->pScsiCmnd;
5409  }
5410
5411  tdIORequestBody->ioCompleted = agTRUE;
5412  tdIORequestBody->ioStarted = agFALSE;
5413
5414  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5415  {
5416     TI_DBG1(("satChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
5417     satSetSensePayload( pSense,
5418                        SCSI_SNSKEY_NO_SENSE,
5419                        0,
5420                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5421                        satOrgIOContext);
5422
5423     ostiInitiatorIOCompleted( tiRoot,
5424                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5425                              tiIOSuccess,
5426                              SCSI_STAT_CHECK_CONDITION,
5427                              satOrgIOContext->pTiSenseData,
5428                              satOrgIOContext->interruptContext );
5429
5430    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5431
5432    satFreeIntIoResource( tiRoot,
5433                          satDevData,
5434                          satIntIo);
5435    return;
5436  }
5437
5438  if (agIOStatus != OSSA_IO_SUCCESS)
5439  {
5440    /* only agsaFisRegDeviceToHost_t is expected */
5441    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5442    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
5443  }
5444
5445  if( agIOStatus != OSSA_IO_SUCCESS)
5446  {
5447    if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5448         ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5449         )
5450    {
5451      /* for debugging */
5452      if( agIOStatus != OSSA_IO_SUCCESS)
5453      {
5454        TI_DBG1(("satChainedVerifyCB: FAILED, NOT IO_SUCCESS\n"));
5455      }
5456      else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5457      {
5458        TI_DBG1(("satChainedVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5459      }
5460      else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5461                (ataStatus & DF_ATA_STATUS_MASK)
5462                )
5463      {
5464        TI_DBG1(("satChainedVerifyCB: FAILED, FAILED, error status\n"));
5465      }
5466
5467      /* Process abort case */
5468      if (agIOStatus == OSSA_IO_ABORTED)
5469      {
5470        satProcessAbort(tiRoot,
5471                        tiOrgIORequest,
5472                        satOrgIOContext
5473                        );
5474
5475        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5476
5477        satFreeIntIoResource( tiRoot,
5478                              satDevData,
5479                              satIntIo);
5480        return;
5481      }
5482
5483      /* for debugging */
5484      switch (hostToDevFis->h.command)
5485      {
5486      case SAT_READ_VERIFY_SECTORS:
5487        TI_DBG1(("satChainedVerifyCB: SAT_READ_VERIFY_SECTORS\n"));
5488        break;
5489      case SAT_READ_VERIFY_SECTORS_EXT:
5490        TI_DBG1(("satChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n"));
5491        break;
5492      default:
5493        TI_DBG1(("satChainedVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command));
5494        break;
5495      }
5496
5497      satSetSensePayload( pSense,
5498                          SCSI_SNSKEY_NO_SENSE,
5499                          0,
5500                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5501                          satOrgIOContext);
5502
5503      ostiInitiatorIOCompleted( tiRoot,
5504                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5505                                tiIOSuccess,
5506                                SCSI_STAT_CHECK_CONDITION,
5507                                satOrgIOContext->pTiSenseData,
5508                                satOrgIOContext->interruptContext );
5509
5510      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5511
5512      satFreeIntIoResource( tiRoot,
5513                            satDevData,
5514                            satIntIo);
5515      return;
5516    } /* end error checking */
5517  }
5518
5519  /* process success from this point on */
5520  switch (hostToDevFis->h.command)
5521  {
5522  case SAT_READ_VERIFY_SECTORS: /* fall through */
5523  case SAT_READ_VERIFY_SECTORS_EXT:
5524    TI_DBG5(("satChainedVerifyCB: SAT_WRITE_DMA_EXT success \n"));
5525
5526    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5527
5528    satFreeIntIoResource( tiRoot,
5529                          satDevData,
5530                          satIntIo);
5531
5532    /* let's loop till TL */
5533
5534    /* lba = lba + tl
5535       loopnum--;
5536       if (loopnum == 0) done
5537     */
5538    (satOrgIOContext->LoopNum)--;
5539    if (satOrgIOContext->LoopNum == 0)
5540    {
5541      /*
5542        done with write and verify
5543      */
5544      ostiInitiatorIOCompleted( tiRoot,
5545
5546                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5547                                tiIOSuccess,
5548                                SCSI_STAT_GOOD,
5549                                agNULL,
5550                                satOrgIOContext->interruptContext );
5551      return;
5552    }
5553
5554    if (satOrgIOContext->superIOFlag)
5555    {
5556      dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
5557    }
5558    else
5559    {
5560      dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
5561    }
5562
5563    satNewIntIo = satAllocIntIoResource( tiRoot,
5564                                         tiOrgIORequest,
5565                                         satDevData,
5566                                         dataLength,
5567                                         satNewIntIo);
5568    if (satNewIntIo == agNULL)
5569    {
5570      /* memory allocation failure */
5571      satFreeIntIoResource( tiRoot,
5572                            satDevData,
5573                            satNewIntIo);
5574      ostiInitiatorIOCompleted( tiRoot,
5575                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5576                                tiIOFailed,
5577                                tiDetailOtherError,
5578                                agNULL,
5579                                satOrgIOContext->interruptContext );
5580
5581      TI_DBG1(("satChainedVerifyCB: momory allocation fails\n"));
5582      return;
5583    } /* end of memory allocation failure */
5584
5585    /*
5586     * Need to initialize all the fields within satIOContext
5587     */
5588
5589    satNewIOContext = satPrepareNewIO(
5590                                      satNewIntIo,
5591                                      tiOrgIORequest,
5592                                      satDevData,
5593                                      scsiCmnd,
5594                                      satOrgIOContext
5595                                      );
5596    status = satChainedVerify(tiRoot,
5597                                    &satNewIntIo->satIntTiIORequest,
5598                                    satNewIOContext->ptiDeviceHandle,
5599                                    &satNewIntIo->satIntTiScsiXchg,
5600                                    satNewIOContext);
5601
5602    if (status != tiSuccess)
5603    {
5604      satFreeIntIoResource( tiRoot,
5605                            satDevData,
5606                            satNewIntIo);
5607      ostiInitiatorIOCompleted( tiRoot,
5608                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5609                                tiIOFailed,
5610                                tiDetailOtherError,
5611                                agNULL,
5612                                satOrgIOContext->interruptContext );
5613      TI_DBG1(("satChainedVerifyCB: calling satChainedVerify fails\n"));
5614      return;
5615    }
5616
5617    break;
5618  default:
5619    TI_DBG1(("satChainedVerifyCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
5620
5621    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5622
5623    satFreeIntIoResource( tiRoot,
5624                          satDevData,
5625                          satIntIo);
5626
5627    satSetSensePayload( pSense,
5628                        SCSI_SNSKEY_NO_SENSE,
5629                        0,
5630                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5631                        satOrgIOContext);
5632
5633    ostiInitiatorIOCompleted( tiRoot,
5634                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5635                              tiIOSuccess,
5636                              SCSI_STAT_CHECK_CONDITION,
5637                              satOrgIOContext->pTiSenseData,
5638                              satOrgIOContext->interruptContext );
5639
5640    break;
5641  }
5642  return;
5643}
5644
5645/*****************************************************************************
5646*! \brief  satTestUnitReadyCB
5647*
5648*   This routine is a callback function for satTestUnitReady()
5649*
5650*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
5651*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
5652*  \param   agIOStatus:  Status of completed I/O.
5653*  \param   agFirstDword:Pointer to the four bytes of FIS.
5654*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
5655*                        length.
5656*  \param   agParam:     Additional info based on status.
5657*  \param   ioContext:   Pointer to satIOContext_t.
5658*
5659*  \return: none
5660*
5661*****************************************************************************/
5662void satTestUnitReadyCB(
5663                        agsaRoot_t        *agRoot,
5664                        agsaIORequest_t   *agIORequest,
5665                        bit32             agIOStatus,
5666                        agsaFisHeader_t   *agFirstDword,
5667                        bit32             agIOInfoLen,
5668                        void              *agParam,
5669                        void              *ioContext
5670                        )
5671{
5672  /*
5673    In the process of TestUnitReady
5674    Process SAT_GET_MEDIA_STATUS
5675    Process SAT_CHECK_POWER_MODE
5676  */
5677  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
5678  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
5679  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
5680  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5681  tdIORequestBody_t       *tdIORequestBody;
5682  tdIORequestBody_t       *tdOrgIORequestBody;
5683  satIOContext_t          *satIOContext;
5684  satIOContext_t          *satOrgIOContext;
5685  satIOContext_t          *satNewIOContext;
5686  satInternalIo_t         *satIntIo;
5687  satInternalIo_t         *satNewIntIo = agNULL;
5688  satDeviceData_t         *satDevData;
5689  scsiRspSense_t            *pSense;
5690  tiIniScsiCmnd_t           *scsiCmnd;
5691  tiIORequest_t             *tiOrgIORequest;
5692
5693  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
5694  bit32                     ataStatus = 0;
5695  bit32                     ataError;
5696
5697  bit32                     status;
5698  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
5699
5700  TI_DBG6(("satTestUnitReadyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5701
5702  /* internally generate tiIOContext */
5703  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
5704  satIOContext           = (satIOContext_t *) ioContext;
5705  satIntIo               = satIOContext->satIntIoContext;
5706  satDevData             = satIOContext->pSatDevData;
5707  hostToDevFis           = satIOContext->pFis;
5708
5709  if (satIntIo == agNULL)
5710  {
5711    TI_DBG5(("satTestUnitReadyCB: no internal satInternalIo_t satIntIoContext\n"));
5712    pSense        = satIOContext->pSense;
5713    scsiCmnd      = satIOContext->pScsiCmnd;
5714    satOrgIOContext = satIOContext;
5715    tiOrgIORequest  = tdIORequestBody->tiIORequest;
5716  }
5717  else
5718  {
5719    TI_DBG5(("satTestUnitReadyCB: yes internal satInternalIo_t satIntIoContext\n"));
5720
5721    /* orginal tiIOContext */
5722    tiOrgIORequest         = (tiIORequest_t *)satIOContext->satIntIoContext->satOrgTiIORequest;
5723    tdOrgIORequestBody     = (tdIORequestBody_t *)tiOrgIORequest->tdData;
5724    satOrgIOContext        = &(tdOrgIORequestBody->transport.SATA.satIOContext);
5725
5726    pSense        = satOrgIOContext->pSense;
5727    scsiCmnd      = satOrgIOContext->pScsiCmnd;
5728  }
5729
5730  tdIORequestBody->ioCompleted = agTRUE;
5731  tdIORequestBody->ioStarted = agFALSE;
5732
5733  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5734  {
5735     TI_DBG1(("satTestUnitReadyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
5736    satSetSensePayload( pSense,
5737                          SCSI_SNSKEY_NOT_READY,
5738                          0,
5739                          SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5740                          satOrgIOContext);
5741
5742    ostiInitiatorIOCompleted( tiRoot,
5743                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5744                                tiIOSuccess,
5745                                SCSI_STAT_CHECK_CONDITION,
5746                                satOrgIOContext->pTiSenseData,
5747                                satOrgIOContext->interruptContext );
5748
5749    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5750
5751    satFreeIntIoResource( tiRoot,
5752                            satDevData,
5753                            satIntIo);
5754
5755    return;
5756  }
5757  /*
5758    HW checks an error for us and the results is agIOStatus
5759  */
5760  if (agIOStatus != OSSA_IO_SUCCESS)
5761  {
5762    /* only agsaFisRegDeviceToHost_t is expected */
5763    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5764    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
5765    ataError      = statDevToHostFisHeader->error;    /* ATA Eror register   */
5766
5767    if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5768    {
5769      TI_DBG1(("satTestUnitReadyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5770    }
5771    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5772              (ataStatus & DF_ATA_STATUS_MASK)
5773            )
5774    {
5775      TI_DBG1(("satTestUnitReadyCB: FAILED, FAILED, error status\n"));
5776    }
5777
5778    /* Process abort case */
5779    if (agIOStatus == OSSA_IO_ABORTED)
5780    {
5781      satProcessAbort(tiRoot,
5782                      tiOrgIORequest,
5783                      satOrgIOContext
5784                      );
5785
5786      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5787
5788      satFreeIntIoResource( tiRoot,
5789                            satDevData,
5790                            satIntIo);
5791      return;
5792    }
5793
5794    switch (hostToDevFis->h.command)
5795    {
5796    case SAT_GET_MEDIA_STATUS:
5797      TI_DBG1(("satTestUnitReadyCB: SAT_GET_MEDIA_STATUS failed \n"));
5798
5799      /* checking NM bit */
5800      if (ataError & SCSI_NM_MASK)
5801      {
5802        satSetSensePayload( pSense,
5803                            SCSI_SNSKEY_NOT_READY,
5804                            0,
5805                            SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
5806                            satOrgIOContext);
5807      }
5808      else
5809      {
5810        satSetSensePayload( pSense,
5811                            SCSI_SNSKEY_NOT_READY,
5812                            0,
5813                            SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5814                            satOrgIOContext);
5815      }
5816
5817      ostiInitiatorIOCompleted( tiRoot,
5818                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5819                                tiIOSuccess,
5820                                SCSI_STAT_CHECK_CONDITION,
5821                                satOrgIOContext->pTiSenseData,
5822                                satOrgIOContext->interruptContext );
5823
5824      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5825
5826      satFreeIntIoResource( tiRoot,
5827                            satDevData,
5828                            satIntIo);
5829      break;
5830    case SAT_CHECK_POWER_MODE:
5831      TI_DBG1(("satTestUnitReadyCB: SAT_CHECK_POWER_MODE failed \n"));
5832      satSetSensePayload( pSense,
5833                          SCSI_SNSKEY_NOT_READY,
5834                          0,
5835                          SCSI_SNSCODE_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION,
5836                          satOrgIOContext);
5837
5838      ostiInitiatorIOCompleted( tiRoot,
5839                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5840                                tiIOSuccess,
5841                                SCSI_STAT_CHECK_CONDITION,
5842                                satOrgIOContext->pTiSenseData,
5843                                satOrgIOContext->interruptContext );
5844
5845      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5846
5847      satFreeIntIoResource( tiRoot,
5848                            satDevData,
5849                            satIntIo);
5850      break;
5851    default:
5852      TI_DBG1(("satTestUnitReadyCB: default failed command %d\n", hostToDevFis->h.command));
5853
5854      satSetSensePayload( pSense,
5855                          SCSI_SNSKEY_NOT_READY,
5856                          0,
5857                          SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5858                          satOrgIOContext);
5859
5860      ostiInitiatorIOCompleted( tiRoot,
5861                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5862                                tiIOSuccess,
5863                                SCSI_STAT_CHECK_CONDITION,
5864                                satOrgIOContext->pTiSenseData,
5865                                satOrgIOContext->interruptContext );
5866
5867      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5868
5869      satFreeIntIoResource( tiRoot,
5870                            satDevData,
5871                            satIntIo);
5872      break;
5873
5874    }
5875    return;
5876  }/* end error */
5877
5878  /* ATA command completes sucessfully */
5879  switch (hostToDevFis->h.command)
5880  {
5881  case SAT_GET_MEDIA_STATUS:
5882
5883    TI_DBG5(("satTestUnitReadyCB: SAT_GET_MEDIA_STATUS success\n"));
5884
5885    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5886
5887    satFreeIntIoResource( tiRoot,
5888                          satDevData,
5889                          satIntIo);
5890
5891    satNewIntIo = satAllocIntIoResource( tiRoot,
5892                                         tiOrgIORequest,
5893                                         satDevData,
5894                                         0,
5895                                         satNewIntIo);
5896    if (satNewIntIo == agNULL)
5897    {
5898      /* memory allocation failure */
5899      satFreeIntIoResource( tiRoot,
5900                            satDevData,
5901                            satNewIntIo);
5902      satSetSensePayload( pSense,
5903                          SCSI_SNSKEY_NOT_READY,
5904                          0,
5905                          SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5906                          satOrgIOContext);
5907
5908      ostiInitiatorIOCompleted( tiRoot,
5909                                tiOrgIORequest,
5910                                tiIOSuccess,
5911                                SCSI_STAT_CHECK_CONDITION,
5912                                satOrgIOContext->pTiSenseData,
5913                                satOrgIOContext->interruptContext );
5914
5915      TI_DBG1(("satTestUnitReadyCB: momory allocation fails\n"));
5916      return;
5917    }
5918
5919    /*
5920     * Need to initialize all the fields within satIOContext
5921     */
5922
5923    satNewIOContext = satPrepareNewIO(
5924                                      satNewIntIo,
5925                                      tiOrgIORequest,
5926                                      satDevData,
5927                                      scsiCmnd,
5928                                      satOrgIOContext
5929                                      );
5930
5931    /* sends SAT_CHECK_POWER_MODE */
5932    status = satTestUnitReady_1( tiRoot,
5933                               &satNewIntIo->satIntTiIORequest,
5934                               satNewIOContext->ptiDeviceHandle,
5935                               &satNewIntIo->satIntTiScsiXchg,
5936                               satNewIOContext);
5937
5938   if (status != tiSuccess)
5939   {
5940     /* sending SAT_CHECK_POWER_MODE fails */
5941     satFreeIntIoResource( tiRoot,
5942                           satDevData,
5943                           satNewIntIo);
5944     satSetSensePayload( pSense,
5945                         SCSI_SNSKEY_NOT_READY,
5946                         0,
5947                         SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5948                         satOrgIOContext);
5949
5950     ostiInitiatorIOCompleted( tiRoot,
5951                               tiOrgIORequest,
5952                               tiIOSuccess,
5953                               SCSI_STAT_CHECK_CONDITION,
5954                               satOrgIOContext->pTiSenseData,
5955                               satOrgIOContext->interruptContext );
5956
5957      TI_DBG1(("satTestUnitReadyCB: calling satTestUnitReady_1 fails\n"));
5958      return;
5959   }
5960
5961    break;
5962  case SAT_CHECK_POWER_MODE:
5963    TI_DBG5(("satTestUnitReadyCB: SAT_CHECK_POWER_MODE success\n"));
5964
5965
5966    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5967
5968    satFreeIntIoResource( tiRoot,
5969                          satDevData,
5970                          satIntIo);
5971
5972    /* returns good status */
5973    ostiInitiatorIOCompleted( tiRoot,
5974                              tiOrgIORequest,
5975                              tiIOSuccess,
5976                              SCSI_STAT_GOOD,
5977                              agNULL,
5978                              satOrgIOContext->interruptContext );
5979
5980    break;
5981  default:
5982    TI_DBG1(("satTestUnitReadyCB: default success command %d\n", hostToDevFis->h.command));
5983    satSetSensePayload( pSense,
5984                        SCSI_SNSKEY_NOT_READY,
5985                        0,
5986                        SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5987                        satOrgIOContext);
5988
5989    ostiInitiatorIOCompleted( tiRoot,
5990                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5991                              tiIOSuccess,
5992                              SCSI_STAT_CHECK_CONDITION,
5993                              satOrgIOContext->pTiSenseData,
5994                              satOrgIOContext->interruptContext );
5995
5996
5997    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5998
5999    satFreeIntIoResource( tiRoot,
6000                          satDevData,
6001                          satIntIo);
6002    break;
6003  }
6004
6005  return;
6006}
6007
6008/*****************************************************************************
6009*! \brief  satWriteSame10CB
6010*
6011*   This routine is a callback function for satWriteSame10()
6012*
6013*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
6014*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
6015*  \param   agIOStatus:  Status of completed I/O.
6016*  \param   agFirstDword:Pointer to the four bytes of FIS.
6017*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
6018*                        length.
6019*  \param   agParam:     Additional info based on status.
6020*  \param   ioContext:   Pointer to satIOContext_t.
6021*
6022*  \return: none
6023*
6024*****************************************************************************/
6025void satWriteSame10CB(
6026                      agsaRoot_t        *agRoot,
6027                      agsaIORequest_t   *agIORequest,
6028                      bit32             agIOStatus,
6029                      agsaFisHeader_t   *agFirstDword,
6030                      bit32             agIOInfoLen,
6031                      void              *agParam,
6032                      void              *ioContext
6033                      )
6034{
6035  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
6036  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
6037  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
6038  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6039  tdIORequestBody_t       *tdIORequestBody;
6040  tdIORequestBody_t       *tdOrgIORequestBody;
6041  tdIORequestBody_t       *tdNewIORequestBody;
6042  satIOContext_t          *satIOContext;
6043  satIOContext_t          *satOrgIOContext;
6044  satIOContext_t          *satNewIOContext;
6045  satInternalIo_t         *satIntIo;
6046  satInternalIo_t         *satNewIntIo = agNULL;
6047  satDeviceData_t         *satDevData;
6048  scsiRspSense_t            *pSense;
6049  tiIniScsiCmnd_t           *scsiCmnd;
6050  tiIORequest_t             *tiOrgIORequest;
6051
6052  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
6053  bit32                     ataStatus = 0;
6054  bit32                     status;
6055
6056  bit32                     sectorcount = 0;
6057  bit32                     lba = 0, tl = 0;
6058  agsaFisRegD2HHeader_t     *statDevToHostFisHeader = agNULL;
6059  agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL;
6060
6061  TI_DBG5(("satWriteSame10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
6062
6063  /* internally generate tiIOContext */
6064  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
6065  satIOContext           = (satIOContext_t *) ioContext;
6066  satIntIo               = satIOContext->satIntIoContext;
6067  satDevData             = satIOContext->pSatDevData;
6068  hostToDevFis           = satIOContext->pFis;
6069
6070  if (satIntIo == agNULL)
6071  {
6072    TI_DBG4(("satWriteSame10CB: External satInternalIo_t satIntIoContext\n"));
6073    satOrgIOContext = satIOContext;
6074    tiOrgIORequest  = tdIORequestBody->tiIORequest;
6075    pSense          = satIOContext->pSense;
6076    scsiCmnd        = satIOContext->pScsiCmnd;
6077  }
6078  else
6079  {
6080    TI_DBG4(("satWriteSame10CB: Internal satInternalIo_t satIntIoContext\n"));
6081    satOrgIOContext        = satIOContext->satOrgIOContext;
6082    if (satOrgIOContext == agNULL)
6083    {
6084      TI_DBG4(("satWriteSame10CB: satOrgIOContext is NULL, wrong\n"));
6085      return;
6086    }
6087    else
6088    {
6089      TI_DBG4(("satWriteSame10CB: satOrgIOContext is NOT NULL\n"));
6090    }
6091    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
6092    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
6093
6094    pSense        = satOrgIOContext->pSense;
6095    scsiCmnd      = satOrgIOContext->pScsiCmnd;
6096  }
6097
6098
6099  tdIORequestBody->ioCompleted = agTRUE;
6100  tdIORequestBody->ioStarted = agFALSE;
6101
6102  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
6103  {
6104     TI_DBG1(("satWriteSame10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
6105     satSetSensePayload( pSense,
6106                        SCSI_SNSKEY_NO_SENSE,
6107                        0,
6108                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6109                        satOrgIOContext);
6110
6111     ostiInitiatorIOCompleted( tiRoot,
6112                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6113                              tiIOSuccess,
6114                              SCSI_STAT_CHECK_CONDITION,
6115                              satOrgIOContext->pTiSenseData,
6116                              satOrgIOContext->interruptContext );
6117
6118    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6119
6120    satFreeIntIoResource( tiRoot,
6121                          satDevData,
6122                          satIntIo);
6123    return;
6124  }
6125
6126  if (agIOStatus != OSSA_IO_SUCCESS)
6127  {
6128    /* FP, DMA and PIO write */
6129    /* First, assumed to be Reg Device to Host FIS */
6130    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
6131    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
6132  }
6133
6134  if (agIOStatus != OSSA_IO_SUCCESS)
6135  {
6136    if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS)
6137    {
6138      statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H);
6139
6140      /* Get ATA Status register */
6141      ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70);               /* bits 4,5,6 */
6142      ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07);   /* bits 0,1,2 */
6143
6144      /* ATA Eror register   */
6145
6146    }
6147  }
6148
6149  if( agIOStatus != OSSA_IO_SUCCESS)
6150  {
6151  /*
6152    checking IO status, FIS type and error status
6153    FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
6154  */
6155  if (  ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
6156        (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) ||
6157       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
6158       )
6159  {
6160    /* for debugging */
6161    if( agIOStatus != OSSA_IO_SUCCESS)
6162    {
6163      TI_DBG1(("satWriteSame10CB: FAILED, NOT IO_SUCCESS\n"));
6164    }
6165    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
6166    {
6167      TI_DBG1(("satWriteSame10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
6168    }
6169    else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
6170    {
6171      TI_DBG1(("satWriteSame10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
6172    }
6173    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
6174              (ataStatus & DF_ATA_STATUS_MASK)
6175              )
6176    {
6177      TI_DBG1(("satWriteSame10CB: FAILED, FAILED, error status\n"));
6178    }
6179
6180    /* Process abort case */
6181    if (agIOStatus == OSSA_IO_ABORTED)
6182    {
6183      satProcessAbort(tiRoot,
6184                      tiOrgIORequest,
6185                      satOrgIOContext
6186                      );
6187
6188
6189      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6190
6191      satFreeIntIoResource( tiRoot,
6192                            satDevData,
6193                            satIntIo);
6194      return;
6195    }
6196
6197    /* for debugging */
6198    switch (hostToDevFis->h.command)
6199    {
6200    case SAT_WRITE_DMA_EXT:
6201      TI_DBG1(("satWriteSame10CB: SAT_WRITE_DMA_EXT\n"));
6202      break;
6203    case SAT_WRITE_SECTORS_EXT:
6204      TI_DBG1(("satWriteSame10CB: SAT_WRITE_SECTORS_EXT\n"));
6205      break;
6206    case SAT_WRITE_FPDMA_QUEUED:
6207      TI_DBG1(("satWriteSame10CB: SAT_WRITE_FPDMA_QUEUED\n"));
6208      break;
6209    default:
6210      TI_DBG1(("satWriteSame10CB: error default case command 0x%x\n", hostToDevFis->h.command));
6211      break;
6212    }
6213
6214    satSetSensePayload( pSense,
6215                        SCSI_SNSKEY_NO_SENSE,
6216                        0,
6217                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6218                        satOrgIOContext);
6219
6220    ostiInitiatorIOCompleted( tiRoot,
6221                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6222                              tiIOSuccess,
6223                              SCSI_STAT_CHECK_CONDITION,
6224                              satOrgIOContext->pTiSenseData,
6225                              satOrgIOContext->interruptContext );
6226
6227
6228    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6229
6230    satFreeIntIoResource( tiRoot,
6231                          satDevData,
6232                          satIntIo);
6233    return;
6234  } /* end error */
6235  }
6236
6237  /* process success from this point on */
6238  /*
6239    note: inefficient implementation until a single block can be manipulated
6240  */
6241
6242  if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
6243  {
6244    TI_DBG5(("satWriteSame10CB: SAT_WRITE_DMA_EXT success\n"));
6245  }
6246  else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
6247  {
6248    TI_DBG5(("satWriteSame10CB: SAT_WRITE_SECTORS_EXT success\n"));
6249  }
6250  else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
6251  {
6252    TI_DBG5(("satWriteSame10CB: SAT_WRITE_FPDMA_QUEUED success\n"));
6253  }
6254  else
6255  {
6256    TI_DBG1(("satWriteSame10CB: error case command 0x%x success\n", hostToDevFis->h.command));
6257    satSetSensePayload( pSense,
6258                        SCSI_SNSKEY_NO_SENSE,
6259                        0,
6260                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6261                        satOrgIOContext);
6262
6263    ostiInitiatorIOCompleted( tiRoot,
6264                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6265                              tiIOSuccess,
6266                              SCSI_STAT_CHECK_CONDITION,
6267                              satOrgIOContext->pTiSenseData,
6268                              satOrgIOContext->interruptContext );
6269
6270
6271    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6272
6273    satFreeIntIoResource( tiRoot,
6274                          satDevData,
6275                          satIntIo);
6276    return;
6277  }
6278
6279
6280  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6281
6282  /* free */
6283  satFreeIntIoResource( tiRoot,
6284                        satDevData,
6285                        satIntIo);
6286
6287  /*
6288    increment LBA by one, keeping the same sector count(1)
6289    sends another ATA command with the changed parameters
6290  */
6291
6292  tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
6293  satDevData->satSectorDone++;
6294  tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
6295
6296  TI_DBG1(("satWriteSame10CB: sectordone %d\n", satDevData->satSectorDone));
6297
6298  lba = (scsiCmnd->cdb[2] << (8*3)) + (scsiCmnd->cdb[3] << (8*2))
6299      + (scsiCmnd->cdb[4] << 8) + scsiCmnd->cdb[5];
6300  tl = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8];
6301
6302  TI_DBG5(("satWriteSame10CB: lba 0x%x tl 0x%x\n", lba, tl));
6303
6304  if (tl == 0)
6305  {
6306    /* (satDevData->satMaxUserAddrSectors - 1) - lba*/
6307    sectorcount = (0x0FFFFFFF - 1) - lba;
6308  }
6309  else
6310  {
6311    sectorcount = tl;
6312  }
6313
6314  if (sectorcount <= 0)
6315  {
6316    satSetSensePayload( pSense,
6317                        SCSI_SNSKEY_NO_SENSE,
6318                        0,
6319                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6320                        satOrgIOContext);
6321
6322    ostiInitiatorIOCompleted( tiRoot,
6323                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6324                              tiIOSuccess,
6325                              SCSI_STAT_CHECK_CONDITION,
6326                              satOrgIOContext->pTiSenseData,
6327                              satOrgIOContext->interruptContext );
6328    TI_DBG1(("satWriteSame10CB: incorrect sectorcount 0x%x\n", sectorcount));
6329    return;
6330  }
6331
6332  if (sectorcount == satDevData->satSectorDone)
6333  {
6334    /*
6335      done with writesame
6336    */
6337    TI_DBG1(("satWriteSame10CB: return writesame done\n"));
6338    satDevData->satSectorDone = 0;
6339
6340    ostiInitiatorIOCompleted( tiRoot,
6341                              tiOrgIORequest,
6342                              tiIOSuccess,
6343                              SCSI_STAT_GOOD,
6344                              agNULL,
6345                              satOrgIOContext->interruptContext );
6346  }
6347  else
6348  {
6349    /* sends another ATA command */
6350    if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
6351    {
6352      TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_DMA_EXT\n"));
6353    }
6354    else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
6355    {
6356      TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_SECTORS_EXT\n"));
6357    }
6358    else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
6359    {
6360      TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_FPDMA_QUEUED\n"));
6361    }
6362
6363    satNewIntIo = satAllocIntIoResource( tiRoot,
6364                                         tiOrgIORequest,
6365                                         satDevData,
6366                                         0,
6367                                         satNewIntIo);
6368    if (satNewIntIo == agNULL)
6369    {
6370      /* memory allocation failure */
6371      satFreeIntIoResource( tiRoot,
6372                            satDevData,
6373                            satNewIntIo);
6374
6375      satSetSensePayload( pSense,
6376                          SCSI_SNSKEY_NO_SENSE,
6377                          0,
6378                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6379                          satOrgIOContext);
6380
6381      ostiInitiatorIOCompleted( tiRoot,
6382                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6383                                tiIOSuccess,
6384                                SCSI_STAT_CHECK_CONDITION,
6385                                satOrgIOContext->pTiSenseData,
6386                                satOrgIOContext->interruptContext );
6387      TI_DBG1(("satWriteSame10CB: momory allocation fails\n"));
6388      return;
6389    } /* end memory allocation */
6390
6391    /* the one to be used */
6392    tdNewIORequestBody = satNewIntIo->satIntRequestBody;
6393    satNewIOContext = &tdNewIORequestBody->transport.SATA.satIOContext;
6394
6395    satNewIOContext->pSatDevData   = satDevData;
6396    satNewIOContext->pFis          = &tdNewIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev;
6397    satNewIOContext->pScsiCmnd     = &satNewIntIo->satIntTiScsiXchg.scsiCmnd;
6398    /* saves scsi command for LBA and number of blocks */
6399    osti_memcpy(satNewIOContext->pScsiCmnd, scsiCmnd, sizeof(tiIniScsiCmnd_t));
6400    satNewIOContext->pSense        = &tdNewIORequestBody->transport.SATA.sensePayload;
6401    satNewIOContext->pTiSenseData  = &tdNewIORequestBody->transport.SATA.tiSenseData;
6402    satNewIOContext->pTiSenseData->senseData = satNewIOContext->pSense;
6403    satNewIOContext->tiRequestBody = satNewIntIo->satIntRequestBody;
6404    satNewIOContext->interruptContext = satNewIOContext->interruptContext;
6405    satNewIOContext->satIntIoContext  = satNewIntIo;
6406    satNewIOContext->ptiDeviceHandle = satIOContext->ptiDeviceHandle;
6407    /* saves tiScsiXchg; only for writesame10() */
6408    satNewIOContext->tiScsiXchg = satOrgIOContext->tiScsiXchg;
6409
6410    if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
6411    {
6412      status = satWriteSame10_1( tiRoot,
6413                                 &satNewIntIo->satIntTiIORequest,
6414                                 satNewIOContext->ptiDeviceHandle,
6415                                 &satNewIntIo->satIntTiScsiXchg,
6416                                 satNewIOContext,
6417                                 lba + satDevData->satSectorDone
6418                                 );
6419    }
6420    else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
6421    {
6422      status = satWriteSame10_2( tiRoot,
6423                                 &satNewIntIo->satIntTiIORequest,
6424                                 satNewIOContext->ptiDeviceHandle,
6425                                 &satNewIntIo->satIntTiScsiXchg,
6426                                 satNewIOContext,
6427                                 lba + satDevData->satSectorDone
6428                                 );
6429    }
6430    else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
6431    {
6432      status = satWriteSame10_3( tiRoot,
6433                                 &satNewIntIo->satIntTiIORequest,
6434                                 satNewIOContext->ptiDeviceHandle,
6435                                 &satNewIntIo->satIntTiScsiXchg,
6436                                 satNewIOContext,
6437                                 lba + satDevData->satSectorDone
6438                                 );
6439    }
6440    else
6441    {
6442      status = tiError;
6443      TI_DBG1(("satWriteSame10CB: sucess but error in command 0x%x\n", hostToDevFis->h.command));
6444    }
6445
6446    if (status != tiSuccess)
6447    {
6448      /* sending ATA command fails */
6449      satFreeIntIoResource( tiRoot,
6450                            satDevData,
6451                            satNewIntIo);
6452      satSetSensePayload( pSense,
6453                          SCSI_SNSKEY_NO_SENSE,
6454                          0,
6455                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6456                          satOrgIOContext);
6457
6458      ostiInitiatorIOCompleted( tiRoot,
6459                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6460                                tiIOSuccess,
6461                                SCSI_STAT_CHECK_CONDITION,
6462                                satOrgIOContext->pTiSenseData,
6463                                satOrgIOContext->interruptContext );
6464      TI_DBG1(("satWriteSame10CB:calling satWriteSame10_1 fails\n"));
6465      return;
6466    } /* end send fails */
6467
6468  } /* end sends another ATA command */
6469
6470  return;
6471}
6472/*****************************************************************************
6473*! \brief  satStartStopUnitCB
6474*
6475*   This routine is a callback function called from ossaSATACompleted().
6476*   This CB routine deals with Send Diagnostic completion.
6477*
6478*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
6479*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
6480*  \param   agIOStatus:  Status of completed I/O.
6481*  \param   agFirstDword:Pointer to the four bytes of FIS.
6482*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
6483*                        length.
6484*  \param   agParam:     Additional info based on status.
6485*  \param   ioContext:   Pointer to satIOContext_t.
6486*
6487*  \return: none
6488*
6489*****************************************************************************/
6490void satStartStopUnitCB(
6491                        agsaRoot_t        *agRoot,
6492                        agsaIORequest_t   *agIORequest,
6493                        bit32             agIOStatus,
6494                        agsaFisHeader_t   *agFirstDword,
6495                        bit32             agIOInfoLen,
6496                        void              *agParam,
6497                        void              *ioContext
6498                        )
6499{
6500  /*
6501    In the process of StartStopUnit
6502    Process FLUSH CACHE (EXT)
6503    Process STANDBY
6504    Process READ VERIFY SECTOR(S) EXT
6505    Process MEDIA EJECT
6506  */
6507  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
6508  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
6509  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
6510  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6511  tdIORequestBody_t       *tdIORequestBody;
6512  tdIORequestBody_t       *tdOrgIORequestBody;
6513  satIOContext_t          *satIOContext;
6514  satIOContext_t          *satOrgIOContext;
6515  satIOContext_t          *satNewIOContext;
6516  satInternalIo_t         *satIntIo;
6517  satInternalIo_t         *satNewIntIo = agNULL;
6518  satDeviceData_t         *satDevData;
6519  scsiRspSense_t            *pSense;
6520  tiIniScsiCmnd_t           *scsiCmnd;
6521  tiIORequest_t             *tiOrgIORequest;
6522
6523  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
6524  bit32                     ataStatus = 0;
6525  bit32                     status;
6526  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
6527
6528  TI_DBG5(("satStartStopUnitCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
6529
6530  /* internally generate tiIOContext */
6531  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
6532  satIOContext           = (satIOContext_t *) ioContext;
6533  satIntIo               = satIOContext->satIntIoContext;
6534  satDevData             = satIOContext->pSatDevData;
6535  hostToDevFis           = satIOContext->pFis;
6536
6537  if (satIntIo == agNULL)
6538  {
6539    TI_DBG4(("satStartStopUnitCB: External satInternalIo_t satIntIoContext\n"));
6540    satOrgIOContext = satIOContext;
6541    tiOrgIORequest  = tdIORequestBody->tiIORequest;
6542    pSense          = satIOContext->pSense;
6543    scsiCmnd        = satIOContext->pScsiCmnd;
6544  }
6545  else
6546  {
6547    TI_DBG4(("satStartStopUnitCB: Internal satInternalIo_t satIntIoContext\n"));
6548    satOrgIOContext        = satIOContext->satOrgIOContext;
6549    if (satOrgIOContext == agNULL)
6550    {
6551      TI_DBG4(("satStartStopUnitCB: satOrgIOContext is NULL, wrong\n"));
6552      return;
6553    }
6554    else
6555    {
6556      TI_DBG4(("satStartStopUnitCB: satOrgIOContext is NOT NULL\n"));
6557    }
6558    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
6559    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
6560
6561    pSense        = satOrgIOContext->pSense;
6562    scsiCmnd      = satOrgIOContext->pScsiCmnd;
6563  }
6564
6565  tdIORequestBody->ioCompleted = agTRUE;
6566  tdIORequestBody->ioStarted = agFALSE;
6567
6568  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
6569  {
6570     TI_DBG1(("satStartStopUnitCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
6571
6572      /* IMMED == 0 */
6573      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6574      {
6575        TI_DBG1(("satStartStopUnitCB: immed bit 0\n"));
6576        satSetSensePayload( pSense,
6577                            SCSI_SNSKEY_ABORTED_COMMAND,
6578                            0,
6579                            SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6580                            satOrgIOContext);
6581
6582        ostiInitiatorIOCompleted( tiRoot,
6583                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6584                                  tiIOSuccess,
6585                                  SCSI_STAT_CHECK_CONDITION,
6586                                  satOrgIOContext->pTiSenseData,
6587                                  satOrgIOContext->interruptContext );
6588
6589
6590        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6591        satFreeIntIoResource( tiRoot,
6592                              satDevData,
6593                              satIntIo);
6594      }
6595      /* IMMED == 1 */
6596      if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6597      {
6598        TI_DBG1(("satStartStopUnitCB: immed bit 1\n"));
6599        satSetDeferredSensePayload( pSense,
6600                                    SCSI_SNSKEY_ABORTED_COMMAND,
6601                                    0,
6602                                    SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6603                                    satOrgIOContext);
6604
6605        ostiInitiatorIOCompleted( tiRoot,
6606                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6607                                  tiIOSuccess,
6608                                  SCSI_STAT_CHECK_CONDITION,
6609                                  satOrgIOContext->pTiSenseData,
6610                                  satOrgIOContext->interruptContext );
6611
6612
6613        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6614        satFreeIntIoResource( tiRoot,
6615                              satDevData,
6616                              satIntIo);
6617     }
6618
6619
6620
6621    return;
6622  }
6623
6624  if (agIOStatus != OSSA_IO_SUCCESS)
6625  {
6626    /* only agsaFisRegDeviceToHost_t is expected */
6627    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
6628    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
6629  }
6630  /*
6631    checking IO status, FIS type and error status
6632  */
6633  if( agIOStatus != OSSA_IO_SUCCESS)
6634  {
6635  if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
6636      ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
6637      )
6638  {
6639    /* for debugging */
6640    if( agIOStatus != OSSA_IO_SUCCESS)
6641    {
6642      TI_DBG1(("satStartStopUnitCB: FAILED, NOT IO_SUCCESS\n"));
6643    }
6644    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
6645    {
6646      TI_DBG1(("satStartStopUnitCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
6647    }
6648    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
6649         (ataStatus & DF_ATA_STATUS_MASK)
6650         )
6651    {
6652      TI_DBG1(("satStartStopUnitCB: FAILED, FAILED, error status\n"));
6653    }
6654
6655
6656    /* Process abort case */
6657    if (agIOStatus == OSSA_IO_ABORTED)
6658    {
6659      satProcessAbort(tiRoot,
6660                      tiOrgIORequest,
6661                      satOrgIOContext
6662                      );
6663
6664
6665      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6666
6667      satFreeIntIoResource( tiRoot,
6668                            satDevData,
6669                            satIntIo);
6670      return;
6671    }
6672
6673    switch (hostToDevFis->h.command)
6674    {
6675    case SAT_FLUSH_CACHE: /* fall through */
6676    case SAT_FLUSH_CACHE_EXT:
6677      TI_DBG1(("satStartStopUnitCB: SAT_FLUSH_CACHE(_EXT)\n"));
6678      /* check immed bit in scsi command */
6679      /* IMMED == 0 */
6680      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6681      {
6682        satSetSensePayload( pSense,
6683                            SCSI_SNSKEY_ABORTED_COMMAND,
6684                            0,
6685                            SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6686                            satOrgIOContext);
6687
6688        ostiInitiatorIOCompleted( tiRoot,
6689                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6690                                  tiIOSuccess,
6691                                  SCSI_STAT_CHECK_CONDITION,
6692                                  satOrgIOContext->pTiSenseData,
6693                                  satOrgIOContext->interruptContext );
6694
6695
6696        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6697
6698        satFreeIntIoResource( tiRoot,
6699                              satDevData,
6700                              satIntIo);
6701      }
6702      /* IMMED == 1 */
6703      if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6704      {
6705        satSetDeferredSensePayload( pSense,
6706                                    SCSI_SNSKEY_ABORTED_COMMAND,
6707                                    0,
6708                                    SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6709                                    satOrgIOContext);
6710
6711        ostiInitiatorIOCompleted( tiRoot,
6712                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6713                                  tiIOSuccess,
6714                                  SCSI_STAT_CHECK_CONDITION,
6715                                  satOrgIOContext->pTiSenseData,
6716                                  satOrgIOContext->interruptContext );
6717
6718
6719        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6720
6721        satFreeIntIoResource( tiRoot,
6722                              satDevData,
6723                              satIntIo);
6724      }
6725      break;
6726    case SAT_STANDBY:
6727      TI_DBG5(("satStartStopUnitCB: SAT_STANDBY\n"));
6728      /* check immed bit in scsi command */
6729      /* IMMED == 0 */
6730      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6731      {
6732        satSetSensePayload( pSense,
6733                            SCSI_SNSKEY_ABORTED_COMMAND,
6734                            0,
6735                            SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6736                            satOrgIOContext);
6737
6738        ostiInitiatorIOCompleted( tiRoot,
6739                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6740                                  tiIOSuccess,
6741                                  SCSI_STAT_CHECK_CONDITION,
6742                                  satOrgIOContext->pTiSenseData,
6743                                  satOrgIOContext->interruptContext );
6744
6745
6746        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6747
6748        satFreeIntIoResource( tiRoot,
6749                              satDevData,
6750                              satIntIo);
6751      }
6752      /* IMMED == 1 */
6753      if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6754      {
6755        satSetDeferredSensePayload( pSense,
6756                                    SCSI_SNSKEY_ABORTED_COMMAND,
6757                                    0,
6758                                    SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6759                                    satOrgIOContext);
6760
6761        ostiInitiatorIOCompleted( tiRoot,
6762                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6763                                  tiIOSuccess,
6764                                  SCSI_STAT_CHECK_CONDITION,
6765                                  satOrgIOContext->pTiSenseData,
6766                                  satOrgIOContext->interruptContext );
6767
6768
6769        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6770
6771        satFreeIntIoResource( tiRoot,
6772                              satDevData,
6773                              satIntIo);
6774      }
6775      break;
6776    case SAT_READ_VERIFY_SECTORS:     /* fall through */
6777    case SAT_READ_VERIFY_SECTORS_EXT:
6778      TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT)\n"));
6779       /* IMMED == 0 */
6780      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6781      {
6782        satSetSensePayload( pSense,
6783                            SCSI_SNSKEY_ABORTED_COMMAND,
6784                            0,
6785                            SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6786                            satOrgIOContext);
6787
6788        ostiInitiatorIOCompleted( tiRoot,
6789                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6790                                  tiIOSuccess,
6791                                  SCSI_STAT_CHECK_CONDITION,
6792                                  satOrgIOContext->pTiSenseData,
6793                                  satOrgIOContext->interruptContext );
6794
6795
6796        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6797
6798        satFreeIntIoResource( tiRoot,
6799                              satDevData,
6800                              satIntIo);
6801      }
6802      /* IMMED == 1 */
6803      if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6804      {
6805        satSetDeferredSensePayload( pSense,
6806                                    SCSI_SNSKEY_ABORTED_COMMAND,
6807                                    0,
6808                                    SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6809                                    satOrgIOContext);
6810
6811        ostiInitiatorIOCompleted( tiRoot,
6812                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6813                                  tiIOSuccess,
6814                                  SCSI_STAT_CHECK_CONDITION,
6815                                  satOrgIOContext->pTiSenseData,
6816                                  satOrgIOContext->interruptContext );
6817
6818
6819        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6820
6821        satFreeIntIoResource( tiRoot,
6822                              satDevData,
6823                              satIntIo);
6824      }
6825      break;
6826    case SAT_MEDIA_EJECT:
6827      TI_DBG5(("satStartStopUnitCB: SAT_MEDIA_EJECT\n"));
6828       /* IMMED == 0 */
6829      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6830      {
6831        satSetSensePayload( pSense,
6832                            SCSI_SNSKEY_ABORTED_COMMAND,
6833                            0,
6834                            SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED,
6835                            satOrgIOContext);
6836
6837        ostiInitiatorIOCompleted( tiRoot,
6838                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6839                                  tiIOSuccess,
6840                                  SCSI_STAT_CHECK_CONDITION,
6841                                  satOrgIOContext->pTiSenseData,
6842                                  satOrgIOContext->interruptContext );
6843
6844
6845        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6846
6847        satFreeIntIoResource( tiRoot,
6848                              satDevData,
6849                              satIntIo);
6850      }
6851      /* IMMED == 1 */
6852      if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6853      {
6854        satSetDeferredSensePayload( pSense,
6855                                    SCSI_SNSKEY_ABORTED_COMMAND,
6856                                    0,
6857                                    SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED,
6858                                    satOrgIOContext);
6859
6860        ostiInitiatorIOCompleted( tiRoot,
6861                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6862                                  tiIOSuccess,
6863                                  SCSI_STAT_CHECK_CONDITION,
6864                                  satOrgIOContext->pTiSenseData,
6865                                  satOrgIOContext->interruptContext );
6866
6867        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6868
6869        satFreeIntIoResource( tiRoot,
6870                              satDevData,
6871                              satIntIo);
6872      }
6873      break;
6874    default:
6875      /* unspecified case, return no sense and no addition info */
6876      TI_DBG5(("satStartStopUnitCB: default command %d\n", hostToDevFis->h.command));
6877      satSetSensePayload( pSense,
6878                          SCSI_SNSKEY_NO_SENSE,
6879                          0,
6880                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6881                          satOrgIOContext);
6882
6883      ostiInitiatorIOCompleted( tiRoot,
6884                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6885                                tiIOSuccess,
6886                                SCSI_STAT_CHECK_CONDITION,
6887                                satOrgIOContext->pTiSenseData,
6888                                satOrgIOContext->interruptContext );
6889
6890
6891      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6892
6893      satFreeIntIoResource( tiRoot,
6894                            satDevData,
6895                            satIntIo);
6896      break;
6897    } /* switch */
6898
6899    return;
6900  } /* error check */
6901  }
6902
6903  /* ATA command completes sucessfully */
6904  switch (hostToDevFis->h.command)
6905  {
6906  case SAT_FLUSH_CACHE: /* fall through */
6907  case SAT_FLUSH_CACHE_EXT:
6908    TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n"));
6909
6910
6911    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6912
6913    /* done with SAT_FLUSH_CACHE(_EXT) */
6914    satFreeIntIoResource( tiRoot,
6915                          satDevData,
6916                          satIntIo);
6917
6918    /* at this point, successful SAT_READ_VERIFY_SECTORS(_EXT)
6919       send SAT_SATNDBY
6920    */
6921    satNewIntIo = satAllocIntIoResource( tiRoot,
6922                                         tiOrgIORequest,
6923                                         satDevData,
6924                                         0,
6925                                         satNewIntIo);
6926    if (satNewIntIo == agNULL)
6927    {
6928      /* memory allocation failure */
6929      satFreeIntIoResource( tiRoot,
6930                            satDevData,
6931                            satNewIntIo);
6932      /* IMMED == 0 */
6933      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6934      {
6935        satSetSensePayload( pSense,
6936                            SCSI_SNSKEY_ABORTED_COMMAND,
6937                            0,
6938                            SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6939                            satOrgIOContext);
6940      }
6941      else   /* IMMED == 1 */
6942      {
6943        satSetDeferredSensePayload( pSense,
6944                                    SCSI_SNSKEY_ABORTED_COMMAND,
6945                                    0,
6946                                    SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6947                                    satOrgIOContext);
6948      }
6949      ostiInitiatorIOCompleted( tiRoot,
6950                                tiOrgIORequest,
6951                                tiIOSuccess,
6952                                SCSI_STAT_CHECK_CONDITION,
6953                                satOrgIOContext->pTiSenseData,
6954                                satOrgIOContext->interruptContext );
6955
6956      TI_DBG1(("satStartStopUnitCB: momory allocation fails\n"));
6957      return;
6958    } /* end of memory allocation failure */
6959
6960    /*
6961     * Need to initialize all the fields within satIOContext
6962     */
6963
6964    satNewIOContext = satPrepareNewIO(
6965                                      satNewIntIo,
6966                                      tiOrgIORequest,
6967                                      satDevData,
6968                                      scsiCmnd,
6969                                      satOrgIOContext
6970                                      );
6971
6972    /* sending SAT_STANDBY */
6973    status = satStartStopUnit_1( tiRoot,
6974                                &satNewIntIo->satIntTiIORequest,
6975                                satNewIOContext->ptiDeviceHandle,
6976                                &satNewIntIo->satIntTiScsiXchg,
6977                                satNewIOContext);
6978
6979    if (status != tiSuccess)
6980    {
6981      /* sending SAT_CHECK_POWER_MODE fails */
6982      satFreeIntIoResource( tiRoot,
6983                            satDevData,
6984                            satNewIntIo);
6985
6986      /* IMMED == 0 */
6987      if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6988      {
6989        satSetSensePayload( pSense,
6990                            SCSI_SNSKEY_ABORTED_COMMAND,
6991                            0,
6992                            SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6993                            satOrgIOContext);
6994      }
6995      else   /* IMMED == 1 */
6996      {
6997        satSetDeferredSensePayload( pSense,
6998                                    SCSI_SNSKEY_ABORTED_COMMAND,
6999                                    0,
7000                                    SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
7001                                    satOrgIOContext);
7002      }
7003      ostiInitiatorIOCompleted( tiRoot,
7004                                tiOrgIORequest,
7005                                tiIOSuccess,
7006                                SCSI_STAT_CHECK_CONDITION,
7007                                satOrgIOContext->pTiSenseData,
7008                                satOrgIOContext->interruptContext );
7009
7010      TI_DBG1(("satStartStopUnitCB: calling satStartStopUnit_1 fails\n"));
7011      return;
7012    }
7013    break;
7014  case SAT_STANDBY:
7015    TI_DBG5(("satStartStopUnitCB: SAT_STANDBY success case\n"));
7016
7017    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7018
7019    /* done with SAT_STANDBY */
7020    satFreeIntIoResource( tiRoot,
7021                          satDevData,
7022                          satIntIo);
7023    /*
7024      if immed == 0, return good status
7025     */
7026    /* IMMED == 0 */
7027    if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
7028    {
7029        ostiInitiatorIOCompleted( tiRoot,
7030                                tiOrgIORequest,
7031                                tiIOSuccess,
7032                                SCSI_STAT_GOOD,
7033                                agNULL,
7034                                satOrgIOContext->interruptContext );
7035    }
7036    satDevData->satStopState = agTRUE;
7037    break;
7038  case SAT_READ_VERIFY_SECTORS:     /* fall through */
7039  case SAT_READ_VERIFY_SECTORS_EXT:
7040    TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n"));
7041
7042    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7043
7044    /* done with SAT_READ_VERIFY_SECTORS(_EXT) */
7045    satFreeIntIoResource( tiRoot,
7046                          satDevData,
7047                          satIntIo);
7048    /*
7049      if immed == 0, return good status
7050     */
7051    if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
7052    {
7053        ostiInitiatorIOCompleted( tiRoot,
7054                                tiOrgIORequest,
7055                                tiIOSuccess,
7056                                SCSI_STAT_GOOD,
7057                                agNULL,
7058                                satOrgIOContext->interruptContext );
7059    }
7060    /*
7061      if immed == 0, return good status
7062     */
7063    /*
7064      don't forget to check and set driver state; Active power state
7065    */
7066    satDevData->satStopState = agFALSE;
7067    break;
7068  case SAT_MEDIA_EJECT:
7069    TI_DBG5(("satStartStopUnitCB: SAT_MEDIA_EJECT success case\n"));
7070
7071    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7072
7073    /* done with SAT_READ_VERIFY_SECTORS(_EXT) */
7074    satFreeIntIoResource( tiRoot,
7075                          satDevData,
7076                          satIntIo);
7077    /*
7078      if immed == 0, return good status
7079     */
7080    if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
7081    {
7082        ostiInitiatorIOCompleted( tiRoot,
7083                                tiOrgIORequest,
7084                                tiIOSuccess,
7085                                SCSI_STAT_GOOD,
7086                                agNULL,
7087                                satOrgIOContext->interruptContext );
7088    }
7089    break;
7090  default:
7091    TI_DBG1(("satStartStopUnitCB:success but  error default case command 0x%x\n", hostToDevFis->h.command));
7092
7093    /* unspecified case, return no sense and no addition info */
7094    satSetSensePayload( pSense,
7095                        SCSI_SNSKEY_NO_SENSE,
7096                        0,
7097                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
7098                        satOrgIOContext);
7099
7100    ostiInitiatorIOCompleted( tiRoot,
7101                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7102                              tiIOSuccess,
7103                              SCSI_STAT_CHECK_CONDITION,
7104                              satOrgIOContext->pTiSenseData,
7105                              satOrgIOContext->interruptContext );
7106
7107    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7108
7109    satFreeIntIoResource( tiRoot,
7110                          satDevData,
7111                          satIntIo);
7112    break;
7113  }
7114  return;
7115}
7116
7117/*****************************************************************************
7118*! \brief  satSendDiagnosticCB
7119*
7120*   This routine is a callback function called from ossaSATACompleted().
7121*   This CB routine deals with Send Diagnostic completion.
7122*
7123*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
7124*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
7125*  \param   agIOStatus:  Status of completed I/O.
7126*  \param   agFirstDword:Pointer to the four bytes of FIS.
7127*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
7128*                        length.
7129*  \param   agParam:     Additional info based on status.
7130*  \param   ioContext:   Pointer to satIOContext_t.
7131*
7132*  \return: none
7133*
7134*****************************************************************************/
7135void satSendDiagnosticCB(
7136                         agsaRoot_t        *agRoot,
7137                         agsaIORequest_t   *agIORequest,
7138                         bit32             agIOStatus,
7139                         agsaFisHeader_t   *agFirstDword,
7140                         bit32             agIOInfoLen,
7141                         void              *agParam,
7142                         void              *ioContext
7143                         )
7144{
7145  /*
7146    In the process of SendDiagnotic
7147    Process READ VERIFY SECTOR(S) EXT two time
7148    Process SMART ECECUTE OFF-LINE IMMEDIATE
7149  */
7150  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
7151  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
7152  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
7153  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
7154  tdIORequestBody_t       *tdIORequestBody;
7155  tdIORequestBody_t       *tdOrgIORequestBody;
7156  satIOContext_t          *satIOContext;
7157  satIOContext_t          *satOrgIOContext;
7158  satIOContext_t          *satNewIOContext;
7159  satInternalIo_t         *satIntIo;
7160  satInternalIo_t         *satNewIntIo = agNULL;
7161  satDeviceData_t         *satDevData;
7162  scsiRspSense_t            *pSense;
7163  tiIniScsiCmnd_t           *scsiCmnd;
7164  tiIORequest_t             *tiOrgIORequest;
7165
7166  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
7167  bit32                     ataStatus = 0;
7168  bit32                     status;
7169  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
7170
7171
7172  TI_DBG5(("satSendDiagnosticCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
7173
7174  /* internally generate tiIOContext */
7175  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
7176  satIOContext           = (satIOContext_t *) ioContext;
7177  satIntIo               = satIOContext->satIntIoContext;
7178  satDevData             = satIOContext->pSatDevData;
7179  hostToDevFis           = satIOContext->pFis;
7180
7181  if (satIntIo == agNULL)
7182  {
7183    TI_DBG4(("satSendDiagnosticCB: External satInternalIo_t satIntIoContext\n"));
7184    satOrgIOContext = satIOContext;
7185    tiOrgIORequest  = tdIORequestBody->tiIORequest;
7186    pSense          = satOrgIOContext->pSense;
7187    scsiCmnd        = satOrgIOContext->pScsiCmnd;
7188  }
7189  else
7190  {
7191    TI_DBG4(("satSendDiagnosticCB: Internal satInternalIo_t satIntIoContext\n"));
7192    satOrgIOContext        = satIOContext->satOrgIOContext;
7193    if (satOrgIOContext == agNULL)
7194    {
7195      TI_DBG4(("satSendDiagnosticCB: satOrgIOContext is NULL, wrong\n"));
7196      return;
7197    }
7198    else
7199    {
7200      TI_DBG4(("satSendDiagnosticCB: satOrgIOContext is NOT NULL\n"));
7201    }
7202    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
7203    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
7204    pSense                 = satOrgIOContext->pSense;
7205    scsiCmnd               = satOrgIOContext->pScsiCmnd;
7206  }
7207
7208  tdIORequestBody->ioCompleted = agTRUE;
7209  tdIORequestBody->ioStarted = agFALSE;
7210
7211  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
7212  {
7213     TI_DBG1(("satSendDiagnosticCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
7214     satDevData->satVerifyState = 0;
7215     satDevData->satBGPendingDiag = agFALSE;
7216
7217    if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
7218    {
7219      /* no completion for background send diagnotic. It is done in satSendDiagnostic() */
7220      ostiInitiatorIOCompleted (
7221                                tiRoot,
7222                                tiOrgIORequest,
7223                                tiIOFailed,
7224                                tiDetailOtherError,
7225                                agNULL,
7226                                satOrgIOContext->interruptContext
7227                               );
7228     }
7229     satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7230
7231     satFreeIntIoResource( tiRoot,
7232                            satDevData,
7233                            satIntIo);
7234    return;
7235
7236  }
7237
7238  if (agIOStatus != OSSA_IO_SUCCESS)
7239  {
7240    /* only agsaFisRegDeviceToHost_t is expected */
7241    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
7242    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
7243  }
7244
7245  TI_DBG5(("satSendDiagnosticCB: fis command 0x%x\n", hostToDevFis->h.command));
7246
7247  if( agIOStatus != OSSA_IO_SUCCESS)
7248  {
7249  /*
7250    checking IO status, FIS type and error status
7251  */
7252  satDevData->satVerifyState = 0;
7253  satDevData->satBGPendingDiag = agFALSE;
7254
7255  if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
7256      ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
7257      )
7258  {
7259
7260    /* for debugging */
7261    if( agIOStatus != OSSA_IO_SUCCESS)
7262    {
7263      if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) ||
7264           (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7265      {
7266        TI_DBG1(("satSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_READ_VERIFY_SECTORS(_EXT)\n"));
7267      }
7268      else
7269      {
7270        TI_DBG1(("satSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n"));
7271      }
7272    }
7273
7274    /* for debugging */
7275    if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
7276    {
7277      if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) ||
7278           (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7279      {
7280        TI_DBG1(("satSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_READ_VERIFY_SECTORS(_EXT)\n", statDevToHostFisHeader->fisType));
7281      }
7282      else
7283      {
7284        TI_DBG1(("satSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n",statDevToHostFisHeader->fisType));
7285      }
7286    }
7287
7288    /* for debugging */
7289    if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
7290         (ataStatus & DF_ATA_STATUS_MASK)
7291         )
7292    {
7293      if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) ||
7294           (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7295      {
7296        TI_DBG1(("satSendDiagnosticCB: FAILED, error status and SAT_READ_VERIFY_SECTORS(_EXT)\n"));
7297      }
7298      else
7299      {
7300        TI_DBG1(("satSendDiagnosticCB: FAILED, error status and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n"));
7301      }
7302    }
7303
7304    /* Process abort case */
7305    if (agIOStatus == OSSA_IO_ABORTED)
7306    {
7307      satProcessAbort(tiRoot,
7308                      tiOrgIORequest,
7309                      satOrgIOContext
7310                      );
7311
7312      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7313
7314      satFreeIntIoResource( tiRoot,
7315                            satDevData,
7316                            satIntIo);
7317      return;
7318    }
7319
7320    if ( (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS) ||
7321         (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7322    {
7323      /* report using the original tiIOrequst */
7324      /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */
7325      satSetSensePayload( pSense,
7326                          SCSI_SNSKEY_HARDWARE_ERROR,
7327                          0,
7328                          SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7329                          satOrgIOContext);
7330
7331      ostiInitiatorIOCompleted( tiRoot,
7332                                tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7333                                tiIOSuccess,
7334                                SCSI_STAT_CHECK_CONDITION,
7335                                satOrgIOContext->pTiSenseData,
7336                                satOrgIOContext->interruptContext );
7337
7338      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7339
7340      satFreeIntIoResource( tiRoot,
7341                            satDevData,
7342                            satIntIo);
7343      return;
7344    }
7345    else
7346    {
7347      /* report using the original tiIOrequst */
7348      /* failed during sending SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
7349      satSetSensePayload( pSense,
7350                          SCSI_SNSKEY_HARDWARE_ERROR,
7351                          0,
7352                          SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7353                          satOrgIOContext);
7354
7355      if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
7356      {
7357        /* no completion for background send diagnotic. It is done in satSendDiagnostic() */
7358        ostiInitiatorIOCompleted( tiRoot,
7359                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7360                                  tiIOSuccess,
7361                                  SCSI_STAT_CHECK_CONDITION,
7362                                  satOrgIOContext->pTiSenseData,
7363                                  satOrgIOContext->interruptContext );
7364
7365      }
7366      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7367
7368      satFreeIntIoResource( tiRoot,
7369                            satDevData,
7370                            satIntIo);
7371      return;
7372    }
7373  }
7374  }
7375
7376  /* processing success case */
7377  switch (hostToDevFis->h.command)
7378  {
7379  case SAT_READ_VERIFY_SECTORS:     /* fall through */
7380  case SAT_READ_VERIFY_SECTORS_EXT:
7381    TI_DBG5(("satSendDiagnosticCB: SAT_READ_VERIFY_SECTORS(_EXT) case\n"));
7382    tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
7383    satDevData->satVerifyState++;
7384    tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
7385    TI_DBG5(("satSendDiagnosticCB: satVerifyState %d\n",satDevData->satVerifyState));
7386
7387    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7388
7389    /* done with internally genereated AT_READ_VERIFY_SECTORS(_EXT) */
7390    satFreeIntIoResource( tiRoot,
7391                          satDevData,
7392                          satIntIo);
7393
7394    if (satDevData->satVerifyState == 3)
7395    {
7396      /* reset satVerifyState */
7397      satDevData->satVerifyState = 0;
7398      /* return GOOD status */
7399      TI_DBG5(("satSendDiagnosticCB: return GOOD status\n"));
7400      ostiInitiatorIOCompleted( tiRoot,
7401                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7402                                tiIOSuccess,
7403                                SCSI_STAT_GOOD,
7404                                agNULL,
7405                                satOrgIOContext->interruptContext );
7406     return;
7407    }
7408    else
7409    {
7410
7411      /* prepare SAT_READ_VERIFY_SECTORS(_EXT) */
7412      satNewIntIo = satAllocIntIoResource( tiRoot,
7413                                           tiOrgIORequest,
7414                                           satDevData,
7415                                           0,
7416                                           satNewIntIo);
7417      if (satNewIntIo == agNULL)
7418      {
7419        /* reset satVerifyState */
7420        satDevData->satVerifyState = 0;
7421        /* memory allocation failure */
7422        satFreeIntIoResource( tiRoot,
7423                              satDevData,
7424                              satNewIntIo);
7425
7426        /* failed as a part of sending SAT_READ_VERIFY_SECTORS(_EXT) */
7427        satSetSensePayload( pSense,
7428                            SCSI_SNSKEY_HARDWARE_ERROR,
7429                            0,
7430                            SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7431                            satOrgIOContext);
7432
7433        ostiInitiatorIOCompleted( tiRoot,
7434                                  tiOrgIORequest,
7435                                  tiIOSuccess,
7436                                  SCSI_STAT_CHECK_CONDITION,
7437                                  satOrgIOContext->pTiSenseData,
7438                                  satOrgIOContext->interruptContext );
7439
7440        TI_DBG1(("satSendDiagnosticCB: momory allocation fails\n"));
7441        return;
7442      } /* end of memory allocation failure */
7443
7444      /*
7445       * Need to initialize all the fields within satIOContext
7446       */
7447
7448      satNewIOContext = satPrepareNewIO(
7449                                        satNewIntIo,
7450                                        tiOrgIORequest,
7451                                        satDevData,
7452                                        scsiCmnd,
7453                                        satOrgIOContext
7454                                        );
7455
7456      if (satDevData->satVerifyState == 1)
7457      {
7458        /* sending SAT_CHECK_POWER_MODE */
7459        status = satSendDiagnostic_1( tiRoot,
7460                                      &satNewIntIo->satIntTiIORequest,
7461                                      satNewIOContext->ptiDeviceHandle,
7462                                      &satNewIntIo->satIntTiScsiXchg,
7463                                      satNewIOContext);
7464      }
7465      else
7466      {
7467        /* satDevData->satVerifyState == 2 */
7468        status = satSendDiagnostic_2( tiRoot,
7469                                      &satNewIntIo->satIntTiIORequest,
7470                                      satNewIOContext->ptiDeviceHandle,
7471                                      &satNewIntIo->satIntTiScsiXchg,
7472                                      satNewIOContext);
7473      }
7474
7475      if (status != tiSuccess)
7476      {
7477        /* sending SAT_READ_VERIFY_SECTORS(_EXT) fails */
7478        satFreeIntIoResource( tiRoot,
7479                              satDevData,
7480                              satNewIntIo);
7481
7482        /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */
7483        satSetSensePayload( pSense,
7484                            SCSI_SNSKEY_HARDWARE_ERROR,
7485                            0,
7486                            SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7487                            satOrgIOContext);
7488
7489        ostiInitiatorIOCompleted( tiRoot,
7490                                  tiOrgIORequest,
7491                                  tiIOSuccess,
7492                                  SCSI_STAT_CHECK_CONDITION,
7493                                  satOrgIOContext->pTiSenseData,
7494                                  satOrgIOContext->interruptContext );
7495
7496        /* reset satVerifyState */
7497        satDevData->satVerifyState = 0;
7498        TI_DBG1(("satSendDiagnosticCB: calling satSendDiagnostic_1 or _2 fails\n"));
7499        return;
7500      }
7501    } /* satDevData->satVerifyState == 1 or 2 */
7502
7503    break;
7504  case SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE:
7505    TI_DBG5(("satSendDiagnosticCB: SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE case\n"));
7506
7507    satDevData->satBGPendingDiag = agFALSE;
7508
7509    if (hostToDevFis->d.lbaLow == 0x01 || hostToDevFis->d.lbaLow == 0x02)
7510    {
7511      /* for background send diagnostic, no completion here. It is done already. */
7512      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7513
7514      /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
7515      satFreeIntIoResource( tiRoot,
7516                            satDevData,
7517                            satIntIo);
7518      TI_DBG5(("satSendDiagnosticCB: returning but no IOCompleted\n"));
7519    }
7520    else
7521    {
7522      TI_DBG5(("satSendDiagnosticCB: returning good status for senddiagnostic\n"));
7523      ostiInitiatorIOCompleted( tiRoot,
7524                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7525                                tiIOSuccess,
7526                                SCSI_STAT_GOOD,
7527                                agNULL,
7528                                satOrgIOContext->interruptContext );
7529
7530
7531      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7532
7533      /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
7534      satFreeIntIoResource( tiRoot,
7535                            satDevData,
7536                            satIntIo);
7537    }
7538
7539    break;
7540  default:
7541    TI_DBG1(("satSendDiagnosticCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
7542    /* unspecified case, return no sense and no addition info */
7543    satSetSensePayload( pSense,
7544                        SCSI_SNSKEY_NO_SENSE,
7545                        0,
7546                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
7547                        satOrgIOContext);
7548
7549    ostiInitiatorIOCompleted( tiRoot,
7550                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7551                              tiIOSuccess,
7552                              SCSI_STAT_CHECK_CONDITION,
7553                              satOrgIOContext->pTiSenseData,
7554                              satOrgIOContext->interruptContext );
7555
7556    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7557
7558    satFreeIntIoResource( tiRoot,
7559                          satDevData,
7560                          satIntIo);
7561    break;
7562  }
7563  return;
7564}
7565/*****************************************************************************
7566*! \brief  satRequestSenseCB
7567*
7568*   This routine is a callback function called from ossaSATACompleted().
7569*   This CB routine deals with Request Sense completion.
7570*
7571*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
7572*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
7573*  \param   agIOStatus:  Status of completed I/O.
7574*  \param   agFirstDword:Pointer to the four bytes of FIS.
7575*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
7576*                        length.
7577*  \param   agParam:     Additional info based on status.
7578*  \param   ioContext:   Pointer to satIOContext_t.
7579*
7580*  \return: none
7581*
7582*****************************************************************************/
7583/*
7584  CB for internnaly generated SMART_RETURN_STATUS and SAT_CHECK_POWER_MODE
7585  in the process of RequestSense
7586
7587*/
7588void satRequestSenseCB(
7589                        agsaRoot_t        *agRoot,
7590                        agsaIORequest_t   *agIORequest,
7591                        bit32             agIOStatus,
7592                        agsaFisHeader_t   *agFirstDword,
7593                        bit32             agIOInfoLen,
7594                        void              *agParam,
7595                        void              *ioContext
7596                        )
7597{
7598  /* ATA Vol 1, p299 SAT_SMART_RETURN_STATUS */
7599  /*
7600    if threshold exceeds, return SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE
7601    else call satRequestSense_1 to send CHECK_POWER_MODE
7602  */
7603
7604  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
7605  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
7606  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
7607  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
7608  tdIORequestBody_t       *tdIORequestBody;
7609  tdIORequestBody_t       *tdOrgIORequestBody;
7610  satIOContext_t          *satIOContext;
7611  satIOContext_t          *satOrgIOContext;
7612  satIOContext_t          *satNewIOContext;
7613  satInternalIo_t         *satIntIo;
7614  satInternalIo_t         *satNewIntIo = agNULL;
7615  satDeviceData_t         *satDevData;
7616  scsiRspSense_t            *pSense;
7617  tiIORequest_t             *tiOrgIORequest;
7618  tiIniScsiCmnd_t           *scsiCmnd;
7619
7620  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
7621  bit32                     ataStatus = 0;
7622  bit32                     status;
7623  agsaFisRegD2HHeader_t     *statDevToHostFisHeader = agNULL;
7624  agsaFisRegD2HData_t       statDevToHostFisData;
7625  bit32                     lenReceived = 0;
7626  bit32                     dataLength;
7627
7628  TI_DBG4(("satRequestSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
7629
7630  /* internally generate tiIOContext */
7631  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
7632  satIOContext           = (satIOContext_t *) ioContext;
7633  satIntIo               = satIOContext->satIntIoContext;
7634  satDevData             = satIOContext->pSatDevData;
7635  hostToDevFis           = satIOContext->pFis;
7636
7637  /*ttttttthe one */
7638  if (satIntIo == agNULL)
7639  {
7640    TI_DBG4(("satRequestSenseCB: External satInternalIo_t satIntIoContext\n"));
7641    satOrgIOContext = satIOContext;
7642    tiOrgIORequest  = tdIORequestBody->tiIORequest;
7643    if (satOrgIOContext->superIOFlag)
7644    {
7645      pSense = (scsiRspSense_t *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7646    }
7647    else
7648    {
7649      pSense = (scsiRspSense_t *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7650    }
7651    scsiCmnd = satOrgIOContext->pScsiCmnd;
7652  }
7653  else
7654  {
7655    TI_DBG4(("satRequestSenseCB: Internal satInternalIo_t satIntIoContext\n"));
7656    satOrgIOContext        = satIOContext->satOrgIOContext;
7657    if (satOrgIOContext == agNULL)
7658    {
7659      TI_DBG4(("satRequestSenseCB: satOrgIOContext is NULL, wrong\n"));
7660      return;
7661    }
7662    else
7663    {
7664      TI_DBG4(("satRequestSenseCB: satOrgIOContext is NOT NULL\n"));
7665    }
7666    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
7667    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
7668
7669    if (satOrgIOContext->superIOFlag)
7670    {
7671      pSense = (scsiRspSense_t *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7672    }
7673    else
7674    {
7675      pSense = (scsiRspSense_t *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7676    }
7677    scsiCmnd = satOrgIOContext->pScsiCmnd;
7678  }
7679
7680  tdIORequestBody->ioCompleted = agTRUE;
7681  tdIORequestBody->ioStarted = agFALSE;
7682
7683  TI_DBG4(("satRequestSenseCB: fis command 0x%x\n", hostToDevFis->h.command));
7684
7685  lenReceived = scsiCmnd->cdb[4];
7686  TI_DBG1(("satRequestSenseCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived));
7687
7688  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
7689  {
7690    TI_DBG1(("satRequestSenseCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
7691    ostiInitiatorIOCompleted (
7692                             tiRoot,
7693                             tiOrgIORequest,
7694                             tiIOFailed,
7695                             tiDetailOtherError,
7696                             agNULL,
7697                             satOrgIOContext->interruptContext
7698                             );
7699
7700    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7701
7702    satFreeIntIoResource( tiRoot,
7703                          satDevData,
7704                          satIntIo);
7705
7706    return;
7707  }
7708
7709  /*
7710    checking IO status, FIS type and error status
7711  */
7712  if (agIOStatus != OSSA_IO_SUCCESS)
7713  {
7714    /* only agsaFisRegDeviceToHost_t is expected */
7715    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
7716    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
7717
7718    /* for debugging */
7719    if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
7720    {
7721      if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
7722      {
7723        TI_DBG1(("satRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_RETURN_STATU\n", statDevToHostFisHeader->fisType));
7724      }
7725      else
7726      {
7727        TI_DBG1(("satRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_CHECK_POWER_MODE\n",statDevToHostFisHeader->fisType));
7728      }
7729    }
7730
7731    /* for debugging */
7732    if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
7733         (ataStatus & DF_ATA_STATUS_MASK)
7734         )
7735    {
7736      if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
7737      {
7738        TI_DBG1(("satRequestSenseCB: FAILED, error status and SAT_SMART_RETURN_STATU\n"));
7739      }
7740      else
7741      {
7742        TI_DBG1(("satRequestSenseCB: FAILED, error status and SAT_CHECK_POWER_MODE\n"));
7743      }
7744    }
7745
7746    /* Process abort case */
7747    if (agIOStatus == OSSA_IO_ABORTED)
7748    {
7749      satProcessAbort(tiRoot,
7750                      tiOrgIORequest,
7751                      satOrgIOContext
7752                      );
7753
7754      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7755
7756      satFreeIntIoResource( tiRoot,
7757                            satDevData,
7758                            satIntIo);
7759      return;
7760    }
7761
7762    if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
7763    {
7764      /* report using the original tiIOrequst */
7765      /* failed during sending SMART RETURN STATUS */
7766      satSetSensePayload( pSense,
7767                          SCSI_SNSKEY_NO_SENSE,
7768                          0,
7769                          SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE,
7770                          satOrgIOContext);
7771
7772      if (SENSE_DATA_LENGTH < lenReceived)
7773      {
7774        /* underrun */
7775        ostiInitiatorIOCompleted( tiRoot,
7776                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7777                                  tiIOUnderRun,
7778                                  lenReceived - SENSE_DATA_LENGTH,
7779                                  agNULL,
7780                                  satOrgIOContext->interruptContext );
7781      }
7782      else
7783      {
7784        ostiInitiatorIOCompleted( tiRoot,
7785                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7786                                  tiIOSuccess,
7787                                  SCSI_STAT_GOOD,
7788                                  agNULL,
7789                                  satOrgIOContext->interruptContext );
7790      }
7791    }
7792    else
7793    {
7794      /* report using the original tiIOrequst */
7795      /* failed during sending SAT_CHECK_POWER_MODE */
7796      satSetSensePayload( pSense,
7797                          SCSI_SNSKEY_NO_SENSE,
7798                          0,
7799                          SCSI_SNSCODE_LOW_POWER_CONDITION_ON,
7800                          satOrgIOContext);
7801
7802      if (SENSE_DATA_LENGTH < lenReceived)
7803      {
7804        /* underrun */
7805        ostiInitiatorIOCompleted( tiRoot,
7806                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7807                                  tiIOUnderRun,
7808                                  lenReceived - SENSE_DATA_LENGTH,
7809                                  agNULL,
7810                                  satOrgIOContext->interruptContext );
7811       }
7812       else
7813       {
7814        ostiInitiatorIOCompleted( tiRoot,
7815                                  tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7816                                  tiIOSuccess,
7817                                  SCSI_STAT_GOOD,
7818                                  agNULL,
7819                                  satOrgIOContext->interruptContext );
7820       }
7821    }
7822
7823
7824    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7825
7826    satFreeIntIoResource( tiRoot,
7827                            satDevData,
7828                            satIntIo);
7829    return;
7830  }
7831
7832  saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t));
7833
7834  switch (hostToDevFis->h.command)
7835  {
7836  case SAT_SMART_RETURN_STATUS:
7837    TI_DBG4(("satRequestSenseCB: SAT_SMART_RETURN_STATUS case\n"));
7838    if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C)
7839    {
7840      /* threshold exceeds */
7841      TI_DBG1(("satRequestSenseCB: threshold exceeds\n"));
7842
7843
7844      /* report using the original tiIOrequst */
7845      /* failed during sending SMART RETURN STATUS */
7846      satSetSensePayload( pSense,
7847                          SCSI_SNSKEY_NO_SENSE,
7848                          0,
7849                          SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE,
7850                          satOrgIOContext);
7851
7852      if (SENSE_DATA_LENGTH < lenReceived)
7853      {
7854        /* underrun */
7855        ostiInitiatorIOCompleted( tiRoot,
7856                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7857                                  tiIOUnderRun,
7858                                  lenReceived - SENSE_DATA_LENGTH,
7859                                  agNULL,
7860                                  satOrgIOContext->interruptContext );                                     }
7861      else
7862      {
7863        ostiInitiatorIOCompleted( tiRoot,
7864                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7865                                  tiIOSuccess,
7866                                  SCSI_STAT_GOOD,
7867                                  agNULL,
7868                                  satOrgIOContext->interruptContext );                                     }
7869
7870
7871      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7872
7873      satFreeIntIoResource( tiRoot,
7874                            satDevData,
7875                            satIntIo);
7876      return;
7877    }
7878
7879
7880    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7881
7882    /* done with internally genereated SAT_SMART_RETURN_STATUS */
7883    satFreeIntIoResource( tiRoot,
7884                          satDevData,
7885                          satIntIo);
7886
7887    /* at this point, successful SMART_RETURN_STATUS
7888       xmit SAT_CHECK_POWER_MODE
7889    */
7890    if (satOrgIOContext->superIOFlag)
7891    {
7892      dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
7893    }
7894    else
7895    {
7896      dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
7897    }
7898
7899    satNewIntIo = satAllocIntIoResource( tiRoot,
7900                                         tiOrgIORequest,
7901                                         satDevData,
7902                                         dataLength,
7903                                         satNewIntIo);
7904    if (satNewIntIo == agNULL)
7905    {
7906      /* memory allocation failure */
7907      satFreeIntIoResource( tiRoot,
7908                            satDevData,
7909                            satNewIntIo);
7910
7911      /* failed as a part of sending SMART RETURN STATUS */
7912      satSetSensePayload( pSense,
7913                          SCSI_SNSKEY_NO_SENSE,
7914                          0,
7915                          SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE,
7916                          satOrgIOContext);
7917
7918      if (SENSE_DATA_LENGTH < lenReceived)
7919      {
7920        /* underrun */
7921        ostiInitiatorIOCompleted( tiRoot,
7922                                  tiOrgIORequest,
7923                                  tiIOUnderRun,
7924                                  lenReceived - SENSE_DATA_LENGTH,
7925                                  agNULL,
7926                                  satOrgIOContext->interruptContext );
7927      }
7928      else
7929      {
7930        ostiInitiatorIOCompleted( tiRoot,
7931                                  tiOrgIORequest,
7932                                  tiIOSuccess,
7933                                  SCSI_STAT_GOOD,
7934                                  agNULL,
7935                                  satOrgIOContext->interruptContext );
7936      }
7937
7938      TI_DBG1(("satRequestSenseCB: momory allocation fails\n"));
7939      return;
7940    } /* end of memory allocation failure */
7941
7942
7943    /*
7944     * Need to initialize all the fields within satIOContext
7945     */
7946
7947    satNewIOContext = satPrepareNewIO(
7948                                      satNewIntIo,
7949                                      tiOrgIORequest,
7950                                      satDevData,
7951                                      scsiCmnd,
7952                                      satOrgIOContext
7953                                      );
7954
7955    /* sending SAT_CHECK_POWER_MODE */
7956    status = satRequestSense_1( tiRoot,
7957                               &satNewIntIo->satIntTiIORequest,
7958                               satNewIOContext->ptiDeviceHandle,
7959                               &satNewIntIo->satIntTiScsiXchg,
7960                               satNewIOContext);
7961
7962    if (status != tiSuccess)
7963    {
7964      /* sending SAT_CHECK_POWER_MODE fails */
7965      satFreeIntIoResource( tiRoot,
7966                            satDevData,
7967                            satNewIntIo);
7968
7969      /* failed during sending SAT_CHECK_POWER_MODE */
7970      satSetSensePayload( pSense,
7971                          SCSI_SNSKEY_NO_SENSE,
7972                          0,
7973                          SCSI_SNSCODE_LOW_POWER_CONDITION_ON,
7974                          satOrgIOContext);
7975
7976      if (SENSE_DATA_LENGTH < lenReceived)
7977      {
7978        /* underrun */
7979        ostiInitiatorIOCompleted( tiRoot,
7980                                  tiOrgIORequest,
7981                                  tiIOUnderRun,
7982                                  lenReceived - SENSE_DATA_LENGTH,
7983                                  agNULL,
7984                                  satOrgIOContext->interruptContext );
7985      }
7986      else
7987      {
7988        ostiInitiatorIOCompleted( tiRoot,
7989                                  tiOrgIORequest,
7990                                  tiIOSuccess,
7991                                  SCSI_STAT_GOOD,
7992                                  agNULL,
7993                                  satOrgIOContext->interruptContext );
7994      }
7995
7996      TI_DBG1(("satRequestSenseCB: calling satRequestSense_1 fails\n"));
7997      return;
7998    }
7999
8000    break;
8001  case SAT_CHECK_POWER_MODE:
8002    TI_DBG4(("satRequestSenseCB: SAT_CHECK_POWER_MODE case\n"));
8003
8004    /* check ATA STANDBY state */
8005    if (statDevToHostFisData.sectorCount == 0x00)
8006    {
8007      /* in STANDBY */
8008      TI_DBG1(("satRequestSenseCB: in standby\n"));
8009
8010
8011      /* report using the original tiIOrequst */
8012      /* failed during sending SAT_CHECK_POWER_MODE */
8013      satSetSensePayload( pSense,
8014                          SCSI_SNSKEY_NO_SENSE,
8015                          0,
8016                          SCSI_SNSCODE_LOW_POWER_CONDITION_ON,
8017                          satOrgIOContext);
8018
8019      if (SENSE_DATA_LENGTH < lenReceived)
8020      {
8021        /* underrun */
8022        ostiInitiatorIOCompleted( tiRoot,
8023                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8024                                  tiIOUnderRun,
8025                                  lenReceived - SENSE_DATA_LENGTH,
8026                                  agNULL,
8027                                  satOrgIOContext->interruptContext );
8028      }
8029      else
8030      {
8031        ostiInitiatorIOCompleted( tiRoot,
8032                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8033                                  tiIOSuccess,
8034                                  SCSI_STAT_GOOD,
8035                                  agNULL,
8036                                  satOrgIOContext->interruptContext );
8037      }
8038
8039      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8040
8041      satFreeIntIoResource( tiRoot,
8042                            satDevData,
8043                            satIntIo);
8044      return;
8045    }
8046
8047    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8048
8049    /* done with internnaly generated SAT_CHECK_POWER_MODE */
8050    satFreeIntIoResource( tiRoot,
8051                          satDevData,
8052                          satIntIo);
8053
8054    if (satDevData->satFormatState == agTRUE)
8055    {
8056      TI_DBG1(("satRequestSenseCB: in format\n"));
8057
8058
8059      /* report using the original tiIOrequst */
8060      satSetSensePayload( pSense,
8061                          SCSI_SNSKEY_NOT_READY,
8062                          0,
8063                          SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_FORMAT_IN_PROGRESS,
8064                          satOrgIOContext);
8065
8066      if (SENSE_DATA_LENGTH < lenReceived)
8067      {
8068        /* underrun */
8069        ostiInitiatorIOCompleted( tiRoot,
8070                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8071                                  tiIOUnderRun,
8072                                  lenReceived - SENSE_DATA_LENGTH,
8073                                  agNULL,
8074                                  satOrgIOContext->interruptContext );
8075      }
8076      else
8077      {
8078        ostiInitiatorIOCompleted( tiRoot,
8079                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8080                                  tiIOSuccess,
8081                                  SCSI_STAT_GOOD,
8082                                  agNULL,
8083                                  satOrgIOContext->interruptContext );
8084      }
8085
8086      return;
8087    }
8088
8089    /* normal: returns good status for requestsense */
8090    /* report using the original tiIOrequst */
8091    satSetSensePayload( pSense,
8092                        SCSI_SNSKEY_NO_SENSE,
8093                        0,
8094                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8095                        satOrgIOContext);
8096    TI_DBG4(("satRequestSenseCB: returning good status for requestsense\n"));
8097    if (SENSE_DATA_LENGTH < lenReceived)
8098    {
8099      /* underrun */
8100      TI_DBG6(("satRequestSenseCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n",
8101        SENSE_DATA_LENGTH, lenReceived, tiOrgIORequest));
8102      ostiInitiatorIOCompleted( tiRoot,
8103                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8104                                tiIOUnderRun,
8105                                lenReceived - SENSE_DATA_LENGTH,
8106                                agNULL,
8107                                satOrgIOContext->interruptContext );
8108
8109    }
8110    else
8111    {
8112      ostiInitiatorIOCompleted( tiRoot,
8113                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8114                                tiIOSuccess,
8115                                SCSI_STAT_GOOD,
8116                                agNULL,
8117                                satOrgIOContext->interruptContext );
8118    }
8119
8120    break;
8121  default:
8122     TI_DBG1(("satRequestSenseCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
8123     /* pSense here is a part of satOrgIOContext */
8124     pSense = satOrgIOContext->pTiSenseData->senseData;
8125     satOrgIOContext->pTiSenseData->senseLen = SENSE_DATA_LENGTH;
8126     /* unspecified case, return no sense and no addition info */
8127     satSetSensePayload( pSense,
8128                         SCSI_SNSKEY_NO_SENSE,
8129                         0,
8130                         SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8131                         satOrgIOContext);
8132
8133     ostiInitiatorIOCompleted( tiRoot,
8134                               tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8135                               tiIOSuccess,
8136                               SCSI_STAT_CHECK_CONDITION,
8137                               satOrgIOContext->pTiSenseData,
8138                               satOrgIOContext->interruptContext );
8139
8140     satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8141
8142     satFreeIntIoResource( tiRoot,
8143                           satDevData,
8144                           satIntIo);
8145    break;
8146  } /* switch */
8147
8148  return;
8149}
8150
8151/*****************************************************************************
8152*! \brief  satSynchronizeCache10n16CB
8153*
8154*   This routine is a callback function for satSynchronizeCache10 and
8155*   satSynchronizeCache1016()
8156*
8157*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
8158*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
8159*  \param   agIOStatus:  Status of completed I/O.
8160*  \param   agFirstDword:Pointer to the four bytes of FIS.
8161*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8162*                        length.
8163*  \param   agParam:     Additional info based on status.
8164*  \param   ioContext:   Pointer to satIOContext_t.
8165*
8166*  \return: none
8167*
8168*****************************************************************************/
8169void satSynchronizeCache10n16CB(
8170                                agsaRoot_t        *agRoot,
8171                                agsaIORequest_t   *agIORequest,
8172                                bit32             agIOStatus,
8173                                agsaFisHeader_t   *agFirstDword,
8174                                bit32             agIOInfoLen,
8175                                void              *agParam,
8176                                void              *ioContext
8177                                )
8178{
8179  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
8180  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
8181  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
8182  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8183  tdIORequestBody_t       *tdIORequestBody;
8184  tdIORequestBody_t       *tdOrgIORequestBody;
8185  satIOContext_t          *satIOContext;
8186  satIOContext_t          *satOrgIOContext;
8187  satInternalIo_t         *satIntIo;
8188  satDeviceData_t         *satDevData;
8189
8190  scsiRspSense_t            *pSense;
8191  tiIniScsiCmnd_t           *scsiCmnd;
8192  tiIORequest_t             *tiOrgIORequest;
8193
8194  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
8195  bit32                     ataStatus = 0;
8196  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
8197
8198  TI_DBG5(("satSynchronizeCache10n16CB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
8199
8200  /* internally generate tiIOContext */
8201  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
8202  satIOContext           = (satIOContext_t *) ioContext;
8203  satIntIo               = satIOContext->satIntIoContext;
8204  satDevData             = satIOContext->pSatDevData;
8205  hostToDevFis           = satIOContext->pFis;
8206
8207  /* SPC: Self-Test Result Log page */
8208
8209  if (satIntIo == agNULL)
8210  {
8211    TI_DBG4(("satSynchronizeCache10n16CB: External satInternalIo_t satIntIoContext\n"));
8212    satOrgIOContext = satIOContext;
8213    tiOrgIORequest  = tdIORequestBody->tiIORequest;
8214    pSense          = satIOContext->pSense;
8215    scsiCmnd        = satIOContext->pScsiCmnd;
8216  }
8217  else
8218  {
8219    TI_DBG4(("satSynchronizeCache10n16CB: Internal satInternalIo_t satIntIoContext\n"));
8220    satOrgIOContext        = satIOContext->satOrgIOContext;
8221    if (satOrgIOContext == agNULL)
8222    {
8223      TI_DBG4(("satSynchronizeCache10n16CB: satOrgIOContext is NULL, wrong\n"));
8224      return;
8225    }
8226    else
8227    {
8228      TI_DBG4(("satSynchronizeCache10n16CB: satOrgIOContext is NOT NULL\n"));
8229    }
8230    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
8231    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
8232
8233    pSense        = satOrgIOContext->pSense;
8234    scsiCmnd      = satOrgIOContext->pScsiCmnd;
8235  }
8236
8237  tdIORequestBody->ioCompleted = agTRUE;
8238  tdIORequestBody->ioStarted = agFALSE;
8239
8240  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
8241  {
8242    TI_DBG1(("satSynchronizeCache10n16CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
8243
8244    ostiInitiatorIOCompleted (
8245                             tiRoot,
8246                             tiOrgIORequest,
8247                             tiIOFailed,
8248                             tiDetailOtherError,
8249                             agNULL,
8250                             satOrgIOContext->interruptContext
8251                             );
8252    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8253
8254    satFreeIntIoResource( tiRoot,
8255                          satDevData,
8256                          satIntIo);
8257    return;
8258  }
8259
8260  if( agIOStatus != OSSA_IO_SUCCESS)
8261  {
8262    /* only agsaFisRegDeviceToHost_t is expected */
8263    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
8264    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
8265  }
8266
8267  if( agIOStatus != OSSA_IO_SUCCESS)
8268  {
8269  if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
8270       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
8271       )
8272  {
8273    /* for debugging */
8274    if( agIOStatus != OSSA_IO_SUCCESS)
8275    {
8276      TI_DBG1(("satSynchronizeCache10n16CB: FAILED, NOT IO_SUCCESS\n"));
8277    }
8278    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
8279    {
8280      TI_DBG1(("satSynchronizeCache10n16CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
8281    }
8282    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
8283              (ataStatus & DF_ATA_STATUS_MASK)
8284              )
8285    {
8286      TI_DBG1(("satSynchronizeCache10n16CB: FAILED, FAILED, error status\n"));
8287    }
8288
8289
8290    /* Process abort case */
8291    if (agIOStatus == OSSA_IO_ABORTED)
8292    {
8293      satProcessAbort(tiRoot,
8294                      tiOrgIORequest,
8295                      satOrgIOContext
8296                      );
8297
8298      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8299
8300      satFreeIntIoResource( tiRoot,
8301                            satDevData,
8302                            satIntIo);
8303      return;
8304    }
8305
8306    switch (hostToDevFis->h.command)
8307    {
8308    case SAT_FLUSH_CACHE:
8309      TI_DBG1(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE failed\n"));
8310      /* checking IMMED bit */
8311      if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)
8312      {
8313        satSetDeferredSensePayload( pSense,
8314                                    SCSI_SNSKEY_NO_SENSE,
8315                                    0,
8316                                    SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8317                                    satOrgIOContext);
8318      }
8319      else
8320      {
8321        satSetDeferredSensePayload( pSense,
8322                                    SCSI_SNSKEY_NO_SENSE,
8323                                    0,
8324                                    SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8325                                    satOrgIOContext);
8326      }
8327
8328
8329      ostiInitiatorIOCompleted( tiRoot,
8330                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8331                                tiIOSuccess,
8332                                SCSI_STAT_CHECK_CONDITION,
8333                                satOrgIOContext->pTiSenseData,
8334                                satOrgIOContext->interruptContext );
8335
8336      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8337
8338      satFreeIntIoResource( tiRoot,
8339                            satDevData,
8340                            satIntIo);
8341      return;
8342      break;
8343    case SAT_FLUSH_CACHE_EXT:
8344      TI_DBG1(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT failed\n"));
8345       /* checking IMMED bit */
8346      if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)
8347      {
8348        satSetDeferredSensePayload( pSense,
8349                                    SCSI_SNSKEY_NO_SENSE,
8350                                    0,
8351                                    SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8352                                    satOrgIOContext);
8353      }
8354      else
8355      {
8356        satSetDeferredSensePayload( pSense,
8357                                    SCSI_SNSKEY_NO_SENSE,
8358                                    0,
8359                                    SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8360                                    satOrgIOContext);
8361      }
8362
8363
8364      ostiInitiatorIOCompleted( tiRoot,
8365                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8366                                tiIOSuccess,
8367                                SCSI_STAT_CHECK_CONDITION,
8368                                satOrgIOContext->pTiSenseData,
8369                                satOrgIOContext->interruptContext );
8370
8371      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8372
8373      satFreeIntIoResource( tiRoot,
8374                            satDevData,
8375                            satIntIo);
8376      return;
8377      break;
8378    default:
8379      TI_DBG1(("satSynchronizeCache10n16CB: error unknown command 0x%x\n", hostToDevFis->h.command));
8380      satSetSensePayload( pSense,
8381                          SCSI_SNSKEY_NO_SENSE,
8382                          0,
8383                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8384                          satOrgIOContext);
8385
8386
8387      ostiInitiatorIOCompleted( tiRoot,
8388                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8389                                tiIOSuccess,
8390                                SCSI_STAT_CHECK_CONDITION,
8391                                satOrgIOContext->pTiSenseData,
8392                                satOrgIOContext->interruptContext );
8393
8394      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8395
8396      satFreeIntIoResource( tiRoot,
8397                            satDevData,
8398                            satIntIo);
8399      return;
8400      break;
8401    }
8402
8403    return;
8404  } /* end of error checking */
8405  }
8406
8407  /* prcessing the success case */
8408  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8409
8410  satFreeIntIoResource( tiRoot,
8411                        satDevData,
8412                        satIntIo);
8413
8414
8415  switch (hostToDevFis->h.command)
8416  {
8417  case SAT_FLUSH_CACHE:
8418    TI_DBG5(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE success\n"));
8419
8420    /* checking IMMED bit */
8421    if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK))
8422    {
8423      ostiInitiatorIOCompleted( tiRoot,
8424                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8425                                tiIOSuccess,
8426                                SCSI_STAT_GOOD,
8427                                agNULL,
8428                                satOrgIOContext->interruptContext );
8429      return;
8430    }
8431
8432
8433    break;
8434  case SAT_FLUSH_CACHE_EXT:
8435    TI_DBG5(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT success\n"));
8436
8437    /* checking IMMED bit */
8438    if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK))
8439    {
8440      ostiInitiatorIOCompleted( tiRoot,
8441                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8442                                tiIOSuccess,
8443                                SCSI_STAT_GOOD,
8444                                agNULL,
8445                                satOrgIOContext->interruptContext );
8446      return;
8447    }
8448
8449    break;
8450  default:
8451    TI_DBG5(("satSynchronizeCache10n16CB: error unknown command 0x%x\n", hostToDevFis->h.command));
8452    satSetSensePayload( pSense,
8453                        SCSI_SNSKEY_NO_SENSE,
8454                        0,
8455                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8456                        satOrgIOContext);
8457
8458
8459    ostiInitiatorIOCompleted( tiRoot,
8460                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8461                              tiIOSuccess,
8462                              SCSI_STAT_CHECK_CONDITION,
8463                              satOrgIOContext->pTiSenseData,
8464                              satOrgIOContext->interruptContext );
8465
8466    return;
8467    break;
8468  }
8469
8470  return;
8471}
8472
8473/*****************************************************************************
8474*! \brief  satModeSelect6n10CB
8475*
8476*   This routine is a callback function for satModeSelect6() and
8477*   satModeSelect10()
8478*
8479*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
8480*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
8481*  \param   agIOStatus:  Status of completed I/O.
8482*  \param   agFirstDword:Pointer to the four bytes of FIS.
8483*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8484*                        length.
8485*  \param   agParam:     Additional info based on status.
8486*  \param   ioContext:   Pointer to satIOContext_t.
8487*
8488*  \return: none
8489*
8490*****************************************************************************/
8491void satModeSelect6n10CB(
8492                         agsaRoot_t        *agRoot,
8493                         agsaIORequest_t   *agIORequest,
8494                         bit32             agIOStatus,
8495                         agsaFisHeader_t   *agFirstDword,
8496                         bit32             agIOInfoLen,
8497                         void              *agParam,
8498                         void              *ioContext
8499                         )
8500{
8501  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
8502  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
8503  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
8504  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8505  tdIORequestBody_t       *tdIORequestBody;
8506  tdIORequestBody_t       *tdOrgIORequestBody;
8507  satIOContext_t          *satIOContext;
8508  satIOContext_t          *satOrgIOContext;
8509  satIOContext_t          *satNewIOContext;
8510  satInternalIo_t         *satIntIo;
8511  satInternalIo_t         *satNewIntIo = agNULL;
8512  satDeviceData_t         *satDevData;
8513  scsiRspSense_t            *pSense;
8514  tiIniScsiCmnd_t           *scsiCmnd;
8515  tiIORequest_t             *tiOrgIORequest;
8516
8517  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
8518  bit32                     ataStatus = 0;
8519  bit32                     status;
8520  tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
8521  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
8522
8523  TI_DBG5(("satModeSelect6n10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
8524
8525  /* internally generate tiIOContext */
8526  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
8527  satIOContext           = (satIOContext_t *) ioContext;
8528  satIntIo               = satIOContext->satIntIoContext;
8529  satDevData             = satIOContext->pSatDevData;
8530  hostToDevFis           = satIOContext->pFis;
8531
8532  if (satIntIo == agNULL)
8533  {
8534    TI_DBG4(("satModeSelect6n10CB: External satInternalIo_t satIntIoContext\n"));
8535    satOrgIOContext = satIOContext;
8536    tiOrgIORequest  = tdIORequestBody->tiIORequest;
8537    tiScsiRequest   = satOrgIOContext->tiScsiXchg;
8538    pSense          = satOrgIOContext->pSense;
8539    scsiCmnd        = satOrgIOContext->pScsiCmnd;
8540  }
8541  else
8542  {
8543    TI_DBG4(("satModeSelect6n10CB: Internal satInternalIo_t satIntIoContext\n"));
8544    satOrgIOContext        = satIOContext->satOrgIOContext;
8545    if (satOrgIOContext == agNULL)
8546    {
8547      TI_DBG4(("satModeSelect6n10CB: satOrgIOContext is NULL, wrong\n"));
8548      return;
8549    }
8550    else
8551    {
8552      TI_DBG4(("satModeSelect6n10CB: satOrgIOContext is NOT NULL\n"));
8553    }
8554    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
8555    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
8556
8557    tiScsiRequest = satOrgIOContext->tiScsiXchg;
8558    pSense        = satOrgIOContext->pSense;
8559    scsiCmnd      = satOrgIOContext->pScsiCmnd;
8560  }
8561
8562  tdIORequestBody->ioCompleted = agTRUE;
8563  tdIORequestBody->ioStarted = agFALSE;
8564
8565  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
8566  {
8567    TI_DBG1(("satModeSelect6n10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
8568    ostiInitiatorIOCompleted (
8569                             tiRoot,
8570                             tiOrgIORequest,
8571                             tiIOFailed,
8572                             tiDetailOtherError,
8573                             agNULL,
8574                             satOrgIOContext->interruptContext
8575                             );
8576    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8577
8578    satFreeIntIoResource( tiRoot,
8579                          satDevData,
8580                          satIntIo);
8581    return;
8582  }
8583
8584  if (agIOStatus != OSSA_IO_SUCCESS)
8585  {
8586    /* only agsaFisRegDeviceToHost_t is expected */
8587    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
8588    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
8589  }
8590
8591  if (agIOStatus != OSSA_IO_SUCCESS)
8592  {
8593  if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
8594       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
8595       )
8596  {
8597    /* for debugging */
8598    if( agIOStatus != OSSA_IO_SUCCESS)
8599    {
8600      TI_DBG1(("satModeSelect6n10CB FAILED, NOT IO_SUCCESS\n"));
8601    }
8602    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
8603    {
8604      TI_DBG1(("satModeSelect6n10CB FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
8605    }
8606    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
8607              (ataStatus & DF_ATA_STATUS_MASK)
8608              )
8609    {
8610      TI_DBG1(("satModeSelect6n10CB FAILED, FAILED, error status\n"));
8611    }
8612
8613    /* Process abort case */
8614    if (agIOStatus == OSSA_IO_ABORTED)
8615    {
8616      satProcessAbort(tiRoot,
8617                      tiOrgIORequest,
8618                      satOrgIOContext
8619                      );
8620
8621      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8622
8623      satFreeIntIoResource( tiRoot,
8624                            satDevData,
8625                            satIntIo);
8626      return;
8627    }
8628
8629    /* for debugging */
8630    if (hostToDevFis->h.command == SAT_SET_FEATURES)
8631    {
8632      if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02))
8633      {
8634        TI_DBG1(("satModeSelect6n10CB 1 SAT_SET_FEATURES failed, feature 0x%x\n", hostToDevFis->h.features));
8635      }
8636      else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55))
8637      {
8638        TI_DBG1(("ssatModeSelect6n10CB 2 SAT_SET_FEATURES failed, feature 0x%x\n", hostToDevFis->h.features));
8639      }
8640      else
8641      {
8642        TI_DBG1(("satModeSelect6n10CB error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8643      }
8644    }
8645    else if (hostToDevFis->h.command == SAT_SMART)
8646    {
8647      if ((hostToDevFis->h.features == SAT_SMART_ENABLE_OPERATIONS) || (hostToDevFis->h.features == SAT_SMART_DISABLE_OPERATIONS))
8648      {
8649        TI_DBG1(("satModeSelect6n10CB SAT_SMART_ENABLE/DISABLE_OPERATIONS failed, feature 0x%x\n", hostToDevFis->h.features));
8650      }
8651      else
8652      {
8653        TI_DBG1(("satModeSelect6n10CB error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8654      }
8655    }
8656    else
8657    {
8658      TI_DBG1(("satModeSelect6n10CB error default case command 0x%x\n", hostToDevFis->h.command));
8659    }
8660
8661
8662    satSetSensePayload( pSense,
8663                        SCSI_SNSKEY_NO_SENSE,
8664                        0,
8665                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8666                        satOrgIOContext);
8667
8668    ostiInitiatorIOCompleted( tiRoot,
8669                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8670                              tiIOSuccess,
8671                              SCSI_STAT_CHECK_CONDITION,
8672                              satOrgIOContext->pTiSenseData,
8673                              satOrgIOContext->interruptContext );
8674
8675
8676    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8677
8678    satFreeIntIoResource( tiRoot,
8679                          satDevData,
8680                          satIntIo);
8681    return;
8682  } /* error checking */
8683  }
8684
8685
8686  /* prcessing the success case */
8687
8688
8689  if (hostToDevFis->h.command == SAT_SET_FEATURES)
8690  {
8691    if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02))
8692    {
8693      TI_DBG5(("satModeSelect6n10CB 1 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features));
8694
8695      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8696
8697      satFreeIntIoResource( tiRoot,
8698                            satDevData,
8699                            satIntIo);
8700
8701      satNewIntIo = satAllocIntIoResource( tiRoot,
8702                                           tiOrgIORequest,
8703                                           satDevData,
8704                                           0,
8705                                           satNewIntIo);
8706      if (satNewIntIo == agNULL)
8707      {
8708        /* memory allocation failure */
8709        satFreeIntIoResource( tiRoot,
8710                              satDevData,
8711                              satNewIntIo);
8712
8713        satSetSensePayload( pSense,
8714                            SCSI_SNSKEY_NO_SENSE,
8715                            0,
8716                            SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8717                            satOrgIOContext);
8718
8719        ostiInitiatorIOCompleted( tiRoot,
8720                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8721                                  tiIOSuccess,
8722                                  SCSI_STAT_CHECK_CONDITION,
8723                                  satOrgIOContext->pTiSenseData,
8724                                  satOrgIOContext->interruptContext );
8725        TI_DBG1(("satModeSelect6n10CB: momory allocation fails\n"));
8726        return;
8727      } /* end memory allocation */
8728
8729      satNewIOContext = satPrepareNewIO(
8730                                        satNewIntIo,
8731                                        tiOrgIORequest,
8732                                        satDevData,
8733                                        scsiCmnd,
8734                                        satOrgIOContext
8735                                        );
8736      /* sends either ATA SET FEATURES based on DRA bit */
8737      status = satModeSelect6n10_1( tiRoot,
8738                                 &satNewIntIo->satIntTiIORequest,
8739                                 satNewIOContext->ptiDeviceHandle,
8740                                 tiScsiRequest, /* orginal from OS layer */
8741                                 satNewIOContext
8742                                 );
8743
8744      if (status != tiSuccess)
8745      {
8746        /* sending ATA command fails */
8747        satFreeIntIoResource( tiRoot,
8748                              satDevData,
8749                              satNewIntIo);
8750        satSetSensePayload( pSense,
8751                            SCSI_SNSKEY_NO_SENSE,
8752                            0,
8753                            SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8754                            satOrgIOContext);
8755
8756        ostiInitiatorIOCompleted( tiRoot,
8757                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8758                                  tiIOSuccess,
8759                                  SCSI_STAT_CHECK_CONDITION,
8760                                  satOrgIOContext->pTiSenseData,
8761                                  satOrgIOContext->interruptContext );
8762        TI_DBG1(("satModeSelect6n10CB calling satModeSelect6_1 fails\n"));
8763        return;
8764      } /* end send fails */
8765      return;
8766    }
8767    else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55))
8768    {
8769      TI_DBG5(("satModeSelect6n10CB 2 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features));
8770
8771      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8772
8773      satFreeIntIoResource( tiRoot,
8774                            satDevData,
8775                            satIntIo);
8776
8777      /* return stat_good */
8778      ostiInitiatorIOCompleted( tiRoot,
8779                                tiOrgIORequest,
8780                                tiIOSuccess,
8781                                SCSI_STAT_GOOD,
8782                                agNULL,
8783                                satOrgIOContext->interruptContext );
8784      return;
8785    }
8786    else
8787    {
8788      TI_DBG1(("satModeSelect6n10CB error unknown command success 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8789
8790      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8791
8792      satFreeIntIoResource( tiRoot,
8793                            satDevData,
8794                            satIntIo);
8795      satSetSensePayload( pSense,
8796                          SCSI_SNSKEY_NO_SENSE,
8797                          0,
8798                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8799                          satOrgIOContext);
8800
8801      ostiInitiatorIOCompleted( tiRoot,
8802                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8803                                tiIOSuccess,
8804                                SCSI_STAT_CHECK_CONDITION,
8805                                satOrgIOContext->pTiSenseData,
8806                                satOrgIOContext->interruptContext );
8807      return;
8808    }
8809  }
8810  else if (hostToDevFis->h.command == SAT_SMART_ENABLE_OPERATIONS ||
8811             hostToDevFis->h.command == SAT_SMART_DISABLE_OPERATIONS
8812            )
8813  {
8814    if ((hostToDevFis->h.features == 0xD8) || (hostToDevFis->h.features == 0xD9))
8815    {
8816      TI_DBG5(("satModeSelect6n10CB SAT_SMART_ENABLE/DISABLE_OPERATIONS success, feature 0x%x\n", hostToDevFis->h.features));
8817
8818      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8819
8820      satFreeIntIoResource( tiRoot,
8821                            satDevData,
8822                            satIntIo);
8823      /* return stat_good */
8824      ostiInitiatorIOCompleted( tiRoot,
8825                                tiOrgIORequest,
8826                                tiIOSuccess,
8827                                SCSI_STAT_GOOD,
8828                                agNULL,
8829                                satOrgIOContext->interruptContext );
8830      return;
8831    }
8832    else
8833    {
8834      TI_DBG1(("satModeSelect6n10CB error unknown command failed 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8835
8836      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8837
8838      satFreeIntIoResource( tiRoot,
8839                            satDevData,
8840                            satIntIo);
8841      satSetSensePayload( pSense,
8842                          SCSI_SNSKEY_NO_SENSE,
8843                          0,
8844                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8845                          satOrgIOContext);
8846
8847      ostiInitiatorIOCompleted( tiRoot,
8848                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8849                                tiIOSuccess,
8850                                SCSI_STAT_CHECK_CONDITION,
8851                                satOrgIOContext->pTiSenseData,
8852                                satOrgIOContext->interruptContext );
8853      return;
8854    }
8855  }
8856
8857  else
8858  {
8859    TI_DBG1(("satModeSelect6n10CB error default case command success 0x%x\n", hostToDevFis->h.command));
8860
8861    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8862
8863    satFreeIntIoResource( tiRoot,
8864                          satDevData,
8865                          satIntIo);
8866
8867    satSetSensePayload( pSense,
8868                        SCSI_SNSKEY_NO_SENSE,
8869                        0,
8870                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8871                        satOrgIOContext);
8872
8873    ostiInitiatorIOCompleted( tiRoot,
8874                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8875                              tiIOSuccess,
8876                              SCSI_STAT_CHECK_CONDITION,
8877                              satOrgIOContext->pTiSenseData,
8878                              satOrgIOContext->interruptContext );
8879    return;
8880  }
8881
8882  return;
8883}
8884
8885/*****************************************************************************
8886*! \brief  satSMARTEnableCB
8887*
8888*   This routine is a callback function for satSMARTEnable()
8889*
8890*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
8891*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
8892*  \param   agIOStatus:  Status of completed I/O.
8893*  \param   agFirstDword:Pointer to the four bytes of FIS.
8894*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8895*                        length.
8896*  \param   agParam:     Additional info based on status.
8897*  \param   ioContext:   Pointer to satIOContext_t.
8898*
8899*  \return: none
8900*
8901*****************************************************************************/
8902void satSMARTEnableCB(
8903                      agsaRoot_t        *agRoot,
8904                      agsaIORequest_t   *agIORequest,
8905                      bit32             agIOStatus,
8906                      agsaFisHeader_t   *agFirstDword,
8907                      bit32             agIOInfoLen,
8908                      void              *agParam,
8909                      void              *ioContext
8910                      )
8911{
8912  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
8913  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
8914  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
8915  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8916  tdIORequestBody_t       *tdIORequestBody;
8917  tdIORequestBody_t       *tdOrgIORequestBody;
8918  satIOContext_t          *satIOContext;
8919  satIOContext_t          *satOrgIOContext;
8920  satIOContext_t          *satNewIOContext;
8921  satInternalIo_t         *satIntIo;
8922  satInternalIo_t         *satNewIntIo = agNULL;
8923  satDeviceData_t         *satDevData;
8924  tiIORequest_t             *tiOrgIORequest;
8925  tiIniScsiCmnd_t           *scsiCmnd;
8926  bit32                     status;
8927
8928  TI_DBG4(("satSMARTEnableCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
8929
8930  /* internally generate tiIOContext */
8931  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
8932  satIOContext           = (satIOContext_t *) ioContext;
8933  satIntIo               = satIOContext->satIntIoContext;
8934  satDevData             = satIOContext->pSatDevData;
8935
8936  /*ttttttthe one */
8937  if (satIntIo == agNULL)
8938  {
8939    TI_DBG4(("satSMARTEnableCB: External satInternalIo_t satIntIoContext\n"));
8940    satOrgIOContext = satIOContext;
8941    tiOrgIORequest  = tdIORequestBody->tiIORequest;
8942    scsiCmnd        = satOrgIOContext->pScsiCmnd;
8943  }
8944  else
8945  {
8946    TI_DBG4(("satSMARTEnableCB: Internal satInternalIo_t satIntIoContext\n"));
8947    satOrgIOContext        = satIOContext->satOrgIOContext;
8948    if (satOrgIOContext == agNULL)
8949    {
8950      TI_DBG4(("satSMARTEnableCB: satOrgIOContext is NULL, wrong\n"));
8951      return;
8952    }
8953    else
8954    {
8955      TI_DBG4(("satSMARTEnableCB: satOrgIOContext is NOT NULL\n"));
8956    }
8957    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
8958    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
8959
8960    scsiCmnd               = satOrgIOContext->pScsiCmnd;
8961  }
8962
8963  tdIORequestBody->ioCompleted = agTRUE;
8964  tdIORequestBody->ioStarted = agFALSE;
8965
8966  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
8967  {
8968    TI_DBG1(("satSMARTEnableCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
8969    ostiInitiatorIOCompleted (
8970                             tiRoot,
8971                             tiOrgIORequest,
8972                             tiIOFailed,
8973                             tiDetailOtherError,
8974                             agNULL,
8975                             satOrgIOContext->interruptContext
8976                             );
8977
8978    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8979
8980    satFreeIntIoResource( tiRoot,
8981                          satDevData,
8982                          satIntIo);
8983
8984    return;
8985  }
8986
8987  /*
8988    checking IO status, FIS type and error status
8989  */
8990  if (agIOStatus != OSSA_IO_SUCCESS)
8991  {
8992    TI_DBG1(("satSMARTEnableCB: not success status, status %d\n", agIOStatus));
8993    ostiInitiatorIOCompleted (
8994                             tiRoot,
8995                             tiOrgIORequest,
8996                             tiIOFailed,
8997                             tiDetailOtherError,
8998                             agNULL,
8999                             satOrgIOContext->interruptContext
9000                             );
9001
9002    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9003
9004    satFreeIntIoResource( tiRoot,
9005                          satDevData,
9006                          satIntIo);
9007
9008    return;
9009  }
9010
9011  /* process success case */
9012  satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9013
9014  satFreeIntIoResource( tiRoot,
9015                        satDevData,
9016                        satIntIo);
9017
9018  satNewIntIo = satAllocIntIoResource( tiRoot,
9019                                       tiOrgIORequest,
9020                                       satDevData,
9021                                       512,
9022                                       satNewIntIo);
9023
9024  if (satNewIntIo == agNULL)
9025  {
9026    /* memory allocation failure */
9027    satFreeIntIoResource( tiRoot,
9028                          satDevData,
9029                          satNewIntIo);
9030
9031    ostiInitiatorIOCompleted (
9032                             tiRoot,
9033                             tiOrgIORequest,
9034                             tiIOFailed,
9035                             tiDetailOtherError,
9036                             agNULL,
9037                             satOrgIOContext->interruptContext
9038                             );
9039    return;
9040  }
9041
9042  satNewIOContext = satPrepareNewIO(
9043                                    satNewIntIo,
9044                                    tiOrgIORequest,
9045                                    satDevData,
9046                                    scsiCmnd,
9047                                    satOrgIOContext
9048                                    );
9049
9050  status = satLogSense_1(tiRoot,
9051                        &satNewIntIo->satIntTiIORequest,
9052                        satNewIOContext->ptiDeviceHandle,
9053                        &satNewIntIo->satIntTiScsiXchg,
9054                        satNewIOContext);
9055
9056  if (status != tiSuccess)
9057  {
9058    /* sending SAT_CHECK_POWER_MODE fails */
9059    satFreeIntIoResource( tiRoot,
9060                          satDevData,
9061                          satNewIntIo);
9062
9063    ostiInitiatorIOCompleted (
9064                             tiRoot,
9065                             tiOrgIORequest,
9066                             tiIOFailed,
9067                             tiDetailOtherError,
9068                             agNULL,
9069                             satOrgIOContext->interruptContext
9070                             );
9071
9072    return;
9073  }
9074
9075  return;
9076}
9077
9078
9079/*****************************************************************************
9080*! \brief  satLogSenseCB
9081*
9082*   This routine is a callback function for satLogSense()
9083*
9084*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
9085*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
9086*  \param   agIOStatus:  Status of completed I/O.
9087*  \param   agFirstDword:Pointer to the four bytes of FIS.
9088*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
9089*                        length.
9090*  \param   agParam:     Additional info based on status.
9091*  \param   ioContext:   Pointer to satIOContext_t.
9092*
9093*  \return: none
9094*
9095*****************************************************************************/
9096void satLogSenseCB(
9097                   agsaRoot_t        *agRoot,
9098                   agsaIORequest_t   *agIORequest,
9099                   bit32             agIOStatus,
9100                   agsaFisHeader_t   *agFirstDword,
9101                   bit32             agIOInfoLen,
9102                   void              *agParam,
9103                   void              *ioContext
9104                )
9105{
9106
9107  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
9108  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
9109  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
9110  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
9111  tdIORequestBody_t       *tdIORequestBody;
9112  tdIORequestBody_t       *tdOrgIORequestBody;
9113  satIOContext_t          *satIOContext;
9114  satIOContext_t          *satOrgIOContext;
9115  satInternalIo_t         *satIntIo;
9116  satDeviceData_t         *satDevData;
9117
9118  scsiRspSense_t            *pSense;
9119  tiIORequest_t             *tiOrgIORequest;
9120
9121  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
9122  bit32                     ataStatus = 0;
9123  tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
9124  tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* tiScsiXchg */
9125  satReadLogExtSelfTest_t   *virtAddr1;
9126  satSmartReadLogSelfTest_t *virtAddr2;
9127  bit8                      *pLogPage;
9128  bit8                      SelfTestExecutionStatus = 0;
9129  bit32                     i = 0;
9130
9131  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
9132  agsaFisRegD2HData_t      statDevToHostFisData;
9133  tiIniScsiCmnd_t          *scsiCmnd;
9134  bit32                     lenReceived = 0;
9135
9136  TI_DBG5(("satLogSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
9137
9138  /* internally generate tiIOContext */
9139  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
9140  satIOContext           = (satIOContext_t *) ioContext;
9141  if (satIOContext == agNULL)
9142  {
9143    TI_DBG1(("satLogSenseCB: satIOContext is NULL\n"));
9144    return;
9145  }
9146  satIntIo               = satIOContext->satIntIoContext;
9147  satDevData             = satIOContext->pSatDevData;
9148  hostToDevFis           = satIOContext->pFis;
9149
9150  if (satIntIo == agNULL)
9151  {
9152    TI_DBG4(("satLogSenseCB: External satInternalIo_t satIntIoContext\n"));
9153    satOrgIOContext = satIOContext;
9154    tiOrgIORequest  = tdIORequestBody->tiIORequest;
9155    pSense          = satOrgIOContext->pSense;
9156    tiOrgScsiRequest   = satOrgIOContext->tiScsiXchg;
9157    /* SCSI command response payload to OS layer */
9158    pLogPage        = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9159    /* ATA command response payload */
9160    tiScsiRequest   = satOrgIOContext->tiScsiXchg;
9161    scsiCmnd        = satOrgIOContext->pScsiCmnd;
9162  }
9163  else
9164  {
9165    TI_DBG4(("satLogSenseCB: Internal satInternalIo_t satIntIoContext\n"));
9166    satOrgIOContext        = satIOContext->satOrgIOContext;
9167    if (satOrgIOContext == agNULL)
9168    {
9169      TI_DBG4(("satLogSenseCB: satOrgIOContext is NULL\n"));
9170    }
9171    else
9172    {
9173      TI_DBG4(("satLogSenseCB: satOrgIOContext is NOT NULL\n"));
9174    }
9175
9176    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
9177    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
9178
9179    pSense        = satOrgIOContext->pSense;
9180    tiOrgScsiRequest   = satOrgIOContext->tiScsiXchg;
9181    /* SCSI command response payload to OS layer */
9182    pLogPage        = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9183    /* ATA command response payload */
9184    tiScsiRequest   =  (tiScsiInitiatorRequest_t *)&(satIntIo->satIntTiScsiXchg);
9185    scsiCmnd        = satOrgIOContext->pScsiCmnd;
9186  }
9187
9188  tdIORequestBody->ioCompleted = agTRUE;
9189  tdIORequestBody->ioStarted = agFALSE;
9190
9191  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
9192  {
9193    TI_DBG1(("satLogSenseCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
9194    ostiInitiatorIOCompleted (
9195                             tiRoot,
9196                             tiOrgIORequest,
9197                             tiIOFailed,
9198                             tiDetailOtherError,
9199                             agNULL,
9200                             satOrgIOContext->interruptContext
9201                             );
9202    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9203
9204    satFreeIntIoResource( tiRoot,
9205                          satDevData,
9206                          satIntIo);
9207    return;
9208  }
9209
9210  if (agIOStatus != OSSA_IO_SUCCESS)
9211  {
9212    /* non-data and pio read -> device to host and pio setup fis are expected */
9213    /*
9214      first, assumed to be Reg Device to Host FIS
9215      This is OK to just find fis type
9216    */
9217    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
9218    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
9219  }
9220
9221  if( agIOStatus != OSSA_IO_SUCCESS)
9222  {
9223  if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
9224        (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)) ||
9225       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
9226       )
9227  {
9228    /* for debugging */
9229    if( agIOStatus != OSSA_IO_SUCCESS)
9230    {
9231      TI_DBG1(("satLogSenseCB: FAILED, NOT IO_SUCCESS\n"));
9232    }
9233    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
9234    {
9235      TI_DBG1(("satLogSenseCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
9236    }
9237    else if (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)
9238    {
9239      TI_DBG1(("satLogSenseCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
9240    }
9241    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
9242              (ataStatus & DF_ATA_STATUS_MASK)
9243              )
9244    {
9245      TI_DBG1(("satLogSenseCB: FAILED, FAILED, error status\n"));
9246    }
9247
9248    /* Process abort case */
9249    if (agIOStatus == OSSA_IO_ABORTED)
9250    {
9251      satProcessAbort(tiRoot,
9252                      tiOrgIORequest,
9253                      satOrgIOContext
9254                      );
9255
9256      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9257
9258      satFreeIntIoResource( tiRoot,
9259                            satDevData,
9260                            satIntIo);
9261      return;
9262    }
9263
9264    /* for debugging */
9265    if (hostToDevFis->h.command == SAT_READ_LOG_EXT)
9266    {
9267      TI_DBG1(("satLogSenseCB: SAT_READ_LOG_EXT failed\n"));
9268    }
9269    else if (hostToDevFis->h.command == SAT_SMART)
9270    {
9271      if (hostToDevFis->h.features == SAT_SMART_READ_LOG)
9272      {
9273        TI_DBG1(("satLogSenseCB: SAT_SMART_READ_LOG failed\n"));
9274      }
9275      else if (hostToDevFis->h.features == SAT_SMART_RETURN_STATUS)
9276      {
9277        TI_DBG1(("satLogSenseCB: SAT_SMART_RETURN_STATUS failed\n"));
9278      }
9279      else
9280      {
9281        TI_DBG1(("satLogSenseCB: error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
9282      }
9283    }
9284    else
9285    {
9286      TI_DBG1(("satLogSenseCB: error default case command 0x%x\n", hostToDevFis->h.command));
9287    }
9288
9289    satSetSensePayload( pSense,
9290                        SCSI_SNSKEY_NO_SENSE,
9291                        0,
9292                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9293                        satOrgIOContext);
9294
9295    ostiInitiatorIOCompleted( tiRoot,
9296                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9297                              tiIOSuccess,
9298                              SCSI_STAT_CHECK_CONDITION,
9299                              satOrgIOContext->pTiSenseData,
9300                              satOrgIOContext->interruptContext );
9301
9302    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9303
9304    satFreeIntIoResource( tiRoot,
9305                          satDevData,
9306                          satIntIo);
9307    return;
9308
9309  } /* error checking */
9310  }
9311
9312  /* prcessing the success case */
9313  saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t));
9314
9315  lenReceived = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8];
9316  TI_DBG5(("satLogSenseCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived));
9317
9318
9319  if (hostToDevFis->h.command == SAT_READ_LOG_EXT)
9320  {
9321    TI_DBG5(("satLogSenseCB: SAT_READ_LOG_EXT success\n"));
9322
9323    /* process log data and sends it to upper */
9324
9325    /* ATA: Extended Self-Test Log */
9326    virtAddr1  = (satReadLogExtSelfTest_t *)(tiScsiRequest->sglVirtualAddr);
9327    /*
9328      ATA/ATAPI VOLII, p197, 287
9329      self-test execution status (4 bits); ((virtAddr1->byte[5] & 0xF0) >> 4)
9330    */
9331    SelfTestExecutionStatus  = (bit8)(((virtAddr1->byte[5] & 0xF0) >> 4));
9332
9333    /* fills in the log page from ATA log page */
9334    /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */
9335    pLogPage[0] = 0x10; /* page code */
9336    pLogPage[1] = 0;
9337    pLogPage[2] = 0x01;    /* 0x190, page length */
9338    pLogPage[3] = 0x90;
9339
9340    /* SPC-4, Table 217 */
9341    pLogPage[4] = 0;    /* Parameter Code */
9342    pLogPage[5] = 0x01; /* Parameter Code,  unspecfied but ... */
9343    pLogPage[6] = 3;    /* unspecified but ... */
9344    pLogPage[7] = 0x10; /* Parameter Length */
9345    pLogPage[8] = (bit8)(0 | ((virtAddr1->byte[5] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */
9346    pLogPage[9] = 0;    /* self test number */
9347    pLogPage[10] = virtAddr1->byte[7];    /* time stamp, MSB */
9348    pLogPage[11] = virtAddr1->byte[6];    /* time stamp, LSB */
9349
9350    pLogPage[12] = 0;    /* address of first failure MSB*/
9351    pLogPage[13] = 0;    /* address of first failure */
9352    pLogPage[14] = virtAddr1->byte[14];    /* address of first failure */
9353    pLogPage[15] = virtAddr1->byte[13];    /* address of first failure */
9354    pLogPage[16] = virtAddr1->byte[12];    /* address of first failure */
9355    pLogPage[17] = virtAddr1->byte[11];    /* address of first failure */
9356    pLogPage[18] = virtAddr1->byte[10];    /* address of first failure */
9357    pLogPage[19] = virtAddr1->byte[9];    /* address of first failure LSB */
9358
9359    /* SAT rev8 Table75, p 76 */
9360    switch (SelfTestExecutionStatus)
9361    {
9362    case 0:
9363      pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9364      pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9365      pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9366      break;
9367    case 1:
9368      pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9369      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9370      pLogPage[22] = 0x81;
9371      break;
9372    case 2:
9373      pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9374      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9375      pLogPage[22] = 0x82;
9376      break;
9377    case 3:
9378      pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9379      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9380      pLogPage[22] = 0x83;
9381      break;
9382    case 4:
9383      pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9384      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9385      pLogPage[22] = 0x84;
9386    break;
9387    case 5:
9388      pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9389      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9390      pLogPage[22] = 0x85;
9391      break;
9392    case 6:
9393      pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9394      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9395      pLogPage[22] = 0x86;
9396      break;
9397    case 7:
9398      pLogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR;
9399      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9400      pLogPage[22] = 0x87;
9401      break;
9402    case 8:
9403      pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9404      pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9405      pLogPage[22] = 0x88;
9406      break;
9407    case 9: /* fall through */
9408    case 10:/* fall through */
9409    case 11:/* fall through */
9410    case 12:/* fall through */
9411    case 13:/* fall through */
9412    case 14:
9413      pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9414      pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9415      pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9416      break;
9417    case 15:
9418      pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9419      pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9420      pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9421      break;
9422    default:
9423      TI_DBG1(("satLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x\n", SelfTestExecutionStatus));
9424
9425      satSetSensePayload( pSense,
9426                          SCSI_SNSKEY_NO_SENSE,
9427                          0,
9428                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9429                          satOrgIOContext);
9430
9431      ostiInitiatorIOCompleted( tiRoot,
9432                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9433                                tiIOSuccess,
9434                                SCSI_STAT_CHECK_CONDITION,
9435                                satOrgIOContext->pTiSenseData,
9436                                satOrgIOContext->interruptContext );
9437
9438      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9439
9440      satFreeIntIoResource( tiRoot,
9441                            satDevData,
9442                            satIntIo);
9443
9444      return;
9445    }
9446
9447    pLogPage[23] = 0;    /* vendor specific */
9448
9449    /* the rest of Self-test results log */
9450    /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/
9451    for (i=24;i<=403;i++)
9452    {
9453      pLogPage[i] = 0;    /* vendor specific */
9454    }
9455
9456    if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < lenReceived)
9457    {
9458      TI_DBG6(("satLogSenseCB: 1st underrun lenReceived %d len %d \n", lenReceived, SELFTEST_RESULTS_LOG_PAGE_LENGTH));
9459
9460      /* underrun */
9461      ostiInitiatorIOCompleted( tiRoot,
9462                                tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9463                                tiIOUnderRun,
9464                                lenReceived - SELFTEST_RESULTS_LOG_PAGE_LENGTH,
9465                                agNULL,
9466                                satOrgIOContext->interruptContext );
9467
9468    }
9469    else
9470    {
9471      ostiInitiatorIOCompleted( tiRoot,
9472                              tiOrgIORequest,
9473                              tiIOSuccess,
9474                              SCSI_STAT_GOOD,
9475                              agNULL,
9476                              satOrgIOContext->interruptContext);
9477    }
9478
9479    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9480
9481    satFreeIntIoResource( tiRoot,
9482                          satDevData,
9483                          satIntIo);
9484
9485    return;
9486  }
9487  else if (hostToDevFis->h.command == SAT_SMART_READ_LOG
9488           || hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
9489  {
9490    if (hostToDevFis->h.features == 0xd5)
9491    {
9492      TI_DBG5(("satLogSenseCB: SAT_SMART_READ_LOG success\n"));
9493      /* process log data and sends it to upper */
9494
9495      /* ATA: Extended Self-Test Log */
9496      virtAddr2  = (satSmartReadLogSelfTest_t *)(tiScsiRequest->sglVirtualAddr);
9497      /*
9498        SPC-4, p197, 287
9499        self-test execution status (4 bits); ((virtAddr2->byte[3] & 0xF0) >> 4)
9500      */
9501      SelfTestExecutionStatus  = (bit8)(((virtAddr2->byte[3] & 0xF0) >> 4));
9502
9503      /* fills in the log page from ATA log page */
9504      /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */
9505      pLogPage[0] = 0x10;    /* page code */
9506      pLogPage[1] = 0;
9507      pLogPage[2] = 0x01;    /* 0x190, page length */
9508      pLogPage[3] = 0x90;    /* 0x190, page length */
9509
9510      /* SPC-4, Table 217 */
9511      pLogPage[4] = 0;    /* Parameter Code */
9512      pLogPage[5] = 0x01; /* Parameter Code unspecfied but ... */
9513      pLogPage[6] = 3;    /* unspecified but ... */
9514      pLogPage[7] = 0x10; /* Parameter Length */
9515      pLogPage[8] = (bit8)(0 | ((virtAddr2->byte[3] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */
9516      pLogPage[9] = 0;    /* self test number */
9517      pLogPage[10] = virtAddr2->byte[5];    /* time stamp, MSB */
9518      pLogPage[11] = virtAddr2->byte[4];    /* time stamp, LSB */
9519
9520      pLogPage[12] = 0;    /* address of first failure MSB*/
9521      pLogPage[13] = 0;    /* address of first failure */
9522      pLogPage[14] = 0;    /* address of first failure */
9523      pLogPage[15] = 0;    /* address of first failure */
9524      pLogPage[16] = virtAddr2->byte[10];    /* address of first failure */
9525      pLogPage[17] = virtAddr2->byte[9];    /* address of first failure */
9526      pLogPage[18] = virtAddr2->byte[8];    /* address of first failure */
9527      pLogPage[19] = virtAddr2->byte[7];    /* address of first failure LSB */
9528
9529      /* SAT rev8 Table75, p 76 */
9530      switch (SelfTestExecutionStatus)
9531      {
9532      case 0:
9533        pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9534        pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9535        pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9536        break;
9537      case 1:
9538        pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9539        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9540        pLogPage[22] = 0x81;
9541        break;
9542      case 2:
9543        pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9544        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9545        pLogPage[22] = 0x82;
9546        break;
9547      case 3:
9548        pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9549        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9550        pLogPage[22] = 0x83;
9551        break;
9552      case 4:
9553        pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9554        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9555        pLogPage[22] = 0x84;
9556        break;
9557      case 5:
9558        pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9559        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9560        pLogPage[22] = 0x85;
9561        break;
9562      case 6:
9563        pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9564        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9565        pLogPage[22] = 0x86;
9566        break;
9567      case 7:
9568        pLogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR;
9569        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9570        pLogPage[22] = 0x87;
9571        break;
9572      case 8:
9573        pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9574        pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9575        pLogPage[22] = 0x88;
9576        break;
9577      case 9: /* fall through */
9578      case 10:/* fall through */
9579      case 11:/* fall through */
9580      case 12:/* fall through */
9581      case 13:/* fall through */
9582      case 14:
9583        /* unspecified */
9584        pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9585        pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9586        pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9587        break;
9588      case 15:
9589        pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9590        pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9591        pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9592        break;
9593      default:
9594        TI_DBG1(("satLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x\n", SelfTestExecutionStatus));
9595
9596        satSetSensePayload( pSense,
9597                            SCSI_SNSKEY_NO_SENSE,
9598                            0,
9599                            SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9600                            satOrgIOContext);
9601
9602        ostiInitiatorIOCompleted( tiRoot,
9603                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9604                                  tiIOSuccess,
9605                                  SCSI_STAT_CHECK_CONDITION,
9606                                  satOrgIOContext->pTiSenseData,
9607                                  satOrgIOContext->interruptContext );
9608
9609        satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9610
9611        satFreeIntIoResource( tiRoot,
9612                              satDevData,
9613                              satIntIo);
9614
9615        return;
9616      }
9617
9618      pLogPage[23] = 0;    /* vendor specific */
9619
9620      /* the rest of Self-test results log */
9621      /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/
9622      for (i=24;i<=403;i++)
9623      {
9624        pLogPage[i] = 0;    /* vendor specific */
9625      }
9626
9627      if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < lenReceived)
9628      {
9629        TI_DBG6(("satLogSenseCB: 2nd underrun lenReceived %d len %d \n", lenReceived, SELFTEST_RESULTS_LOG_PAGE_LENGTH));
9630
9631        /* underrun */
9632        ostiInitiatorIOCompleted( tiRoot,
9633                                tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9634                                tiIOUnderRun,
9635                                lenReceived - SELFTEST_RESULTS_LOG_PAGE_LENGTH,
9636                                agNULL,
9637                                satOrgIOContext->interruptContext );
9638
9639      }
9640      else
9641      {
9642        ostiInitiatorIOCompleted( tiRoot,
9643                                tiOrgIORequest,
9644                                tiIOSuccess,
9645                                SCSI_STAT_GOOD,
9646                                agNULL,
9647                                satOrgIOContext->interruptContext);
9648      }
9649      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9650
9651      satFreeIntIoResource( tiRoot,
9652                            satDevData,
9653                            satIntIo);
9654
9655      return;
9656    }
9657    else if (hostToDevFis->h.features == 0xda)
9658    {
9659      TI_DBG5(("satLogSenseCB: SAT_SMART_RETURN_STATUS success\n"));
9660
9661      /* fills in the log page from ATA output */
9662      /* SPC-4, 7.2.5, Table 209, 211, p 255 */
9663      pLogPage[0] = 0x2F;    /* page code unspecified */
9664      pLogPage[1] = 0;       /* reserved */
9665      pLogPage[2] = 0;       /* page length */
9666      pLogPage[3] = 0x07;    /* page length */
9667
9668      /*
9669        SPC-4, 7.2.5, Table 211, p 255
9670        no vendor specific field
9671       */
9672      pLogPage[4] = 0;    /* Parameter Code */
9673      pLogPage[5] = 0;    /* Parameter Code unspecfied but to do: */
9674      pLogPage[6] = 0;    /* unspecified */
9675      pLogPage[7] = 0x03; /* Parameter length, unspecified */
9676
9677      /* SAT rev8, 10.2.3.1 Table 72, p 73 */
9678      if (statDevToHostFisData.lbaMid == 0x4F || statDevToHostFisData.lbaHigh == 0xC2)
9679      {
9680        pLogPage[8] = 0;   /* Sense code */
9681        pLogPage[9] = 0;   /* Sense code qualifier */
9682      }
9683      else if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C)
9684      {
9685        pLogPage[8] = 0x5D;   /* Sense code */
9686        pLogPage[9] = 0x10;   /* Sense code qualifier */
9687      }
9688
9689      /* Assumption: No support for SCT */
9690      pLogPage[10] = 0xFF; /* Most Recent Temperature Reading */
9691
9692      if (INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH < lenReceived)
9693      {
9694        TI_DBG6(("satLogSenseCB: 3rd underrun lenReceived %d len %d \n", lenReceived, INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH));
9695
9696        /* underrun */
9697        ostiInitiatorIOCompleted( tiRoot,
9698                                tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9699                                tiIOUnderRun,
9700                                lenReceived - INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH,
9701                                agNULL,
9702                                satOrgIOContext->interruptContext );
9703
9704      }
9705      else
9706      {
9707        ostiInitiatorIOCompleted( tiRoot,
9708                                tiOrgIORequest,
9709                                tiIOSuccess,
9710                                SCSI_STAT_GOOD,
9711                                agNULL,
9712                                satOrgIOContext->interruptContext);
9713      }
9714
9715      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9716
9717      satFreeIntIoResource( tiRoot,
9718                            satDevData,
9719                            satIntIo);
9720
9721
9722      return;
9723    }
9724    else
9725    {
9726      TI_DBG1(("satLogSenseCB: error unknown command success 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
9727      satSetSensePayload( pSense,
9728                          SCSI_SNSKEY_NO_SENSE,
9729                          0,
9730                          SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9731                          satOrgIOContext);
9732
9733      ostiInitiatorIOCompleted( tiRoot,
9734                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9735                                tiIOSuccess,
9736                                SCSI_STAT_CHECK_CONDITION,
9737                                satOrgIOContext->pTiSenseData,
9738                                satOrgIOContext->interruptContext );
9739      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9740
9741      satFreeIntIoResource( tiRoot,
9742                            satDevData,
9743                            satIntIo);
9744
9745      return;
9746    }
9747  }
9748  else
9749  {
9750    TI_DBG1(("satLogSenseCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
9751    satSetSensePayload( pSense,
9752                        SCSI_SNSKEY_NO_SENSE,
9753                        0,
9754                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9755                        satOrgIOContext);
9756
9757    ostiInitiatorIOCompleted( tiRoot,
9758                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9759                              tiIOSuccess,
9760                              SCSI_STAT_CHECK_CONDITION,
9761                              satOrgIOContext->pTiSenseData,
9762                              satOrgIOContext->interruptContext );
9763
9764    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9765
9766    satFreeIntIoResource( tiRoot,
9767                          satDevData,
9768                          satIntIo);
9769
9770    return;
9771  }
9772
9773  return;
9774}
9775
9776/*****************************************************************************
9777*! \brief  satReadMediaSerialNumberCB
9778*
9779*   This routine is a callback function called from ossaSATACompleted().
9780*   This CB routine deals with Read Media Serial Number completion.
9781*
9782*  \param   agRoot:       Handles for this instance of SAS/SATA hardware
9783*  \param   agIORequest:  Pointer to the LL I/O request context for this I/O.
9784*  \param   agIOStatus:   Status of completed I/O.
9785*  \param   agSATAParm1:  Additional info based on status.
9786*  \param   agIOInfoLen:  Length in bytes of overrun/underrun residual or FIS
9787*                         length.
9788*  \param   ioContext:    Pointer to satIOContext_t.
9789*
9790*  \return: none
9791*
9792*****************************************************************************/
9793void satReadMediaSerialNumberCB(
9794                        agsaRoot_t        *agRoot,
9795                        agsaIORequest_t   *agIORequest,
9796                        bit32             agIOStatus,
9797                        agsaFisHeader_t   *agFirstDword,
9798                        bit32             agIOInfoLen,
9799                        agsaFrameHandle_t agFrameHandle,
9800                        void              *ioContext
9801                        )
9802{
9803  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
9804  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
9805  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
9806  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
9807  tdIORequestBody_t       *tdIORequestBody;
9808  tdIORequestBody_t       *tdOrgIORequestBody;
9809  satIOContext_t          *satIOContext;
9810  satIOContext_t          *satOrgIOContext;
9811  satInternalIo_t         *satIntIo;
9812  satDeviceData_t         *satDevData;
9813
9814  scsiRspSense_t          *pSense;
9815  tiIORequest_t           *tiOrgIORequest;
9816
9817  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
9818  tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* tiScsiXchg */
9819  bit8                      *pMediaSerialNumber;
9820
9821  tiIniScsiCmnd_t          *scsiCmnd;
9822  bit32                    lenReceived = 0;
9823
9824  TI_DBG4(("satReadMediaSerialNumberCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
9825
9826  /* internally generate tiIOContext */
9827  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
9828  satIOContext           = (satIOContext_t *) ioContext;
9829  satIntIo               = satIOContext->satIntIoContext;
9830  satDevData             = satIOContext->pSatDevData;
9831  hostToDevFis           = satIOContext->pFis;
9832
9833  if (satIntIo == agNULL)
9834  {
9835    TI_DBG4(("satReadMediaSerialNumberCB: External satInternalIo_t satIntIoContext\n"));
9836    satOrgIOContext = satIOContext;
9837    tiOrgIORequest  = tdIORequestBody->tiIORequest;
9838    pSense          = satOrgIOContext->pSense;
9839    tiOrgScsiRequest          = satOrgIOContext->tiScsiXchg;
9840    /* SCSI command response payload to OS layer */
9841    pMediaSerialNumber        = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9842    /* ATA command response payload */
9843    scsiCmnd        = satOrgIOContext->pScsiCmnd;
9844
9845
9846  }
9847  else
9848  {
9849    TI_DBG4(("satReadMediaSerialNumberCB: Internal satInternalIo_t satIntIoContext\n"));
9850    satOrgIOContext        = satIOContext->satOrgIOContext;
9851    if (satOrgIOContext == agNULL)
9852    {
9853      TI_DBG4(("satReadMediaSerialNumberCB: satOrgIOContext is NULL, wrong\n"));
9854      return;
9855    }
9856    else
9857    {
9858      TI_DBG4(("satReadMediaSerialNumberCB: satOrgIOContext is NOT NULL\n"));
9859    }
9860    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
9861    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
9862
9863    pSense        = satOrgIOContext->pSense;
9864    tiOrgScsiRequest   = satOrgIOContext->tiScsiXchg;
9865    /* SCSI command response payload to OS layer */
9866    pMediaSerialNumber        = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9867    /* ATA command response payload */
9868    scsiCmnd        = satOrgIOContext->pScsiCmnd;
9869  }
9870
9871  tdIORequestBody->ioCompleted = agTRUE;
9872  tdIORequestBody->ioStarted = agFALSE;
9873
9874  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
9875  {
9876    TI_DBG1(("satReadMediaSerialNumberCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
9877    ostiInitiatorIOCompleted (
9878                             tiRoot,
9879                             tiOrgIORequest,
9880                             tiIOFailed,
9881                             tiDetailOtherError,
9882                             agNULL,
9883                             satOrgIOContext->interruptContext
9884                             );
9885    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9886
9887    satFreeIntIoResource( tiRoot,
9888                          satDevData,
9889                          satIntIo);
9890    return;
9891  }
9892
9893  if( agIOStatus != OSSA_IO_SUCCESS)
9894  {
9895    /* Process abort case */
9896    if (agIOStatus == OSSA_IO_ABORTED)
9897    {
9898      satProcessAbort(tiRoot,
9899                      tiOrgIORequest,
9900                      satOrgIOContext
9901                      );
9902
9903      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9904
9905      satFreeIntIoResource( tiRoot,
9906                            satDevData,
9907                            satIntIo);
9908      return;
9909    }
9910    satSetSensePayload( pSense,
9911                        SCSI_SNSKEY_NOT_READY,
9912                        0,
9913                        SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
9914                        satOrgIOContext);
9915
9916    ostiInitiatorIOCompleted( tiRoot,
9917                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9918                              tiIOSuccess,
9919                              SCSI_STAT_CHECK_CONDITION,
9920                              satOrgIOContext->pTiSenseData,
9921                              satOrgIOContext->interruptContext );
9922
9923    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9924
9925    satFreeIntIoResource( tiRoot,
9926                          satDevData,
9927                          satIntIo);
9928    return;
9929  }
9930
9931  /* process success case */
9932  lenReceived = (scsiCmnd->cdb[6] << (8*3)) + (scsiCmnd->cdb[7] << (8*2))
9933                + (scsiCmnd->cdb[8] << 8) + scsiCmnd->cdb[9];
9934  TI_DBG5(("satReadMediaSerialNumberCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived));
9935
9936  if (hostToDevFis->h.command == SAT_READ_SECTORS ||
9937      hostToDevFis->h.command == SAT_READ_SECTORS_EXT
9938     )
9939  {
9940    pMediaSerialNumber[0] = 0;
9941    pMediaSerialNumber[1] = 0;
9942    pMediaSerialNumber[2] = 0;
9943    pMediaSerialNumber[3] = 4;
9944    pMediaSerialNumber[4] = 0;
9945    pMediaSerialNumber[5] = 0;
9946    pMediaSerialNumber[6] = 0;
9947    pMediaSerialNumber[7] = 0;
9948
9949    if (ZERO_MEDIA_SERIAL_NUMBER_LENGTH < lenReceived)
9950    {
9951      TI_DBG1(("satReadMediaSerialNumberCB: 1st underrun lenReceived %d len %d \n", lenReceived, ZERO_MEDIA_SERIAL_NUMBER_LENGTH));
9952
9953      /* underrun */
9954      ostiInitiatorIOCompleted( tiRoot,
9955                                tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9956                                tiIOUnderRun,
9957                                lenReceived - ZERO_MEDIA_SERIAL_NUMBER_LENGTH,
9958                                agNULL,
9959                                satOrgIOContext->interruptContext );
9960
9961    }
9962    else
9963    {
9964      ostiInitiatorIOCompleted( tiRoot,
9965                              tiOrgIORequest,
9966                              tiIOSuccess,
9967                              SCSI_STAT_GOOD,
9968                              agNULL,
9969                              satOrgIOContext->interruptContext);
9970    }
9971    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9972
9973    satFreeIntIoResource( tiRoot,
9974                          satDevData,
9975                          satIntIo);
9976    return;
9977  }
9978  else
9979  {
9980    TI_DBG1(("satReadMediaSerialNumberCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
9981    satSetSensePayload( pSense,
9982                        SCSI_SNSKEY_NO_SENSE,
9983                        0,
9984                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9985                        satOrgIOContext);
9986
9987    ostiInitiatorIOCompleted( tiRoot,
9988                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9989                              tiIOSuccess,
9990                              SCSI_STAT_CHECK_CONDITION,
9991                              satOrgIOContext->pTiSenseData,
9992                              satOrgIOContext->interruptContext );
9993
9994    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9995
9996    satFreeIntIoResource( tiRoot,
9997                          satDevData,
9998                          satIntIo);
9999
10000    return;
10001  }
10002  return;
10003}
10004
10005/*****************************************************************************
10006*! \brief  satReadBufferCB
10007*
10008*   This routine is a callback function called from ossaSATACompleted().
10009*   This CB routine deals with Read Buffer.
10010*
10011*  \param   agRoot:       Handles for this instance of SAS/SATA hardware
10012*  \param   agIORequest:  Pointer to the LL I/O request context for this I/O.
10013*  \param   agIOStatus:   Status of completed I/O.
10014*  \param   agSATAParm1:  Additional info based on status.
10015*  \param   agIOInfoLen:  Length in bytes of overrun/underrun residual or FIS
10016*                         length.
10017*  \param   ioContext:    Pointer to satIOContext_t.
10018*
10019*  \return: none
10020*
10021*****************************************************************************/
10022void satReadBufferCB(
10023                        agsaRoot_t        *agRoot,
10024                        agsaIORequest_t   *agIORequest,
10025                        bit32             agIOStatus,
10026                        agsaFisHeader_t   *agFirstDword,
10027                        bit32             agIOInfoLen,
10028                        agsaFrameHandle_t agFrameHandle,
10029                        void              *ioContext
10030                        )
10031{
10032  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
10033  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
10034  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
10035  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10036  tdIORequestBody_t       *tdIORequestBody;
10037  tdIORequestBody_t       *tdOrgIORequestBody;
10038  satIOContext_t          *satIOContext;
10039  satIOContext_t          *satOrgIOContext;
10040  satInternalIo_t         *satIntIo;
10041  satDeviceData_t         *satDevData;
10042  scsiRspSense_t          *pSense;
10043  tiIORequest_t           *tiOrgIORequest;
10044  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
10045
10046  TI_DBG4(("satReadBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
10047
10048  /* internally generate tiIOContext */
10049  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
10050  satIOContext           = (satIOContext_t *) ioContext;
10051  satIntIo               = satIOContext->satIntIoContext;
10052  satDevData             = satIOContext->pSatDevData;
10053  hostToDevFis           = satIOContext->pFis;
10054
10055
10056  if (satIntIo == agNULL)
10057  {
10058    TI_DBG4(("satReadBufferCB: External satInternalIo_t satIntIoContext\n"));
10059    satOrgIOContext = satIOContext;
10060    tiOrgIORequest  = tdIORequestBody->tiIORequest;
10061    pSense          = satOrgIOContext->pSense;
10062
10063    /* SCSI command response payload to OS layer */
10064
10065    /* ATA command response payload */
10066
10067  }
10068  else
10069  {
10070    TI_DBG4(("satReadBufferCB: Internal satInternalIo_t satIntIoContext\n"));
10071    satOrgIOContext        = satIOContext->satOrgIOContext;
10072    if (satOrgIOContext == agNULL)
10073    {
10074      TI_DBG4(("satReadBufferCB: satOrgIOContext is NULL, wrong\n"));
10075      return;
10076    }
10077    else
10078    {
10079      TI_DBG4(("satReadBufferCB: satOrgIOContext is NOT NULL\n"));
10080    }
10081    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
10082    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
10083
10084    pSense        = satOrgIOContext->pSense;
10085
10086    /* SCSI command response payload to OS layer */
10087
10088    /* ATA command response payload */
10089
10090  }
10091
10092  tdIORequestBody->ioCompleted = agTRUE;
10093  tdIORequestBody->ioStarted = agFALSE;
10094
10095  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
10096  {
10097    TI_DBG1(("satReadBufferCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
10098    ostiInitiatorIOCompleted (
10099                             tiRoot,
10100                             tiOrgIORequest,
10101                             tiIOFailed,
10102                             tiDetailOtherError,
10103                             agNULL,
10104                             satOrgIOContext->interruptContext
10105                             );
10106    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10107
10108    satFreeIntIoResource( tiRoot,
10109                          satDevData,
10110                          satIntIo);
10111    return;
10112  }
10113
10114  if( agIOStatus != OSSA_IO_SUCCESS)
10115  {
10116    /* Process abort case */
10117    if (agIOStatus == OSSA_IO_ABORTED)
10118    {
10119      satProcessAbort(tiRoot,
10120                      tiOrgIORequest,
10121                      satOrgIOContext
10122                      );
10123
10124      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10125
10126      satFreeIntIoResource( tiRoot,
10127                            satDevData,
10128                            satIntIo);
10129      return;
10130    }
10131    satSetSensePayload( pSense,
10132                        SCSI_SNSKEY_NOT_READY,
10133                        0,
10134                        SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
10135                        satOrgIOContext);
10136
10137    ostiInitiatorIOCompleted( tiRoot,
10138                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10139                              tiIOSuccess,
10140                              SCSI_STAT_CHECK_CONDITION,
10141                              satOrgIOContext->pTiSenseData,
10142                              satOrgIOContext->interruptContext );
10143
10144    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10145
10146    satFreeIntIoResource( tiRoot,
10147                          satDevData,
10148                          satIntIo);
10149    return;
10150  }
10151
10152  /* process success case */
10153  if (hostToDevFis->h.command == SAT_READ_BUFFER )
10154  {
10155
10156    ostiInitiatorIOCompleted( tiRoot,
10157                              tiOrgIORequest,
10158                              tiIOSuccess,
10159                              SCSI_STAT_GOOD,
10160                              agNULL,
10161                              satOrgIOContext->interruptContext);
10162    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10163
10164    satFreeIntIoResource( tiRoot,
10165                          satDevData,
10166                          satIntIo);
10167    return;
10168  }
10169  else
10170  {
10171    TI_DBG1(("satReadBufferCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
10172    satSetSensePayload( pSense,
10173                        SCSI_SNSKEY_NO_SENSE,
10174                        0,
10175                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
10176                        satOrgIOContext);
10177
10178    ostiInitiatorIOCompleted( tiRoot,
10179                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10180                              tiIOSuccess,
10181                              SCSI_STAT_CHECK_CONDITION,
10182                              satOrgIOContext->pTiSenseData,
10183                              satOrgIOContext->interruptContext );
10184
10185    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10186
10187    satFreeIntIoResource( tiRoot,
10188                          satDevData,
10189                          satIntIo);
10190
10191    return;
10192  }
10193
10194  return;
10195}
10196
10197/*****************************************************************************
10198*! \brief  satWriteBufferCB
10199*
10200*   This routine is a callback function called from ossaSATACompleted().
10201*   This CB routine deals with Write Buffer.
10202*
10203*  \param   agRoot:       Handles for this instance of SAS/SATA hardware
10204*  \param   agIORequest:  Pointer to the LL I/O request context for this I/O.
10205*  \param   agIOStatus:   Status of completed I/O.
10206*  \param   agSATAParm1:  Additional info based on status.
10207*  \param   agIOInfoLen:  Length in bytes of overrun/underrun residual or FIS
10208*                         length.
10209*  \param   ioContext:    Pointer to satIOContext_t.
10210*
10211*  \return: none
10212*
10213*****************************************************************************/
10214void satWriteBufferCB(
10215                        agsaRoot_t        *agRoot,
10216                        agsaIORequest_t   *agIORequest,
10217                        bit32             agIOStatus,
10218                        agsaFisHeader_t   *agFirstDword,
10219                        bit32             agIOInfoLen,
10220                        agsaFrameHandle_t agFrameHandle,
10221                        void              *ioContext
10222                        )
10223{
10224  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
10225  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
10226  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
10227  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10228  tdIORequestBody_t       *tdIORequestBody;
10229  tdIORequestBody_t       *tdOrgIORequestBody;
10230  satIOContext_t          *satIOContext;
10231  satIOContext_t          *satOrgIOContext;
10232  satInternalIo_t         *satIntIo;
10233  satDeviceData_t         *satDevData;
10234  scsiRspSense_t          *pSense;
10235  tiIORequest_t           *tiOrgIORequest;
10236  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
10237
10238  TI_DBG4(("satWriteBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
10239
10240  /* internally generate tiIOContext */
10241  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
10242  satIOContext           = (satIOContext_t *) ioContext;
10243  satIntIo               = satIOContext->satIntIoContext;
10244  satDevData             = satIOContext->pSatDevData;
10245  hostToDevFis           = satIOContext->pFis;
10246
10247
10248  if (satIntIo == agNULL)
10249  {
10250    TI_DBG4(("satWriteBufferCB: External satInternalIo_t satIntIoContext\n"));
10251    satOrgIOContext = satIOContext;
10252    tiOrgIORequest  = tdIORequestBody->tiIORequest;
10253    pSense          = satOrgIOContext->pSense;
10254    /* SCSI command response payload to OS layer */
10255
10256    /* ATA command response payload */
10257
10258  }
10259  else
10260  {
10261    TI_DBG4(("satWriteBufferCB: Internal satInternalIo_t satIntIoContext\n"));
10262    satOrgIOContext        = satIOContext->satOrgIOContext;
10263    if (satOrgIOContext == agNULL)
10264    {
10265      TI_DBG4(("satWriteBufferCB: satOrgIOContext is NULL, wrong\n"));
10266      return;
10267    }
10268    else
10269    {
10270      TI_DBG4(("satWriteBufferCB: satOrgIOContext is NOT NULL\n"));
10271    }
10272    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
10273    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
10274
10275    pSense        = satOrgIOContext->pSense;
10276    /* SCSI command response payload to OS layer */
10277
10278    /* ATA command response payload */
10279
10280  }
10281
10282  tdIORequestBody->ioCompleted = agTRUE;
10283  tdIORequestBody->ioStarted = agFALSE;
10284
10285  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
10286  {
10287    TI_DBG1(("satWriteBufferCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
10288    ostiInitiatorIOCompleted (
10289                             tiRoot,
10290                             tiOrgIORequest,
10291                             tiIOFailed,
10292                             tiDetailOtherError,
10293                             agNULL,
10294                             satOrgIOContext->interruptContext
10295                             );
10296    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10297
10298    satFreeIntIoResource( tiRoot,
10299                          satDevData,
10300                          satIntIo);
10301    return;
10302  }
10303
10304  if( agIOStatus != OSSA_IO_SUCCESS)
10305  {
10306    /* Process abort case */
10307    if (agIOStatus == OSSA_IO_ABORTED)
10308    {
10309      satProcessAbort(tiRoot,
10310                      tiOrgIORequest,
10311                      satOrgIOContext
10312                      );
10313
10314      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10315
10316      satFreeIntIoResource( tiRoot,
10317                            satDevData,
10318                            satIntIo);
10319      return;
10320    }
10321    satSetSensePayload( pSense,
10322                        SCSI_SNSKEY_NOT_READY,
10323                        0,
10324                        SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
10325                        satOrgIOContext);
10326
10327    ostiInitiatorIOCompleted( tiRoot,
10328                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10329                              tiIOSuccess,
10330                              SCSI_STAT_CHECK_CONDITION,
10331                              satOrgIOContext->pTiSenseData,
10332                              satOrgIOContext->interruptContext );
10333
10334    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10335
10336    satFreeIntIoResource( tiRoot,
10337                          satDevData,
10338                          satIntIo);
10339    return;
10340  }
10341  /* process success case */
10342  if (hostToDevFis->h.command == SAT_WRITE_BUFFER )
10343  {
10344
10345    ostiInitiatorIOCompleted( tiRoot,
10346                              tiOrgIORequest,
10347                              tiIOSuccess,
10348                              SCSI_STAT_GOOD,
10349                              agNULL,
10350                              satOrgIOContext->interruptContext);
10351    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10352
10353    satFreeIntIoResource( tiRoot,
10354                          satDevData,
10355                          satIntIo);
10356    return;
10357  }
10358  else
10359  {
10360    TI_DBG1(("satWriteBufferCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
10361    satSetSensePayload( pSense,
10362                        SCSI_SNSKEY_NO_SENSE,
10363                        0,
10364                        SCSI_SNSCODE_NO_ADDITIONAL_INFO,
10365                        satOrgIOContext);
10366
10367    ostiInitiatorIOCompleted( tiRoot,
10368                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10369                              tiIOSuccess,
10370                              SCSI_STAT_CHECK_CONDITION,
10371                              satOrgIOContext->pTiSenseData,
10372                              satOrgIOContext->interruptContext );
10373
10374    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10375
10376    satFreeIntIoResource( tiRoot,
10377                          satDevData,
10378                          satIntIo);
10379
10380    return;
10381  }
10382
10383  return;
10384}
10385
10386/*****************************************************************************
10387*! \brief  satReassignBlocksCB
10388*
10389*   This routine is a callback function called from ossaSATACompleted().
10390*   This CB routine deals with Reassign Blocks.
10391*
10392*  \param   agRoot:       Handles for this instance of SAS/SATA hardware
10393*  \param   agIORequest:  Pointer to the LL I/O request context for this I/O.
10394*  \param   agIOStatus:   Status of completed I/O.
10395*  \param   agSATAParm1:  Additional info based on status.
10396*  \param   agIOInfoLen:  Length in bytes of overrun/underrun residual or FIS
10397*                         length.
10398*  \param   ioContext:    Pointer to satIOContext_t.
10399*
10400*  \return: none
10401*
10402*****************************************************************************/
10403void satReassignBlocksCB(
10404                        agsaRoot_t        *agRoot,
10405                        agsaIORequest_t   *agIORequest,
10406                        bit32             agIOStatus,
10407                        agsaFisHeader_t   *agFirstDword,
10408                        bit32             agIOInfoLen,
10409                        agsaFrameHandle_t agFrameHandle,
10410                        void              *ioContext
10411                        )
10412{
10413  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
10414  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
10415  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
10416  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10417  tdIORequestBody_t       *tdIORequestBody;
10418  tdIORequestBody_t       *tdOrgIORequestBody;
10419  satIOContext_t          *satIOContext;
10420  satIOContext_t          *satOrgIOContext;
10421  satIOContext_t          *satNewIOContext;
10422  satInternalIo_t         *satIntIo;
10423  satInternalIo_t         *satNewIntIo = agNULL;
10424  satDeviceData_t         *satDevData;
10425
10426  scsiRspSense_t            *pSense;
10427  tiIniScsiCmnd_t           *scsiCmnd;
10428  tiIORequest_t             *tiOrgIORequest;
10429
10430  agsaFisRegHostToDevice_t  *hostToDevFis = agNULL;
10431  bit32                     ataStatus = 0;
10432  bit32                     status;
10433  tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
10434  agsaFisRegD2HHeader_t    *statDevToHostFisHeader = agNULL;
10435
10436  TI_DBG5(("satReassignBlocksCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
10437
10438  /* internally generate tiIOContext */
10439  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
10440  satIOContext           = (satIOContext_t *) ioContext;
10441  satIntIo               = satIOContext->satIntIoContext;
10442  satDevData             = satIOContext->pSatDevData;
10443  hostToDevFis           = satIOContext->pFis;
10444
10445  if (satIntIo == agNULL)
10446  {
10447    TI_DBG4(("satReassignBlocksCB: External satInternalIo_t satIntIoContext\n"));
10448    satOrgIOContext = satIOContext;
10449    tiOrgIORequest  = tdIORequestBody->tiIORequest;
10450    tiScsiRequest   = satOrgIOContext->tiScsiXchg;
10451    pSense          = satOrgIOContext->pSense;
10452    scsiCmnd        = satOrgIOContext->pScsiCmnd;
10453  }
10454  else
10455  {
10456    TI_DBG4(("satReassignBlocksCB: Internal satInternalIo_t satIntIoContext\n"));
10457    satOrgIOContext        = satIOContext->satOrgIOContext;
10458    if (satOrgIOContext == agNULL)
10459    {
10460      TI_DBG4(("satReassignBlocksCB: satOrgIOContext is NULL, Wrong\n"));
10461      return;
10462    }
10463    else
10464    {
10465      TI_DBG4(("satReassignBlocksCB: satOrgIOContext is NOT NULL, Wrong\n"));
10466    }
10467    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
10468    tiOrgIORequest         = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
10469
10470    tiScsiRequest = satOrgIOContext->tiScsiXchg;
10471    pSense        = satOrgIOContext->pSense;
10472    scsiCmnd      = satOrgIOContext->pScsiCmnd;
10473  }
10474
10475  tdIORequestBody->ioCompleted = agTRUE;
10476  tdIORequestBody->ioStarted = agFALSE;
10477
10478  if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
10479  {
10480    TI_DBG1(("satReassignBlocksCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
10481    ostiInitiatorIOCompleted (
10482                             tiRoot,
10483                             tiOrgIORequest,
10484                             tiIOFailed,
10485                             tiDetailOtherError,
10486                             agNULL,
10487                             satOrgIOContext->interruptContext
10488                             );
10489    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10490
10491    satFreeIntIoResource( tiRoot,
10492                          satDevData,
10493                          satIntIo);
10494    return;
10495  }
10496
10497  if (agIOStatus != OSSA_IO_SUCCESS)
10498  {
10499    /* only agsaFisRegDeviceToHost_t is expected */
10500    statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
10501    ataStatus     = statDevToHostFisHeader->status;   /* ATA Status register */
10502  }
10503
10504  if (agIOStatus != OSSA_IO_SUCCESS)
10505  {
10506  if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
10507       ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
10508       )
10509  {
10510    /* for debugging */
10511    if( agIOStatus != OSSA_IO_SUCCESS)
10512    {
10513      TI_DBG1(("satReassignBlocksCB FAILED, NOT IO_SUCCESS\n"));
10514    }
10515    else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
10516    {
10517      TI_DBG1(("satReassignBlocksCB FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
10518    }
10519    else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
10520              (ataStatus & DF_ATA_STATUS_MASK)
10521              )
10522    {
10523      TI_DBG1(("satReassignBlocksCB FAILED, FAILED, error status\n"));
10524    }
10525
10526    /* Process abort case */
10527    if (agIOStatus == OSSA_IO_ABORTED)
10528    {
10529      satProcessAbort(tiRoot,
10530                      tiOrgIORequest,
10531                      satOrgIOContext
10532                      );
10533
10534      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10535
10536      satFreeIntIoResource( tiRoot,
10537                            satDevData,
10538                            satIntIo);
10539      return;
10540    }
10541
10542    /* for debugging */
10543    if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS ||
10544        hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT
10545       )
10546    {
10547      TI_DBG1(("satReassignBlocksCB SAT_READ_VERIFY_SECTORS(_EXT) failed\n"));
10548      /* Verify failed; send Write with same LBA */
10549      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10550
10551      satFreeIntIoResource( tiRoot,
10552                            satDevData,
10553                            satIntIo);
10554
10555      satNewIntIo = satAllocIntIoResource( tiRoot,
10556                                           tiOrgIORequest,
10557                                           satDevData,
10558                                           512, /* writing 1 sector */
10559                                           satNewIntIo);
10560      if (satNewIntIo == agNULL)
10561      {
10562        /* memory allocation failure */
10563        satFreeIntIoResource( tiRoot,
10564                              satDevData,
10565                              satNewIntIo);
10566
10567        satSetSensePayload( pSense,
10568                            SCSI_SNSKEY_HARDWARE_ERROR,
10569                            0,
10570                            SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10571                            satOrgIOContext);
10572
10573        ostiInitiatorIOCompleted( tiRoot,
10574                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10575                                  tiIOSuccess,
10576                                  SCSI_STAT_CHECK_CONDITION,
10577                                  satOrgIOContext->pTiSenseData,
10578                                  satOrgIOContext->interruptContext );
10579        TI_DBG1(("satReassignBlocksCB: momory allocation fails\n"));
10580        return;
10581      } /* end memory allocation */
10582
10583      satNewIOContext = satPrepareNewIO(
10584                                        satNewIntIo,
10585                                        tiOrgIORequest,
10586                                        satDevData,
10587                                        scsiCmnd,
10588                                        satOrgIOContext
10589                                        );
10590
10591      /* send Write with same LBA */
10592      status = satReassignBlocks_2(
10593                                   tiRoot,
10594                                   &satNewIntIo->satIntTiIORequest,
10595                                   satNewIOContext->ptiDeviceHandle,
10596                                   &satNewIntIo->satIntTiScsiXchg,
10597                                   satNewIOContext,
10598                                   satOrgIOContext->LBA
10599                                 );
10600
10601      if (status != tiSuccess)
10602      {
10603        /* sending ATA command fails */
10604        satFreeIntIoResource( tiRoot,
10605                              satDevData,
10606                              satNewIntIo);
10607        satSetSensePayload( pSense,
10608                            SCSI_SNSKEY_HARDWARE_ERROR,
10609                            0,
10610                            SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10611                            satOrgIOContext);
10612
10613        ostiInitiatorIOCompleted( tiRoot,
10614                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10615                                  tiIOSuccess,
10616                                  SCSI_STAT_CHECK_CONDITION,
10617                                  satOrgIOContext->pTiSenseData,
10618                                  satOrgIOContext->interruptContext );
10619        TI_DBG1(("satReassignBlocksCB calling fail 1\n"));
10620        return;
10621      } /* end send fails */
10622
10623      return;
10624    }
10625    else if (hostToDevFis->h.command == SAT_WRITE_DMA ||
10626             hostToDevFis->h.command == SAT_WRITE_SECTORS ||
10627             hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
10628             hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
10629             hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
10630             )
10631    {
10632      TI_DBG1(("satReassignBlocksCB SAT_WRITE failed\n"));
10633      /* fall through */
10634    }
10635    else
10636    {
10637      TI_DBG1(("satReassignBlocksCB error default case unexpected command 0x%x\n", hostToDevFis->h.command));
10638    }
10639
10640
10641    satSetSensePayload( pSense,
10642                        SCSI_SNSKEY_HARDWARE_ERROR,
10643                        0,
10644                        SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10645                        satOrgIOContext);
10646
10647    ostiInitiatorIOCompleted( tiRoot,
10648                              tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10649                              tiIOSuccess,
10650                              SCSI_STAT_CHECK_CONDITION,
10651                              satOrgIOContext->pTiSenseData,
10652                              satOrgIOContext->interruptContext );
10653
10654
10655    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10656
10657    satFreeIntIoResource( tiRoot,
10658                          satDevData,
10659                          satIntIo);
10660    return;
10661  } /* error checking */
10662  }
10663
10664
10665  /* prcessing the success case */
10666  if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS ||
10667      hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT ||
10668      hostToDevFis->h.command == SAT_WRITE_DMA ||
10669      hostToDevFis->h.command == SAT_WRITE_SECTORS ||
10670      hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
10671      hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
10672      hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
10673      )
10674  {
10675    /* next LBA; verify */
10676    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10677
10678    satFreeIntIoResource( tiRoot,
10679                          satDevData,
10680                          satIntIo);
10681
10682    if (satOrgIOContext->ParmIndex >= satOrgIOContext->ParmLen)
10683    {
10684      TI_DBG5(("satReassignBlocksCB: GOOD status\n"));
10685      /* return stat_good */
10686      ostiInitiatorIOCompleted( tiRoot,
10687                                tiOrgIORequest,
10688                                tiIOSuccess,
10689                                SCSI_STAT_GOOD,
10690                                agNULL,
10691                                satOrgIOContext->interruptContext );
10692      return;
10693    }
10694    else
10695    {
10696      TI_DBG5(("satReassignBlocksCB: processing next LBA\n"));
10697      satNewIntIo = satAllocIntIoResource( tiRoot,
10698                                           tiOrgIORequest,
10699                                           satDevData,
10700                                           0,
10701                                           satNewIntIo);
10702      if (satNewIntIo == agNULL)
10703      {
10704        /* memory allocation failure */
10705        satFreeIntIoResource( tiRoot,
10706                              satDevData,
10707                              satNewIntIo);
10708
10709        satSetSensePayload( pSense,
10710                            SCSI_SNSKEY_HARDWARE_ERROR,
10711                            0,
10712                            SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10713                            satOrgIOContext);
10714
10715        ostiInitiatorIOCompleted( tiRoot,
10716                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10717                                  tiIOSuccess,
10718                                  SCSI_STAT_CHECK_CONDITION,
10719                                  satOrgIOContext->pTiSenseData,
10720                                  satOrgIOContext->interruptContext );
10721        TI_DBG1(("satReassignBlocksCB: momory allocation fails\n"));
10722        return;
10723      } /* end memory allocation */
10724
10725      satNewIOContext = satPrepareNewIO(
10726                                        satNewIntIo,
10727                                        tiOrgIORequest,
10728                                        satDevData,
10729                                        scsiCmnd,
10730                                        satOrgIOContext
10731                                        );
10732
10733      /* send Verify with the next LBA */
10734      status = satReassignBlocks_1(
10735                                   tiRoot,
10736                                   &satNewIntIo->satIntTiIORequest,
10737                                   satNewIOContext->ptiDeviceHandle,
10738                                   tiScsiRequest, /* orginal from OS layer */
10739                                   satNewIOContext,
10740                                   satOrgIOContext
10741                                   );
10742
10743      if (status != tiSuccess)
10744      {
10745        /* sending ATA command fails */
10746        satFreeIntIoResource( tiRoot,
10747                              satDevData,
10748                              satNewIntIo);
10749        satSetSensePayload( pSense,
10750                            SCSI_SNSKEY_HARDWARE_ERROR,
10751                            0,
10752                            SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10753                            satOrgIOContext);
10754
10755        ostiInitiatorIOCompleted( tiRoot,
10756                                  tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10757                                  tiIOSuccess,
10758                                  SCSI_STAT_CHECK_CONDITION,
10759                                  satOrgIOContext->pTiSenseData,
10760                                  satOrgIOContext->interruptContext );
10761        TI_DBG1(("satReassignBlocksCB calling satModeSelect6_1 fails\n"));
10762        return;
10763      } /* end send fails */
10764    } /* else */
10765    return;
10766
10767  }
10768  else if (hostToDevFis->h.command == SAT_WRITE_DMA ||
10769           hostToDevFis->h.command == SAT_WRITE_SECTORS ||
10770           hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
10771           hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
10772           hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
10773           )
10774  {
10775    /* next LBA; verify */
10776  }
10777  else
10778  {
10779      TI_DBG1(("satReassignBlocksCB error unknown command success 0x%x \n", hostToDevFis->h.command));
10780
10781      satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10782
10783      satFreeIntIoResource( tiRoot,
10784                            satDevData,
10785                            satIntIo);
10786      satSetSensePayload( pSense,
10787                          SCSI_SNSKEY_HARDWARE_ERROR,
10788                          0,
10789                          SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10790                          satOrgIOContext);
10791
10792      ostiInitiatorIOCompleted( tiRoot,
10793                                tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10794                                tiIOSuccess,
10795                                SCSI_STAT_CHECK_CONDITION,
10796                                satOrgIOContext->pTiSenseData,
10797                                satOrgIOContext->interruptContext );
10798      return;
10799  }
10800  return;
10801}
10802/*****************************************************************************
10803*! \brief  satReadLogExtCB
10804*
10805*   This routine is a callback function called from ossaSATACompleted().
10806*   This CB routine deals READ LOG EXT completion.
10807*
10808*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
10809*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
10810*  \param   agIOStatus:  Status of completed I/O.
10811*  \param   agFirstDword:Pointer to the four bytes of FIS.
10812*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
10813*                        length.
10814*  \param   agParam:     Additional info based on status.
10815*  \param   ioContext:   Pointer to satIOContext_t.
10816*
10817*  \return: none
10818*
10819*****************************************************************************/
10820/*
10821  SATAII spec p42
10822
10823*/
10824void satReadLogExtCB(
10825                     agsaRoot_t        *agRoot,
10826                     agsaIORequest_t   *agIORequest,
10827                     bit32             agIOStatus,
10828                     agsaFisHeader_t   *agFirstDword,
10829                     bit32             agIOInfoLen,
10830                     void              *agParam,
10831                     void              *ioContext
10832                     )
10833
10834{
10835
10836  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
10837  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
10838  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
10839  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10840  tdIORequestBody_t       *tdIORequestBody;
10841  satIOContext_t          *satReadLogExtIOContext;
10842  satInternalIo_t         *satIntIo;
10843  satDeviceData_t         *satDevData;
10844  tdsaDeviceData_t        *tdsaDeviceData;
10845  agsaIORequest_t         *agAbortIORequest;
10846  tdIORequestBody_t       *tdAbortIORequestBody;
10847  bit32                   PhysUpper32;
10848  bit32                   PhysLower32;
10849  bit32                   memAllocStatus;
10850  void                    *osMemHandle;
10851
10852  TI_DBG1(("satReadLogExtCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
10853    agIORequest, agIOStatus, agIOInfoLen));
10854
10855  tdIORequestBody        = (tdIORequestBody_t *)agIORequest->osData;
10856  satReadLogExtIOContext = (satIOContext_t *) ioContext;
10857  satIntIo               = satReadLogExtIOContext->satIntIoContext;
10858  satDevData             = satReadLogExtIOContext->pSatDevData;
10859  tdsaDeviceData         = (tdsaDeviceData_t *)satDevData->satSaDeviceData;
10860
10861  TI_DBG1(("satReadLogExtCB: did %d\n", tdsaDeviceData->id));
10862  satDecrementPendingIO(tiRoot, tdsaAllShared, satReadLogExtIOContext);
10863
10864
10865  tdIORequestBody->ioCompleted = agTRUE;
10866  tdIORequestBody->ioStarted = agFALSE;
10867
10868  /*
10869   * If READ LOG EXT failed, we issue device reset.
10870   */
10871  if ( agIOStatus != OSSA_IO_SUCCESS ||
10872       (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0)
10873     )
10874  {
10875    TI_DBG1(("satReadLogExtCB: FAILED.\n"));
10876
10877    satFreeIntIoResource( tiRoot,
10878                          satDevData,
10879                          satIntIo);
10880    /* Abort I/O after completion of device reset */
10881    satDevData->satAbortAfterReset = agTRUE;
10882#ifdef NOT_YET
10883    /* needs to investigate this case */
10884    /* no report to OS layer */
10885    satSubTM(tiRoot,
10886             satReadLogExtIOContext->ptiDeviceHandle,
10887             TD_INTERNAL_TM_RESET,
10888             agNULL,
10889             agNULL,
10890             agNULL,
10891             agFALSE);
10892#endif
10893    return;
10894  }
10895
10896
10897  /***************************************************************************
10898   * The following steps take place when READ LOG EXT successfully completed.
10899   ***************************************************************************/
10900
10901  /************************************************************************
10902   *
10903   * 1. Issue abort to LL layer to all other pending I/Os for the same SATA
10904   *    drive.
10905   *
10906   * 2. Free resource allocated for the internally generated READ LOG EXT.
10907   *
10908   * 3. At the completion of abort, in the context of ossaSATACompleted(),
10909   *    return the I/O with error status to the OS-App Specific layer.
10910   *    When all I/O aborts are completed, clear SATA device flag to
10911   *    indicate ready to process new request.
10912   *
10913   ***********************************************************************/
10914
10915  /*
10916   * Issue abort to LL layer to all other pending I/Os for the same SATA drive
10917   */
10918  /*
10919    replace the single IO abort with device abort
10920  */
10921
10922  TI_DBG1(("satReadLogExtCB: issuing saSATAAbort. Device Abort\n"));
10923  /* do not deregister this device */
10924  tdsaDeviceData->OSAbortAll = agTRUE;
10925
10926  /* allocating agIORequest for abort itself */
10927  memAllocStatus = ostiAllocMemory(
10928                                   tiRoot,
10929                                   &osMemHandle,
10930                                   (void **)&tdAbortIORequestBody,
10931                                   &PhysUpper32,
10932                                   &PhysLower32,
10933                                   8,
10934                                   sizeof(tdIORequestBody_t),
10935                                   agTRUE
10936                                   );
10937
10938  if (memAllocStatus != tiSuccess)
10939  {
10940    /* let os process IO */
10941    TI_DBG1(("satReadLogExtCB: ostiAllocMemory failed...\n"));
10942    return;
10943  }
10944
10945  if (tdAbortIORequestBody == agNULL)
10946  {
10947    /* let os process IO */
10948    TI_DBG1(("satReadLogExtCB: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
10949    return;
10950  }
10951
10952  /* setup task management structure */
10953  tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
10954  tdAbortIORequestBody->tiDevHandle = (tiDeviceHandle_t *)&(tdsaDeviceData->tiDeviceHandle);
10955  /* initialize agIORequest */
10956  agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
10957  agAbortIORequest->osData = (void *) tdAbortIORequestBody;
10958  agAbortIORequest->sdkData = agNULL; /* LL takes care of this */
10959
10960  /*
10961   * Issue abort
10962   */
10963  saSATAAbort( agRoot, agAbortIORequest, 0, tdsaDeviceData->agDevHandle, 1, agNULL, agNULL);
10964
10965
10966  /*
10967   * Free resource allocated for the internally generated READ LOG EXT.
10968   */
10969  satFreeIntIoResource( tiRoot,
10970                        satDevData,
10971                        satIntIo);
10972
10973  /*
10974   * Sequence of recovery continue at some other context:
10975   * At the completion of abort, in the context of ossaSATACompleted(),
10976   * return the I/O with error status to the OS-App Specific layer.
10977   * When all I/O aborts are completed, clear SATA device flag to
10978   * indicate ready to process new request.
10979   */
10980
10981   satDevData->satDriveState = SAT_DEV_STATE_NORMAL;
10982
10983   TI_DBG1(("satReadLogExtCB: end return\n"));
10984   return;
10985}
10986
10987#ifndef FDS_SM
10988/*****************************************************************************
10989*! \brief  ossaSATAEvent
10990*
10991*   This routine is called to notify the OS Layer of an event associated with
10992*   SATA port or SATA device
10993*
10994*  \param   agRoot:        Handles for this instance of SAS/SATA hardware
10995*  \param   agIORequest:   Pointer to the LL I/O request context for this I/O.
10996*  \param   agPortContext  Pointer to the port context of TD and Lower layer
10997*  \param   agDevHandle:   Pointer to a device handle
10998*  \param   event:         event type
10999*
11000*  \return: none
11001*
11002*****************************************************************************/
11003osGLOBAL void ossaSATAEvent(
11004                        agsaRoot_t              *agRoot,
11005                        agsaIORequest_t         *agIORequest,
11006                        agsaPortContext_t       *agPortContext,
11007                        agsaDevHandle_t         *agDevHandle,
11008                        bit32                   event,
11009                        bit32                   agIOInfoLen,
11010                        void                    *agParam
11011                           )
11012{
11013
11014  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
11015  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
11016  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
11017  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
11018  bit32                   interruptContext = osData->IntContext;
11019  tdsaDeviceData_t        *pDeviceData;
11020  satDeviceData_t         *pSatDevData;
11021  satInternalIo_t         *satIntIo = agNULL;
11022  bit32                   status;
11023  satIOContext_t          *satIOContext2;
11024  tdIORequestBody_t       *tdIORequestBody;
11025  tiDeviceHandle_t        *tiDeviceHandle;
11026  tiIORequest_t           tiIORequestTMP;
11027  agsaDifDetails_t        agDifDetails;
11028  bit8                    framePayload[256];
11029  bit16                   frameOffset = 0;
11030  bit16                   frameLen = 0;
11031
11032  /* new */
11033  tdsaDeviceData_t        *tdsaDeviceData = agNULL;
11034  satIOContext_t          *satIOContext;
11035  tdsaPortContext_t       *onePortContext;
11036
11037  if (event == OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE)
11038  {
11039
11040    /**************************************************************************
11041     *
11042     * !!!! See Section 13.5.2.4 of SATA 2.5 specs.                       !!!!
11043     * !!!! If the NCQ error ends up here, it means that the device sent  !!!!
11044     * !!!! Register Device To Host FIS (which does not have SActive      !!!!
11045     * !!!! register) instead of Set Device Bit FIS (which has SActive    !!!!
11046     * !!!! register). The routine osSatIOCompleted() deals with the case !!!!
11047     * !!!! where Set Device Bit FIS was sent by the device.              !!!!
11048     *
11049     * For NCQ we need to issue READ LOG EXT command with log page 10h
11050     * to get the error and to allow other I/Os to continue.
11051     *
11052     * Here is the basic flow or sequence of error recovery, this sequence is
11053     * similar to the one described in SATA 2.5:
11054     *
11055     * 1. Set SATA device flag to indicate error condition and returning busy
11056     *    for all new request.
11057     *
11058     * 2. Prepare READ LOG EXT page 10h command. Set flag to indicate that
11059     *    the failed I/O has NOT been returned to the OS Layer. Send command.
11060     *
11061     * 3. When the device receives READ LOG EXT page 10h request all other
11062     *    pending I/O are implicitly aborted. No completion (aborted) status
11063     *    will be sent to the host for these aborted commands.
11064     *
11065     * 4. SATL receives the completion for READ LOG EXT command in
11066     *    satReadLogExtCB(). Steps 5,6,7,8 below are the step 1,2,3,4 in
11067     *    satReadLogExtCB().
11068     *
11069     * 5. Check flag that indicates whether the failed I/O has been returned
11070     *    to the OS Layer. If not, search the I/O context in device data
11071     *    looking for a matched tag. Then return the completion of the failed
11072     *    NCQ command with the appopriate/trasnlated SCSI status.
11073     *
11074     * 6. Issue abort to LL layer to all other pending I/Os for the same SATA
11075     *    drive.
11076     *
11077     * 7. Free resource allocated for the internally generated READ LOG EXT.
11078     *
11079     * 8. At the completion of abort, in the context of ossaSATACompleted(),
11080     *    return the I/O with error status to the OS-App Specific layer.
11081     *    When all I/O aborts are completed, clear SATA device flag to
11082     *    indicate ready to process new request.
11083     *
11084     *************************************************************************/
11085
11086    pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
11087    pSatDevData = &pDeviceData->satDevData;
11088    tiDeviceHandle  = &((tdsaDeviceData_t *)(pSatDevData->satSaDeviceData))->tiDeviceHandle;
11089
11090    TI_DBG1(("ossaSATAEvent: did %d\n", pDeviceData->id));
11091
11092    if (pSatDevData->satDriveState == SAT_DEV_STATE_NORMAL)
11093    {
11094      TI_DBG1(("ossaSATAEvent: NCQ ERROR agDevHandle=%p.\n", agDevHandle ));
11095
11096      /* Set flag to indicate we are in recovery */
11097      pSatDevData->satDriveState = SAT_DEV_STATE_IN_RECOVERY;
11098
11099      /*
11100       * Allocate resource for READ LOG EXIT page 10h
11101       */
11102      satIntIo = satAllocIntIoResource( tiRoot,
11103                                        &(tiIORequestTMP), /* anything but NULL */
11104                                        pSatDevData,
11105                                        sizeof (satReadLogExtPage10h_t),
11106                                        satIntIo);
11107
11108      /*
11109       * If we cannot allocate resource to do the normal NCQ recovery, we
11110       * will do SATA device reset.
11111       */
11112      if (satIntIo == agNULL)
11113      {
11114        /* Abort I/O after completion of device reset */
11115        pSatDevData->satAbortAfterReset = agTRUE;
11116        TI_DBG1(("ossaSATAEvent: can't send RLE due to resource lack\n"));
11117
11118#ifdef NOT_YET
11119        /* needs to investigate this case */
11120        /* no report to OS layer */
11121        satSubTM(tiRoot,
11122                 tiDeviceHandle,
11123                 TD_INTERNAL_TM_RESET,
11124                 agNULL,
11125                 agNULL,
11126                 agNULL,
11127                 agFALSE);
11128#endif
11129
11130        return;
11131      }
11132
11133
11134      /*
11135       * Clear flag to indicate that the failed I/O has NOT been returned to the
11136       * OS-App specific Layer.
11137       */
11138      satIntIo->satIntFlag = 0;
11139
11140      /* compare to satPrepareNewIO() */
11141      /* Send READ LOG EXIT page 10h command */
11142
11143      /*
11144       * Need to initialize all the fields within satIOContext except
11145       * reqType and satCompleteCB which will be set depending on cmd.
11146       */
11147
11148      tdIORequestBody = (tdIORequestBody_t *)satIntIo->satIntRequestBody;
11149      satIOContext2 = &(tdIORequestBody->transport.SATA.satIOContext);
11150
11151      satIOContext2->pSatDevData   = pSatDevData;
11152      satIOContext2->pFis          = &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
11153      satIOContext2->pScsiCmnd     = &(satIntIo->satIntTiScsiXchg.scsiCmnd);
11154      satIOContext2->pSense        = &(tdIORequestBody->transport.SATA.sensePayload);
11155      satIOContext2->pTiSenseData  = &(tdIORequestBody->transport.SATA.tiSenseData);
11156      satIOContext2->pTiSenseData->senseData = satIOContext2->pSense;
11157
11158      satIOContext2->tiRequestBody = satIntIo->satIntRequestBody;
11159      satIOContext2->interruptContext = interruptContext;
11160      satIOContext2->satIntIoContext  = satIntIo;
11161
11162      satIOContext2->ptiDeviceHandle = tiDeviceHandle;
11163      satIOContext2->satOrgIOContext = agNULL;
11164      satIOContext2->tiScsiXchg = agNULL;
11165
11166      status = satSendReadLogExt( tiRoot,
11167                                  &satIntIo->satIntTiIORequest,
11168                                  tiDeviceHandle,
11169                                  &satIntIo->satIntTiScsiXchg,
11170                                  satIOContext2);
11171
11172      if (status !=tiSuccess)
11173      {
11174        TI_DBG1(("ossaSATAEvent: can't send RLE due to LL api failure\n"));
11175        satFreeIntIoResource( tiRoot,
11176                              pSatDevData,
11177                              satIntIo);
11178        /* Abort I/O after completion of device reset */
11179        pSatDevData->satAbortAfterReset = agTRUE;
11180#ifdef NOT_YET
11181        /* needs to investigate this case */
11182        /* no report to OS layer */
11183        satSubTM(tiRoot,
11184                 tiDeviceHandle,
11185                 TD_INTERNAL_TM_RESET,
11186                 agNULL,
11187                 agNULL,
11188                 agNULL,
11189                 agFALSE);
11190#endif
11191
11192        return;
11193      }
11194    }
11195    else
11196    {
11197      TI_DBG1(("ossaSATAEvent: NCQ ERROR but recovery in progress\n"));
11198    }
11199
11200  }
11201  else if (event == OSSA_IO_XFER_CMD_FRAME_ISSUED)
11202  {
11203    TI_DBG1(("ossaSATAEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED\n"));
11204  }
11205  else if (event == OSSA_IO_XFER_PIO_SETUP_ERROR)
11206  {
11207    TI_DBG1(("ossaSATAEvent: OSSA_IO_XFER_PIO_SETUP_ERROR\n"));
11208
11209  }
11210  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED)
11211  {
11212    TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED\n"));
11213  }
11214  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO)
11215  {
11216    TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO\n"));
11217  }
11218  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST)
11219  {
11220    TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST\n"));
11221  }
11222  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE)
11223  {
11224    TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE\n"));
11225  }
11226  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED)
11227  {
11228    TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED\n"));
11229  }
11230  else if (event == OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH)
11231  {
11232    TI_DBG1(("ossaSATAEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH\n"));
11233  }
11234  else if (event == OSSA_IO_XFR_ERROR_DIF_MISMATCH || event == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH  ||
11235           event == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH || event == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH)
11236  {
11237    TI_DBG1(("ossaSSPEvent: DIF related, event 0x%x\n", event));
11238    /* process DIF detail information */
11239    TI_DBG2(("ossaSSPEvent: agIOInfoLen %d\n", agIOInfoLen));
11240    if (agParam == agNULL)
11241    {
11242      TI_DBG2(("ossaSSPEvent: agParam is NULL!!!\n"));
11243      return;
11244    }
11245    if (agIOInfoLen < sizeof(agsaDifDetails_t))
11246    {
11247      TI_DBG2(("ossaSSPEvent: wrong agIOInfoLen!!! agIOInfoLen %d sizeof(agsaDifDetails_t) %d\n", agIOInfoLen, sizeof(agsaDifDetails_t)));
11248      return;
11249    }
11250    /* reads agsaDifDetails_t */
11251    saFrameReadBlock(agRoot, agParam, 0, &agDifDetails, sizeof(agsaDifDetails_t));
11252    frameOffset = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF);
11253    frameLen = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF0000) >> 16;
11254
11255    TI_DBG2(("ossaSSPEvent: UpperLBA 0x%08x LowerLBA 0x%08x\n", agDifDetails.UpperLBA, agDifDetails.LowerLBA));
11256    TI_DBG2(("ossaSSPEvent: SASAddrHI 0x%08x SASAddrLO 0x%08x\n",
11257             TD_GET_SAS_ADDRESSHI(agDifDetails.sasAddressHi), TD_GET_SAS_ADDRESSLO(agDifDetails.sasAddressLo)));
11258    TI_DBG2(("ossaSSPEvent: DIF error mask 0x%x Device ID 0x%x\n",
11259             (agDifDetails.DIFErrDevID) & 0xFF, (agDifDetails.DIFErrDevID & 0xFFFF0000) >> 16));
11260    if (frameLen != 0 && frameLen <= 256)
11261    {
11262      saFrameReadBlock(agRoot, agParam, sizeof(agsaDifDetails_t), framePayload, frameLen);
11263      tdhexdump("ossaSSPEvent frame", framePayload, frameLen);
11264    }
11265  }
11266  else
11267  {
11268    TI_DBG1(("ossaSATAEvent: ERROR event %d agDevHandle=%p.\n", event, agDevHandle ));
11269
11270    tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
11271    satIOContext    = &(tdIORequestBody->transport.SATA.satIOContext);
11272    pSatDevData     = satIOContext->pSatDevData;
11273    tdsaDeviceData  = (tdsaDeviceData_t *)pSatDevData->satSaDeviceData;
11274    onePortContext   = tdsaDeviceData->tdPortContext;
11275    TI_DBG1(("ossaSATAEvent: did %d\n", tdsaDeviceData->id));
11276
11277    /* send SMP_PHY_CONTROL_HARD_RESET */
11278    if (event == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY && tdsaAllShared->FCA)
11279    {
11280      if (pSatDevData->NumOfFCA <= 0) /* does SMP HARD RESET only upto one time */
11281      {
11282        TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n"));
11283        pSatDevData->NumOfFCA++;
11284        tdsaPhyControlSend(tiRoot,
11285                           tdsaDeviceData,
11286                           SMP_PHY_CONTROL_HARD_RESET,
11287                           agNULL);
11288      }
11289      else
11290      {
11291        /* given up after one time of SMP HARD RESET; */
11292        TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; NO!!! sending HARD_RESET\n"));
11293        if (tdsaDeviceData->registered == agTRUE && tdsaAllShared->ResetInDiscovery == 0)
11294        {
11295          /*
11296            1. remove this device
11297            2. device removal event
11298          */
11299          tdsaAbortAll(tiRoot, agRoot, tdsaDeviceData);
11300          tdsaDeviceData->valid = agFALSE;
11301          tdsaDeviceData->valid2 = agFALSE;
11302          tdsaDeviceData->registered = agFALSE;
11303          ostiInitiatorEvent(
11304                             tiRoot,
11305                             onePortContext->tiPortalContext,
11306                             agNULL,
11307                             tiIntrEventTypeDeviceChange,
11308                             tiDeviceRemoval,
11309                             agNULL
11310                             );
11311        }
11312      }
11313    }
11314
11315  }
11316}
11317#endif /* FDS_SM */
11318
11319/*****************************************************************************
11320*! \brief  itdsatErrorSATAEventHandle
11321*
11322*   This routine is called to handle SATA error event
11323*
11324*  \param   agRoot:        Handles for this instance of SAS/SATA hardware
11325*  \param   agIORequest:   Pointer to the LL I/O request context for this I/O.
11326*  \param   agPortContext  Pointer to the port context of TD and Lower layer
11327*  \param   agDevHandle:   Pointer to a device handle
11328*  \param   event:         event type
11329*  \param   ioContext:     Pointer to satIOContext_t
11330*
11331*  \return: none
11332*
11333*****************************************************************************/
11334osGLOBAL void  itdsatErrorSATAEventHandle(
11335                                          agsaRoot_t        *agRoot,
11336                                          agsaIORequest_t   *agIORequest,
11337                                          agsaPortContext_t *agPortContext,
11338                                          agsaDevHandle_t   *agDevHandle,
11339                                          bit32             event,
11340                                          satIOContext_t    *ioContext
11341                                          )
11342{
11343  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
11344  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
11345  tdsaRoot_t              *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
11346  tdsaContext_t           *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
11347  tdIORequestBody_t       *tdOrgIORequestBody;
11348  satIOContext_t          *satIOContext;
11349  satIOContext_t          *satOrgIOContext;
11350  satInternalIo_t         *satIntIo;
11351  satDeviceData_t         *satDevData;
11352  bit32                   interruptContext = osData->IntContext;
11353
11354  TI_DBG1(("itdsatErrorSATAEventHandle: start\n"));
11355  satIOContext           = (satIOContext_t *) ioContext;
11356  satIntIo               = satIOContext->satIntIoContext;
11357  satDevData             = satIOContext->pSatDevData;
11358
11359
11360  TI_DBG1(("itdsatErrorSATAEventHandle: event 0x%x\n", event));
11361
11362  if (satIntIo == agNULL)
11363  {
11364    TI_DBG1(("itdsatErrorSATAEventHandle: External, OS generated\n"));
11365    satOrgIOContext      = satIOContext;
11366    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
11367
11368    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
11369
11370    satFreeIntIoResource( tiRoot,
11371                          satDevData,
11372                          satIntIo);
11373
11374    if (event == OSSA_IO_OVERFLOW)
11375    {
11376      TI_DBG1(("itdsatErrorSATAEventHandle: tiIOOverRun\n"));
11377      ostiInitiatorIOCompleted( tiRoot,
11378                                tdOrgIORequestBody->tiIORequest,
11379                                tiIOOverRun,
11380                                0,
11381                                agNULL,
11382                                interruptContext);
11383    }
11384    else
11385    {
11386      TI_DBG1(("itdsatErrorSATAEventHandle: else\n"));
11387      ostiInitiatorIOCompleted( tiRoot,
11388                                tdOrgIORequestBody->tiIORequest,
11389                                tiIOFailed,
11390                                tiDetailOtherError,
11391                                agNULL,
11392                                interruptContext);
11393    }
11394  }
11395  else
11396  {
11397    TI_DBG1(("itdsatErrorSATAEventHandle: Internal, TD generated\n"));
11398    satOrgIOContext        = satIOContext->satOrgIOContext;
11399    if (satOrgIOContext == agNULL)
11400    {
11401      TI_DBG1(("itdsatErrorSATAEventHandle: satOrgIOContext is NULL, wrong\n"));
11402      return;
11403    }
11404    else
11405    {
11406      TI_DBG6(("itdsatErrorSATAEventHandle: satOrgIOContext is NOT NULL\n"));
11407    }
11408    tdOrgIORequestBody     = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
11409    satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
11410
11411    satFreeIntIoResource( tiRoot,
11412                          satDevData,
11413                          satIntIo);
11414
11415    /* clean up TD layer's IORequestBody */
11416    ostiFreeMemory(
11417                   tiRoot,
11418                   tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11419                   sizeof(tdIORequestBody_t)
11420           );
11421
11422  }
11423  return;
11424}
11425
11426osGLOBAL void ossaSATAAbortCB(
11427                              agsaRoot_t        *agRoot,
11428                              agsaIORequest_t   *agIORequest,
11429                              bit32             flag,
11430                              bit32             status)
11431{
11432  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
11433  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
11434  tdIORequestBody_t       *tdAbortIORequestBody = agNULL;
11435  tdsaDeviceData_t        *oneDeviceData        = agNULL;
11436  tiDeviceHandle_t        *tiDeviceHandle       = agNULL;
11437  tiIORequest_t           *taskTag              = agNULL;
11438
11439  TI_DBG1(("ossaSATAAbortCB: start\n"));
11440
11441  tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
11442  if (tdAbortIORequestBody == agNULL)
11443  {
11444    TI_DBG1(("ossaSATAAbortCB: tdAbortIORequestBody is NULL warning!!!!\n"));
11445    return;
11446  }
11447
11448  if (flag == 2)
11449  {
11450    /* abort per port */
11451    TI_DBG1(("ossaSATAAbortCB: abort per port\n"));
11452  }
11453  else if (flag == 1)
11454  {
11455    TI_DBG1(("ossaSATAAbortCB: abort all\n"));
11456    tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
11457    if (tiDeviceHandle == agNULL)
11458    {
11459      TI_DBG1(("ossaSATAAbortCB: tiDeviceHandle is NULL warning!!!!\n"));
11460      ostiFreeMemory(
11461               tiRoot,
11462               tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11463               sizeof(tdIORequestBody_t)
11464               );
11465      return;
11466    }
11467
11468    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
11469    if (oneDeviceData == agNULL)
11470    {
11471      TI_DBG1(("ossaSATAAbortCB: oneDeviceData is NULL warning!!!!\n"));
11472      ostiFreeMemory(
11473               tiRoot,
11474               tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11475               sizeof(tdIORequestBody_t)
11476               );
11477      return;
11478    }
11479
11480    if (status == OSSA_IO_SUCCESS)
11481    {
11482      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_SUCCESS\n"));
11483      /* clean up TD layer's IORequestBody */
11484      if (oneDeviceData->OSAbortAll == agTRUE)
11485      {
11486        oneDeviceData->OSAbortAll = agFALSE;
11487        ostiInitiatorEvent( tiRoot,
11488                            agNULL,
11489                            tiDeviceHandle,
11490                            tiIntrEventTypeLocalAbort,
11491                            tiAbortOK,
11492                            agNULL);
11493      }
11494      else
11495      {
11496        TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11497        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11498      }
11499      /* callback to OS layer here ??? */
11500      TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11501      ostiFreeMemory(
11502                   tiRoot,
11503                   tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11504                   sizeof(tdIORequestBody_t)
11505                   );
11506
11507    }
11508    else if (status == OSSA_IO_NOT_VALID)
11509    {
11510      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NOT_VALID\n"));
11511      /*
11512        Nothing is reproted to OS layer
11513      */
11514      if (oneDeviceData->OSAbortAll == agTRUE)
11515      {
11516        oneDeviceData->OSAbortAll = agFALSE;
11517        ostiInitiatorEvent( tiRoot,
11518                            agNULL,
11519                            tiDeviceHandle,
11520                            tiIntrEventTypeLocalAbort,
11521                            tiAbortFailed,
11522                            agNULL );
11523      }
11524      else
11525      {
11526        TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11527        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11528      }
11529      TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11530      ostiFreeMemory(
11531                     tiRoot,
11532                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11533                     sizeof(tdIORequestBody_t)
11534                     );
11535    }
11536    else if (status == OSSA_IO_NO_DEVICE)
11537    {
11538      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NO_DEVICE\n"));
11539      /*
11540        Nothing is reproted to OS layer
11541      */
11542      if (oneDeviceData->OSAbortAll == agTRUE)
11543      {
11544        oneDeviceData->OSAbortAll = agFALSE;
11545        ostiInitiatorEvent( tiRoot,
11546                            agNULL,
11547                            tiDeviceHandle,
11548                            tiIntrEventTypeLocalAbort,
11549                            tiAbortInProgress,
11550                            agNULL );
11551      }
11552      else
11553      {
11554        TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11555        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11556      }
11557      TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11558      ostiFreeMemory(
11559                     tiRoot,
11560                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11561                     sizeof(tdIORequestBody_t)
11562                     );
11563    }
11564    else if (status == OSSA_IO_ABORT_IN_PROGRESS)
11565    {
11566      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
11567      /*
11568        Nothing is reproted to OS layer
11569      */
11570      if (oneDeviceData->OSAbortAll == agTRUE)
11571      {
11572        oneDeviceData->OSAbortAll = agFALSE;
11573        ostiInitiatorEvent( tiRoot,
11574                            agNULL,
11575                            tiDeviceHandle,
11576                            tiIntrEventTypeLocalAbort,
11577                            tiAbortInProgress,
11578                            agNULL );
11579      }
11580      else
11581      {
11582        TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11583        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11584      }
11585      TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11586      ostiFreeMemory(
11587                     tiRoot,
11588                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11589                     sizeof(tdIORequestBody_t)
11590                     );
11591    }
11592    else
11593    {
11594      TI_DBG1(("ossaSATAAbortCB: unspecified status 0x%x\n", status ));
11595      /*
11596        Nothing is reproted to OS layer
11597      */
11598      if (oneDeviceData->OSAbortAll == agTRUE)
11599      {
11600        oneDeviceData->OSAbortAll = agFALSE;
11601        ostiInitiatorEvent( tiRoot,
11602                            agNULL,
11603                            tiDeviceHandle,
11604                            tiIntrEventTypeLocalAbort,
11605                            tiAbortInProgress,
11606                            agNULL );
11607      }
11608      else
11609      {
11610        TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11611        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11612      }
11613      TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11614      ostiFreeMemory(
11615                     tiRoot,
11616                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11617                     sizeof(tdIORequestBody_t)
11618                     );
11619    }
11620  }
11621  else if (flag == 0)
11622  {
11623    TI_DBG1(("ossaSATAAbortCB: abort one\n"));
11624    taskTag = tdAbortIORequestBody->tiIOToBeAbortedRequest;
11625
11626    if (status == OSSA_IO_SUCCESS)
11627    {
11628      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_SUCCESS\n"));
11629
11630      ostiInitiatorEvent( tiRoot,
11631                          agNULL,
11632                          agNULL,
11633                          tiIntrEventTypeLocalAbort,
11634                          tiAbortOK,
11635                          taskTag );
11636      ostiFreeMemory(
11637                     tiRoot,
11638                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11639                     sizeof(tdIORequestBody_t)
11640                     );
11641
11642    }
11643    else if (status == OSSA_IO_NOT_VALID)
11644    {
11645      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NOT_VALID\n"));
11646
11647      ostiInitiatorEvent( tiRoot,
11648                          agNULL,
11649                          agNULL,
11650                          tiIntrEventTypeLocalAbort,
11651                          tiAbortFailed,
11652                          taskTag );
11653
11654      ostiFreeMemory(
11655                     tiRoot,
11656                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11657                     sizeof(tdIORequestBody_t)
11658                     );
11659    }
11660    else if (status == OSSA_IO_NO_DEVICE)
11661    {
11662      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NO_DEVICE\n"));
11663
11664      ostiInitiatorEvent( tiRoot,
11665                          agNULL,
11666                          agNULL,
11667                          tiIntrEventTypeLocalAbort,
11668                          tiAbortInProgress,
11669                          taskTag );
11670
11671      ostiFreeMemory(
11672                     tiRoot,
11673                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11674                     sizeof(tdIORequestBody_t)
11675                     );
11676    }
11677    else if (status == OSSA_IO_ABORT_IN_PROGRESS)
11678    {
11679      TI_DBG1(("ossaSATAAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
11680
11681      ostiInitiatorEvent( tiRoot,
11682                          agNULL,
11683                          agNULL,
11684                          tiIntrEventTypeLocalAbort,
11685                          tiAbortInProgress,
11686                          taskTag );
11687
11688      ostiFreeMemory(
11689                     tiRoot,
11690                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11691                     sizeof(tdIORequestBody_t)
11692                     );
11693    }
11694    else
11695    {
11696      TI_DBG1(("ossaSATAAbortCB: unspecified status 0x%x\n", status ));
11697
11698      ostiInitiatorEvent( tiRoot,
11699                          agNULL,
11700                          agNULL,
11701                          tiIntrEventTypeLocalAbort,
11702                          tiAbortFailed,
11703                          taskTag );
11704
11705      ostiFreeMemory(
11706                     tiRoot,
11707                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11708                     sizeof(tdIORequestBody_t)
11709                     );
11710    }
11711  }
11712  else
11713  {
11714    TI_DBG1(("ossaSATAAbortCB: wrong flag %d\n", flag));
11715  }
11716  return;
11717}
11718
11719/*****************************************************************************
11720*! \brief  ossaSATADeviceResetCB
11721*
11722*   This routine is called to complete a SATA device reset request previously
11723*   issued to the LL Layer in saSATADeviceReset().
11724*
11725*  \param agRoot:      Handles for this instance of SAS/SATA hardware
11726*  \param agDevHandle: Pointer to a device handle
11727*  \param resetStatus: Reset status:
11728*                      OSSA_SUCCESS: The reset operation completed successfully.
11729*                      OSSA_FAILURE: The reset operation failed.
11730*  \param resetparm:  Pointer to the Device-To-Host FIS received from the device.
11731*
11732*  \return: none
11733*
11734*****************************************************************************/
11735osGLOBAL void
11736ossaSATADeviceResetCB(
11737                      agsaRoot_t        *agRoot,
11738                      agsaDevHandle_t   *agDevHandle,
11739                      bit32             resetStatus,
11740                      void              *resetparm)
11741{
11742  bit32               tiResetStatus;
11743  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
11744  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
11745  tdsaDeviceData_t    *pDeviceData;
11746  tiDeviceHandle_t    *tiDeviceHandle;
11747
11748  TI_DBG1(("ossaSATADeviceResetCB: agDevHandle=%p resetStatus=0x%x\n",
11749      agDevHandle, resetStatus ));
11750
11751  pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
11752  tiDeviceHandle = &(pDeviceData->tiDeviceHandle);
11753
11754  if (resetStatus == OSSA_SUCCESS )
11755    tiResetStatus = tiSuccess;
11756  else
11757    tiResetStatus = tiError;
11758
11759  osSatResetCB( tiRoot,
11760                tiDeviceHandle,
11761                tiResetStatus,
11762                resetparm);
11763
11764}
11765
11766
11767/*****************************************************************************/
11768/*! \brief satDecrementPendingIO
11769 *
11770 *  This function decrements the number of pending IO's
11771 *
11772 *  \param   tiRoot:           Pointer to TISA initiator driver/port instance.
11773 *  \param   tdsaAllShared:    Pointer to TD context.
11774 *  \param   satIOContext_t:   Pointer to the SAT IO Context
11775 *
11776 *  \return
11777 *          None
11778 */
11779/*****************************************************************************/
11780GLOBAL void
11781satDecrementPendingIO(
11782                      tiRoot_t                *tiRoot,
11783                      tdsaContext_t           *tdsaAllShared,
11784                      satIOContext_t          *satIOContext
11785                      )
11786{
11787  satDeviceData_t         *satDevData;
11788
11789  TI_DBG4(("satDecrementPendingIO: start\n"));
11790
11791  satDevData             = satIOContext->pSatDevData;
11792
11793  if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
11794       (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
11795  {
11796    tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
11797    satDevData->satPendingNCQIO--;
11798    satIOContext->pSatDevData->satPendingIO--;
11799    TDLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink);
11800    tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
11801  }
11802  else
11803  {
11804    tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
11805    satDevData->satPendingNONNCQIO--;
11806    satIOContext->pSatDevData->satPendingIO--;
11807    TDLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink);
11808    tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
11809  }
11810
11811  return;
11812}
11813
11814GLOBAL void
11815satTranslateATAPIErrorsToSCSIErrors(
11816    bit8   bCommand,
11817    bit8   bATAStatus,
11818    bit8   bATAError,
11819    bit8   *pSenseKey,
11820    bit16  *pSenseCodeInfo
11821    )
11822{
11823    if (pSenseKey == agNULL || pSenseCodeInfo == agNULL)
11824    {
11825        TI_DBG0(("TranslateATAErrorsToSCSIErros: pSenseKey == agNULL || pSenseCodeInfo == agNULL\n"));
11826        return;
11827    }
11828
11829    if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & NM_ATA_ERROR_MASK))
11830    {
11831      *pSenseKey = SCSI_SNSKEY_NOT_READY;
11832      *pSenseCodeInfo = 0x3a00;
11833    }
11834    else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & ABRT_ATA_ERROR_MASK))
11835    {
11836      *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND;
11837      *pSenseCodeInfo = 0;
11838    }
11839    else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & MCR_ATA_ERROR_MASK))
11840    {
11841      *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION;
11842      *pSenseCodeInfo = 0x5a01;
11843    }
11844    else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & IDNF_ATA_ERROR_MASK))
11845    {
11846      *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR;
11847      *pSenseCodeInfo = 0x1401;
11848    }
11849    else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & MC_ATA_ERROR_MASK))
11850    {
11851      *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION;
11852      *pSenseCodeInfo = 0x2800;
11853    }
11854    else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & UNC_ATA_ERROR_MASK))
11855    {
11856      /*READ*/
11857      *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR;
11858      *pSenseCodeInfo = 0x1100;
11859
11860      /*add WRITE here */
11861    }
11862    else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & ICRC_ATA_ERROR_MASK))
11863    {
11864      *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND;
11865      *pSenseCodeInfo = 0x4703;
11866    }
11867    else if((bATAStatus & DF_ATA_STATUS_MASK))
11868    {
11869      *pSenseKey = SCSI_SNSKEY_HARDWARE_ERROR;
11870      *pSenseCodeInfo = 0x4400;
11871    }
11872    else
11873    {
11874      TI_DBG0(("unhandled ata error: bATAStatus = 0x%x, bATAError = 0x%x\n",
11875                 bATAStatus, bATAError));
11876    }
11877
11878}
11879
11880#endif /* #ifdef SATA_ENABLE */
11881
11882