1285242Sachim/*******************************************************************************
2285242Sachim**
3285242Sachim*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
4285242Sachim*
5285242Sachim*Redistribution and use in source and binary forms, with or without modification, are permitted provided
6285242Sachim*that the following conditions are met:
7285242Sachim*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
8285242Sachim*following disclaimer.
9285242Sachim*2. Redistributions in binary form must reproduce the above copyright notice,
10285242Sachim*this list of conditions and the following disclaimer in the documentation and/or other materials provided
11285242Sachim*with the distribution.
12285242Sachim*
13285242Sachim*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
14285242Sachim*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
15285242Sachim*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16285242Sachim*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
17285242Sachim*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
18285242Sachim*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
19285242Sachim*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
20285242Sachim*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
21285242Sachim**
22285242Sachim********************************************************************************/
23285242Sachim/*****************************************************************************/
24285242Sachim/** \file
25285242Sachim *
26285242Sachim * This file contains initiator CB functions
27285242Sachim *
28285242Sachim */
29285242Sachim#include <sys/cdefs.h>
30285242Sachim__FBSDID("$FreeBSD$");
31285242Sachim#include <dev/pms/config.h>
32285242Sachim
33285242Sachim#include <dev/pms/freebsd/driver/common/osenv.h>
34285242Sachim#include <dev/pms/freebsd/driver/common/ostypes.h>
35285242Sachim#include <dev/pms/freebsd/driver/common/osdebug.h>
36285242Sachim
37285242Sachim#include <dev/pms/RefTisa/sallsdk/api/sa.h>
38285242Sachim#include <dev/pms/RefTisa/sallsdk/api/saapi.h>
39285242Sachim#include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
40285242Sachim
41285242Sachim#include <dev/pms/RefTisa/tisa/api/titypes.h>
42285242Sachim#include <dev/pms/RefTisa/tisa/api/ostiapi.h>
43285242Sachim#include <dev/pms/RefTisa/tisa/api/tiapi.h>
44285242Sachim#include <dev/pms/RefTisa/tisa/api/tiglobal.h>
45285242Sachim
46285242Sachim#ifdef FDS_SM
47285242Sachim#include <dev/pms/RefTisa/sat/api/sm.h>
48285242Sachim#include <dev/pms/RefTisa/sat/api/smapi.h>
49285242Sachim#include <dev/pms/RefTisa/sat/api/tdsmapi.h>
50285242Sachim#endif
51285242Sachim
52285242Sachim#ifdef FDS_DM
53285242Sachim#include <dev/pms/RefTisa/discovery/api/dm.h>
54285242Sachim#include <dev/pms/RefTisa/discovery/api/dmapi.h>
55285242Sachim#include <dev/pms/RefTisa/discovery/api/tddmapi.h>
56285242Sachim#endif
57285242Sachim
58285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
59285242Sachim#include <dev/pms/freebsd/driver/common/osstring.h>
60285242Sachim#include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
61285242Sachim
62285242Sachim#ifdef INITIATOR_DRIVER
63285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
64285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
65285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
66285242Sachim#endif
67285242Sachim
68285242Sachim#ifdef TARGET_DRIVER
69285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
70285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
71285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
72285242Sachim#endif
73285242Sachim
74285242Sachim#include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
75285242Sachim#include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
76285242Sachim
77285242Sachim/*****************************************************************************
78285242Sachim*!  \brief  itdssTaskCompleted
79285242Sachim*
80285242Sachim*  Purpose: This routine is called to complete an task management request
81285242Sachim*           previously issued to the LL Layer. All task management completes with
82285242Sachim*           this function except query task management.
83285242Sachim*
84285242Sachim*   \param  agRoot:         Pointer to driver Instance.
85285242Sachim*   \param  agIORequest:    Pointer to the I/O Request data structure for
86285242Sachim*                           this I/O.
87285242Sachim*   \param  agIOStatus:     Status of I/O just completed.
88285242Sachim*   \param  agIOInfoLen:    Length of the I/O information associated with this
89285242Sachim*                           I/O request
90285242Sachim*   \param   agParam        A Handle used to refer to the response frame or handle
91285242Sachim*                           of abort request
92285242Sachim*   \param  agOtherInfo        Residual count
93285242Sachim*   \return:                None
94285242Sachim*
95285242Sachim*   \note - This is a initiator specific function called by the jump table.
96285242Sachim*
97285242Sachim*****************************************************************************/
98285242SachimosGLOBAL void
99285242SachimitdssTaskCompleted(
100285242Sachim                 agsaRoot_t             *agRoot,
101285242Sachim                 agsaIORequest_t        *agIORequest,
102285242Sachim                 bit32                  agIOStatus,
103285242Sachim                 bit32                  agIOInfoLen,
104285242Sachim                 void                   *agParam,
105285242Sachim                 bit32                  agOtherInfo
106285242Sachim                 )
107285242Sachim{
108285242Sachim  tdsaRootOsData_t            *osData = (tdsaRootOsData_t *)agRoot->osData;
109285242Sachim  tiRoot_t                    *tiRoot = (tiRoot_t *)osData->tiRoot;
110285242Sachim  tiIORequest_t               *taskTag = agNULL, *currentTaskTag = agNULL;
111285242Sachim  tdIORequestBody_t           *tdIORequestBody = agNULL;
112285242Sachim  tdIORequestBody_t           *TMtdIORequestBody = agNULL;
113285242Sachim  tdIORequestBody_t           *AborttdIORequestBody = agNULL;
114285242Sachim  agsaIORequest_t             *agTaskedIORequest;
115285242Sachim  agsaSSPResponseInfoUnit_t   agSSPRespIU;
116285242Sachim  bit8                        respData[128];
117285242Sachim  bit32                       respLen;
118285242Sachim#ifdef  TD_DEBUG_ENABLE
119285242Sachim  bit32                       data_status;
120285242Sachim#endif
121285242Sachim  agsaSASRequestBody_t        *agSASRequestBody = agNULL;
122285242Sachim  agsaSSPScsiTaskMgntReq_t    *agSSPTaskMgntRequest = agNULL;
123285242Sachim  agsaIORequest_t             *agAbortIORequest;
124285242Sachim  tdIORequestBody_t           *tdAbortIORequestBody;
125285242Sachim  bit32                       PhysUpper32;
126285242Sachim  bit32                       PhysLower32;
127285242Sachim  bit32                       memAllocStatus;
128285242Sachim  void                        *osMemHandle;
129285242Sachim  bit32                       abortOrquery = agTRUE;
130285242Sachim  tiDeviceHandle_t            *tiDeviceHandle = agNULL;
131285242Sachim  tdsaDeviceData_t            *oneDeviceData = agNULL;
132285242Sachim  agsaDevHandle_t             *agDevHandle = agNULL;
133285242Sachim  bit32                        status = AGSA_RC_FAILURE;
134285242Sachim
135285242Sachim  TI_DBG2(("itdssTaskCompleted: start\n"));
136285242Sachim
137285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
138285242Sachim
139285242Sachim  /* check the agIOStatus */
140285242Sachim  currentTaskTag = tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag;
141285242Sachim
142285242Sachim  if (currentTaskTag == agNULL)
143285242Sachim  {
144285242Sachim    TI_DBG1(("itdssTaskCompleted: currentTaskTag is NULL \n"));
145285242Sachim	/* as the currentTaskTag is agNULL, shall not call ostiInitiatorEvent */
146285242Sachim	#if 0
147285242Sachim    ostiInitiatorEvent( tiRoot,
148285242Sachim                        NULL,
149285242Sachim                        NULL,
150285242Sachim                        tiIntrEventTypeTaskManagement,
151285242Sachim                        tiTMFailed,
152285242Sachim                        currentTaskTag );
153285242Sachim    #endif
154285242Sachim    /* free up allocated memory */
155285242Sachim    ostiFreeMemory(
156285242Sachim                   tiRoot,
157285242Sachim                   tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
158285242Sachim                   sizeof(tdIORequestBody_t)
159285242Sachim                   );
160285242Sachim    return;
161285242Sachim  }
162285242Sachim
163285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
164285242Sachim  {
165285242Sachim    TI_DBG1(("itdssTaskCompleted: agIOStatus failed and tiTMFailed\n"));
166285242Sachim    if (agIOStatus == OSSA_IO_TM_TAG_NOT_FOUND)
167285242Sachim    {
168285242Sachim      TI_DBG1(("itdssTaskCompleted: agIOStatus OSSA_IO_TM_TAG_NOT_FOUND\n"));
169285242Sachim    }
170285242Sachim    else
171285242Sachim    if (agIOStatus == OSSA_IO_ABORTED)
172285242Sachim    {
173285242Sachim      TI_DBG1(("itdssTaskCompleted: agIOStatus OSSA_IO_ABORTED\n"));
174285242Sachim    }
175285242Sachim    else
176285242Sachim    {
177285242Sachim      TI_DBG1(("itdssTaskCompleted: agIOStatus 0x%x\n", agIOStatus));
178285242Sachim    }
179285242Sachim    ostiInitiatorEvent( tiRoot,
180285242Sachim                        NULL,
181285242Sachim                        NULL,
182285242Sachim                        tiIntrEventTypeTaskManagement,
183285242Sachim                        tiTMFailed,
184285242Sachim                        currentTaskTag );
185285242Sachim    /* free up allocated memory */
186285242Sachim    ostiFreeMemory(
187285242Sachim                   tiRoot,
188285242Sachim                   tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
189285242Sachim                   sizeof(tdIORequestBody_t)
190285242Sachim                   );
191285242Sachim    return;
192285242Sachim  }
193285242Sachim
194285242Sachim  /* parse the task management response */
195285242Sachim  /* reads agsaSSPResponseInfoUnit_t */
196285242Sachim  saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
197285242Sachim#ifdef  TD_DEBUG_ENABLE
198285242Sachim  data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
199285242Sachim#endif
200285242Sachim  respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
201285242Sachim  TI_DBG6(("itdssTaskCompleted: dataPres %d. should be 1\n", data_status));
202285242Sachim  /* reads response data */
203285242Sachim  saFrameReadBlock(agRoot, agParam,
204285242Sachim                   sizeof(agsaSSPResponseInfoUnit_t),
205285242Sachim                   respData, respLen);
206285242Sachim  TI_DBG6(("itdssTaskCompleted: res code %d. should be 0\n", respData[3]));
207285242Sachim
208285242Sachim  taskTag = tdIORequestBody->IOType.InitiatorTMIO.TaskTag;
209285242Sachim  if (taskTag == agNULL)
210285242Sachim  {
211285242Sachim    /* other than Abort Task or Query Task */
212285242Sachim    TI_DBG1(("itdssTaskCompleted: taskTag is NULL\n"));
213285242Sachim
214285242Sachim    abortOrquery = agFALSE;
215285242Sachim    TMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData;
216285242Sachim  }
217285242Sachim  else
218285242Sachim  {
219285242Sachim    /* Abort Task or Query Task */
220285242Sachim    TI_DBG2(("itdssTaskCompleted: taskTag is NOT NULL\n"));
221285242Sachim    abortOrquery = agTRUE;
222285242Sachim    TMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData;
223285242Sachim  }
224285242Sachim
225285242Sachim  TI_DBG2(("itdssTaskCompleted: TMtdIORequestBody %p\n", TMtdIORequestBody));
226285242Sachim
227285242Sachim  if (TMtdIORequestBody == agNULL)
228285242Sachim  {
229285242Sachim    TI_DBG1(("itdssTaskCompleted: TMtdIORequestBody is NULL \n"));
230285242Sachim    ostiInitiatorEvent( tiRoot,
231285242Sachim                        NULL,
232285242Sachim                        NULL,
233285242Sachim                        tiIntrEventTypeTaskManagement,
234285242Sachim                        tiTMFailed,
235285242Sachim                        currentTaskTag );
236285242Sachim    /* free up allocated memory */
237285242Sachim    ostiFreeMemory(
238285242Sachim                   tiRoot,
239285242Sachim                   tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
240285242Sachim                   sizeof(tdIORequestBody_t)
241285242Sachim                   );
242285242Sachim    return;
243285242Sachim  }
244285242Sachim
245285242Sachim  if (agIOStatus == OSSA_IO_SUCCESS && agIOInfoLen == 0)
246285242Sachim  {
247285242Sachim    TI_DBG1(("itdssTaskCompleted: agIOInfoLen is zero, wrong\n"));
248285242Sachim    ostiInitiatorEvent( tiRoot,
249285242Sachim                        NULL,
250285242Sachim                        NULL,
251285242Sachim                        tiIntrEventTypeTaskManagement,
252285242Sachim                        tiTMFailed,
253285242Sachim                        currentTaskTag );
254285242Sachim    /* free up allocated memory */
255285242Sachim    ostiFreeMemory(
256285242Sachim                   tiRoot,
257285242Sachim                   tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
258285242Sachim                   sizeof(tdIORequestBody_t)
259285242Sachim                   );
260285242Sachim    return;
261285242Sachim  }
262285242Sachim
263285242Sachim  agSASRequestBody = (agsaSASRequestBody_t *)&(TMtdIORequestBody->transport.SAS.agSASRequestBody);
264285242Sachim  agSSPTaskMgntRequest = (agsaSSPScsiTaskMgntReq_t *)&(agSASRequestBody->sspTaskMgntReq);
265285242Sachim  TI_DBG2(("itdssTaskCompleted: agSSPTaskMgntRequest->taskMgntFunction 0x%x\n", agSSPTaskMgntRequest->taskMgntFunction));
266285242Sachim
267285242Sachim  if ( (agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK ||
268285242Sachim        agSSPTaskMgntRequest->taskMgntFunction == AGSA_QUERY_TASK) &&
269285242Sachim        abortOrquery == agFALSE
270285242Sachim      )
271285242Sachim  {
272285242Sachim    TI_DBG1(("itdssTaskCompleted: incorrect tasktag, first\n"));
273285242Sachim    ostiInitiatorEvent( tiRoot,
274285242Sachim                        NULL,
275285242Sachim                        NULL,
276285242Sachim                        tiIntrEventTypeTaskManagement,
277285242Sachim                        tiTMFailed,
278285242Sachim                        currentTaskTag );
279285242Sachim    /* free up allocated memory */
280285242Sachim    ostiFreeMemory(
281285242Sachim                   tiRoot,
282285242Sachim                   tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
283285242Sachim                   sizeof(tdIORequestBody_t)
284285242Sachim                   );
285285242Sachim    return;
286285242Sachim  }
287285242Sachim
288285242Sachim  if ((agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK_SET ||
289285242Sachim       agSSPTaskMgntRequest->taskMgntFunction == AGSA_CLEAR_TASK_SET ||
290285242Sachim       agSSPTaskMgntRequest->taskMgntFunction == AGSA_LOGICAL_UNIT_RESET ||
291285242Sachim       agSSPTaskMgntRequest->taskMgntFunction == AGSA_CLEAR_ACA ) &&
292285242Sachim       abortOrquery == agTRUE
293285242Sachim     )
294285242Sachim  {
295285242Sachim    TI_DBG1(("itdssTaskCompleted: incorrect tasktag, second\n"));
296285242Sachim    ostiInitiatorEvent( tiRoot,
297285242Sachim                        NULL,
298285242Sachim                        NULL,
299285242Sachim                        tiIntrEventTypeTaskManagement,
300285242Sachim                        tiTMFailed,
301285242Sachim                        currentTaskTag );
302285242Sachim    /* free up allocated memory */
303285242Sachim    ostiFreeMemory(
304285242Sachim                   tiRoot,
305285242Sachim                   tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
306285242Sachim                   sizeof(tdIORequestBody_t)
307285242Sachim                   );
308285242Sachim    return;
309285242Sachim  }
310285242Sachim
311285242Sachim
312285242Sachim  if (agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK)
313285242Sachim  {
314285242Sachim    TI_DBG2(("itdssTaskCompleted: calling saSSPAbort()\n"));
315285242Sachim    AborttdIORequestBody = (tdIORequestBody_t *)taskTag->tdData;
316285242Sachim    if (AborttdIORequestBody == agNULL)
317285242Sachim    {
318285242Sachim      TI_DBG1(("itdssTaskCompleted: wrong, AborttdIORequestBody is NULL\n"));
319285242Sachim      return;
320285242Sachim    }
321285242Sachim
322285242Sachim    tiDeviceHandle = AborttdIORequestBody->tiDevHandle;
323285242Sachim    if (tiDeviceHandle == agNULL)
324285242Sachim    {
325285242Sachim      TI_DBG1(("itdssTaskCompleted: wrong, tiDeviceHandle is NULL\n"));
326285242Sachim      return;
327285242Sachim    }
328285242Sachim    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
329285242Sachim    if (oneDeviceData == agNULL)
330285242Sachim    {
331285242Sachim      TI_DBG1(("itdssTaskCompleted: wrong, oneDeviceData is NULL\n"));
332285242Sachim      return;
333285242Sachim    }
334285242Sachim    agDevHandle = oneDeviceData->agDevHandle;
335285242Sachim    if (agDevHandle == agNULL)
336285242Sachim    {
337285242Sachim      TI_DBG1(("itdssTaskCompleted: wrong, agDevHandle is NULL\n"));
338285242Sachim    }
339285242Sachim
340285242Sachim    agTaskedIORequest = (agsaIORequest_t *)&(AborttdIORequestBody->agIORequest);
341285242Sachim    if (agTaskedIORequest == agNULL)
342285242Sachim    {
343285242Sachim      TI_DBG1(("itdssTaskCompleted: agTaskedIORequest is NULL \n"));
344285242Sachim      ostiInitiatorEvent( tiRoot,
345285242Sachim                          NULL,
346285242Sachim                          NULL,
347285242Sachim                          tiIntrEventTypeTaskManagement,
348285242Sachim                          tiTMFailed,
349285242Sachim                          currentTaskTag );
350285242Sachim      /* free up allocated memory */
351285242Sachim      ostiFreeMemory(
352285242Sachim                     tiRoot,
353285242Sachim                     tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
354285242Sachim                     sizeof(tdIORequestBody_t)
355285242Sachim                     );
356285242Sachim      return;
357285242Sachim    }
358285242Sachim
359285242Sachim
360285242Sachim    /* allocating agIORequest for abort itself */
361285242Sachim    memAllocStatus = ostiAllocMemory(
362285242Sachim                                     tiRoot,
363285242Sachim                                     &osMemHandle,
364285242Sachim                                     (void **)&tdAbortIORequestBody,
365285242Sachim                                     &PhysUpper32,
366285242Sachim                                     &PhysLower32,
367285242Sachim                                     8,
368285242Sachim                                     sizeof(tdIORequestBody_t),
369285242Sachim                                     agTRUE
370285242Sachim                                     );
371285242Sachim    if (memAllocStatus != tiSuccess)
372285242Sachim    {
373285242Sachim      /* let os process IO */
374285242Sachim      TI_DBG1(("itdssTaskCompleted: ostiAllocMemory failed...\n"));
375285242Sachim      return;
376285242Sachim    }
377285242Sachim
378285242Sachim    if (tdAbortIORequestBody == agNULL)
379285242Sachim    {
380285242Sachim      /* let os process IO */
381285242Sachim      TI_DBG1(("itdssTaskCompleted: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
382285242Sachim      return;
383285242Sachim    }
384285242Sachim
385285242Sachim    /* setup task management structure */
386285242Sachim    tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
387285242Sachim    tdAbortIORequestBody->tiDevHandle = tiDeviceHandle;
388285242Sachim    /* setting callback */
389285242Sachim    tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler;
390285242Sachim
391285242Sachim    /* setting to NULL because the local abort is triggered by TD layer */
392285242Sachim    tdAbortIORequestBody->tiIOToBeAbortedRequest = agNULL;
393285242Sachim    /* initialize agIORequest */
394285242Sachim    agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
395285242Sachim    agAbortIORequest->osData = (void *) tdAbortIORequestBody;
396285242Sachim    agAbortIORequest->sdkData = agNULL; /* LL takes care of this */
397285242Sachim
398285242Sachim    status = saSSPAbort(agRoot, agAbortIORequest, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 0, agTaskedIORequest, agNULL);
399285242Sachim    if (status != AGSA_RC_SUCCESS)
400285242Sachim    {
401285242Sachim      TI_DBG1(("itdssTaskCompleted: saSSPAbort failed agIOInfoLen is zero, wrong\n"));
402285242Sachim      ostiFreeMemory(
403285242Sachim                     tiRoot,
404285242Sachim                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
405285242Sachim                     sizeof(tdIORequestBody_t)
406285242Sachim                     );
407285242Sachim    }
408285242Sachim  }
409285242Sachim
410285242Sachim  /*
411285242Sachim    parse the response and based on the parse,
412285242Sachim    set the flag
413285242Sachim  */
414285242Sachim  if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_COMPLETE ||
415285242Sachim      respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_SUCCEEDED)
416285242Sachim  {
417285242Sachim    TI_DBG2(("itdssTaskCompleted: tiTMOK\n"));
418285242Sachim    tiDeviceHandle = TMtdIORequestBody->tiDevHandle;
419285242Sachim    if (tiDeviceHandle == agNULL)
420285242Sachim    {
421285242Sachim      TI_DBG1(("itdssTaskCompleted: wrong, tiDeviceHandle is NULL\n"));
422285242Sachim      return;
423285242Sachim    }
424285242Sachim    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
425285242Sachim    if (oneDeviceData == agNULL)
426285242Sachim    {
427285242Sachim      TI_DBG1(("itdssTaskCompleted: wrong, oneDeviceData is NULL\n"));
428285242Sachim      return;
429285242Sachim    }
430285242Sachim    agDevHandle = oneDeviceData->agDevHandle;
431285242Sachim    if (agDevHandle == agNULL)
432285242Sachim    {
433285242Sachim      TI_DBG1(("itdssTaskCompleted: wrong, agDevHandle is NULL\n"));
434285242Sachim    }
435285242Sachim    TI_DBG2(("itdssTaskCompleted: setting Device state to SA_DS_OPERATIONAL\n"));
436285242Sachim
437285242Sachim    saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
438285242Sachim
439285242Sachim    ostiInitiatorEvent( tiRoot,
440285242Sachim                        NULL,
441285242Sachim                        NULL,
442285242Sachim                        tiIntrEventTypeTaskManagement,
443285242Sachim                        tiTMOK,
444285242Sachim                        currentTaskTag );
445285242Sachim  }
446285242Sachim  else
447285242Sachim  {
448285242Sachim    TI_DBG1(("itdssTaskCompleted: tiTMFailed\n"));
449285242Sachim    ostiInitiatorEvent( tiRoot,
450285242Sachim                        NULL,
451285242Sachim                        NULL,
452285242Sachim                        tiIntrEventTypeTaskManagement,
453285242Sachim                        tiTMFailed,
454285242Sachim                        currentTaskTag );
455285242Sachim
456285242Sachim  }
457285242Sachim
458285242Sachim  /* free up allocated memory */
459285242Sachim  ostiFreeMemory(
460285242Sachim                 tiRoot,
461285242Sachim                 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
462285242Sachim                 sizeof(tdIORequestBody_t)
463285242Sachim                 );
464285242Sachim  return;
465285242Sachim}
466285242Sachim
467285242Sachim#ifdef INITIATOR_DRIVER
468285242Sachim
469285242Sachim/*****************************************************************************
470285242Sachim*!  \brief  itdssQueryTaskCompleted
471285242Sachim*
472285242Sachim*  Purpose: This routine is called to complete an query task management request
473285242Sachim*           previously issued to the LL Layer.
474285242Sachim*
475285242Sachim*   \param  agRoot:         Pointer to driver Instance.
476285242Sachim*   \param  agIORequest:    Pointer to the I/O Request data structure for
477285242Sachim*                           this I/O.
478285242Sachim*   \param  agIOStatus:     Status of I/O just completed.
479285242Sachim*   \param  agIOInfoLen:    Length of the I/O information associated with this
480285242Sachim*                           I/O request
481285242Sachim*   \param   agParam        A Handle used to refer to the response frame or handle
482285242Sachim*                           of abort request
483285242Sachim*
484285242Sachim*   \return:                None
485285242Sachim*
486285242Sachim*   \note - This is a initiator specific function called by the jump table.
487285242Sachim*
488285242Sachim*****************************************************************************/
489285242SachimosGLOBAL void
490285242SachimitdssQueryTaskCompleted(
491285242Sachim                        agsaRoot_t             *agRoot,
492285242Sachim                        agsaIORequest_t        *agIORequest,
493285242Sachim                        bit32                  agIOStatus,
494285242Sachim                        bit32                  agIOInfoLen,
495285242Sachim                        void                   *agParam,
496285242Sachim                        bit32                  agOtherInfo
497285242Sachim                        )
498285242Sachim{
499285242Sachim  tdsaRootOsData_t            *osData = (tdsaRootOsData_t *)agRoot->osData;
500285242Sachim  tiRoot_t                    *tiRoot = (tiRoot_t *)osData->tiRoot;
501285242Sachim  tiIORequest_t               *taskTag = agNULL;
502285242Sachim  tdIORequestBody_t           *tdIORequestBody = agNULL;  /* query task */
503285242Sachim  tdIORequestBody_t           *TMtdIORequestBody = agNULL; /* IO being query tasked */
504285242Sachim  agsaIORequest_t             *agTaskedIORequest = agNULL;
505285242Sachim  agsaSSPResponseInfoUnit_t   agSSPRespIU;
506285242Sachim  bit8                        respData[128];
507285242Sachim  bit32                       respLen;
508285242Sachim#ifdef  TD_DEBUG_ENABLE
509285242Sachim  bit32                       data_status;
510285242Sachim#endif
511285242Sachim  agsaSASRequestBody_t        *agSASRequestBody = agNULL;
512285242Sachim  agsaSSPScsiTaskMgntReq_t    *agSSPTaskMgntRequest = agNULL;
513285242Sachim  bit32                       status;
514285242Sachim  agsaIORequest_t             *agAbortIORequest = agNULL;
515285242Sachim  tdIORequestBody_t           *tdAbortIORequestBody = agNULL;
516285242Sachim  bit32                       PhysUpper32;
517285242Sachim  bit32                       PhysLower32;
518285242Sachim  bit32                       memAllocStatus;
519285242Sachim  void                        *osMemHandle = agNULL;
520285242Sachim  tiDeviceHandle_t            *tiDeviceHandle = agNULL;
521285242Sachim  tdsaDeviceData_t            *oneDeviceData = agNULL;
522285242Sachim  agsaDevHandle_t             *agDevHandle = agNULL;
523285242Sachim
524285242Sachim  TI_DBG2(("itdssQueryTaskComplted: start\n"));
525285242Sachim
526285242Sachim  /* query task management IORequestBody */
527285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
528285242Sachim
529285242Sachim  /* OS's tiIORequest for this query taks, which is agNULL */
530285242Sachim  //currentTaskTag = tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag;
531285242Sachim
532285242Sachim  /*
533285242Sachim    currentTaskTag is agNULL for query task since it is generated by
534285242Sachim    TD layer
535285242Sachim  */
536285242Sachim  if (agIOStatus != OSSA_IO_SUCCESS)
537285242Sachim  {
538285242Sachim    /* let os process IO */
539285242Sachim    TI_DBG1(("itdssQueryTaskComplted: agIOStatus failed and tiTMFailed\n"));
540285242Sachim    /* free up allocated memory */
541285242Sachim    ostiFreeMemory(
542285242Sachim                   tiRoot,
543285242Sachim                   tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
544285242Sachim                   sizeof(tdIORequestBody_t)
545285242Sachim                   );
546285242Sachim    return;
547285242Sachim  }
548285242Sachim  /* parse the task management response */
549285242Sachim  /* reads agsaSSPResponseInfoUnit_t */
550285242Sachim  saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
551285242Sachim#ifdef  TD_DEBUG_ENABLE
552285242Sachim  data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
553285242Sachim#endif
554285242Sachim  respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
555285242Sachim
556285242Sachim  TI_DBG6(("itdssQueryTaskCompleted: dataPres %d. should be 1\n", data_status));
557285242Sachim  /* reads response data */
558285242Sachim  saFrameReadBlock(agRoot, agParam,
559285242Sachim                   sizeof(agsaSSPResponseInfoUnit_t),
560285242Sachim                   respData, respLen);
561285242Sachim
562285242Sachim  TI_DBG6(("itdssQueryTaskCompleted: res code %d. should be 0\n", respData[3]));
563285242Sachim
564285242Sachim  /* IO being query tasked */
565285242Sachim  taskTag = tdIORequestBody->IOType.InitiatorTMIO.TaskTag;
566285242Sachim  if (taskTag == agNULL)
567285242Sachim  {
568285242Sachim    TI_DBG1(("itdssQueryTaskComplted: taskTag is NULL \n"));
569285242Sachim    /* free up allocated memory */
570285242Sachim    ostiFreeMemory(
571285242Sachim                   tiRoot,
572285242Sachim                   tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
573285242Sachim                   sizeof(tdIORequestBody_t)
574285242Sachim                   );
575285242Sachim    return;
576285242Sachim  }
577285242Sachim
578285242Sachim  /* request body of IO being query tasked  */
579285242Sachim  TMtdIORequestBody = (tdIORequestBody_t *)taskTag->tdData;
580285242Sachim  if (TMtdIORequestBody == agNULL)
581285242Sachim  {
582285242Sachim    TI_DBG1(("itdssQueryTaskComplted: TMtdIORequestBody is NULL \n"));
583285242Sachim    /* free up allocated memory */
584285242Sachim    ostiFreeMemory(
585285242Sachim                   tiRoot,
586285242Sachim                   tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
587285242Sachim                   sizeof(tdIORequestBody_t)
588285242Sachim                   );
589285242Sachim    return;
590285242Sachim  }
591285242Sachim
592285242Sachim  agTaskedIORequest = &(TMtdIORequestBody->agIORequest);
593285242Sachim  if (agTaskedIORequest == agNULL)
594285242Sachim  {
595285242Sachim    TI_DBG1(("itdssQueryTaskComplted: agTaskedIORequest is NULL \n"));
596285242Sachim    /* free up allocated memory */
597285242Sachim    ostiFreeMemory(
598285242Sachim                   tiRoot,
599285242Sachim                   tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
600285242Sachim                   sizeof(tdIORequestBody_t)
601285242Sachim                   );
602285242Sachim    return;
603285242Sachim  }
604285242Sachim
605285242Sachim  if (agIOStatus == OSSA_IO_SUCCESS && agIOInfoLen == 0)
606285242Sachim  {
607285242Sachim    TI_DBG1(("itdssQueryTaskCompleted: agIOInfoLen is zero, wrong\n"));
608285242Sachim    /* free up allocated memory */
609285242Sachim    ostiFreeMemory(
610285242Sachim                   tiRoot,
611285242Sachim                   tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
612285242Sachim                   sizeof(tdIORequestBody_t)
613285242Sachim                   );
614285242Sachim   return;
615285242Sachim  }
616285242Sachim  /* this is query task itself */
617285242Sachim  agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
618285242Sachim  agSSPTaskMgntRequest = &(agSASRequestBody->sspTaskMgntReq);
619285242Sachim  if (agSSPTaskMgntRequest->taskMgntFunction == AGSA_QUERY_TASK)
620285242Sachim  {
621285242Sachim    /*
622285242Sachim      process response for query task
623285242Sachim      For query task, response code must be either
624285242Sachim      TASK MANAGEMENT FUNCTION COMPLETE or TASK MANAGEMENT FUNCTION SUCCEEDED by
625285242Sachim      SAM
626285242Sachim
627285242Sachim      1. If TASK MANAGEMENT FUNCTION SUCCEEDE, do nothing
628285242Sachim
629285242Sachim      2. If TASK MANAGEMENT FUNCTION COMPLETE and IO is not completed,
630285242Sachim      retry by saSSPAbort()
631285242Sachim    */
632285242Sachim    if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_SUCCEEDED)
633285242Sachim    {
634285242Sachim      /* OK; IO is being process at the target; do nothing */
635285242Sachim    }
636285242Sachim    else if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_COMPLETE)
637285242Sachim    {
638285242Sachim      tiDeviceHandle = TMtdIORequestBody->tiDevHandle;
639285242Sachim      if (tiDeviceHandle == agNULL)
640285242Sachim      {
641285242Sachim        TI_DBG1(("itdssQueryTaskCompleted: wrong, tiDeviceHandle is NULL\n"));
642285242Sachim        /* free up allocated memory */
643285242Sachim        ostiFreeMemory(
644285242Sachim                       tiRoot,
645285242Sachim                       tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
646285242Sachim                       sizeof(tdIORequestBody_t)
647285242Sachim                       );
648285242Sachim        return;
649285242Sachim      }
650285242Sachim      oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
651285242Sachim      if (oneDeviceData == agNULL)
652285242Sachim      {
653285242Sachim        TI_DBG1(("itdssQueryTaskCompleted: wrong, oneDeviceData is NULL\n"));
654285242Sachim        /* free up allocated memory */
655285242Sachim        ostiFreeMemory(
656285242Sachim                       tiRoot,
657285242Sachim                       tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
658285242Sachim                       sizeof(tdIORequestBody_t)
659285242Sachim                       );
660285242Sachim
661285242Sachim        return;
662285242Sachim      }
663285242Sachim      agDevHandle = oneDeviceData->agDevHandle;
664285242Sachim      if (agDevHandle == agNULL)
665285242Sachim      {
666285242Sachim        TI_DBG1(("itdssQueryTaskCompleted: wrong, agDevHandle is NULL\n"));
667285242Sachim      }
668285242Sachim      /* if IO is not completed, retry IO by saSSPAbort() */
669285242Sachim      if (TMtdIORequestBody->ioCompleted != agTRUE)
670285242Sachim      {
671285242Sachim        /* allocating agIORequest for abort itself */
672285242Sachim        memAllocStatus = ostiAllocMemory(
673285242Sachim                                         tiRoot,
674285242Sachim                                         &osMemHandle,
675285242Sachim                                         (void **)&tdAbortIORequestBody,
676285242Sachim                                         &PhysUpper32,
677285242Sachim                                         &PhysLower32,
678285242Sachim                                         8,
679285242Sachim                                         sizeof(tdIORequestBody_t),
680285242Sachim                                         agTRUE
681285242Sachim                                         );
682285242Sachim        if (memAllocStatus != tiSuccess)
683285242Sachim        {
684285242Sachim          /* let os process IO */
685285242Sachim          TI_DBG1(("itdssQueryTaskCompleted: ostiAllocMemory failed...\n"));
686285242Sachim          /* free up allocated memory */
687285242Sachim          ostiFreeMemory(
688285242Sachim                         tiRoot,
689285242Sachim                         tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
690285242Sachim                         sizeof(tdIORequestBody_t)
691285242Sachim                         );
692285242Sachim
693285242Sachim          return;
694285242Sachim        }
695285242Sachim        if (tdAbortIORequestBody == agNULL)
696285242Sachim        {
697285242Sachim          /* let os process IO */
698285242Sachim          TI_DBG1(("itdssQueryTaskCompleted: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
699285242Sachim          /* free up allocated memory */
700285242Sachim          ostiFreeMemory(
701285242Sachim                         tiRoot,
702285242Sachim                         tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
703285242Sachim                         sizeof(tdIORequestBody_t)
704285242Sachim                         );
705285242Sachim
706285242Sachim          return;
707285242Sachim        }
708285242Sachim
709285242Sachim        /* setup task management structure */
710285242Sachim        tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
711285242Sachim        tdAbortIORequestBody->tiDevHandle = tdIORequestBody->tiDevHandle;
712285242Sachim        tdAbortIORequestBody->tiIOToBeAbortedRequest = agNULL;
713285242Sachim
714285242Sachim        /* setting callback */
715285242Sachim        tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler;
716285242Sachim
717285242Sachim        /* initialize agIORequest */
718285242Sachim        agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
719285242Sachim        agAbortIORequest->osData = (void *) tdAbortIORequestBody;
720285242Sachim        agAbortIORequest->sdkData = agNULL; /* LL takes care of this */
721285242Sachim
722285242Sachim        TI_DBG2(("itdssQueryTaskCompleted: issuing saSSPAbort()\n"));
723285242Sachim        status = saSSPAbort(agRoot, agAbortIORequest, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 0, agTaskedIORequest, agNULL);
724285242Sachim        if (status != AGSA_RC_SUCCESS)
725285242Sachim        {
726285242Sachim          TI_DBG1(("itdssQueryTaskCompleted: saSSPAbort failed agIOInfoLen is zero, wrong\n"));
727285242Sachim          ostiFreeMemory(
728285242Sachim                         tiRoot,
729285242Sachim                         tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
730285242Sachim                         sizeof(tdIORequestBody_t)
731285242Sachim                         );
732285242Sachim        }
733285242Sachim      }
734285242Sachim    }
735285242Sachim    else
736285242Sachim    {
737285242Sachim      TI_DBG1(("itdssQueryTaskComplted: not expected response 0x%x\n",respData[3]));
738285242Sachim    }
739285242Sachim  }
740285242Sachim  else
741285242Sachim  {
742285242Sachim    TI_DBG1(("itdssQueryTaskCompleted: not expected task management fn %d\n",agSSPTaskMgntRequest->taskMgntFunction));
743285242Sachim  }
744285242Sachim
745285242Sachim  /* free up allocated memory */
746285242Sachim  ostiFreeMemory(
747285242Sachim                 tiRoot,
748285242Sachim                 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
749285242Sachim                 sizeof(tdIORequestBody_t)
750285242Sachim                 );
751285242Sachim  return;
752285242Sachim}
753285242Sachim#endif
754285242Sachim
755285242Sachim/*****************************************************************************
756285242Sachim*!  \brief  itssdosIOCompleted
757285242Sachim*
758285242Sachim*  Purpose: This routine is called to complete an I/O request previously
759285242Sachim*           issued to the LL Layer in saSSPStart().
760285242Sachim*
761285242Sachim*   \param  agRoot:       Pointer to driver Instance.
762285242Sachim*   \param  agIORequest:  Pointer to the I/O Request data structure for
763285242Sachim*                         this I/O.
764285242Sachim*   \param  agIOStatus:   Status of I/O just completed.
765285242Sachim*   \param  agIOInfoLen:  Length of the I/O information associated with this
766285242Sachim*                         I/O request
767285242Sachim*   \param   agParam      A Handle used to refer to the response frame or handle
768285242Sachim*                         of abort request
769285242Sachim*  \param  agOtherInfo    Residual count
770285242Sachim*   \return:              None
771285242Sachim*
772285242Sachim*   \note - This is a initiator specific function called by the jump table.
773285242Sachim*
774285242Sachim*****************************************************************************/
775285242SachimFORCEINLINE void
776285242SachimitdssIOCompleted(
777285242Sachim                 agsaRoot_t             *agRoot,
778285242Sachim                 agsaIORequest_t        *agIORequest,
779285242Sachim                 bit32                   agIOStatus,
780285242Sachim                 bit32                   agIOInfoLen,
781285242Sachim                 void                   *agParam,
782285242Sachim                 bit32                   agOtherInfo
783285242Sachim                 )
784285242Sachim{
785285242Sachim  tdsaRootOsData_t          *osData = (tdsaRootOsData_t *)agRoot->osData;
786285242Sachim  tiRoot_t                  *tiRoot = (tiRoot_t *)osData->tiRoot;
787285242Sachim  itdsaIni_t                *Initiator = (itdsaIni_t *)osData->itdsaIni;
788285242Sachim  tdIORequestBody_t         *tdIORequestBody  = agNULL;
789285242Sachim  agsaSASRequestBody_t      *agSASRequestBody = agNULL;
790285242Sachim  agsaSSPInitiatorRequest_t *agSSPInitiatorRequest = agNULL;
791285242Sachim  agsaSSPResponseInfoUnit_t  agSSPRespIU;
792285242Sachim
793285242Sachim  bit32 scsi_status = 0;
794285242Sachim
795285242Sachim  tiDeviceHandle_t          *tiDeviceHandle = agNULL;
796285242Sachim  tdsaDeviceData_t          *oneDeviceData  = agNULL;
797285242Sachim
798285242Sachim  TI_DBG6(("itdssIOCompleted: start\n"));
799285242Sachim  TI_DBG6(("itdssIOCompleted: agIOInfoLen %d\n", agIOInfoLen));
800285242Sachim
801285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
802285242Sachim  TD_ASSERT((NULL != tdIORequestBody), "itdssIOCompleted:tdIORequestBody NULL");
803285242Sachim  if ( NULL == tdIORequestBody )  // handle windows assert case
804285242Sachim  {
805285242Sachim    return;
806285242Sachim  }
807285242Sachim  Initiator->NumIOsActive--;
808285242Sachim
809285242Sachim#ifdef DBG
810285242Sachim  if (tdIORequestBody->ioCompleted == agTRUE)
811285242Sachim  {
812285242Sachim#ifdef  TD_DEBUG_ENABLE
813285242Sachim    tiDeviceHandle = tdIORequestBody->tiDevHandle;
814285242Sachim    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
815285242Sachim#endif /*TD_DEBUG_ENABLE*/
816285242Sachim    TI_DBG1(("itdssIOCompleted: Error!!!!!! double completion\n"));
817285242Sachim#ifdef  TD_DEBUG_ENABLE
818285242Sachim    TI_DBG1(("itdssIOCompleted: did %d \n", oneDeviceData->id));
819285242Sachim#endif /*TD_DEBUG_ENABLE*/
820285242Sachim  }
821285242Sachim
822285242Sachim  if (Initiator->NumIOsActive == 0)
823285242Sachim  {
824285242Sachim    /* so far, no timer assocaicated here */
825285242Sachim    TI_DBG6(("itdssIOCompleted: no acitve IO's. Kill timers\n"));
826285242Sachim  }
827285242Sachim
828285242Sachim  if (tdIORequestBody->tiIORequest->osData == agNULL)
829285242Sachim  {
830285242Sachim    TI_DBG1( ("itdssIOCompleted: pos 1; "
831285242Sachim              "tdIORequestBody->tiIORequest->osData is null, wrong\n") );
832285242Sachim  }
833285242Sachim#endif /*DBG*/
834285242Sachim
835285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
836285242Sachim  tdIORequestBody->ioStarted = agFALSE;
837285242Sachim
838285242Sachim  /* Process completion for debugging, printing cbd */
839285242Sachim  agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
840285242Sachim  agSSPInitiatorRequest = &(agSASRequestBody->sspInitiatorReq);
841285242Sachim
842285242Sachim  TI_DBG6( ("itdssIOCompleted: CDB 0x%x\n",
843285242Sachim            agSSPInitiatorRequest->sspCmdIU.cdb[0]) );
844285242Sachim
845285242Sachim  /* no respsonse or sense data; data has been processed */
846285242Sachim  if((agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen == 0))
847285242Sachim  {
848285242Sachim    // if this is a standard Inquiry command, notify Stoport to set the
849285242Sachim    // device queue depth to maximize oustanding IO
850285242Sachim    if ( (agSSPInitiatorRequest->sspCmdIU.cdb[0] == SCSIOPC_INQUIRY) &&
851285242Sachim         ((agSSPInitiatorRequest->sspCmdIU.cdb[1] & 0x01) == 0))
852285242Sachim    {
853285242Sachim      bit32 qdepth = 32;
854285242Sachim      tiDeviceHandle = tdIORequestBody->tiDevHandle;
855285242Sachim      if( tiDeviceHandle )
856285242Sachim      {
857285242Sachim        oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
858285242Sachim        if( oneDeviceData->DeviceType == TD_SAS_DEVICE )
859285242Sachim        {
860285242Sachim          qdepth = MAX_OUTSTANDING_IO_PER_LUN;
861285242Sachim        }
862285242Sachim        if( oneDeviceData->DeviceType == TD_SATA_DEVICE )
863285242Sachim        {
864285242Sachim          qdepth = 63;
865285242Sachim        }
866285242Sachim      }
867285242Sachim
868285242Sachim      if ( ostiSetDeviceQueueDepth( tiRoot,
869285242Sachim                                    tdIORequestBody->tiIORequest,
870285242Sachim                                    MAX_OUTSTANDING_IO_PER_LUN ) == agFALSE )
871285242Sachim      {
872285242Sachim        TI_DBG1( ( "itdssIOCompleted: failed to call "
873285242Sachim                   "ostiSetDeviceQueueDepth() Q=%d !!!\n", qdepth ) );
874285242Sachim      }
875285242Sachim      else
876285242Sachim      {
877285242Sachim        TI_DBG2(("itdssIOCompleted: set ostiSetDeviceQueueDepth() Q=%d\n",qdepth));
878285242Sachim      }
879285242Sachim    }
880285242Sachim    // SCSI command was completed OK, this is the normal path. Now call the
881285242Sachim    // OS Specific module about this completion.
882285242Sachim    ostiInitiatorIOCompleted(
883285242Sachim                             tiRoot,
884285242Sachim                             tdIORequestBody->tiIORequest,
885285242Sachim                             tiIOSuccess,
886285242Sachim                             SCSI_STAT_GOOD,
887285242Sachim                             agNULL,
888285242Sachim                             agTRUE /* intContext; is not being used */
889285242Sachim                             );
890285242Sachim    return;
891285242Sachim  }
892285242Sachim
893285242Sachim  else
894285242Sachim  {
895285242Sachim    TI_DBG6(("itdssIOCompleted: SUCCESS but data returned \n"));
896285242Sachim    TI_DBG6( ("itdssIOCompleted: agIOStatus SUCCESS but data returned 0x%x\n",
897285242Sachim              agIOStatus) );
898285242Sachim    if(tdIORequestBody)
899285242Sachim    {
900285242Sachim      tiDeviceHandle = tdIORequestBody->tiDevHandle;
901285242Sachim      if(tiDeviceHandle)
902285242Sachim      {
903285242Sachim        oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
904285242Sachim      }
905285242Sachim    }
906285242Sachim
907285242Sachim    osti_memset(&agSSPRespIU, 0, sizeof(agsaSSPResponseInfoUnit_t));
908285242Sachim
909285242Sachim    saFrameReadBlock( agRoot,
910285242Sachim                      agParam,
911285242Sachim                      0,
912285242Sachim                      &agSSPRespIU,
913285242Sachim                      sizeof(agsaSSPResponseInfoUnit_t) );
914285242Sachim    scsi_status = agSSPRespIU.status;
915285242Sachim
916285242Sachim    switch (scsi_status)
917285242Sachim    {
918285242Sachim      case SCSI_STAT_GOOD:
919285242Sachim        TI_DBG2( ("itdssIOCompleted: SCSI_STAT_GOOD %d\n",
920285242Sachim                  Initiator->ScsiStatusCounts.GoodStatus) );
921285242Sachim        Initiator->ScsiStatusCounts.GoodStatus++;
922285242Sachim        break;
923285242Sachim       case SCSI_STAT_CHECK_CONDITION:
924285242Sachim        TI_DBG1( ("itdssIOCompleted: SCSI_STAT_CHECK_CONDITION %d\n",
925285242Sachim                  Initiator->ScsiStatusCounts.CheckCondition) );
926285242Sachim        Initiator->ScsiStatusCounts.CheckCondition++;
927285242Sachim        break;
928285242Sachim      case SCSI_STAT_BUSY:
929285242Sachim        TI_DBG1( ("itdssIOCompleted: SCSI_STAT_BUSY %d\n",
930285242Sachim                  Initiator->ScsiStatusCounts.BusyStatus) );
931285242Sachim        Initiator->ScsiStatusCounts.BusyStatus++;
932285242Sachim        break;
933285242Sachim      case SCSI_STAT_RESV_CONFLICT:
934285242Sachim        TI_DBG1( ("itdssIOCompleted: SCSI_STAT_RESV_CONFLICT %d\n",
935285242Sachim                  Initiator->ScsiStatusCounts.ResvConflict) );
936285242Sachim        Initiator->ScsiStatusCounts.ResvConflict++;
937285242Sachim        break;
938285242Sachim      case SCSI_STAT_TASK_SET_FULL:
939285242Sachim        Initiator->ScsiStatusCounts.TaskSetFull++;
940285242Sachim        //agIOStatus =  OSSA_IO_FAILED;
941285242Sachim        //agOtherInfo = tiDetailBusy;
942285242Sachim        TI_DBG1( ("itdssIOCompleted: SCSI_STAT_TASK_SET_FULL %d\n",
943285242Sachim                  Initiator->ScsiStatusCounts.TaskSetFull) );
944285242Sachim        break;
945285242Sachim      case SCSI_STAT_ACA_ACTIVE:
946285242Sachim        Initiator->ScsiStatusCounts.AcaActive++;
947285242Sachim        TI_DBG1( ("itdssIOCompleted: SCSI_STAT_ACA_ACTIVE %d\n",
948285242Sachim                  Initiator->ScsiStatusCounts.AcaActive) );
949285242Sachim        break;
950285242Sachim      case SCSI_STAT_TASK_ABORTED:
951285242Sachim        Initiator->ScsiStatusCounts.TaskAborted++;
952285242Sachim        TI_DBG1( ("itdssIOCompleted: SCSI_STAT_TASK_ABORTED %d\n",
953285242Sachim                  Initiator->ScsiStatusCounts.TaskAborted) );
954285242Sachim        break;
955285242Sachim      case SCSI_STAT_CONDITION_MET:
956285242Sachim        Initiator->ScsiStatusCounts.ConditionMet++;
957285242Sachim        TI_DBG1( ("itdssIOCompleted: SCSI_STAT_CONDITION_MET %d\n",
958285242Sachim                  Initiator->ScsiStatusCounts.ConditionMet) );
959285242Sachim        break;
960285242Sachim      case SCSI_STAT_INTERMEDIATE:
961285242Sachim        TI_DBG1( ("itdssIOCompleted: SCSI_STAT_INTERMEDIATE %d\n",
962285242Sachim                  Initiator->ScsiStatusCounts.ObsoleteStatus) );
963285242Sachim        Initiator->ScsiStatusCounts.ObsoleteStatus++;
964285242Sachim        break;
965285242Sachim      case SCSI_STAT_INTER_CONDIT_MET:
966285242Sachim        TI_DBG1( ("itdssIOCompleted: SCSI_STAT_INTER_CONDIT_MET %d\n",
967285242Sachim                  Initiator->ScsiStatusCounts.ObsoleteStatus) );
968285242Sachim        Initiator->ScsiStatusCounts.ObsoleteStatus++;
969285242Sachim        break;
970285242Sachim      case SCSI_STAT_COMMANDTERMINATED:
971285242Sachim        TI_DBG1( ("itdssIOCompleted: SCSI_STAT_COMMANDTERMINATED %d\n",
972285242Sachim                  Initiator->ScsiStatusCounts.ObsoleteStatus) );
973285242Sachim        Initiator->ScsiStatusCounts.ObsoleteStatus++;
974285242Sachim        break;
975285242Sachim      default:
976285242Sachim        Initiator->ScsiStatusCounts.ObsoleteStatus++;
977285242Sachim        TI_DBG1( ("itdssIOCompleted: Unknown scsi_status %d 0x%x\n",
978285242Sachim                  scsi_status,Initiator->ScsiStatusCounts.ObsoleteStatus) );
979285242Sachim    }
980285242Sachim
981285242Sachim    switch (agIOStatus)
982285242Sachim    {
983285242Sachim    case OSSA_IO_SUCCESS:
984285242Sachim      itdssIOSuccessHandler( agRoot,
985285242Sachim                             agIORequest,
986285242Sachim                             agIOStatus,
987285242Sachim                             agIOInfoLen,
988285242Sachim                             agParam,
989285242Sachim                             agOtherInfo );
990285242Sachim      break;
991285242Sachim    case OSSA_IO_ABORTED:
992285242Sachim      itdssIOAbortedHandler( agRoot,
993285242Sachim                             agIORequest,
994285242Sachim                             agIOStatus,
995285242Sachim                             agIOInfoLen,
996285242Sachim                             agParam,
997285242Sachim                             agOtherInfo );
998285242Sachim      break;
999285242Sachim    case OSSA_IO_UNDERFLOW:
1000285242Sachim      itdssIOUnderFlowHandler( agRoot,
1001285242Sachim                               agIORequest,
1002285242Sachim                               agIOStatus,
1003285242Sachim                               agIOInfoLen,
1004285242Sachim                               agParam,
1005285242Sachim                               agOtherInfo );
1006285242Sachim      break;
1007285242Sachim    case OSSA_IO_FAILED:
1008285242Sachim      itdssIOFailedHandler( agRoot,
1009285242Sachim                            agIORequest,
1010285242Sachim                            agIOStatus,
1011285242Sachim                            agIOInfoLen,
1012285242Sachim                            agParam,
1013285242Sachim                            agOtherInfo );
1014285242Sachim      break;
1015285242Sachim    case OSSA_IO_ABORT_RESET:
1016285242Sachim      itdssIOAbortResetHandler( agRoot,
1017285242Sachim                                agIORequest,
1018285242Sachim                                agIOStatus,
1019285242Sachim                                agIOInfoLen,
1020285242Sachim                                agParam,
1021285242Sachim                                agOtherInfo );
1022285242Sachim      break;
1023285242Sachim    case OSSA_IO_NO_DEVICE:
1024285242Sachim      itdssIONoDeviceHandler( agRoot,
1025285242Sachim                              agIORequest,
1026285242Sachim                              agIOStatus,
1027285242Sachim                              agIOInfoLen,
1028285242Sachim                              agParam,
1029285242Sachim                              agOtherInfo );
1030285242Sachim      break;
1031285242Sachim    case OSSA_IO_XFER_ERROR_BREAK:
1032285242Sachim      itdssXferErrorBreakHandler( agRoot,
1033285242Sachim                                  agIORequest,
1034285242Sachim                                  agIOStatus,
1035285242Sachim                                  agIOInfoLen,
1036285242Sachim                                  agParam,
1037285242Sachim                                  agOtherInfo );
1038285242Sachim      break;
1039285242Sachim    case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
1040285242Sachim      itdssXferErrorPhyNotReadyHandler( agRoot,
1041285242Sachim                                        agIORequest,
1042285242Sachim                                        agIOStatus,
1043285242Sachim                                        agIOInfoLen,
1044285242Sachim                                        agParam,
1045285242Sachim                                        agOtherInfo );
1046285242Sachim      break;
1047285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
1048285242Sachim      itdssOpenCnxErrorProtocolNotSupprotedHandler( agRoot,
1049285242Sachim                                                    agIORequest,
1050285242Sachim                                                    agIOStatus,
1051285242Sachim                                                    agIOInfoLen,
1052285242Sachim                                                    agParam,
1053285242Sachim                                                    agOtherInfo );
1054285242Sachim      break;
1055285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
1056285242Sachim      itdssOpenCnxErrorZoneViolationHandler( agRoot,
1057285242Sachim                                             agIORequest,
1058285242Sachim                                             agIOStatus,
1059285242Sachim                                             agIOInfoLen,
1060285242Sachim                                             agParam,
1061285242Sachim                                             agOtherInfo );
1062285242Sachim      break;
1063285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_BREAK:
1064285242Sachim      itdssOpenCnxErrorBreakHandler( agRoot,
1065285242Sachim                                     agIORequest,
1066285242Sachim                                     agIOStatus,
1067285242Sachim                                     agIOInfoLen,
1068285242Sachim                                     agParam,
1069285242Sachim                                     agOtherInfo );
1070285242Sachim      break;
1071285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
1072285242Sachim      itdssOpenCnxErrorITNexusLossHandler( agRoot,
1073285242Sachim                                           agIORequest,
1074285242Sachim                                           agIOStatus,
1075285242Sachim                                           agIOInfoLen,
1076285242Sachim                                           agParam,
1077285242Sachim                                           agOtherInfo );
1078285242Sachim      break;
1079285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
1080285242Sachim      itdssOpenCnxErrorBadDestinationHandler( agRoot,
1081285242Sachim                                              agIORequest,
1082285242Sachim                                              agIOStatus,
1083285242Sachim                                              agIOInfoLen,
1084285242Sachim                                              agParam,
1085285242Sachim                                              agOtherInfo );
1086285242Sachim      break;
1087285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
1088285242Sachim      itdssOpenCnxErrorConnectionRateNotSupportedHandler( agRoot,
1089285242Sachim                                                          agIORequest,
1090285242Sachim                                                          agIOStatus,
1091285242Sachim                                                          agIOInfoLen,
1092285242Sachim                                                          agParam,
1093285242Sachim                                                          agOtherInfo );
1094285242Sachim      break;
1095285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
1096285242Sachim      itdssOpenCnxErrorWrongDestinationHandler( agRoot,
1097285242Sachim                                                agIORequest,
1098285242Sachim                                                agIOStatus,
1099285242Sachim                                                agIOInfoLen,
1100285242Sachim                                                agParam,
1101285242Sachim                                                agOtherInfo );
1102285242Sachim      break;
1103285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR:
1104285242Sachim      itdssOpenCnxErrorUnknownErrorHandler( agRoot,
1105285242Sachim                                            agIORequest,
1106285242Sachim                                            agIOStatus,
1107285242Sachim                                            agIOInfoLen,
1108285242Sachim                                            agParam,
1109285242Sachim                                            agOtherInfo );
1110285242Sachim      break;
1111285242Sachim    case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
1112285242Sachim      itdssXferErrorNAKReceivedHandler( agRoot,
1113285242Sachim                                        agIORequest,
1114285242Sachim                                        agIOStatus,
1115285242Sachim                                        agIOInfoLen,
1116285242Sachim                                        agParam,
1117285242Sachim                                        agOtherInfo );
1118285242Sachim      break;
1119285242Sachim    case OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT:
1120285242Sachim      itdssXferErrorACKNAKTimeoutHandler( agRoot,
1121285242Sachim                                          agIORequest,
1122285242Sachim                                          agIOStatus,
1123285242Sachim                                          agIOInfoLen,
1124285242Sachim                                          agParam,
1125285242Sachim                                          agOtherInfo );
1126285242Sachim      break;
1127285242Sachim    case OSSA_IO_XFER_ERROR_DMA:
1128285242Sachim      itdssXferErrorDMAHandler( agRoot,
1129285242Sachim                                agIORequest,
1130285242Sachim                                agIOStatus,
1131285242Sachim                                agIOInfoLen,
1132285242Sachim                                agParam,
1133285242Sachim                                agOtherInfo );
1134285242Sachim      break;
1135285242Sachim    case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH:
1136285242Sachim      itdssXferErrorOffsetMismatchHandler( agRoot,
1137285242Sachim                                           agIORequest,
1138285242Sachim                                           agIOStatus,
1139285242Sachim                                           agIOInfoLen,
1140285242Sachim                                           agParam,
1141285242Sachim                                           agOtherInfo );
1142285242Sachim      break;
1143285242Sachim    case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
1144285242Sachim      itdssXferOpenRetryTimeoutHandler( agRoot,
1145285242Sachim                                        agIORequest,
1146285242Sachim                                        agIOStatus,
1147285242Sachim                                        agIOInfoLen,
1148285242Sachim                                        agParam,
1149285242Sachim                                        agOtherInfo );
1150285242Sachim      break;
1151285242Sachim    case OSSA_IO_PORT_IN_RESET:
1152285242Sachim      itdssPortInResetHandler( agRoot,
1153285242Sachim                               agIORequest,
1154285242Sachim                               agIOStatus,
1155285242Sachim                               agIOInfoLen,
1156285242Sachim                               agParam,
1157285242Sachim                               agOtherInfo );
1158285242Sachim      break;
1159285242Sachim    case OSSA_IO_DS_NON_OPERATIONAL:
1160285242Sachim      itdssDsNonOperationalHandler( agRoot,
1161285242Sachim                                    agIORequest,
1162285242Sachim                                    agIOStatus,
1163285242Sachim                                    agIOInfoLen,
1164285242Sachim                                    agParam,
1165285242Sachim                                    agOtherInfo );
1166285242Sachim      break;
1167285242Sachim    case OSSA_IO_DS_IN_RECOVERY:
1168285242Sachim      itdssDsInRecoveryHandler( agRoot,
1169285242Sachim                                agIORequest,
1170285242Sachim                                agIOStatus,
1171285242Sachim                                agIOInfoLen,
1172285242Sachim                                agParam,
1173285242Sachim                                agOtherInfo );
1174285242Sachim      break;
1175285242Sachim    case OSSA_IO_TM_TAG_NOT_FOUND:
1176285242Sachim      itdssTmTagNotFoundHandler( agRoot,
1177285242Sachim                                 agIORequest,
1178285242Sachim                                 agIOStatus,
1179285242Sachim                                 agIOInfoLen,
1180285242Sachim                                 agParam,
1181285242Sachim                                 agOtherInfo );
1182285242Sachim      break;
1183285242Sachim    case OSSA_IO_SSP_EXT_IU_ZERO_LEN_ERROR:
1184285242Sachim      itdssSSPExtIUZeroLenHandler( agRoot,
1185285242Sachim                                   agIORequest,
1186285242Sachim                                   agIOStatus,
1187285242Sachim                                   agIOInfoLen,
1188285242Sachim                                   agParam,
1189285242Sachim                                   agOtherInfo );
1190285242Sachim      break;
1191285242Sachim    case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE:
1192285242Sachim      itdssXferErrorUnexpectedPhaseHandler( agRoot,
1193285242Sachim                                            agIORequest,
1194285242Sachim                                            agIOStatus,
1195285242Sachim                                            agIOInfoLen,
1196285242Sachim                                            agParam,
1197285242Sachim                                            agOtherInfo );
1198285242Sachim      break;
1199285242Sachim//new
1200285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
1201285242Sachim      itdssXferOpenRetryBackoffThresholdReachedHandler( agRoot,
1202285242Sachim                                                        agIORequest,
1203285242Sachim                                                        agIOStatus,
1204285242Sachim                                                        agIOInfoLen,
1205285242Sachim                                                        agParam,
1206285242Sachim                                                        agOtherInfo );
1207285242Sachim      break;
1208285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
1209285242Sachim      itdssOpenCnxErrorItNexusLossOpenTmoHandler( agRoot,
1210285242Sachim                                                  agIORequest,
1211285242Sachim                                                  agIOStatus,
1212285242Sachim                                                  agIOInfoLen,
1213285242Sachim                                                  agParam,
1214285242Sachim                                                  agOtherInfo );
1215285242Sachim      break;
1216285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
1217285242Sachim      itdssOpenCnxErrorItNexusLossNoDestHandler( agRoot,
1218285242Sachim                                                 agIORequest,
1219285242Sachim                                                 agIOStatus,
1220285242Sachim                                                 agIOInfoLen,
1221285242Sachim                                                 agParam,
1222285242Sachim                                                 agOtherInfo );
1223285242Sachim      break;
1224285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
1225285242Sachim      itdssOpenCnxErrorItNexusLossOpenCollideHandler( agRoot,
1226285242Sachim                                                      agIORequest,
1227285242Sachim                                                      agIOStatus,
1228285242Sachim                                                      agIOInfoLen,
1229285242Sachim                                                      agParam,
1230285242Sachim                                                      agOtherInfo );
1231285242Sachim      break;
1232285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
1233285242Sachim      itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler( agRoot,
1234285242Sachim                                                             agIORequest,
1235285242Sachim                                                             agIOStatus,
1236285242Sachim                                                             agIOInfoLen,
1237285242Sachim                                                             agParam,
1238285242Sachim                                                             agOtherInfo );
1239285242Sachim      break;
1240285242Sachim      // encryption IO error handling
1241285242Sachim    case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
1242285242Sachim    case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
1243285242Sachim    case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID:
1244285242Sachim    case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH:
1245285242Sachim    case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR:
1246285242Sachim    case OSSA_IO_XFR_ERROR_INTERNAL_RAM:
1247285242Sachim    case OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS:
1248285242Sachim      itdssEncryptionHandler( agRoot,
1249285242Sachim                              agIORequest,
1250285242Sachim                              agIOStatus,
1251285242Sachim                              agIOInfoLen,
1252285242Sachim                              agParam,
1253285242Sachim                              agOtherInfo );
1254285242Sachim      break;
1255285242Sachim
1256285242Sachim    /* DIF IO error handling */
1257285242Sachim    case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
1258285242Sachim    case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
1259285242Sachim    case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
1260285242Sachim    case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
1261285242Sachim      itdssDifHandler( agRoot,
1262285242Sachim                       agIORequest,
1263285242Sachim                       agIOStatus,
1264285242Sachim                       agIOInfoLen,
1265285242Sachim                       agParam,
1266285242Sachim                       agOtherInfo );
1267285242Sachim      break;
1268285242Sachim    case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
1269285242Sachim      itdssIOResourceUnavailableHandler( agRoot,
1270285242Sachim                                         agIORequest,
1271285242Sachim                                         agIOStatus,
1272285242Sachim                                         agIOInfoLen,
1273285242Sachim                                         agParam,
1274285242Sachim                                         agOtherInfo );
1275285242Sachim      break;
1276285242Sachim    case OSSA_MPI_IO_RQE_BUSY_FULL:
1277285242Sachim      itdssIORQEBusyFullHandler( agRoot,
1278285242Sachim                                 agIORequest,
1279285242Sachim                                 agIOStatus,
1280285242Sachim                                 agIOInfoLen,
1281285242Sachim                                 agParam,
1282285242Sachim                                 agOtherInfo );
1283285242Sachim      break;
1284285242Sachim    case OSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME:
1285285242Sachim      itdssXferErrorInvalidSSPRspFrameHandler( agRoot,
1286285242Sachim                                               agIORequest,
1287285242Sachim                                               agIOStatus,
1288285242Sachim                                               agIOInfoLen,
1289285242Sachim                                               agParam,
1290285242Sachim                                               agOtherInfo );
1291285242Sachim      break;
1292285242Sachim    case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
1293285242Sachim      itdssXferErrorEOBDataOverrunHandler( agRoot,
1294285242Sachim                                           agIORequest,
1295285242Sachim                                           agIOStatus,
1296285242Sachim                                           agIOInfoLen,
1297285242Sachim                                           agParam,
1298285242Sachim                                           agOtherInfo );
1299285242Sachim      break;
1300285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED:
1301285242Sachim      itdssOpenCnxErrorOpenPreemptedHandler( agRoot,
1302285242Sachim                                             agIORequest,
1303285242Sachim                                             agIOStatus,
1304285242Sachim                                             agIOInfoLen,
1305285242Sachim                                             agParam,
1306285242Sachim                                             agOtherInfo );
1307285242Sachim      break;
1308285242Sachim    default:
1309285242Sachim      TI_DBG1( ("itdssIOCompleted: Unknown agIOStatus 0x%x\n",agIOStatus) );
1310285242Sachim      itdssIODefaultHandler( agRoot,
1311285242Sachim                             agIORequest,
1312285242Sachim                             agIOStatus,
1313285242Sachim                             agIOInfoLen,
1314285242Sachim                             agParam,
1315285242Sachim                             agOtherInfo );
1316285242Sachim      break;
1317285242Sachim    }
1318285242Sachim  }
1319285242Sachim  return;
1320285242Sachim}
1321285242Sachim
1322285242Sachim#ifdef TD_DISCOVER
1323285242Sachim/*****************************************************************************
1324285242Sachim*!  \brief  itdssSMPCompleted
1325285242Sachim*
1326285242Sachim*  Purpose: This routine is called to complete an SMP request previously
1327285242Sachim*           issued to the LL Layer in saSMPStart().
1328285242Sachim*
1329285242Sachim*   \param  agRoot:         Pointer to driver Instance.
1330285242Sachim*   \param  agIORequest:    Pointer to the I/O Request data structure for
1331285242Sachim*                           this I/O.
1332285242Sachim*   \param  agIOStatus:     Status of I/O just completed.
1333285242Sachim*   \param  agIOInfoLen:    Length of the I/O information associated with this
1334285242Sachim*                           I/O request
1335285242Sachim*   \param   agFrameHandle  A Handle used to refer to the response frame
1336285242Sachim*
1337285242Sachim*   \return:                None
1338285242Sachim*
1339285242Sachim*   \note - This is a initiator specific function called by the jump table.
1340285242Sachim*
1341285242Sachim*****************************************************************************/
1342285242SachimosGLOBAL void
1343285242SachimitdssSMPCompleted (
1344285242Sachim                   agsaRoot_t            *agRoot,
1345285242Sachim                   agsaIORequest_t       *agIORequest,
1346285242Sachim                   bit32                 agIOStatus,
1347285242Sachim                   bit32                 agIOInfoLen,
1348285242Sachim                   agsaFrameHandle_t     agFrameHandle
1349285242Sachim                   )
1350285242Sachim{
1351285242Sachim  tdsaRootOsData_t          *osData = (tdsaRootOsData_t *)agRoot->osData;
1352285242Sachim  tiRoot_t                  *tiRoot = (tiRoot_t *)osData->tiRoot;
1353285242Sachim#ifdef REMOVED
1354285242Sachim  tdsaRoot_t                *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1355285242Sachim  tdsaContext_t             *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
1356285242Sachim#endif
1357285242Sachim  tdssSMPRequestBody_t      *tdSMPRequestBody;
1358285242Sachim  agsaSASRequestBody_t      *agSASRequestBody;
1359285242Sachim  agsaSMPFrame_t            *agSMPFrame;
1360285242Sachim  tdsaDeviceData_t          *oneDeviceData;
1361285242Sachim  tiIORequest_t             *CurrentTaskTag;
1362285242Sachim  tdsaPortContext_t         *onePortContext;
1363285242Sachim  tdsaPortContext_t         *oldonePortContext;
1364285242Sachim  smpReqPhyControl_t        *smpPhyControlReq;
1365285242Sachim  bit8                      smpHeader[4];
1366285242Sachim  tdssSMPFrameHeader_t      *tdSMPFrameHeader;
1367285242Sachim  bit8                      *tdSMPPayload;
1368285242Sachim  agsaDevHandle_t           *agDevHandle;
1369285242Sachim  bit32                     status;
1370285242Sachim#ifndef DIRECT_SMP
1371285242Sachim  tdssSMPFrameHeader_t      *tdRequestSMPFrameHeader;
1372285242Sachim  bit8                      smpRequestHeader[4];
1373285242Sachim#endif
1374285242Sachim  bit8                      SMPRequestFunction;
1375285242Sachim
1376285242Sachim  TI_DBG3(("itdssSMPCompleted: start\n"));
1377285242Sachim
1378285242Sachim
1379285242Sachim  tdSMPRequestBody = (tdssSMPRequestBody_t *)agIORequest->osData;
1380285242Sachim  CurrentTaskTag  = tdSMPRequestBody->CurrentTaskTag;
1381285242Sachim
1382285242Sachim  oneDeviceData = tdSMPRequestBody->tdDevice;
1383285242Sachim  onePortContext = oneDeviceData->tdPortContext;
1384285242Sachim  agDevHandle = oneDeviceData->agDevHandle;
1385285242Sachim
1386285242Sachim
1387285242Sachim  agSASRequestBody = &(tdSMPRequestBody->agSASRequestBody);
1388285242Sachim  agSMPFrame = &(agSASRequestBody->smpFrame);
1389285242Sachim
1390285242Sachim#ifdef DIRECT_SMP
1391285242Sachim  SMPRequestFunction = tdSMPRequestBody->smpPayload[1];
1392285242Sachim#else
1393285242Sachim  saFrameReadBlock(agRoot, tdSMPRequestBody->IndirectSMPResp, 0, smpRequestHeader, 4);
1394285242Sachim  tdRequestSMPFrameHeader = (tdssSMPFrameHeader_t *)smpRequestHeader;
1395285242Sachim  SMPRequestFunction = tdRequestSMPFrameHeader->smpFunction;
1396285242Sachim#endif
1397285242Sachim
1398285242Sachim  TI_DBG3(("itdssSMPCompleted: agIORequest %p\n", agIORequest));
1399285242Sachim  TI_DBG3(("itdssSMPCompleted: SMPRequestbody %p\n", tdSMPRequestBody));
1400285242Sachim
1401285242Sachim  if (onePortContext != agNULL)
1402285242Sachim  {
1403285242Sachim    TI_DBG3(("itdssSMPCompleted: pid %d\n", onePortContext->id));
1404285242Sachim  }
1405285242Sachim  else
1406285242Sachim  {
1407285242Sachim    TI_DBG1(("itdssSMPCompleted: Wrong!!! onePortContext is NULL\n"));
1408285242Sachim    ostiFreeMemory(
1409285242Sachim                 tiRoot,
1410285242Sachim                 tdSMPRequestBody->osMemHandle,
1411285242Sachim                 sizeof(tdssSMPRequestBody_t)
1412285242Sachim                 );
1413285242Sachim#ifndef DIRECT_SMP
1414285242Sachim    ostiFreeMemory(
1415285242Sachim                 tiRoot,
1416285242Sachim                 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1417285242Sachim                 tdSMPRequestBody->IndirectSMPReqLen
1418285242Sachim                 );
1419285242Sachim    ostiFreeMemory(
1420285242Sachim                 tiRoot,
1421285242Sachim                 tdSMPRequestBody->IndirectSMPResposMemHandle,
1422285242Sachim                 tdSMPRequestBody->IndirectSMPRespLen
1423285242Sachim                 );
1424285242Sachim#endif
1425285242Sachim    return;
1426285242Sachim  }
1427285242Sachim
1428285242Sachim  oldonePortContext = tdSMPRequestBody->tdPortContext;
1429285242Sachim  if (oldonePortContext != agNULL)
1430285242Sachim  {
1431285242Sachim    TI_DBG3(("itdssSMPCompleted: old pid %d\n", oldonePortContext->id));
1432285242Sachim  }
1433285242Sachim  else
1434285242Sachim  {
1435285242Sachim    TI_DBG1(("itdssSMPCompleted: Wrong!!! oldonePortContext is NULL\n"));
1436285242Sachim    ostiFreeMemory(
1437285242Sachim                 tiRoot,
1438285242Sachim                 tdSMPRequestBody->osMemHandle,
1439285242Sachim                 sizeof(tdssSMPRequestBody_t)
1440285242Sachim                 );
1441285242Sachim#ifndef DIRECT_SMP
1442285242Sachim    ostiFreeMemory(
1443285242Sachim                 tiRoot,
1444285242Sachim                 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1445285242Sachim                 tdSMPRequestBody->IndirectSMPReqLen
1446285242Sachim                 );
1447285242Sachim    ostiFreeMemory(
1448285242Sachim                 tiRoot,
1449285242Sachim                 tdSMPRequestBody->IndirectSMPResposMemHandle,
1450285242Sachim                 tdSMPRequestBody->IndirectSMPRespLen
1451285242Sachim                 );
1452285242Sachim#endif
1453285242Sachim    return;
1454285242Sachim  }
1455285242Sachim
1456285242Sachim
1457285242Sachim  /* decrement the number of pending SMP */
1458285242Sachim  onePortContext->discovery.pendingSMP--;
1459285242Sachim
1460285242Sachim  /* for port invalid case;
1461285242Sachim     full discovery -> full discovery; incremental discovery -> full discovery
1462285242Sachim   */
1463285242Sachim  if (onePortContext != oldonePortContext)
1464285242Sachim  {
1465285242Sachim    TI_DBG1(("itdssSMPCompleted: portcontext has changed!!!\n"));
1466285242Sachim    if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
1467285242Sachim        SMPRequestFunction == SMP_REPORT_PHY_SATA ||
1468285242Sachim        SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
1469285242Sachim    {
1470285242Sachim      /* stop SMP timer */
1471285242Sachim      if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
1472285242Sachim      {
1473285242Sachim        tdsaKillTimer(
1474285242Sachim                      tiRoot,
1475285242Sachim                      &(onePortContext->discovery.DiscoverySMPTimer)
1476285242Sachim                     );
1477285242Sachim      }
1478285242Sachim      if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
1479285242Sachim      {
1480285242Sachim        tdsaKillTimer(
1481285242Sachim                      tiRoot,
1482285242Sachim                      &(oldonePortContext->discovery.DiscoverySMPTimer)
1483285242Sachim                     );
1484285242Sachim      }
1485285242Sachim    }
1486285242Sachim
1487285242Sachim    /* clean up expanders data strucures; move to free exp when device is cleaned */
1488285242Sachim    tdsaCleanAllExp(tiRoot, oldonePortContext);
1489285242Sachim    /* remove devices */
1490285242Sachim    tdssInternalRemovals(oldonePortContext->agRoot,
1491285242Sachim                         oldonePortContext
1492285242Sachim                         );
1493285242Sachim
1494285242Sachim    ostiFreeMemory(
1495285242Sachim                 tiRoot,
1496285242Sachim                 tdSMPRequestBody->osMemHandle,
1497285242Sachim                 sizeof(tdssSMPRequestBody_t)
1498285242Sachim                 );
1499285242Sachim#ifndef DIRECT_SMP
1500285242Sachim    ostiFreeMemory(
1501285242Sachim                 tiRoot,
1502285242Sachim                 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1503285242Sachim                 tdSMPRequestBody->IndirectSMPReqLen
1504285242Sachim                 );
1505285242Sachim    ostiFreeMemory(
1506285242Sachim                 tiRoot,
1507285242Sachim                 tdSMPRequestBody->IndirectSMPResposMemHandle,
1508285242Sachim                 tdSMPRequestBody->IndirectSMPRespLen
1509285242Sachim                 );
1510285242Sachim#endif
1511285242Sachim    return;
1512285242Sachim  }
1513285242Sachim
1514285242Sachim  if (onePortContext->valid == agFALSE)
1515285242Sachim  {
1516285242Sachim    if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
1517285242Sachim        SMPRequestFunction == SMP_REPORT_PHY_SATA ||
1518285242Sachim        SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
1519285242Sachim    {
1520285242Sachim      /* stop SMP timer */
1521285242Sachim      if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
1522285242Sachim      {
1523285242Sachim        tdsaKillTimer(
1524285242Sachim                      tiRoot,
1525285242Sachim                      &(onePortContext->discovery.DiscoverySMPTimer)
1526285242Sachim                      );
1527285242Sachim      }
1528285242Sachim      if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
1529285242Sachim      {
1530285242Sachim        tdsaKillTimer(
1531285242Sachim                      tiRoot,
1532285242Sachim                      &(oldonePortContext->discovery.DiscoverySMPTimer)
1533285242Sachim                      );
1534285242Sachim      }
1535285242Sachim    }
1536285242Sachim
1537285242Sachim    if (onePortContext->discovery.pendingSMP == 0)
1538285242Sachim    {
1539285242Sachim      TI_DBG1(("itdssSMPCompleted: aborting discovery\n"));
1540285242Sachim      tdsaSASDiscoverAbort(tiRoot, onePortContext);
1541285242Sachim    }
1542285242Sachim    else
1543285242Sachim    {
1544285242Sachim      TI_DBG1(("itdssSMPCompleted: not yet abort; non zero pendingSMP %d\n", onePortContext->discovery.pendingSMP));
1545285242Sachim    }
1546285242Sachim    ostiFreeMemory(
1547285242Sachim                 tiRoot,
1548285242Sachim                 tdSMPRequestBody->osMemHandle,
1549285242Sachim                 sizeof(tdssSMPRequestBody_t)
1550285242Sachim                 );
1551285242Sachim#ifndef DIRECT_SMP
1552285242Sachim    ostiFreeMemory(
1553285242Sachim                 tiRoot,
1554285242Sachim                 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1555285242Sachim                 tdSMPRequestBody->IndirectSMPReqLen
1556285242Sachim                 );
1557285242Sachim    ostiFreeMemory(
1558285242Sachim                 tiRoot,
1559285242Sachim                 tdSMPRequestBody->IndirectSMPResposMemHandle,
1560285242Sachim                 tdSMPRequestBody->IndirectSMPRespLen
1561285242Sachim                 );
1562285242Sachim#endif
1563285242Sachim    return;
1564285242Sachim  }
1565285242Sachim
1566285242Sachim
1567285242Sachim  if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
1568285242Sachim      SMPRequestFunction == SMP_REPORT_PHY_SATA ||
1569285242Sachim      SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
1570285242Sachim  {
1571285242Sachim    /* stop SMP timer */
1572285242Sachim    if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
1573285242Sachim    {
1574285242Sachim      tdsaKillTimer(
1575285242Sachim                    tiRoot,
1576285242Sachim                    &(onePortContext->discovery.DiscoverySMPTimer)
1577285242Sachim                    );
1578285242Sachim    }
1579285242Sachim    if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
1580285242Sachim    {
1581285242Sachim      tdsaKillTimer(
1582285242Sachim                    tiRoot,
1583285242Sachim                    &(oldonePortContext->discovery.DiscoverySMPTimer)
1584285242Sachim                    );
1585285242Sachim    }
1586285242Sachim  }
1587285242Sachim
1588285242Sachim  /* the host as of 4/16/08 does not use indirect SMP. So, check only OSSA_IO_SUCCESS status*/
1589285242Sachim  if (agIOStatus == OSSA_IO_SUCCESS)
1590285242Sachim  {
1591285242Sachim    //tdhexdump("itdssSMPCompleted", (bit8*)agFrameHandle, agIOInfoLen);
1592285242Sachim    /* parsing SMP payload */
1593285242Sachim#ifdef DIRECT_SMP
1594285242Sachim    saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4);
1595285242Sachim#else
1596285242Sachim    saFrameReadBlock(agRoot, tdSMPRequestBody->IndirectSMPResp, 0, smpHeader, 4);
1597285242Sachim#endif
1598285242Sachim    tdSMPFrameHeader = (tdssSMPFrameHeader_t *)smpHeader;
1599285242Sachim
1600285242Sachim    /* SMP function dependent payload */
1601285242Sachim    switch (tdSMPFrameHeader->smpFunction)
1602285242Sachim    {
1603285242Sachim    case SMP_REPORT_GENERAL:
1604285242Sachim      TI_DBG3(("itdssSMPCompleted: report general\n"));
1605285242Sachim      if (agIOInfoLen != sizeof(smpRespReportGeneral_t) + 4 &&
1606285242Sachim          tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
1607285242Sachim      {
1608285242Sachim        TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespReportGeneral_t) + 4));
1609285242Sachim        tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1610285242Sachim        ostiFreeMemory(
1611285242Sachim                       tiRoot,
1612285242Sachim                       tdSMPRequestBody->osMemHandle,
1613285242Sachim                       sizeof(tdssSMPRequestBody_t)
1614285242Sachim                      );
1615285242Sachim#ifndef DIRECT_SMP
1616285242Sachim        ostiFreeMemory(
1617285242Sachim                       tiRoot,
1618285242Sachim                       tdSMPRequestBody->IndirectSMPReqosMemHandle,
1619285242Sachim                       tdSMPRequestBody->IndirectSMPReqLen
1620285242Sachim                      );
1621285242Sachim        ostiFreeMemory(
1622285242Sachim                       tiRoot,
1623285242Sachim                       tdSMPRequestBody->IndirectSMPResposMemHandle,
1624285242Sachim                       tdSMPRequestBody->IndirectSMPRespLen
1625285242Sachim                      );
1626285242Sachim#endif
1627285242Sachim        return;
1628285242Sachim      }
1629285242Sachim      tdsaReportGeneralRespRcvd(
1630285242Sachim                                tiRoot,
1631285242Sachim                                agRoot,
1632285242Sachim                                agIORequest,
1633285242Sachim                                oneDeviceData,
1634285242Sachim                                tdSMPFrameHeader,
1635285242Sachim                                agFrameHandle
1636285242Sachim                                );
1637285242Sachim
1638285242Sachim      break;
1639285242Sachim    case SMP_DISCOVER:
1640285242Sachim      TI_DBG3(("itdssSMPCompleted: discover\n"));
1641285242Sachim      if (agIOInfoLen != sizeof(smpRespDiscover_t) + 4 &&
1642285242Sachim          tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
1643285242Sachim      {
1644285242Sachim        TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespDiscover_t) + 4));
1645285242Sachim        tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1646285242Sachim        ostiFreeMemory(
1647285242Sachim                       tiRoot,
1648285242Sachim                       tdSMPRequestBody->osMemHandle,
1649285242Sachim                       sizeof(tdssSMPRequestBody_t)
1650285242Sachim                      );
1651285242Sachim#ifndef DIRECT_SMP
1652285242Sachim        ostiFreeMemory(
1653285242Sachim                       tiRoot,
1654285242Sachim                       tdSMPRequestBody->IndirectSMPReqosMemHandle,
1655285242Sachim                       tdSMPRequestBody->IndirectSMPReqLen
1656285242Sachim                      );
1657285242Sachim        ostiFreeMemory(
1658285242Sachim                       tiRoot,
1659285242Sachim                       tdSMPRequestBody->IndirectSMPResposMemHandle,
1660285242Sachim                       tdSMPRequestBody->IndirectSMPRespLen
1661285242Sachim                      );
1662285242Sachim#endif
1663285242Sachim        return;
1664285242Sachim      }
1665285242Sachim      tdsaDiscoverRespRcvd(
1666285242Sachim                           tiRoot,
1667285242Sachim                           agRoot,
1668285242Sachim                           agIORequest,
1669285242Sachim                           oneDeviceData,
1670285242Sachim                           tdSMPFrameHeader,
1671285242Sachim                           agFrameHandle
1672285242Sachim                           );
1673285242Sachim      break;
1674285242Sachim    case SMP_REPORT_PHY_SATA:
1675285242Sachim      TI_DBG3(("itdssSMPCompleted: report phy sata\n"));
1676285242Sachim      if (agIOInfoLen != sizeof(smpRespReportPhySata_t) + 4 &&
1677285242Sachim          tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
1678285242Sachim      {
1679285242Sachim        TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespReportPhySata_t) + 4));
1680285242Sachim        tdsaSATADiscoverDone(tiRoot, onePortContext, tiError);
1681285242Sachim        ostiFreeMemory(
1682285242Sachim                       tiRoot,
1683285242Sachim                       tdSMPRequestBody->osMemHandle,
1684285242Sachim                       sizeof(tdssSMPRequestBody_t)
1685285242Sachim                      );
1686285242Sachim#ifndef DIRECT_SMP
1687285242Sachim        ostiFreeMemory(
1688285242Sachim                       tiRoot,
1689285242Sachim                       tdSMPRequestBody->IndirectSMPReqosMemHandle,
1690285242Sachim                       tdSMPRequestBody->IndirectSMPReqLen
1691285242Sachim                      );
1692285242Sachim        ostiFreeMemory(
1693285242Sachim                       tiRoot,
1694285242Sachim                       tdSMPRequestBody->IndirectSMPResposMemHandle,
1695285242Sachim                       tdSMPRequestBody->IndirectSMPRespLen
1696285242Sachim                      );
1697285242Sachim#endif
1698285242Sachim        return;
1699285242Sachim      }
1700285242Sachim      tdsaReportPhySataRcvd(
1701285242Sachim                            tiRoot,
1702285242Sachim                            agRoot,
1703285242Sachim                            agIORequest,
1704285242Sachim                            oneDeviceData,
1705285242Sachim                            tdSMPFrameHeader,
1706285242Sachim                            agFrameHandle
1707285242Sachim                            );
1708285242Sachim      break;
1709285242Sachim    case SMP_CONFIGURE_ROUTING_INFORMATION:
1710285242Sachim      TI_DBG1(("itdssSMPCompleted: configure routing information\n"));
1711285242Sachim      if (agIOInfoLen != 4 &&
1712285242Sachim          tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
1713285242Sachim      {
1714285242Sachim        TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4));
1715285242Sachim        tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1716285242Sachim        ostiFreeMemory(
1717285242Sachim                       tiRoot,
1718285242Sachim                       tdSMPRequestBody->osMemHandle,
1719285242Sachim                       sizeof(tdssSMPRequestBody_t)
1720285242Sachim                      );
1721285242Sachim#ifndef DIRECT_SMP
1722285242Sachim        ostiFreeMemory(
1723285242Sachim                       tiRoot,
1724285242Sachim                       tdSMPRequestBody->IndirectSMPReqosMemHandle,
1725285242Sachim                       tdSMPRequestBody->IndirectSMPReqLen
1726285242Sachim                      );
1727285242Sachim        ostiFreeMemory(
1728285242Sachim                       tiRoot,
1729285242Sachim                       tdSMPRequestBody->IndirectSMPResposMemHandle,
1730285242Sachim                       tdSMPRequestBody->IndirectSMPRespLen
1731285242Sachim                      );
1732285242Sachim#endif
1733285242Sachim        return;
1734285242Sachim      }
1735285242Sachim      tdsaConfigRoutingInfoRespRcvd(
1736285242Sachim                                    tiRoot,
1737285242Sachim                                    agRoot,
1738285242Sachim                                    agIORequest,
1739285242Sachim                                    oneDeviceData,
1740285242Sachim                                    tdSMPFrameHeader,
1741285242Sachim                                    agFrameHandle
1742285242Sachim                                    );
1743285242Sachim
1744285242Sachim      break;
1745285242Sachim    case SMP_PHY_CONTROL:
1746285242Sachim      TI_DBG3(("itdssSMPCompleted: phy control\n"));
1747285242Sachim      if (agIOInfoLen != 4 &&
1748285242Sachim          tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED) /*zero length is expected */
1749285242Sachim      {
1750285242Sachim        TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4));
1751285242Sachim        tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1752285242Sachim        ostiFreeMemory(
1753285242Sachim                       tiRoot,
1754285242Sachim                       tdSMPRequestBody->osMemHandle,
1755285242Sachim                       sizeof(tdssSMPRequestBody_t)
1756285242Sachim                      );
1757285242Sachim#ifndef DIRECT_SMP
1758285242Sachim        ostiFreeMemory(
1759285242Sachim                       tiRoot,
1760285242Sachim                       tdSMPRequestBody->IndirectSMPReqosMemHandle,
1761285242Sachim                       tdSMPRequestBody->IndirectSMPReqLen
1762285242Sachim                      );
1763285242Sachim        ostiFreeMemory(
1764285242Sachim                       tiRoot,
1765285242Sachim                       tdSMPRequestBody->IndirectSMPResposMemHandle,
1766285242Sachim                       tdSMPRequestBody->IndirectSMPRespLen
1767285242Sachim                      );
1768285242Sachim#endif
1769285242Sachim        return;
1770285242Sachim      }
1771285242Sachim      tdsaPhyControlRespRcvd(
1772285242Sachim                             tiRoot,
1773285242Sachim                             agRoot,
1774285242Sachim                             agIORequest,
1775285242Sachim                             oneDeviceData,
1776285242Sachim                             tdSMPFrameHeader,
1777285242Sachim                             agFrameHandle,
1778285242Sachim                             CurrentTaskTag
1779285242Sachim                             );
1780285242Sachim
1781285242Sachim      break;
1782285242Sachim#ifdef REMOVED
1783285242Sachim//temp for testing
1784285242Sachim     case SMP_REPORT_MANUFACTURE_INFORMATION:
1785285242Sachim      TI_DBG1(("itdssSMPCompleted: REPORT_MANUFACTURE_INFORMATION\n"));
1786285242Sachim      if (agIOInfoLen != sizeof(smpRespReportManufactureInfo_t) + 4 &&
1787285242Sachim          tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED) /*zero length is expected */
1788285242Sachim      {
1789285242Sachim        TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4));
1790285242Sachim        tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1791285242Sachim        ostiFreeMemory(
1792285242Sachim                       tiRoot,
1793285242Sachim                       tdSMPRequestBody->osMemHandle,
1794285242Sachim                       sizeof(tdssSMPRequestBody_t)
1795285242Sachim                      );
1796285242Sachim#ifndef DIRECT_SMP
1797285242Sachim        ostiFreeMemory(
1798285242Sachim                       tiRoot,
1799285242Sachim                       tdSMPRequestBody->IndirectSMPReqosMemHandle,
1800285242Sachim                       tdSMPRequestBody->IndirectSMPReqLen
1801285242Sachim                      );
1802285242Sachim        ostiFreeMemory(
1803285242Sachim                       tiRoot,
1804285242Sachim                       tdSMPRequestBody->IndirectSMPResposMemHandle,
1805285242Sachim                       tdSMPRequestBody->IndirectSMPRespLen
1806285242Sachim                      );
1807285242Sachim#endif
1808285242Sachim        return;
1809285242Sachim      }
1810285242Sachim      tdsaReportManInfoRespRcvd(
1811285242Sachim                                tiRoot,
1812285242Sachim                                agRoot,
1813285242Sachim                                oneDeviceData,
1814285242Sachim                                tdSMPFrameHeader,
1815285242Sachim                                agFrameHandle
1816285242Sachim                                );
1817285242Sachim
1818285242Sachim       break;
1819285242Sachim//end temp for testing
1820285242Sachim#endif
1821285242Sachim    case SMP_REPORT_ROUTING_INFORMATION:
1822285242Sachim    case SMP_REPORT_PHY_ERROR_LOG:
1823285242Sachim    case SMP_PHY_TEST_FUNCTION:
1824285242Sachim    case SMP_REPORT_MANUFACTURE_INFORMATION:
1825285242Sachim    case SMP_READ_GPIO_REGISTER:
1826285242Sachim    case SMP_WRITE_GPIO_REGISTER:
1827285242Sachim    default:
1828285242Sachim      TI_DBG1(("itdssSMPCompleted: wrong SMP function 0x%x\n", tdSMPFrameHeader->smpFunction));
1829285242Sachim      TI_DBG1(("itdssSMPCompleted: smpFrameType 0x%x\n", tdSMPFrameHeader->smpFrameType));
1830285242Sachim      TI_DBG1(("itdssSMPCompleted: smpFunctionResult 0x%x\n", tdSMPFrameHeader->smpFunctionResult));
1831285242Sachim      TI_DBG1(("itdssSMPCompleted: smpReserved 0x%x\n", tdSMPFrameHeader->smpReserved));
1832285242Sachim      tdhexdump("itdssSMPCompleted: SMP payload", (bit8 *)agFrameHandle, agIOInfoLen);
1833285242Sachim      break;
1834285242Sachim    }
1835285242Sachim  }
1836285242Sachim  else if (agIOStatus == OSSA_IO_ABORTED || agIOStatus == OSSA_IO_INVALID_LENGTH)
1837285242Sachim  {
1838285242Sachim    /* no retry this case */
1839285242Sachim    TI_DBG1(("itdssSMPCompleted: OSSA_IO_ABORTED\n"));
1840285242Sachim  }
1841285242Sachim  else if (agIOStatus == OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE)
1842285242Sachim  {
1843285242Sachim    TI_DBG1(("itdssSMPCompleted: OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE\n"));
1844285242Sachim    saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4);
1845285242Sachim    tdSMPFrameHeader = (tdssSMPFrameHeader_t *)smpHeader;
1846285242Sachim
1847285242Sachim    status = saSMPStart(
1848285242Sachim               agRoot,
1849285242Sachim               agIORequest,
1850285242Sachim               tdSMPRequestBody->queueNumber, //tdsaAllShared->SMPQNum, //tdsaRotateQnumber(tiRoot, oneDeviceData),
1851285242Sachim               agDevHandle,
1852285242Sachim               AGSA_SMP_INIT_REQ,
1853285242Sachim               agSASRequestBody,
1854285242Sachim               &ossaSMPCompleted
1855285242Sachim               );
1856285242Sachim
1857285242Sachim    if (status == AGSA_RC_SUCCESS)
1858285242Sachim    {
1859285242Sachim      /* increment the number of pending SMP */
1860285242Sachim      onePortContext->discovery.pendingSMP++;
1861285242Sachim      if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
1862285242Sachim          SMPRequestFunction == SMP_REPORT_PHY_SATA ||
1863285242Sachim          SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
1864285242Sachim      {
1865285242Sachim        /* start discovery-related SMP timer */
1866285242Sachim        tdsaDiscoverySMPTimer(tiRoot, onePortContext, (bit32)(tdSMPFrameHeader->smpFunction), tdSMPRequestBody);
1867285242Sachim      }
1868285242Sachim      return;
1869285242Sachim    }
1870285242Sachim    else if (status == AGSA_RC_BUSY)
1871285242Sachim    {
1872285242Sachim      if (tdSMPFrameHeader->smpFunction == SMP_REPORT_GENERAL ||
1873285242Sachim          tdSMPFrameHeader->smpFunction == SMP_DISCOVER ||
1874285242Sachim          tdSMPFrameHeader->smpFunction == SMP_REPORT_PHY_SATA ||
1875285242Sachim          tdSMPFrameHeader->smpFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
1876285242Sachim      {
1877285242Sachim        tdsaSMPBusyTimer(tiRoot, onePortContext, oneDeviceData, tdSMPRequestBody);
1878285242Sachim      }
1879285242Sachim      else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL)
1880285242Sachim      {
1881285242Sachim        /* For taskmanagement SMP, let's fail task management failure */
1882285242Sachim        tdsaPhyControlFailureRespRcvd(
1883285242Sachim                                      tiRoot,
1884285242Sachim                                      agRoot,
1885285242Sachim                                      oneDeviceData,
1886285242Sachim                                      tdSMPFrameHeader,
1887285242Sachim                                      agFrameHandle,
1888285242Sachim                                      CurrentTaskTag
1889285242Sachim                                      );
1890285242Sachim      }
1891285242Sachim      else
1892285242Sachim      {
1893285242Sachim      }
1894285242Sachim    }
1895285242Sachim    else /* AGSA_RC_FAILURE */
1896285242Sachim    {
1897285242Sachim      if (tdSMPFrameHeader->smpFunction == SMP_REPORT_GENERAL ||
1898285242Sachim          tdSMPFrameHeader->smpFunction == SMP_DISCOVER ||
1899285242Sachim          tdSMPFrameHeader->smpFunction == SMP_REPORT_PHY_SATA ||
1900285242Sachim          tdSMPFrameHeader->smpFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
1901285242Sachim      {
1902285242Sachim        tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1903285242Sachim      }
1904285242Sachim      else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL)
1905285242Sachim      {
1906285242Sachim        /* task management failure */
1907285242Sachim        tdsaPhyControlFailureRespRcvd(
1908285242Sachim                                      tiRoot,
1909285242Sachim                                      agRoot,
1910285242Sachim                                      oneDeviceData,
1911285242Sachim                                      tdSMPFrameHeader,
1912285242Sachim                                      agFrameHandle,
1913285242Sachim                                      CurrentTaskTag
1914285242Sachim                                      );
1915285242Sachim      }
1916285242Sachim      else
1917285242Sachim      {
1918285242Sachim      }
1919285242Sachim    }
1920285242Sachim  }
1921285242Sachim  else
1922285242Sachim  {
1923285242Sachim    if (tdSMPRequestBody->retries < SMP_RETRIES) /* 5 */
1924285242Sachim    {
1925285242Sachim      /* retry the SMP again */
1926285242Sachim      TI_DBG1(("itdssSMPCompleted: failed! but retries %d agIOStatus 0x%x %d agIOInfoLen %d\n",
1927285242Sachim               tdSMPRequestBody->retries, agIOStatus, agIOStatus, agIOInfoLen));
1928285242Sachim      if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS ||
1929285242Sachim          agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED ||
1930285242Sachim          agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO ||
1931285242Sachim          agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST ||
1932285242Sachim          agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE ||
1933285242Sachim          agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED ||
1934285242Sachim          agIOStatus == OSSA_IO_DS_NON_OPERATIONAL
1935285242Sachim         )
1936285242Sachim      {
1937285242Sachim        saSetDeviceState(agRoot, agNULL, tdSMPRequestBody->queueNumber, agDevHandle, SA_DS_OPERATIONAL);
1938285242Sachim      }
1939285242Sachim      saSMPStart(
1940285242Sachim                 agRoot,
1941285242Sachim                 agIORequest,
1942285242Sachim                 tdSMPRequestBody->queueNumber, //tdsaAllShared->SMPQNum, //tdsaRotateQnumber(tiRoot, oneDeviceData),
1943285242Sachim                 agDevHandle,
1944285242Sachim                 AGSA_SMP_INIT_REQ,
1945285242Sachim                 agSASRequestBody,
1946285242Sachim                 &ossaSMPCompleted
1947285242Sachim                 );
1948285242Sachim      /* increment the number of pending SMP */
1949285242Sachim      onePortContext->discovery.pendingSMP++;
1950285242Sachim      tdSMPRequestBody->retries++;
1951285242Sachim      return;
1952285242Sachim    }
1953285242Sachim    else
1954285242Sachim    {
1955285242Sachim      tdSMPFrameHeader = (tdssSMPFrameHeader_t *)agSMPFrame->outFrameBuf;
1956285242Sachim      tdSMPPayload = (bit8 *)agSMPFrame->outFrameBuf + 4;
1957285242Sachim      TI_DBG1(("itdssSMPCompleted: failed! no more retry! agIOStatus 0x%x %d\n", agIOStatus, agIOStatus));
1958285242Sachim      if (agIOStatus == OSSA_IO_DS_NON_OPERATIONAL)
1959285242Sachim      {
1960285242Sachim        TI_DBG1(("itdssSMPCompleted: failed! agIOStatus is OSSA_IO_DS_NON_OPERATIONAL\n"));
1961285242Sachim      }
1962285242Sachim
1963285242Sachim      if (agIOStatus == OSSA_IO_DS_IN_RECOVERY)
1964285242Sachim      {
1965285242Sachim        TI_DBG1(("itdssSMPCompleted: failed! agIOStatus is OSSA_IO_DS_IN_RECOVERY\n"));
1966285242Sachim      }
1967285242Sachim
1968285242Sachim      if (tdSMPFrameHeader->smpFunction == SMP_REPORT_GENERAL ||
1969285242Sachim          tdSMPFrameHeader->smpFunction == SMP_DISCOVER ||
1970285242Sachim          tdSMPFrameHeader->smpFunction == SMP_REPORT_PHY_SATA ||
1971285242Sachim          tdSMPFrameHeader->smpFunction == SMP_CONFIGURE_ROUTING_INFORMATION
1972285242Sachim         )
1973285242Sachim      {
1974285242Sachim        /* discovery failure */
1975285242Sachim        TI_DBG1(("itdssSMPCompleted: SMP function 0x%x\n", tdSMPFrameHeader->smpFunction));
1976285242Sachim        TI_DBG1(("itdssSMPCompleted: discover done with error\n"));
1977285242Sachim        tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1978285242Sachim      }
1979285242Sachim      else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL)
1980285242Sachim      {
1981285242Sachim        TI_DBG1(("itdssSMPCompleted: SMP_PHY_CONTROL\n"));
1982285242Sachim        smpPhyControlReq = (smpReqPhyControl_t *)tdSMPPayload;
1983285242Sachim        if (smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_CLEAR_AFFILIATION)
1984285242Sachim        {
1985285242Sachim          TI_DBG1(("itdssSMPCompleted: discover done with error\n"));
1986285242Sachim          tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1987285242Sachim        }
1988285242Sachim        else if (smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_HARD_RESET ||
1989285242Sachim                 smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_LINK_RESET )
1990285242Sachim        {
1991285242Sachim          TI_DBG1(("itdssSMPCompleted: device reset failed\n"));
1992285242Sachim          if (CurrentTaskTag != agNULL )
1993285242Sachim          {
1994285242Sachim            TI_DBG1(("itdssSMPCompleted: callback to OS layer with failure\n"));
1995285242Sachim            ostiInitiatorEvent( tiRoot,
1996285242Sachim                                NULL,
1997285242Sachim                                NULL,
1998285242Sachim                                tiIntrEventTypeTaskManagement,
1999285242Sachim                                tiTMFailed,
2000285242Sachim                                CurrentTaskTag );
2001285242Sachim          }
2002285242Sachim          else
2003285242Sachim          {
2004285242Sachim            /* hard reset was not done with this device */
2005285242Sachim            oneDeviceData->ResetCnt = 0;
2006285242Sachim          }
2007285242Sachim        }
2008285242Sachim        else
2009285242Sachim        {
2010285242Sachim          TI_DBG1(("itdssSMPCompleted: unknown phy operation 0x%x\n", smpPhyControlReq->phyOperation));
2011285242Sachim        }
2012285242Sachim      } /* SMP_PHY_CONTROL */
2013285242Sachim      else
2014285242Sachim      {
2015285242Sachim        TI_DBG1(("itdssSMPCompleted: SMP function 0x%x\n", tdSMPFrameHeader->smpFunction));
2016285242Sachim      }
2017285242Sachim    } /* else */
2018285242Sachim  } /* outer else */
2019285242Sachim
2020285242Sachim  ostiFreeMemory(
2021285242Sachim                 tiRoot,
2022285242Sachim                 tdSMPRequestBody->osMemHandle,
2023285242Sachim                 sizeof(tdssSMPRequestBody_t)
2024285242Sachim                 );
2025285242Sachim#ifndef DIRECT_SMP
2026285242Sachim  ostiFreeMemory(
2027285242Sachim                 tiRoot,
2028285242Sachim                 tdSMPRequestBody->IndirectSMPReqosMemHandle,
2029285242Sachim                 tdSMPRequestBody->IndirectSMPReqLen
2030285242Sachim                 );
2031285242Sachim  ostiFreeMemory(
2032285242Sachim                 tiRoot,
2033285242Sachim                 tdSMPRequestBody->IndirectSMPResposMemHandle,
2034285242Sachim                 tdSMPRequestBody->IndirectSMPRespLen
2035285242Sachim                 );
2036285242Sachim#endif
2037285242Sachim
2038285242Sachim
2039285242Sachim  return;
2040285242Sachim}
2041285242Sachim
2042285242Sachim#else
2043285242Sachim
2044285242SachimosGLOBAL void
2045285242SachimitdssSMPCompleted (
2046285242Sachim                   agsaRoot_t            *agRoot,
2047285242Sachim                   agsaIORequest_t       *agIORequest,
2048285242Sachim                   bit32                 agIOStatus,
2049285242Sachim                   bit32                 agIOInfoLen,
2050285242Sachim                   agsaFrameHandle_t     agFrameHandle
2051285242Sachim                   )
2052285242Sachim{
2053285242Sachim  /* pass the payload to OS layer */
2054285242Sachim  TI_DBG3(("itdssSMPCompleted: start\n"));
2055285242Sachim}
2056285242Sachim#endif
2057285242Sachim
2058285242Sachim
2059285242Sachim/*****************************************************************************
2060285242Sachim*! \brief itdIoSuccessHandler
2061285242Sachim*
2062285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2063285242Sachim*            layer with agIOStatus = OSSA_IO_SUCCESS
2064285242Sachim*
2065285242Sachim*  \param  agRoot:            pointer to port instance
2066285242Sachim*  \param  agIORequest:       pointer to I/O request
2067285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2068285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2069285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2070285242Sachim*                             of abort request
2071285242Sachim*  \param  agOtherInfo        Residual count
2072285242Sachim*  \return: None
2073285242Sachim*
2074285242Sachim*
2075285242Sachim*****************************************************************************/
2076285242SachimosGLOBAL void
2077285242SachimitdssIOSuccessHandler(
2078285242Sachim                      agsaRoot_t           *agRoot,
2079285242Sachim                      agsaIORequest_t      *agIORequest,
2080285242Sachim                      bit32                agIOStatus,
2081285242Sachim                      bit32                agIOInfoLen,
2082285242Sachim                      void                 *agParam,
2083285242Sachim                      bit32                agOtherInfo
2084285242Sachim                      )
2085285242Sachim{
2086285242Sachim  tdsaRootOsData_t          *osData = (tdsaRootOsData_t *)agRoot->osData;
2087285242Sachim  tiRoot_t                  *tiRoot = (tiRoot_t *)osData->tiRoot;
2088285242Sachim  itdsaIni_t                *Initiator = (itdsaIni_t *)osData->itdsaIni;
2089285242Sachim  tdIORequestBody_t         *tdIORequestBody;
2090285242Sachim  agsaSSPResponseInfoUnit_t agSSPRespIU;
2091285242Sachim  tiSenseData_t             senseData;
2092285242Sachim  bit8                      senseDataPayload[256];
2093285242Sachim  bit8                      respData[128];
2094285242Sachim  bit32                     scsi_status;
2095285242Sachim  bit32                     senseLen;
2096285242Sachim  bit32                     respLen;
2097285242Sachim  bit32                     data_status;
2098285242Sachim  bit32                     i;
2099285242Sachim  tiDeviceHandle_t          *tiDeviceHandle = agNULL;
2100285242Sachim  tdsaDeviceData_t          *oneDeviceData = agNULL;
2101285242Sachim
2102285242Sachim  TI_DBG2(("itdssIOSuccessHandler: start\n"));
2103285242Sachim  TI_DBG2(("itdssIOSuccessHandler: agIOInfoLen %d\n", agIOInfoLen));
2104285242Sachim
2105285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2106285242Sachim
2107285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
2108285242Sachim  tdIORequestBody->ioStarted = agFALSE;
2109285242Sachim
2110285242Sachim  /*
2111285242Sachim    agIOInfoLen must be >= sizeof(agsaSSPResponseInfoUnit_t), which is minimum
2112285242Sachim    date length
2113285242Sachim  */
2114285242Sachim  if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t))
2115285242Sachim  {
2116285242Sachim    TI_DBG1(("itdssIOSuccessHandler: First agIOInfoLen does not match!!!\n"));
2117285242Sachim    TI_DBG1(("itdssIOSuccessHandler: First agIOInfoLen 0x%x IU 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t)));
2118285242Sachim    ostiInitiatorIOCompleted(
2119285242Sachim                             tiRoot,
2120285242Sachim                             tdIORequestBody->tiIORequest, /* tiIORequest */
2121285242Sachim                             tiIOFailed,
2122285242Sachim                             tiDetailOtherError,
2123285242Sachim                             agNULL,
2124285242Sachim                             agTRUE /* intContext; is not being used */
2125285242Sachim                             );
2126285242Sachim    return;
2127285242Sachim  }
2128285242Sachim  /* reads agsaSSPResponseInfoUnit_t */
2129285242Sachim  saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
2130285242Sachim
2131285242Sachim  data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
2132285242Sachim  scsi_status = agSSPRespIU.status;
2133285242Sachim  /* endianess is invovled here */
2134285242Sachim  senseLen = SA_SSPRESP_GET_SENSEDATALEN(&agSSPRespIU);
2135285242Sachim  respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
2136285242Sachim
2137285242Sachim  TI_DBG2(("itdssIOSuccessHandler: dataPres=%x\n", data_status));
2138285242Sachim  TI_DBG2(("itdssIOSuccessHandler: scsi status=0x%x, senselen=0x%x resplen 0x%x\n", scsi_status, senseLen, respLen));
2139285242Sachim
2140285242Sachim  /*
2141285242Sachim    sanity check: do not go beyond of agIOInfoLen. if happens, return error
2142285242Sachim    agIOInfoLen >= sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen -> OK
2143285242Sachim    because frame must be divisible by 4, so there can be extra padding
2144285242Sachim    agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen -> NOT OK
2145285242Sachim  */
2146285242Sachim  if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen)
2147285242Sachim  {
2148285242Sachim    TI_DBG1(("itdssIOSuccessHandler: Second agIOInfoLen does not match!!!\n"));
2149285242Sachim    TI_DBG1(("itdssIOSuccessHandler: Second agIOInfoLen 0x%x IU 0x%x senselen 0x%x resplen 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t), senseLen, respLen));
2150285242Sachim
2151285242Sachim    ostiInitiatorIOCompleted(
2152285242Sachim                             tiRoot,
2153285242Sachim                             tdIORequestBody->tiIORequest, /* tiIORequest */
2154285242Sachim                             tiIOFailed,
2155285242Sachim                             tiDetailOtherError,
2156285242Sachim                             agNULL,
2157285242Sachim                             agTRUE /* intContext; is not being used */
2158285242Sachim                             );
2159285242Sachim    return;
2160285242Sachim  }
2161285242Sachim
2162285242Sachim  /* reads response data */
2163285242Sachim  saFrameReadBlock(agRoot, agParam,
2164285242Sachim                   sizeof(agsaSSPResponseInfoUnit_t),
2165285242Sachim                   respData, respLen);
2166285242Sachim  /* reads sense data */
2167285242Sachim  saFrameReadBlock(agRoot, agParam,
2168285242Sachim                   sizeof(agsaSSPResponseInfoUnit_t)
2169285242Sachim                   + respLen,
2170285242Sachim                   senseDataPayload, senseLen);
2171285242Sachim
2172285242Sachim  if (data_status == 0)
2173285242Sachim  {
2174285242Sachim    /* NO_DATA */
2175285242Sachim    TI_DBG1(("itdssIOSuccessHandler: no data scsi_status 0x%x\n",scsi_status));
2176285242Sachim
2177285242Sachim    ostiInitiatorIOCompleted(
2178285242Sachim                             tiRoot,
2179285242Sachim                             tdIORequestBody->tiIORequest, /* tiIORequest */
2180285242Sachim                             tiIOSuccess,
2181285242Sachim                             scsi_status,
2182285242Sachim                             agNULL,
2183285242Sachim                             agTRUE /* intContext; is not being used */
2184285242Sachim                             );
2185285242Sachim
2186285242Sachim    return;
2187285242Sachim  }
2188285242Sachim
2189285242Sachim  if (data_status == 1)
2190285242Sachim  {
2191285242Sachim    /* RESPONSE_DATA */
2192285242Sachim    TI_DBG1(("itdssIOSuccessHandler: response data \n"));
2193285242Sachim
2194285242Sachim    ostiInitiatorIOCompleted(
2195285242Sachim                             tiRoot,
2196285242Sachim                             tdIORequestBody->tiIORequest, /* tiIORequest */
2197285242Sachim                             tiIOSuccess,
2198285242Sachim                             0,
2199285242Sachim                             agNULL,
2200285242Sachim                             agTRUE /* intContext; is not being used */
2201285242Sachim                             );
2202285242Sachim    return;
2203285242Sachim  }
2204285242Sachim
2205285242Sachim  if (data_status == 2)
2206285242Sachim  {
2207285242Sachim    /* SENSE_DATA */
2208285242Sachim    TI_DBG2(("itdssIOSuccessHandler: sense data \n"));
2209285242Sachim
2210285242Sachim    senseData.senseData = &senseDataPayload;
2211285242Sachim    senseData.senseLen = MIN(256, senseLen);
2212285242Sachim    /* debugging */
2213285242Sachim    tdhexdump("ResponseIU I", (bit8 *)&agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
2214285242Sachim
2215285242Sachim    tiDeviceHandle = tdIORequestBody->tiDevHandle;
2216285242Sachim    oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2217285242Sachim    TI_DBG1(("sense data Sense Key 0x%2X ASC(Code) 0x%2X ASCQ(Qualifier) 0x%2X, did 0x%x\n",*(senseDataPayload+ 2),*(senseDataPayload + 12),*(senseDataPayload + 13),
2218285242Sachim             oneDeviceData->id));
2219285242Sachim    tdhexdump("sense data I", (bit8 *)senseDataPayload, senseLen);
2220285242Sachim//    tdhexdump("sense data II", (bit8 *)senseData.senseData, senseData.senseLen);
2221285242Sachim
2222285242Sachim    if (senseDataPayload[2] == SCSI_SENSE_KEY_RECOVERED_ERROR)
2223285242Sachim    {
2224285242Sachim      Initiator->SenseKeyCounter.SoftError ++;
2225285242Sachim    }
2226285242Sachim    else if (senseDataPayload[2] == SCSI_SENSE_KEY_NOT_READY)
2227285242Sachim    {
2228285242Sachim      Initiator->SenseKeyCounter.MediumNotReady++;
2229285242Sachim    }
2230285242Sachim    else if (senseDataPayload[2] == SCSI_SENSE_KEY_MEDIUM_ERROR)
2231285242Sachim    {
2232285242Sachim      Initiator->SenseKeyCounter.MediumError++;
2233285242Sachim    }
2234285242Sachim    else if (senseDataPayload[2] == SCSI_SENSE_KEY_HARDWARE_ERROR)
2235285242Sachim    {
2236285242Sachim      Initiator->SenseKeyCounter.HardwareError++;
2237285242Sachim    }
2238285242Sachim    else if (senseDataPayload[2] == SCSI_SENSE_KEY_ILLEGAL_REQUEST)
2239285242Sachim    {
2240285242Sachim      Initiator->SenseKeyCounter.IllegalRequest++;
2241285242Sachim    }
2242285242Sachim    else if (senseDataPayload[2] == SCSI_SENSE_KEY_UNIT_ATTENTION)
2243285242Sachim    {
2244285242Sachim      Initiator->SenseKeyCounter.UnitAttention++;
2245285242Sachim    }
2246285242Sachim    else if (senseDataPayload[2] == SCSI_SENSE_KEY_ABORTED_COMMAND)
2247285242Sachim    {
2248285242Sachim      Initiator->SenseKeyCounter.AbortCommand++;
2249285242Sachim    }
2250285242Sachim    else
2251285242Sachim    {
2252285242Sachim      Initiator->SenseKeyCounter.OtherKeyType++;
2253285242Sachim    }
2254285242Sachim
2255285242Sachim    /* when ASQ and ASCQ 0x04 0x11, does saLocalPhyControl for notify spinup */
2256285242Sachim    if ((senseDataPayload[12] == 0x04 && senseDataPayload[13] == 0x11))
2257285242Sachim    {
2258285242Sachim      TI_DBG2(("itdssIOSuccessHandler: sending notfify spinup\n"));
2259285242Sachim      tiDeviceHandle = tdIORequestBody->tiDevHandle;
2260285242Sachim      oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2261285242Sachim      if (oneDeviceData->directlyAttached == agTRUE)
2262285242Sachim      {
2263285242Sachim        for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
2264285242Sachim        {
2265285242Sachim          saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
2266285242Sachim        }
2267285242Sachim      }
2268285242Sachim    }
2269285242Sachim    ostiInitiatorIOCompleted(
2270285242Sachim                             tiRoot,
2271285242Sachim                             /* tiIORequest */
2272285242Sachim                             tdIORequestBody->tiIORequest,
2273285242Sachim                             tiIOSuccess,
2274285242Sachim                             scsi_status,
2275285242Sachim                             &senseData,
2276285242Sachim                             agTRUE /* intContext; is not being used */
2277285242Sachim                             );
2278285242Sachim    return;
2279285242Sachim  }
2280285242Sachim  if (data_status == 3)
2281285242Sachim  {
2282285242Sachim    /* RESERVED */
2283285242Sachim    TI_DBG1(("itdssIOSuccessHandler: reserved wrong!!!\n"));
2284285242Sachim    ostiInitiatorIOCompleted(
2285285242Sachim                             tiRoot,
2286285242Sachim                             tdIORequestBody->tiIORequest, /* tiIORequest */
2287285242Sachim                             tiIOFailed,
2288285242Sachim                             scsi_status,
2289285242Sachim                             agNULL,
2290285242Sachim                             agTRUE /* intContext; is not being used */
2291285242Sachim                             );
2292285242Sachim    return;
2293285242Sachim  }
2294285242Sachim
2295285242Sachim}
2296285242Sachim
2297285242Sachim/*****************************************************************************
2298285242Sachim*! \brief itdssIOAbortedHandler
2299285242Sachim*
2300285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2301285242Sachim*            layer with agIOStatus = OSSA_IO_ABORTED
2302285242Sachim*
2303285242Sachim*  \param  agRoot:            pointer to port instance
2304285242Sachim*  \param  agIORequest:       pointer to I/O request
2305285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2306285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2307285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2308285242Sachim*                             of abort request
2309285242Sachim*  \param  agOtherInfo        Residual count
2310285242Sachim*  \return: None
2311285242Sachim*
2312285242Sachim*
2313285242Sachim*****************************************************************************/
2314285242Sachim/* see itdosIOCompleted() and itdinit.c and  itdIoAbortedHandler in itdio.c*/
2315285242SachimosGLOBAL void
2316285242SachimitdssIOAbortedHandler (
2317285242Sachim                       agsaRoot_t              *agRoot,
2318285242Sachim                       agsaIORequest_t         *agIORequest,
2319285242Sachim                       bit32                   agIOStatus,
2320285242Sachim                       bit32                   agIOInfoLen,
2321285242Sachim                       void                    *agParam,
2322285242Sachim                       bit32                   agOtherInfo
2323285242Sachim                       )
2324285242Sachim{
2325285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
2326285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
2327285242Sachim  bit32                  intContext = osData->IntContext;
2328285242Sachim  tdIORequestBody_t      *tdIORequestBody;
2329285242Sachim  tiDeviceHandle_t       *tiDeviceHandle = agNULL;
2330285242Sachim  tdsaDeviceData_t       *oneDeviceData = agNULL;
2331285242Sachim
2332285242Sachim  TI_DBG2(("itdssIOAbortedHandler: start\n"));
2333285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2334285242Sachim
2335285242Sachim  if (agIOStatus != OSSA_IO_ABORTED)
2336285242Sachim  {
2337285242Sachim    TI_DBG1(("itdssIOAbortedHandler: incorrect agIOStatus 0x%x\n", agIOStatus));
2338285242Sachim  }
2339285242Sachim
2340285242Sachim  if (tdIORequestBody == agNULL)
2341285242Sachim  {
2342285242Sachim    TI_DBG1(("itdssIOAbortedHandler: start\n"));
2343285242Sachim    return;
2344285242Sachim  }
2345285242Sachim
2346285242Sachim  if (tdIORequestBody != agNULL)
2347285242Sachim  {
2348285242Sachim    tiDeviceHandle = tdIORequestBody->tiDevHandle;
2349285242Sachim  }
2350285242Sachim  if (tiDeviceHandle != agNULL)
2351285242Sachim  {
2352285242Sachim    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2353285242Sachim  }
2354285242Sachim  if (oneDeviceData != agNULL)
2355285242Sachim  {
2356285242Sachim    TI_DBG2(("itdssIOAbortedHandler: did %d \n", oneDeviceData->id));
2357285242Sachim  }
2358285242Sachim  else
2359285242Sachim  {
2360285242Sachim    TI_DBG1(("itdssIOAbortedHandler: oneDeviceData is NULL\n"));
2361285242Sachim  }
2362285242Sachim
2363285242Sachim
2364285242Sachim  ostiInitiatorIOCompleted (
2365285242Sachim                            tiRoot,
2366285242Sachim                            tdIORequestBody->tiIORequest,
2367285242Sachim                            tiIOFailed,
2368285242Sachim                            tiDetailAborted,
2369285242Sachim                            agNULL,
2370285242Sachim                            intContext
2371285242Sachim                            );
2372285242Sachim
2373285242Sachim  return;
2374285242Sachim}
2375285242Sachim
2376285242Sachim#ifdef REMOVED
2377285242Sachim/*****************************************************************************
2378285242Sachim*! \brief itdssIOOverFlowHandler
2379285242Sachim*
2380285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2381285242Sachim*            layer with agIOStatus = OSSA_IO_OVERFLOW
2382285242Sachim*
2383285242Sachim*  \param  agRoot:            pointer to port instance
2384285242Sachim*  \param  agIORequest:       pointer to I/O request
2385285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2386285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2387285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2388285242Sachim*                             of abort request
2389285242Sachim*  \return: None
2390285242Sachim*
2391285242Sachim*
2392285242Sachim*****************************************************************************/
2393285242SachimosGLOBAL void
2394285242SachimitdssIOOverFlowHandler(
2395285242Sachim                       agsaRoot_t              *agRoot,
2396285242Sachim                       agsaIORequest_t         *agIORequest,
2397285242Sachim                       bit32                   agIOStatus,
2398285242Sachim                       bit32                   agIOInfoLen,
2399285242Sachim                       void                    *agParam
2400285242Sachim                       )
2401285242Sachim{
2402285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
2403285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
2404285242Sachim  bit32                  intContext = osData->IntContext;
2405285242Sachim  tdIORequestBody_t      *tdIORequestBody;
2406285242Sachim
2407285242Sachim  TI_DBG2(("itdssIOOverFlowHandler: start\n"));
2408285242Sachim  TI_DBG2(("itdssIOOverFlowHandler: not transferred byte 0x%x\n", agIOInfoLen));
2409285242Sachim
2410285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2411285242Sachim
2412285242Sachim  ostiInitiatorIOCompleted (
2413285242Sachim                            tiRoot,
2414285242Sachim                            tdIORequestBody->tiIORequest,
2415285242Sachim                            tiIOOverRun,
2416285242Sachim                            agIOInfoLen,
2417285242Sachim                            agNULL,
2418285242Sachim                            intContext
2419285242Sachim                            );
2420285242Sachim
2421285242Sachim  return;
2422285242Sachim}
2423285242Sachim#endif
2424285242Sachim
2425285242Sachim
2426285242Sachim/*****************************************************************************
2427285242Sachim*! \brief itdssIOUnderFlowHandler
2428285242Sachim*
2429285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2430285242Sachim*            layer with agIOStatus = OSSA_IO_UNDERFLOW
2431285242Sachim*
2432285242Sachim*  \param  agRoot:            pointer to port instance
2433285242Sachim*  \param  agIORequest:       pointer to I/O request
2434285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2435285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2436285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2437285242Sachim*                             of abort request
2438285242Sachim*  \param  agOtherInfo        Residual count
2439285242Sachim*  \return: None
2440285242Sachim*
2441285242Sachim*
2442285242Sachim*****************************************************************************/
2443285242SachimosGLOBAL void
2444285242SachimitdssIOUnderFlowHandler(
2445285242Sachim                        agsaRoot_t              *agRoot,
2446285242Sachim                        agsaIORequest_t         *agIORequest,
2447285242Sachim                        bit32                   agIOStatus,
2448285242Sachim                        bit32                   agIOInfoLen,
2449285242Sachim                        void                    *agParam,
2450285242Sachim                        bit32                   agOtherInfo
2451285242Sachim                        )
2452285242Sachim{
2453285242Sachim  tdsaRootOsData_t          *osData = (tdsaRootOsData_t *)agRoot->osData;
2454285242Sachim  tiRoot_t                  *tiRoot = (tiRoot_t *)osData->tiRoot;
2455285242Sachim  bit32                     intContext = osData->IntContext;
2456285242Sachim  tdIORequestBody_t         *tdIORequestBody;
2457285242Sachim
2458285242Sachim  TI_DBG6(("itdssIOUnderFlowHandler: start\n"));
2459285242Sachim  TI_DBG6(("itdssIOUnderFlowHandler: agIOInfoLen 0x%x\n", agIOInfoLen));
2460285242Sachim
2461285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2462285242Sachim
2463285242Sachim  ostiInitiatorIOCompleted (
2464285242Sachim                            tiRoot,
2465285242Sachim                            tdIORequestBody->tiIORequest,
2466285242Sachim                            tiIOUnderRun,
2467285242Sachim                            agIOInfoLen,
2468285242Sachim                            agNULL,
2469285242Sachim                            intContext
2470285242Sachim                            );
2471285242Sachim
2472285242Sachim  return;
2473285242Sachim}
2474285242Sachim
2475285242Sachim/*****************************************************************************
2476285242Sachim*! \brief itdssIOFailedHandler
2477285242Sachim*
2478285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2479285242Sachim*            layer with agIOStatus = OSSA_IO_FAILED
2480285242Sachim*
2481285242Sachim*  \param  agRoot:            pointer to port instance
2482285242Sachim*  \param  agIORequest:       pointer to I/O request
2483285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2484285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2485285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2486285242Sachim*                             of abort request
2487285242Sachim*  \param  agOtherInfo        Residual count
2488285242Sachim*  \return: None
2489285242Sachim*
2490285242Sachim*
2491285242Sachim*****************************************************************************/
2492285242SachimosGLOBAL void
2493285242SachimitdssIOFailedHandler(
2494285242Sachim                     agsaRoot_t              *agRoot,
2495285242Sachim                     agsaIORequest_t         *agIORequest,
2496285242Sachim                     bit32                   agIOStatus,
2497285242Sachim                     bit32                   agIOInfoLen,
2498285242Sachim                     void                    *agParam,
2499285242Sachim                     bit32                   agOtherInfo
2500285242Sachim                     )
2501285242Sachim{
2502285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
2503285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
2504285242Sachim  bit32                  intContext = osData->IntContext;
2505285242Sachim  tdIORequestBody_t      *tdIORequestBody;
2506285242Sachim
2507285242Sachim  TI_DBG1(("itdssIOFailedHandler: start\n"));
2508285242Sachim
2509285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2510285242Sachim
2511285242Sachim  ostiInitiatorIOCompleted (
2512285242Sachim                            tiRoot,
2513285242Sachim                            tdIORequestBody->tiIORequest,
2514285242Sachim                            tiIOFailed,
2515285242Sachim                            tiDetailOtherError,
2516285242Sachim                            agNULL,
2517285242Sachim                            intContext
2518285242Sachim                            );
2519285242Sachim  return;
2520285242Sachim}
2521285242Sachim
2522285242Sachim/*****************************************************************************
2523285242Sachim*! \brief itdssIOAbortResetHandler
2524285242Sachim*
2525285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2526285242Sachim*            layer with agIOStatus = OSSA_IO_ABORT_RESET
2527285242Sachim*
2528285242Sachim*  \param  agRoot:            pointer to port instance
2529285242Sachim*  \param  agIORequest:       pointer to I/O request
2530285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2531285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2532285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2533285242Sachim*                             of abort request
2534285242Sachim*  \param  agOtherInfo        Residual count
2535285242Sachim*  \return: None
2536285242Sachim*
2537285242Sachim*
2538285242Sachim*****************************************************************************/
2539285242SachimosGLOBAL void
2540285242SachimitdssIOAbortResetHandler(
2541285242Sachim                         agsaRoot_t              *agRoot,
2542285242Sachim                         agsaIORequest_t         *agIORequest,
2543285242Sachim                         bit32                   agIOStatus,
2544285242Sachim                         bit32                   agIOInfoLen,
2545285242Sachim                         void                    *agParam,
2546285242Sachim                         bit32                   agOtherInfo
2547285242Sachim                         )
2548285242Sachim{
2549285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
2550285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
2551285242Sachim  bit32                  intContext = osData->IntContext;
2552285242Sachim  tdIORequestBody_t      *tdIORequestBody;
2553285242Sachim  TI_DBG2(("itdssIOAbortResetHandler: start\n"));
2554285242Sachim
2555285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2556285242Sachim
2557285242Sachim  ostiInitiatorIOCompleted (
2558285242Sachim                            tiRoot,
2559285242Sachim                            tdIORequestBody->tiIORequest,
2560285242Sachim                            tiIOFailed,
2561285242Sachim                            tiDetailAbortReset,
2562285242Sachim                            agNULL,
2563285242Sachim                            intContext
2564285242Sachim                            );
2565285242Sachim
2566285242Sachim
2567285242Sachim  return;
2568285242Sachim}
2569285242Sachim
2570285242Sachim/*****************************************************************************
2571285242Sachim*! \brief itdssIONotValidHandler
2572285242Sachim*
2573285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2574285242Sachim*            layer with agIOStatus = OSSA_IO_NOT_VALID
2575285242Sachim*
2576285242Sachim*  \param  agRoot:            pointer to port instance
2577285242Sachim*  \param  agIORequest:       pointer to I/O request
2578285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2579285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2580285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2581285242Sachim*                             of abort request
2582285242Sachim*  \param  agOtherInfo        Residual count
2583285242Sachim*  \return: None
2584285242Sachim*
2585285242Sachim*
2586285242Sachim*****************************************************************************/
2587285242SachimosGLOBAL void
2588285242SachimitdssIONotValidHandler(
2589285242Sachim                       agsaRoot_t           *agRoot,
2590285242Sachim                       agsaIORequest_t      *agIORequest,
2591285242Sachim                       bit32                agIOStatus,
2592285242Sachim                       bit32                agIOInfoLen,
2593285242Sachim                       void                 *agParam,
2594285242Sachim                       bit32                agOtherInfo
2595285242Sachim                       )
2596285242Sachim{
2597285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
2598285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
2599285242Sachim  bit32                  intContext = osData->IntContext;
2600285242Sachim  tdIORequestBody_t      *tdIORequestBody;
2601285242Sachim  TI_DBG2(("itdssIONotValidHandler: start\n"));
2602285242Sachim
2603285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2604285242Sachim
2605285242Sachim  ostiInitiatorIOCompleted (
2606285242Sachim                            tiRoot,
2607285242Sachim                            tdIORequestBody->tiIORequest,
2608285242Sachim                            tiIOFailed,
2609285242Sachim                            tiDetailNotValid,
2610285242Sachim                            agNULL,
2611285242Sachim                            intContext
2612285242Sachim                            );
2613285242Sachim  return;
2614285242Sachim}
2615285242Sachim
2616285242Sachim/*****************************************************************************
2617285242Sachim*! \brief itdssIONoDeviceHandler
2618285242Sachim*
2619285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2620285242Sachim*            layer with agIOStatus = OSSA_IO_NO_DEVICE
2621285242Sachim*
2622285242Sachim*  \param  agRoot:            pointer to port instance
2623285242Sachim*  \param  agIORequest:       pointer to I/O request
2624285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2625285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2626285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2627285242Sachim*                             of abort request
2628285242Sachim*  \param  agOtherInfo        Residual count
2629285242Sachim*  \return: None
2630285242Sachim*
2631285242Sachim*
2632285242Sachim*****************************************************************************/
2633285242SachimosGLOBAL void
2634285242SachimitdssIONoDeviceHandler(
2635285242Sachim                       agsaRoot_t           *agRoot,
2636285242Sachim                       agsaIORequest_t      *agIORequest,
2637285242Sachim                       bit32                agIOStatus,
2638285242Sachim                       bit32                agIOInfoLen,
2639285242Sachim                       void                 *agParam,
2640285242Sachim                       bit32                agOtherInfo
2641285242Sachim                       )
2642285242Sachim{
2643285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
2644285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
2645285242Sachim  bit32                  intContext = osData->IntContext;
2646285242Sachim  tdIORequestBody_t      *tdIORequestBody;
2647285242Sachim  TI_DBG2(("itdssIONoDeviceHandler: start\n"));
2648285242Sachim
2649285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2650285242Sachim
2651285242Sachim  ostiInitiatorIOCompleted (
2652285242Sachim                            tiRoot,
2653285242Sachim                            tdIORequestBody->tiIORequest,
2654285242Sachim                            tiIOFailed,
2655285242Sachim                            tiDetailNoLogin,
2656285242Sachim                            agNULL,
2657285242Sachim                            intContext
2658285242Sachim                            );
2659285242Sachim  return;
2660285242Sachim}
2661285242Sachim
2662285242Sachim#ifdef REMOVED /* to do: removed from spec */
2663285242Sachim/*****************************************************************************
2664285242Sachim*! \brief itdssIllegalParameterHandler
2665285242Sachim*
2666285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2667285242Sachim*            layer with agIOStatus = OSSA_IO_ILLEGAL_PARAMETER
2668285242Sachim*
2669285242Sachim*  \param  agRoot:            pointer to port instance
2670285242Sachim*  \param  agIORequest:       pointer to I/O request
2671285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2672285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2673285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2674285242Sachim*                             of abort request
2675285242Sachim*  \return: None
2676285242Sachim*
2677285242Sachim*
2678285242Sachim*****************************************************************************/
2679285242SachimosGLOBAL void
2680285242SachimitdssIllegalParameterHandler(
2681285242Sachim                       agsaRoot_t           *agRoot,
2682285242Sachim                       agsaIORequest_t      *agIORequest,
2683285242Sachim                       bit32                agIOStatus,
2684285242Sachim                       bit32                agIOInfoLen,
2685285242Sachim                       void                 *agParam
2686285242Sachim                       )
2687285242Sachim{
2688285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
2689285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
2690285242Sachim  bit32                  intContext = osData->IntContext;
2691285242Sachim  tdIORequestBody_t      *tdIORequestBody;
2692285242Sachim  TI_DBG2(("itdssIllegalParameterHandler: start\n"));
2693285242Sachim
2694285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2695285242Sachim
2696285242Sachim  ostiInitiatorIOCompleted (
2697285242Sachim                            tiRoot,
2698285242Sachim                            tdIORequestBody->tiIORequest,
2699285242Sachim                            tiIOFailed,
2700285242Sachim                            tiDetailOtherError,
2701285242Sachim                            agNULL,
2702285242Sachim                            intContext
2703285242Sachim                            );
2704285242Sachim
2705285242Sachim  return;
2706285242Sachim}
2707285242Sachim#endif
2708285242Sachim
2709285242Sachim/*****************************************************************************
2710285242Sachim*! \brief itdssLinkFailureHandler
2711285242Sachim*
2712285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2713285242Sachim*            layer with agIOStatus = OSSA_IO_LINK_FAILURE
2714285242Sachim*
2715285242Sachim*  \param  agRoot:            pointer to port instance
2716285242Sachim*  \param  agIORequest:       pointer to I/O request
2717285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2718285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2719285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2720285242Sachim*                             of abort request
2721285242Sachim*  \param  agOtherInfo        Residual count
2722285242Sachim*  \return: None
2723285242Sachim*
2724285242Sachim*
2725285242Sachim*****************************************************************************/
2726285242SachimosGLOBAL void
2727285242SachimitdssLinkFailureHandler(
2728285242Sachim                       agsaRoot_t           *agRoot,
2729285242Sachim                       agsaIORequest_t      *agIORequest,
2730285242Sachim                       bit32                agIOStatus,
2731285242Sachim                       bit32                agIOInfoLen,
2732285242Sachim                       void                 *agParam,
2733285242Sachim                       bit32                agOtherInfo
2734285242Sachim                       )
2735285242Sachim{
2736285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
2737285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
2738285242Sachim  bit32                  intContext = osData->IntContext;
2739285242Sachim  tdIORequestBody_t      *tdIORequestBody;
2740285242Sachim  TI_DBG1(("itdssLinkFailureHandler: start\n"));
2741285242Sachim
2742285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2743285242Sachim
2744285242Sachim  ostiInitiatorIOCompleted (
2745285242Sachim                            tiRoot,
2746285242Sachim                            tdIORequestBody->tiIORequest,
2747285242Sachim                            tiIOFailed,
2748285242Sachim                            tiDetailOtherError,
2749285242Sachim                            agNULL,
2750285242Sachim                            intContext
2751285242Sachim                            );
2752285242Sachim
2753285242Sachim  return;
2754285242Sachim}
2755285242Sachim
2756285242Sachim/*****************************************************************************
2757285242Sachim*! \brief itdssProgErrorHandler
2758285242Sachim*
2759285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2760285242Sachim*            layer with agIOStatus = OSSA_IO_PROG_ERROR
2761285242Sachim*
2762285242Sachim*  \param  agRoot:            pointer to port instance
2763285242Sachim*  \param  agIORequest:       pointer to I/O request
2764285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2765285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2766285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2767285242Sachim*                             of abort request
2768285242Sachim*  \param  agOtherInfo        Residual count
2769285242Sachim*  \return: None
2770285242Sachim*
2771285242Sachim*
2772285242Sachim*****************************************************************************/
2773285242SachimosGLOBAL void
2774285242SachimitdssProgErrorHandler(
2775285242Sachim                       agsaRoot_t           *agRoot,
2776285242Sachim                       agsaIORequest_t      *agIORequest,
2777285242Sachim                       bit32                agIOStatus,
2778285242Sachim                       bit32                agIOInfoLen,
2779285242Sachim                       void                 *agParam,
2780285242Sachim                       bit32                agOtherInfo
2781285242Sachim                       )
2782285242Sachim{
2783285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
2784285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
2785285242Sachim  bit32                  intContext = osData->IntContext;
2786285242Sachim  tdIORequestBody_t      *tdIORequestBody;
2787285242Sachim  TI_DBG2(("itdssProgErrorHandler: start\n"));
2788285242Sachim
2789285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2790285242Sachim
2791285242Sachim  ostiInitiatorIOCompleted (
2792285242Sachim                            tiRoot,
2793285242Sachim                            tdIORequestBody->tiIORequest,
2794285242Sachim                            tiIOFailed,
2795285242Sachim                            tiDetailOtherError,
2796285242Sachim                            agNULL,
2797285242Sachim                            intContext
2798285242Sachim                            );
2799285242Sachim
2800285242Sachim  return;
2801285242Sachim}
2802285242Sachim
2803285242Sachim/*****************************************************************************
2804285242Sachim*! \brief itdssXferErrorBreakHandler
2805285242Sachim*
2806285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2807285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_BREAK
2808285242Sachim*
2809285242Sachim*  \param  agRoot:            pointer to port instance
2810285242Sachim*  \param  agIORequest:       pointer to I/O request
2811285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2812285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2813285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2814285242Sachim*                             of abort request
2815285242Sachim*  \param  agOtherInfo        Residual count
2816285242Sachim*  \return: None
2817285242Sachim*
2818285242Sachim*
2819285242Sachim*****************************************************************************/
2820285242SachimosGLOBAL void
2821285242SachimitdssXferErrorBreakHandler(
2822285242Sachim                       agsaRoot_t           *agRoot,
2823285242Sachim                       agsaIORequest_t      *agIORequest,
2824285242Sachim                       bit32                agIOStatus,
2825285242Sachim                       bit32                agIOInfoLen,
2826285242Sachim                       void                 *agParam,
2827285242Sachim                       bit32                agOtherInfo
2828285242Sachim                       )
2829285242Sachim{
2830285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
2831285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
2832285242Sachim  bit32                  intContext = osData->IntContext;
2833285242Sachim  tdIORequestBody_t      *tdIORequestBody;
2834285242Sachim  TI_DBG1(("itdssXferErrorBreakHandler: start\n"));
2835285242Sachim
2836285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2837285242Sachim
2838285242Sachim  ostiInitiatorIOCompleted (
2839285242Sachim                            tiRoot,
2840285242Sachim                            tdIORequestBody->tiIORequest,
2841285242Sachim                            tiIOFailed,
2842285242Sachim                            tiDetailOtherError,
2843285242Sachim                            agNULL,
2844285242Sachim                            intContext
2845285242Sachim                            );
2846285242Sachim
2847285242Sachim  return;
2848285242Sachim}
2849285242Sachim
2850285242Sachim/*****************************************************************************
2851285242Sachim*! \brief itdssXferErrorPhyNotReadyHandler
2852285242Sachim*
2853285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2854285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_PHY_NOT_READY
2855285242Sachim*
2856285242Sachim*  \param  agRoot:            pointer to port instance
2857285242Sachim*  \param  agIORequest:       pointer to I/O request
2858285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2859285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2860285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2861285242Sachim*                             of abort request
2862285242Sachim*  \param  agOtherInfo        Residual count
2863285242Sachim*  \return: None
2864285242Sachim*
2865285242Sachim*
2866285242Sachim*****************************************************************************/
2867285242SachimosGLOBAL void
2868285242SachimitdssXferErrorPhyNotReadyHandler(
2869285242Sachim                       agsaRoot_t           *agRoot,
2870285242Sachim                       agsaIORequest_t      *agIORequest,
2871285242Sachim                       bit32                agIOStatus,
2872285242Sachim                       bit32                agIOInfoLen,
2873285242Sachim                       void                 *agParam,
2874285242Sachim                       bit32                agOtherInfo
2875285242Sachim                       )
2876285242Sachim{
2877285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
2878285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
2879285242Sachim  bit32                  intContext = osData->IntContext;
2880285242Sachim  tdIORequestBody_t      *tdIORequestBody;
2881285242Sachim  TI_DBG2(("itdssXferErrorPhyNotReadyHandler: start\n"));
2882285242Sachim
2883285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2884285242Sachim
2885285242Sachim  ostiInitiatorIOCompleted (
2886285242Sachim                            tiRoot,
2887285242Sachim                            tdIORequestBody->tiIORequest,
2888285242Sachim                            tiIOFailed,
2889285242Sachim                            tiDetailOtherError,
2890285242Sachim                            agNULL,
2891285242Sachim                            intContext
2892285242Sachim                            );
2893285242Sachim
2894285242Sachim  return;
2895285242Sachim}
2896285242Sachim
2897285242Sachim/*****************************************************************************
2898285242Sachim*! \brief itdssOpenCnxErrorProtocolNotSupprotedHandler
2899285242Sachim*
2900285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2901285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED
2902285242Sachim*
2903285242Sachim*  \param  agRoot:            pointer to port instance
2904285242Sachim*  \param  agIORequest:       pointer to I/O request
2905285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2906285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2907285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2908285242Sachim*                             of abort request
2909285242Sachim*  \param  agOtherInfo        Residual count
2910285242Sachim*  \return: None
2911285242Sachim*
2912285242Sachim*
2913285242Sachim*****************************************************************************/
2914285242SachimosGLOBAL void
2915285242SachimitdssOpenCnxErrorProtocolNotSupprotedHandler(
2916285242Sachim                       agsaRoot_t           *agRoot,
2917285242Sachim                       agsaIORequest_t      *agIORequest,
2918285242Sachim                       bit32                agIOStatus,
2919285242Sachim                       bit32                agIOInfoLen,
2920285242Sachim                       void                 *agParam,
2921285242Sachim                       bit32                agOtherInfo
2922285242Sachim                       )
2923285242Sachim{
2924285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
2925285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
2926285242Sachim  bit32                  intContext = osData->IntContext;
2927285242Sachim  tdIORequestBody_t      *tdIORequestBody;
2928285242Sachim  TI_DBG2(("itdssOpenCnxErrorProtocolNotSupprotedHandler: start\n"));
2929285242Sachim
2930285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2931285242Sachim
2932285242Sachim  ostiInitiatorIOCompleted (
2933285242Sachim                            tiRoot,
2934285242Sachim                            tdIORequestBody->tiIORequest,
2935285242Sachim                            tiIOFailed,
2936285242Sachim                            tiDetailOtherError,
2937285242Sachim                            agNULL,
2938285242Sachim                            intContext
2939285242Sachim                            );
2940285242Sachim
2941285242Sachim  return;
2942285242Sachim}
2943285242Sachim
2944285242Sachim/*****************************************************************************
2945285242Sachim*! \brief itdssOpenCnxErrorZoneViolationHandler
2946285242Sachim*
2947285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2948285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION
2949285242Sachim*
2950285242Sachim*  \param  agRoot:            pointer to port instance
2951285242Sachim*  \param  agIORequest:       pointer to I/O request
2952285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
2953285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
2954285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
2955285242Sachim*                             of abort request
2956285242Sachim*  \param  agOtherInfo        Residual count
2957285242Sachim*  \return: None
2958285242Sachim*
2959285242Sachim*
2960285242Sachim*****************************************************************************/
2961285242SachimosGLOBAL void
2962285242SachimitdssOpenCnxErrorZoneViolationHandler(
2963285242Sachim                       agsaRoot_t           *agRoot,
2964285242Sachim                       agsaIORequest_t      *agIORequest,
2965285242Sachim                       bit32                agIOStatus,
2966285242Sachim                       bit32                agIOInfoLen,
2967285242Sachim                       void                 *agParam,
2968285242Sachim                       bit32                agOtherInfo
2969285242Sachim                       )
2970285242Sachim{
2971285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
2972285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
2973285242Sachim  bit32                  intContext = osData->IntContext;
2974285242Sachim  tdIORequestBody_t      *tdIORequestBody;
2975285242Sachim  TI_DBG2(("itdssOpenCnxErrorZoneViolationHandler: start\n"));
2976285242Sachim
2977285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2978285242Sachim
2979285242Sachim  ostiInitiatorIOCompleted (
2980285242Sachim                            tiRoot,
2981285242Sachim                            tdIORequestBody->tiIORequest,
2982285242Sachim                            tiIOFailed,
2983285242Sachim                            tiDetailOtherError,
2984285242Sachim                            agNULL,
2985285242Sachim                            intContext
2986285242Sachim                            );
2987285242Sachim
2988285242Sachim  return;
2989285242Sachim}
2990285242Sachim
2991285242Sachim/*****************************************************************************
2992285242Sachim*! \brief itdssOpenCnxErrorBreakHandler
2993285242Sachim*
2994285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
2995285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_BREAK
2996285242Sachim*
2997285242Sachim*  \param  agRoot:            pointer to port instance
2998285242Sachim*  \param  agIORequest:       pointer to I/O request
2999285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3000285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3001285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3002285242Sachim*                             of abort request
3003285242Sachim*  \param  agOtherInfo        Residual count
3004285242Sachim*  \return: None
3005285242Sachim*
3006285242Sachim*
3007285242Sachim*****************************************************************************/
3008285242SachimosGLOBAL void
3009285242SachimitdssOpenCnxErrorBreakHandler(
3010285242Sachim                       agsaRoot_t           *agRoot,
3011285242Sachim                       agsaIORequest_t      *agIORequest,
3012285242Sachim                       bit32                agIOStatus,
3013285242Sachim                       bit32                agIOInfoLen,
3014285242Sachim                       void                 *agParam,
3015285242Sachim                       bit32                agOtherInfo
3016285242Sachim                       )
3017285242Sachim{
3018285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3019285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3020285242Sachim  bit32                  intContext = osData->IntContext;
3021285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3022285242Sachim  TI_DBG1(("itdssOpenCnxErrorBreakHandler: start\n"));
3023285242Sachim
3024285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3025285242Sachim
3026285242Sachim  ostiInitiatorIOCompleted (
3027285242Sachim                            tiRoot,
3028285242Sachim                            tdIORequestBody->tiIORequest,
3029285242Sachim                            tiIOFailed,
3030285242Sachim                            tiDetailOtherError,
3031285242Sachim                            agNULL,
3032285242Sachim                            intContext
3033285242Sachim                            );
3034285242Sachim
3035285242Sachim  return;
3036285242Sachim}
3037285242Sachim
3038285242Sachim/*****************************************************************************
3039285242Sachim*! \brief itdssOpenCnxErrorITNexusLossHandler
3040285242Sachim*
3041285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3042285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS
3043285242Sachim*
3044285242Sachim*  \param  agRoot:            pointer to port instance
3045285242Sachim*  \param  agIORequest:       pointer to I/O request
3046285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3047285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3048285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3049285242Sachim*                             of abort request
3050285242Sachim*  \param  agOtherInfo        Residual count
3051285242Sachim*  \return: None
3052285242Sachim*
3053285242Sachim*
3054285242Sachim*****************************************************************************/
3055285242SachimosGLOBAL void
3056285242SachimitdssOpenCnxErrorITNexusLossHandler(
3057285242Sachim                       agsaRoot_t           *agRoot,
3058285242Sachim                       agsaIORequest_t      *agIORequest,
3059285242Sachim                       bit32                agIOStatus,
3060285242Sachim                       bit32                agIOInfoLen,
3061285242Sachim                       void                 *agParam,
3062285242Sachim                       bit32                agOtherInfo
3063285242Sachim                       )
3064285242Sachim{
3065285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3066285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3067285242Sachim  bit32                  intContext = osData->IntContext;
3068285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3069285242Sachim  TI_DBG1(("itdssOpenCnxErrorITNexusLossHandler: start\n"));
3070285242Sachim
3071285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3072285242Sachim
3073285242Sachim  ostiInitiatorIOCompleted (
3074285242Sachim                            tiRoot,
3075285242Sachim                            tdIORequestBody->tiIORequest,
3076285242Sachim                            tiIOFailed,
3077285242Sachim                            tiDetailOtherError,
3078285242Sachim                            agNULL,
3079285242Sachim                            intContext
3080285242Sachim                            );
3081285242Sachim
3082285242Sachim  return;
3083285242Sachim}
3084285242Sachim
3085285242Sachim/*****************************************************************************
3086285242Sachim*! \brief itdssOpenCnxErrorBadDestinationHandler
3087285242Sachim*
3088285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3089285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION
3090285242Sachim*
3091285242Sachim*  \param  agRoot:            pointer to port instance
3092285242Sachim*  \param  agIORequest:       pointer to I/O request
3093285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3094285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3095285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3096285242Sachim*                             of abort request
3097285242Sachim*  \param  agOtherInfo        Residual count
3098285242Sachim*  \return: None
3099285242Sachim*
3100285242Sachim*
3101285242Sachim*****************************************************************************/
3102285242SachimosGLOBAL void
3103285242SachimitdssOpenCnxErrorBadDestinationHandler(
3104285242Sachim                       agsaRoot_t           *agRoot,
3105285242Sachim                       agsaIORequest_t      *agIORequest,
3106285242Sachim                       bit32                agIOStatus,
3107285242Sachim                       bit32                agIOInfoLen,
3108285242Sachim                       void                 *agParam,
3109285242Sachim                       bit32                agOtherInfo
3110285242Sachim                       )
3111285242Sachim{
3112285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3113285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3114285242Sachim  bit32                  intContext = osData->IntContext;
3115285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3116285242Sachim  TI_DBG1(("itdssOpenCnxErrorBadDestinationHandler: start\n"));
3117285242Sachim
3118285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3119285242Sachim
3120285242Sachim  ostiInitiatorIOCompleted (
3121285242Sachim                            tiRoot,
3122285242Sachim                            tdIORequestBody->tiIORequest,
3123285242Sachim                            tiIOFailed,
3124285242Sachim                            tiDetailOtherError,
3125285242Sachim                            agNULL,
3126285242Sachim                            intContext
3127285242Sachim                            );
3128285242Sachim
3129285242Sachim  return;
3130285242Sachim}
3131285242Sachim
3132285242Sachim/*****************************************************************************
3133285242Sachim*! \brief itdssOpenCnxErrorConnectionRateNotSupportedHandler
3134285242Sachim*
3135285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3136285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED
3137285242Sachim*
3138285242Sachim*  \param  agRoot:            pointer to port instance
3139285242Sachim*  \param  agIORequest:       pointer to I/O request
3140285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3141285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3142285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3143285242Sachim*                             of abort request
3144285242Sachim*  \param  agOtherInfo        Residual count
3145285242Sachim*  \return: None
3146285242Sachim*
3147285242Sachim*
3148285242Sachim*****************************************************************************/
3149285242SachimosGLOBAL void
3150285242SachimitdssOpenCnxErrorConnectionRateNotSupportedHandler(
3151285242Sachim                       agsaRoot_t           *agRoot,
3152285242Sachim                       agsaIORequest_t      *agIORequest,
3153285242Sachim                       bit32                agIOStatus,
3154285242Sachim                       bit32                agIOInfoLen,
3155285242Sachim                       void                 *agParam,
3156285242Sachim                       bit32                agOtherInfo
3157285242Sachim                       )
3158285242Sachim{
3159285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3160285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3161285242Sachim  tdsaRoot_t             *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
3162285242Sachim  tdsaContext_t          *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3163285242Sachim  bit32                  intContext = osData->IntContext;
3164285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3165285242Sachim  agsaDevHandle_t        *agDevHandle = agNULL;
3166285242Sachim  tiDeviceHandle_t       *tiDeviceHandle = agNULL;
3167285242Sachim  tdsaDeviceData_t       *oneDeviceData = agNULL;
3168285242Sachim  bit32                  ConnRate = SAS_CONNECTION_RATE_12_0G;
3169285242Sachim  agsaContext_t          *agContext = agNULL;
3170285242Sachim  TI_DBG1(("itdssOpenCnxErrorConnectionRateNotSupportedHandler: start\n"));
3171285242Sachim
3172285242Sachim  /* we retry by lowering link rate
3173285242Sachim     retry should be in ossaSetDeviceInfoCB()
3174285242Sachim  */
3175285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3176285242Sachim  tiDeviceHandle = tdIORequestBody->tiDevHandle;
3177285242Sachim  oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
3178285242Sachim  agDevHandle = oneDeviceData->agDevHandle;
3179285242Sachim
3180285242Sachim  if (tdsaAllShared->RateAdjust)
3181285242Sachim  {
3182285242Sachim    if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
3183285242Sachim        oneDeviceData->tdPortContext != agNULL )
3184285242Sachim    {
3185285242Sachim      ConnRate = DEVINFO_GET_LINKRATE(&oneDeviceData->agDeviceInfo);
3186285242Sachim      if (ConnRate == SAS_CONNECTION_RATE_1_5G)
3187285242Sachim      {
3188285242Sachim        /* no retry; completes IO */
3189285242Sachim        ostiInitiatorIOCompleted(
3190285242Sachim                                 tiRoot,
3191285242Sachim                                 tdIORequestBody->tiIORequest,
3192285242Sachim                                 tiIOFailed,
3193285242Sachim                                 tiDetailOtherError,
3194285242Sachim                                 agNULL,
3195285242Sachim                                 intContext
3196285242Sachim                                 );
3197285242Sachim      }
3198285242Sachim      else
3199285242Sachim      {
3200285242Sachim        ConnRate = ConnRate - 1;
3201285242Sachim      }
3202285242Sachim      agContext = &(tdIORequestBody->agContext);
3203285242Sachim      agContext->osData = agIORequest;
3204285242Sachim      saSetDeviceInfo(agRoot, agContext, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 32, ConnRate << 28, ossaIniSetDeviceInfoCB);
3205285242Sachim    }
3206285242Sachim  }
3207285242Sachim  else
3208285242Sachim  {
3209285242Sachim    ostiInitiatorIOCompleted(
3210285242Sachim                             tiRoot,
3211285242Sachim                             tdIORequestBody->tiIORequest,
3212285242Sachim                             tiIOFailed,
3213285242Sachim                             tiDetailOtherError,
3214285242Sachim                             agNULL,
3215285242Sachim                             intContext
3216285242Sachim                             );
3217285242Sachim  }
3218285242Sachim
3219285242Sachim  return;
3220285242Sachim}
3221285242Sachim
3222285242Sachim/*****************************************************************************
3223285242Sachim*! \brief itdssOpenCnxErrorSTPResourceBusyHandler
3224285242Sachim*
3225285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3226285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY
3227285242Sachim*
3228285242Sachim*  \param  agRoot:            pointer to port instance
3229285242Sachim*  \param  agIORequest:       pointer to I/O request
3230285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3231285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3232285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3233285242Sachim*                             of abort request
3234285242Sachim*  \param  agOtherInfo        Residual count
3235285242Sachim*  \return: None
3236285242Sachim*
3237285242Sachim*
3238285242Sachim*****************************************************************************/
3239285242SachimosGLOBAL void
3240285242SachimitdssOpenCnxErrorSTPResourceBusyHandler(
3241285242Sachim                       agsaRoot_t           *agRoot,
3242285242Sachim                       agsaIORequest_t      *agIORequest,
3243285242Sachim                       bit32                agIOStatus,
3244285242Sachim                       bit32                agIOInfoLen,
3245285242Sachim                       void                 *agParam,
3246285242Sachim                       bit32                agOtherInfo
3247285242Sachim                       )
3248285242Sachim{
3249285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3250285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3251285242Sachim  bit32                  intContext = osData->IntContext;
3252285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3253285242Sachim  TI_DBG2(("itdssOpenCnxErrorSTPResourceBusyHandler: start\n"));
3254285242Sachim
3255285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3256285242Sachim
3257285242Sachim  ostiInitiatorIOCompleted (
3258285242Sachim                            tiRoot,
3259285242Sachim                            tdIORequestBody->tiIORequest,
3260285242Sachim                            tiIOFailed,
3261285242Sachim                            tiDetailOtherError,
3262285242Sachim                            agNULL,
3263285242Sachim                            intContext
3264285242Sachim                            );
3265285242Sachim
3266285242Sachim  return;
3267285242Sachim}
3268285242Sachim
3269285242Sachim/*****************************************************************************
3270285242Sachim*! \brief itdssOpenCnxErrorWrongDestinationHandler
3271285242Sachim*
3272285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3273285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION
3274285242Sachim*
3275285242Sachim*  \param  agRoot:            pointer to port instance
3276285242Sachim*  \param  agIORequest:       pointer to I/O request
3277285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3278285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3279285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3280285242Sachim*                             of abort request
3281285242Sachim*  \param  agOtherInfo        Residual count
3282285242Sachim*  \return: None
3283285242Sachim*
3284285242Sachim*
3285285242Sachim*****************************************************************************/
3286285242SachimosGLOBAL void
3287285242SachimitdssOpenCnxErrorWrongDestinationHandler(
3288285242Sachim                       agsaRoot_t           *agRoot,
3289285242Sachim                       agsaIORequest_t      *agIORequest,
3290285242Sachim                       bit32                agIOStatus,
3291285242Sachim                       bit32                agIOInfoLen,
3292285242Sachim                       void                 *agParam,
3293285242Sachim                       bit32                agOtherInfo
3294285242Sachim                       )
3295285242Sachim{
3296285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3297285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3298285242Sachim  bit32                  intContext = osData->IntContext;
3299285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3300285242Sachim  TI_DBG1(("itdssOpenCnxErrorWrongDestinationHandler: start\n"));
3301285242Sachim
3302285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3303285242Sachim
3304285242Sachim  ostiInitiatorIOCompleted (
3305285242Sachim                            tiRoot,
3306285242Sachim                            tdIORequestBody->tiIORequest,
3307285242Sachim                            tiIOFailed,
3308285242Sachim                            tiDetailOtherError,
3309285242Sachim                            agNULL,
3310285242Sachim                            intContext
3311285242Sachim                            );
3312285242Sachim
3313285242Sachim  return;
3314285242Sachim}
3315285242Sachim
3316285242Sachim/*****************************************************************************
3317285242Sachim*! \brief itdssOpenCnxErrorUnknownErrorHandler
3318285242Sachim*
3319285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3320285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR
3321285242Sachim*
3322285242Sachim*  \param  agRoot:            pointer to port instance
3323285242Sachim*  \param  agIORequest:       pointer to I/O request
3324285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3325285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3326285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3327285242Sachim*                             of abort request
3328285242Sachim*  \param  agOtherInfo        Residual count
3329285242Sachim*  \return: None
3330285242Sachim*
3331285242Sachim*
3332285242Sachim*****************************************************************************/
3333285242SachimosGLOBAL void
3334285242SachimitdssOpenCnxErrorUnknownErrorHandler(
3335285242Sachim                       agsaRoot_t           *agRoot,
3336285242Sachim                       agsaIORequest_t      *agIORequest,
3337285242Sachim                       bit32                agIOStatus,
3338285242Sachim                       bit32                agIOInfoLen,
3339285242Sachim                       void                 *agParam,
3340285242Sachim                       bit32                agOtherInfo
3341285242Sachim                       )
3342285242Sachim{
3343285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3344285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3345285242Sachim  bit32                  intContext = osData->IntContext;
3346285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3347285242Sachim  TI_DBG1(("itdssOpenCnxErrorUnknownErrorHandler: start\n"));
3348285242Sachim
3349285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3350285242Sachim
3351285242Sachim  ostiInitiatorIOCompleted (
3352285242Sachim                            tiRoot,
3353285242Sachim                            tdIORequestBody->tiIORequest,
3354285242Sachim                            tiIOFailed,
3355285242Sachim                            tiDetailOtherError,
3356285242Sachim                            agNULL,
3357285242Sachim                            intContext
3358285242Sachim                            );
3359285242Sachim
3360285242Sachim  return;
3361285242Sachim}
3362285242Sachim
3363285242Sachim/*****************************************************************************
3364285242Sachim*! \brief itdssXferErrorNAKReceivedHandler
3365285242Sachim*
3366285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3367285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_NAK_RECEIVED
3368285242Sachim*
3369285242Sachim*  \param  agRoot:            pointer to port instance
3370285242Sachim*  \param  agIORequest:       pointer to I/O request
3371285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3372285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3373285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3374285242Sachim*                             of abort request
3375285242Sachim*  \param  agOtherInfo        Residual count
3376285242Sachim*  \return: None
3377285242Sachim*
3378285242Sachim*
3379285242Sachim*****************************************************************************/
3380285242SachimosGLOBAL void
3381285242SachimitdssXferErrorNAKReceivedHandler(
3382285242Sachim                       agsaRoot_t           *agRoot,
3383285242Sachim                       agsaIORequest_t      *agIORequest,
3384285242Sachim                       bit32                agIOStatus,
3385285242Sachim                       bit32                agIOInfoLen,
3386285242Sachim                       void                 *agParam,
3387285242Sachim                       bit32                agOtherInfo
3388285242Sachim                       )
3389285242Sachim{
3390285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3391285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3392285242Sachim  bit32                  intContext = osData->IntContext;
3393285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3394285242Sachim  TI_DBG1(("itdssXferErrorNAKReceivedHandler: start\n"));
3395285242Sachim
3396285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3397285242Sachim
3398285242Sachim  ostiInitiatorIOCompleted (
3399285242Sachim                            tiRoot,
3400285242Sachim                            tdIORequestBody->tiIORequest,
3401285242Sachim                            tiIOFailed,
3402285242Sachim                            tiDetailOtherError,
3403285242Sachim                            agNULL,
3404285242Sachim                            intContext
3405285242Sachim                            );
3406285242Sachim
3407285242Sachim  return;
3408285242Sachim}
3409285242Sachim
3410285242Sachim/*****************************************************************************
3411285242Sachim*! \brief itdssXferErrorACKNAKTimeoutHandler
3412285242Sachim*
3413285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3414285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT
3415285242Sachim*
3416285242Sachim*  \param  agRoot:            pointer to port instance
3417285242Sachim*  \param  agIORequest:       pointer to I/O request
3418285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3419285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3420285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3421285242Sachim*                             of abort request
3422285242Sachim*  \param  agOtherInfo        Residual count
3423285242Sachim*  \return: None
3424285242Sachim*
3425285242Sachim*
3426285242Sachim*****************************************************************************/
3427285242SachimosGLOBAL void
3428285242SachimitdssXferErrorACKNAKTimeoutHandler(
3429285242Sachim                       agsaRoot_t           *agRoot,
3430285242Sachim                       agsaIORequest_t      *agIORequest,
3431285242Sachim                       bit32                agIOStatus,
3432285242Sachim                       bit32                agIOInfoLen,
3433285242Sachim                       void                 *agParam,
3434285242Sachim                       bit32                agOtherInfo
3435285242Sachim                       )
3436285242Sachim{
3437285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3438285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3439285242Sachim  bit32                  intContext = osData->IntContext;
3440285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3441285242Sachim  TI_DBG1(("itdssXferErrorACKNAKTimeoutHandler: start\n"));
3442285242Sachim
3443285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3444285242Sachim
3445285242Sachim  ostiInitiatorIOCompleted (
3446285242Sachim                            tiRoot,
3447285242Sachim                            tdIORequestBody->tiIORequest,
3448285242Sachim                            tiIOFailed,
3449285242Sachim                            tiDetailOtherError,
3450285242Sachim                            agNULL,
3451285242Sachim                            intContext
3452285242Sachim                            );
3453285242Sachim
3454285242Sachim  return;
3455285242Sachim}
3456285242Sachim
3457285242Sachim/*****************************************************************************
3458285242Sachim*! \brief itdssXferErrorPeerAbortedHandler
3459285242Sachim*
3460285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3461285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_PEER_ABORTED
3462285242Sachim*
3463285242Sachim*  \param  agRoot:            pointer to port instance
3464285242Sachim*  \param  agIORequest:       pointer to I/O request
3465285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3466285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3467285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3468285242Sachim*                             of abort request
3469285242Sachim*  \param  agOtherInfo        Residual count
3470285242Sachim*  \return: None
3471285242Sachim*
3472285242Sachim*
3473285242Sachim*****************************************************************************/
3474285242SachimosGLOBAL void
3475285242SachimitdssXferErrorPeerAbortedHandler(
3476285242Sachim                       agsaRoot_t           *agRoot,
3477285242Sachim                       agsaIORequest_t      *agIORequest,
3478285242Sachim                       bit32                agIOStatus,
3479285242Sachim                       bit32                agIOInfoLen,
3480285242Sachim                       void                 *agParam,
3481285242Sachim                       bit32                agOtherInfo
3482285242Sachim                       )
3483285242Sachim{
3484285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3485285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3486285242Sachim  bit32                  intContext = osData->IntContext;
3487285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3488285242Sachim  TI_DBG2(("itdssXferErrorPeerAbortedHandler: start\n"));
3489285242Sachim
3490285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3491285242Sachim
3492285242Sachim  ostiInitiatorIOCompleted (
3493285242Sachim                            tiRoot,
3494285242Sachim                            tdIORequestBody->tiIORequest,
3495285242Sachim                            tiIOFailed,
3496285242Sachim                            tiDetailOtherError,
3497285242Sachim                            agNULL,
3498285242Sachim                            intContext
3499285242Sachim                            );
3500285242Sachim
3501285242Sachim  return;
3502285242Sachim}
3503285242Sachim
3504285242Sachim/*****************************************************************************
3505285242Sachim*! \brief itdssXferErrorRxFrameHandler
3506285242Sachim*
3507285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3508285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_RX_FRAME
3509285242Sachim*
3510285242Sachim*  \param  agRoot:            pointer to port instance
3511285242Sachim*  \param  agIORequest:       pointer to I/O request
3512285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3513285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3514285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3515285242Sachim*                             of abort request
3516285242Sachim*  \param  agOtherInfo        Residual count
3517285242Sachim*  \return: None
3518285242Sachim*
3519285242Sachim*
3520285242Sachim*****************************************************************************/
3521285242SachimosGLOBAL void
3522285242SachimitdssXferErrorRxFrameHandler(
3523285242Sachim                       agsaRoot_t           *agRoot,
3524285242Sachim                       agsaIORequest_t      *agIORequest,
3525285242Sachim                       bit32                agIOStatus,
3526285242Sachim                       bit32                agIOInfoLen,
3527285242Sachim                       void                 *agParam,
3528285242Sachim                       bit32                agOtherInfo
3529285242Sachim                       )
3530285242Sachim{
3531285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3532285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3533285242Sachim  bit32                  intContext = osData->IntContext;
3534285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3535285242Sachim  TI_DBG1(("itdssXferErrorRxFrameHandler: start\n"));
3536285242Sachim
3537285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3538285242Sachim
3539285242Sachim  ostiInitiatorIOCompleted (
3540285242Sachim                            tiRoot,
3541285242Sachim                            tdIORequestBody->tiIORequest,
3542285242Sachim                            tiIOFailed,
3543285242Sachim                            tiDetailOtherError,
3544285242Sachim                            agNULL,
3545285242Sachim                            intContext
3546285242Sachim                            );
3547285242Sachim
3548285242Sachim  return;
3549285242Sachim}
3550285242Sachim
3551285242Sachim/*****************************************************************************
3552285242Sachim*! \brief itdssXferErrorDMAHandler
3553285242Sachim*
3554285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3555285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_DMA
3556285242Sachim*
3557285242Sachim*  \param  agRoot:            pointer to port instance
3558285242Sachim*  \param  agIORequest:       pointer to I/O request
3559285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3560285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3561285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3562285242Sachim*                             of abort request
3563285242Sachim*  \param  agOtherInfo        Residual count
3564285242Sachim*  \return: None
3565285242Sachim*
3566285242Sachim*
3567285242Sachim*****************************************************************************/
3568285242SachimosGLOBAL void
3569285242SachimitdssXferErrorDMAHandler(
3570285242Sachim                       agsaRoot_t           *agRoot,
3571285242Sachim                       agsaIORequest_t      *agIORequest,
3572285242Sachim                       bit32                agIOStatus,
3573285242Sachim                       bit32                agIOInfoLen,
3574285242Sachim                       void                 *agParam,
3575285242Sachim                       bit32                agOtherInfo
3576285242Sachim                       )
3577285242Sachim{
3578285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3579285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3580285242Sachim  bit32                  intContext = osData->IntContext;
3581285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3582285242Sachim  TI_DBG1(("itdssXferErrorDMAHandler: start\n"));
3583285242Sachim
3584285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3585285242Sachim
3586285242Sachim  ostiInitiatorIOCompleted (
3587285242Sachim                            tiRoot,
3588285242Sachim                            tdIORequestBody->tiIORequest,
3589285242Sachim                            tiIOFailed,
3590285242Sachim                            tiDetailOtherErrorNoRetry,
3591285242Sachim                            agNULL,
3592285242Sachim                            intContext
3593285242Sachim                            );
3594285242Sachim
3595285242Sachim  return;
3596285242Sachim}
3597285242Sachim
3598285242Sachim/*****************************************************************************
3599285242Sachim*! \brief itdssXferErrorCreditTimeoutHandler
3600285242Sachim*
3601285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3602285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_CREDIT_TIMEOUT
3603285242Sachim*
3604285242Sachim*  \param  agRoot:            pointer to port instance
3605285242Sachim*  \param  agIORequest:       pointer to I/O request
3606285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3607285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3608285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3609285242Sachim*                             of abort request
3610285242Sachim*  \param  agOtherInfo        Residual count
3611285242Sachim*  \return: None
3612285242Sachim*
3613285242Sachim*
3614285242Sachim*****************************************************************************/
3615285242SachimosGLOBAL void
3616285242SachimitdssXferErrorCreditTimeoutHandler(
3617285242Sachim                       agsaRoot_t           *agRoot,
3618285242Sachim                       agsaIORequest_t      *agIORequest,
3619285242Sachim                       bit32                agIOStatus,
3620285242Sachim                       bit32                agIOInfoLen,
3621285242Sachim                       void                 *agParam,
3622285242Sachim                       bit32                agOtherInfo
3623285242Sachim                       )
3624285242Sachim{
3625285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3626285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3627285242Sachim  bit32                  intContext = osData->IntContext;
3628285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3629285242Sachim  TI_DBG1(("itdssXferErrorCreditTimeoutHandler: start\n"));
3630285242Sachim
3631285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3632285242Sachim
3633285242Sachim  ostiInitiatorIOCompleted (
3634285242Sachim                            tiRoot,
3635285242Sachim                            tdIORequestBody->tiIORequest,
3636285242Sachim                            tiIOFailed,
3637285242Sachim                            tiDetailOtherError,
3638285242Sachim                            agNULL,
3639285242Sachim                            intContext
3640285242Sachim                            );
3641285242Sachim
3642285242Sachim  return;
3643285242Sachim}
3644285242Sachim
3645285242Sachim/*****************************************************************************
3646285242Sachim*! \brief itdssXferErrorCMDIssueACKNAKTimeoutHandler
3647285242Sachim*
3648285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3649285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT
3650285242Sachim*
3651285242Sachim*  \param  agRoot:            pointer to port instance
3652285242Sachim*  \param  agIORequest:       pointer to I/O request
3653285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3654285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3655285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3656285242Sachim*                             of abort request
3657285242Sachim*  \param  agOtherInfo        Residual count
3658285242Sachim*  \return: None
3659285242Sachim*
3660285242Sachim*
3661285242Sachim*****************************************************************************/
3662285242SachimosGLOBAL void
3663285242SachimitdssXferErrorCMDIssueACKNAKTimeoutHandler(
3664285242Sachim                       agsaRoot_t           *agRoot,
3665285242Sachim                       agsaIORequest_t      *agIORequest,
3666285242Sachim                       bit32                agIOStatus,
3667285242Sachim                       bit32                agIOInfoLen,
3668285242Sachim                       void                 *agParam,
3669285242Sachim                       bit32                agOtherInfo
3670285242Sachim                       )
3671285242Sachim{
3672285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3673285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3674285242Sachim  bit32                  intContext = osData->IntContext;
3675285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3676285242Sachim  TI_DBG1(("itdssXferErrorCMDIssueACKNAKTimeoutHandler: start\n"));
3677285242Sachim
3678285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3679285242Sachim
3680285242Sachim  ostiInitiatorIOCompleted (
3681285242Sachim                            tiRoot,
3682285242Sachim                            tdIORequestBody->tiIORequest,
3683285242Sachim                            tiIOFailed,
3684285242Sachim                            tiDetailOtherError,
3685285242Sachim                            agNULL,
3686285242Sachim                            intContext
3687285242Sachim                            );
3688285242Sachim
3689285242Sachim  return;
3690285242Sachim}
3691285242Sachim
3692285242Sachim/*****************************************************************************
3693285242Sachim*! \brief itdssXferErrorCMDIssueBreakBeforeACKNAKHandler
3694285242Sachim*
3695285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3696285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_CMD_ISSUE_BREAK_BEFORE_ACK_NAK
3697285242Sachim*
3698285242Sachim*  \param  agRoot:            pointer to port instance
3699285242Sachim*  \param  agIORequest:       pointer to I/O request
3700285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3701285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3702285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3703285242Sachim*                             of abort request
3704285242Sachim*  \param  agOtherInfo        Residual count
3705285242Sachim*  \return: None
3706285242Sachim*
3707285242Sachim*
3708285242Sachim*****************************************************************************/
3709285242SachimosGLOBAL void
3710285242SachimitdssXferErrorCMDIssueBreakBeforeACKNAKHandler(
3711285242Sachim                       agsaRoot_t           *agRoot,
3712285242Sachim                       agsaIORequest_t      *agIORequest,
3713285242Sachim                       bit32                agIOStatus,
3714285242Sachim                       bit32                agIOInfoLen,
3715285242Sachim                       void                 *agParam,
3716285242Sachim                       bit32                agOtherInfo
3717285242Sachim                       )
3718285242Sachim{
3719285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3720285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3721285242Sachim  bit32                  intContext = osData->IntContext;
3722285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3723285242Sachim  TI_DBG1(("itdssXferErrorCMDIssueBreakBeforeACKNAKHandler: start\n"));
3724285242Sachim
3725285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3726285242Sachim
3727285242Sachim  ostiInitiatorIOCompleted (
3728285242Sachim                            tiRoot,
3729285242Sachim                            tdIORequestBody->tiIORequest,
3730285242Sachim                            tiIOFailed,
3731285242Sachim                            tiDetailOtherError,
3732285242Sachim                            agNULL,
3733285242Sachim                            intContext
3734285242Sachim                            );
3735285242Sachim
3736285242Sachim  return;
3737285242Sachim}
3738285242Sachim
3739285242Sachim/*****************************************************************************
3740285242Sachim*! \brief itdssXferErrorCMDIssuePhyDownBeforeACKNAKHandler
3741285242Sachim*
3742285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3743285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_CMD_ISSUE_PHY_DOWN_BEFORE_ACK_NAK
3744285242Sachim*
3745285242Sachim*  \param  agRoot:            pointer to port instance
3746285242Sachim*  \param  agIORequest:       pointer to I/O request
3747285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3748285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3749285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3750285242Sachim*                             of abort request
3751285242Sachim*  \param  agOtherInfo        Residual count
3752285242Sachim*  \return: None
3753285242Sachim*
3754285242Sachim*
3755285242Sachim*****************************************************************************/
3756285242SachimosGLOBAL void
3757285242SachimitdssXferErrorCMDIssuePhyDownBeforeACKNAKHandler(
3758285242Sachim                       agsaRoot_t           *agRoot,
3759285242Sachim                       agsaIORequest_t      *agIORequest,
3760285242Sachim                       bit32                agIOStatus,
3761285242Sachim                       bit32                agIOInfoLen,
3762285242Sachim                       void                 *agParam,
3763285242Sachim                       bit32                agOtherInfo
3764285242Sachim                       )
3765285242Sachim{
3766285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3767285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3768285242Sachim  bit32                  intContext = osData->IntContext;
3769285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3770285242Sachim  TI_DBG1(("itdssXferErrorCMDIssuePhyDownBeforeACKNAKHandler: start\n"));
3771285242Sachim
3772285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3773285242Sachim
3774285242Sachim  ostiInitiatorIOCompleted (
3775285242Sachim                            tiRoot,
3776285242Sachim                            tdIORequestBody->tiIORequest,
3777285242Sachim                            tiIOFailed,
3778285242Sachim                            tiDetailOtherError,
3779285242Sachim                            agNULL,
3780285242Sachim                            intContext
3781285242Sachim                            );
3782285242Sachim
3783285242Sachim  return;
3784285242Sachim}
3785285242Sachim
3786285242Sachim/*****************************************************************************
3787285242Sachim*! \brief itdssXferErrorDisruptedPhyDownHandler
3788285242Sachim*
3789285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3790285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_DISRUPTED_PHY_DOWN
3791285242Sachim*
3792285242Sachim*  \param  agRoot:            pointer to port instance
3793285242Sachim*  \param  agIORequest:       pointer to I/O request
3794285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3795285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3796285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3797285242Sachim*                             of abort request
3798285242Sachim*  \param  agOtherInfo        Residual count
3799285242Sachim*  \return: None
3800285242Sachim*
3801285242Sachim*
3802285242Sachim*****************************************************************************/
3803285242SachimosGLOBAL void
3804285242SachimitdssXferErrorDisruptedPhyDownHandler(
3805285242Sachim                       agsaRoot_t           *agRoot,
3806285242Sachim                       agsaIORequest_t      *agIORequest,
3807285242Sachim                       bit32                agIOStatus,
3808285242Sachim                       bit32                agIOInfoLen,
3809285242Sachim                       void                 *agParam,
3810285242Sachim                       bit32                agOtherInfo
3811285242Sachim                       )
3812285242Sachim{
3813285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3814285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3815285242Sachim  bit32                  intContext = osData->IntContext;
3816285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3817285242Sachim  TI_DBG2(("itdssXferErrorDisruptedPhyDownHandler: start\n"));
3818285242Sachim
3819285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3820285242Sachim
3821285242Sachim  ostiInitiatorIOCompleted (
3822285242Sachim                            tiRoot,
3823285242Sachim                            tdIORequestBody->tiIORequest,
3824285242Sachim                            tiIOFailed,
3825285242Sachim                            tiDetailOtherError,
3826285242Sachim                            agNULL,
3827285242Sachim                            intContext
3828285242Sachim                            );
3829285242Sachim
3830285242Sachim  return;
3831285242Sachim}
3832285242Sachim
3833285242Sachim/*****************************************************************************
3834285242Sachim*! \brief itdssXferErrorOffsetMismatchHandler
3835285242Sachim*
3836285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3837285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_OFFSET_MISMATCH
3838285242Sachim*
3839285242Sachim*  \param  agRoot:            pointer to port instance
3840285242Sachim*  \param  agIORequest:       pointer to I/O request
3841285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3842285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3843285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3844285242Sachim*                             of abort request
3845285242Sachim*  \param  agOtherInfo        Residual count
3846285242Sachim*  \return: None
3847285242Sachim*
3848285242Sachim*
3849285242Sachim*****************************************************************************/
3850285242SachimosGLOBAL void
3851285242SachimitdssXferErrorOffsetMismatchHandler(
3852285242Sachim                       agsaRoot_t           *agRoot,
3853285242Sachim                       agsaIORequest_t      *agIORequest,
3854285242Sachim                       bit32                agIOStatus,
3855285242Sachim                       bit32                agIOInfoLen,
3856285242Sachim                       void                 *agParam,
3857285242Sachim                       bit32                agOtherInfo
3858285242Sachim                       )
3859285242Sachim{
3860285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3861285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3862285242Sachim  bit32                  intContext = osData->IntContext;
3863285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3864285242Sachim  TI_DBG1(("itdssXferErrorOffsetMismatchHandler: start\n"));
3865285242Sachim
3866285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3867285242Sachim
3868285242Sachim  ostiInitiatorIOCompleted (
3869285242Sachim                            tiRoot,
3870285242Sachim                            tdIORequestBody->tiIORequest,
3871285242Sachim                            tiIOFailed,
3872285242Sachim                            tiDetailOtherError,
3873285242Sachim                            agNULL,
3874285242Sachim                            intContext
3875285242Sachim                            );
3876285242Sachim
3877285242Sachim  return;
3878285242Sachim}
3879285242Sachim
3880285242Sachim/*****************************************************************************
3881285242Sachim*! \brief itdssXferErrorXferZeroDataLenHandler
3882285242Sachim*
3883285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3884285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN
3885285242Sachim*
3886285242Sachim*  \param  agRoot:            pointer to port instance
3887285242Sachim*  \param  agIORequest:       pointer to I/O request
3888285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3889285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3890285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3891285242Sachim*                             of abort request
3892285242Sachim*  \param  agOtherInfo        Residual count
3893285242Sachim*  \return: None
3894285242Sachim*
3895285242Sachim*
3896285242Sachim*****************************************************************************/
3897285242SachimosGLOBAL void
3898285242SachimitdssXferErrorXferZeroDataLenHandler(
3899285242Sachim                       agsaRoot_t           *agRoot,
3900285242Sachim                       agsaIORequest_t      *agIORequest,
3901285242Sachim                       bit32                agIOStatus,
3902285242Sachim                       bit32                agIOInfoLen,
3903285242Sachim                       void                 *agParam,
3904285242Sachim                       bit32                agOtherInfo
3905285242Sachim                       )
3906285242Sachim{
3907285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3908285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3909285242Sachim  bit32                  intContext = osData->IntContext;
3910285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3911285242Sachim  TI_DBG2(("itdssXferErrorXferZeroDataLenHandler: start\n"));
3912285242Sachim
3913285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3914285242Sachim
3915285242Sachim  ostiInitiatorIOCompleted (
3916285242Sachim                            tiRoot,
3917285242Sachim                            tdIORequestBody->tiIORequest,
3918285242Sachim                            tiIOFailed,
3919285242Sachim                            tiDetailOtherError,
3920285242Sachim                            agNULL,
3921285242Sachim                            intContext
3922285242Sachim                            );
3923285242Sachim
3924285242Sachim  return;
3925285242Sachim}
3926285242Sachim
3927285242Sachim/*****************************************************************************
3928285242Sachim*! \brief itdssXferOpenRetryTimeoutHandler
3929285242Sachim*
3930285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
3931285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_OPEN_RETRY_TIMEOUT
3932285242Sachim*
3933285242Sachim*  \param  agRoot:            pointer to port instance
3934285242Sachim*  \param  agIORequest:       pointer to I/O request
3935285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
3936285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
3937285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
3938285242Sachim*                             of abort request
3939285242Sachim*  \param  agOtherInfo        Residual count
3940285242Sachim*  \return: None
3941285242Sachim*
3942285242Sachim*
3943285242Sachim*****************************************************************************/
3944285242SachimosGLOBAL void
3945285242SachimitdssXferOpenRetryTimeoutHandler(
3946285242Sachim                       agsaRoot_t           *agRoot,
3947285242Sachim                       agsaIORequest_t      *agIORequest,
3948285242Sachim                       bit32                agIOStatus,
3949285242Sachim                       bit32                agIOInfoLen,
3950285242Sachim                       void                 *agParam,
3951285242Sachim                       bit32                agOtherInfo
3952285242Sachim                       )
3953285242Sachim{
3954285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
3955285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
3956285242Sachim  tdsaRoot_t             *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
3957285242Sachim  tdsaContext_t          *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3958285242Sachim  itdsaIni_t             *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
3959285242Sachim  bit32                  intContext = osData->IntContext;
3960285242Sachim  tdIORequestBody_t      *tdIORequestBody;
3961285242Sachim  agsaDevHandle_t        *agDevHandle = agNULL;
3962285242Sachim  tiDeviceHandle_t       *tiDeviceHandle = agNULL;
3963285242Sachim  tdsaDeviceData_t       *oneDeviceData = agNULL;
3964285242Sachim  bit32                  saStatus = AGSA_RC_FAILURE;
3965285242Sachim
3966285242Sachim  TI_DBG2(("itdssXferOpenRetryTimeoutHandler: start\n"));
3967285242Sachim
3968285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3969285242Sachim  tiDeviceHandle = tdIORequestBody->tiDevHandle;
3970285242Sachim  oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
3971285242Sachim  agDevHandle = oneDeviceData->agDevHandle;
3972285242Sachim
3973285242Sachim  if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
3974285242Sachim      oneDeviceData->tdPortContext != agNULL )
3975285242Sachim  {
3976285242Sachim    if (tdIORequestBody->reTries < OPEN_RETRY_RETRIES) /* 10 */
3977285242Sachim    {
3978285242Sachim      saStatus = saSSPStart(agRoot,
3979285242Sachim                            agIORequest,
3980285242Sachim                            tdsaRotateQnumber(tiRoot, oneDeviceData),
3981285242Sachim                            agDevHandle,
3982285242Sachim                            tdIORequestBody->agRequestType,
3983285242Sachim                            &(tdIORequestBody->transport.SAS.agSASRequestBody),
3984285242Sachim                            agNULL,
3985285242Sachim                            &ossaSSPCompleted);
3986285242Sachim
3987285242Sachim      if (saStatus == AGSA_RC_SUCCESS)
3988285242Sachim      {
3989285242Sachim        TI_DBG2(("itdssXferOpenRetryTimeoutHandler: retried\n"));
3990285242Sachim        Initiator->NumIOsActive++;
3991285242Sachim        tdIORequestBody->ioStarted = agTRUE;
3992285242Sachim        tdIORequestBody->ioCompleted = agFALSE;
3993285242Sachim        tdIORequestBody->reTries++;
3994285242Sachim        return;
3995285242Sachim      }
3996285242Sachim      else
3997285242Sachim      {
3998285242Sachim        TI_DBG1(("itdssXferOpenRetryTimeoutHandler: retry failed\n"));
3999285242Sachim        tdIORequestBody->ioStarted = agFALSE;
4000285242Sachim        tdIORequestBody->ioCompleted = agTRUE;
4001285242Sachim        tdIORequestBody->reTries = 0;
4002285242Sachim      }
4003285242Sachim    }
4004285242Sachim    else
4005285242Sachim    {
4006285242Sachim      TI_DBG1(("itdssXferOpenRetryTimeoutHandler: retry is over and fail\n"));
4007285242Sachim      tdIORequestBody->reTries = 0;
4008285242Sachim    }
4009285242Sachim  }
4010285242Sachim  else
4011285242Sachim  {
4012285242Sachim    TI_DBG1(("itdssXferOpenRetryTimeoutHandler: not valid deivce no retry\n"));
4013285242Sachim    tdIORequestBody->reTries = 0;
4014285242Sachim  }
4015285242Sachim  ostiInitiatorIOCompleted(
4016285242Sachim                           tiRoot,
4017285242Sachim                           tdIORequestBody->tiIORequest,
4018285242Sachim                           tiIOFailed,
4019285242Sachim                           tiDetailOtherError,
4020285242Sachim                           agNULL,
4021285242Sachim                           intContext
4022285242Sachim                           );
4023285242Sachim  return;
4024285242Sachim}
4025285242Sachim
4026285242Sachim/*****************************************************************************
4027285242Sachim*! \brief itdssPortInResetHandler
4028285242Sachim*
4029285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4030285242Sachim*            layer with agIOStatus = OSSA_IO_PORT_IN_RESET
4031285242Sachim*
4032285242Sachim*  \param  agRoot:            pointer to port instance
4033285242Sachim*  \param  agIORequest:       pointer to I/O request
4034285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4035285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4036285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4037285242Sachim*                             of abort request
4038285242Sachim*  \param  agOtherInfo        Residual count
4039285242Sachim*  \return: None
4040285242Sachim*
4041285242Sachim*
4042285242Sachim*****************************************************************************/
4043285242SachimosGLOBAL void
4044285242SachimitdssPortInResetHandler(
4045285242Sachim                       agsaRoot_t           *agRoot,
4046285242Sachim                       agsaIORequest_t      *agIORequest,
4047285242Sachim                       bit32                agIOStatus,
4048285242Sachim                       bit32                agIOInfoLen,
4049285242Sachim                       void                 *agParam,
4050285242Sachim                       bit32                agOtherInfo
4051285242Sachim                       )
4052285242Sachim{
4053285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4054285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4055285242Sachim  bit32                  intContext = osData->IntContext;
4056285242Sachim  tdIORequestBody_t      *tdIORequestBody;
4057285242Sachim  TI_DBG2(("itdssPortInResetHandler: start\n"));
4058285242Sachim
4059285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4060285242Sachim
4061285242Sachim  ostiInitiatorIOCompleted (
4062285242Sachim                            tiRoot,
4063285242Sachim                            tdIORequestBody->tiIORequest,
4064285242Sachim                            tiIOFailed,
4065285242Sachim                            tiDetailOtherError,
4066285242Sachim                            agNULL,
4067285242Sachim                            intContext
4068285242Sachim                            );
4069285242Sachim
4070285242Sachim  return;
4071285242Sachim}
4072285242Sachim
4073285242Sachim/*****************************************************************************
4074285242Sachim*! \brief itdssDsNonOperationalHandler
4075285242Sachim*
4076285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4077285242Sachim*            layer with agIOStatus = OSSA_IO_DS_NON_OPERATIONAL
4078285242Sachim*
4079285242Sachim*  \param  agRoot:            pointer to port instance
4080285242Sachim*  \param  agIORequest:       pointer to I/O request
4081285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4082285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4083285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4084285242Sachim*                             of abort request
4085285242Sachim*  \param  agOtherInfo        Residual count
4086285242Sachim*  \return: None
4087285242Sachim*
4088285242Sachim*
4089285242Sachim*****************************************************************************/
4090285242SachimosGLOBAL void
4091285242SachimitdssDsNonOperationalHandler(
4092285242Sachim                       agsaRoot_t           *agRoot,
4093285242Sachim                       agsaIORequest_t      *agIORequest,
4094285242Sachim                       bit32                agIOStatus,
4095285242Sachim                       bit32                agIOInfoLen,
4096285242Sachim                       void                 *agParam,
4097285242Sachim                       bit32                agOtherInfo
4098285242Sachim                       )
4099285242Sachim{
4100285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4101285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4102285242Sachim  bit32                  intContext = osData->IntContext;
4103285242Sachim  tdIORequestBody_t      *tdIORequestBody;
4104285242Sachim  agsaDevHandle_t        *agDevHandle = agNULL;
4105285242Sachim  tiDeviceHandle_t       *tiDeviceHandle = agNULL;
4106285242Sachim  tdsaDeviceData_t       *oneDeviceData = agNULL;
4107285242Sachim
4108285242Sachim
4109285242Sachim  TI_DBG2(("itdssDsNonOperationalHandler: start\n"));
4110285242Sachim
4111285242Sachim
4112285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4113285242Sachim
4114285242Sachim#if 1 /* TBD */
4115285242Sachim  /* let's do it only once ????? */
4116285242Sachim  tiDeviceHandle = tdIORequestBody->tiDevHandle;
4117285242Sachim  oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
4118285242Sachim  agDevHandle = oneDeviceData->agDevHandle;
4119285242Sachim  if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
4120285242Sachim      oneDeviceData->tdPortContext != agNULL )
4121285242Sachim  {
4122285242Sachim    saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
4123285242Sachim  }
4124285242Sachim#endif
4125285242Sachim
4126285242Sachim  ostiInitiatorIOCompleted (
4127285242Sachim                            tiRoot,
4128285242Sachim                            tdIORequestBody->tiIORequest,
4129285242Sachim                            tiIOFailed,
4130285242Sachim                            tiDetailOtherError,
4131285242Sachim                            agNULL,
4132285242Sachim                            intContext
4133285242Sachim                            );
4134285242Sachim
4135285242Sachim  return;
4136285242Sachim}
4137285242Sachim
4138285242Sachim/*****************************************************************************
4139285242Sachim*! \brief itdssDsInRecoveryHandler
4140285242Sachim*
4141285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4142285242Sachim*            layer with agIOStatus = OSSA_IO_DS_IN_RECOVERY
4143285242Sachim*
4144285242Sachim*  \param  agRoot:            pointer to port instance
4145285242Sachim*  \param  agIORequest:       pointer to I/O request
4146285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4147285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4148285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4149285242Sachim*                             of abort request
4150285242Sachim*  \param  agOtherInfo        Residual count
4151285242Sachim*  \return: None
4152285242Sachim*
4153285242Sachim*
4154285242Sachim*****************************************************************************/
4155285242SachimosGLOBAL void
4156285242SachimitdssDsInRecoveryHandler(
4157285242Sachim                       agsaRoot_t           *agRoot,
4158285242Sachim                       agsaIORequest_t      *agIORequest,
4159285242Sachim                       bit32                agIOStatus,
4160285242Sachim                       bit32                agIOInfoLen,
4161285242Sachim                       void                 *agParam,
4162285242Sachim                       bit32                agOtherInfo
4163285242Sachim                       )
4164285242Sachim{
4165285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4166285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4167285242Sachim  bit32                  intContext = osData->IntContext;
4168285242Sachim  tdIORequestBody_t      *tdIORequestBody;
4169285242Sachim  TI_DBG2(("itdssDsInRecoveryHandler: start\n"));
4170285242Sachim
4171285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4172285242Sachim
4173285242Sachim  ostiInitiatorIOCompleted (
4174285242Sachim                            tiRoot,
4175285242Sachim                            tdIORequestBody->tiIORequest,
4176285242Sachim                            tiIOFailed,
4177285242Sachim                            tiDetailOtherError,
4178285242Sachim                            agNULL,
4179285242Sachim                            intContext
4180285242Sachim                            );
4181285242Sachim
4182285242Sachim  return;
4183285242Sachim}
4184285242Sachim
4185285242Sachim/*****************************************************************************
4186285242Sachim*! \brief itdssTmTagNotFoundHandler
4187285242Sachim*
4188285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4189285242Sachim*            layer with agIOStatus = OSSA_IO_TM_TAG_NOT_FOUND
4190285242Sachim*
4191285242Sachim*  \param  agRoot:            pointer to port instance
4192285242Sachim*  \param  agIORequest:       pointer to I/O request
4193285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4194285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4195285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4196285242Sachim*                             of abort request
4197285242Sachim*  \param  agOtherInfo        Residual count
4198285242Sachim*  \return: None
4199285242Sachim*
4200285242Sachim*
4201285242Sachim*****************************************************************************/
4202285242SachimosGLOBAL void
4203285242SachimitdssTmTagNotFoundHandler(
4204285242Sachim                       agsaRoot_t           *agRoot,
4205285242Sachim                       agsaIORequest_t      *agIORequest,
4206285242Sachim                       bit32                agIOStatus,
4207285242Sachim                       bit32                agIOInfoLen,
4208285242Sachim                       void                 *agParam,
4209285242Sachim                       bit32                agOtherInfo
4210285242Sachim                       )
4211285242Sachim{
4212285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4213285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4214285242Sachim  bit32                  intContext = osData->IntContext;
4215285242Sachim  tdIORequestBody_t      *tdIORequestBody;
4216285242Sachim  TI_DBG2(("itdssTmTagNotFoundHandler: start\n"));
4217285242Sachim
4218285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4219285242Sachim
4220285242Sachim  ostiInitiatorIOCompleted (
4221285242Sachim                            tiRoot,
4222285242Sachim                            tdIORequestBody->tiIORequest,
4223285242Sachim                            tiIOFailed,
4224285242Sachim                            tiDetailOtherError,
4225285242Sachim                            agNULL,
4226285242Sachim                            intContext
4227285242Sachim                            );
4228285242Sachim
4229285242Sachim  return;
4230285242Sachim}
4231285242Sachim
4232285242Sachim/*****************************************************************************
4233285242Sachim*! \brief itdssSSPExtIUZeroLenHandler
4234285242Sachim*
4235285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4236285242Sachim*            layer with agIOStatus = OSSA_IO_SSP_EXT_IU_ZERO_LEN_ERROR
4237285242Sachim*
4238285242Sachim*  \param  agRoot:            pointer to port instance
4239285242Sachim*  \param  agIORequest:       pointer to I/O request
4240285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4241285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4242285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4243285242Sachim*                             of abort request
4244285242Sachim*  \param  agOtherInfo        Residual count
4245285242Sachim*  \return: None
4246285242Sachim*
4247285242Sachim*
4248285242Sachim*****************************************************************************/
4249285242SachimosGLOBAL void
4250285242SachimitdssSSPExtIUZeroLenHandler(
4251285242Sachim                       agsaRoot_t           *agRoot,
4252285242Sachim                       agsaIORequest_t      *agIORequest,
4253285242Sachim                       bit32                agIOStatus,
4254285242Sachim                       bit32                agIOInfoLen,
4255285242Sachim                       void                 *agParam,
4256285242Sachim                       bit32                agOtherInfo
4257285242Sachim                       )
4258285242Sachim{
4259285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4260285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4261285242Sachim  bit32                  intContext = osData->IntContext;
4262285242Sachim  tdIORequestBody_t      *tdIORequestBody;
4263285242Sachim  TI_DBG2(("itdssSSPExtIUZeroLenHandler: start\n"));
4264285242Sachim
4265285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4266285242Sachim
4267285242Sachim  ostiInitiatorIOCompleted (
4268285242Sachim                            tiRoot,
4269285242Sachim                            tdIORequestBody->tiIORequest,
4270285242Sachim                            tiIOFailed,
4271285242Sachim                            tiDetailOtherError,
4272285242Sachim                            agNULL,
4273285242Sachim                            intContext
4274285242Sachim                            );
4275285242Sachim
4276285242Sachim  return;
4277285242Sachim}
4278285242Sachim
4279285242Sachim/*****************************************************************************
4280285242Sachim*! \brief itdssXferErrorUnexpectedPhaseHandler
4281285242Sachim*
4282285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4283285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE
4284285242Sachim*
4285285242Sachim*  \param  agRoot:            pointer to port instance
4286285242Sachim*  \param  agIORequest:       pointer to I/O request
4287285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4288285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4289285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4290285242Sachim*                             of abort request
4291285242Sachim*  \param  agOtherInfo        Residual count
4292285242Sachim*  \return: None
4293285242Sachim*
4294285242Sachim*
4295285242Sachim*****************************************************************************/
4296285242SachimosGLOBAL void
4297285242SachimitdssXferErrorUnexpectedPhaseHandler(
4298285242Sachim                       agsaRoot_t           *agRoot,
4299285242Sachim                       agsaIORequest_t      *agIORequest,
4300285242Sachim                       bit32                agIOStatus,
4301285242Sachim                       bit32                agIOInfoLen,
4302285242Sachim                       void                 *agParam,
4303285242Sachim                       bit32                agOtherInfo
4304285242Sachim                       )
4305285242Sachim{
4306285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4307285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4308285242Sachim  bit32                  intContext = osData->IntContext;
4309285242Sachim  tdIORequestBody_t      *tdIORequestBody;
4310285242Sachim  TI_DBG2(("itdssXferErrorUnexpectedPhaseHandler: start\n"));
4311285242Sachim
4312285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4313285242Sachim
4314285242Sachim  ostiInitiatorIOCompleted (
4315285242Sachim                            tiRoot,
4316285242Sachim                            tdIORequestBody->tiIORequest,
4317285242Sachim                            tiIOFailed,
4318285242Sachim                            tiDetailOtherError,
4319285242Sachim                            agNULL,
4320285242Sachim                            intContext
4321285242Sachim                            );
4322285242Sachim
4323285242Sachim  return;
4324285242Sachim}
4325285242Sachim
4326285242Sachim#ifdef REMOVED
4327285242Sachim/*****************************************************************************
4328285242Sachim*! \brief itdssIOUnderFlowWithChkConditionHandler
4329285242Sachim*
4330285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4331285242Sachim*            layer with agIOStatus = OSSA_IO_UNDERFLOW_WITH_CHK_COND
4332285242Sachim*
4333285242Sachim*  \param  agRoot:            pointer to port instance
4334285242Sachim*  \param  agIORequest:       pointer to I/O request
4335285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4336285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4337285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4338285242Sachim*                             of abort request
4339285242Sachim*  \return: None
4340285242Sachim*
4341285242Sachim*
4342285242Sachim*****************************************************************************/
4343285242Sachim/*
4344285242Sachim  How to report SCSI_STAT_CHECK_CONDITION and tiIOUnderRun simultaneoulsy???
4345285242Sachim  ostiInitiatorIOCompleted(
4346285242Sachim                             tiRoot,
4347285242Sachim                             tdIORequestBody->tiIORequest,
4348285242Sachim                             tiIOSuccess,
4349285242Sachim                             SCSI_STAT_CHECK_CONDITION,
4350285242Sachim                             &senseData,
4351285242Sachim                             agTRUE
4352285242Sachim                             );
4353285242Sachim
4354285242Sachim                 vs
4355285242Sachim
4356285242Sachim  ostiInitiatorIOCompleted (
4357285242Sachim                            tiRoot,
4358285242Sachim                            tdIORequestBody->tiIORequest,
4359285242Sachim                            tiIOUnderRun,
4360285242Sachim                            agIOInfoLen,
4361285242Sachim                            agNULL,
4362285242Sachim                            intContext
4363285242Sachim                            );
4364285242Sachim
4365285242Sachim  For now, SCSI_STAT_CHECK_CONDITION is reported until TISA changes (as of 1/6/09)
4366285242Sachim  In other words, this handler is the practically same as itdssIOSuccessHandler()
4367285242Sachim*/
4368285242SachimosGLOBAL void
4369285242SachimitdssIOUnderFlowWithChkConditionHandler(
4370285242Sachim                        agsaRoot_t              *agRoot,
4371285242Sachim                        agsaIORequest_t         *agIORequest,
4372285242Sachim                        bit32                   agIOStatus,
4373285242Sachim                        bit32                   agIOInfoLen,
4374285242Sachim                        void                    *agParam
4375285242Sachim                        )
4376285242Sachim{
4377285242Sachim  tdsaRootOsData_t          *osData = (tdsaRootOsData_t *)agRoot->osData;
4378285242Sachim  tiRoot_t                  *tiRoot = (tiRoot_t *)osData->tiRoot;
4379285242Sachim  tdIORequestBody_t         *tdIORequestBody;
4380285242Sachim  agsaSSPResponseInfoUnit_t agSSPRespIU;
4381285242Sachim  tiSenseData_t             senseData;
4382285242Sachim  bit8                      senseDataPayload[256];
4383285242Sachim  bit8                      respData[128];
4384285242Sachim  bit32                     scsi_status;
4385285242Sachim  bit32                     senseLen;
4386285242Sachim  bit32                     respLen;
4387285242Sachim  bit32                     data_status;
4388285242Sachim  bit32                     i;
4389285242Sachim  tiDeviceHandle_t          *tiDeviceHandle = agNULL;
4390285242Sachim  tdsaDeviceData_t          *oneDeviceData = agNULL;
4391285242Sachim
4392285242Sachim  TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: start\n"));
4393285242Sachim  TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: agIOInfoLen 0x%x\n", agIOInfoLen));
4394285242Sachim
4395285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4396285242Sachim
4397285242Sachim  tdIORequestBody->ioCompleted = agTRUE;
4398285242Sachim  tdIORequestBody->ioStarted = agFALSE;
4399285242Sachim
4400285242Sachim  /*
4401285242Sachim    agIOInfoLen must be >= sizeof(agsaSSPResponseInfoUnit_t), which is minimum
4402285242Sachim    date length
4403285242Sachim  */
4404285242Sachim  if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t))
4405285242Sachim  {
4406285242Sachim    TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: First agIOInfoLen does not match!!!\n"));
4407285242Sachim    TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: First agIOInfoLen 0x%x IU 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t)));
4408285242Sachim    ostiInitiatorIOCompleted(
4409285242Sachim                             tiRoot,
4410285242Sachim                             tdIORequestBody->tiIORequest, /* tiIORequest */
4411285242Sachim                             tiIOFailed,
4412285242Sachim                             tiDetailOtherError,
4413285242Sachim                             agNULL,
4414285242Sachim                             agTRUE /* intContext; is not being used */
4415285242Sachim                             );
4416285242Sachim    return;
4417285242Sachim  }
4418285242Sachim  /* reads agsaSSPResponseInfoUnit_t */
4419285242Sachim  saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
4420285242Sachim
4421285242Sachim  data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
4422285242Sachim  scsi_status = agSSPRespIU.status;
4423285242Sachim  /* endianess is invovled here */
4424285242Sachim  senseLen = SA_SSPRESP_GET_SENSEDATALEN(&agSSPRespIU);
4425285242Sachim  respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
4426285242Sachim
4427285242Sachim  TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: dataPres=%x\n", data_status));
4428285242Sachim  TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: scsi status=0x%x, senselen=0x%x resplen 0x%x\n", scsi_status, senseLen, respLen));
4429285242Sachim
4430285242Sachim  /*
4431285242Sachim    sanity check: do not go beyond of agIOInfoLen. if happens, return error
4432285242Sachim    agIOInfoLen >= sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen -> OK
4433285242Sachim    because frame must be divisible by 4, so there can be extra padding
4434285242Sachim    agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen -> NOT OK
4435285242Sachim  */
4436285242Sachim  if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen)
4437285242Sachim  {
4438285242Sachim    TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: Second agIOInfoLen does not match!!!\n"));
4439285242Sachim    TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: Second agIOInfoLen 0x%x IU 0x%x senselen 0x%x resplen 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t), senseLen, respLen));
4440285242Sachim
4441285242Sachim    ostiInitiatorIOCompleted(
4442285242Sachim                             tiRoot,
4443285242Sachim                             tdIORequestBody->tiIORequest, /* tiIORequest */
4444285242Sachim                             tiIOFailed,
4445285242Sachim                             tiDetailOtherError,
4446285242Sachim                             agNULL,
4447285242Sachim                             agTRUE /* intContext; is not being used */
4448285242Sachim                             );
4449285242Sachim    return;
4450285242Sachim  }
4451285242Sachim
4452285242Sachim  /* reads response data */
4453285242Sachim  saFrameReadBlock(agRoot, agParam,
4454285242Sachim                   sizeof(agsaSSPResponseInfoUnit_t),
4455285242Sachim                   respData, respLen);
4456285242Sachim  /* reads sense data */
4457285242Sachim  saFrameReadBlock(agRoot, agParam,
4458285242Sachim                   sizeof(agsaSSPResponseInfoUnit_t)
4459285242Sachim                   + respLen,
4460285242Sachim                   senseDataPayload, senseLen);
4461285242Sachim
4462285242Sachim  if (data_status == 0)
4463285242Sachim  {
4464285242Sachim    /* NO_DATA */
4465285242Sachim    TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: no data\n"));
4466285242Sachim
4467285242Sachim    ostiInitiatorIOCompleted(
4468285242Sachim                             tiRoot,
4469285242Sachim                             tdIORequestBody->tiIORequest, /* tiIORequest */
4470285242Sachim                             tiIOSuccess,
4471285242Sachim                             scsi_status,
4472285242Sachim                             agNULL,
4473285242Sachim                             agTRUE /* intContext; is not being used */
4474285242Sachim                             );
4475285242Sachim
4476285242Sachim    return;
4477285242Sachim  }
4478285242Sachim
4479285242Sachim  if (data_status == 1)
4480285242Sachim  {
4481285242Sachim    /* RESPONSE_DATA */
4482285242Sachim    TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: response data \n"));
4483285242Sachim
4484285242Sachim    ostiInitiatorIOCompleted(
4485285242Sachim                             tiRoot,
4486285242Sachim                             tdIORequestBody->tiIORequest, /* tiIORequest */
4487285242Sachim                             tiIOSuccess,
4488285242Sachim                             0,
4489285242Sachim                             agNULL,
4490285242Sachim                             agTRUE /* intContext; is not being used */
4491285242Sachim                             );
4492285242Sachim    return;
4493285242Sachim  }
4494285242Sachim
4495285242Sachim  if (data_status == 2)
4496285242Sachim  {
4497285242Sachim    /* SENSE_DATA */
4498285242Sachim    TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: sense data \n"));
4499285242Sachim
4500285242Sachim    senseData.senseData = &senseDataPayload;
4501285242Sachim    senseData.senseLen = MIN(256, senseLen);
4502285242Sachim    /* debugging */
4503285242Sachim    tdhexdump("ResponseIU I", (bit8 *)&agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
4504285242Sachim
4505285242Sachim    tdhexdump("sense data I", (bit8 *)senseDataPayload, senseLen);
4506285242Sachim    tdhexdump("sense data II", (bit8 *)senseData.senseData, senseData.senseLen);
4507285242Sachim
4508285242Sachim    if (senseDataPayload[2] == SCSI_SENSE_KEY_RECOVERED_ERROR)
4509285242Sachim    {
4510285242Sachim      Initiator->SenseKeyCounter.SoftError ++;
4511285242Sachim    }
4512285242Sachim    else if (senseDataPayload[2] == SCSI_SENSE_KEY_NOT_READY)
4513285242Sachim    {
4514285242Sachim      Initiator->SenseKeyCounter.MediumNotReady++;
4515285242Sachim    }
4516285242Sachim    else if (senseDataPayload[2] == SCSI_SENSE_KEY_MEDIUM_ERROR)
4517285242Sachim    {
4518285242Sachim      Initiator->SenseKeyCounter.MediumError++;
4519285242Sachim    }
4520285242Sachim    else if (senseDataPayload[2] == SCSI_SENSE_KEY_HARDWARE_ERROR)
4521285242Sachim    {
4522285242Sachim      Initiator->SenseKeyCounter.HardwareError++;
4523285242Sachim    }
4524285242Sachim    else if (senseDataPayload[2] == SCSI_SENSE_KEY_ILLEGAL_REQUEST)
4525285242Sachim    {
4526285242Sachim      Initiator->SenseKeyCounter.IllegalRequest++;
4527285242Sachim    }
4528285242Sachim    else if (senseDataPayload[2] == SCSI_SENSE_KEY_UNIT_ATTENTION)
4529285242Sachim    {
4530285242Sachim      Initiator->SenseKeyCounter.UnitAttention++;
4531285242Sachim    }
4532285242Sachim    else if (senseDataPayload[2] == SCSI_SENSE_KEY_ABORTED_COMMAND)
4533285242Sachim    {
4534285242Sachim      Initiator->SenseKeyCounter.AbortCommand++;
4535285242Sachim    }
4536285242Sachim    else
4537285242Sachim    {
4538285242Sachim      Initiator->SenseKeyCounter.OtherKeyType++;
4539285242Sachim    }
4540285242Sachim
4541285242Sachim    /* when ASQ and ASCQ 0x04 0x11, does saLocalPhyControl for notify spinup */
4542285242Sachim    if ((senseDataPayload[12] == 0x04 && senseDataPayload[13] == 0x11))
4543285242Sachim    {
4544285242Sachim      TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: sending notfify spinup\n"));
4545285242Sachim      tiDeviceHandle = tdIORequestBody->tiDevHandle;
4546285242Sachim      oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
4547285242Sachim      if (oneDeviceData->directlyAttached == agTRUE)
4548285242Sachim      {
4549285242Sachim        for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
4550285242Sachim        {
4551285242Sachim          saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
4552285242Sachim        }
4553285242Sachim      }
4554285242Sachim    }
4555285242Sachim    ostiInitiatorIOCompleted(
4556285242Sachim                             tiRoot,
4557285242Sachim                             /* tiIORequest */
4558285242Sachim                             tdIORequestBody->tiIORequest,
4559285242Sachim                             tiIOSuccess,
4560285242Sachim                             scsi_status,
4561285242Sachim                             &senseData,
4562285242Sachim                             agTRUE /* intContext; is not being used */
4563285242Sachim                             );
4564285242Sachim    return;
4565285242Sachim  }
4566285242Sachim  if (data_status == 3)
4567285242Sachim  {
4568285242Sachim    /* RESERVED */
4569285242Sachim    TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: reserved wrong!!!\n"));
4570285242Sachim    ostiInitiatorIOCompleted(
4571285242Sachim                             tiRoot,
4572285242Sachim                             tdIORequestBody->tiIORequest, /* tiIORequest */
4573285242Sachim                             tiIOFailed,
4574285242Sachim                             scsi_status,
4575285242Sachim                             agNULL,
4576285242Sachim                             agTRUE /* intContext; is not being used */
4577285242Sachim                             );
4578285242Sachim    return;
4579285242Sachim  }
4580285242Sachim
4581285242Sachim
4582285242Sachim  return;
4583285242Sachim}
4584285242Sachim#endif
4585285242Sachim
4586285242Sachim/*****************************************************************************
4587285242Sachim*! \brief itdssXferOpenRetryBackoffThresholdReachedHandler
4588285242Sachim*
4589285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4590285242Sachim*            layer with agIOStatus =
4591285242Sachim*            OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED
4592285242Sachim*
4593285242Sachim*  \param  agRoot:            pointer to port instance
4594285242Sachim*  \param  agIORequest:       pointer to I/O request
4595285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4596285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4597285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4598285242Sachim*                             of abort request
4599285242Sachim*  \param  agOtherInfo        Residual count
4600285242Sachim*  \return: None
4601285242Sachim*
4602285242Sachim*
4603285242Sachim*****************************************************************************/
4604285242SachimosGLOBAL void
4605285242SachimitdssXferOpenRetryBackoffThresholdReachedHandler(
4606285242Sachim                                                 agsaRoot_t           *agRoot,
4607285242Sachim                                                 agsaIORequest_t      *agIORequest,
4608285242Sachim                                                 bit32                agIOStatus,
4609285242Sachim                                                 bit32                agIOInfoLen,
4610285242Sachim                                                 void                 *agParam,
4611285242Sachim                                                 bit32                agOtherInfo
4612285242Sachim                                                )
4613285242Sachim{
4614285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4615285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4616285242Sachim  bit32                  intContext = osData->IntContext;
4617285242Sachim  tdIORequestBody_t      *tdIORequestBody;
4618285242Sachim  TI_DBG2(("itdssXferOpenRetryBackoffThresholdReachedHandler: start\n"));
4619285242Sachim
4620285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4621285242Sachim
4622285242Sachim  ostiInitiatorIOCompleted (
4623285242Sachim                            tiRoot,
4624285242Sachim                            tdIORequestBody->tiIORequest,
4625285242Sachim                            tiIOFailed,
4626285242Sachim                            tiDetailOtherError,
4627285242Sachim                            agNULL,
4628285242Sachim                            intContext
4629285242Sachim                            );
4630285242Sachim
4631285242Sachim  return;
4632285242Sachim}
4633285242Sachim
4634285242Sachim/*****************************************************************************
4635285242Sachim*! \brief itdssOpenCnxErrorItNexusLossOpenTmoHandler
4636285242Sachim*
4637285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4638285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO
4639285242Sachim*
4640285242Sachim*  \param  agRoot:            pointer to port instance
4641285242Sachim*  \param  agIORequest:       pointer to I/O request
4642285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4643285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4644285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4645285242Sachim*                             of abort request
4646285242Sachim*  \param  agOtherInfo        Residual count
4647285242Sachim*  \return: None
4648285242Sachim*
4649285242Sachim*
4650285242Sachim*****************************************************************************/
4651285242SachimosGLOBAL void
4652285242SachimitdssOpenCnxErrorItNexusLossOpenTmoHandler(
4653285242Sachim                                           agsaRoot_t           *agRoot,
4654285242Sachim                                           agsaIORequest_t      *agIORequest,
4655285242Sachim                                           bit32                agIOStatus,
4656285242Sachim                                           bit32                agIOInfoLen,
4657285242Sachim                                           void                 *agParam,
4658285242Sachim                                           bit32                agOtherInfo
4659285242Sachim                                          )
4660285242Sachim{
4661285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4662285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4663285242Sachim  bit32                  intContext = osData->IntContext;
4664285242Sachim  tdIORequestBody_t      *tdIORequestBody;
4665285242Sachim  TI_DBG2(("itdssOpenCnxErrorItNexusLossOpenTmoHandler: start\n"));
4666285242Sachim
4667285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4668285242Sachim
4669285242Sachim  ostiInitiatorIOCompleted (
4670285242Sachim                            tiRoot,
4671285242Sachim                            tdIORequestBody->tiIORequest,
4672285242Sachim                            tiIOFailed,
4673285242Sachim                            tiDetailOtherError,
4674285242Sachim                            agNULL,
4675285242Sachim                            intContext
4676285242Sachim                            );
4677285242Sachim
4678285242Sachim  return;
4679285242Sachim}
4680285242Sachim
4681285242Sachim/*****************************************************************************
4682285242Sachim*! \brief itdssOpenCnxErrorItNexusLossNoDestHandler
4683285242Sachim*
4684285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4685285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST
4686285242Sachim*
4687285242Sachim*  \param  agRoot:            pointer to port instance
4688285242Sachim*  \param  agIORequest:       pointer to I/O request
4689285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4690285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4691285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4692285242Sachim*                             of abort request
4693285242Sachim*  \param  agOtherInfo        Residual count
4694285242Sachim*  \return: None
4695285242Sachim*
4696285242Sachim*
4697285242Sachim*****************************************************************************/
4698285242SachimosGLOBAL void
4699285242SachimitdssOpenCnxErrorItNexusLossNoDestHandler(
4700285242Sachim                                          agsaRoot_t           *agRoot,
4701285242Sachim                                          agsaIORequest_t      *agIORequest,
4702285242Sachim                                          bit32                agIOStatus,
4703285242Sachim                                          bit32                agIOInfoLen,
4704285242Sachim                                          void                 *agParam,
4705285242Sachim                                          bit32                agOtherInfo
4706285242Sachim                                         )
4707285242Sachim{
4708285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4709285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4710285242Sachim  bit32                  intContext = osData->IntContext;
4711285242Sachim  tdIORequestBody_t      *tdIORequestBody;
4712285242Sachim  TI_DBG2(("itdssOpenCnxErrorItNexusLossNoDestHandler: start\n"));
4713285242Sachim
4714285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4715285242Sachim
4716285242Sachim  ostiInitiatorIOCompleted (
4717285242Sachim                            tiRoot,
4718285242Sachim                            tdIORequestBody->tiIORequest,
4719285242Sachim                            tiIOFailed,
4720285242Sachim                            tiDetailOtherError,
4721285242Sachim                            agNULL,
4722285242Sachim                            intContext
4723285242Sachim                            );
4724285242Sachim
4725285242Sachim  return;
4726285242Sachim}
4727285242Sachim
4728285242Sachim/*****************************************************************************
4729285242Sachim*! \brief itdssOpenCnxErrorItNexusLossOpenCollideHandler
4730285242Sachim*
4731285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4732285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE
4733285242Sachim*
4734285242Sachim*  \param  agRoot:            pointer to port instance
4735285242Sachim*  \param  agIORequest:       pointer to I/O request
4736285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4737285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4738285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4739285242Sachim*                             of abort request
4740285242Sachim*  \param  agOtherInfo        Residual count
4741285242Sachim*  \return: None
4742285242Sachim*
4743285242Sachim*
4744285242Sachim*****************************************************************************/
4745285242SachimosGLOBAL void
4746285242SachimitdssOpenCnxErrorItNexusLossOpenCollideHandler(
4747285242Sachim                                               agsaRoot_t           *agRoot,
4748285242Sachim                                               agsaIORequest_t      *agIORequest,
4749285242Sachim                                               bit32                agIOStatus,
4750285242Sachim                                               bit32                agIOInfoLen,
4751285242Sachim                                               void                 *agParam,
4752285242Sachim                                               bit32                agOtherInfo
4753285242Sachim                                              )
4754285242Sachim{
4755285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4756285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4757285242Sachim  bit32                  intContext = osData->IntContext;
4758285242Sachim  tdIORequestBody_t      *tdIORequestBody;
4759285242Sachim  TI_DBG2(("itdssOpenCnxErrorItNexusLossOpenCollideHandler: start\n"));
4760285242Sachim
4761285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4762285242Sachim
4763285242Sachim  ostiInitiatorIOCompleted (
4764285242Sachim                            tiRoot,
4765285242Sachim                            tdIORequestBody->tiIORequest,
4766285242Sachim                            tiIOFailed,
4767285242Sachim                            tiDetailOtherError,
4768285242Sachim                            agNULL,
4769285242Sachim                            intContext
4770285242Sachim                            );
4771285242Sachim
4772285242Sachim  return;
4773285242Sachim}
4774285242Sachim
4775285242Sachim/*****************************************************************************
4776285242Sachim*! \brief itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler
4777285242Sachim*
4778285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4779285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED
4780285242Sachim*
4781285242Sachim*  \param  agRoot:            pointer to port instance
4782285242Sachim*  \param  agIORequest:       pointer to I/O request
4783285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4784285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4785285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4786285242Sachim*                             of abort request
4787285242Sachim*  \param  agOtherInfo        Residual count
4788285242Sachim*  \return: None
4789285242Sachim*
4790285242Sachim*
4791285242Sachim*****************************************************************************/
4792285242SachimosGLOBAL void
4793285242SachimitdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler(
4794285242Sachim                                                      agsaRoot_t           *agRoot,
4795285242Sachim                                                      agsaIORequest_t      *agIORequest,
4796285242Sachim                                                      bit32                agIOStatus,
4797285242Sachim                                                      bit32                agIOInfoLen,
4798285242Sachim                                                      void                 *agParam,
4799285242Sachim                                                      bit32                agOtherInfo
4800285242Sachim                                                     )
4801285242Sachim{
4802285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4803285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4804285242Sachim  bit32                  intContext = osData->IntContext;
4805285242Sachim  tdIORequestBody_t      *tdIORequestBody;
4806285242Sachim  TI_DBG2(("itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler: start\n"));
4807285242Sachim
4808285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4809285242Sachim
4810285242Sachim  ostiInitiatorIOCompleted (
4811285242Sachim                            tiRoot,
4812285242Sachim                            tdIORequestBody->tiIORequest,
4813285242Sachim                            tiIOFailed,
4814285242Sachim                            tiDetailOtherError,
4815285242Sachim                            agNULL,
4816285242Sachim                            intContext
4817285242Sachim                            );
4818285242Sachim
4819285242Sachim  return;
4820285242Sachim}
4821285242Sachim
4822285242Sachim/*****************************************************************************
4823285242Sachim*! \brief itdssEncryptionHandler
4824285242Sachim*
4825285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS lower
4826285242Sachim*            layer with any encryption specific agIOStatus.
4827285242Sachim*
4828285242Sachim*  \param  agRoot:            pointer to port instance
4829285242Sachim*  \param  agIORequest:       pointer to I/O request
4830285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4831285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4832285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4833285242Sachim*                             of abort request
4834285242Sachim*  \return: None
4835285242Sachim*
4836285242Sachim*
4837285242Sachim*****************************************************************************/
4838285242SachimosGLOBAL void
4839285242SachimitdssEncryptionHandler (
4840285242Sachim                       agsaRoot_t              *agRoot,
4841285242Sachim                       agsaIORequest_t         *agIORequest,
4842285242Sachim                       bit32                   agIOStatus,
4843285242Sachim                       bit32                   agIOInfoLen,
4844285242Sachim                       void                    *agParam,
4845285242Sachim                       bit32                   agOtherInfo
4846285242Sachim                       )
4847285242Sachim{
4848285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4849285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4850285242Sachim  bit32                  intContext = osData->IntContext;
4851285242Sachim  bit32                  errorDetail = tiDetailOtherError;
4852285242Sachim  tdIORequestBody_t      *tdIORequestBody;
4853285242Sachim  TI_DBG1(("itdssEncryptionHandler: start\n"));
4854285242Sachim  TI_DBG1(("itdssEncryptionHandler: agIOStatus 0x%x\n", agIOStatus));
4855285242Sachim
4856285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4857285242Sachim
4858285242Sachim  switch (agIOStatus)
4859285242Sachim  {
4860285242Sachim  case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
4861285242Sachim      TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS\n"));
4862285242Sachim      errorDetail = tiDetailDekKeyCacheMiss;
4863285242Sachim      break;
4864285242Sachim  case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID:
4865285242Sachim      TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID\n"));
4866285242Sachim      errorDetail = tiDetailCipherModeInvalid;
4867285242Sachim      break;
4868285242Sachim  case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH:
4869285242Sachim      TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH\n"));
4870285242Sachim      errorDetail = tiDetailDekIVMismatch;
4871285242Sachim      break;
4872285242Sachim  case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR:
4873285242Sachim      TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR\n"));
4874285242Sachim      errorDetail = tiDetailDekRamInterfaceError;
4875285242Sachim      break;
4876285242Sachim  case OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS:
4877285242Sachim      TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS\n"));
4878285242Sachim      errorDetail = tiDetailDekIndexOutofBounds;
4879285242Sachim      break;
4880285242Sachim  case OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE:
4881285242Sachim      TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE\n"));
4882285242Sachim      errorDetail = tiDetailOtherError;
4883285242Sachim      break;
4884285242Sachim  default:
4885285242Sachim      TI_DBG1(("itdssEncryptionHandler: other error!!! 0x%x\n", agIOStatus));
4886285242Sachim      errorDetail = tiDetailOtherError;
4887285242Sachim      break;
4888285242Sachim  }
4889285242Sachim
4890285242Sachim  ostiInitiatorIOCompleted (
4891285242Sachim                            tiRoot,
4892285242Sachim                            tdIORequestBody->tiIORequest,
4893285242Sachim                            tiIOEncryptError,
4894285242Sachim                            errorDetail,
4895285242Sachim                            agNULL,
4896285242Sachim                            intContext
4897285242Sachim                            );
4898285242Sachim  return;
4899285242Sachim}
4900285242Sachim
4901285242Sachim/*****************************************************************************
4902285242Sachim*! \brief itdssDifHandler
4903285242Sachim*
4904285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4905285242Sachim*            layer with any DIF specific agIOStatus
4906285242Sachim*
4907285242Sachim*  \param  agRoot:            pointer to port instance
4908285242Sachim*  \param  agIORequest:       pointer to I/O request
4909285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4910285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4911285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4912285242Sachim*                             of abort request
4913285242Sachim*  \param  agOtherInfo        Residual count
4914285242Sachim*  \return: None
4915285242Sachim*
4916285242Sachim*
4917285242Sachim*****************************************************************************/
4918285242SachimosGLOBAL void
4919285242SachimitdssDifHandler(
4920285242Sachim                agsaRoot_t           *agRoot,
4921285242Sachim                agsaIORequest_t      *agIORequest,
4922285242Sachim                bit32                agIOStatus,
4923285242Sachim                bit32                agIOInfoLen,
4924285242Sachim                void                 *agParam,
4925285242Sachim                bit32                agOtherInfo
4926285242Sachim               )
4927285242Sachim{
4928285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4929285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4930285242Sachim  bit32                  intContext = osData->IntContext;
4931285242Sachim  bit32                  errorDetail = tiDetailOtherError;
4932285242Sachim  tdIORequestBody_t      *tdIORequestBody;
4933285242Sachim#ifdef  TD_DEBUG_ENABLE
4934285242Sachim  agsaDifDetails_t       *DifDetail;
4935285242Sachim#endif
4936285242Sachim
4937285242Sachim  TI_DBG1(("itdssDifHandler: start\n"));
4938285242Sachim  TI_DBG1(("itdssDifHandler: agIOStatus 0x%x\n", agIOStatus));
4939285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4940285242Sachim#ifdef  TD_DEBUG_ENABLE
4941285242Sachim  DifDetail = (agsaDifDetails_t *)agParam;
4942285242Sachim#endif
4943285242Sachim  switch (agIOStatus)
4944285242Sachim  {
4945285242Sachim  case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
4946285242Sachim      errorDetail = tiDetailDifMismatch;
4947285242Sachim      TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_MISMATCH\n"));
4948285242Sachim      break;
4949285242Sachim  case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
4950285242Sachim      errorDetail = tiDetailDifAppTagMismatch;
4951285242Sachim      TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH\n"));
4952285242Sachim      break;
4953285242Sachim  case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
4954285242Sachim      errorDetail = tiDetailDifRefTagMismatch;
4955285242Sachim      TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH\n"));
4956285242Sachim      break;
4957285242Sachim  case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
4958285242Sachim      errorDetail = tiDetailDifCrcMismatch;
4959285242Sachim      TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH\n"));
4960285242Sachim      break;
4961285242Sachim  default:
4962285242Sachim      errorDetail = tiDetailOtherError;
4963285242Sachim      TI_DBG1(("itdssDifHandler: other error!!! 0x%x\n", agIOStatus));
4964285242Sachim      break;
4965285242Sachim  }
4966285242Sachim  TI_DBG1(("itdssDifHandler: DIF detail UpperLBA 0x%08x LowerLBA 0x%08x\n", DifDetail->UpperLBA, DifDetail->LowerLBA));
4967285242Sachim  ostiInitiatorIOCompleted (
4968285242Sachim                            tiRoot,
4969285242Sachim                            tdIORequestBody->tiIORequest,
4970285242Sachim                            tiIODifError,
4971285242Sachim                            errorDetail,
4972285242Sachim                            agNULL,
4973285242Sachim                            intContext
4974285242Sachim                            );
4975285242Sachim  return;
4976285242Sachim}
4977285242Sachim
4978285242Sachim/*****************************************************************************
4979285242Sachim*! \brief itdssIOResourceUnavailableHandler
4980285242Sachim*
4981285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
4982285242Sachim*            layer with agIOStatus = OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE
4983285242Sachim*
4984285242Sachim*  \param  agRoot:            pointer to port instance
4985285242Sachim*  \param  agIORequest:       pointer to I/O request
4986285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
4987285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
4988285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
4989285242Sachim*                             of abort request
4990285242Sachim*  \param  agOtherInfo        Residual count
4991285242Sachim*  \return: None
4992285242Sachim*
4993285242Sachim*
4994285242Sachim*****************************************************************************/
4995285242SachimosGLOBAL void
4996285242SachimitdssIOResourceUnavailableHandler(
4997285242Sachim                                  agsaRoot_t              *agRoot,
4998285242Sachim                                  agsaIORequest_t         *agIORequest,
4999285242Sachim                                  bit32                   agIOStatus,
5000285242Sachim                                  bit32                   agIOInfoLen,
5001285242Sachim                                  void                    *agParam,
5002285242Sachim                                  bit32                   agOtherInfo
5003285242Sachim                                 )
5004285242Sachim{
5005285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
5006285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
5007285242Sachim  bit32                  intContext = osData->IntContext;
5008285242Sachim  tdIORequestBody_t      *tdIORequestBody;
5009285242Sachim  TI_DBG2(("itdssIOResourceUnavailableHandler: start\n"));
5010285242Sachim  TI_DBG2(("itdssIOResourceUnavailableHandler: agIOStatus 0x%x\n", agIOStatus));
5011285242Sachim
5012285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5013285242Sachim
5014285242Sachim  ostiInitiatorIOCompleted (
5015285242Sachim                            tiRoot,
5016285242Sachim                            tdIORequestBody->tiIORequest,
5017285242Sachim                            tiIOFailed,
5018285242Sachim                            tiDetailBusy,
5019285242Sachim                            agNULL,
5020285242Sachim                            intContext
5021285242Sachim                            );
5022285242Sachim  return;
5023285242Sachim}
5024285242Sachim/*****************************************************************************
5025285242Sachim*! \brief itdssIORQEBusyFullHandler
5026285242Sachim*
5027285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
5028285242Sachim*            layer with agIOStatus = OSSA_MPI_IO_RQE_BUSY_FULL
5029285242Sachim*
5030285242Sachim*  \param  agRoot:            pointer to port instance
5031285242Sachim*  \param  agIORequest:       pointer to I/O request
5032285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
5033285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
5034285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
5035285242Sachim*                             of abort request
5036285242Sachim*  \param  agOtherInfo        Residual count
5037285242Sachim*  \return: None
5038285242Sachim*
5039285242Sachim*
5040285242Sachim*****************************************************************************/
5041285242SachimosGLOBAL void
5042285242SachimitdssIORQEBusyFullHandler(
5043285242Sachim                                  agsaRoot_t              *agRoot,
5044285242Sachim                                  agsaIORequest_t         *agIORequest,
5045285242Sachim                                  bit32                   agIOStatus,
5046285242Sachim                                  bit32                   agIOInfoLen,
5047285242Sachim                                  void                    *agParam,
5048285242Sachim                                  bit32                   agOtherInfo
5049285242Sachim                                 )
5050285242Sachim{
5051285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
5052285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
5053285242Sachim  bit32                  intContext = osData->IntContext;
5054285242Sachim  tdIORequestBody_t      *tdIORequestBody;
5055285242Sachim  TI_DBG2(("itdssIORQEBusyFullHandler: start\n"));
5056285242Sachim  TI_DBG2(("itdssIORQEBusyFullHandler: agIOStatus 0x%x\n", agIOStatus));
5057285242Sachim
5058285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5059285242Sachim
5060285242Sachim  ostiInitiatorIOCompleted (
5061285242Sachim                            tiRoot,
5062285242Sachim                            tdIORequestBody->tiIORequest,
5063285242Sachim                            tiIOFailed,
5064285242Sachim                            tiDetailBusy,
5065285242Sachim                            agNULL,
5066285242Sachim                            intContext
5067285242Sachim                            );
5068285242Sachim  return;
5069285242Sachim}
5070285242Sachim
5071285242Sachim/*****************************************************************************
5072285242Sachim*! \brief itdssXferErrorInvalidSSPRspFrameHandler
5073285242Sachim*
5074285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
5075285242Sachim*            layer with agIOStatus = OSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME
5076285242Sachim*
5077285242Sachim*  \param  agRoot:            pointer to port instance
5078285242Sachim*  \param  agIORequest:       pointer to I/O request
5079285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
5080285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
5081285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
5082285242Sachim*                             of abort request
5083285242Sachim*  \param  agOtherInfo        Residual count
5084285242Sachim*  \return: None
5085285242Sachim*
5086285242Sachim*
5087285242Sachim*****************************************************************************/
5088285242SachimosGLOBAL void
5089285242SachimitdssXferErrorInvalidSSPRspFrameHandler(
5090285242Sachim                                  agsaRoot_t              *agRoot,
5091285242Sachim                                  agsaIORequest_t         *agIORequest,
5092285242Sachim                                  bit32                   agIOStatus,
5093285242Sachim                                  bit32                   agIOInfoLen,
5094285242Sachim                                  void                    *agParam,
5095285242Sachim                                  bit32                   agOtherInfo
5096285242Sachim                                 )
5097285242Sachim{
5098285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
5099285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
5100285242Sachim  bit32                  intContext = osData->IntContext;
5101285242Sachim  tdIORequestBody_t      *tdIORequestBody;
5102285242Sachim  TI_DBG2(("itdssXferErrorInvalidSSPRspFrameHandler: start\n"));
5103285242Sachim  TI_DBG2(("itdssXferErrorInvalidSSPRspFrameHandler: agIOStatus 0x%x\n", agIOStatus));
5104285242Sachim
5105285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5106285242Sachim
5107285242Sachim  ostiInitiatorIOCompleted (
5108285242Sachim                            tiRoot,
5109285242Sachim                            tdIORequestBody->tiIORequest,
5110285242Sachim                            tiIOFailed,
5111285242Sachim                            tiDetailOtherError,
5112285242Sachim                            agNULL,
5113285242Sachim                            intContext
5114285242Sachim                            );
5115285242Sachim  return;
5116285242Sachim}
5117285242Sachim
5118285242Sachim/*****************************************************************************
5119285242Sachim*! \brief itdssXferErrorEOBDataOverrunHandler
5120285242Sachim*
5121285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
5122285242Sachim*            layer with agIOStatus = OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN
5123285242Sachim*
5124285242Sachim*  \param  agRoot:            pointer to port instance
5125285242Sachim*  \param  agIORequest:       pointer to I/O request
5126285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
5127285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
5128285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
5129285242Sachim*                             of abort request
5130285242Sachim*  \param  agOtherInfo        Residual count
5131285242Sachim*  \return: None
5132285242Sachim*
5133285242Sachim*
5134285242Sachim*****************************************************************************/
5135285242SachimosGLOBAL void
5136285242SachimitdssXferErrorEOBDataOverrunHandler(
5137285242Sachim                                  agsaRoot_t              *agRoot,
5138285242Sachim                                  agsaIORequest_t         *agIORequest,
5139285242Sachim                                  bit32                   agIOStatus,
5140285242Sachim                                  bit32                   agIOInfoLen,
5141285242Sachim                                  void                    *agParam,
5142285242Sachim                                  bit32                   agOtherInfo
5143285242Sachim                                 )
5144285242Sachim{
5145285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
5146285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
5147285242Sachim  bit32                  intContext = osData->IntContext;
5148285242Sachim  tdIORequestBody_t      *tdIORequestBody;
5149285242Sachim  TI_DBG2(("itdssXferErrorEOBDataOverrunHandler: start\n"));
5150285242Sachim  TI_DBG2(("itdssXferErrorEOBDataOverrunHandler: agIOStatus 0x%x\n", agIOStatus));
5151285242Sachim
5152285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5153285242Sachim
5154285242Sachim  ostiInitiatorIOCompleted (
5155285242Sachim                            tiRoot,
5156285242Sachim                            tdIORequestBody->tiIORequest,
5157285242Sachim                            tiIOFailed,
5158285242Sachim                            tiDetailOtherError,
5159285242Sachim                            agNULL,
5160285242Sachim                            intContext
5161285242Sachim                            );
5162285242Sachim  return;
5163285242Sachim}
5164285242Sachim
5165285242Sachim/*****************************************************************************
5166285242Sachim*! \brief itdssOpenCnxErrorOpenPreemptedHandler
5167285242Sachim*
5168285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
5169285242Sachim*            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED
5170285242Sachim*
5171285242Sachim*  \param  agRoot:            pointer to port instance
5172285242Sachim*  \param  agIORequest:       pointer to I/O request
5173285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
5174285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
5175285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
5176285242Sachim*                             of abort request
5177285242Sachim*  \param  agOtherInfo        Residual count
5178285242Sachim*  \return: None
5179285242Sachim*
5180285242Sachim*
5181285242Sachim*****************************************************************************/
5182285242SachimosGLOBAL void
5183285242SachimitdssOpenCnxErrorOpenPreemptedHandler(
5184285242Sachim                                  agsaRoot_t              *agRoot,
5185285242Sachim                                  agsaIORequest_t         *agIORequest,
5186285242Sachim                                  bit32                   agIOStatus,
5187285242Sachim                                  bit32                   agIOInfoLen,
5188285242Sachim                                  void                    *agParam,
5189285242Sachim                                  bit32                   agOtherInfo
5190285242Sachim                                 )
5191285242Sachim{
5192285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
5193285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
5194285242Sachim  bit32                  intContext = osData->IntContext;
5195285242Sachim  tdIORequestBody_t      *tdIORequestBody;
5196285242Sachim  TI_DBG2(("itdssOpenCnxErrorOpenPreemptedHandler: start\n"));
5197285242Sachim  TI_DBG2(("itdssOpenCnxErrorOpenPreemptedHandler: agIOStatus 0x%x\n", agIOStatus));
5198285242Sachim
5199285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5200285242Sachim
5201285242Sachim  ostiInitiatorIOCompleted (
5202285242Sachim                            tiRoot,
5203285242Sachim                            tdIORequestBody->tiIORequest,
5204285242Sachim                            tiIOFailed,
5205285242Sachim                            tiDetailOtherError,
5206285242Sachim                            agNULL,
5207285242Sachim                            intContext
5208285242Sachim                            );
5209285242Sachim  return;
5210285242Sachim}
5211285242Sachim
5212285242Sachim/* default */
5213285242Sachim/*****************************************************************************
5214285242Sachim*! \brief itdssIODefaultHandler
5215285242Sachim*
5216285242Sachim*  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
5217285242Sachim*            layer with agIOStatus = unspecified
5218285242Sachim*
5219285242Sachim*  \param  agRoot:            pointer to port instance
5220285242Sachim*  \param  agIORequest:       pointer to I/O request
5221285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
5222285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
5223285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
5224285242Sachim*                             of abort request
5225285242Sachim*  \param  agOtherInfo        Residual count
5226285242Sachim*  \return: None
5227285242Sachim*
5228285242Sachim*
5229285242Sachim*****************************************************************************/
5230285242SachimosGLOBAL void
5231285242SachimitdssIODefaultHandler (
5232285242Sachim                       agsaRoot_t              *agRoot,
5233285242Sachim                       agsaIORequest_t         *agIORequest,
5234285242Sachim                       bit32                   agIOStatus,
5235285242Sachim                       bit32                   agIOInfoLen,
5236285242Sachim                       void                    *agParam,
5237285242Sachim                       bit32                   agOtherInfo
5238285242Sachim                       )
5239285242Sachim{
5240285242Sachim  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
5241285242Sachim  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
5242285242Sachim  bit32                  intContext = osData->IntContext;
5243285242Sachim  tdIORequestBody_t      *tdIORequestBody;
5244285242Sachim  TI_DBG2(("itdssIODefaultHandler: start\n"));
5245285242Sachim  TI_DBG2(("itdssIODefaultHandler: agIOStatus 0x%x\n", agIOStatus));
5246285242Sachim
5247285242Sachim  tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5248285242Sachim
5249285242Sachim  ostiInitiatorIOCompleted (
5250285242Sachim                            tiRoot,
5251285242Sachim                            tdIORequestBody->tiIORequest,
5252285242Sachim                            tiIOFailed,
5253285242Sachim                            tiDetailOtherError,
5254285242Sachim                            agNULL,
5255285242Sachim                            intContext
5256285242Sachim                            );
5257285242Sachim  return;
5258285242Sachim}
5259285242Sachim
5260285242Sachim/*****************************************************************************
5261285242Sachim*! \brief itdssIOForDebugging1Completed
5262285242Sachim*
5263285242Sachim*  Purpose:  This function is only for debugging. This function should NOT be
5264285242Sachim*            called.
5265285242Sachim*
5266285242Sachim*  \param  agRoot:            pointer to port instance
5267285242Sachim*  \param  agIORequest:       pointer to I/O request
5268285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
5269285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
5270285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
5271285242Sachim*                             of abort request
5272285242Sachim*  \param  agOtherInfo        Residual count
5273285242Sachim*  \return: None
5274285242Sachim*
5275285242Sachim*
5276285242Sachim*****************************************************************************/
5277285242SachimosGLOBAL void
5278285242SachimitdssIOForDebugging1Completed(
5279285242Sachim                 agsaRoot_t             *agRoot,
5280285242Sachim                 agsaIORequest_t        *agIORequest,
5281285242Sachim                 bit32                  agIOStatus,
5282285242Sachim                 bit32                  agIOInfoLen,
5283285242Sachim                 void                   *agParam,
5284285242Sachim                 bit32                  agOtherInfo
5285285242Sachim                 )
5286285242Sachim{
5287285242Sachim  TI_DBG1(("itdssIOForDebugging1Completed: start, error!!! can't be called. \n"));
5288285242Sachim}
5289285242Sachim
5290285242Sachim/*****************************************************************************
5291285242Sachim*! \brief itdssIOForDebugging2Completed
5292285242Sachim*
5293285242Sachim*  Purpose:  This function is only for debugging. This function should NOT be
5294285242Sachim*            called.
5295285242Sachim*
5296285242Sachim*  \param  agRoot:            pointer to port instance
5297285242Sachim*  \param  agIORequest:       pointer to I/O request
5298285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
5299285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
5300285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
5301285242Sachim*                             of abort request
5302285242Sachim*  \param  agOtherInfo        Residual count
5303285242Sachim*  \return: None
5304285242Sachim*
5305285242Sachim*
5306285242Sachim*****************************************************************************/
5307285242SachimosGLOBAL void
5308285242SachimitdssIOForDebugging2Completed(
5309285242Sachim                 agsaRoot_t             *agRoot,
5310285242Sachim                 agsaIORequest_t        *agIORequest,
5311285242Sachim                 bit32                  agIOStatus,
5312285242Sachim                 bit32                  agIOInfoLen,
5313285242Sachim                 void                   *agParam,
5314285242Sachim                 bit32                  agOtherInfo
5315285242Sachim                 )
5316285242Sachim{
5317285242Sachim  TI_DBG1(("itdssIOForDebugging2Completed: start, error!!! can't be called.  \n"));
5318285242Sachim}
5319285242Sachim
5320285242Sachim/*****************************************************************************
5321285242Sachim*! \brief itdssIOForDebugging3Completed
5322285242Sachim*
5323285242Sachim*  Purpose:  This function is only for debugging. This function should NOT be
5324285242Sachim*            called.
5325285242Sachim*
5326285242Sachim*  \param  agRoot:            pointer to port instance
5327285242Sachim*  \param  agIORequest:       pointer to I/O request
5328285242Sachim*  \param  agIOStatus:        I/O status given by LL layer
5329285242Sachim*  \param  agIOInfoLen:       lenth of complete SAS RESP frame
5330285242Sachim*  \param  agParam            A Handle used to refer to the response frame or handle
5331285242Sachim*                             of abort request
5332285242Sachim*  \param  agOtherInfo        Residual count
5333285242Sachim*  \return: None
5334285242Sachim*
5335285242Sachim*
5336285242Sachim*****************************************************************************/
5337285242SachimosGLOBAL void
5338285242SachimitdssIOForDebugging3Completed(
5339285242Sachim                 agsaRoot_t             *agRoot,
5340285242Sachim                 agsaIORequest_t        *agIORequest,
5341285242Sachim                 bit32                  agIOStatus,
5342285242Sachim                 bit32                  agIOInfoLen,
5343285242Sachim                 void                   *agParam,
5344285242Sachim                 bit32                  agOtherInfo
5345285242Sachim                 )
5346285242Sachim{
5347285242Sachim  TI_DBG1(("itdssIOForDebugging3Completed: start, error!!! can't be called.  \n"));
5348285242Sachim}
5349285242Sachim
5350285242Sachim
5351