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