1/*******************************************************************************
2*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3*
4*Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*that the following conditions are met:
6*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*following disclaimer.
8*2. Redistributions in binary form must reproduce the above copyright notice,
9*this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*with the distribution.
11*
12*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20
21********************************************************************************/
22/*******************************************************************************/
23/*! \file sampirsp.c
24 *  \brief The file implements the functions of MPI Outbound Response Message
25 *
26 */
27/******************************************************************************/
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: releng/11.0/sys/dev/pms/RefTisa/sallsdk/spc/sampirsp.c 285242 2015-07-07 13:17:02Z achim $");
30#include <dev/pms/config.h>
31
32#include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
33#ifdef SA_ENABLE_TRACE_FUNCTIONS
34#ifdef siTraceFileID
35#undef siTraceFileID
36#endif
37#define siTraceFileID 'J'
38#endif
39
40/******************************************************************************/
41/* Protoytpes */
42void saReturnRequestToFreePool(
43                            agsaRoot_t          *agRoot,
44                            agsaIORequestDesc_t *pRequest
45                            );
46
47/******************************************************************************/
48/*! \brief Process Outbound IOMB Message
49 *
50 *  Process Outbound IOMB from SPC
51 *
52 *  \param agRoot       Handles for this instance of SAS/SATA LL Layer
53 *  \param pMsg1        Pointer of Response IOMB message 1
54 *  \param category     category of outbpond IOMB header
55 *  \param opcode       Opcode of Outbound IOMB header
56 *  \param bc           buffer count of IOMB header
57 *
58 *  \return success or fail
59 *
60 */
61/*******************************************************************************/
62#if 0
63FORCEINLINE bit32
64mpiParseOBIomb(
65  agsaRoot_t        *agRoot,
66  bit32             *pMsg1,
67  mpiMsgCategory_t  category,
68  bit16             opcode
69  )
70{
71  agsaLLRoot_t      *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
72  bit32              ret = AGSA_RC_SUCCESS;
73  bit32              parserStatus = AGSA_RC_SUCCESS;
74
75  smTraceFuncEnter(hpDBG_VERY_LOUD, "2f");
76
77  switch (opcode)
78  {
79    case OPC_OUB_COMBINED_SSP_COMP:
80    {
81      agsaSSPCoalescedCompletionRsp_t  *pIomb = (agsaSSPCoalescedCompletionRsp_t *)pMsg1;
82      agsaIORequestDesc_t              *pRequest = agNULL;
83      bit32  tag     = 0;
84      bit32  sspTag  = 0;
85      bit32  count   = 0;
86
87#ifdef SALL_API_TEST
88      saRoot->LLCounters.IOCounter.numSSPCompleted++;
89      SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p %d\n",
90         pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
91#else
92      SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SSP_COMP Response received IOMB=%p\n", pMsg1));
93#endif
94      /* get Tag */
95      for (count = 0; count < pIomb->coalescedCount; count++)
96      {
97        tag = pIomb->sspComplCxt[count].tag;
98        sspTag = pIomb->sspComplCxt[count].SSPTag;
99        pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
100        SA_ASSERT((pRequest), "pRequest");
101
102        if(pRequest == agNULL)
103        {
104          SA_DBG1(("mpiParseOBIomb,OPC_OUB_COMBINED_SSP_COMP Resp IOMB tag=0x%x, status=0x%x, param=0x%x, SSPTag=0x%x\n", tag, OSSA_IO_SUCCESS, 0, sspTag));
105          return(AGSA_RC_FAILURE);
106        }
107        SA_ASSERT((pRequest->valid), "pRequest->valid");
108
109        SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SSP_COMP IOMB tag=0x%x, status=0x%x, param=0x%x, SSPTag=0x%x\n", tag, OSSA_IO_SUCCESS, 0, sspTag));
110
111        /* Completion of SSP without Response Data */
112        siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, sspTag);
113      }
114    }
115    break;
116
117    case OPC_OUB_SSP_COMP:
118    {
119#ifdef SALL_API_TEST
120      saRoot->LLCounters.IOCounter.numSSPCompleted++;
121      SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p %d\n",
122         pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
123#else
124      SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p\n", pMsg1));
125#endif
126      /* process the SSP IO Completed response message */
127      mpiSSPCompletion(agRoot, pMsg1);
128      break;
129    }
130    case OPC_OUB_COMBINED_SATA_COMP:
131    {
132      agsaSATACoalescedCompletionRsp_t    *pIomb;
133      agsaIORequestDesc_t       *pRequest;
134      bit32                     tag;
135      bit32                     count;
136
137    #ifdef SALL_API_TEST
138      saRoot->LLCounters.IOCounter.numSSPCompleted++;
139      SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP Response received IOMB=%p %d\n",
140         pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
141    #else
142      SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP Response received IOMB=%p\n", pMsg1));
143    #endif
144
145      pIomb = (agsaSATACoalescedCompletionRsp_t *)pMsg1;
146      /* get Tag */
147      for (count = 0; count < pIomb->coalescedCount; count++)
148      {
149        tag = pIomb->stpComplCxt[count].tag;
150        pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
151        SA_ASSERT((pRequest), "pRequest");
152
153        if(pRequest == agNULL)
154        {
155          SA_DBG1(("mpiParseOBIomb,OPC_OUB_COMBINED_SATA_COMP Resp IOMB tag=0x%x, status=0x%x, param=0x%x\n", tag, OSSA_IO_SUCCESS, 0));
156          return(AGSA_RC_FAILURE);
157        }
158        SA_ASSERT((pRequest->valid), "pRequest->valid");
159
160        SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP IOMB tag=0x%x, status=0x%x, param=0x%x\n", tag, OSSA_IO_SUCCESS, 0));
161
162        /* Completion of SATA without Response Data */
163        siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, 0);
164      }
165      break;
166    }
167    case OPC_OUB_SATA_COMP:
168    {
169#ifdef SALL_API_TEST
170      saRoot->LLCounters.IOCounter.numSataCompleted++;
171      SA_DBG3(("mpiParseOBIomb, SATA_COMP Response received IOMB=%p %d\n",
172             pMsg1, saRoot->LLCounters.IOCounter.numSataCompleted));
173#else
174      SA_DBG3(("mpiParseOBIomb, SATA_COMP Response received IOMB=%p\n", pMsg1));
175#endif
176      /* process the response message */
177      mpiSATACompletion(agRoot, pMsg1);
178      break;
179    }
180    case OPC_OUB_SSP_ABORT_RSP:
181    {
182#ifdef SALL_API_TEST
183      saRoot->LLCounters.IOCounter.numSSPAbortedCB++;
184#else
185      SA_DBG3(("mpiParseOBIomb, SSP_ABORT Response received IOMB=%p\n", pMsg1));
186#endif
187      /* process the response message */
188      parserStatus = mpiSSPAbortRsp(agRoot, (agsaSSPAbortRsp_t *)pMsg1);
189      if(parserStatus !=  AGSA_RC_SUCCESS)
190      {
191         SA_DBG3(("mpiParseOBIomb, mpiSSPAbortRsp FAIL IOMB=%p\n", pMsg1));
192      }
193
194      break;
195    }
196    case OPC_OUB_SATA_ABORT_RSP:
197    {
198#ifdef SALL_API_TEST
199      saRoot->LLCounters.IOCounter.numSataAbortedCB++;
200#else
201      SA_DBG3(("mpiParseOBIomb, SATA_ABORT Response received IOMB=%p\n", pMsg1));
202#endif
203      /* process the response message */
204      mpiSATAAbortRsp(agRoot, (agsaSATAAbortRsp_t *)pMsg1);
205      break;
206    }
207    case OPC_OUB_SATA_EVENT:
208    {
209      SA_DBG3(("mpiParseOBIomb, SATA_EVENT Response received IOMB=%p\n", pMsg1));
210      /* process the response message */
211      mpiSATAEvent(agRoot, (agsaSATAEventRsp_t *)pMsg1);
212      break;
213    }
214    case OPC_OUB_SSP_EVENT:
215    {
216      SA_DBG3(("mpiParseOBIomb, SSP_EVENT Response received IOMB=%p\n", pMsg1));
217      /* process the response message */
218      mpiSSPEvent(agRoot, (agsaSSPEventRsp_t *)pMsg1);
219      break;
220    }
221    case OPC_OUB_SMP_COMP:
222    {
223#ifdef SALL_API_TEST
224      saRoot->LLCounters.IOCounter.numSMPCompleted++;
225      SA_DBG3(("mpiParseOBIomb, SMP_COMP Response received IOMB=%p, %d\n",
226             pMsg1, saRoot->LLCounters.IOCounter.numSMPCompleted));
227#else
228      SA_DBG3(("mpiParseOBIomb, SMP_COMP Response received IOMB=%p\n", pMsg1));
229#endif
230      /* process the response message */
231      mpiSMPCompletion(agRoot, (agsaSMPCompletionRsp_t *)pMsg1);
232      break;
233    }
234#ifndef BIOS
235    case OPC_OUB_ECHO:
236    {
237#ifdef SALL_API_TEST
238      saRoot->LLCounters.IOCounter.numEchoCB++;
239      SA_DBG3(("mpiParseOBIomb, ECHO Response received %d\n", saRoot->LLCounters.IOCounter.numEchoCB));
240#else
241      SA_DBG3(("mpiParseOBIomb, ECHO Response received\n"));
242#endif
243      /* process the response message */
244      mpiEchoRsp(agRoot, (agsaEchoRsp_t *)pMsg1);
245      break;
246    }
247#endif
248    case OPC_OUB_GET_NVMD_DATA:
249    {
250      SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_NVMD_DATA received IOMB=%p\n", pMsg1));
251      /* process the response message */
252      mpiGetNVMDataRsp(agRoot, (agsaGetNVMDataRsp_t *)pMsg1);
253      break;
254    }
255    case OPC_OUB_SPC_HW_EVENT:
256    {
257      SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
258      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SPC_HW_EVENT Response received IOMB=%p\n", pMsg1));
259      /* process the response message */
260      mpiHWevent(agRoot, (agsaHWEvent_SPC_OUB_t *)pMsg1);
261      break;
262    }
263    case OPC_OUB_HW_EVENT:
264    {
265      SA_DBG3(("mpiParseOBIomb, HW_EVENT Response received IOMB=%p\n", pMsg1));
266      /* process the response message */
267      mpiHWevent(agRoot, (agsaHWEvent_SPC_OUB_t *)pMsg1);
268      break;
269    }
270    case OPC_OUB_PHY_START_RESPONSE:
271    {
272      SA_DBG1(("mpiParseOBIomb, OPC_OUB_PHY_START_RESPONSE Response received IOMB=%p\n", pMsg1));
273      /* process the response message */
274      mpiPhyStartEvent( agRoot, (agsaHWEvent_Phy_OUB_t  *)pMsg1  );
275
276      break;
277    }
278    case OPC_OUB_PHY_STOP_RESPONSE:
279    {
280      SA_DBG1(("mpiParseOBIomb, OPC_OUB_PHY_STOP_RESPONSE Response received IOMB=%p\n", pMsg1));
281      /* process the response message */
282      mpiPhyStopEvent( agRoot, (agsaHWEvent_Phy_OUB_t  *)pMsg1  );
283      break;
284    }
285
286    case OPC_OUB_LOCAL_PHY_CNTRL:
287    {
288      SA_DBG3(("mpiParseOBIomb, PHY CONTROL Response received IOMB=%p\n", pMsg1));
289      /* process the response message */
290      mpiPhyCntrlRsp(agRoot, (agsaLocalPhyCntrlRsp_t *)pMsg1);
291      break;
292    }
293    case OPC_OUB_SPC_DEV_REGIST:
294    {
295      SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
296      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SPC_DEV_REGIST Response received IOMB=%p\n", pMsg1));
297      /* process the response message */
298      mpiDeviceRegRsp(agRoot, (agsaDeviceRegistrationRsp_t *)pMsg1);
299      break;
300    }
301    case OPC_OUB_DEV_REGIST:
302    {
303      SA_DBG2(("mpiParseOBIomb, DEV_REGISTRATION Response received IOMB=%p\n", pMsg1));
304      /* process the response message */
305      mpiDeviceRegRsp(agRoot, (agsaDeviceRegistrationRsp_t *)pMsg1);
306      break;
307    }
308    case OPC_OUB_DEREG_DEV:
309    {
310      SA_DBG3(("mpiParseOBIomb, DEREGISTRATION DEVICE Response received IOMB=%p\n", pMsg1));
311      /* process the response message */
312      mpiDeregDevHandleRsp(agRoot, (agsaDeregDevHandleRsp_t *)pMsg1);
313      break;
314    }
315#ifndef BIOS
316    case OPC_OUB_GET_DEV_HANDLE:
317    {
318      SA_DBG3(("mpiParseOBIomb, GET_DEV_HANDLE Response received IOMB=%p\n", pMsg1));
319      /* process the response message */
320      mpiGetDevHandleRsp(agRoot, (agsaGetDevHandleRsp_t *)pMsg1);
321      break;
322    }
323#endif
324    case OPC_OUB_SPC_DEV_HANDLE_ARRIV:
325    {
326      SA_DBG3(("mpiParseOBIomb, SPC_DEV_HANDLE_ARRIV Response received IOMB=%p\n", pMsg1));
327      /* process the response message */
328      mpiDeviceHandleArrived(agRoot, (agsaDeviceHandleArrivedNotify_t *)pMsg1);
329      break;
330    }
331    case OPC_OUB_DEV_HANDLE_ARRIV:
332    {
333      SA_DBG3(("mpiParseOBIomb, DEV_HANDLE_ARRIV Response received IOMB=%p\n", pMsg1));
334      /* process the response message */
335      mpiDeviceHandleArrived(agRoot, (agsaDeviceHandleArrivedNotify_t *)pMsg1);
336      break;
337    }
338#if 0 //Sunitha
339	case OPC_OUB_THERM_HW_EVENT:
340	{
341      SA_DBG3(("mpiParseOBIomb, THERM_HW_EVENT Response received IOMB=%p\n", pMsg1));
342      ossaLogThermalEvent(agRoot, (agsaThermal_Hw_Event_Notify_t *)pMsg1);
343      break;
344	}
345#endif //Sunitha
346    case OPC_OUB_SSP_RECV_EVENT:
347    {
348      SA_DBG3(("mpiParseOBIomb, SSP_RECV_EVENT Response received IOMB=%p\n", pMsg1));
349      /* process the response message */
350      mpiSSPReqReceivedNotify(agRoot, (agsaSSPReqReceivedNotify_t *)pMsg1);
351      break;
352    }
353    case OPC_OUB_DEV_INFO:
354    {
355      SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
356      SA_DBG3(("mpiParseOBIomb, DEV_INFO Response received IOMB=%p\n", pMsg1));
357      /* process the response message */
358      mpiGetDevInfoRsp(agRoot, (agsaGetDevInfoRspV_t *)pMsg1);
359      break;
360    }
361#ifndef BIOS
362    case OPC_OUB_GET_PHY_PROFILE_RSP:
363    {
364      SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
365      SA_DBG2(("mpiParseOBIomb, OPC_OUB_GET_PHY_PROFILE_RSP Response received IOMB=%p\n", pMsg1));
366      /* process the response message */
367      mpiGetPhyProfileRsp(agRoot, (agsaGetPhyProfileRspV_t *)pMsg1);
368      break;
369    }
370    case OPC_OUB_SET_PHY_PROFILE_RSP:
371    {
372      SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
373      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_PHY_PROFILE_RSP Response received IOMB=%p\n", pMsg1));
374      /* process the response message */
375      mpiSetPhyProfileRsp(agRoot, (agsaSetPhyProfileRspV_t *)pMsg1);
376      break;
377    }
378#endif /* BIOS */
379    case OPC_OUB_SPC_DEV_INFO:
380    {
381      SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
382      SA_DBG3(("mpiParseOBIomb, DEV_INFO Response received IOMB=%p\n", pMsg1));
383      /* process the response message */
384      mpiGetDevInfoRspSpc(agRoot, (agsaGetDevInfoRsp_t *)pMsg1);
385      break;
386    }
387    case OPC_OUB_FW_FLASH_UPDATE:
388    {
389      SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_FLASH_UPDATE Response received IOMB=%p\n", pMsg1));
390      /* process the response message */
391      mpiFwFlashUpdateRsp(agRoot, (agsaFwFlashUpdateRsp_t *)pMsg1);
392      break;
393    }
394    case OPC_OUB_FLASH_OP_EXT_RSP:
395    {
396      SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_FLASH_UPDATE Response received IOMB=%p\n", pMsg1));
397      /* process the response message */
398      mpiFwExtFlashUpdateRsp(agRoot, (agsaFwFlashOpExtRsp_t *)pMsg1);
399      break;
400    }
401#ifndef BIOS
402#ifdef SPC_ENABLE_PROFILE
403    case OPC_OUB_FW_PROFILE:
404    {
405      SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_PROFILE Response received IOMB=%p\n", pMsg1));
406      /* process the response message */
407      mpiFwProfileRsp(agRoot, (agsaFwProfileRsp_t *)pMsg1);
408      break;
409    }
410#endif
411    case OPC_OUB_SET_NVMD_DATA:
412    {
413      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_NVMD_DATA received IOMB=%p\n", pMsg1));
414      /* process the response message */
415      mpiSetNVMDataRsp(agRoot, (agsaSetNVMDataRsp_t *)pMsg1);
416      break;
417    }
418
419    case OPC_OUB_GPIO_RESPONSE:
420    {
421      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
422      /* process the response message */
423      mpiGPIORsp(agRoot, (agsaGPIORsp_t *)pMsg1);
424      break;
425    }
426    case OPC_OUB_GPIO_EVENT:
427    {
428      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
429      /* process the response message */
430      mpiGPIOEventRsp(agRoot, (agsaGPIOEvent_t *)pMsg1);
431      break;
432    }
433#endif  /* BIOS */
434    case OPC_OUB_GENERAL_EVENT:
435    {
436      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GENERAL_EVENT Response received IOMB=%p\n", pMsg1));
437      /* process the response message */
438      mpiGeneralEventRsp(agRoot, (agsaGeneralEventRsp_t *)pMsg1);
439      break;
440    }
441#ifndef BIOS
442    case OPC_OUB_SAS_DIAG_MODE_START_END:
443    {
444      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_DIAG_MODE_START_END Response received IOMB=%p\n", pMsg1));
445      /* process the response message */
446      mpiSASDiagStartEndRsp(agRoot, (agsaSASDiagStartEndRsp_t *)pMsg1);
447      break;
448    }
449    case OPC_OUB_SAS_DIAG_EXECUTE:
450    {
451      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_DIAG_EXECUTE_RSP Response received IOMB=%p\n", pMsg1));
452      /* process the response message */
453      mpiSASDiagExecuteRsp(agRoot, (agsaSASDiagExecuteRsp_t *)pMsg1);
454      break;
455    }
456#endif /* BIOS */
457    case OPC_OUB_GET_TIME_STAMP:
458    {
459      SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_TIME_STAMP Response received IOMB=%p\n", pMsg1));
460      /* process the response message */
461      mpiGetTimeStampRsp(agRoot, (agsaGetTimeStampRsp_t *)pMsg1);
462      break;
463    }
464
465    case OPC_OUB_SPC_SAS_HW_EVENT_ACK:
466    {
467      SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
468      SA_DBG3(("mpiParseOBIomb,OPC_OUB_SPC_SAS_HW_EVENT_ACK  Response received IOMB=%p\n", pMsg1));
469      /* process the response message */
470      mpiSASHwEventAckRsp(agRoot, (agsaSASHwEventAckRsp_t *)pMsg1);
471      break;
472    }
473
474    case OPC_OUB_SAS_HW_EVENT_ACK:
475    {
476      SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
477      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_HW_EVENT_ACK Response received IOMB=%p\n", pMsg1));
478      /* process the response message */
479      mpiSASHwEventAckRsp(agRoot, (agsaSASHwEventAckRsp_t *)pMsg1);
480      break;
481    }
482    case OPC_OUB_PORT_CONTROL:
483    {
484      SA_DBG3(("mpiParseOBIomb, OPC_OUB_PORT_CONTROL Response received IOMB=%p\n", pMsg1));
485      /* process the response message */
486      mpiPortControlRsp(agRoot, (agsaPortControlRsp_t *)pMsg1);
487      break;
488    }
489    case OPC_OUB_SMP_ABORT_RSP:
490    {
491#ifdef SALL_API_TEST
492      saRoot->LLCounters.IOCounter.numSMPAbortedCB++;
493      SA_DBG3(("mpiParseOBIomb, SMP_ABORT Response received IOMB=%p, %d\n",
494             pMsg1, saRoot->LLCounters.IOCounter.numSMPAbortedCB));
495#else
496      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SMP_ABORT_RSP Response received IOMB=%p\n", pMsg1));
497#endif
498      /* process the response message */
499      mpiSMPAbortRsp(agRoot, (agsaSMPAbortRsp_t *)pMsg1);
500      break;
501    }
502    case OPC_OUB_DEVICE_HANDLE_REMOVAL:
503    {
504      SA_DBG3(("mpiParseOBIomb, OPC_OUB_DEVICE_HANDLE_REMOVAL received IOMB=%p\n", pMsg1));
505      /* process the response message */
506      mpiDeviceHandleRemoval(agRoot, (agsaDeviceHandleRemoval_t *)pMsg1);
507      break;
508    }
509    case OPC_OUB_SET_DEVICE_STATE:
510    {
511      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_DEVICE_STATE received IOMB=%p\n", pMsg1));
512      /* process the response message */
513      mpiSetDeviceStateRsp(agRoot, (agsaSetDeviceStateRsp_t *)pMsg1);
514      break;
515    }
516
517#ifndef BIOS
518    case OPC_OUB_GET_DEVICE_STATE:
519    {
520      SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_DEVICE_STATE received IOMB=%p\n", pMsg1));
521      /* process the response message */
522      mpiGetDeviceStateRsp(agRoot, (agsaGetDeviceStateRsp_t *)pMsg1);
523      break;
524    }
525#endif  /* BIOS */
526
527    case OPC_OUB_SET_DEV_INFO:
528    {
529      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_DEV_INFO received IOMB=%p\n", pMsg1));
530      /* process the response message */
531      mpiSetDevInfoRsp(agRoot, (agsaSetDeviceInfoRsp_t *)pMsg1);
532      break;
533    }
534
535#ifndef BIOS_DEBUG
536    case OPC_OUB_SAS_RE_INITIALIZE:
537    {
538      SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
539      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_RE_INITIALIZE received IOMB=%p\n", pMsg1));
540      /* process the response message */
541      mpiSasReInitializeRsp(agRoot, (agsaSasReInitializeRsp_t *)pMsg1);
542      break;
543    }
544#endif  /* BIOS */
545
546    case OPC_OUB_SGPIO_RESPONSE:
547    {
548      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SGPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
549      /* process the response message */
550      mpiSGpioRsp(agRoot, (agsaSGpioRsp_t *)pMsg1);
551      break;
552    }
553
554#ifndef BIOS
555    case OPC_OUB_PCIE_DIAG_EXECUTE:
556    {
557      SA_DBG3(("mpiParseOBIomb, OPC_OUB_PCIE_DIAG_EXECUTE Response received IOMB=%p\n", pMsg1));
558      /* process the response message */
559      mpiPCIeDiagExecuteRsp(agRoot, (agsaPCIeDiagExecuteRsp_t *)pMsg1);
560      break;
561    }
562    case 2104: //delray start
563    {
564      if(smIS_SPC6V(agRoot))
565      {
566      SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_DFE_DATA_RSP Response received IOMB=%p\n", pMsg1));
567      /* process the response message */
568      mpiGetDFEDataRsp(agRoot, (agsaGetDDEFDataRsp_t *)pMsg1);
569      }
570      if(smIS_SPC12V(agRoot))
571      {
572        SA_DBG3(("mpiParseOBIomb, OPC_INB_GET_VIST_CAP Response received IOMB=%p\n", pMsg1));
573        mpiGetVisRsp(agRoot, (agsaGetVisCapRsp_t *)pMsg1);
574      }
575      else
576      {
577        SA_DBG1(("mpiParseOBIomb, 2104  Response received IOMB=%p\n", pMsg1));
578      }
579      break;
580    }
581#endif   /* BIOS */
582    case OPC_OUB_SET_CONTROLLER_CONFIG:
583    {
584      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_CONTROLLER_CONFIG Response received IOMB=%p\n", pMsg1));
585      mpiSetControllerConfigRsp(agRoot, (agsaSetControllerConfigRsp_t *)pMsg1);
586      break;
587    }
588#ifndef BIOS
589    case OPC_OUB_GET_CONTROLLER_CONFIG:
590    {
591      SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_CONTROLLER_CONFIG Response received IOMB=%p\n", pMsg1));
592      mpiGetControllerConfigRsp(agRoot, (agsaGetControllerConfigRsp_t *)pMsg1);
593      break;
594    }
595    case OPC_OUB_KEK_MANAGEMENT:
596    {
597      SA_DBG3(("mpiParseOBIomb, OPC_OUB_KEK_MANAGEMENT Response received IOMB=%p\n", pMsg1));
598      mpiKekManagementRsp(agRoot, (agsaKekManagementRsp_t *)pMsg1);
599      break;
600    }
601#endif  /* BIOS */
602#ifdef UN_USED_FUNC
603    case OPC_OUB_DEK_MANAGEMENT:
604    {
605      SA_DBG3(("mpiParseOBIomb, OPC_OUB_DEK_MANAGEMENT Response received IOMB=%p\n", pMsg1));
606      mpiDekManagementRsp(agRoot, (agsaDekManagementRsp_t *)pMsg1);
607      break;
608    }
609#endif
610#ifndef BIOS
611    case OPC_OUB_OPR_MGMT:
612    {
613      SA_DBG1(("mpiParseOBIomb, OPC_OUB_OPR_MGMT Response received IOMB=%p\n", pMsg1));
614      mpiOperatorManagementRsp(agRoot, (agsaOperatorMangmenRsp_t *)pMsg1);
615      break;
616    }
617    case OPC_OUB_ENC_TEST_EXECUTE:
618    {
619      SA_DBG1(("mpiParseOBIomb, OPC_OUB_ENC_TEST_EXECUTE Response received IOMB=%p\n", pMsg1));
620      mpiBistRsp(agRoot, (agsaEncryptBistRsp_t *)pMsg1);
621      break;
622    }
623#endif /* BIOS */
624    case OPC_OUB_SET_OPERATOR:
625    {
626      SA_DBG1(("mpiParseOBIomb, OPC_OUB_SET_OPERATOR Response received IOMB=%p\n", pMsg1));
627      mpiSetOperatorRsp(agRoot, (agsaSetOperatorRsp_t *)pMsg1);
628      break;
629    }
630    case OPC_OUB_GET_OPERATOR:
631    {
632      SA_DBG1(("mpiParseOBIomb, OPC_OUB_GET_OPERATOR Response received IOMB=%p\n", pMsg1));
633      mpiGetOperatorRsp(agRoot, (agsaGetOperatorRsp_t *)pMsg1);
634      break;
635    }
636    case OPC_OUB_DIF_ENC_OFFLOAD_RSP://delray start
637    {
638      SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
639      SA_DBG1(("mpiParseOBIomb, OPC_OUB_DIF_ENC_OFFLOAD_RSP Response received IOMB=%p\n", pMsg1));
640      mpiDifEncOffloadRsp(agRoot, (agsaDifEncOffloadRspV_t *)pMsg1);
641      break;
642    }			//delray end
643    default:
644    {
645#ifdef SALL_API_TEST
646      saRoot->LLCounters.IOCounter.numUNKNWRespIOMB++;
647      SA_DBG1(("mpiParseOBIomb, UnKnown Response received IOMB=%p, %d\n",
648             pMsg1, saRoot->LLCounters.IOCounter.numUNKNWRespIOMB));
649#else
650      SA_DBG1(("mpiParseOBIomb, Unknown IOMB Response received opcode 0x%X IOMB=%p\n",opcode, pMsg1));
651#endif
652      break;
653    }
654  } /* switch */
655
656  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2f");
657
658  return ret;
659
660}
661#endif
662
663#ifndef BIOS
664#endif
665
666/******************************************************************************/
667/*! \brief ECHO Response
668 *
669 *  This routine handles the response of ECHO Command
670 *
671 *  \param agRoot       Handles for this instance of SAS/SATA LLL
672 *  \param pIomb        Pointer of IOMB Mesage
673 *
674 *  \return sucess or fail
675 *
676 */
677/*******************************************************************************/
678GLOBAL bit32 mpiEchoRsp(
679  agsaRoot_t          *agRoot,
680  agsaEchoRsp_t       *pIomb
681  )
682{
683  bit32               ret = AGSA_RC_SUCCESS;
684  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
685  agsaIORequestDesc_t *pRequest;
686  agsaContext_t       *agContext;
687  bit32               tag;
688
689  smTraceFuncEnter(hpDBG_VERY_LOUD, "2g");
690
691  SA_DBG3(("mpiEchoRsp: HTAG=0x%x\n", pIomb->tag));
692
693  /* get request from IOMap */
694  OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaEchoRsp_t, tag));
695
696  pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
697  if (agNULL == pRequest)
698  {
699    SA_DBG1(("mpiEchoRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x\n", tag));
700    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2g");
701    return AGSA_RC_FAILURE;
702  }
703
704  agContext = saRoot->IOMap[tag].agContext;
705
706  ossaEchoCB(agRoot, agContext, (void *)&pIomb->payload[0]);
707
708  /* remove the request from IOMap */
709  saRoot->IOMap[tag].Tag = MARK_OFF;
710  saRoot->IOMap[tag].IORequest = agNULL;
711  saRoot->IOMap[tag].agContext = agNULL;
712
713  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
714  SA_ASSERT((pRequest->valid), "pRequest->valid");
715  pRequest->valid = agFALSE;
716  /* return the request to free pool */
717  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
718  {
719    SA_DBG1(("mpiEchoRsp: saving pRequest (%p) for later use\n", pRequest));
720    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
721  }
722  else
723  {
724    /* return the request to free pool */
725    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
726  }
727  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
728
729  /* return value */
730  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2g");
731  return ret;
732}
733
734/******************************************************************************/
735/*! \brief Get NVM Data Response
736 *
737 *  This routine handles the response of GET NVM Data Response
738 *
739 *  \param agRoot       Handles for this instance of SAS/SATA LLL
740 *  \param pIomb        Pointer of IOMB Mesage
741 *
742 *  \return sucess or fail
743 *
744 */
745/*******************************************************************************/
746GLOBAL bit32 mpiGetNVMDataRsp(
747  agsaRoot_t          *agRoot,
748  agsaGetNVMDataRsp_t *pIomb
749  )
750{
751  bit32               ret = AGSA_RC_SUCCESS;
752  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
753  agsaIORequestDesc_t *pRequest;
754  agsaContext_t       *agContext;
755  bit32               i, dataLen;
756  bit32               DlenStatus, tag, iRTdaBnDpsAsNvm;
757
758  smTraceFuncEnter(hpDBG_VERY_LOUD, "2h");
759
760  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, tag));
761  OSSA_READ_LE_32(AGROOT, &DlenStatus, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, DlenStatus));
762  OSSA_READ_LE_32(AGROOT, &iRTdaBnDpsAsNvm, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, iRTdaBnDpsAsNvm));
763  OSSA_READ_LE_32(AGROOT, &dataLen, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, NVMData[10])) ;
764
765  SA_DBG1(("mpiGetNVMDataRsp: HTAG=0x%x\n", tag));
766
767  /* get request from IOMap */
768  pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
769  if (agNULL == pRequest)
770  {
771    SA_DBG1(("mpiGetNVMDataRsp: Bad Response IOMB!!! pRequest is NULL.\n"));
772    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2h");
773    return AGSA_RC_FAILURE;
774  }
775
776  agContext = saRoot->IOMap[tag].agContext;
777
778  if (iRTdaBnDpsAsNvm & IRMode)
779  {
780    /* indirect mode - IR bit set */
781    SA_DBG1(("mpiGetNVMDataRsp: OSSA_SUCCESS, IR=1, DataLen=%d\n", dataLen));
782    if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_CONFIG_SEEPROM) ||
783        ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_VPD_FLASH) ||
784        ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_TWI_DEVICES) ||
785        ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_EXPANSION_ROM) ||
786        ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_IOP_REG_FLASH))
787    {
788      /* CB for NVMD */
789//#ifdef UN_USED_FUNC
790      ossaGetNVMDResponseCB(agRoot, agContext, (DlenStatus & NVMD_STAT), INDIRECT_MODE, dataLen, agNULL);
791//#endif
792    }
793    else if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AAP1_RDUMP) ||
794             ((iRTdaBnDpsAsNvm & NVMD_TYPE) == IOP_RDUMP))
795    {
796#ifdef UN_USED_FUNC
797      if ((DlenStatus & NVMD_STAT) == 0)
798      {
799        /* CB for Register Dump */
800
801        ossaGetRegisterDumpCB(agRoot, agContext, OSSA_SUCCESS);
802      }
803      else
804      {
805        /* CB for Register Dump */
806        ossaGetRegisterDumpCB(agRoot, agContext, OSSA_FAILURE);
807      }
808#endif
809    }
810    else
811    {
812      /* Should not be happened */
813      SA_DBG1(("mpiGetNVMDataRsp: (IR=1)Wrong Device type 0x%x\n", iRTdaBnDpsAsNvm));
814    }
815  }
816  else /* direct mode */
817  {
818    SA_DBG1(("mpiGetNVMDataRsp: OSSA_SUCCESS, IR=0, DataLen=%d\n", ((DlenStatus & NVMD_LEN) >> SHIFT24)));
819    for (i = 0; i < (((DlenStatus & NVMD_LEN) >> SHIFT24)/4); i++)
820    {
821      SA_DBG1(("mpiGetNVMDataRsp: OSSA_SUCCESS, NVMDATA=0x%x\n", pIomb->NVMData[i]));
822    }
823    if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_CONFIG_SEEPROM) ||
824        ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_VPD_FLASH) ||
825        ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_TWI_DEVICES))
826    {
827      /* CB for NVMD */
828  //    char * safe_type_pun = (char *)(&pIomb->NVMData[0]);
829#ifdef UN_USED_FUNC
830      ossaGetNVMDResponseCB(agRoot, agContext, (DlenStatus & NVMD_STAT), DIRECT_MODE,
831         ((DlenStatus & NVMD_LEN) >> SHIFT24), (agsaFrameHandle_t *)safe_type_pun);
832#endif
833    }
834    else if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AAP1_RDUMP) ||
835             ((iRTdaBnDpsAsNvm & NVMD_TYPE) == IOP_RDUMP))
836    {
837#ifdef UN_USED_FUNC
838
839      if ((DlenStatus & NVMD_STAT) == 0)
840      {
841        /* CB for Register Dump */
842        ossaGetRegisterDumpCB(agRoot, agContext, OSSA_SUCCESS);
843      }
844      else
845      {
846        /* CB for Register Dump */
847        ossaGetRegisterDumpCB(agRoot, agContext, OSSA_FAILURE);
848      }
849#endif
850    }
851    else
852    {
853      /* Should not be happened */
854      SA_DBG1(("mpiGetNVMDataRsp: (IR=0)Wrong Device type 0x%x\n", iRTdaBnDpsAsNvm));
855    }
856  }
857
858  /* remove the request from IOMap */
859  saRoot->IOMap[tag].Tag = MARK_OFF;
860  saRoot->IOMap[tag].IORequest = agNULL;
861  saRoot->IOMap[tag].agContext = agNULL;
862
863  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
864  SA_ASSERT((pRequest->valid), "pRequest->valid");
865  pRequest->valid = agFALSE;
866  /* return the request to free pool */
867  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
868  {
869    SA_DBG1(("mpiGetNVMDataRsp: saving pRequest (%p) for later use\n", pRequest));
870    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
871  }
872  else
873  {
874    /* return the request to free pool */
875    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
876  }
877  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
878
879  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2h");
880
881  /* return value */
882  return ret;
883}
884
885/******************************************************************************/
886/*! \brief Phy Event Response from SPCv
887 *
888 *  Process Phy Event from SPC
889 *
890 *  \param agRoot        Handles for this instance of SAS/SATA LL Layer
891 *  \param pIomb         pointer of IOMB
892 *
893 *  \return success or fail
894 *
895 */
896/*******************************************************************************/
897
898GLOBAL bit32 mpiPhyStartEvent(
899  agsaRoot_t        *agRoot,
900  agsaHWEvent_Phy_OUB_t  *pIomb
901  )
902{
903  bit32                    ret = AGSA_RC_SUCCESS;
904  agsaLLRoot_t             *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
905
906  bit32                    phyId;
907  bit32                    IOMBStatus;
908  bit32                    tag;
909
910  agsaIORequestDesc_t *pRequest;
911  agsaContext_t       *agContext;
912  bit32                HwCBStatus;
913
914  if(saRoot == agNULL)
915  {
916    SA_DBG1(("mpiPhyStartEvent: saRoot == agNULL\n"));
917    return(AGSA_RC_FAILURE);
918  }
919  smTraceFuncEnter(hpDBG_VERY_LOUD, "2H");
920
921  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t, tag)) ;
922
923  /* get request from IOMap */
924  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
925  agContext = saRoot->IOMap[tag].agContext;
926  /* remove the request from IOMap */
927  saRoot->IOMap[tag].Tag = MARK_OFF;
928  saRoot->IOMap[tag].IORequest = agNULL;
929  saRoot->IOMap[tag].agContext = agNULL;
930  if (agNULL == pRequest)
931  {
932    SA_DBG1(("mpiPhyStartEvent: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x \n", tag));
933    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2H");
934    return AGSA_RC_FAILURE;
935  }
936
937  SA_DBG1(("mpiPhyStartEvent: Status 0x%X PhyId 0x%X\n",pIomb->Status,pIomb->ReservedPhyId));
938
939  OSSA_READ_LE_32(AGROOT, &IOMBStatus, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,Status ));
940  OSSA_READ_LE_32(AGROOT, &phyId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,ReservedPhyId ));
941
942  switch (IOMBStatus)
943  {
944    case OSSA_MPI_IO_SUCCESS:                  /* PhyStart operation completed successfully */
945      HwCBStatus = 0;
946      saRoot->phys[phyId].linkstatus = 1;
947      SA_DBG1(("mpiPhyStartEvent:MPI_IO_SUCCESS IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
948      /* Callback with PHY_UP */
949      break;
950    case OSSA_MPI_ERR_INVALID_PHY_ID:      /* identifier specified in the PHY_START command is invalid i.e out of supported range for this product. */
951      HwCBStatus = 1;
952      saRoot->phys[phyId].linkstatus = 0;
953      SA_DBG1(("mpiPhyStartEvent: MPI_ERR_INVALID_PHY_ID IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
954      ret = AGSA_RC_FAILURE;
955      break;
956    case OSSA_MPI_ERR_PHY_ALREADY_STARTED:
957      HwCBStatus = 2;
958      saRoot->phys[phyId].linkstatus = 1;
959      SA_DBG1(("mpiPhyStartEvent: MPI_ERR_PHY_ALREADY_STARTED IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
960      ret = AGSA_RC_FAILURE;
961      break;
962    case OSSA_MPI_ERR_INVALID_ANALOG_TBL_IDX:
963      HwCBStatus = 4;
964      saRoot->phys[phyId].linkstatus = 0;
965      SA_DBG1(("mpiPhyStartEvent: MPI_ERR_INVALID_ANALOG_TBL_IDX IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
966      ret = AGSA_RC_FAILURE;
967      break;
968    default:
969      HwCBStatus = 3;
970      saRoot->phys[phyId].linkstatus = 0;
971      SA_DBG1(("mpiPhyStartEvent: Unknown IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
972      ret = AGSA_RC_FAILURE;
973    break;
974  }
975
976  ossaHwCB(agRoot,agNULL, OSSA_HW_EVENT_PHY_START_STATUS ,((HwCBStatus << SHIFT8) | phyId) ,agContext, agNULL);
977
978  /* return the request to free pool */
979  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
980  SA_ASSERT((pRequest->valid), "pRequest->valid");
981  pRequest->valid = agFALSE;
982  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
983  {
984    SA_DBG1(("mpiPhyStartEvent: saving pRequest (%p) for later use\n", pRequest));
985    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
986  }
987  else
988  {
989    /* return the request to free pool */
990    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
991  }
992  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
993
994  return(ret);
995}
996
997
998GLOBAL bit32 mpiPhyStopEvent(
999  agsaRoot_t        *agRoot,
1000  agsaHWEvent_Phy_OUB_t  *pIomb
1001  )
1002{
1003  bit32                    ret = AGSA_RC_SUCCESS;
1004  agsaLLRoot_t             *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
1005  bit32                    phyId;
1006
1007  bit32                    IOMBStatus;
1008  bit32                    HwCBStatus;
1009
1010  bit32                    tag;
1011
1012  agsaIORequestDesc_t *pRequest;
1013  agsaContext_t       *agContext;
1014
1015  agsaPhy_t               *pPhy;
1016  agsaPort_t              *pPort;
1017
1018
1019  if(saRoot == agNULL)
1020  {
1021    SA_DBG1(("mpiPhyStopEvent: saRoot == agNULL\n"));
1022    return(AGSA_RC_FAILURE);
1023  }
1024  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t, tag)) ;
1025
1026  /* get request from IOMap */
1027  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
1028  agContext = saRoot->IOMap[tag].agContext;
1029  /* remove the request from IOMap */
1030  saRoot->IOMap[tag].Tag = MARK_OFF;
1031  saRoot->IOMap[tag].IORequest = agNULL;
1032  saRoot->IOMap[tag].agContext = agNULL;
1033  if (agNULL == pRequest)
1034  {
1035    SA_DBG1(("mpiPhyStopEvent: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x \n", tag));
1036    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2H");
1037    return AGSA_RC_FAILURE;
1038  }
1039
1040  OSSA_READ_LE_32(AGROOT, &IOMBStatus, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,Status ));
1041  OSSA_READ_LE_32(AGROOT, &phyId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,ReservedPhyId ));
1042  SA_DBG1(("mpiPhyStopEvent: Status %08X PhyId %08X\n",IOMBStatus,phyId));
1043
1044  if(smIS_SPCV(agRoot))
1045  {
1046      phyId &= 0xff;  // SPCv PHY_ID is one byte wide
1047  }
1048
1049  saRoot->phys[phyId].linkstatus = 0;
1050
1051  switch (IOMBStatus)
1052  {
1053    case OSSA_MPI_IO_SUCCESS:                  /* PhyStart operation completed successfully */
1054      SA_DBG1(("mpiPhyStopEvent:MPI_IO_SUCCESS  0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1055      HwCBStatus = 0;
1056      /* Callback with PHY_DOWN */
1057      break;
1058    case OSSA_MPI_ERR_INVALID_PHY_ID:      /* identifier specified in the PHY_START command is invalid i.e out of supported range for this product. */
1059      SA_DBG1(("mpiPhyStopEvent: MPI_ERR_INVALID_PHY_ID 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1060      HwCBStatus = 1;
1061      break;
1062    case OSSA_MPI_ERR_PHY_NOT_STARTED:  /* An attempt to stop a phy which is not started  */
1063      HwCBStatus = 4;
1064      SA_DBG1(("mpiPhyStopEvent:  0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1065      break;
1066
1067    case OSSA_MPI_ERR_DEVICES_ATTACHED:  /* All the devices in a port need to be deregistered if the PHY_STOP is for the last phy  */
1068      HwCBStatus = 2;
1069      SA_DBG1(("mpiPhyStopEvent:  0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1070      break;
1071
1072    default:
1073      HwCBStatus = 3;
1074      SA_DBG1(("mpiPhyStopEvent: Unknown Status 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1075      break;
1076  }
1077
1078
1079  if(HwCBStatus == 0)
1080  {
1081    pPhy = &(saRoot->phys[phyId]);
1082    /* get the port of the phy */
1083    pPort = pPhy->pPort;
1084    if ( agNULL != pPort )
1085    {
1086      SA_DBG1(("siPhyStopCB: phy%d invalidating port\n", phyId));
1087      /* invalid port state, remove the port */
1088      pPort->status |= PORT_INVALIDATING;
1089      saRoot->PortMap[pPort->portId].PortStatus  |= PORT_INVALIDATING;
1090      /* invalid the port */
1091      siPortInvalid(agRoot, pPort);
1092      /* map out the portmap */
1093      saRoot->PortMap[pPort->portId].PortContext = agNULL;
1094      saRoot->PortMap[pPort->portId].PortID = PORT_MARK_OFF;
1095      saRoot->PortMap[pPort->portId].PortStatus  |= PORT_INVALIDATING;
1096      ossaHwCB(agRoot,&(pPort->portContext) , OSSA_HW_EVENT_PHY_STOP_STATUS, ((HwCBStatus << SHIFT8) | phyId ),agContext, agNULL);
1097    }
1098    else
1099    {
1100      SA_DBG1(("siPhyStopCB: phy%d - Port is not established\n", phyId));
1101      ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_PHY_STOP_STATUS, ((HwCBStatus << SHIFT8) | phyId ) , agContext, agNULL);
1102    }
1103
1104    /* set PHY_STOPPED status */
1105    PHY_STATUS_SET(pPhy, PHY_STOPPED);
1106
1107    /* Exclude the phy from a port */
1108    if ( agNULL != pPort )
1109    {
1110      /* Acquire port list lock */
1111      ossaSingleThreadedEnter(agRoot, LL_PORT_LOCK);
1112
1113      /* Delete the phy from the port */
1114      pPort->phyMap[phyId] = agFALSE;
1115      saRoot->phys[phyId].pPort = agNULL;
1116
1117      /* Release port list lock */
1118      ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
1119    }
1120
1121  }
1122  else
1123  {
1124    SA_DBG1(("siPhyStopCB: Error phy%d - Port is not established\n", phyId));
1125    ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_PHY_STOP_STATUS, ((HwCBStatus << SHIFT8) | phyId ) , agContext, agNULL);
1126  }
1127
1128  /* return the request to free pool */
1129  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1130  SA_ASSERT((pRequest->valid), "pRequest->valid");
1131  pRequest->valid = agFALSE;
1132  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
1133  {
1134    SA_DBG1(("mpiPhyStartEvent: saving pRequest (%p) for later use\n", pRequest));
1135    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
1136  }
1137  else
1138  {
1139    /* return the request to free pool */
1140    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
1141  }
1142  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1143
1144  return(ret);
1145}
1146
1147
1148/******************************************************************************/
1149/*! \brief Hardware Event Response from SPC
1150 *
1151 *  Process HW Event from SPC
1152 *
1153 *  \param agRoot        Handles for this instance of SAS/SATA LL Layer
1154 *  \param pIomb         pointer of IOMB
1155 *
1156 *  \return success or fail
1157 *
1158 */
1159/*******************************************************************************/
1160GLOBAL bit32 mpiHWevent(
1161  agsaRoot_t            *agRoot,
1162  agsaHWEvent_SPC_OUB_t *pIomb
1163  )
1164{
1165  bit32                    ret = AGSA_RC_SUCCESS;
1166  agsaLLRoot_t             *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
1167  agsaIORequestDesc_t      *pRequest;
1168  agsaPortContext_t        *agPortContext;
1169  agsaSASIdentify_t        *IDframe;
1170  agsaFisRegDeviceToHost_t *sataFis;
1171  agsaContext_t            *agContext;
1172  agsaPort_t               *pPort = agNULL;
1173  bit32                    phyId;
1174  bit32                    portId;
1175  bit32                    Event;
1176  bit32                    tag, status;
1177  bit8                     linkRate;
1178  bit32                    LREventPhyIdPortId;
1179  bit32                    npipps, eventParam,npip,port_state;
1180
1181  smTraceFuncEnter(hpDBG_VERY_LOUD,"2j");
1182
1183  SA_ASSERT((agNULL !=saRoot ), "");
1184  if(saRoot == agNULL)
1185  {
1186    SA_DBG1(("mpiHWevent: saRoot == agNULL\n"));
1187    return(AGSA_RC_FAILURE);
1188  }
1189  if(smIS_SPC(agRoot))
1190  {
1191    OSSA_READ_LE_32(AGROOT, &LREventPhyIdPortId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, LRStatusEventPhyIdPortId));
1192    OSSA_READ_LE_32(AGROOT, &npipps, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, NpipPortState));
1193    OSSA_READ_LE_32(AGROOT, &eventParam, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, EVParam));
1194    SA_DBG2(("mpiHWEvent: S, LREventPhyIdPortId 0x%08x npipps 0x%08x eventParam 0x%08x\n", LREventPhyIdPortId ,npipps ,eventParam ));
1195
1196    /* get port context */
1197    portId = LREventPhyIdPortId & PORTID_MASK;
1198    smTrace(hpDBG_VERY_LOUD,"QK",portId);
1199    /* TP:QK portId */
1200
1201    /* get phyId */
1202    phyId = (LREventPhyIdPortId & PHY_ID_BITS) >> SHIFT4;
1203
1204    smTrace(hpDBG_VERY_LOUD,"QK",npipps);
1205    /* TP:QK npipps */
1206    smTrace(hpDBG_VERY_LOUD,"QL",portId);
1207    /* TP:QL portId */
1208    smTrace(hpDBG_VERY_LOUD,"QM",phyId);
1209    /* TP:QM phyId */
1210
1211    SA_DBG1(("mpiHWEvent:SPC, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1212                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, (npipps & PORT_STATE_MASK)));
1213  }
1214  else
1215  {
1216    OSSA_READ_LE_32(AGROOT, &LREventPhyIdPortId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_V_OUB_t, LRStatEventPortId));
1217    OSSA_READ_LE_32(AGROOT, &npipps, pIomb, OSSA_OFFSET_OF(agsaHWEvent_V_OUB_t, RsvPhyIdNpipRsvPortState));
1218    OSSA_READ_LE_32(AGROOT, &eventParam, pIomb, OSSA_OFFSET_OF(agsaHWEvent_V_OUB_t, EVParam));
1219    SA_DBG2(("mpiHWEvent: V, LREventPhyIdPortId 0x%08x npipps 0x%08x eventParam 0x%08x\n", LREventPhyIdPortId ,npipps ,eventParam ));
1220
1221    smTrace(hpDBG_VERY_LOUD,"QN",npipps);
1222    /* TP:QN npipps */
1223
1224    /* get port context */
1225    portId = LREventPhyIdPortId & PORTID_MASK;
1226
1227    smTrace(hpDBG_VERY_LOUD,"QO",portId);
1228    /* TP:QO portId */
1229
1230    /* get phyId */
1231    phyId = (npipps & PHY_ID_V_BITS) >> SHIFT16;
1232    smTrace(hpDBG_VERY_LOUD,"QP",phyId);
1233    /* TP:QP phyId */
1234
1235    /* get npipps */
1236    npip =(npipps & 0xFF00 ) >> SHIFT4;
1237    port_state  =(npipps & 0xF );
1238    npipps = npip | port_state; // Make it look like SPCs nipps
1239
1240
1241    SA_DBG1(("mpiHWEvent: V, PhyID 0x%x PortID 0x%x NPIP 0x%x PS 0x%x npipps 0x%x\n",
1242                phyId, portId,npip,port_state,npipps));
1243  }
1244
1245  Event = (LREventPhyIdPortId & HW_EVENT_BITS) >> SHIFT8;
1246
1247  /* get Link Rate */
1248  linkRate = (bit8)((LREventPhyIdPortId & LINK_RATE_MASK) >> SHIFT28);
1249  /* get status byte */
1250  status = (LREventPhyIdPortId & STATUS_BITS) >> SHIFT24;
1251
1252  smTrace(hpDBG_VERY_LOUD,"HA",portId);
1253  /* TP:HA portId */
1254  smTrace(hpDBG_VERY_LOUD,"HB",linkRate);
1255  /* TP:HB linkRate */
1256  smTrace(hpDBG_VERY_LOUD,"HC",phyId);
1257  /* TP:HC phyId */
1258  smTrace(hpDBG_VERY_LOUD,"HD",npipps);
1259  /* TP:HD npipps */
1260  smTrace(hpDBG_VERY_LOUD,"HE",status);
1261  /* TP:HE status */
1262
1263  if (portId > saRoot->phyCount)
1264  {
1265    if (OSSA_PORT_NOT_ESTABLISHED == (npipps & PORT_STATE_MASK))
1266    {
1267      /* out of range checking for portId */
1268      SA_DBG1(("mpiHWEvent: PORT_ID is out of range, PhyID %d PortID %d\n",
1269                phyId, portId));
1270      /* port is not estiblished */
1271      agPortContext = agNULL;
1272    }
1273    else
1274    {
1275      /* portId is bad and state is correct - should not happen */
1276      SA_DBG1(("mpiHWEvent: PORT_ID is bad with correct Port State, PhyID %d PortID %d\n",
1277                phyId, portId));
1278      smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2j");
1279      return AGSA_RC_FAILURE;
1280    }
1281  }
1282  else
1283  {
1284    SA_DBG2(("mpiHWEvent:PortID 0x%x PortStatus 0x%x PortContext %p\n",saRoot->PortMap[portId & PORTID_MASK].PortID,saRoot->PortMap[portId & PORTID_MASK].PortStatus,saRoot->PortMap[portId & PORTID_MASK].PortContext));
1285    agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
1286  }
1287
1288  if(agPortContext == agNULL)
1289  {
1290    SA_DBG1(("mpiHWEvent: agPortContext is NULL, PhyID %d PortID %d\n",
1291                phyId, portId));
1292  }
1293
1294  smTrace(hpDBG_VERY_LOUD,"HF",Event);
1295  /* TP:HF OSSA_HW_EVENT */
1296
1297  switch (Event)
1298  {
1299    case OSSA_HW_EVENT_SAS_PHY_UP:
1300    {
1301      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_SAS_PHY_UP, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1302                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, (npipps & PORT_STATE_MASK)));
1303
1304      /* get SAS Identify info */
1305      IDframe = (agsaSASIdentify_t *)&pIomb->sasIdentify;
1306      /* Callback about SAS link up */
1307      saRoot->phys[phyId].linkstatus |= 2;
1308      saRoot->phys[phyId].sasIdentify.phyIdentifier = IDframe->phyIdentifier;
1309      saRoot->phys[phyId].sasIdentify.deviceType_addressFrameType = IDframe->deviceType_addressFrameType;
1310
1311      si_memcpy(&(saRoot->phys[phyId].sasIdentify.sasAddressHi),&(IDframe->sasAddressHi),4);
1312      si_memcpy(&(saRoot->phys[phyId].sasIdentify.sasAddressLo),&(IDframe->sasAddressLo),4);
1313      siEventPhyUpRcvd(agRoot, phyId, IDframe, portId, npipps, linkRate);
1314      break;
1315    }
1316    case OSSA_HW_EVENT_SATA_PHY_UP:
1317    {
1318      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_SATA_PHY_UP, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1319                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, (npipps & PORT_STATE_MASK)));
1320
1321      /* get SATA FIS info */
1322      saRoot->phys[phyId].linkstatus |= 2;
1323      sataFis = (agsaFisRegDeviceToHost_t *)&pIomb->sataFis;
1324      /* Callback about SATA Link Up */
1325      siEventSATASignatureRcvd(agRoot, phyId, (void *)sataFis, portId, npipps, linkRate);
1326      break;
1327    }
1328    case OSSA_HW_EVENT_SATA_SPINUP_HOLD:
1329    {
1330      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_SATA_SPINUP_HOLD, PhyID %d\n", phyId));
1331      ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_SATA_SPINUP_HOLD, phyId, agNULL, agNULL);
1332      break;
1333    }
1334    case OSSA_HW_EVENT_PHY_DOWN:
1335    {
1336      agsaPhy_t *pPhy = &(saRoot->phys[phyId]);
1337
1338      if(pPhy) {
1339		osti_memset(&pPhy->sasIdentify,0,sizeof(agsaSASIdentify_t));
1340      }
1341      saRoot->phys[phyId].linkstatus &= 1;
1342      if (agNULL != agPortContext)
1343      {
1344        pPort = (agsaPort_t *) (agPortContext->sdkData);
1345      }
1346
1347      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1348                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1349
1350      /* callback */
1351      if ( agNULL != pPort )
1352      {
1353        if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
1354        {
1355          pPort->status &= ~PORT_INVALIDATING;
1356          saRoot->PortMap[portId].PortStatus  &= ~PORT_INVALIDATING;
1357          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN, PhyID %d  ~PORT_INVALIDATING \n", phyId));
1358        }
1359        else
1360        {
1361          if (OSSA_PORT_INVALID == (npipps & PORT_STATE_MASK))
1362          {
1363            /* set port invalid flag */
1364            pPort->status |= PORT_INVALIDATING;
1365            saRoot->PortMap[portId].PortStatus  |= PORT_INVALIDATING;
1366            SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN PortInvalid portID %d PortContext %p NPIP 0x%x\n", portId, agPortContext,npipps));
1367          }
1368          else
1369          {
1370            if (OSSA_PORT_IN_RESET == (npipps & PORT_STATE_MASK))
1371            {
1372              SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN PortInReset portID %d PortContext %p\n", portId, agPortContext));
1373            }
1374            else
1375            {
1376              SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN Not PortInReset portID %d PortContext %p\n", portId, agPortContext));
1377            }
1378          }
1379        }
1380
1381        /* report PhyId, NPIP, PortState */
1382        phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1383        /* Callback with PHY_DOWN */
1384        ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_DOWN, phyId, agNULL, agNULL);
1385      }
1386      else
1387      {
1388        /* no portcontext.- error */
1389        SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN PhyDown pPort is NULL.\n"));
1390      }
1391
1392      /* set PHY_DOWN status */
1393      PHY_STATUS_SET(pPhy, PHY_DOWN);
1394      break;
1395    }
1396    case OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC:
1397    {
1398      agsaPhyErrCountersPage_t errorParam;
1399      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1400                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1401      si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1402      errorParam.inboundCRCError = eventParam;
1403      /* report PhyId, NPIP, PortState */
1404      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1405      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC, phyId, (void *)&errorParam, agNULL);
1406      break;
1407    }
1408    case OSSA_HW_EVENT_HARD_RESET_RECEIVED:
1409    {
1410      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_HARD_RESET_RECEIVED, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1411                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1412      /* report PhyId, NPIP, PortState */
1413      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1414      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_HARD_RESET_RECEIVED, phyId, agNULL, agNULL);
1415      break;
1416    }
1417    case OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD:
1418    {
1419      agsaPhyErrCountersPage_t errorParam;
1420      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_INVALID_DWORD, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1421                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1422      si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1423      errorParam.invalidDword = eventParam;
1424      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1425      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD, phyId, (void *)&errorParam, agNULL);
1426      break;
1427    }
1428    case OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR:
1429    {
1430      agsaPhyErrCountersPage_t errorParam;
1431      SA_DBG3(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_DISPARITY_ERROR, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1432                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1433      /* report PhyId, NPIP, PortState */
1434      si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1435      errorParam.runningDisparityError = eventParam;
1436      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1437      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR, phyId, (void *)&errorParam, agNULL);
1438      break;
1439    }
1440    case OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION:
1441    {
1442      agsaPhyErrCountersPage_t errorParam;
1443      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1444                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1445      /* report PhyId, NPIP, PortState */
1446      si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1447      errorParam.codeViolation = eventParam;
1448      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1449      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION, phyId, (void *)&errorParam, agNULL);
1450      break;
1451    }
1452    case OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH:
1453    {
1454      agsaPhyErrCountersPage_t errorParam;
1455      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_LOSS_OF_DWORD_SYNCH, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1456                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1457      /* report PhyId, NPIP, PortState */
1458      si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1459      errorParam.lossOfDwordSynch = eventParam;
1460      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1461      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH, phyId, (void *)&errorParam, agNULL);
1462      break;
1463    }
1464    case OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO:
1465    {
1466      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1467        phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1468
1469      if (agNULL != agPortContext)
1470      {
1471        pPort = (agsaPort_t *) (agPortContext->sdkData);
1472      }
1473      else
1474      {
1475        SA_ASSERT((agPortContext), "agPortContext agNULL was there a PHY UP?");
1476        return(AGSA_RC_FAILURE);
1477      }
1478
1479      /* report PhyId, NPIP, PortState */
1480      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1481      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO, phyId, agNULL, agNULL);
1482
1483      if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
1484      {
1485         pPort->status &= ~PORT_INVALIDATING;
1486         saRoot->PortMap[portId].PortStatus  &= ~PORT_INVALIDATING;
1487         SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO NOT PORT_INVALIDATING portID %d PortContext %p\n", portId, agPortContext));
1488      }
1489      else
1490      {
1491        if (OSSA_PORT_INVALID == (npipps & PORT_STATE_MASK))
1492        {
1493          /* set port invalid flag */
1494          pPort->status |= PORT_INVALIDATING;
1495          saRoot->PortMap[portId].PortStatus  |= PORT_INVALIDATING;
1496          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO PORT_INVALIDATING portID %d PortContext %p\n", portId, agPortContext));
1497         }
1498        else
1499        {
1500          if (OSSA_PORT_IN_RESET == (npipps & PORT_STATE_MASK))
1501          {
1502            SA_DBG1(("mpiHWEvent: PortInReset portID %d PortContext %p\n", portId, agPortContext));
1503          }
1504        }
1505      }
1506      break;
1507    }
1508    case OSSA_HW_EVENT_PORT_RECOVER:
1509    {
1510      if (agNULL != agPortContext)
1511      {
1512        pPort = (agsaPort_t *) (agPortContext->sdkData);
1513      }
1514
1515      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVER, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1516        phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1517
1518      if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
1519      {
1520        if (agNULL != pPort)
1521        {
1522          /* reset port invalid flag */
1523          pPort->status &= ~PORT_INVALIDATING;
1524          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVER NOT PORT_INVALIDATING portID %d PortContext %p\n", portId, agPortContext));
1525        }
1526        saRoot->PortMap[portId].PortStatus  &= ~PORT_INVALIDATING;
1527      }
1528      /* get SAS Identify info */
1529      IDframe = (agsaSASIdentify_t *)&pIomb->sasIdentify;
1530      /* report PhyId, NPIP, PortState and LinkRate */
1531      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16) | (linkRate << SHIFT8);
1532      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RECOVER, phyId, agNULL, (void *)IDframe);
1533      break;
1534    }
1535    case OSSA_HW_EVENT_PHY_STOP_STATUS:
1536    {
1537      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS PhyId=0x%x, status=0x%x eventParam=0x%x\n", phyId, status,eventParam));
1538      OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, EVParam));
1539
1540      switch(eventParam)
1541      {
1542        case 0:
1543          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS Stopped 0\n" ));
1544        break;
1545        case 1:
1546          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS INVALID_PHY 1\n" ));
1547        break;
1548        case 2:
1549          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS DEVICES_ATTACHED 2\n" ));
1550        break;
1551        case 3:
1552          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS OTHER_FAILURE 3\n" ));
1553        break;
1554        case 4:
1555          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS PHY_NOT_ENABLED 4\n" ));
1556        break;
1557        default:
1558          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS Unknown code 0x%x\n", eventParam));
1559          break;
1560      }
1561
1562      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS phyId 0x%x status 0x%x eventParam 0x%x\n", phyId, status,eventParam));
1563      /* get request from IOMap */
1564      pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
1565      SA_ASSERT((pRequest), "pRequest NULL");
1566      SA_ASSERT((pRequest->valid), "pRequest->valid");
1567
1568      agContext = saRoot->IOMap[tag].agContext;
1569
1570      siPhyStopCB(agRoot, phyId, status, agContext, portId, npipps);
1571
1572      /* remove the request from IOMap */
1573      saRoot->IOMap[tag].Tag = MARK_OFF;
1574      saRoot->IOMap[tag].IORequest = agNULL;
1575      saRoot->IOMap[tag].agContext = agNULL;
1576
1577      ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1578      pRequest->valid = agFALSE;
1579      /* return the request to free pool */
1580      if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
1581      {
1582        SA_DBG1(("mpiHWevent: saving pRequest (%p) for later use\n", pRequest));
1583        saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
1584      }
1585      else
1586      {
1587        /* return the request to free pool */
1588        saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
1589      }
1590      ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1591      break;
1592    }
1593    case OSSA_HW_EVENT_BROADCAST_CHANGE:
1594    {
1595      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_CHANGE, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1596                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1597      /* report PhyId, NPIP, PortState */
1598      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1599      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE, phyId, agNULL, agNULL);
1600      break;
1601    }
1602    case OSSA_HW_EVENT_BROADCAST_SES:
1603    {
1604      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_CHANGE_SES, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1605                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1606      /* report PhyId, NPIP, PortState */
1607      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1608      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_SES, phyId, agNULL, agNULL);
1609      break;
1610    }
1611    case OSSA_HW_EVENT_BROADCAST_EXP:
1612    {
1613      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_EXP, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1614                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1615      /* report PhyId, NPIP, PortState */
1616      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1617      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_EXP, phyId, agNULL, agNULL);
1618      break;
1619    }
1620    case OSSA_HW_EVENT_ID_FRAME_TIMEOUT:
1621    {
1622      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_ID_FRAME_TIMEOUT, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1623                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1624      /* report PhyId, NPIP, PortState */
1625      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1626      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_ID_FRAME_TIMEOUT, phyId, agNULL, agNULL);
1627      break;
1628    }
1629    case OSSA_HW_EVENT_PHY_START_STATUS:
1630    {
1631      OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, EVParam)) ;
1632      /* get request from IOMap */
1633      pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
1634
1635      SA_ASSERT((pRequest), "pRequest");
1636      if( pRequest == agNULL)
1637      {
1638         SA_DBG1(("mpiHWevent: pRequest (%p) NULL\n", pRequest));
1639         ret = AGSA_RC_FAILURE;
1640         break;
1641      }
1642
1643      agContext = saRoot->IOMap[tag].agContext;
1644
1645      /* makeup for CB */
1646      status = (status << 8) | phyId;
1647      ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_PHY_START_STATUS, status, agContext, agNULL);
1648
1649      /* remove the request from IOMap */
1650      saRoot->IOMap[tag].Tag = MARK_OFF;
1651      saRoot->IOMap[tag].IORequest = agNULL;
1652      saRoot->IOMap[tag].agContext = agNULL;
1653
1654      ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1655      SA_ASSERT((pRequest->valid), "pRequest->valid");
1656      pRequest->valid = agFALSE;
1657      /* return the request to free pool */
1658      if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
1659      {
1660        SA_DBG1(("mpiHWevent: saving pRequest (%p) for later use\n", pRequest));
1661        saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
1662      }
1663      else
1664      {
1665        /* return the request to free pool */
1666        saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
1667      }
1668      ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1669
1670      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_START_STATUS, PhyID %d\n", phyId));
1671
1672      break;
1673    }
1674    case OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED:
1675    {
1676      agsaPhyErrCountersPage_t errorParam;
1677      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1678                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1679      /* report PhyId, NPIP, PortState */
1680      si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1681      errorParam.phyResetProblem = eventParam;
1682      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1683      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED, phyId, (void *)&errorParam, agNULL);
1684      break;
1685    }
1686    case OSSA_HW_EVENT_PORT_RESET_TIMER_TMO:
1687    {
1688      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RESET_TIMER_TMO, PhyID %d PortID %d\n", phyId, portId));
1689      /* report PhyId, NPIP, PortState */
1690      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1691      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RESET_TIMER_TMO, phyId, agNULL, agNULL);
1692      break;
1693    }
1694    case OSSA_HW_EVENT_PORT_RESET_COMPLETE:
1695    {
1696      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RESET_COMPLETE, PhyID %d PortID %d\n", phyId, portId));
1697      /* get SAS Identify info */
1698      IDframe = (agsaSASIdentify_t *)&pIomb->sasIdentify;
1699      /* report PhyId, NPIP, PortState and LinkRate */
1700      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16) | (linkRate << SHIFT8);
1701      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RESET_COMPLETE, phyId, agNULL, (void *)IDframe);
1702      break;
1703    }
1704    case OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT:
1705    {
1706      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT, PhyID %d PortID %d\n", phyId, portId));
1707      /* report PhyId, NPIP, PortState */
1708      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1709      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT, phyId, agNULL, agNULL);
1710      break;
1711    }
1712    case OSSA_HW_EVENT_IT_NEXUS_LOSS:
1713    {
1714      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_IT_NEXUS_LOSS, PhyID %d PortID %d status 0x%X\n", phyId, portId,status));
1715      break;
1716    }
1717    case OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED:
1718    {
1719      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED, PhyID %d PortID %d status 0x%X\n", phyId, portId,status));
1720      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED, phyId, agNULL, agNULL);
1721      break;
1722    }
1723
1724    default:
1725    {
1726      SA_DBG1(("mpiHWEvent: Unknown HW Event 0x%x status 0x%X\n", Event ,status));
1727      break;
1728    }
1729  }
1730
1731  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2j");
1732  return ret;
1733}
1734
1735/******************************************************************************/
1736/*! \brief SPC MPI SMP Completion
1737 *
1738 *  This function handles the SMP completion.
1739 *
1740 *  \param agRoot       Handles for this instance of SAS/SATA hardware
1741 *  \param pIomb        pointer of Message1
1742 *  \param bc           buffer count
1743 *
1744 *  \return The read value
1745 *
1746 */
1747/*******************************************************************************/
1748GLOBAL bit32 mpiSMPCompletion(
1749  agsaRoot_t             *agRoot,
1750  agsaSMPCompletionRsp_t *pIomb
1751  )
1752{
1753  bit32               ret = AGSA_RC_SUCCESS;
1754  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
1755  bit32               status;
1756  bit32               tag;
1757  bit32               param;
1758  agsaIORequestDesc_t *pRequest;
1759
1760  SA_DBG3(("mpiSMPCompletion: start, HTAG=0x%x\n", pIomb->tag));
1761
1762  smTraceFuncEnter(hpDBG_VERY_LOUD,"2k");
1763
1764  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSMPCompletionRsp_t, tag)) ;
1765  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSMPCompletionRsp_t, status)) ;
1766  OSSA_READ_LE_32(AGROOT, &param, pIomb, OSSA_OFFSET_OF(agsaSMPCompletionRsp_t, param)) ;
1767   /* get SMP request from IOMap */
1768  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
1769  if (agNULL == pRequest)
1770  {
1771    SA_DBG1(("mpiSMPCompletion: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x PARAM=0x%x\n", tag, status, param));
1772    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2k");
1773    return AGSA_RC_FAILURE;
1774  }
1775
1776  switch (status)
1777  {
1778  case OSSA_IO_SUCCESS:
1779    SA_DBG3(("mpiSMPCompletion: OSSA_IO_SUCCESS HTAG = 0x%x\n", tag));
1780    /* process message */
1781    siSMPRespRcvd(agRoot, pIomb, param, tag);
1782    break;
1783
1784  case OSSA_IO_OVERFLOW:
1785    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OVERFLOW HTAG = 0x%x\n", tag));
1786    saRoot->IoErrorCount.agOSSA_IO_OVERFLOW++;
1787    /* SMP failed */
1788    siAbnormal(agRoot, pRequest, status, 0, 0);
1789    break;
1790
1791  case OSSA_IO_ABORTED:
1792    SA_DBG1(("mpiSMPCompletion: OSSA_IO_ABORTED HTAG = 0x%x\n", tag));
1793
1794    saRoot->IoErrorCount.agOSSA_IO_ABORTED++;
1795#ifdef SA_PRINTOUT_IN_WINDBG
1796#ifndef DBG
1797        DbgPrint("agOSSA_IO_ABORTED  %d\n",  saRoot->IoErrorCount.agOSSA_IO_ABORTED);
1798#endif /* DBG  */
1799#endif /* SA_PRINTOUT_IN_WINDBG  */
1800    /* SMP failed */
1801    siAbnormal(agRoot, pRequest, status, 0, 0);
1802    break;
1803
1804  case OSSA_IO_NO_DEVICE:
1805    SA_DBG1(("mpiSMPCompletion: OSSA_IO_NO_DEVICE HTAG = 0x%x\n", tag));
1806    saRoot->IoErrorCount.agOSSA_IO_NO_DEVICE++;
1807    siAbnormal(agRoot, pRequest, status, 0, 0);
1808    break;
1809
1810  case OSSA_IO_ERROR_HW_TIMEOUT:
1811    SA_DBG1(("mpiSMPCompletion: OSSA_IO_ERROR_HW_TIMEOUT HTAG = 0x%x\n", tag));
1812    saRoot->IoErrorCount.agOSSA_IO_ERROR_HW_TIMEOUT++;
1813    siAbnormal(agRoot, pRequest, status, 0, 0);
1814    break;
1815
1816  case OSSA_IO_XFER_ERROR_BREAK:
1817    SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_ERROR_BREAK HTAG = 0x%x\n", tag));
1818    saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_BREAK++;
1819    siAbnormal(agRoot, pRequest, status, 0, 0);
1820    break;
1821
1822  case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
1823    SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_ERROR_PHY_NOT_READY HTAG = 0x%x\n", tag));
1824    saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
1825    siAbnormal(agRoot, pRequest, status, 0, 0);
1826    break;
1827
1828  case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
1829    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED HTAG = 0x%x\n", tag));
1830    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
1831    siAbnormal(agRoot, pRequest, status, 0, 0);
1832    break;
1833
1834  case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
1835    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION HTAG = 0x%x\n", tag));
1836    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
1837    siAbnormal(agRoot, pRequest, status, 0, 0);
1838    break;
1839
1840  case OSSA_IO_OPEN_CNX_ERROR_BREAK:
1841    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_BREAK HTAG = 0x%x\n", tag));
1842    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
1843    siAbnormal(agRoot, pRequest, status, 0, 0);
1844    break;
1845
1846  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
1847    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS HTAG = 0x%x\n", tag));
1848    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
1849    siAbnormal(agRoot, pRequest, status, 0, 0);
1850    break;
1851
1852  case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
1853    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION HTAG = 0x%x\n", tag));
1854    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
1855    siAbnormal(agRoot, pRequest, status, 0, 0);
1856    break;
1857
1858  case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
1859    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED HTAG = 0x%x\n", tag));
1860    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
1861    siAbnormal(agRoot, pRequest, status, 0, 0);
1862    break;
1863
1864  case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
1865    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION HTAG = 0x%x\n", tag));
1866    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
1867    siAbnormal(agRoot, pRequest, status, 0, 0);
1868    break;
1869
1870  case OSSA_IO_XFER_ERROR_RX_FRAME:
1871    SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_ERROR_RX_FRAME HTAG = 0x%x\n", tag));
1872    saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_RX_FRAME++;
1873    siAbnormal(agRoot, pRequest, status, 0, 0);
1874    break;
1875
1876  case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
1877    SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT HTAG = 0x%x\n", tag));
1878    saRoot->IoErrorCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
1879    siAbnormal(agRoot, pRequest, status, 0, 0);
1880    break;
1881
1882  case OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE:
1883    SA_DBG1(("mpiSMPCompletion: OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE HTAG = 0x%x\n", tag));
1884    saRoot->IoErrorCount.agOSSA_IO_ERROR_INTERNAL_SMP_RESOURCE++;
1885    siAbnormal(agRoot, pRequest, status, 0, 0);
1886    break;
1887
1888  case OSSA_IO_PORT_IN_RESET:
1889    SA_DBG1(("mpiSMPCompletion: OSSA_IO_PORT_IN_RESET HTAG = 0x%x\n", tag));
1890    saRoot->IoErrorCount.agOSSA_IO_PORT_IN_RESET++;
1891    siAbnormal(agRoot, pRequest, status, 0, 0);
1892    break;
1893
1894  case OSSA_IO_DS_NON_OPERATIONAL:
1895    SA_DBG1(("mpiSMPCompletion: OSSA_IO_DS_NON_OPERATIONAL HTAG = 0x%x\n", tag));
1896    saRoot->IoErrorCount.agOSSA_IO_DS_NON_OPERATIONAL++;
1897    siAbnormal(agRoot, pRequest, status, 0, 0);
1898    break;
1899
1900  case OSSA_IO_DS_IN_RECOVERY:
1901    SA_DBG1(("mpiSMPCompletion: OSSA_IO_DS_IN_RECOVERY HTAG = 0x%x\n", tag));
1902    saRoot->IoErrorCount.agOSSA_IO_DS_IN_RECOVERY++;
1903    siAbnormal(agRoot, pRequest, status, 0, 0);
1904    break;
1905
1906  case OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY:
1907    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY HTAG = 0x%x\n", tag));
1908    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY++;
1909    siAbnormal(agRoot, pRequest, status, 0, 0);
1910    break;
1911
1912  case OSSA_IO_ABORT_IN_PROGRESS:
1913    SA_DBG1(("mpiSMPCompletion: OSSA_IO_ABORT_IN_PROGRESS HTAG = 0x%x\n", tag));
1914    saRoot->IoErrorCount.agOSSA_IO_ABORT_IN_PROGRESS++;
1915    siAbnormal(agRoot, pRequest, status, 0, 0);
1916    break;
1917
1918  case OSSA_IO_ABORT_DELAYED:
1919    SA_DBG1(("mpiSMPCompletion:OSSA_IO_ABORT_DELAYED  HTAG = 0x%x\n", tag));
1920    saRoot->IoErrorCount.agOSSA_IO_ABORT_DELAYED++;
1921    siAbnormal(agRoot, pRequest, status, 0, 0);
1922    break;
1923
1924  case OSSA_IO_INVALID_LENGTH:
1925    SA_DBG1(("mpiSMPCompletion: OSSA_IO_INVALID_LENGTH HTAG = 0x%x\n", tag));
1926    saRoot->IoErrorCount.agOSSA_IO_INVALID_LENGTH++;
1927    siAbnormal(agRoot, pRequest, status, 0, 0);
1928    break;
1929
1930  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
1931    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x\n", tag));
1932    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
1933    siAbnormal(agRoot, pRequest, status, 0, 0);
1934    break;
1935
1936  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
1937    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO HTAG = 0x%x\n", tag));
1938    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO++;
1939    siAbnormal(agRoot, pRequest, status, 0, 0);
1940    break;
1941
1942  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
1943    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST HTAG = 0x%x\n", tag));
1944    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
1945    siAbnormal(agRoot, pRequest, status, 0, 0);
1946    break;
1947
1948  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
1949    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE HTAG = 0x%x\n", tag));
1950    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
1951    siAbnormal(agRoot, pRequest, status, 0, 0);
1952    break;
1953
1954  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
1955    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED HTAG = 0x%x\n", tag));
1956    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
1957    siAbnormal(agRoot, pRequest, status, 0, 0);
1958    break;
1959
1960  case OSSA_IO_DS_INVALID:
1961    SA_DBG1(("mpiSMPCompletion: OSSA_IO_DS_INVALID HTAG = 0x%x\n", tag));
1962    saRoot->IoErrorCount.agOSSA_IO_DS_INVALID++;
1963    siAbnormal(agRoot, pRequest, status, 0, 0);
1964    break;
1965
1966  case OSSA_IO_XFER_READ_COMPL_ERR:
1967    SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_READ_COMPL_ERR HTAG = 0x%x\n", tag));
1968    saRoot->IoErrorCount.agOSSA_IO_XFER_READ_COMPL_ERR++;
1969    siAbnormal(agRoot, pRequest, status, 0, 0);
1970    break;
1971
1972  case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
1973    SA_DBG1(("mpiSMPCompletion: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE HTAG = 0x%x\n", tag));
1974    saRoot->IoErrorCount.agOSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE++;
1975    siAbnormal(agRoot, pRequest, status, 0, 0);
1976    break;
1977
1978  case OSSA_MPI_ERR_OFFLOAD_DIF_OR_ENC_NOT_ENABLED:
1979    SA_DBG1(("mpiSMPCompletion: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE HTAG = 0x%x\n", tag));
1980    saRoot->IoErrorCount.agOSSA_MPI_ERR_OFFLOAD_DIF_OR_ENC_NOT_ENABLED++;
1981    siAbnormal(agRoot, pRequest, status, 0, 0);
1982    break;
1983
1984  case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED:
1985    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED HTAG = 0x%x\n", tag));
1986    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED++;
1987    siAbnormal(agRoot, pRequest, status, 0, 0);
1988    break;
1989
1990  default:
1991    SA_DBG1(("mpiSMPCompletion: Unknown Status = 0x%x Tag 0x%x\n", status, tag));
1992    saRoot->IoErrorCount.agOSSA_IO_UNKNOWN_ERROR++;
1993    /* not allowed case. Therefore, assert */
1994    SA_ASSERT((agFALSE), "mpiSMPCompletion: Unknown Status");
1995    break;
1996  }
1997
1998  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2k");
1999  return ret;
2000}
2001
2002/******************************************************************************/
2003/*! \brief SPC MPI Get Device Handle Command Response
2004 *
2005 *  This function handles the response of Get Device Handle Command.
2006 *
2007 *  \param agRoot       Handles for this instance of SAS/SATA hardware
2008 *  \param pIomb        pointer of Message
2009 *  \param bc           buffer count
2010 *
2011 *  \return The read value
2012 *
2013 */
2014/*******************************************************************************/
2015GLOBAL bit32 mpiGetDevHandleRsp(
2016  agsaRoot_t             *agRoot,
2017  agsaGetDevHandleRsp_t  *pIomb
2018  )
2019{
2020  bit32 ret = AGSA_RC_SUCCESS;
2021  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2022  agsaIORequestDesc_t *pRequest;
2023  agsaPortContext_t   *agPortContext;
2024  agsaContext_t       *agContext;
2025  agsaDeviceDesc_t    *pDevice;
2026  bit8 portId;
2027  bit32 deviceid=0, deviceIdc, i;
2028  bit32 DeviceIdcPortId, tag;
2029
2030  SA_DBG3(("mpiGetDevHandleRsp: start, HTAG=0x%x\n", pIomb->tag));
2031
2032  smTraceFuncEnter(hpDBG_VERY_LOUD,"2m");
2033
2034  OSSA_READ_LE_32(AGROOT, &DeviceIdcPortId, pIomb, OSSA_OFFSET_OF(agsaGetDevHandleRsp_t, DeviceIdcPortId)) ;
2035  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDevHandleRsp_t, tag)) ;
2036  /* get request from IOMap */
2037  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2038  agContext = saRoot->IOMap[tag].agContext;
2039  /* remove the request from IOMap */
2040  saRoot->IOMap[tag].Tag = MARK_OFF;
2041  saRoot->IOMap[tag].IORequest = agNULL;
2042  saRoot->IOMap[tag].agContext = agNULL;
2043  if (agNULL == pRequest)
2044  {
2045    SA_DBG1(("mpiGetDevHandleRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x DeviceIdcPortId=0x%x\n", tag, DeviceIdcPortId));
2046    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2m");
2047    return AGSA_RC_FAILURE;
2048  }
2049
2050  /* get port context */
2051  portId = (bit8)(DeviceIdcPortId & PORTID_MASK);
2052  SA_DBG2(("mpiGetDevHandleRsp:PortID 0x%x PortStatus 0x%x PortContext %p\n",saRoot->PortMap[portId & PORTID_MASK].PortID,saRoot->PortMap[portId & PORTID_MASK].PortStatus,saRoot->PortMap[portId & PORTID_MASK].PortContext));
2053  agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
2054
2055  /* get Device ID count */
2056  deviceIdc = (bit8)((DeviceIdcPortId & DEVICE_IDC_BITS) >> SHIFT8);
2057
2058  /* based on the deviceIDC to get all device handles */
2059  for (i = 0; i < deviceIdc; i++)
2060  {
2061    OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaGetDevHandleRsp_t, deviceId[i])) ;
2062    /* find device handle from device index */
2063    pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
2064    if (pDevice->targetDevHandle.sdkData)
2065     saRoot->DeviceHandle[i] = &(pDevice->targetDevHandle);
2066    else
2067     saRoot->DeviceHandle[i] = &(pDevice->initiatorDevHandle);
2068  }
2069
2070  SA_DBG1(("mpiGetDevHandleRsp:deviceid 0x%x  0x%x\n",deviceid, (deviceid & DEVICE_ID_BITS)));
2071  /* call back oslayer */
2072  ossaGetDeviceHandlesCB(agRoot, agContext, agPortContext, saRoot->DeviceHandle, deviceIdc);
2073
2074  /* return the request to free pool */
2075  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2076  SA_ASSERT((pRequest->valid), "pRequest->valid");
2077  pRequest->valid = agFALSE;
2078  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2079  {
2080    SA_DBG1(("mpiGetDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
2081    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2082  }
2083  else
2084  {
2085    /* return the request to free pool */
2086    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2087  }
2088  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2089
2090  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2m");
2091
2092  return ret;
2093}
2094
2095/******************************************************************************/
2096/*! \brief SPC MPI Phy Control Command Response
2097 *
2098 *  This function handles the response of PHY Control Command.
2099 *
2100 *  \param agRoot       Handles for this instance of SAS/SATA hardware
2101 *  \param pIomb        pointer of Message
2102 *
2103 *  \return The read value
2104 *
2105 */
2106/*******************************************************************************/
2107GLOBAL bit32 mpiPhyCntrlRsp(
2108  agsaRoot_t             *agRoot,
2109  agsaLocalPhyCntrlRsp_t *pIomb
2110  )
2111{
2112  bit32               ret = AGSA_RC_SUCCESS;
2113  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2114  agsaIORequestDesc_t *pRequest;
2115  agsaContext_t       *agContext = agNULL;
2116  bit32               phyId, operation, status, tag, phyOpId;
2117
2118  smTraceFuncEnter(hpDBG_VERY_LOUD,"2n");
2119
2120  SA_DBG3(("mpiPhyCntrlRsp: start, HTAG=0x%x,\n", pIomb->tag));
2121
2122  /* get tag */
2123  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaLocalPhyCntrlRsp_t, tag)) ;
2124  OSSA_READ_LE_32(AGROOT, &phyOpId, pIomb, OSSA_OFFSET_OF(agsaLocalPhyCntrlRsp_t, phyOpId)) ;
2125  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaLocalPhyCntrlRsp_t, status)) ;
2126  /* get request from IOMap */
2127  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2128  if (agNULL == pRequest)
2129  {
2130    SA_DBG1(("mpiPhyCntrlRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x PhyOpId=0x%x\n", tag, status, phyOpId));
2131    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2n");
2132    return AGSA_RC_FAILURE;
2133  }
2134  agContext = saRoot->IOMap[tag].agContext;
2135  /* remove the request from IOMap */
2136  saRoot->IOMap[tag].Tag = MARK_OFF;
2137  saRoot->IOMap[tag].IORequest = agNULL;
2138  saRoot->IOMap[tag].agContext = agNULL;
2139
2140  phyId = phyOpId & LOCAL_PHY_PHYID;
2141  operation = (phyOpId & LOCAL_PHY_OP_BITS) >> SHIFT8;
2142
2143
2144  SA_DBG3(("mpiPhyCntrlRsp: phyId=0x%x Operation=0x%x Status=0x%x\n", phyId, operation, status));
2145
2146  if( pRequest->completionCB == agNULL )
2147  {
2148    /* call back with the status */
2149    ossaLocalPhyControlCB(agRoot, agContext, phyId, operation, status, agNULL);
2150  }
2151  else
2152  {
2153    (*(ossaLocalPhyControlCB_t)(pRequest->completionCB))(agRoot, agContext, phyId, operation, status, agNULL );
2154  }
2155
2156  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2157  SA_ASSERT((pRequest->valid), "pRequest->valid");
2158  pRequest->valid = agFALSE;
2159  /* return the request to free pool */
2160  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2161  {
2162    SA_DBG1(("mpiPhyCntrlRsp: saving pRequest (%p) for later use\n", pRequest));
2163    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2164  }
2165  else
2166  {
2167    /* return the request to free pool */
2168    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2169  }
2170  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2171
2172  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2n");
2173  return ret;
2174}
2175
2176/******************************************************************************/
2177/*! \brief SPC MPI Device Register Command Response
2178 *
2179 *  This function handles the response of Device Register Command.
2180 *
2181 *  \param agRoot       Handles for this instance of SAS/SATA hardware
2182 *  \param pIomb        pointer of Message
2183 *
2184 *  \return The read value
2185 *
2186 */
2187/*******************************************************************************/
2188GLOBAL bit32 mpiDeviceRegRsp(
2189  agsaRoot_t    *agRoot,
2190  agsaDeviceRegistrationRsp_t *pIomb
2191  )
2192{
2193  bit32               ret = AGSA_RC_SUCCESS;
2194  agsaLLRoot_t        *saRoot = agNULL;
2195  agsaIORequestDesc_t *pRequest;
2196  agsaContext_t       *agContext;
2197  bit32               deviceId;
2198  agsaDeviceDesc_t    *pDevice = agNULL;
2199  agsaDeviceDesc_t    *pDeviceRemove = agNULL;
2200  bit32               deviceIdx,status, tag;
2201
2202  smTraceFuncEnter(hpDBG_VERY_LOUD,"2p");
2203
2204  /* sanity check */
2205  SA_ASSERT((agNULL != agRoot), "");
2206  saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
2207  SA_ASSERT((agNULL != saRoot), "");
2208
2209  SA_DBG3(("mpiDeviceRegRsp: start, HTAG=0x%x\n", pIomb->tag));
2210
2211  SA_ASSERT((NULL != saRoot->DeviceRegistrationCB), "DeviceRegistrationCB can not be NULL");
2212  OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaDeviceRegistrationRsp_t, deviceId)) ;
2213  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDeviceRegistrationRsp_t, tag)) ;
2214  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDeviceRegistrationRsp_t, status)) ;
2215
2216  SA_DBG1(("mpiDeviceRegRsp: deviceID 0x%x \n", deviceId));
2217
2218  /* get request from IOMap */
2219  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2220  if (agNULL == pRequest)
2221  {
2222    SA_DBG1(("mpiDeviceRegRsp: Bad IOMB!!! pRequest is NULL. TAG=0x%x, STATUS=0x%x DEVICEID=0x%x\n", tag, status, deviceId));
2223    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2p");
2224    return AGSA_RC_FAILURE;
2225  }
2226
2227  pDevice = pRequest->pDevice;
2228
2229  agContext = saRoot->IOMap[tag].agContext;
2230  SA_ASSERT((pRequest->valid), "pRequest->valid");
2231  /* remove the request from IOMap */
2232  saRoot->IOMap[tag].Tag = MARK_OFF;
2233  saRoot->IOMap[tag].IORequest = agNULL;
2234  saRoot->IOMap[tag].agContext = agNULL;
2235
2236  /* get Device Id or status */
2237  SA_DBG3(("mpiDeviceRegRsp: hosttag 0x%x\n", tag));
2238  SA_DBG3(("mpiDeviceRegRsp: deviceID 0x%x Device Context %p\n", deviceId, pDevice));
2239
2240  if (agNULL == pDevice)
2241  {
2242    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2243    pRequest->valid = agFALSE;
2244    /* return the request to free pool */
2245    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2246    {
2247      SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
2248      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2249    }
2250    else
2251    {
2252      /* return the request to free pool */
2253      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2254    }
2255    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2256
2257    SA_DBG1(("mpiDeviceRegRsp: warning!!! no device is found\n"));
2258    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2p");
2259    return AGSA_RC_FAILURE;
2260  }
2261
2262  if (agNULL == saRoot->DeviceRegistrationCB)
2263  {
2264    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2265    pRequest->valid = agFALSE;
2266    /* return the request to free pool */
2267    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2268    {
2269      SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
2270      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2271    }
2272    else
2273    {
2274      /* return the request to free pool */
2275      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2276    }
2277    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2278
2279    SA_DBG1(("mpiDeviceRegRsp: warning!!! no DeviceRegistrationCB is found\n"));
2280    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2p");
2281    return AGSA_RC_FAILURE;
2282  }
2283
2284
2285  if(smIS_SPCV(agRoot))
2286  {
2287    switch( status)
2288    {
2289      case 0:
2290          status = OSSA_SUCCESS;
2291          break;
2292      case MPI_ERR_DEVICE_HANDLE_UNAVAILABLE:
2293          status = OSSA_FAILURE_OUT_OF_RESOURCE;
2294          break;
2295      case MPI_ERR_DEVICE_ALREADY_REGISTERED:
2296          status = OSSA_FAILURE_DEVICE_ALREADY_REGISTERED;
2297          break;
2298      case MPI_ERR_PHY_ID_INVALID:
2299          status = OSSA_FAILURE_INVALID_PHY_ID;
2300          break;
2301      case MPI_ERR_PHY_ID_ALREADY_REGISTERED:
2302          status = OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED;
2303          break;
2304      case MPI_ERR_PORT_INVALID_PORT_ID:
2305          status = OSSA_FAILURE_PORT_ID_OUT_OF_RANGE;
2306          break;
2307      case MPI_ERR_PORT_STATE_NOT_VALID:
2308          status = OSSA_FAILURE_PORT_NOT_VALID_STATE;
2309          break;
2310      case MPI_ERR_DEVICE_TYPE_NOT_VALID:
2311          status = OSSA_FAILURE_DEVICE_TYPE_NOT_VALID;
2312          break;
2313      default:
2314        SA_ASSERT((0), "DeviceRegistration Unknown status");
2315        ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2316        pRequest->valid = agFALSE;
2317        /* return the request to free pool */
2318        if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2319        {
2320          SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
2321          saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2322        }
2323        else
2324        {
2325          /* return the request to free pool */
2326          saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2327        }
2328        ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2329
2330        return AGSA_RC_FAILURE;
2331    }
2332  }
2333
2334  switch (status)
2335  {
2336  case OSSA_SUCCESS:
2337    /* mapping the device handle and device id */
2338    deviceIdx = deviceId & DEVICE_ID_BITS;
2339    OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
2340    saRoot->DeviceMap[deviceIdx].DeviceIdFromFW = deviceId;
2341    saRoot->DeviceMap[deviceIdx].DeviceHandle = (void *)pDevice;
2342    pDevice->DeviceMapIndex = deviceId;
2343
2344    (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2345                                                                  agContext,
2346                                                                  OSSA_SUCCESS,
2347                                                                  &pDevice->targetDevHandle,
2348                                                                  deviceId
2349                                                                  );
2350
2351    break;
2352  case OSSA_FAILURE_OUT_OF_RESOURCE:
2353    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_OUT_OF_RESOURCE\n"));
2354    /* remove device from LL device list */
2355    siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2356
2357    /* call ossaDeviceRegistrationCB_t */
2358    (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2359                                                                  agContext,
2360                                                                  OSSA_FAILURE_OUT_OF_RESOURCE,
2361                                                                  &pDevice->targetDevHandle,
2362                                                                  deviceId
2363                                                                  );
2364
2365
2366    break;
2367  case OSSA_FAILURE_DEVICE_ALREADY_REGISTERED:
2368    /* get original device handle and device id */
2369    pDeviceRemove = pDevice;
2370    deviceIdx = deviceId & DEVICE_ID_BITS;
2371    OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
2372    pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
2373    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_DEVICE_ALREADY_REGISTERED, existing deviceContext %p\n", pDevice));
2374    /* no auto registration */
2375    if (pDevice != agNULL)
2376    {
2377      /* remove device from LL device list */
2378      siPortDeviceListRemove(agRoot, pDevice->pPort, pDeviceRemove);
2379
2380      /* call ossaDeviceRegistrationCB_t */
2381      (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2382                                                                    agContext,
2383                                                                    OSSA_FAILURE_DEVICE_ALREADY_REGISTERED,
2384                                                                    &pDevice->targetDevHandle,
2385                                                                    deviceId
2386                                                                    );
2387    }
2388    else
2389    {
2390      SA_DBG1(("mpiDeviceRegRsp: pDevice is NULL. TAG=0x%x, STATUS=0x%x DEVICEID=0x%x\n", tag, status, deviceId));
2391      smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2p");
2392      return AGSA_RC_FAILURE;
2393    }
2394
2395    break;
2396  case OSSA_FAILURE_INVALID_PHY_ID:
2397    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_INVALID_PHY_ID\n"));
2398    /* remove device from LL device list */
2399    siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2400
2401    /* call ossaDeviceRegistrationCB_t */
2402    (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2403                                                                  agContext,
2404                                                                  OSSA_FAILURE_INVALID_PHY_ID,
2405                                                                  &pDevice->targetDevHandle,
2406                                                                  deviceId
2407                                                                  );
2408    break;
2409  case OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED:
2410    /* get original device handle and device id */
2411    pDeviceRemove = pDevice;
2412    deviceIdx = deviceId & DEVICE_ID_BITS;
2413    OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
2414    pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
2415    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED, existing deviceContext %p\n", pDevice));
2416    /* no auto registration */
2417    if (pDevice != agNULL)
2418    {
2419      /* remove device from LL device list */
2420      siPortDeviceListRemove(agRoot, pDevice->pPort, pDeviceRemove);
2421
2422      /* call ossaDeviceRegistrationCB_t */
2423      (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2424                                                                    agContext,
2425                                                                    OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED,
2426                                                                    &pDevice->targetDevHandle,
2427                                                                    deviceId
2428                                                                    );
2429    }
2430    else
2431    {
2432      SA_DBG1(("mpiDeviceRegRsp: pDevice is NULL. TAG=0x%x, STATUS=0x%x DEVICEID=0x%x\n", tag, status, deviceId));
2433      smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2p");
2434      return AGSA_RC_FAILURE;
2435    }
2436
2437    break;
2438  case OSSA_FAILURE_PORT_ID_OUT_OF_RANGE:
2439    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_OUT_OF_RESOURCE\n"));
2440    /* remove device from LL device list */
2441    siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2442
2443    /* call ossaDeviceRegistrationCB_t */
2444    (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2445                                                                  agContext,
2446                                                                  OSSA_FAILURE_PORT_ID_OUT_OF_RANGE,
2447                                                                  &pDevice->targetDevHandle,
2448                                                                  deviceId
2449                                                                  );
2450    break;
2451  case OSSA_FAILURE_PORT_NOT_VALID_STATE:
2452    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_PORT_NOT_VALID_STATE\n"));
2453    /* remove device from LL device list */
2454    siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2455
2456    /* call ossaDeviceRegistrationCB_t */
2457    (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2458                                                                  agContext,
2459                                                                  OSSA_FAILURE_PORT_NOT_VALID_STATE,
2460                                                                  &pDevice->targetDevHandle,
2461                                                                  deviceId
2462                                                                  );
2463    break;
2464  case OSSA_FAILURE_DEVICE_TYPE_NOT_VALID:
2465    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_DEVICE_TYPE_NOT_VALID\n"));
2466    /* remove device from LL device list */
2467    siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2468    /* call ossaDeviceRegistrationCB_t */
2469    (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2470                                                                  agContext,
2471                                                                  OSSA_FAILURE_DEVICE_TYPE_NOT_VALID,
2472                                                                  &pDevice->targetDevHandle,
2473                                                                  deviceId
2474                                                                  );
2475    break;
2476  default:
2477    SA_DBG3(("mpiDeviceRegRsp, unknown status in response %d\n", status));
2478    break;
2479  }
2480
2481  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2482  pRequest->valid = agFALSE;
2483  /* return the request to free pool */
2484  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2485  {
2486    SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
2487    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2488  }
2489  else
2490  {
2491    /* return the request to free pool */
2492    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2493  }
2494  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2495
2496  smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "2p");
2497  return ret;
2498}
2499
2500/******************************************************************************/
2501/*! \brief SPC MPI Deregister Device Command Response
2502 *
2503 *  This function handles the response of Deregister Command.
2504 *
2505 *  \param agRoot       Handles for this instance of SAS/SATA hardware
2506 *  \param pIomb        pointer of Message
2507 *
2508 *  \return The read value
2509 *
2510 */
2511/*******************************************************************************/
2512GLOBAL bit32 mpiDeregDevHandleRsp(
2513  agsaRoot_t              *agRoot,
2514  agsaDeregDevHandleRsp_t *pIomb
2515  )
2516{
2517  bit32               ret = AGSA_RC_SUCCESS;
2518  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2519  agsaIORequestDesc_t *pRequest;
2520  agsaDevHandle_t     *agDevHandle;
2521  agsaContext_t       *agContext;
2522  agsaDeviceDesc_t    *pDevice;
2523  bit32               deviceIdx, status, tag;
2524
2525  smTraceFuncEnter(hpDBG_VERY_LOUD,"2r");
2526  SA_ASSERT((NULL != saRoot->DeviceDeregistrationCB), "DeviceDeregistrationCB can not be NULL");
2527
2528  SA_DBG3(("mpiDeregDevHandleRsp: start, HTAG=0x%x\n", pIomb->tag));
2529
2530  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDeregDevHandleRsp_t, tag)) ;
2531  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDeregDevHandleRsp_t, status)) ;
2532  OSSA_READ_LE_32(AGROOT, &deviceIdx, pIomb, OSSA_OFFSET_OF(agsaDeregDevHandleRsp_t, deviceId)) ;
2533  /* get request from IOMap */
2534
2535  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2536  if (agNULL == pRequest)
2537  {
2538    SA_DBG1(("mpiDeregDevHandleRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x deviceIdx 0x%x\n", tag, status,deviceIdx));
2539    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2r");
2540    return AGSA_RC_FAILURE;
2541  }
2542
2543  agContext = saRoot->IOMap[tag].agContext;
2544  /* remove the request from IOMap */
2545  saRoot->IOMap[tag].Tag = MARK_OFF;
2546  saRoot->IOMap[tag].IORequest = agNULL;
2547  saRoot->IOMap[tag].agContext = agNULL;
2548
2549  SA_ASSERT((pRequest->valid), "pRequest->valid");
2550
2551  pDevice = pRequest->pDevice;
2552  if (pDevice != agNULL)
2553  {
2554    if (pDevice->targetDevHandle.sdkData)
2555    {
2556      agDevHandle = &(pDevice->targetDevHandle);
2557    }
2558    else
2559    {
2560      agDevHandle = &(pDevice->initiatorDevHandle);
2561    }
2562  }
2563  else
2564  {
2565    SA_DBG1(("mpiDeregDevHandleRsp: pDevice is NULL"));
2566    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2r");
2567    return AGSA_RC_FAILURE;
2568  }
2569
2570  if (agNULL == agDevHandle)
2571  {
2572    SA_DBG1(("mpiDeregDevHandleRsp: warning!!! no deviceHandle is found"));
2573    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2r");
2574
2575    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2576    pRequest->valid = agFALSE;
2577    /* return the request to free pool */
2578    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2579    {
2580      SA_DBG1(("mpiDeregDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
2581      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2582    }
2583    else
2584    {
2585      /* return the request to free pool */
2586      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2587    }
2588    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2589
2590    return AGSA_RC_FAILURE;
2591  }
2592
2593  SA_DBG1(("mpiDeregDevHandleRsp: deviceID 0x%x Device Context %p\n", pDevice->DeviceMapIndex, pDevice));
2594
2595  if (agNULL == saRoot->DeviceDeregistrationCB)
2596  {
2597    SA_DBG1(("mpiDeregDevHandleRsp: warning!!! no DeviceDeregistrationCB is found"));
2598    smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2r");
2599
2600    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2601    pRequest->valid = agFALSE;
2602    /* return the request to free pool */
2603    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2604    {
2605      SA_DBG1(("mpiDeregDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
2606      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2607    }
2608    else
2609    {
2610      /* return the request to free pool */
2611      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2612    }
2613    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2614
2615    return AGSA_RC_FAILURE;
2616  }
2617
2618  switch (status)
2619  {
2620    case OSSA_SUCCESS:
2621     (*(ossaDeregisterDeviceHandleCB_t)(saRoot->DeviceDeregistrationCB))(agRoot,
2622                                                                agContext,
2623                                                                agDevHandle,
2624                                                                OSSA_SUCCESS
2625                                                                );
2626      siRemoveDevHandle(agRoot, agDevHandle);
2627      break;
2628    case OSSA_ERR_DEVICE_HANDLE_INVALID:
2629    case OSSA_INVALID_HANDLE:
2630      (*(ossaDeregisterDeviceHandleCB_t)(saRoot->DeviceDeregistrationCB))(agRoot,
2631                                                                agContext,
2632                                                                agDevHandle,
2633                                                                status
2634                                                                );
2635// already removed and no device to remove
2636//      siRemoveDevHandle(agRoot, agDevHandle);
2637      SA_DBG1(("mpiDeregDevRegRsp, OSSA_INVALID_HANDLE status in response %d\n", status));
2638      break;
2639    case OSSA_ERR_DEVICE_BUSY:
2640      (*(ossaDeregisterDeviceHandleCB_t)(saRoot->DeviceDeregistrationCB))(agRoot,
2641                                                                agContext,
2642                                                                agDevHandle,
2643                                                                status
2644                                                                );
2645      SA_DBG1(("mpiDeregDevRegRsp, OSSA_ERR_DEVICE_BUSY status in response %d\n", status));
2646      ret = AGSA_RC_BUSY;
2647      break;
2648    default:
2649      SA_DBG1(("mpiDeregDevRegRsp, unknown status in response 0x%X\n", status));
2650      break;
2651  }
2652
2653  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2654  pRequest->valid = agFALSE;
2655  /* return the request to free pool */
2656  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2657  {
2658    SA_DBG1(("mpiDeregDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
2659    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2660  }
2661  else
2662  {
2663    /* return the request to free pool */
2664    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2665  }
2666  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2667
2668  smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2r");
2669  return ret;
2670}
2671
2672
2673/******************************************************************************/
2674/*! \brief Get Phy Profile Response SPCv
2675 *
2676 *  This routine handles the response of Get Phy Profile Command Response
2677 *
2678 *  \param agRoot       Handles for this instance of SAS/SATA LLL
2679 *  \param pIomb        Pointer of IOMB Message
2680 *
2681 *  \return sucess or fail
2682 *  SPC  only
2683 */
2684/*******************************************************************************/
2685
2686GLOBAL bit32 mpiGetPhyProfileRsp(
2687  agsaRoot_t             *agRoot,
2688  agsaGetPhyProfileRspV_t *pIomb
2689  )
2690{
2691  bit32               ret = AGSA_RC_SUCCESS;
2692  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2693  agsaIORequestDesc_t *pRequest;
2694  agsaContext_t       *agContext;
2695  bit32              status, tag;
2696
2697  bit32          Reserved_SOP_PHYID;
2698  bit32          PhyId;
2699  bit32          SOP;
2700
2701  smTraceFuncEnter(hpDBG_VERY_LOUD,"2J");
2702  OSSA_READ_LE_32(agRoot, &status, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t, status));
2703  OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t, tag));
2704  /* get TAG */
2705  SA_DBG1(("mpiGetPhyProfileRsp: HTag=0x%x\n", tag));
2706
2707  /* get request from IOMap */
2708  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2709  if (agNULL == pRequest)
2710  {
2711    SA_DBG1(("mpiGetPhyProfileRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
2712    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2J");
2713    return AGSA_RC_FAILURE;
2714  }
2715
2716  agContext = saRoot->IOMap[tag].agContext;
2717
2718  OSSA_READ_LE_32(agRoot, &Reserved_SOP_PHYID, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,Reserved_Ppc_SOP_PHYID ));
2719
2720  /* remove the request from IOMap */
2721  saRoot->IOMap[tag].Tag = MARK_OFF;
2722  saRoot->IOMap[tag].IORequest = agNULL;
2723  saRoot->IOMap[tag].agContext = agNULL;
2724
2725  SA_ASSERT((pRequest->valid), "pRequest->valid");
2726  SA_DBG1(("mpiGetPhyProfileRsp:   %p\n",pIomb));
2727  SA_DBG1(("mpiGetPhyProfileRsp: completionCB %p\n",pRequest->completionCB ));
2728
2729  SOP = (Reserved_SOP_PHYID & 0xFF00) >> SHIFT8;
2730  PhyId = Reserved_SOP_PHYID & 0xFF;
2731
2732  /* check status success or failure */
2733  if (status)
2734  {
2735    /* status is FAILED */
2736    SA_DBG1(("mpiGetPhyProfileRsp:AGSA_RC_FAILURE  0x%08X\n", status));
2737    switch(SOP)
2738    {
2739      case AGSA_SAS_PHY_ERR_COUNTERS_PAGE:
2740      {
2741        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ERR_COUNTERS_PAGE SOP 0x%x\n", SOP));
2742        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2743        break;
2744      }
2745      case AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE:
2746      {
2747        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE SOP 0x%x\n", SOP));
2748        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2749        break;
2750      }
2751      case AGSA_SAS_PHY_BW_COUNTERS_PAGE:
2752      {
2753        SA_DBG1(("mpiGetPhyProfileRsp: GET_SAS_PHY_BW_COUNTERS SOP 0x%x\n", SOP));
2754        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2755        break;
2756      }
2757      case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
2758      {
2759        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE SOP 0x%x\n", SOP));
2760        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2761        break;
2762      }
2763      case AGSA_SAS_PHY_GENERAL_STATUS_PAGE:
2764      {
2765        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_GENERAL_STATUS_PAGE SOP 0x%x\n", SOP));
2766        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2767        break;
2768      }
2769      case AGSA_PHY_SNW3_PAGE:
2770      {
2771        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_SNW3_PAGE SOP 0x%x\n", SOP));
2772        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2773        break;
2774      }
2775      case AGSA_PHY_RATE_CONTROL_PAGE:
2776      {
2777        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_RATE_CONTROL_PAGE SOP 0x%x\n", SOP));
2778        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2779        break;
2780      }
2781      case AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE:
2782      {
2783        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE SOP 0x%x\n", SOP));
2784        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2785        break;
2786      }
2787      default:
2788      {
2789        SA_DBG1(("mpiGetPhyProfileRsp: undefined SOP 0x%x\n", SOP));
2790        break;
2791      }
2792    }
2793    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2J");
2794    return AGSA_RC_FAILURE;
2795  }
2796  else
2797  {
2798    SA_DBG1(("mpiGetPhyProfileRsp: SUCCESS type 0x%X\n",SOP ));
2799    switch(SOP)
2800    {
2801      case AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE:
2802        /* call back with the status */
2803        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE PhyId %d\n",PhyId));
2804        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL);
2805        break;
2806      case AGSA_SAS_PHY_ERR_COUNTERS_PAGE:
2807      {
2808
2809        agsaPhyErrCountersPage_t Errors;
2810
2811        OSSA_READ_LE_32(agRoot, &Errors.invalidDword,          pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2812        OSSA_READ_LE_32(agRoot, &Errors.runningDisparityError, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2813        OSSA_READ_LE_32(agRoot, &Errors.codeViolation,         pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
2814        OSSA_READ_LE_32(agRoot, &Errors.lossOfDwordSynch,      pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[3] ));
2815        OSSA_READ_LE_32(agRoot, &Errors.phyResetProblem,       pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[4] ));
2816        OSSA_READ_LE_32(agRoot, &Errors.inboundCRCError,       pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[5] ));
2817
2818        /* call back with the status */
2819        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &Errors);
2820        /* status is SUCCESS */
2821
2822        SA_DBG3(("mpiGetPhyProfileRsp: pIomb %p\n",pIomb));
2823        SA_DBG1(("mpiGetPhyProfileRsp: Reserved_SOP_PHYID    0x%08X\n",Reserved_SOP_PHYID));
2824        SA_DBG1(("mpiGetPhyProfileRsp: invalidDword          0x%08X\n",Errors.invalidDword ));
2825        SA_DBG1(("mpiGetPhyProfileRsp: runningDisparityError 0x%08X\n",Errors.runningDisparityError ));
2826        SA_DBG1(("mpiGetPhyProfileRsp: codeViolation         0x%08X\n",Errors.codeViolation ));
2827        SA_DBG1(("mpiGetPhyProfileRsp: lossOfDwordSynch      0x%08X\n",Errors.lossOfDwordSynch ));
2828        SA_DBG1(("mpiGetPhyProfileRsp: phyResetProblem       0x%08X\n",Errors.phyResetProblem ));
2829        SA_DBG1(("mpiGetPhyProfileRsp: inboundCRCError       0x%08X\n",Errors.inboundCRCError ));
2830        break;
2831
2832      }
2833      case AGSA_SAS_PHY_BW_COUNTERS_PAGE:
2834      {
2835
2836        agsaPhyBWCountersPage_t  bw_counts;
2837        OSSA_READ_LE_32(agRoot, &bw_counts.TXBWCounter, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2838        OSSA_READ_LE_32(agRoot, &bw_counts.RXBWCounter, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2839
2840        SA_DBG1(("mpiGetPhyProfileRsp: GET_SAS_PHY_BW_COUNTERS TX 0x%08X RX 0x%08X\n",bw_counts.TXBWCounter,bw_counts.RXBWCounter));
2841        /* call back with the status */
2842        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, &bw_counts);
2843        break;
2844      }
2845      case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
2846      {
2847        agsaPhyAnalogSettingsPage_t analog;
2848
2849        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE 0x%X\n",SOP));
2850        OSSA_READ_LE_32(agRoot, &analog.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2851        OSSA_READ_LE_32(agRoot, &analog.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2852        OSSA_READ_LE_32(agRoot, &analog.Dword2, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
2853        OSSA_READ_LE_32(agRoot, &analog.Dword3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[3] ));
2854        OSSA_READ_LE_32(agRoot, &analog.Dword4, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[4] ));
2855          /* call back with the status */
2856        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, &analog);
2857        break;
2858      }
2859
2860      case AGSA_SAS_PHY_GENERAL_STATUS_PAGE:
2861      {
2862        agsaSASPhyGeneralStatusPage_t GenStatus;
2863        OSSA_READ_LE_32(agRoot, &GenStatus.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2864        OSSA_READ_LE_32(agRoot, &GenStatus.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2865        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_GENERAL_STATUS_PAGE SOP 0x%x 0x%x 0x%x\n", SOP,GenStatus.Dword0,GenStatus.Dword1));
2866        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &GenStatus );
2867        break;
2868      }
2869      case AGSA_PHY_SNW3_PAGE:
2870      {
2871        agsaPhySNW3Page_t Snw3;
2872        OSSA_READ_LE_32(agRoot, &Snw3.LSNW3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2873        OSSA_READ_LE_32(agRoot, &Snw3.RSNW3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2874
2875        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_SNW3_PAGE SOP 0x%x\n", SOP));
2876        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &Snw3 );
2877        break;
2878      }
2879      case AGSA_PHY_RATE_CONTROL_PAGE:
2880      {
2881        agsaPhyRateControlPage_t RateControl;
2882        OSSA_READ_LE_32(agRoot, &RateControl.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2883        OSSA_READ_LE_32(agRoot, &RateControl.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2884        OSSA_READ_LE_32(agRoot, &RateControl.Dword2, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
2885        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_RATE_CONTROL_PAGE SOP 0x%x\n", SOP));
2886        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &RateControl );
2887        break;
2888      }
2889      case AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE:
2890      {
2891        agsaSASPhyOpenRejectRetryBackOffThresholdPage_t Backoff;
2892        OSSA_READ_LE_32(agRoot, &Backoff.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2893        OSSA_READ_LE_32(agRoot, &Backoff.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2894        OSSA_READ_LE_32(agRoot, &Backoff.Dword2, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
2895        OSSA_READ_LE_32(agRoot, &Backoff.Dword3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[3] ));
2896        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE SOP 0x%x\n", SOP));
2897        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &Backoff );
2898        break;
2899      }
2900      default:
2901      {
2902        SA_DBG1(("mpiGetPhyProfileRsp: undefined successful SOP 0x%x\n", SOP));
2903        break;
2904      }
2905
2906    }
2907  }
2908
2909  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2910  pRequest->valid = agFALSE;
2911  /* return the request to free pool */
2912  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2913  {
2914    SA_DBG1(("mpiGetPhyProfileRsp: saving pRequest (%p) for later use\n", pRequest));
2915    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2916  }
2917  else
2918  {
2919    /* return the request to free pool */
2920    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2921  }
2922  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2923
2924  /* return value */
2925  smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2J");
2926  return ret;
2927}
2928
2929
2930GLOBAL bit32 mpiSetPhyProfileRsp(
2931  agsaRoot_t             *agRoot,
2932  agsaSetPhyProfileRspV_t *pIomb
2933  )
2934{
2935  bit32               ret = AGSA_RC_SUCCESS;
2936  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2937  agsaIORequestDesc_t *pRequest;
2938  agsaContext_t       *agContext;
2939  bit32                status, tag;
2940
2941  bit32           Reserved_Ppc_PHYID;
2942  bit32           PhyId;
2943  bit16           SOP;
2944
2945  smTraceFuncEnter(hpDBG_VERY_LOUD,"2Q");
2946  OSSA_READ_LE_32(agRoot, &status, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t, status));
2947  OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t, tag));
2948  OSSA_READ_LE_32(agRoot, &Reserved_Ppc_PHYID, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t, Reserved_Ppc_PHYID));
2949  /* get TAG */
2950  SA_DBG1(("mpiSetPhyProfileRsp: HTag=0x%x\n", tag));
2951
2952  /* get request from IOMap */
2953  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2954  if (agNULL == pRequest)
2955  {
2956    SA_DBG1(("mpiSetPhyProfileRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
2957    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2Q");
2958    return AGSA_RC_FAILURE;
2959  }
2960
2961  agContext = saRoot->IOMap[tag].agContext;
2962
2963  /* remove the request from IOMap */
2964  saRoot->IOMap[tag].Tag = MARK_OFF;
2965  saRoot->IOMap[tag].IORequest = agNULL;
2966  saRoot->IOMap[tag].agContext = agNULL;
2967
2968  SA_DBG1(("mpiSetPhyProfileRsp:   %p\n",pIomb));
2969
2970  SOP = pRequest->SOP;
2971  PhyId = Reserved_Ppc_PHYID & 0xFF;
2972
2973  /* check status success or failure */
2974  if (status)
2975  {
2976    /* status is FAILED */
2977    SA_DBG1(("mpiSetPhyProfileRsp:AGSA_RC_FAILURE  0x%08X\n", status));
2978    switch(SOP)
2979    {
2980      case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
2981      {
2982        SA_DBG1(("mpiSetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE SOP 0x%x\n", SOP));
2983        ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
2984        break;
2985      }
2986      case AGSA_PHY_SNW3_PAGE:
2987      {
2988        SA_DBG1(("mpiSetPhyProfileRsp: AGSA_PHY_SNW3_PAGE SOP 0x%x\n", SOP));
2989        ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
2990        break;
2991      }
2992
2993      case AGSA_PHY_RATE_CONTROL_PAGE:
2994      {
2995        SA_DBG1(("mpiSetPhyProfileRsp: AGSA_PHY_RATE_CONTROL_PAGE SOP 0x%x\n", SOP));
2996        ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
2997        break;
2998      }
2999     case AGSA_SAS_PHY_MISC_PAGE:
3000      {
3001        SA_DBG1(("mpiSetPhyProfileRsp: AGSA_SAS_PHY_MISC_PAGE SOP 0x%x\n", SOP));
3002        ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
3003        break;
3004      }
3005
3006      default:
3007      {
3008        SA_DBG1(("mpiSetPhyProfileRsp: undefined SOP 0x%x\n", SOP));
3009        break;
3010      }
3011    }
3012    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2Q");
3013    return AGSA_RC_FAILURE;
3014  }
3015  else
3016  {
3017    SA_DBG1(("mpiSetPhyProfileRsp: SUCCESS type 0x%X\n",SOP ));
3018    switch(SOP)
3019    {
3020      case AGSA_PHY_SNW3_PAGE:
3021      case AGSA_PHY_RATE_CONTROL_PAGE:
3022      {
3023        SA_DBG1(("mpiSetPhyProfileRsp: Status 0x%x SOP 0x%x PhyId %d\n",status, SOP, PhyId));
3024        ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
3025        break;
3026
3027      }
3028      case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
3029      {
3030        agsaPhyAnalogSettingsPage_t analog;
3031
3032        SA_DBG1(("mpiSetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE 0x%X\n",SOP));
3033        OSSA_READ_LE_32(agRoot, &analog.Dword0, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[0] ));
3034        OSSA_READ_LE_32(agRoot, &analog.Dword1, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[1] ));
3035        OSSA_READ_LE_32(agRoot, &analog.Dword2, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[2] ));
3036        OSSA_READ_LE_32(agRoot, &analog.Dword3, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[3] ));
3037        OSSA_READ_LE_32(agRoot, &analog.Dword4, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[4] ));
3038          /* call back with the status */
3039        ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, &analog );
3040        break;
3041      }
3042      default:
3043      {
3044        SA_DBG1(("mpiSetPhyProfileRsp: undefined successful SOP 0x%x\n", SOP));
3045        break;
3046      }
3047
3048    }
3049  }
3050
3051  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3052  SA_ASSERT((pRequest->valid), "pRequest->valid");
3053  SA_DBG1(("mpiSetPhyProfileRsp: completionCB %p\n",pRequest->completionCB ));
3054
3055  pRequest->valid = agFALSE;
3056  /* return the request to free pool */
3057  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3058  {
3059    SA_DBG1(("mpiSetPhyProfileRsp: saving pRequest (%p) for later use\n", pRequest));
3060    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3061  }
3062  else
3063  {
3064    /* return the request to free pool */
3065    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3066  }
3067  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3068
3069  /* return value */
3070  smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2Q");
3071  return ret;
3072}
3073
3074
3075
3076/******************************************************************************/
3077/*! \brief Get Device Information Response
3078 *
3079 *  This routine handles the response of Get Device Info Command Response
3080 *
3081 *  \param agRoot       Handles for this instance of SAS/SATA LLL
3082 *  \param pIomb        Pointer of IOMB Message
3083 *
3084 *  \return sucess or fail
3085 *
3086 */
3087/*******************************************************************************/
3088GLOBAL bit32 mpiGetDevInfoRsp(
3089  agsaRoot_t          *agRoot,
3090  agsaGetDevInfoRspV_t *pIomb
3091  )
3092{
3093  bit32               ret = AGSA_RC_SUCCESS;
3094  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
3095  agsaIORequestDesc_t *pRequest;
3096  agsaDevHandle_t     *agDevHandle;
3097  agsaDeviceDesc_t    *pDevice;
3098  agsaContext_t       *agContext;
3099  agsaDeviceInfo_t    commonDevInfo;
3100  bit32               ARSrateSMPTimeOutPortID, IRMcnITNexusTimeOut, status, tag;
3101  bit32               deviceid;
3102  bit32               sasAddrHi;
3103  bit32               sasAddrLow;
3104#if defined(SALLSDK_DEBUG)
3105  bit32               option;
3106#endif /* SALLSDK_DEBUG */
3107
3108  smTraceFuncEnter(hpDBG_VERY_LOUD,"2M");
3109  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, status));
3110  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, tag));
3111  /* get TAG */
3112  SA_DBG3(("mpiGetDevInfoRsp: HTag=0x%x\n", tag));
3113
3114  /* get request from IOMap */
3115  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
3116  if (agNULL == pRequest)
3117  {
3118    SA_DBG1(("mpiGetDevInfoRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
3119    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2M");
3120    return AGSA_RC_FAILURE;
3121  }
3122
3123  agContext = saRoot->IOMap[tag].agContext;
3124
3125  /* remove the request from IOMap */
3126  saRoot->IOMap[tag].Tag = MARK_OFF;
3127  saRoot->IOMap[tag].IORequest = agNULL;
3128  saRoot->IOMap[tag].agContext = agNULL;
3129
3130  SA_ASSERT((pRequest->valid), "pRequest->valid");
3131
3132  /* check status success or failure */
3133  if (status)
3134  {
3135    /* status is FAILED */
3136    ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
3137    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2M");
3138
3139    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3140    pRequest->valid = agFALSE;
3141#if defined(SALLSDK_DEBUG)
3142    option = (bit32)pRequest->DeviceInfoCmdOption;
3143#endif /* SALLSDK_DEBUG */
3144    /* return the request to free pool */
3145    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3146    {
3147      SA_DBG1(("mpiGetDevInfoRsp: saving pRequest (%p) for later use\n", pRequest));
3148      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3149    }
3150    else
3151    {
3152      /* return the request to free pool */
3153      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3154    }
3155    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3156
3157    return AGSA_RC_FAILURE;
3158  }
3159
3160  /* status is SUCCESS */
3161  OSSA_READ_LE_32(AGROOT, &deviceid, pIomb,                OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, deviceId));
3162  OSSA_READ_LE_32(AGROOT, &ARSrateSMPTimeOutPortID, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, ARSrateSMPTimeOutPortID));
3163  OSSA_READ_LE_32(AGROOT, &IRMcnITNexusTimeOut, pIomb,       OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, IRMcnITNexusTimeOut));
3164  OSSA_READ_LE_32(AGROOT, &sasAddrHi, pIomb,       OSSA_OFFSET_OF(agsaGetDevInfoRspV_t,sasAddrHi[0] ));
3165  OSSA_READ_LE_32(AGROOT, &sasAddrLow, pIomb,       OSSA_OFFSET_OF(agsaGetDevInfoRspV_t,sasAddrLow[0] ));
3166
3167  /* find device handle from device index */
3168  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
3169  if (pDevice != agNULL)
3170  {
3171    if (pDevice->targetDevHandle.sdkData)
3172    {
3173      agDevHandle = &(pDevice->targetDevHandle);
3174    }
3175    else
3176    {
3177      agDevHandle = &(pDevice->initiatorDevHandle);
3178    }
3179  }
3180  else
3181  {
3182    SA_DBG1(("mpiGetDevInfoRsp: pDevice is NULL"));
3183    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2M");
3184    return AGSA_RC_FAILURE;
3185  }
3186
3187  if (agDevHandle == agNULL)
3188  {
3189    SA_DBG1(("mpiGetDevInfoRsp: warning!!! no deviceHandle is found"));
3190    ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
3191    smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2M");
3192
3193    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3194    pRequest->valid = agFALSE;
3195#if defined(SALLSDK_DEBUG)
3196    option = (bit32)pRequest->DeviceInfoCmdOption;
3197#endif /* SALLSDK_DEBUG */
3198    /* return the request to free pool */
3199    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3200    {
3201      SA_DBG1(("mpiGetDevInfoRsp: saving pRequest (%p) for later use\n", pRequest));
3202      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3203    }
3204    else
3205    {
3206      /* return the request to free pool */
3207      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3208    }
3209    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3210
3211    return AGSA_RC_FAILURE;
3212  }
3213
3214  /* setup common device information */
3215  si_memset(&commonDevInfo, 0, sizeof(agsaDeviceInfo_t));
3216  commonDevInfo.smpTimeout       = (bit16)((ARSrateSMPTimeOutPortID >> SHIFT8 ) & SMPTO_VBITS);
3217  commonDevInfo.it_NexusTimeout  = (bit16)(IRMcnITNexusTimeOut & NEXUSTO_VBITS);
3218  commonDevInfo.firstBurstSize   = (bit16)((IRMcnITNexusTimeOut >> SHIFT16) & FIRST_BURST_MCN);
3219  commonDevInfo.devType_S_Rate   = (bit8)((ARSrateSMPTimeOutPortID >> SHIFT24) & 0x3f);
3220  commonDevInfo.flag = (bit32)((ARSrateSMPTimeOutPortID >> SHIFT30 ) & FLAG_VBITS);
3221  commonDevInfo.flag |= IRMcnITNexusTimeOut & 0xf0000;
3222  if (IRMcnITNexusTimeOut & 0x1000000)
3223  {
3224    commonDevInfo.flag |= 0x100000;
3225  }
3226
3227  /* check SAS device then copy SAS Address */
3228  if ( ((ARSrateSMPTimeOutPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x00) ||
3229       ((ARSrateSMPTimeOutPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x01))
3230  {
3231    /* copy the sasAddressHi byte-by-byte : no endianness */
3232    commonDevInfo.sasAddressHi[0] = pIomb->sasAddrHi[0];
3233    commonDevInfo.sasAddressHi[1] = pIomb->sasAddrHi[1];
3234    commonDevInfo.sasAddressHi[2] = pIomb->sasAddrHi[2];
3235    commonDevInfo.sasAddressHi[3] = pIomb->sasAddrHi[3];
3236
3237    /* copy the sasAddressLow byte-by-byte : no endianness */
3238    commonDevInfo.sasAddressLo[0] = pIomb->sasAddrLow[0];
3239    commonDevInfo.sasAddressLo[1] = pIomb->sasAddrLow[1];
3240    commonDevInfo.sasAddressLo[2] = pIomb->sasAddrLow[2];
3241    commonDevInfo.sasAddressLo[3] = pIomb->sasAddrLow[3];
3242  }
3243
3244  /* copy common device information to SAS and SATA device common header*/
3245  si_memcpy(&pDevice->devInfo.sasDeviceInfo.commonDevInfo, &commonDevInfo, sizeof(agsaDeviceInfo_t));
3246  si_memcpy(&pDevice->devInfo.sataDeviceInfo.commonDevInfo, &commonDevInfo, sizeof(agsaDeviceInfo_t));
3247
3248  /* setup device firstBurstSize infomation */
3249  pDevice->devInfo.sataDeviceInfo.commonDevInfo.firstBurstSize =
3250       (bit16)((IRMcnITNexusTimeOut >> SHIFT16) & FIRST_BURST);
3251
3252  /* Display Device Information */
3253  SA_DBG3(("mpiGetDevInfoRsp: smpTimeout=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.smpTimeout));
3254  SA_DBG3(("mpiGetDevInfoRsp: it_NexusTimeout=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.it_NexusTimeout));
3255  SA_DBG3(("mpiGetDevInfoRsp: firstBurstSize=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.firstBurstSize));
3256  SA_DBG3(("mpiGetDevInfoRsp: devType_S_Rate=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate));
3257
3258  /*
3259  D518 P2I[15-12]: Disk  HP      DG0146FAMWL     , HPDE, WWID=5000c500:17459a31, 6.0G
3260  */
3261
3262  SA_DBG1(("mpiGetDevInfoRsp: Device 0x%08X flag 0x%08X %s WWID= %02x%02x%02x%02x:%02x%02x%02x%02x, %s\n",
3263    deviceid,
3264    pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag,
3265    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x20 ? "SATA DA" :
3266    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x10 ? "SSP/SMP" :
3267    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x0 ? "  STP  " : "Unknown",
3268
3269    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3],
3270    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2],
3271    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1],
3272    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0],
3273    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3],
3274    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2],
3275    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1],
3276    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0],
3277
3278    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 8  ? " 1.5G" :
3279    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 9  ? " 3.0G" :
3280    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 10 ? " 6.0G" :
3281    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 11 ? "12.0G" : "????" ));
3282
3283  ossaGetDeviceInfoCB(agRoot, agContext, agDevHandle, OSSA_DEV_INFO_NO_EXTENDED_INFO, &commonDevInfo);
3284
3285  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3286  pRequest->valid = agFALSE;
3287#if defined(SALLSDK_DEBUG)
3288  option = (bit32)pRequest->DeviceInfoCmdOption;
3289#endif /* SALLSDK_DEBUG */
3290  /* return the request to free pool */
3291  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3292  {
3293    SA_DBG1(("mpiGetDevInfoRsp: saving pRequest (%p) for later use\n", pRequest));
3294    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3295  }
3296  else
3297  {
3298    /* return the request to free pool */
3299    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3300  }
3301  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3302
3303  /* return value */
3304  smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2M");
3305  return ret;
3306}
3307
3308/******************************************************************************/
3309/*! \brief Get Device Information Response
3310 *
3311 *  This routine handles the response of Get Device Info Command Response
3312 *
3313 *  \param agRoot       Handles for this instance of SAS/SATA LLL
3314 *  \param pIomb        Pointer of IOMB Message
3315 *
3316 *  \return sucess or fail
3317 *
3318 */
3319/*******************************************************************************/
3320GLOBAL bit32 mpiGetDevInfoRspSpc(
3321  agsaRoot_t          *agRoot,
3322  agsaGetDevInfoRsp_t *pIomb
3323  )
3324{
3325  bit32               ret = AGSA_RC_SUCCESS;
3326  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
3327  agsaIORequestDesc_t *pRequest;
3328  agsaDevHandle_t     *agDevHandle;
3329  agsaDeviceDesc_t    *pDevice;
3330  agsaContext_t       *agContext;
3331  bit32               dTypeSrateSMPTOPortID, FirstBurstSizeITNexusTimeOut, status, tag;
3332  bit32               deviceid;
3333  bit32               sasAddrHi;
3334  bit32               sasAddrLow;
3335  bit32               Info_avail = 0;
3336
3337  smTraceFuncEnter(hpDBG_VERY_LOUD,"2t");
3338  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, status));
3339  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, tag));
3340  /* get TAG */
3341  SA_DBG3(("mpiGetDevInfoRspSpc: HTag=0x%x\n", tag));
3342
3343  /* get request from IOMap */
3344  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
3345  if (agNULL == pRequest)
3346  {
3347    SA_DBG1(("mpiGetDevInfoRspSpc: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
3348    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2t");
3349    return AGSA_RC_FAILURE;
3350  }
3351
3352  agContext = saRoot->IOMap[tag].agContext;
3353
3354  /* remove the request from IOMap */
3355  saRoot->IOMap[tag].Tag = MARK_OFF;
3356  saRoot->IOMap[tag].IORequest = agNULL;
3357  saRoot->IOMap[tag].agContext = agNULL;
3358
3359  SA_ASSERT((pRequest->valid), "pRequest->valid");
3360
3361  /* check status success or failure */
3362  if (status)
3363  {
3364    /* status is FAILED */
3365    ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
3366    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2t");
3367    return AGSA_RC_FAILURE;
3368  }
3369
3370  /* status is SUCCESS */
3371  OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, deviceId));
3372  OSSA_READ_LE_32(AGROOT, &dTypeSrateSMPTOPortID, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, dTypeSrateSMPTOArPortID));
3373  OSSA_READ_LE_32(AGROOT, &FirstBurstSizeITNexusTimeOut, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, FirstBurstSizeITNexusTimeOut));
3374  OSSA_READ_LE_32(AGROOT, &sasAddrHi, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, sasAddrHi[0]));
3375  OSSA_READ_LE_32(AGROOT, &sasAddrLow, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, sasAddrLow[0]));
3376
3377
3378  SA_DBG2(("mpiGetDevInfoRspSpc:deviceid                     0x%08X\n",deviceid));
3379  SA_DBG2(("mpiGetDevInfoRspSpc:dTypeSrateSMPTOPortID        0x%08X\n",dTypeSrateSMPTOPortID));
3380  SA_DBG2(("mpiGetDevInfoRspSpc:FirstBurstSizeITNexusTimeOut 0x%08X\n",FirstBurstSizeITNexusTimeOut));
3381  SA_DBG2(("mpiGetDevInfoRspSpc:sasAddrHi                    0x%08X\n",sasAddrHi));
3382  SA_DBG2(("mpiGetDevInfoRspSpc:sasAddrLow                   0x%08X\n",sasAddrLow));
3383
3384
3385  /* find device handle from device index */
3386  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
3387  if (pDevice != agNULL)
3388  {
3389    if (pDevice->targetDevHandle.sdkData)
3390    {
3391      agDevHandle = &(pDevice->targetDevHandle);
3392    }
3393    else
3394    {
3395      agDevHandle = &(pDevice->initiatorDevHandle);
3396    }
3397  }
3398  else
3399  {
3400    SA_DBG1(("mpiGetDevInfoRspSpc: pDevice is NULL"));
3401    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2t");
3402    return AGSA_RC_FAILURE;
3403  }
3404
3405  if (agDevHandle == agNULL)
3406  {
3407    SA_DBG1(("mpiGetDevInfoRspSpc: warning!!! no deviceHandle is found"));
3408    ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
3409    smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2t");
3410
3411    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3412    pRequest->valid = agFALSE;
3413    /* return the request to free pool */
3414    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3415    {
3416      SA_DBG1(("mpiGetDevInfoRspSpc: saving pRequest (%p) for later use\n", pRequest));
3417      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3418    }
3419    else
3420    {
3421      /* return the request to free pool */
3422      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3423    }
3424    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3425
3426    return AGSA_RC_FAILURE;
3427  }
3428
3429  Info_avail = OSSA_DEV_INFO_NO_EXTENDED_INFO;
3430
3431  /* setup device common infomation */
3432  pDevice->devInfo.sasDeviceInfo.commonDevInfo.smpTimeout =
3433    (bit16)((dTypeSrateSMPTOPortID >> SHIFT8 ) & SMPTO_BITS);
3434
3435  pDevice->devInfo.sataDeviceInfo.commonDevInfo.smpTimeout =
3436    (bit16)((dTypeSrateSMPTOPortID >> SHIFT8 ) & SMPTO_BITS);
3437
3438  pDevice->devInfo.sasDeviceInfo.commonDevInfo.it_NexusTimeout =
3439    (bit16)(FirstBurstSizeITNexusTimeOut & NEXUSTO_BITS);
3440
3441  pDevice->devInfo.sataDeviceInfo.commonDevInfo.it_NexusTimeout =
3442    (bit16)(FirstBurstSizeITNexusTimeOut & NEXUSTO_BITS);
3443
3444  pDevice->devInfo.sasDeviceInfo.commonDevInfo.firstBurstSize =
3445    (bit16)((FirstBurstSizeITNexusTimeOut >> SHIFT16) & FIRST_BURST);
3446
3447  pDevice->devInfo.sataDeviceInfo.commonDevInfo.firstBurstSize =
3448    (bit16)((FirstBurstSizeITNexusTimeOut >> SHIFT16) & FIRST_BURST);
3449
3450  pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag = (bit32)((dTypeSrateSMPTOPortID >> SHIFT4 ) & FLAG_BITS);
3451
3452  pDevice->devInfo.sataDeviceInfo.commonDevInfo.flag = (bit32)((dTypeSrateSMPTOPortID >> SHIFT4 ) & FLAG_BITS);
3453
3454  pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate =
3455    (bit8)((dTypeSrateSMPTOPortID >> SHIFT24) & LINK_RATE_BITS);
3456
3457  pDevice->devInfo.sataDeviceInfo.commonDevInfo.devType_S_Rate =
3458    (bit8)((dTypeSrateSMPTOPortID >> SHIFT24) & LINK_RATE_BITS);
3459
3460  /* check SAS device then copy SAS Address */
3461  if ( ((dTypeSrateSMPTOPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x00) ||
3462       ((dTypeSrateSMPTOPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x01))
3463  {
3464    /* copy the sasAddressHi byte-by-byte : no endianness */
3465    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0] = pIomb->sasAddrHi[0];
3466    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1] = pIomb->sasAddrHi[1];
3467    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2] = pIomb->sasAddrHi[2];
3468    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3] = pIomb->sasAddrHi[3];
3469
3470    /* copy the sasAddressLow byte-by-byte : no endianness */
3471    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0] = pIomb->sasAddrLow[0];
3472    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1] = pIomb->sasAddrLow[1];
3473    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2] = pIomb->sasAddrLow[2];
3474    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3] = pIomb->sasAddrLow[3];
3475  }
3476
3477  /* Display Device Information */
3478  SA_DBG3(("mpiGetDevInfoRspSpc: smpTimeout=     0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.smpTimeout));
3479  SA_DBG3(("mpiGetDevInfoRspSpc: it_NexusTimeout=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.it_NexusTimeout));
3480  SA_DBG3(("mpiGetDevInfoRspSpc: firstBurstSize= 0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.firstBurstSize));
3481  SA_DBG3(("mpiGetDevInfoRspSpc: devType_S_Rate= 0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate));
3482
3483
3484  SA_DBG1(("Device SPC deviceid 0x%08X flag 0x%08X %s WWID= %02x%02x%02x%02x:%02x%02x%02x%02x, %s\n",
3485    deviceid,
3486    pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag,
3487    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x20 ? "SATA DA" :
3488    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x10 ? "SSP/SMP" :
3489    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x0 ? "  STP  " : "Unknown",
3490
3491    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3],
3492    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2],
3493    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1],
3494    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0],
3495    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3],
3496    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2],
3497    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1],
3498    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0],
3499
3500    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 8  ? " 1.5G" :
3501    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 9  ? " 3.0G" :
3502    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 10 ? " 6.0G" :
3503    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 11 ? "12.0G" : "????" ));
3504
3505  ossaGetDeviceInfoCB(agRoot, agContext, agDevHandle, Info_avail, &pDevice->devInfo.sasDeviceInfo.commonDevInfo);
3506
3507  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3508  pRequest->valid = agFALSE;
3509  /* return the request to free pool */
3510  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3511  {
3512    SA_DBG1(("mpiGetDevInfoRspSpc: saving pRequest (%p) for later use\n", pRequest));
3513    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3514  }
3515  else
3516  {
3517    /* return the request to free pool */
3518    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3519  }
3520  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3521
3522  /* return value */
3523  smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2t");
3524  return ret;
3525}
3526
3527/******************************************************************************/
3528/*! \brief Set Device Information Response
3529 *
3530 *  This routine handles the response of Set Device Info Command Response
3531 *
3532 *  \param agRoot       Handles for this instance of SAS/SATA LLL
3533 *  \param pIomb        Pointer of IOMB Message
3534 *
3535 *  \return sucess or fail
3536 *
3537 */
3538/*******************************************************************************/
3539GLOBAL bit32 mpiSetDevInfoRsp(
3540  agsaRoot_t             *agRoot,
3541  agsaSetDeviceInfoRsp_t *pIomb
3542  )
3543{
3544  bit32               ret = AGSA_RC_SUCCESS;
3545  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
3546  agsaIORequestDesc_t *pRequest;
3547  agsaDevHandle_t     *agDevHandle;
3548  agsaDeviceDesc_t    *pDevice;
3549  agsaContext_t       *agContext;
3550  bit32               tag, status, deviceid, option, param;
3551
3552  smTraceFuncEnter(hpDBG_VERY_LOUD,"2v");
3553  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, status));
3554  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, tag));
3555  /* get TAG */
3556  SA_DBG3(("mpiSetDevInfoRsp: HTag=0x%x\n", tag));
3557
3558  /* get request from IOMap */
3559  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
3560  if (agNULL == pRequest)
3561  {
3562    SA_DBG1(("mpiSetDevInfoRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
3563    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2v");
3564    return AGSA_RC_FAILURE;
3565  }
3566
3567  agContext = saRoot->IOMap[tag].agContext;
3568
3569  /* remove the request from IOMap */
3570  saRoot->IOMap[tag].Tag = MARK_OFF;
3571  saRoot->IOMap[tag].IORequest = agNULL;
3572  saRoot->IOMap[tag].agContext = agNULL;
3573
3574  SA_ASSERT((pRequest->valid), "pRequest->valid");
3575  /* check status success or failure */
3576  if (status)
3577  {
3578    /* status is FAILED */
3579    if (pRequest->completionCB == agNULL)
3580    {
3581      SA_DBG1(("mpiSetDevInfoRsp: status is FAILED pRequest->completionCB == agNULL\n" ));
3582      ossaSetDeviceInfoCB(agRoot, agContext, agNULL, status, 0, 0);
3583    }
3584    else
3585    {
3586      SA_DBG1(("mpiSetDevInfoRsp: status is FAILED use CB\n" ));
3587      (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agNULL, status, 0, 0);
3588    }
3589    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2v");
3590
3591    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3592    pRequest->valid = agFALSE;
3593    /* return the request to free pool */
3594    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3595    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3596
3597    return AGSA_RC_FAILURE;
3598  }
3599
3600  /* status is SUCCESS */
3601  OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, deviceId));
3602  OSSA_READ_LE_32(AGROOT, &option, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, SA_SR_SI));
3603  OSSA_READ_LE_32(AGROOT, &param, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, A_R_ITNT));
3604
3605  /* find device handle from device index */
3606  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
3607  if (pDevice != agNULL)
3608  {
3609    if (pDevice->targetDevHandle.sdkData)
3610    {
3611      agDevHandle = &(pDevice->targetDevHandle);
3612    }
3613    else
3614    {
3615      agDevHandle = &(pDevice->initiatorDevHandle);
3616    }
3617  }
3618  else
3619  {
3620    SA_DBG1(("mpiSetDevInfoRsp: pDevice is NULL"));
3621    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3622    pRequest->valid = agFALSE;
3623    /* return the request to free pool */
3624    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3625    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3626    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2v");
3627    return AGSA_RC_FAILURE;
3628  }
3629
3630  if (agDevHandle == agNULL)
3631  {
3632    SA_DBG1(("mpiSetDevInfoRsp: warning!!! no deviceHandle is found"));
3633    if (pRequest->completionCB == agNULL)
3634    {
3635      ossaSetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0, 0);
3636    }
3637    else
3638    {
3639      (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0, 0);
3640    }
3641    smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2v");
3642
3643    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3644    pRequest->valid = agFALSE;
3645    /* return the request to free pool */
3646    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3647    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3648
3649    return AGSA_RC_FAILURE;
3650  }
3651
3652  SA_DBG2(("mpiSetDevInfoRsp:, option 0x%X param 0x%X\n", option, param));
3653
3654  if(smIS_SPCV(agRoot))
3655  {
3656    SA_DBG2(("mpiSetDevInfoRsp:was option 0x%X param 0x%X\n", option, param));
3657    SA_DBG2(("mpiSetDevInfoRsp:pDevice->option 0x%X pDevice->param 0x%X\n", pDevice->option, pDevice->param));
3658    option |= pDevice->option;
3659    param |= pDevice->param;
3660    SA_DBG2(("mpiSetDevInfoRsp:now option 0x%X param 0x%X\n", option, param));
3661    if (pRequest->completionCB == agNULL)
3662    {
3663      ossaSetDeviceInfoCB(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
3664    }
3665    else
3666    {
3667      (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
3668    }
3669  }
3670  else
3671  {
3672    SA_DBG2(("mpiSetDevInfoRsp:, option 0x%X param 0x%X\n", option, param));
3673    if (pRequest->completionCB == agNULL)
3674    {
3675      ossaSetDeviceInfoCB(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
3676    }
3677    else
3678    {
3679      (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
3680    }
3681  }
3682
3683  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3684  pRequest->valid = agFALSE;
3685  /* return the request to free pool */
3686  saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3687  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3688
3689  /* return value */
3690  smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2v");
3691  return ret;
3692}
3693
3694/******************************************************************************/
3695/*! \brief SPC MPI SSP Event
3696 *
3697 *  This function handles the SAS Event.
3698 *
3699 *  \param agRoot       Handles for this instance of SAS/SATA LLL
3700 *  \param pIomb        pointer of Message
3701 *
3702 *  \return The read value
3703 *
3704 */
3705/*******************************************************************************/
3706GLOBAL bit32 mpiSSPEvent(
3707  agsaRoot_t        *agRoot,
3708  agsaSSPEventRsp_t *pIomb
3709  )
3710{
3711  bit32               ret = AGSA_RC_SUCCESS;
3712  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
3713  agsaIORequestDesc_t *pRequest;
3714  agsaPortContext_t   *agPortContext;
3715  agsaDevHandle_t     *agDevHandle;
3716  agsaDeviceDesc_t    *pDevice;
3717  bit32               event,deviceId;
3718  bit32               deviceIdx, tag, portId_tmp;
3719  bit32               SSPTag;
3720  bit16               sspTag;
3721  bit8                portId;
3722
3723  agsaDifDetails_t Dif_details;
3724
3725  smTraceFuncEnter(hpDBG_VERY_LOUD,"2u");
3726
3727  OSSA_READ_LE_32(AGROOT, &event, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, event));
3728  OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, deviceId));
3729  OSSA_READ_LE_32(AGROOT, &portId_tmp, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, portId));
3730  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, tag));
3731  OSSA_READ_LE_32(AGROOT, &SSPTag, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, SSPTag));
3732
3733
3734  sspTag = (bit16)(SSPTag & SSPTAG_BITS);
3735
3736  /* get IORequest from IOMap */
3737  pRequest  = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
3738
3739  SA_ASSERT((pRequest), "pRequest");
3740
3741  if(agNULL == pRequest)
3742  {
3743    SA_DBG1(("mpiSSPEvent: agNULL == pRequest event 0x%X\n", event));
3744    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2u");
3745    return AGSA_RC_FAILURE;
3746  }
3747
3748  /* get port context */
3749  portId = (bit8)(portId_tmp & PORTID_MASK);
3750  SA_DBG2(("mpiSSPEvent:PortID 0x%x PortStatus 0x%x PortContext %p\n",saRoot->PortMap[portId & PORTID_MASK].PortID,saRoot->PortMap[portId & PORTID_MASK].PortStatus,saRoot->PortMap[portId & PORTID_MASK].PortContext));
3751  agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
3752  /* get device Id */
3753  deviceIdx = deviceId & DEVICE_ID_BITS;
3754  OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
3755  /* find device handle from device index */
3756  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
3757
3758  if( agNULL == pDevice )
3759  {
3760    OS_ASSERT(pDevice, "pDevice");
3761    agDevHandle = agNULL;
3762  }
3763  else
3764  {
3765    if (pDevice->targetDevHandle.sdkData)
3766    {
3767      agDevHandle = &(pDevice->targetDevHandle);
3768    }
3769    else
3770    {
3771      agDevHandle = &(pDevice->initiatorDevHandle);
3772    }
3773  }
3774
3775  switch (event)
3776  {
3777    case  OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
3778    case  OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
3779    case  OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
3780    case  OSSA_IO_XFR_ERROR_DIF_MISMATCH:
3781    {
3782
3783      SA_DBG1(("mpiSSPEvent:  DIF Event 0x%x HTAG = 0x%x\n", event, tag));
3784
3785      OSSA_READ_LE_32(AGROOT, &Dif_details.UpperLBA,           pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, EVT_PARAM0_or_LBAH));
3786      OSSA_READ_LE_32(AGROOT, &Dif_details.LowerLBA,           pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, EVT_PARAM1_or_LBAL));
3787      OSSA_READ_LE_32(AGROOT, &Dif_details.sasAddressHi,       pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, SAS_ADDRH));
3788      OSSA_READ_LE_32(AGROOT, &Dif_details.sasAddressLo,       pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, SAS_ADDRL));
3789      OSSA_READ_LE_32(AGROOT, &Dif_details.ExpectedCRCUDT01,   pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT1_E_UDT0_E_CRC_E));
3790      OSSA_READ_LE_32(AGROOT, &Dif_details.ExpectedUDT2345,    pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT5_E_UDT4_E_UDT3_E_UDT2_E));
3791      OSSA_READ_LE_32(AGROOT, &Dif_details.ActualCRCUDT01,     pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT1_A_UDT0_A_CRC_A));
3792      OSSA_READ_LE_32(AGROOT, &Dif_details.ActualUDT2345,      pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT5_A_UDT4_A_UDT3_A_UDT2_A));
3793      OSSA_READ_LE_32(AGROOT, &Dif_details.DIFErrDevID,        pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, HW_DEVID_Reserved_DIF_ERR));
3794      OSSA_READ_LE_32(AGROOT, &Dif_details.ErrBoffsetEDataLen, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, EDATA_LEN_ERR_BOFF));
3795
3796      SA_DBG2(("mpiSSPEvent: UpperLBA.         0x%08X LowerLBA.           0x%08X\n",Dif_details.UpperLBA,         Dif_details.LowerLBA));
3797      SA_DBG2(("mpiSSPEvent: sasAddressHi.     0x%02X%02X%02X%02X sasAddressLo.       0x%02X%02X%02X%02X\n",
3798                          Dif_details.sasAddressHi[0],Dif_details.sasAddressHi[1],Dif_details.sasAddressHi[2],Dif_details.sasAddressHi[3],
3799                          Dif_details.sasAddressLo[0],Dif_details.sasAddressLo[1],Dif_details.sasAddressLo[2],Dif_details.sasAddressLo[3]));
3800      SA_DBG2(("mpiSSPEvent: ExpectedCRCUDT01. 0x%08X ExpectedUDT2345.    0x%08X\n",Dif_details.ExpectedCRCUDT01, Dif_details.ExpectedUDT2345));
3801      SA_DBG2(("mpiSSPEvent: ActualCRCUDT01.   0x%08X ActualUDT2345.      0x%08X\n",Dif_details.ActualCRCUDT01,   Dif_details.ActualUDT2345));
3802      SA_DBG2(("mpiSSPEvent: DIFErrDevID.      0x%08X ErrBoffsetEDataLen. 0x%08X\n",Dif_details.DIFErrDevID,      Dif_details.ErrBoffsetEDataLen));
3803    }
3804
3805    default:
3806    {
3807      SA_DBG3(("mpiSSPEvent:  Non DIF event"));
3808      break;
3809    }
3810  }
3811
3812
3813  /* get event */
3814  switch (event)
3815  {
3816    case OSSA_IO_OVERFLOW:
3817    {
3818      SA_DBG1(("mpiSSPEvent: OSSA_IO_OVERFLOW tag 0x%x ssptag 0x%x\n", tag, sspTag));
3819      saRoot->IoEventCount.agOSSA_IO_OVERFLOW++;
3820      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3821      break;
3822    }
3823    case OSSA_IO_XFER_ERROR_BREAK:
3824    {
3825      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_BREAK tag 0x%x ssptag 0x%x\n", tag, sspTag));
3826      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_BREAK++;
3827      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3828      break;
3829    }
3830    case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
3831    {
3832      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_PHY_NOT_READY tag 0x%x ssptag 0x%x\n", tag, sspTag));
3833      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
3834      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3835      break;
3836    }
3837    case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
3838    {
3839      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3840      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
3841      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3842      break;
3843    }
3844    case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
3845    {
3846      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION tag 0x%x ssptag 0x%x\n", tag, sspTag));
3847      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
3848      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3849      break;
3850    }
3851    case OSSA_IO_OPEN_CNX_ERROR_BREAK:
3852    {
3853      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_BREAK tag 0x%x ssptag 0x%x\n", tag, sspTag));
3854      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
3855      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3856      break;
3857    }
3858    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
3859    {
3860      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS tag 0x%x ssptag 0x%x\n", tag, sspTag));
3861      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
3862      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3863      break;
3864    }
3865    case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
3866    {
3867      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION tag 0x%x ssptag 0x%x\n", tag, sspTag));
3868      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
3869      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3870      break;
3871    }
3872    case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
3873    {
3874      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3875      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
3876      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3877      break;
3878    }
3879    case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
3880    {
3881      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION tag 0x%x ssptag 0x%x\n", tag, sspTag));
3882      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
3883      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3884      break;
3885    }
3886    case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
3887    {
3888      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_NAK_RECEIVED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3889      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_NAK_RECEIVED++;
3890      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3891      break;
3892    }
3893    case OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT:
3894    {
3895      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT tag 0x%x ssptag 0x%x\n", tag, sspTag));
3896      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT++;
3897      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3898      break;
3899    }
3900    case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH:
3901    {
3902      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
3903#ifdef SA_ENABLE_PCI_TRIGGER
3904      if( saRoot->swConfig.PCI_trigger & PCI_TRIGGER_OFFSET_MISMATCH )
3905      {
3906        siPCITriger(agRoot);
3907      }
3908#endif /* SA_ENABLE_PCI_TRIGGER */
3909      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_OFFSET_MISMATCH++;
3910      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3911      break;
3912    }
3913    case OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN:
3914    {
3915      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN tag 0x%x ssptag 0x%x\n", tag, sspTag));
3916      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN++;
3917      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3918      break;
3919    }
3920    case OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT:
3921    {
3922      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT tag 0x%x ssptag 0x%x\n", tag, sspTag));
3923      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT++;
3924      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3925      break;
3926    }
3927    case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
3928    {
3929      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT tag 0x%x ssptag 0x%x\n", tag, sspTag));
3930      saRoot->IoEventCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
3931      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3932      break;
3933    }
3934    case OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN:
3935    {
3936      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN tag 0x%x ssptag 0x%x\n", tag, sspTag));
3937      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN++;
3938      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3939      break;
3940    }
3941    case OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED:
3942    {
3943      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3944      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED++;
3945      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3946      break;
3947    }
3948    case OSSA_IO_XFER_CMD_FRAME_ISSUED:
3949    {
3950      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3951      saRoot->IoEventCount.agOSSA_IO_XFER_CMD_FRAME_ISSUED++;
3952      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3953      break;
3954    }
3955    case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE:
3956    {
3957      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE tag 0x%x ssptag 0x%x\n", tag, sspTag));
3958      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_UNEXPECTED_PHASE++;
3959      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3960      break;
3961    }
3962    case  OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
3963    {
3964      SA_DBG1(("mpiSSPEvent:OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x sspTag = 0x%x\n", tag, sspTag));
3965      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
3966      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3967      break;
3968    }
3969    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
3970    {
3971      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO tag 0x%x ssptag 0x%x\n", tag, sspTag));
3972      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO++;
3973      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3974      break;
3975    }
3976    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
3977    {
3978      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST tag 0x%x ssptag 0x%x\n", tag, sspTag));
3979      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
3980      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3981      break;
3982    }
3983    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
3984    {
3985      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE tag 0x%x ssptag 0x%x\n", tag, sspTag));
3986      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE++;
3987      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3988      break;
3989    }
3990    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
3991    {
3992      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3993      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
3994      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3995      break;
3996    }
3997    case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
3998    {
3999      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS tag 0x%x ssptag 0x%x\n", tag, sspTag));
4000      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS++;
4001      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
4002      break;
4003    }
4004    case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
4005    {
4006      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4007      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH++;
4008      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
4009      break;
4010    }
4011    case  OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR:
4012    {
4013      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR HTAG = 0x%x\n", tag));
4014      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR++;
4015      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
4016      break;
4017    }
4018    case  OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
4019    {
4020      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4021      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH++;
4022      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
4023      break;
4024    }
4025    case  OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
4026    {
4027      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4028      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH++;
4029      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
4030      break;
4031    }
4032    case  OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
4033    {
4034      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4035      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH++;
4036      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
4037      break;
4038    }
4039    case  OSSA_IO_XFR_ERROR_DIF_MISMATCH:
4040    {
4041      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4042      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_MISMATCH++;
4043      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
4044      break;
4045    }
4046    case  OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
4047    {
4048      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN tag 0x%x ssptag 0x%x\n", tag, sspTag));
4049      saRoot->IoEventCount.agOSSA_IO_XFER_ERR_EOB_DATA_OVERRUN++;
4050      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0, agNULL);
4051      break;
4052    }
4053    case OSSA_IO_XFER_READ_COMPL_ERR:
4054    {
4055      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_READ_COMPL_ERR tag 0x%x ssptag 0x%x\n", tag, sspTag));
4056      saRoot->IoEventCount.agOSSA_IO_XFER_READ_COMPL_ERR++;
4057      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0, agNULL);
4058      break;
4059    }
4060    default:
4061    {
4062      SA_DBG1(("mpiSSPEvent:  Unknown Event 0x%x tag 0x%x ssptag 0x%x\n", event, tag, sspTag));
4063      saRoot->IoEventCount.agOSSA_IO_UNKNOWN_ERROR++;
4064      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
4065      break;
4066    }
4067  }
4068
4069  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2u");
4070  /* return value */
4071  return ret;
4072}
4073
4074/******************************************************************************/
4075/*! \brief SPC MPI SATA Event
4076 *
4077 *  This function handles the SATA Event.
4078 *
4079 *  \param agRoot       Handles for this instance of SAS/SATA LLL
4080 *  \param pIomb        pointer of Message
4081 *
4082 *  \return The read value
4083 *
4084 */
4085/*******************************************************************************/
4086GLOBAL bit32 mpiSATAEvent(
4087  agsaRoot_t         *agRoot,
4088  agsaSATAEventRsp_t *pIomb
4089  )
4090{
4091  bit32               ret = AGSA_RC_SUCCESS;
4092  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4093  agsaIORequestDesc_t *pRequest = agNULL;
4094  agsaPortContext_t   *agPortContext;
4095  agsaDevHandle_t     *agDevHandle;
4096  agsaDeviceDesc_t    *pDevice;
4097  bit32               deviceIdx, portId_tmp, event, tag, deviceId;
4098  bit8                portId;
4099
4100  smTraceFuncEnter(hpDBG_VERY_LOUD,"2w");
4101
4102  /* get port context */
4103  OSSA_READ_LE_32(AGROOT, &portId_tmp, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, portId));
4104  OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, deviceId));
4105  OSSA_READ_LE_32(AGROOT, &event, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, event));
4106  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, tag));
4107
4108  if (OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE != event)
4109  {
4110    /* get IORequest from IOMap */
4111    pRequest  = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4112  }
4113  /* get port context - only for OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE */
4114  portId = (bit8)(portId_tmp & PORTID_MASK);
4115  SA_DBG2(("mpiSATAEvent:PortID 0x%x PortStatus 0x%x PortContext %p\n",saRoot->PortMap[portId & PORTID_MASK].PortID,saRoot->PortMap[portId & PORTID_MASK].PortStatus,saRoot->PortMap[portId & PORTID_MASK].PortContext));
4116  agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
4117  /* get device Id - only for OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE*/
4118  deviceIdx = deviceId & DEVICE_ID_BITS;
4119  OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
4120  /* find device handle from device index */
4121  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
4122  agDevHandle = &(pDevice->targetDevHandle);
4123
4124  /* get event */
4125  switch (event)
4126  {
4127    case OSSA_IO_OVERFLOW:
4128    {
4129      SA_DBG1(("mpiSATAEvent: OSSA_IO_OVERFLOW HTAG = 0x%x\n", tag));
4130      saRoot->IoEventCount.agOSSA_IO_OVERFLOW++;
4131      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4132      break;
4133    }
4134    case OSSA_IO_XFER_ERROR_BREAK:
4135    {
4136      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_BREAK HTAG = 0x%x\n", tag));
4137      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_BREAK++;
4138      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4139      break;
4140    }
4141    case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
4142    {
4143      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_PHY_NOT_READY HTAG = 0x%x\n", tag));
4144      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
4145      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4146      break;
4147    }
4148    case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
4149    {
4150      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED HTAG = 0x%x\n", tag));
4151      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
4152      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4153      break;
4154    }
4155    case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
4156    {
4157      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION HTAG = 0x%x\n", tag));
4158      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
4159      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4160      break;
4161    }
4162    case OSSA_IO_OPEN_CNX_ERROR_BREAK:
4163    {
4164      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_BREAK HTAG = 0x%x\n", tag));
4165      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
4166      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4167      break;
4168    }
4169
4170    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
4171    {
4172      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST HTAG = 0x%x\n", tag));
4173      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
4174      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4175      break;
4176    }
4177    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
4178    {
4179      SA_DBG1(("mpiSATAEvent:  HTAG = 0x%x\n", tag));
4180      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE++;
4181      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4182      break;
4183    }
4184    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
4185    {
4186      SA_DBG1(("mpiSATAEvent:OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED  HTAG = 0x%x\n", tag));
4187      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
4188      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4189      break;
4190    }
4191    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
4192    {
4193      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS HTAG = 0x%x\n", tag));
4194      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
4195      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4196      break;
4197    }
4198    case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
4199    {
4200      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION HTAG = 0x%x\n", tag));
4201      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
4202      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4203      break;
4204    }
4205    case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
4206    {
4207      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED HTAG = 0x%x\n", tag));
4208      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
4209      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4210      break;
4211    }
4212    case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
4213    {
4214      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION HTAG = 0x%x\n", tag));
4215      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
4216      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4217      break;
4218    }
4219    case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
4220    {
4221      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_NAK_RECEIVED HTAG = 0x%x\n", tag));
4222      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_NAK_RECEIVED++;
4223      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4224      break;
4225    }
4226    case OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE:
4227    {
4228      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE HTAG = 0x%x\n", tag));
4229      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE++;
4230      ossaSATAEvent(agRoot, agNULL, agPortContext, agDevHandle, event, 0, agNULL);
4231      break;
4232    }
4233    case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH:
4234    {
4235      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH HTAG = 0x%x\n", tag));
4236      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_OFFSET_MISMATCH++;
4237      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4238      break;
4239    }
4240    case OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN:
4241    {
4242      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN HTAG = 0x%x\n", tag));
4243      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN++;
4244      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4245      break;
4246    }
4247    case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
4248    {
4249      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT HTAG = 0x%x\n", tag));
4250      saRoot->IoEventCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
4251      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4252      break;
4253    }
4254    case OSSA_IO_XFER_ERROR_PEER_ABORTED:
4255    {
4256      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_PEER_ABORTED HTAG = 0x%x\n", tag));
4257      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_PEER_ABORTED++;
4258      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4259      break;
4260    }
4261    case OSSA_IO_XFER_CMD_FRAME_ISSUED:
4262    {
4263      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED HTAG = 0x%x\n", tag));
4264      saRoot->IoEventCount.agOSSA_IO_XFER_CMD_FRAME_ISSUED++;
4265      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4266      break;
4267    }
4268    case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
4269    {
4270      SA_DBG1(("mpiSATAEvent, OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY HTAG = 0x%x\n", tag));
4271      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY++;
4272      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4273      break;
4274    }
4275    case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE:
4276    {
4277      SA_DBG1(("mpiSATAEvent, OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE HTAG = 0x%x\n", tag));
4278      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_UNEXPECTED_PHASE++;
4279      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4280      break;
4281    }
4282    case OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN:
4283    {
4284      SA_DBG1(("mpiSATAEvent, OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN HTAG = 0x%x\n", tag));
4285      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN++;
4286      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4287      break;
4288    }
4289    case OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED:
4290    {
4291      SA_DBG1(("mpiSATAEvent, OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED HTAG = 0x%x\n", tag));
4292      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED++;
4293      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4294      break;
4295    }
4296    case OSSA_IO_XFER_PIO_SETUP_ERROR:
4297    {
4298      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_PIO_SETUP_ERROR HTAG = 0x%x\n", tag));
4299      saRoot->IoEventCount.agOSSA_IO_XFER_PIO_SETUP_ERROR++;
4300      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4301      break;
4302    }
4303    case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
4304    {
4305      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFR_ERROR_DIF_MISMATCH HTAG = 0x%x\n", tag));
4306      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_MISMATCH++;
4307      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4308      break;
4309    }
4310    case OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR:
4311    {
4312      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR HTAG = 0x%x\n", tag));
4313      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR++;
4314      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4315      break;
4316    }
4317    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
4318    {
4319      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x\n", tag));
4320      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
4321      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4322      break;
4323    }
4324    case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
4325    {
4326      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN HTAG = 0x%x\n", tag));
4327      saRoot->IoEventCount.agOSSA_IO_XFER_ERR_EOB_DATA_OVERRUN++;
4328      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4329      break;
4330    }
4331    case OSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT:
4332    {
4333      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT HTAG = 0x%x\n", tag));
4334      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT++;
4335      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4336      break;
4337    }
4338    default:
4339    {
4340      SA_DBG1(("mpiSATAEvent: Unknown Event 0x%x HTAG = 0x%x\n", event, tag));
4341      saRoot->IoEventCount.agOSSA_IO_UNKNOWN_ERROR++;
4342      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4343      break;
4344    }
4345  }
4346
4347  /* return value */
4348  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2w");
4349  return ret;
4350}
4351
4352/******************************************************************************/
4353/*! \brief Set NVM Data Response
4354 *
4355 *  This routine handles the response of SET NVM Data Response
4356 *
4357 *  \param agRoot       Handles for this instance of SAS/SATA LLL
4358 *  \param pIomb        Pointer of IOMB Mesage
4359 *
4360 *  \return sucess or fail
4361 *
4362 */
4363/*******************************************************************************/
4364GLOBAL bit32 mpiSetNVMDataRsp(
4365  agsaRoot_t          *agRoot,
4366  agsaSetNVMDataRsp_t *pIomb
4367  )
4368{
4369  bit32               ret = AGSA_RC_SUCCESS;
4370  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4371  agsaIORequestDesc_t *pRequest;
4372  agsaContext_t       *agContext;
4373  bit32               tag, status, iPTdaBnDpsAsNvm;
4374
4375  smTraceFuncEnter(hpDBG_VERY_LOUD,"2x");
4376
4377  SA_DBG1(("mpiSetNVMDataRsp: HTag=0x%x\n", pIomb->tag));
4378
4379  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetNVMDataRsp_t, tag));
4380  OSSA_READ_LE_32(AGROOT, &iPTdaBnDpsAsNvm, pIomb, OSSA_OFFSET_OF(agsaSetNVMDataRsp_t, iPTdaBnDpsAsNvm));
4381  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetNVMDataRsp_t, status));
4382
4383  /* get request from IOMap */
4384  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4385  if (agNULL == pRequest)
4386  {
4387    SA_DBG1(("mpiSetNVMDataRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
4388    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2x");
4389    return AGSA_RC_FAILURE;
4390  }
4391
4392  agContext = saRoot->IOMap[tag].agContext;
4393  /* remove the request from IOMap */
4394  saRoot->IOMap[tag].Tag = MARK_OFF;
4395  saRoot->IOMap[tag].IORequest = agNULL;
4396  saRoot->IOMap[tag].agContext = agNULL;
4397
4398  SA_ASSERT((pRequest->valid), "pRequest->valid");
4399
4400  if (((iPTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_CONFIG_SEEPROM) ||
4401      ((iPTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_VPD_FLASH) ||
4402      ((iPTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_TWI_DEVICES))
4403  {
4404    /* CB for VPD for SEEPROM-0, VPD_FLASH and TWI */
4405    ossaSetNVMDResponseCB(agRoot, agContext, (status & NVMD_STAT));
4406  }
4407  else
4408  {
4409    /* should not happend */
4410    SA_DBG1(("mpiSetNVMDataRsp: NVMD is wrong. TAG=0x%x STATUS=0x%x\n", tag, (iPTdaBnDpsAsNvm & NVMD_TYPE)));
4411    ret = AGSA_RC_FAILURE;
4412  }
4413
4414  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4415  pRequest->valid = agFALSE;
4416  /* return the request to free pool */
4417  saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4418  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4419
4420  /* return value */
4421  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2x");
4422  return ret;
4423}
4424
4425/******************************************************************************/
4426/*! \brief SPC MPI SSP ABORT Response
4427 *
4428 *  This function handles the SSP Abort Response.
4429 *
4430 *  \param agRoot       Handles for this instance of SAS/SATA LLL
4431 *  \param pIomb        pointer of Message
4432 *
4433 *  \return The read value
4434 *
4435 */
4436/*******************************************************************************/
4437GLOBAL bit32 mpiSSPAbortRsp(
4438  agsaRoot_t         *agRoot,
4439  agsaSSPAbortRsp_t  *pIomb
4440  )
4441{
4442  bit32               ret = AGSA_RC_SUCCESS;
4443  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4444  agsaIORequestDesc_t *pRequest;
4445  agsaDeviceDesc_t    *pDevice;
4446  bit32               tag, status, scope;
4447  smTraceFuncEnter(hpDBG_VERY_LOUD,"2y");
4448
4449  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSSPAbortRsp_t, tag));
4450  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSSPAbortRsp_t, status));
4451  OSSA_READ_LE_32(AGROOT, &scope, pIomb, OSSA_OFFSET_OF(agsaSSPAbortRsp_t, scp));
4452  scope &= 3;
4453  /* get IORequest from IOMap */
4454  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4455
4456  if (agNULL == pRequest)
4457  {
4458    /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
4459    saRoot->IOMap[tag].Tag = MARK_OFF;
4460    saRoot->IOMap[tag].IORequest = agNULL;
4461    SA_ASSERT((pRequest), "pRequest");
4462    SA_DBG1(("mpiSSPAbortRsp: the request is NULL. Tag=%x\n", tag));
4463    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2y");
4464    return AGSA_RC_FAILURE;
4465  }
4466
4467
4468  if ( agTRUE == pRequest->valid )
4469  {
4470    pDevice = pRequest->pDevice;
4471    SA_ASSERT((pRequest->pDevice), "pRequest->pDevice");
4472
4473    SA_DBG3(("mpiSSPAbortRsp: request abort is valid Htag 0x%x\n", tag));
4474    /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
4475    saRoot->IOMap[tag].Tag = MARK_OFF;
4476    saRoot->IOMap[tag].IORequest = agNULL;
4477
4478    if( pRequest->completionCB == agNULL )
4479    {
4480      ossaSSPAbortCB(agRoot, pRequest->pIORequestContext, scope, status);
4481    }
4482    else
4483    {
4484      (*(ossaGenericAbortCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, scope, status);
4485    }
4486
4487    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4488    pRequest->valid = agFALSE;
4489    /* Delete the request from the pendingIORequests */
4490    saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
4491
4492    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
4493    {
4494      SA_DBG1(("mpiSSPAbortRsp: saving pRequest (%p) for later use\n", pRequest));
4495      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
4496    }
4497    else
4498    {
4499      /* return the request to free pool */
4500      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4501    }
4502
4503    if(scope)
4504    {
4505      siCountActiveIORequestsOnDevice( agRoot, pDevice->DeviceMapIndex );
4506    }
4507
4508    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4509
4510  }
4511  else
4512  {
4513    ret = AGSA_RC_FAILURE;
4514    SA_DBG1(("mpiSSPAbortRsp: the request is not valid any more. Tag=%x\n", pRequest->HTag));
4515  }
4516
4517  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2y");
4518  return ret;
4519}
4520
4521/******************************************************************************/
4522/*! \brief SPC MPI SATA ABORT Response
4523 *
4524 *  This function handles the SATA Event.
4525 *
4526 *  \param agRoot       Handles for this instance of SAS/SATA LLL
4527 *  \param pIomb        pointer of Message
4528 *
4529 *  \return The read value
4530 *
4531 */
4532/*******************************************************************************/
4533GLOBAL bit32 mpiSATAAbortRsp(
4534  agsaRoot_t         *agRoot,
4535  agsaSATAAbortRsp_t *pIomb
4536  )
4537{
4538  bit32               ret = AGSA_RC_SUCCESS;
4539  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4540  agsaIORequestDesc_t *pRequest;
4541  agsaDeviceDesc_t    *pDevice;
4542  bit32               tag, status, scope;
4543
4544  smTraceFuncEnter(hpDBG_VERY_LOUD,"3B");
4545  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSATAAbortRsp_t, tag));
4546  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSATAAbortRsp_t, status));
4547  OSSA_READ_LE_32(AGROOT, &scope, pIomb, OSSA_OFFSET_OF(agsaSATAAbortRsp_t, scp));
4548
4549  /* get IORequest from IOMap */
4550  pRequest  = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4551
4552  if (agNULL == pRequest)
4553  {
4554    /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
4555    saRoot->IOMap[tag].Tag = MARK_OFF;
4556    saRoot->IOMap[tag].IORequest = agNULL;
4557    SA_DBG1(("mpiSATAAbortRsp: the request is NULL. Tag=%x\n", tag));
4558    SA_ASSERT((pRequest), "pRequest");
4559    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3B");
4560    return AGSA_RC_FAILURE;
4561  }
4562
4563  if ( agTRUE == pRequest->valid )
4564  {
4565    pDevice = pRequest->pDevice;
4566    SA_ASSERT((pRequest->pDevice), "pRequest->pDevice");
4567
4568    SA_DBG3(("mpiSATAAbortRsp: request abort is valid Htag 0x%x\n", tag));
4569
4570    if( pRequest->completionCB == agNULL )
4571    {
4572      ossaSATAAbortCB(agRoot, pRequest->pIORequestContext, scope, status);
4573    }
4574    else
4575    {
4576      (*(ossaGenericAbortCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, scope, status);
4577    }
4578    /* remove the SATA_ABORT request from IOMap */
4579    saRoot->IOMap[tag].Tag = MARK_OFF;
4580    saRoot->IOMap[tag].IORequest = agNULL;
4581    saRoot->IOMap[tag].agContext = agNULL;
4582
4583    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4584    pRequest->valid = agFALSE;
4585    /* Delete the request from the pendingIORequests */
4586    saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
4587    /* return the request to free pool */
4588    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4589    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4590
4591  }
4592  else
4593  {
4594    ret = AGSA_RC_FAILURE;
4595    SA_DBG1(("mpiSATAAbortRsp: the request is not valid any more. Tag=%x\n", pRequest->HTag));
4596  }
4597
4598
4599  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3B");
4600  return ret;
4601}
4602
4603/******************************************************************************/
4604/*! \brief Set GPIO Response
4605 *
4606 *  This routine handles the response of GPIO Command
4607 *
4608 *  \param agRoot       Handles for this instance of SAS/SATA LLL
4609 *  \param pIomb        Pointer of IOMB Mesage
4610 *
4611 *  \return sucess or fail
4612 *
4613 */
4614/*******************************************************************************/
4615GLOBAL bit32 mpiGPIORsp(
4616  agsaRoot_t          *agRoot,
4617  agsaGPIORsp_t       *pIomb
4618  )
4619{
4620  bit32                    ret = AGSA_RC_SUCCESS;
4621  agsaLLRoot_t             *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4622  agsaContext_t            *agContext;
4623  agsaIORequestDesc_t      *pRequest;
4624  agsaGpioPinSetupInfo_t   pinSetupInfo;
4625  agsaGpioEventSetupInfo_t eventSetupInfo;
4626  bit32 GpioIe, OT11_0, OT19_12, GPIEVChange, GPIEVFall, GPIEVRise, GpioRdVal, tag;
4627
4628  smTraceFuncEnter(hpDBG_VERY_LOUD,"5C");
4629
4630  SA_DBG3(("mpiGPIORsp: HTag=0x%x\n", pIomb->tag));
4631
4632  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, tag));
4633
4634  /* get request from IOMap */
4635  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4636  if (agNULL == pRequest)
4637  {
4638    SA_DBG1(("mpiGPIORsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x\n", tag));
4639    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5C");
4640    return AGSA_RC_FAILURE;
4641  }
4642
4643  agContext = saRoot->IOMap[tag].agContext;
4644  /* remove the request from IOMap */
4645  saRoot->IOMap[tag].Tag = MARK_OFF;
4646  saRoot->IOMap[tag].IORequest = agNULL;
4647  saRoot->IOMap[tag].agContext = agNULL;
4648  SA_ASSERT((pRequest->valid), "pRequest->valid");
4649
4650  /* set payload to zeros */
4651  si_memset(&pinSetupInfo, 0, sizeof(agsaGpioPinSetupInfo_t));
4652  si_memset(&eventSetupInfo, 0, sizeof(agsaGpioEventSetupInfo_t));
4653
4654  OSSA_READ_LE_32(AGROOT, &GpioIe, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GpioIe));
4655  OSSA_READ_LE_32(AGROOT, &OT11_0, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, OT11_0));
4656  OSSA_READ_LE_32(AGROOT, &OT19_12, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, OT19_12));
4657  OSSA_READ_LE_32(AGROOT, &GPIEVChange, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GPIEVChange));
4658  OSSA_READ_LE_32(AGROOT, &GPIEVFall, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GPIEVFall));
4659  OSSA_READ_LE_32(AGROOT, &GPIEVRise, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GPIEVRise));
4660  OSSA_READ_LE_32(AGROOT, &GpioRdVal, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GpioRdVal));
4661  pinSetupInfo.gpioInputEnabled = GpioIe;
4662  pinSetupInfo.gpioTypePart1 = OT11_0;
4663  pinSetupInfo.gpioTypePart2 = OT19_12;
4664  eventSetupInfo.gpioEventLevel = GPIEVChange;
4665  eventSetupInfo.gpioEventFallingEdge = GPIEVFall;
4666  eventSetupInfo.gpioEventRisingEdge = GPIEVRise;
4667
4668  ossaGpioResponseCB(agRoot, agContext, OSSA_IO_SUCCESS, GpioRdVal,
4669                     &pinSetupInfo,
4670                     &eventSetupInfo);
4671
4672  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4673  pRequest->valid = agFALSE;
4674  /* return the request to free pool */
4675  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
4676  {
4677    SA_DBG1(("mpiGPIORsp: saving pRequest (%p) for later use\n", pRequest));
4678    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
4679  }
4680  else
4681  {
4682    /* return the request to free pool */
4683    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4684  }
4685  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4686
4687  /* return value */
4688  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5C");
4689  return ret;
4690}
4691
4692/******************************************************************************/
4693/*! \brief Set GPIO Event Response
4694 *
4695 *  This routine handles the response of GPIO Event
4696 *
4697 *  \param agRoot       Handles for this instance of SAS/SATA LLL
4698 *  \param pIomb        Pointer of IOMB Mesage
4699 *
4700 *  \return sucess or fail
4701 *
4702 */
4703/*******************************************************************************/
4704GLOBAL bit32 mpiGPIOEventRsp(
4705  agsaRoot_t          *agRoot,
4706  agsaGPIOEvent_t     *pIomb
4707  )
4708{
4709  bit32       ret = AGSA_RC_SUCCESS;
4710  bit32       GpioEvent;
4711
4712  smTraceFuncEnter(hpDBG_VERY_LOUD,"3D");
4713
4714  OSSA_READ_LE_32(AGROOT, &GpioEvent, pIomb, OSSA_OFFSET_OF(agsaGPIOEvent_t, GpioEvent));
4715
4716  ossaGpioEvent(agRoot, GpioEvent);
4717
4718  /* return value */
4719  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3D");
4720  return ret;
4721}
4722
4723/******************************************************************************/
4724/*! \brief SAS Diagnostic Start/End Response
4725 *
4726 *  This routine handles the response of SAS Diagnostic Start/End Command
4727 *
4728 *  \param agRoot       Handles for this instance of SAS/SATA LLL
4729 *  \param pIomb        Pointer of IOMB Mesage
4730 *
4731 *  \return sucess or fail
4732 *
4733 */
4734/*******************************************************************************/
4735GLOBAL bit32 mpiSASDiagStartEndRsp(
4736  agsaRoot_t               *agRoot,
4737  agsaSASDiagStartEndRsp_t *pIomb
4738  )
4739{
4740  bit32               ret = AGSA_RC_SUCCESS;
4741  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4742  agsaIORequestDesc_t *pRequest;
4743  agsaContext_t       *agContext;
4744  bit32               tag, Status;
4745
4746  smTraceFuncEnter(hpDBG_VERY_LOUD,"2F");
4747
4748  SA_DBG3(("mpiSASDiagStartEndRsp: HTAG=0x%x\n", pIomb->tag));
4749
4750  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSASDiagStartEndRsp_t, tag));
4751  OSSA_READ_LE_32(AGROOT, &Status, pIomb, OSSA_OFFSET_OF(agsaSASDiagStartEndRsp_t, Status));
4752
4753  /* get request from IOMap */
4754  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4755  if (agNULL == pRequest)
4756  {
4757    SA_DBG1(("mpiSASDiagStartEndRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, Status));
4758    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2F");
4759    return AGSA_RC_FAILURE;
4760  }
4761
4762  agContext = saRoot->IOMap[tag].agContext;
4763  /* remove the request from IOMap */
4764  saRoot->IOMap[tag].Tag = MARK_OFF;
4765  saRoot->IOMap[tag].IORequest = agNULL;
4766  saRoot->IOMap[tag].agContext = agNULL;
4767
4768  SA_ASSERT((pRequest->valid), "pRequest->valid");
4769
4770  switch(Status)
4771  {
4772
4773    case OSSA_DIAG_SE_SUCCESS:
4774      SA_DBG3(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_SE_SUCCESS 0x%X \n", Status));
4775      break;
4776    case OSSA_DIAG_SE_INVALID_PHY_ID:
4777      SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_SE_INVALID_PHY_ID 0x%X \n", Status));
4778      break;
4779    case OSSA_DIAG_PHY_NOT_DISABLED:
4780      SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_PHY_NOT_DISABLED Status 0x%X \n", Status));
4781      break;
4782    case OSSA_DIAG_OTHER_FAILURE:
4783      if(smIS_SPCV(agRoot))
4784      {
4785        SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_OTHER_FAILURE Status 0x%X \n", Status));
4786      }
4787      else
4788      {
4789        SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_OPCODE_INVALID Status 0x%X \n", Status));
4790      }
4791      break;
4792    default:
4793      SA_DBG1(("mpiSASDiagStartEndRsp:Status UNKNOWN 0x%X \n", Status));
4794      break;
4795  }
4796
4797  ossaSASDiagStartEndCB(agRoot, agContext, Status);
4798
4799  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4800  pRequest->valid = agFALSE;
4801  /* return the request to free pool */
4802  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
4803  {
4804    SA_DBG1(("mpiSASDiagStartEndRsp: saving pRequest (%p) for later use\n", pRequest));
4805    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
4806  }
4807  else
4808  {
4809    /* return the request to free pool */
4810    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4811  }
4812  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4813
4814  /* return value */
4815  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2F");
4816  return ret;
4817}
4818
4819/******************************************************************************/
4820/*! \brief SAS Diagnostic Execute Response
4821 *
4822 *  This routine handles the response of SAS Diagnostic Execute Command
4823 *
4824 *  \param agRoot       Handles for this instance of SAS/SATA LLL
4825 *  \param pIomb        Pointer of IOMB Mesage
4826 *
4827 *  \return sucess or fail
4828 *
4829 */
4830/*******************************************************************************/
4831GLOBAL bit32 mpiSASDiagExecuteRsp(
4832  agsaRoot_t               *agRoot,
4833  agsaSASDiagExecuteRsp_t  *pIomb
4834  )
4835{
4836  bit32               ret = AGSA_RC_SUCCESS;
4837  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4838  agsaIORequestDesc_t *pRequest;
4839  agsaContext_t       *agContext;
4840  bit32               tag, Status, CmdTypeDescPhyId, ReportData;
4841  smTraceFuncEnter(hpDBG_VERY_LOUD,"3G");
4842
4843  SA_DBG3(("mpiSASDiagExecuteRsp: HTAG=0x%x\n", pIomb->tag));
4844
4845  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, tag));
4846  OSSA_READ_LE_32(AGROOT, &Status, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, Status));
4847  OSSA_READ_LE_32(AGROOT, &CmdTypeDescPhyId, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, CmdTypeDescPhyId));
4848  OSSA_READ_LE_32(AGROOT, &ReportData, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, ReportData));
4849  /* get request from IOMap */
4850  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4851  if (agNULL == pRequest)
4852  {
4853    SA_DBG1(("mpiSASDiagExecuteRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, Status));
4854    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3G");
4855    return AGSA_RC_FAILURE;
4856  }
4857
4858  switch(Status)
4859  {
4860
4861    case OSSA_DIAG_SUCCESS:
4862      SA_DBG3(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_SUCCESS 0x%X \n", Status));
4863      break;
4864    case OSSA_DIAG_INVALID_COMMAND:
4865      if(smIS_SPCV(agRoot))
4866      {
4867        SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_INVALID_COMMAND Status 0x%X \n", Status));
4868      }
4869      else
4870      {
4871        SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_FAIL Status 0x%X \n", Status));
4872      }
4873      break;
4874    case OSSA_REGISTER_ACCESS_TIMEOUT:
4875      SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_REGISTER_ACCESS_TIMEOUT Status 0x%X \n", Status));
4876      break;
4877    case OSSA_DIAG_NOT_IN_DIAGNOSTIC_MODE:
4878      SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_NOT_IN_DIAGNOSTIC_MODE Status 0x%X \n", Status));
4879      break;
4880    case OSSA_DIAG_INVALID_PHY:
4881      SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_INVALID_PHY Status 0x%X \n", Status));
4882      break;
4883    case OSSA_MEMORY_ALLOC_FAILURE:
4884      SA_DBG1(("mpiSASDiagExecuteRsp: Status  Status 0x%X \n", Status));
4885      break;
4886
4887    default:
4888      SA_DBG1(("mpiSASDiagExecuteRsp:Status UNKNOWN 0x%X \n", Status));
4889      break;
4890  }
4891
4892
4893  agContext = saRoot->IOMap[tag].agContext;
4894  /* remove the request from IOMap */
4895  saRoot->IOMap[tag].Tag = MARK_OFF;
4896  saRoot->IOMap[tag].IORequest = agNULL;
4897  saRoot->IOMap[tag].agContext = agNULL;
4898
4899  SA_ASSERT((pRequest->valid), "pRequest->valid");
4900
4901  ossaSASDiagExecuteCB(agRoot, agContext, Status, CmdTypeDescPhyId, ReportData);
4902
4903  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4904  pRequest->valid = agFALSE;
4905  /* return the request to free pool */
4906  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
4907  {
4908    SA_DBG1(("mpiSASDiagExecuteRsp: saving pRequest (%p) for later use\n", pRequest));
4909    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
4910  }
4911  else
4912  {
4913    /* return the request to free pool */
4914    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4915  }
4916  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4917
4918  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3G");
4919
4920  /* return value */
4921  return ret;
4922}
4923
4924/******************************************************************************/
4925/*! \brief SAS General Event Notification Response
4926 *
4927 *  This routine handles the response of Inbound IOMB Command with error case
4928 *
4929 *  \param agRoot       Handles for this instance of SAS/SATA LLL
4930 *  \param pIomb        Pointer of IOMB Mesage
4931 *
4932 *  \return sucess or fail
4933 *
4934 */
4935/*******************************************************************************/
4936GLOBAL bit32 mpiGeneralEventRsp(
4937  agsaRoot_t               *agRoot,
4938  agsaGeneralEventRsp_t    *pIomb
4939  )
4940{
4941  bit32                 ret = AGSA_RC_SUCCESS;
4942  agsaLLRoot_t          *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4943  bit32                 i;
4944  bit32                 status;
4945  bit32                 tag;
4946  agsaIORequestDesc_t   *pRequest;
4947  agsaDeviceDesc_t      *pDevice;
4948  agsaContext_t         *agContext = NULL;
4949  agsaGeneralEventRsp_t GenEventData;
4950  agsaHWEventEncrypt_t  agEvent;
4951  bit16                 OpCode = 0;
4952
4953  smTraceFuncEnter(hpDBG_VERY_LOUD,"3H");
4954
4955  si_memset(&GenEventData,0,sizeof(agsaGeneralEventRsp_t));
4956
4957  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGeneralEventRsp_t, status));
4958
4959  SA_DBG3(("mpiGeneralEventRsp:  %p\n", pIomb));
4960
4961  SA_DBG1(("mpiGeneralEventRsp: OpCode 0x%X status 0x%x\n",pIomb->inbIOMBpayload[0] & OPCODE_BITS, status));
4962
4963  for (i = 0; i < GENERAL_EVENT_PAYLOAD; i++)
4964  {
4965    OSSA_READ_LE_32(AGROOT, &GenEventData.inbIOMBpayload[i], pIomb, OSSA_OFFSET_OF(agsaGeneralEventRsp_t,inbIOMBpayload[i] ));
4966  }
4967  SA_DBG1(("mpiGeneralEventRsp: inbIOMBpayload 0x%08x 0x%08x 0x%08x 0x%08x\n",
4968                                    GenEventData.inbIOMBpayload[0],GenEventData.inbIOMBpayload[1],
4969                                    GenEventData.inbIOMBpayload[2],GenEventData.inbIOMBpayload[3] ));
4970  SA_DBG1(("mpiGeneralEventRsp: inbIOMBpayload 0x%08x 0x%08x 0x%08x 0x%08x\n",
4971                                    GenEventData.inbIOMBpayload[4],GenEventData.inbIOMBpayload[8],
4972                                    GenEventData.inbIOMBpayload[6],GenEventData.inbIOMBpayload[7] ));
4973
4974  switch (status) /*status  */
4975  {
4976
4977    case GEN_EVENT_IOMB_V_BIT_NOT_SET:
4978      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_IOMB_V_BIT_NOT_SET\n" ));
4979      break;
4980    case GEN_EVENT_INBOUND_IOMB_OPC_NOT_SUPPORTED:
4981      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_INBOUND_IOMB_OPC_NOT_SUPPORTED\n" ));
4982      break;
4983    case GEN_EVENT_IOMB_INVALID_OBID:
4984      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_IOMB_INVALID_OBID\n" ));
4985      break;
4986    case GEN_EVENT_DS_IN_NON_OPERATIONAL:
4987      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_DS_IN_NON_OPERATIONAL\n" ));
4988      break;
4989    case GEN_EVENT_DS_IN_RECOVERY:
4990      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_DS_IN_RECOVERY\n" ));
4991      break;
4992    case GEN_EVENT_DS_INVALID:
4993      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_DS_INVALID\n" ));
4994      break;
4995    case GEN_EVENT_IO_XFER_READ_COMPL_ERR:
4996      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_IO_XFER_READ_COMPL_ERR 0x%x 0x%x 0x%x\n",
4997                GenEventData.inbIOMBpayload[0],
4998                GenEventData.inbIOMBpayload[1],
4999                GenEventData.inbIOMBpayload[1] ));
5000      ossaGeneralEvent(agRoot, status, agContext, GenEventData.inbIOMBpayload);
5001      smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3H");
5002      return(ret);
5003    default:
5004      SA_DBG1(("mpiGeneralEventRsp: Unknown General Event status!!! 0x%x\n", status));
5005      smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3H");
5006      return AGSA_RC_FAILURE;
5007  }
5008
5009  OpCode = (bit16)(GenEventData.inbIOMBpayload[0] & OPCODE_BITS);
5010  tag = GenEventData.inbIOMBpayload[1];
5011  SA_DBG1(("mpiGeneralEventRsp:OpCode 0x%X [0] 0x%08x\n" ,OpCode,(bit16)(GenEventData.inbIOMBpayload[0] & OPCODE_BITS)));
5012
5013  switch (OpCode) /* OpCode */
5014    {
5015      case OPC_INB_DEV_HANDLE_ACCEPT:
5016      case OPC_INB_ECHO:
5017      case OPC_INB_FW_FLASH_UPDATE:
5018      case OPC_INB_GET_NVMD_DATA:
5019      case OPC_INB_SET_NVMD_DATA:
5020      case OPC_INB_DEREG_DEV_HANDLE:
5021      case OPC_INB_SPC_GET_DEV_INFO:
5022      case OPC_INB_GET_DEV_HANDLE:
5023      case OPC_INB_SPC_REG_DEV:
5024      case OPC_INB_SAS_DIAG_EXECUTE:
5025      case OPC_INB_SAS_DIAG_MODE_START_END:
5026      case OPC_INB_PHYSTART:
5027      case OPC_INB_PHYSTOP:
5028      case OPC_INB_LOCAL_PHY_CONTROL:
5029      case OPC_INB_GPIO:
5030      case OPC_INB_GET_TIME_STAMP:
5031      case OPC_INB_PORT_CONTROL:
5032      case OPC_INB_SET_DEVICE_STATE:
5033      case OPC_INB_GET_DEVICE_STATE:
5034      case OPC_INB_SET_DEV_INFO:
5035//      case OPC_INB_PCIE_DIAG_EXECUTE:
5036      case OPC_INB_SAS_HW_EVENT_ACK:
5037      case OPC_INB_SAS_RE_INITIALIZE:
5038      case OPC_INB_KEK_MANAGEMENT:
5039      case OPC_INB_SET_OPERATOR:
5040      case OPC_INB_GET_OPERATOR:
5041//      case OPC_INB_SGPIO:
5042
5043#ifdef SPC_ENABLE_PROFILE
5044      case OPC_INB_FW_PROFILE:
5045#endif
5046          /* Uses the tag table, so we have to free it up */
5047
5048          SA_ASSERT((tag < AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs),
5049                    "OPC_OUB_GENERAL_EVENT tag out of range");
5050          SA_ASSERT((saRoot->IOMap[ tag < (AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs) ? tag : 0 ].Tag != MARK_OFF),
5051                    "OPC_OUB_GENERAL_EVENT tag not in use 1");
5052
5053#if defined(SALLSDK_DEBUG)
5054          if (tag > AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs)
5055          {
5056            smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3H");
5057            return AGSA_RC_FAILURE;
5058          }
5059#endif /* SALLSDK_DEBUG */
5060
5061          SA_DBG1(("mpiGeneralEventRsp:OpCode found 0x%x htag 0x%x\n",OpCode, tag));
5062          /* get agContext */
5063          agContext = saRoot->IOMap[tag].agContext;
5064          /* get request from IOMap */
5065          pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5066          if(pRequest)
5067          {
5068            /* remove the request from IOMap */
5069            saRoot->IOMap[tag].Tag = MARK_OFF;
5070            saRoot->IOMap[tag].IORequest = agNULL;
5071            saRoot->IOMap[tag].agContext = agNULL;
5072
5073            ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5074            SA_ASSERT((pRequest->valid), "pRequest->valid");
5075            pRequest->valid = agFALSE;
5076            /* return the request to free pool */
5077            if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5078            {
5079              SA_DBG1(("mpiGeneralEventRsp: saving pRequest (%p) for later use\n", pRequest));
5080              saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5081            }
5082            else
5083            {
5084              /* return the request to free pool */
5085              saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5086            }
5087            ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5088          }
5089          else
5090          {
5091            SA_DBG1(("mpiGeneralEventRsp:pRequest (%p) NULL\n", pRequest));
5092            ret =  AGSA_RC_FAILURE;
5093          }
5094          break;
5095      /* ????  */
5096      case OPC_INB_SATA_HOST_OPSTART:
5097      case OPC_INB_SATA_ABORT:
5098      case OPC_INB_SSPINIIOSTART:
5099      case OPC_INB_SSPINITMSTART:
5100      case OPC_INB_SSPINIEXTIOSTART:
5101      case OPC_INB_SSPTGTIOSTART:
5102      case OPC_INB_SSPTGTRSPSTART:
5103      case OPC_INB_SSP_DIF_ENC_OPSTART:
5104      case OPC_INB_SATA_DIF_ENC_OPSTART:
5105
5106      case OPC_INB_SSP_ABORT:
5107      case OPC_INB_SMP_REQUEST:
5108      case OPC_INB_SMP_ABORT:
5109      {
5110        /* Uses the tag table, so we have to free it up */
5111        SA_DBG1(("mpiGeneralEventRsp:OpCode found 0x%x htag 0x%x\n",OpCode, tag));
5112
5113        tag = GenEventData.inbIOMBpayload[1];
5114
5115        SA_ASSERT((tag < AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs),
5116                  "OPC_OUB_GENERAL_EVENT tag out of range");
5117        SA_ASSERT((saRoot->IOMap[ tag < (AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs) ? tag : 0 ].Tag != MARK_OFF),
5118                  "OPC_OUB_GENERAL_EVENT tag not in use 2");
5119#if defined(SALLSDK_DEBUG)
5120        if (tag > AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs)
5121        {
5122          smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3H");
5123          return AGSA_RC_FAILURE;
5124        }
5125#endif
5126          /* get request from IOMap */
5127        pRequest  = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5128        if(pRequest)
5129        {
5130          pDevice   = pRequest->pDevice;
5131          /* return the request to free pool */
5132          /* get IORequestContext */
5133          agContext = (agsaContext_t *)pRequest->pIORequestContext;
5134          /* remove the request from IOMap */
5135          saRoot->IOMap[tag].Tag = MARK_OFF;
5136          saRoot->IOMap[tag].IORequest = agNULL;
5137          saRoot->IOMap[tag].agContext = agNULL;
5138
5139          ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5140          SA_ASSERT((pRequest->valid), "pRequest->valid");
5141          pRequest->valid = agFALSE;
5142          saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
5143          if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5144          {
5145            SA_DBG1(("mpiGeneralEventRsp: saving pRequest (%p) for later use\n", pRequest));
5146            saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5147          }
5148          else
5149          {
5150            /* return the request to free pool */
5151            saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5152          }
5153          ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5154          break;
5155        }
5156        else
5157        {
5158          SA_DBG1(("mpiGeneralEventRsp:pRequest (%p) NULL\n", pRequest));
5159          ret =  AGSA_RC_FAILURE;
5160        }
5161      }
5162    default:
5163    {
5164        SA_DBG1(("mpiGeneralEventRsp:OpCode Not found 0x%x htag 0x%x\n",OpCode, tag));
5165        ret =  AGSA_RC_FAILURE;
5166
5167        /* Uses the tag table, so we have to free it up */
5168        tag = GenEventData.inbIOMBpayload[1];
5169
5170        SA_ASSERT((tag < AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs),
5171                  "OPC_OUB_GENERAL_EVENT tag out of range");
5172        SA_ASSERT((saRoot->IOMap[ tag < (AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs) ? tag : 0 ].Tag != MARK_OFF),
5173                  "OPC_OUB_GENERAL_EVENT tag not in use 3");
5174
5175#if defined(SALLSDK_DEBUG)
5176        if (tag > AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs)
5177        {
5178          smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "3H");
5179          return AGSA_RC_FAILURE;
5180        }
5181#endif
5182        /* get agContext */
5183        agContext = saRoot->IOMap[tag].agContext;
5184        /* get request from IOMap */
5185        pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5186        if (pRequest == agNULL)
5187        {
5188          smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "3H");
5189          return AGSA_RC_FAILURE;
5190        }
5191
5192        /* remove the request from IOMap */
5193        saRoot->IOMap[tag].Tag = MARK_OFF;
5194        saRoot->IOMap[tag].IORequest = agNULL;
5195        saRoot->IOMap[tag].agContext = agNULL;
5196
5197        ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5198        SA_ASSERT((pRequest->valid), "pRequest->valid");
5199        pRequest->valid = agFALSE;
5200        /* return the request to free pool */
5201        if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5202        {
5203          SA_DBG1(("mpiGeneralEventRsp: saving pRequest (%p) for later use\n", pRequest));
5204          saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5205        }
5206        else
5207        {
5208          /* return the request to free pool */
5209          saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5210        }
5211        ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5212        break;
5213      }
5214      ret =  AGSA_RC_FAILURE;
5215
5216    }
5217
5218  switch (OpCode) /* OpCode */
5219  {
5220
5221    case OPC_INB_KEK_MANAGEMENT:
5222    {
5223      bit32 flags = GenEventData.inbIOMBpayload[2];
5224
5225      SA_DBG1(("mpiGeneralEventRsp: OPC_INB_KEK_MANAGEMENT 0x%x htag 0x%x flags 0x%x\n",OpCode, tag, flags));
5226      if (flags & 0xFF00) /* update and store*/
5227      {
5228        agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE;
5229        SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE\n"));
5230      }
5231      else /* update */
5232      {
5233        agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE;
5234        SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_KEK_UPDATE\n"));
5235      }
5236      agEvent.status = OSSA_INVALID_ENCRYPTION_SECURITY_MODE;
5237      si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
5238      agEvent.status = status;
5239
5240      SA_DBG1(("mpiGeneralEventRsp: ossaHwCB OSSA_HW_EVENT_ENCRYPTION\n" ));
5241      ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void*)&agEvent, agContext);
5242      break;
5243    }
5244    case OPC_INB_OPR_MGMT:
5245         si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
5246         agEvent.status = status;
5247         agEvent.encryptOperation = OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT;
5248
5249         SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT\n" ));
5250         ossaOperatorManagementCB(agRoot, agContext, status, 0);
5251         break;
5252    case OPC_INB_SET_OPERATOR:
5253         SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_SET_OPERATOR\n" ));
5254         ossaSetOperatorCB(agRoot,agContext,0xFF,0xFF );
5255         break;
5256    case OPC_INB_GET_OPERATOR:
5257         SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_GET_OPERATOR\n" ));
5258         ossaGetOperatorCB(agRoot,agContext,0xFF,0xFF,0xFF,0xFF,agNULL );
5259         break;
5260    case OPC_INB_ENC_TEST_EXECUTE:
5261         si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
5262         agEvent.status = status;
5263         agEvent.encryptOperation = OSSA_HW_ENCRYPT_TEST_EXECUTE;
5264
5265         SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_TEST_EXECUTE\n" ));
5266         ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void*)&agEvent, agContext);
5267         break;
5268    default:
5269         SA_DBG1(("mpiGeneralEventRsp: MGMNT OpCode Not found 0x%x\n",OpCode ));
5270         ossaGeneralEvent(agRoot, status, agContext, GenEventData.inbIOMBpayload);
5271         break;
5272  }
5273
5274  /* return value */
5275  smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "3H");
5276  return ret;
5277}
5278
5279/******************************************************************************/
5280/*! \brief SPC MPI SSP Request Received Event (target mode)
5281 *
5282 *  This function handles the SSP Request Received Event.
5283 *
5284 *  \param agRoot       Handles for this instance of SAS/SATA LLL
5285 *  \param pMsg1        pointer of Message
5286 *
5287 *  \return The read value
5288 *
5289 */
5290/*******************************************************************************/
5291GLOBAL bit32 mpiSSPReqReceivedNotify(
5292  agsaRoot_t *agRoot,
5293  agsaSSPReqReceivedNotify_t *pMsg1)
5294{
5295  bit32            ret = AGSA_RC_SUCCESS;
5296  agsaLLRoot_t     *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5297  agsaDeviceDesc_t *pDevice;
5298  bit32            deviceid, iniTagSSPIul, frameTypeHssa, TlrHdsa;
5299
5300  smTraceFuncEnter(hpDBG_VERY_LOUD,"3J");
5301  /* convert endiness if necassary */
5302  OSSA_READ_LE_32(AGROOT, &deviceid, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, deviceId));
5303  OSSA_READ_LE_32(AGROOT, &iniTagSSPIul, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, iniTagSSPIul));
5304  OSSA_READ_LE_32(AGROOT, &frameTypeHssa, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, frameTypeHssa));
5305  OSSA_READ_LE_32(AGROOT, &TlrHdsa, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, TlrHdsa));
5306  /* deviceId -> agDeviceHandle */
5307  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
5308
5309  if (agNULL == pDevice)
5310  {
5311    SA_DBG1(("mpiSSPReqReceivedNotify: warning!!! no deviceHandle is found"));
5312  }
5313  else
5314  {
5315    /* type punning only safe through char *. See gcc -fstrict_aliasing. */
5316    char * safe_type_pun = (char *)&(pMsg1->SSPIu[0]);
5317    if( pDevice->initiatorDevHandle.sdkData != agNULL)
5318    {
5319      ossaSSPReqReceived(agRoot, &(pDevice->initiatorDevHandle),
5320                        (agsaFrameHandle_t *)safe_type_pun,
5321                        (bit16)((iniTagSSPIul >> SHIFT16) & INITTAG_BITS),
5322                        ((frameTypeHssa >> SHIFT24) & FRAME_TYPE) |
5323                       ((TlrHdsa >> SHIFT16) & TLR_BITS),
5324                        (iniTagSSPIul & SSPIUL_BITS));
5325    }else if( pDevice->targetDevHandle.sdkData != agNULL)
5326    {
5327      ossaSSPReqReceived(agRoot, &(pDevice->targetDevHandle),
5328                        (agsaFrameHandle_t *)safe_type_pun,
5329                        (bit16)((iniTagSSPIul >> SHIFT16) & INITTAG_BITS),
5330                        ((frameTypeHssa >> SHIFT24) & FRAME_TYPE) |
5331                       ((TlrHdsa >> SHIFT16) & TLR_BITS),
5332                        (iniTagSSPIul & SSPIUL_BITS));
5333    }else
5334    {
5335      SA_ASSERT(0, "Device handle sdkData not set");
5336    }
5337  }
5338
5339  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3J");
5340  return ret;
5341}
5342
5343/******************************************************************************/
5344/*! \brief SPC MPI Device Handle Arrived Event (target mode)
5345 *
5346 *  This function handles the Device Handle Arrived Event.
5347 *
5348 *  \param agRoot       Handles for this instance of SAS/SATA LLL
5349 *  \param pMsg1        pointer of Message
5350 *
5351 *  \return The read value
5352 *
5353 */
5354/*******************************************************************************/
5355GLOBAL bit32 mpiDeviceHandleArrived(
5356  agsaRoot_t *agRoot,
5357  agsaDeviceHandleArrivedNotify_t *pMsg1)
5358{
5359  bit32               ret = AGSA_RC_SUCCESS;
5360  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5361  agsaDeviceDesc_t    *pDevice;
5362  agsaPort_t          *pPort;
5363  agsaSASDeviceInfo_t pDeviceInfo;
5364  agsaPortContext_t   *agPortContext;
5365  agsaSASIdentify_t   remoteIdentify;
5366  bit32               CTag;
5367  bit32               FwdDeviceId;
5368  bit32               ProtConrPortId;
5369  bit32               portId;
5370  bit32               conRate;
5371  bit8                i, protocol, dTypeSRate;
5372  bit32               HostAssignedId;
5373
5374  if(saRoot == agNULL)
5375  {
5376    SA_ASSERT((saRoot != agNULL), "saRoot");
5377    return AGSA_RC_FAILURE;
5378  }
5379
5380  smTraceFuncEnter(hpDBG_VERY_LOUD,"3L");
5381  /* convert endiness if necassary */
5382  OSSA_READ_LE_32(AGROOT, &CTag, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleArrivedNotify_t, CTag));
5383  OSSA_READ_LE_32(AGROOT, &FwdDeviceId, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleArrivedNotify_t, HostAssignedIdFwdDeviceId));
5384  OSSA_READ_LE_32(AGROOT, &ProtConrPortId, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleArrivedNotify_t, ProtConrPortId));
5385
5386
5387  if(smIS_SPCV(agRoot))
5388  {
5389    portId = ProtConrPortId & PortId_V_MASK;
5390    conRate = (ProtConrPortId & Conrate_V_MASK ) >> Conrate_V_SHIFT;
5391
5392    HostAssignedId = (FwdDeviceId & 0xFFFF0000) >> SHIFT16;
5393    if(HostAssignedId)
5394    {
5395      SA_DBG1(("mpiDeviceHandleArrived: HostAssignedId 0x%X\n",HostAssignedId));
5396    }
5397  }
5398  else
5399  {
5400    portId = ProtConrPortId & PortId_SPC_MASK;
5401    conRate = (ProtConrPortId & Conrate_SPC_MASK ) >> Conrate_SPC_SHIFT;
5402  }
5403  protocol =(bit8)((ProtConrPortId & PROTOCOL_BITS ) >> PROTOCOL_SHIFT);
5404
5405  SA_DBG1(("mpiDeviceHandleArrived: New Port portID %d deviceid 0x%X conRate 0x%X protocol 0x%X\n",portId, FwdDeviceId,conRate,protocol));
5406
5407  /* Port Map */
5408  agPortContext = saRoot->PortMap[portId].PortContext;
5409  if (agNULL == agPortContext)
5410  {
5411    ossaSingleThreadedEnter(agRoot, LL_PORT_LOCK);
5412    /* new port */
5413    /* Acquire port list lock */
5414    /* Allocate a free port */
5415    pPort = (agsaPort_t *) saLlistGetHead(&(saRoot->freePorts));
5416    if (agNULL != pPort)
5417    {
5418      saLlistRemove(&(saRoot->freePorts), &(pPort->linkNode));
5419
5420      /* setup the port data structure */
5421      pPort->portContext.osData = agNULL;
5422      pPort->portContext.sdkData = pPort;
5423      pPort->tobedeleted = agFALSE;
5424      /* Add to valid port list */
5425      saLlistAdd(&(saRoot->validPorts), &(pPort->linkNode));
5426      /* Release port list lock */
5427      ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
5428
5429      /* Setup portMap based on portId */
5430      saRoot->PortMap[portId].PortID = portId;
5431      saRoot->PortMap[portId].PortContext = &(pPort->portContext);
5432      saRoot->PortMap[portId].PortStatus  &= ~PORT_INVALIDATING;
5433      pPort->portId = portId;
5434
5435      pPort->status &= ~PORT_INVALIDATING;
5436      SA_DBG3(("mpiDeviceHandleArrived: ~PORT_INVALIDATING New Port portID %d PortContext %p\n",saRoot->PortMap[pPort->portId].PortID , &pPort->portContext));
5437    }
5438    else
5439    {
5440      ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
5441      SA_DBG2(("mpiDeviceHandleArrived:Port NULL\n"));
5442      /* pPort is agNULL*/
5443      smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3L");
5444      return AGSA_RC_FAILURE;
5445    }
5446  }
5447  else
5448  {
5449    /* exist port */
5450    pPort = (agsaPort_t *) (agPortContext->sdkData);
5451    pPort->status &= ~PORT_INVALIDATING;
5452    pPort->portId =portId;
5453    saRoot->PortMap[pPort->portId].PortStatus  &= ~PORT_INVALIDATING;
5454
5455    SA_DBG1(("mpiDeviceHandleArrived: ~PORT_INVALIDATING Old port portID %d PortContext %p\n", portId, &pPort->portContext));
5456
5457  }
5458  /* build Device Information structure */
5459  si_memset(&pDeviceInfo, 0, sizeof(agsaSASDeviceInfo_t));
5460  if (ProtConrPortId & PROTOCOL_BITS)
5461  {
5462    protocol = SA_IDFRM_SSP_BIT; /* SSP */
5463    pDeviceInfo.commonDevInfo.devType_S_Rate = (bit8)(conRate | 0x10);
5464
5465  }
5466  else
5467  {
5468    protocol = SA_IDFRM_SMP_BIT; /* SMP */
5469    pDeviceInfo.commonDevInfo.devType_S_Rate = (bit8)conRate;
5470  }
5471  pDeviceInfo.initiator_ssp_stp_smp = protocol;
5472  pDeviceInfo.numOfPhys = 1;
5473  pDeviceInfo.commonDevInfo.sasAddressHi[0] = pMsg1->sasAddrHi[0];
5474  pDeviceInfo.commonDevInfo.sasAddressHi[1] = pMsg1->sasAddrHi[1];
5475  pDeviceInfo.commonDevInfo.sasAddressHi[2] = pMsg1->sasAddrHi[2];
5476  pDeviceInfo.commonDevInfo.sasAddressHi[3] = pMsg1->sasAddrHi[3];
5477  pDeviceInfo.commonDevInfo.sasAddressLo[0] = pMsg1->sasAddrLow[0];
5478  pDeviceInfo.commonDevInfo.sasAddressLo[1] = pMsg1->sasAddrLow[1];
5479  pDeviceInfo.commonDevInfo.sasAddressLo[2] = pMsg1->sasAddrLow[2];
5480  pDeviceInfo.commonDevInfo.sasAddressLo[3] = pMsg1->sasAddrLow[3];
5481  pDeviceInfo.commonDevInfo.flag = 0;
5482  pDeviceInfo.commonDevInfo.it_NexusTimeout = ITL_TO_DEFAULT;
5483
5484  /* deviceId -> agDeviceHandle */
5485  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceHandle;
5486
5487  if (agNULL == pDevice)
5488  {
5489    /* new device */
5490    si_memset(&remoteIdentify, 0, sizeof(agsaSASIdentify_t));
5491    for (i=0;i<4;i++)
5492    {
5493      remoteIdentify.sasAddressHi[i] = pMsg1->sasAddrHi[i];
5494      remoteIdentify.sasAddressLo[i] = pMsg1->sasAddrLow[i];
5495    }
5496    remoteIdentify.deviceType_addressFrameType = (bit8)(pDeviceInfo.commonDevInfo.devType_S_Rate & 0xC0);
5497    dTypeSRate = pDeviceInfo.commonDevInfo.devType_S_Rate;
5498    /* get Device from free Device List */
5499    pDevice = siPortSASDeviceAdd(agRoot, pPort, remoteIdentify, agTRUE, SMP_TO_DEFAULT, ITL_TO_DEFAULT, 0, dTypeSRate, 0);
5500    if (agNULL == pDevice)
5501    {
5502      SA_DBG1(("mpiDeviceHandleArrived: Device Handle is NULL, Out of Resources Error.\n"));
5503    }
5504    else
5505    {
5506      bit32 AccStatus = 0;
5507      bit32 SaveId = FwdDeviceId & 0xFFFF;
5508      /* mapping the device handle and device id */
5509      saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceIdFromFW = FwdDeviceId;
5510      saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceHandle = (void *)pDevice;
5511      pDevice->DeviceMapIndex = FwdDeviceId;
5512      SA_DBG2(("mpiDeviceHandleArrived: New deviceID 0x%x Device Context %p DeviceTypeSRate 0x%x\n", FwdDeviceId, pDevice, dTypeSRate));
5513
5514      /* Call Back */
5515      AccStatus = ossaDeviceHandleAccept(agRoot, &(pDevice->initiatorDevHandle), &pDeviceInfo, agPortContext,&FwdDeviceId );
5516
5517      HostAssignedId = (FwdDeviceId & 0xFFFF0000) >> SHIFT16;
5518      if(HostAssignedId)
5519      {
5520        if( SaveId == (FwdDeviceId & 0xFFFF)  )
5521        {
5522
5523          saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceIdFromFW = FwdDeviceId;
5524          pDevice->DeviceMapIndex = FwdDeviceId;
5525
5526          SA_DBG1(("mpiDeviceHandleArrived:FwdDeviceId 0x%x HostAssignedId 0x%x\n",FwdDeviceId,HostAssignedId));
5527        }
5528        else
5529        {
5530          SA_DBG1(("mpiDeviceHandleArrived:Id mangled expect 0x%x Got 0x%x\n",SaveId, (FwdDeviceId & 0xFFFF)));
5531          ret = AGSA_RC_FAILURE;
5532        }
5533      }
5534
5535      /* get AWT flag and ITLN_TMO value */
5536
5537      if(AccStatus == OSSA_RC_ACCEPT )
5538      {
5539        /* build DEVICE_HANDLE_ACCEPT IOMB and send to SPC with action=accept */
5540        mpiDevHandleAcceptCmd(agRoot, agNULL, CTag, FwdDeviceId, 0, pDeviceInfo.commonDevInfo.flag, pDeviceInfo.commonDevInfo.it_NexusTimeout, 0);
5541      }
5542      else
5543      {
5544        mpiDevHandleAcceptCmd(agRoot, agNULL, CTag, FwdDeviceId, 1, pDeviceInfo.commonDevInfo.flag, pDeviceInfo.commonDevInfo.it_NexusTimeout, 0);
5545      }
5546    }
5547  }
5548
5549  SA_DBG1(("mpiDeviceHandleArrived Device 0x%08X flag 0x%08X %s WWID= %02x%02x%02x%02x:%02x%02x%02x%02x, %s\n",
5550    FwdDeviceId,
5551    pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag,
5552    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x20 ? "SATA DA" :
5553    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x10 ? "SSP/SMP" :
5554    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x0 ? "  STP  " : "Unknown",
5555
5556    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3],
5557    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2],
5558    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1],
5559    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0],
5560    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3],
5561    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2],
5562    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1],
5563    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0],
5564
5565    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 8  ? " 1.5G" :
5566    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 9  ? " 3.0G" :
5567    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 10 ? " 6.0G" :
5568    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 11 ? "12.0G" : "????" ));
5569
5570  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3L");
5571  return ret;
5572}
5573
5574/******************************************************************************/
5575/*! \brief Get Time Stamp Response
5576 *
5577 *  This routine handles the response of Get Time Stamp Command
5578 *
5579 *  \param agRoot       Handles for this instance of SAS/SATA LLL
5580 *  \param pIomb        Pointer of IOMB Mesage
5581 *
5582 *  \return sucess or fail
5583 *
5584 */
5585/*******************************************************************************/
5586GLOBAL bit32 mpiGetTimeStampRsp(
5587  agsaRoot_t               *agRoot,
5588  agsaGetTimeStampRsp_t    *pIomb
5589  )
5590{
5591  bit32               ret = AGSA_RC_SUCCESS;
5592  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5593  agsaIORequestDesc_t *pRequest;
5594  agsaContext_t       *agContext;
5595  bit32               tag, timeStampLower, timeStampUpper;
5596
5597  smTraceFuncEnter(hpDBG_VERY_LOUD,"3M");
5598
5599  SA_DBG3(("mpiGetTimeStampRsp: HTAG=0x%x\n", pIomb->tag));
5600
5601  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetTimeStampRsp_t, tag));
5602  OSSA_READ_LE_32(AGROOT, &timeStampLower, pIomb, OSSA_OFFSET_OF(agsaGetTimeStampRsp_t, timeStampLower));
5603  OSSA_READ_LE_32(AGROOT, &timeStampUpper, pIomb, OSSA_OFFSET_OF(agsaGetTimeStampRsp_t, timeStampUpper));
5604  /* get request from IOMap */
5605  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5606  if (agNULL == pRequest)
5607  {
5608    SA_DBG1(("mpiGetTimeStampRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x\n", tag));
5609    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3M");
5610    return AGSA_RC_FAILURE;
5611  }
5612
5613  agContext = saRoot->IOMap[tag].agContext;
5614  /* remove the request from IOMap */
5615  saRoot->IOMap[tag].Tag = MARK_OFF;
5616  saRoot->IOMap[tag].IORequest = agNULL;
5617  saRoot->IOMap[tag].agContext = agNULL;
5618
5619  SA_ASSERT((pRequest->valid), "pRequest->valid");
5620
5621  SA_DBG3(("mpiGetTimeStampRsp: timeStampLower 0x%x timeStampUpper 0x%x\n", timeStampLower, timeStampUpper));
5622
5623  ossaGetTimeStampCB(agRoot, agContext, timeStampLower, timeStampUpper);
5624
5625  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5626  pRequest->valid = agFALSE;
5627  /* return the request to free pool */
5628  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5629  {
5630    SA_DBG1(("mpiGetTimeStampRsp: saving pRequest (%p) for later use\n", pRequest));
5631    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5632  }
5633  else
5634  {
5635    /* return the request to free pool */
5636    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5637  }
5638  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5639
5640  /* return value */
5641  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3M");
5642  return ret;
5643}
5644
5645/******************************************************************************/
5646/*! \brief SAS HW Event Ack Response
5647 *
5648 *  This routine handles the response of SAS HW Event Ack Command
5649 *
5650 *  \param agRoot       Handles for this instance of SAS/SATA LLL
5651 *  \param pIomb        Pointer of IOMB Mesage
5652 *
5653 *  \return sucess or fail
5654 *
5655 */
5656/*******************************************************************************/
5657GLOBAL bit32 mpiSASHwEventAckRsp(
5658  agsaRoot_t               *agRoot,
5659  agsaSASHwEventAckRsp_t   *pIomb
5660  )
5661{
5662  bit32               ret = AGSA_RC_SUCCESS;
5663  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5664  agsaIORequestDesc_t *pRequest;
5665  agsaContext_t       *agContext;
5666  agsaPort_t          *pPort;
5667  bit32               tag, status;
5668
5669  smTraceFuncEnter(hpDBG_VERY_LOUD,"2N");
5670
5671  SA_DBG2(("mpiSASHwEventAckRsp: Htag=0x%x %p\n", pIomb->tag,pIomb));
5672
5673  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSASHwEventAckRsp_t, tag));
5674  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSASHwEventAckRsp_t, status));
5675  /* get request from IOMap */
5676  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5677  if (agNULL == pRequest)
5678  {
5679    SA_DBG1(("mpiSASHwEventAckRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x Status=0x%x\n", tag, status));
5680    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2N");
5681    return AGSA_RC_FAILURE;
5682  }
5683
5684  agContext = saRoot->IOMap[tag].agContext;
5685  /* remove the request from IOMap */
5686  saRoot->IOMap[tag].Tag = MARK_OFF;
5687  saRoot->IOMap[tag].IORequest = agNULL;
5688  saRoot->IOMap[tag].agContext = agNULL;
5689  SA_ASSERT((pRequest->valid), "pRequest->valid");
5690
5691  SA_DBG1(("mpiSASHwEventAckRsp: status 0x%x Htag=0x%x HwAckType=0x%x\n",status,pIomb->tag,pRequest->HwAckType ));
5692
5693  ossaHwEventAckCB(agRoot, agContext, status);
5694
5695  pPort = pRequest->pPort;
5696  if (agNULL != pPort)
5697  {
5698    SA_DBG1(("mpiSASHwEventAckRsp: pPort %p tobedeleted %d\n", pPort, pPort->tobedeleted));
5699    if (pPort->status & PORT_INVALIDATING &&  pPort->tobedeleted )
5700    {
5701      SA_DBG1(("mpiSASHwEventAckRsp: PORT_INVALIDATING portInvalid portID %d pPort %p, nulling out PortContext\n", pPort->portId, pPort));
5702      /* invalid the port */
5703      siPortInvalid(agRoot, pPort);
5704      /* map out the portmap */
5705      saRoot->PortMap[pPort->portId].PortContext = agNULL;
5706      saRoot->PortMap[pPort->portId].PortID = PORT_MARK_OFF;
5707      saRoot->PortMap[pPort->portId].PortStatus  |= PORT_INVALIDATING;
5708    }
5709    else
5710    {
5711      SA_DBG1(("mpiSASHwEventAckRsp:pPort->status 0x%x Htag=0x%x %p\n",pPort->status, pIomb->tag,pIomb));
5712    }
5713  }
5714  else
5715  {
5716    SA_DBG1(("mpiSASHwEventAckRsp: pPort is NULL, no portId, HTag=0x%x\n", tag));
5717  }
5718
5719  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5720  pRequest->valid = agFALSE;
5721  /* return the request to free pool */
5722  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5723  {
5724    SA_DBG1(("mpiSASHwEventAckRsp: saving pRequest (%p) for later use\n", pRequest));
5725    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5726  }
5727  else
5728  {
5729    /* return the request to free pool */
5730    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5731  }
5732  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5733
5734  /* return value */
5735  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2N");
5736  return ret;
5737}
5738
5739/******************************************************************************/
5740/*! \brief Port Control Response
5741 *
5742 *  This routine handles the response of SAS HW Event Ack Command
5743 *
5744 *  \param agRoot       Handles for this instance of SAS/SATA LLL
5745 *  \param pIomb        Pointer of IOMB Mesage
5746 *
5747 *  \return sucess or fail
5748 *
5749 */
5750/*******************************************************************************/
5751GLOBAL bit32 mpiPortControlRsp(
5752  agsaRoot_t           *agRoot,
5753  agsaPortControlRsp_t *pIomb
5754  )
5755{
5756  bit32               ret = AGSA_RC_SUCCESS;
5757  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5758  agsaIORequestDesc_t *pRequest = agNULL;
5759  agsaContext_t       *agContext = agNULL;
5760  agsaPortContext_t   *agPortContext = agNULL;
5761  bit32               tag;
5762  bit32               port =0;
5763  bit32               operation =0;
5764  bit32               status =0;
5765  bit32               portState =0;
5766  bit32               portOperation =0;
5767
5768  smTraceFuncEnter(hpDBG_VERY_LOUD,"3O");
5769
5770  SA_DBG2(("mpiPortControlRsp: HTag=0x%x\n", pIomb->tag));
5771
5772  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t, tag));
5773  OSSA_READ_LE_32(AGROOT, &operation, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t, portOPPortId));
5774  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t, status));
5775  OSSA_READ_LE_32(AGROOT, &portState, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t,rsvdPortState ));
5776
5777  /* get request from IOMap */
5778  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5779  if (agNULL == pRequest)
5780  {
5781    SA_DBG1(("mpiPortControlRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x Status=0x%x\n", tag, status));
5782    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3O");
5783    return AGSA_RC_FAILURE;
5784  }
5785
5786  agContext = saRoot->IOMap[tag].agContext;
5787  /* remove the request from IOMap */
5788  saRoot->IOMap[tag].Tag = MARK_OFF;
5789  saRoot->IOMap[tag].IORequest = agNULL;
5790  saRoot->IOMap[tag].agContext = agNULL;
5791
5792  SA_ASSERT((pRequest->valid), "pRequest->valid");
5793
5794  if(!pRequest->valid)
5795  {
5796    SA_DBG1(("mpiPortControlRsp: pRequest->valid %d not set\n", pRequest->valid));
5797  }
5798
5799  SA_DBG2(("mpiPortControlRsp: pRequest->completionCB %p\n", pRequest->completionCB));
5800
5801  port = operation & PORTID_MASK;
5802
5803  if(port < AGSA_MAX_VALID_PORTS )
5804  {
5805    SA_DBG2(("mpiPortControlRsp: PortID 0x%x PortStatus 0x%x PortContext %p\n",
5806           saRoot->PortMap[port].PortID,
5807           saRoot->PortMap[port].PortStatus,
5808           saRoot->PortMap[port].PortContext));
5809
5810    agPortContext = (agsaPortContext_t *)saRoot->PortMap[port].PortContext;
5811  }
5812  SA_DBG2(("mpiPortControlRsp: PortID 0x%x PortStatus 0x%x PortContext %p\n",saRoot->PortMap[operation & PORTID_MASK].PortID,saRoot->PortMap[operation & PORTID_MASK].PortStatus,saRoot->PortMap[operation & PORTID_MASK].PortContext));
5813  agPortContext = (agsaPortContext_t *)saRoot->PortMap[operation & PORTID_MASK].PortContext;
5814  SA_DBG1(("mpiPortControlRsp: agPortContext %p\n",agPortContext ));
5815
5816
5817  SA_DBG2(("mpiPortControlRsp: portID 0x%x status 0x%x\n", (operation & PORTID_MASK), status));
5818
5819  SA_DBG1(("mpiPortControlRsp: portID 0x%x status 0x%x agPortContext %p\n",port, status,agPortContext));
5820
5821  portOperation = (((operation & LOCAL_PHY_OP_BITS) >> SHIFT8) | (portState << SHIFT28) );
5822
5823  SA_DBG1(("mpiPortControlRsp: portState 0x%x operation 0x%x portOperation 0x%x\n",portState, operation,portOperation ));
5824
5825  switch(portOperation)
5826  {
5827    case AGSA_PORT_SET_SMP_PHY_WIDTH:
5828      SA_DBG1(("mpiPortControlRsp: AGSA_PORT_SET_SMP_PHY_WIDTH  operation 0x%x\n",operation ));
5829      break;
5830    case AGSA_PORT_SET_PORT_RECOVERY_TIME:
5831      SA_DBG1(("mpiPortControlRsp: AGSA_PORT_SET_PORT_RECOVERY_TIME  operation 0x%x\n",operation ));
5832      break;
5833    case AGSA_PORT_IO_ABORT:
5834      SA_DBG1(("mpiPortControlRsp: AGSA_PORT_IO_ABORT  operation 0x%x\n",operation ));
5835      break;
5836    case AGSA_PORT_SET_PORT_RESET_TIME:
5837      SA_DBG1(("mpiPortControlRsp: AGSA_PORT_SET_PORT_RESET_TIME  operation 0x%x\n",operation ));
5838      break;
5839    case AGSA_PORT_HARD_RESET:
5840      SA_DBG1(("mpiPortControlRsp: AGSA_PORT_HARD_RESET  operation 0x%x\n",operation ));
5841      break;
5842    case AGSA_PORT_CLEAN_UP:
5843      SA_DBG1(("mpiPortControlRsp: AGSA_PORT_CLEAN_UP  operation 0x%x\n",operation ));
5844      break;
5845    case AGSA_STOP_PORT_RECOVERY_TIMER:
5846      SA_DBG1(("mpiPortControlRsp: AGSA_STOP_PORT_RECOVERY_TIMER  operation 0x%x\n",operation ));
5847      break;
5848    default:
5849    {
5850      SA_DBG1(("mpiPortControlRsp: Unknown  operation 0x%x\n",operation ));
5851    }
5852  }
5853
5854  ossaPortControlCB(agRoot, agContext, agPortContext, portOperation, status);
5855
5856  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5857  pRequest->valid = agFALSE;
5858  /* return the request to free pool */
5859  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5860  {
5861    SA_DBG1(("mpiPortControlRsp: saving pRequest (%p) for later use\n", pRequest));
5862    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5863  }
5864  else
5865  {
5866    /* return the request to free pool */
5867    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5868  }
5869  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5870
5871  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3O");
5872  /* return value */
5873  return ret;
5874}
5875
5876/******************************************************************************/
5877/*! \brief SPC MPI SMP ABORT Response
5878 *
5879 *  This function handles the SMP Abort Response.
5880 *
5881 *  \param agRoot       Handles for this instance of SAS/SATA LLL
5882 *  \param pIomb        pointer of Message
5883 *
5884 *  \return The read value
5885 *
5886 */
5887/*******************************************************************************/
5888GLOBAL bit32 mpiSMPAbortRsp(
5889  agsaRoot_t         *agRoot,
5890  agsaSMPAbortRsp_t  *pIomb
5891  )
5892{
5893  bit32               ret = AGSA_RC_SUCCESS;
5894  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5895  agsaIORequestDesc_t *pRequest;
5896  agsaDeviceDesc_t    *pDevice;
5897  bit32               tag, scp, status;
5898
5899  smTraceFuncEnter(hpDBG_VERY_LOUD,"3P");
5900
5901  SA_DBG3(("mpiSMPAbortRsp: HTag=0x%x Status=0x%x\n", pIomb->tag, pIomb->status));
5902
5903  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSMPAbortRsp_t, tag));
5904  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSMPAbortRsp_t, status));
5905  OSSA_READ_LE_32(AGROOT, &scp, pIomb, OSSA_OFFSET_OF(agsaSMPAbortRsp_t, scp));
5906
5907  /* get IORequest from IOMap */
5908  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5909
5910  if (agNULL == pRequest)
5911  {
5912    SA_DBG1(("mpiSMPAbortRsp: pRequest is NULL, HTag=0x%x Status=0x%x\n", pIomb->tag, pIomb->status));
5913    SA_ASSERT((pRequest), "pRequest");
5914    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3P");
5915    return AGSA_RC_FAILURE;
5916  }
5917
5918  if ( agTRUE == pRequest->valid )
5919  {
5920    pDevice = pRequest->pDevice;
5921    SA_ASSERT((pRequest->pDevice), "pRequest->pDevice");
5922
5923    SA_DBG3(("mpiSMPAbortRsp: request abort is valid Htag 0x%x\n", tag));
5924
5925    /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
5926    saRoot->IOMap[tag].Tag = MARK_OFF;
5927    saRoot->IOMap[tag].IORequest = agNULL;
5928    saRoot->IOMap[tag].agContext = agNULL;
5929
5930    if( pRequest->completionCB == agNULL )
5931    {
5932      SA_DBG1(("mpiSMPAbortRsp: ************************************************* Valid for Expander only tag 0x%x\n", tag));
5933      ossaSMPAbortCB(agRoot, pRequest->pIORequestContext, scp, status);
5934    }
5935    else
5936    {
5937      (*(ossaGenericAbortCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, scp, status);
5938    }
5939
5940    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5941
5942    /* Delete the request from the pendingIORequests */
5943    saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
5944    pRequest->valid = agFALSE;
5945    /* return the request to free pool */
5946    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5947    {
5948      SA_DBG1(("mpiSMPAbortRsp: saving pRequest (%p) for later use\n", pRequest));
5949      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5950    }
5951    else
5952    {
5953      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5954    }
5955    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5956
5957  }
5958  else
5959  {
5960    ret = AGSA_RC_FAILURE;
5961    SA_DBG1(("mpiSMPAbortRsp: the request is not valid any more. Tag=%x\n", pRequest->HTag));
5962  }
5963
5964
5965  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3P");
5966
5967  return ret;
5968}
5969
5970/******************************************************************************/
5971/*! \brief SPC MPI Device Handle Arrived Event (target mode)
5972 *
5973 *  This function handles the Device Handle Arrived Event.
5974 *
5975 *  \param agRoot       Handles for this instance of SAS/SATA LLL
5976 *  \param pMsg1        pointer of Message
5977 *
5978 *  \return The read value
5979 *
5980 */
5981/*******************************************************************************/
5982GLOBAL bit32 mpiDeviceHandleRemoval(
5983  agsaRoot_t *agRoot,
5984  agsaDeviceHandleRemoval_t *pMsg1)
5985{
5986  bit32               ret = AGSA_RC_SUCCESS;
5987  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5988  agsaDeviceDesc_t    *pDevice;
5989  agsaPortContext_t   *agPortContext;
5990  bit32               portId;
5991  bit32               deviceid, deviceIdx;
5992
5993  smTraceFuncEnter(hpDBG_VERY_LOUD,"3R");
5994
5995  /* convert endiness if necassary */
5996  OSSA_READ_LE_32(AGROOT, &portId, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleRemoval_t, portId));
5997  OSSA_READ_LE_32(AGROOT, &deviceid, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleRemoval_t, deviceId));
5998
5999  SA_DBG3(("mpiDeviceHandleRemoval: portId=0x%x deviceId=0x%x\n", portId, deviceid));
6000
6001  pDevice = saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
6002  SA_DBG2(("mpiDeviceHandleRemoval:PortID 0x%x PortStatus 0x%x PortContext %p\n",
6003          saRoot->PortMap[portId & PORTID_MASK].PortID,
6004          saRoot->PortMap[portId & PORTID_MASK].PortStatus,
6005          saRoot->PortMap[portId & PORTID_MASK].PortContext));
6006  agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId & PORTID_MASK].PortContext;
6007
6008  /* Call Back */
6009  SA_DBG1(("mpiDeviceHandleRemoval: portId=0x%x deviceId=0x%x autoDeregDeviceflag=0x%x\n", portId, deviceid,saRoot->autoDeregDeviceflag[portId & PORTID_MASK]));
6010  if (pDevice->targetDevHandle.sdkData)
6011  {
6012    ossaDeviceHandleRemovedEvent(agRoot, &(pDevice->targetDevHandle), agPortContext);
6013
6014    if (saRoot->autoDeregDeviceflag[portId & PORTID_MASK])
6015    {
6016      /* remove the DeviceMap and MapIndex */
6017      deviceIdx = pDevice->DeviceMapIndex & DEVICE_ID_BITS;
6018      SA_DBG1(("mpiDeviceHandleRemoval: A  Freed portId=0x%x deviceId=0x%x\n", portId, deviceid));
6019      OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
6020
6021      saRoot->DeviceMap[deviceIdx].DeviceIdFromFW = 0;
6022      saRoot->DeviceMap[deviceIdx].DeviceHandle = agNULL;
6023      pDevice->DeviceMapIndex = 0;
6024
6025      /* Reset the device data structure */
6026      pDevice->pPort = agNULL;
6027      pDevice->targetDevHandle.sdkData = agNULL;
6028      pDevice->targetDevHandle.osData = agNULL;
6029      ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6030      saLlistAdd(&(saRoot->freeDevicesList), &(pDevice->linkNode));
6031      SA_DBG1(("mpiDeviceHandleRemoval: portId=0x%x deviceId=0x%x\n", portId, deviceid));
6032
6033      ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6034    }
6035  }
6036  else
6037  {
6038    if (pDevice->initiatorDevHandle.sdkData)
6039    {
6040      ossaDeviceHandleRemovedEvent(agRoot, &(pDevice->initiatorDevHandle), agPortContext);
6041
6042      if (saRoot->autoDeregDeviceflag[portId & PORTID_MASK])
6043      {
6044        /* remove the DeviceMap and MapIndex */
6045        deviceIdx = pDevice->DeviceMapIndex & DEVICE_ID_BITS;
6046        SA_DBG1(("mpiDeviceHandleRemoval: A  Freed portId=0x%x deviceId=0x%x\n", portId, deviceid));
6047        OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
6048        saRoot->DeviceMap[deviceIdx].DeviceIdFromFW = 0;
6049        saRoot->DeviceMap[deviceIdx].DeviceHandle = agNULL;
6050        pDevice->DeviceMapIndex = 0;
6051
6052        /* Reset the device data structure */
6053        pDevice->pPort = agNULL;
6054        pDevice->initiatorDevHandle.sdkData = agNULL;
6055        pDevice->initiatorDevHandle.osData = agNULL;
6056        ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6057        saLlistAdd(&(saRoot->freeDevicesList), &(pDevice->linkNode));
6058        ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6059      }
6060    }
6061    else
6062    {
6063      /* no callback because bad device_id */
6064      SA_DBG1(("mpiDeviceHandleRemoval: Bad Device Handle, deviceId=0x%x\n", deviceid));
6065    }
6066  }
6067
6068  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3R");
6069  return ret;
6070}
6071
6072/******************************************************************************/
6073/*! \brief Set Device State Response
6074 *
6075 *  This routine handles the response of SET Device State Response
6076 *
6077 *  \param agRoot       Handles for this instance of SAS/SATA LLL
6078 *  \param pIomb        Pointer of IOMB Mesage
6079 *
6080 *  \return sucess or fail
6081 *
6082 */
6083/*******************************************************************************/
6084GLOBAL bit32 mpiSetDeviceStateRsp(
6085  agsaRoot_t             *agRoot,
6086  agsaSetDeviceStateRsp_t *pIomb
6087  )
6088{
6089  bit32               ret = AGSA_RC_SUCCESS;
6090  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6091  agsaIORequestDesc_t *pRequest;
6092  agsaDevHandle_t     *agDevHandle;
6093  agsaDeviceDesc_t    *pDevice;
6094  agsaContext_t       *agContext;
6095  bit32               tag, status, deviceState, deviceId;
6096
6097  smTraceFuncEnter(hpDBG_VERY_LOUD,"3Q");
6098
6099  SA_DBG1(("mpiSetDeviceStateRsp: HTag=0x%x, deviceId=0x%x\n", pIomb->tag, pIomb->deviceId));
6100
6101  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, tag));
6102  OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, deviceId));
6103  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, status));
6104
6105  /* get request from IOMap */
6106  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6107  if (agNULL == pRequest)
6108  {
6109    SA_DBG1(("mpiSetDeviceStateRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6110    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3Q");
6111    return AGSA_RC_FAILURE;
6112  }
6113
6114  agContext = saRoot->IOMap[tag].agContext;
6115  /* remove the request from IOMap */
6116  saRoot->IOMap[tag].Tag = MARK_OFF;
6117  saRoot->IOMap[tag].IORequest = agNULL;
6118  saRoot->IOMap[tag].agContext = agNULL;
6119
6120  SA_ASSERT((pRequest->valid), "pRequest->valid");
6121
6122  /* status is SUCCESS */
6123  OSSA_READ_LE_32(AGROOT, &deviceState, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, pds_nds));
6124
6125  /* find device handle from device index */
6126  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceId & DEVICE_ID_BITS].DeviceHandle;
6127  if (agNULL == pDevice)
6128  {
6129    SA_DBG1(("mpiSetDeviceStateRsp: DeviceHandle is NULL!!! deviceId=0x%x TAG=0x%x STATUS=0x%x \n", deviceId, tag, status));
6130    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3Q");
6131    return AGSA_RC_FAILURE;
6132  }
6133
6134  if (pDevice->targetDevHandle.sdkData)
6135  {
6136    agDevHandle = &(pDevice->targetDevHandle);
6137  }
6138  else
6139  {
6140    agDevHandle = &(pDevice->initiatorDevHandle);
6141  }
6142
6143  if (agDevHandle == agNULL)
6144  {
6145    SA_DBG1(("mpiSetDeviceStateRsp: warning!!! no deviceHandle is found"));
6146    ossaSetDeviceStateCB(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0, 0);
6147    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3Q");
6148
6149    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6150    pRequest->valid = agFALSE;
6151    /* return the request to free pool */
6152    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6153    {
6154      SA_DBG1(("mpiSetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
6155      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6156    }
6157    else
6158    {
6159      /* return the request to free pool */
6160      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6161    }
6162    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6163
6164    return AGSA_RC_FAILURE;
6165  }
6166
6167  ossaSetDeviceStateCB(agRoot, agContext, agDevHandle, status, (deviceState & NDS_BITS),
6168                      (deviceState & PDS_BITS) >> SHIFT4);
6169
6170  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6171  pRequest->valid = agFALSE;
6172  /* return the request to free pool */
6173  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6174  {
6175    SA_DBG1(("mpiSetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
6176    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6177  }
6178  else
6179  {
6180    /* return the request to free pool */
6181    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6182  }
6183  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6184
6185  /* return value */
6186  smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3Q");
6187  return ret;
6188}
6189
6190/******************************************************************************/
6191/*! \brief Get Device State Response
6192 *
6193 *  This routine handles the response of GET Device State Response
6194 *
6195 *  \param agRoot       Handles for this instance of SAS/SATA LLL
6196 *  \param pIomb        Pointer of IOMB Mesage
6197 *
6198 *  \return sucess or fail
6199 *
6200 */
6201/*******************************************************************************/
6202GLOBAL bit32 mpiGetDeviceStateRsp(
6203  agsaRoot_t             *agRoot,
6204  agsaGetDeviceStateRsp_t *pIomb
6205  )
6206{
6207  bit32               ret = AGSA_RC_SUCCESS;
6208  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6209  agsaIORequestDesc_t *pRequest;
6210  agsaDevHandle_t     *agDevHandle;
6211  agsaDeviceDesc_t    *pDevice;
6212  agsaContext_t       *agContext;
6213  bit32               tag, status, deviceId, deviceState;
6214
6215  smTraceFuncEnter(hpDBG_VERY_LOUD,"3W");
6216
6217  SA_DBG1(("mpiGetDeviceStateRsp: HTag=0x%x, deviceId=0x%x\n", pIomb->tag, pIomb->deviceId));
6218
6219  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, tag));
6220  OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, deviceId));
6221  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, status));
6222
6223  /* get request from IOMap */
6224  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6225  if (agNULL == pRequest)
6226  {
6227    SA_DBG1(("mpiGetDeviceStateRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6228    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3W");
6229    return AGSA_RC_FAILURE;
6230  }
6231
6232  agContext = saRoot->IOMap[tag].agContext;
6233  /* remove the request from IOMap */
6234  saRoot->IOMap[tag].Tag = MARK_OFF;
6235  saRoot->IOMap[tag].IORequest = agNULL;
6236  saRoot->IOMap[tag].agContext = agNULL;
6237
6238  SA_ASSERT((pRequest->valid), "pRequest->valid");
6239
6240  /* status is SUCCESS */
6241  OSSA_READ_LE_32(AGROOT, &deviceState, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, ds));
6242
6243  /* find device handle from device index */
6244  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceId & DEVICE_ID_BITS].DeviceHandle;
6245  if (pDevice != agNULL)
6246  {
6247    if (pDevice->targetDevHandle.sdkData)
6248    {
6249      agDevHandle = &(pDevice->targetDevHandle);
6250    }
6251    else
6252    {
6253      agDevHandle = &(pDevice->initiatorDevHandle);
6254    }
6255  }
6256  else
6257  {
6258    SA_DBG1(("mpiGetDeviceStateRsp: pDevice is NULL"));
6259    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3W");
6260    return AGSA_RC_FAILURE;
6261  }
6262
6263  if (agDevHandle == agNULL)
6264  {
6265    SA_DBG1(("mpiGetDeviceStateRsp: warning!!! no deviceHandle is found"));
6266    ossaGetDeviceStateCB(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0);
6267    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3W");
6268
6269    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6270    pRequest->valid = agFALSE;
6271    /* return the request to free pool */
6272    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6273    {
6274      SA_DBG1(("mpiGetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
6275      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6276    }
6277    else
6278    {
6279      /* return the request to free pool */
6280      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6281    }
6282    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6283
6284    return AGSA_RC_FAILURE;
6285  }
6286
6287  ossaGetDeviceStateCB(agRoot, agContext, agDevHandle, status, deviceState);
6288
6289  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6290  pRequest->valid = agFALSE;
6291  /* return the request to free pool */
6292  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6293  {
6294    SA_DBG1(("mpiGetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
6295    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6296  }
6297  else
6298  {
6299    /* return the request to free pool */
6300    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6301  }
6302  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6303
6304  /* return value */
6305  smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3W");
6306  return ret;
6307}
6308
6309/******************************************************************************/
6310/*! \brief SAS ReInitialize Response
6311 *
6312 *  This routine handles the response of SAS Reinitialize Response
6313 *
6314 *  \param agRoot       Handles for this instance of SAS/SATA LLL
6315 *  \param pIomb        Pointer of IOMB Mesage
6316 *
6317 *  \return sucess or fail
6318 *
6319 */
6320/*******************************************************************************/
6321GLOBAL bit32 mpiSasReInitializeRsp(
6322  agsaRoot_t               *agRoot,
6323  agsaSasReInitializeRsp_t *pIomb
6324  )
6325{
6326  bit32               ret = AGSA_RC_SUCCESS;
6327  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6328  agsaIORequestDesc_t *pRequest;
6329  agsaContext_t       *agContext;
6330  agsaSASReconfig_t   SASReconfig;
6331  bit32               tag, status, setFlags, MaxPorts;
6332  bit32               openRejReCmdData, sataHOLTMO;
6333
6334  smTraceFuncEnter(hpDBG_VERY_LOUD,"3X");
6335
6336  SA_DBG1(("mpiSasReInitializeRsp: HTag=0x%x, status=0x%x\n", pIomb->tag, pIomb->status));
6337
6338  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, tag));
6339  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, status));
6340  OSSA_READ_LE_32(AGROOT, &setFlags, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, setFlags));
6341  OSSA_READ_LE_32(AGROOT, &MaxPorts, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, MaxPorts));
6342  OSSA_READ_LE_32(AGROOT, &openRejReCmdData, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, openRejReCmdData));
6343  OSSA_READ_LE_32(AGROOT, &sataHOLTMO, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, sataHOLTMO));
6344
6345  /* get request from IOMap */
6346  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6347  if (agNULL == pRequest)
6348  {
6349    SA_DBG1(("mpiSasReInitializeRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6350    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3X");
6351    return AGSA_RC_FAILURE;
6352  }
6353
6354  agContext = saRoot->IOMap[tag].agContext;
6355  /* remove the request from IOMap */
6356  saRoot->IOMap[tag].Tag = MARK_OFF;
6357  saRoot->IOMap[tag].IORequest = agNULL;
6358  saRoot->IOMap[tag].agContext = agNULL;
6359
6360  SA_ASSERT((pRequest->valid), "pRequest->valid");
6361
6362  SASReconfig.flags = setFlags;
6363  SASReconfig.maxPorts = (bit8)(MaxPorts & 0xFF);
6364  SASReconfig.openRejectRetriesCmd = (bit16)((openRejReCmdData & 0xFFFF0000) >> SHIFT16);
6365  SASReconfig.openRejectRetriesData = (bit16)(openRejReCmdData & 0x0000FFFF);
6366  SASReconfig.sataHolTmo = (bit16)(sataHOLTMO & 0xFFFF);
6367  ossaReconfigSASParamsCB(agRoot, agContext, status, &SASReconfig);
6368
6369  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6370  pRequest->valid = agFALSE;
6371  /* return the request to free pool */
6372  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6373  {
6374    SA_DBG1(("mpiSasReInitializeRsp: saving pRequest (%p) for later use\n", pRequest));
6375    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6376  }
6377  else
6378  {
6379    /* return the request to free pool */
6380    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6381  }
6382  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6383
6384  /* return value */
6385  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3X");
6386
6387  return ret;
6388}
6389
6390/******************************************************************************/
6391/*! \brief serial GPIO Response
6392 *
6393 *  This routine handles the response of serial GPIO Response
6394 *
6395 *  \param agRoot       Handles for this instance of SAS/SATA LLL
6396 *  \param pIomb        Pointer of IOMB Mesage
6397 *
6398 *  \return sucess or fail
6399 *
6400 */
6401/*******************************************************************************/
6402GLOBAL bit32 mpiSGpioRsp(
6403  agsaRoot_t        *agRoot,
6404  agsaSGpioRsp_t    *pInIomb
6405  )
6406{
6407  bit32                     ret = AGSA_RC_SUCCESS;
6408  agsaLLRoot_t              *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6409  agsaIORequestDesc_t       *pRequest = NULL;
6410  agsaContext_t             *agContext = NULL;
6411  bit32                     i, tag, resultFunctionFrameType;
6412  agsaSGpioReqResponse_t    SgpioResponse = {0};
6413
6414  smTraceFuncEnter(hpDBG_VERY_LOUD,"3Y");
6415
6416  SA_DBG3(("mpiSGpioRsp: HTAG=0x%x\n", pInIomb->tag));
6417
6418  OSSA_READ_LE_32(AGROOT, &tag, pInIomb, OSSA_OFFSET_OF(agsaSGpioRsp_t, tag));
6419  OSSA_READ_LE_32(AGROOT, &resultFunctionFrameType, pInIomb, OSSA_OFFSET_OF(agsaSGpioRsp_t, resultFunctionFrameType));
6420
6421  SgpioResponse.smpFrameType = resultFunctionFrameType & 0xFF;
6422  SgpioResponse.function = (resultFunctionFrameType & 0xFF00) >> 8;
6423  SgpioResponse.functionResult = (resultFunctionFrameType & 0xFF0000) >> 16;
6424
6425  if (SA_SAS_SMP_READ_GPIO_REGISTER == SgpioResponse.function)
6426  {
6427    for (i = 0; i < OSSA_SGPIO_MAX_READ_DATA_COUNT; i++)
6428    {
6429      OSSA_READ_LE_32(AGROOT, &SgpioResponse.readWriteData[i], pInIomb, OSSA_OFFSET_OF(agsaSGpioRsp_t, readData) + (i * 4));
6430    }
6431  }
6432
6433  /* Get the request from IOMap */
6434  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6435  if (agNULL == pRequest)
6436  {
6437    SA_DBG1(("mpiSGpioRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, SgpioResponse.functionResult));
6438    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3Y");
6439    ret = AGSA_RC_FAILURE;
6440  }
6441  else
6442  {
6443    agContext = saRoot->IOMap[tag].agContext;
6444    ossaSGpioCB(agRoot, agContext, &SgpioResponse);
6445
6446    /* Return the request to free pool */
6447    saReturnRequestToFreePool(agRoot, pRequest);
6448
6449    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3Y");
6450  }
6451
6452  return ret;
6453}
6454
6455/******************************************************************************/
6456/*! \brief PCIE Diagnostics Response
6457 *
6458 *  This routine handles the response of PCIE Diagnostics Response
6459 *
6460 *  \param agRoot       Handles for this instance of SAS/SATA LLL
6461 *  \param pIomb        Pointer of IOMB Mesage
6462 *
6463 *  \return sucess or fail
6464 *
6465 */
6466/*******************************************************************************/
6467GLOBAL bit32 mpiPCIeDiagExecuteRsp(
6468  agsaRoot_t                *agRoot,
6469  void                      *pInIomb
6470  )
6471{
6472  bit32               ret = AGSA_RC_SUCCESS;
6473  agsaLLRoot_t        *saRoot = agNULL;
6474  agsaIORequestDesc_t *pRequest;
6475  agsaContext_t       *agContext;
6476  bit32               tag, Status, Command;
6477  agsaPCIeDiagResponse_t pciediadrsp;
6478  bit32  *pIomb = (bit32  *)pInIomb;
6479
6480  smTraceFuncEnter(hpDBG_VERY_LOUD,"3Z");
6481
6482  /* sanity check */
6483  SA_ASSERT((agNULL != agRoot), "");
6484  saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
6485  SA_ASSERT((agNULL != saRoot), "");
6486
6487  si_memset(&pciediadrsp, 0, sizeof(agsaPCIeDiagResponse_t));
6488
6489  if(smIS_SPCV(agRoot))
6490  {
6491    OSSA_READ_LE_32(AGROOT, &tag,                  pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,tag));
6492    OSSA_READ_LE_32(AGROOT, &Command,              pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,CmdTypeDesc));
6493    OSSA_READ_LE_32(AGROOT, &Status,               pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,Status));
6494    OSSA_READ_LE_32(AGROOT, &pciediadrsp.ERR_BLKH, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,ERR_BLKH ));
6495    OSSA_READ_LE_32(AGROOT, &pciediadrsp.ERR_BLKL, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,ERR_BLKL ));
6496    OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord8,   pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord8 ));
6497    OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord9,   pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord9 ));
6498    OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord10,  pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord10 ));
6499    OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord11,  pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord11 ));
6500    OSSA_READ_LE_32(AGROOT, &pciediadrsp.DIF_ERR,  pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DIF_ERR ));
6501    SA_DBG3(("mpiPCIeDiagExecuteRsp: HTAG=0x%x\n",tag));
6502  }
6503  else
6504  {
6505    OSSA_READ_LE_32(AGROOT, &tag,        pIomb,           OSSA_OFFSET_OF(agsa_SPC_PCIeDiagExecuteRsp_t,tag));
6506    OSSA_READ_LE_32(AGROOT, &Command,    pIomb,           OSSA_OFFSET_OF(agsa_SPC_PCIeDiagExecuteRsp_t,CmdTypeDesc));
6507    OSSA_READ_LE_32(AGROOT, &Status,     pIomb,           OSSA_OFFSET_OF(agsa_SPC_PCIeDiagExecuteRsp_t,Status));
6508    SA_DBG3(("mpiPCIeDiagExecuteRsp: SPC HTAG=0x%x\n",tag));
6509  }
6510
6511  switch(Status)
6512  {
6513    case OSSA_PCIE_DIAG_SUCCESS:
6514      SA_DBG3(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_SUCCESS TAG=0x%x STATUS=0x%x\n", tag, Status));
6515      break;
6516    case OSSA_IO_INVALID_LENGTH:
6517      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_IO_INVALID_LENGTH TAG=0x%x STATUS=0x%x\n", tag, Status));
6518      break;
6519    case OSSA_PCIE_DIAG_INVALID_COMMAND:
6520      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_COMMAND TAG=0x%x STATUS=0x%x\n", tag, Status));
6521      break;
6522    case OSSA_PCIE_DIAG_INTERNAL_FAILURE:
6523      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INTERNAL_FAILURE TAG=0x%x STATUS=0x%x\n", tag, Status));
6524      break;
6525    case OSSA_PCIE_DIAG_INVALID_CMD_TYPE:
6526      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_CMD_TYPE TAG=0x%x STATUS=0x%x\n", tag, Status));
6527      break;
6528    case OSSA_PCIE_DIAG_INVALID_CMD_DESC:
6529      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_CMD_DESC TAG=0x%x STATUS=0x%x\n", tag, Status));
6530      break;
6531    case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
6532      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
6533      break;
6534    case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_CRC_MISMATCH:
6535      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_CRC_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
6536      break;
6537    case OSSA_PCIE_DIAG_INVALID_PCIE_ADDR:
6538      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_PCIE_ADDR TAG=0x%x STATUS=0x%x\n", tag, Status));
6539      break;
6540    case OSSA_PCIE_DIAG_INVALID_BLOCK_SIZE:
6541      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_BLOCK_SIZE TAG=0x%x STATUS=0x%x\n", tag, Status));
6542      break;
6543    case OSSA_PCIE_DIAG_LENGTH_NOT_BLOCK_SIZE_ALIGNED:
6544      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_LENGTH_NOT_BLOCK_SIZE_ALIGNED TAG=0x%x STATUS=0x%x\n", tag, Status));
6545      break;
6546    case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_MISMATCH:
6547      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
6548      break;
6549    case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
6550      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
6551      break;
6552    default:
6553      SA_DBG1(("mpiPCIeDiagExecuteRsp:  UNKNOWN status TAG=0x%x STATUS=0x%x\n", tag, Status));
6554      break;
6555  }
6556  /* get request from IOMap */
6557  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6558  if (agNULL == pRequest)
6559  {
6560    SA_DBG1(("mpiPCIeDiagExecuteRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, Status));
6561    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3Z");
6562    return AGSA_RC_FAILURE;
6563  }
6564
6565  agContext = saRoot->IOMap[tag].agContext;
6566  /* remove the request from IOMap */
6567  saRoot->IOMap[tag].Tag = MARK_OFF;
6568  saRoot->IOMap[tag].IORequest = agNULL;
6569  saRoot->IOMap[tag].agContext = agNULL;
6570
6571  SA_ASSERT((pRequest->valid), "pRequest->valid");
6572
6573  ossaPCIeDiagExecuteCB(agRoot, agContext, Status, Command,&pciediadrsp);
6574
6575  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6576  pRequest->valid = agFALSE;
6577  /* return the request to free pool */
6578  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6579  {
6580    SA_DBG1(("mpiPCIeDiagExecuteRsp: saving pRequest (%p) for later use\n", pRequest));
6581    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6582  }
6583  else
6584  {
6585    /* return the request to free pool */
6586    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6587  }
6588  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6589
6590  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3Z");
6591
6592  /* return value */
6593  return ret;
6594}
6595/******************************************************************************/
6596/*! \brief Get DFE Data command Response
6597 *
6598 *  This routine handles the response of Get DFE Data command Response
6599 *
6600 *  \param agRoot       Handles for this instance of SAS/SATA LLL
6601 *  \param pIomb        Pointer of IOMB Mesage
6602 *
6603 *  \return sucess or fail
6604 *
6605 */
6606/*******************************************************************************/
6607GLOBAL bit32 mpiGetDFEDataRsp(
6608  agsaRoot_t    *agRoot,
6609  void          *pIomb
6610  )
6611{
6612  bit32               ret = AGSA_RC_SUCCESS;
6613  agsaLLRoot_t        *saRoot = agNULL;
6614  agsaIORequestDesc_t *pRequest;
6615  agsaContext_t       *agContext;
6616  bit32               tag = 0, status = 0, In_Ln = 0, MCNT = 0, NBT = 0;
6617
6618  smTraceFuncEnter(hpDBG_VERY_LOUD,"2Y");
6619
6620  /* sanity check */
6621  SA_ASSERT((agNULL != agRoot), "");
6622  saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
6623  SA_ASSERT((agNULL != saRoot), "");
6624
6625  if(smIS_SPCV(agRoot))
6626  {
6627    OSSA_READ_LE_32(AGROOT, &tag,                pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,tag));
6628    OSSA_READ_LE_32(AGROOT, &status,             pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,status));
6629    OSSA_READ_LE_32(AGROOT, &In_Ln,              pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,reserved_In_Ln));
6630    OSSA_READ_LE_32(AGROOT, &MCNT,               pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,MCNT));
6631    OSSA_READ_LE_32(AGROOT, &NBT,                pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,NBT));
6632  }
6633  else
6634  {
6635    /* SPC does not support this command */
6636  }
6637
6638  switch(status)
6639  {
6640    case OSSA_DFE_MPI_IO_SUCCESS:
6641      SA_DBG3(("mpiGetDFEDataRsp: OSSA_DFE_MPI_IO_SUCCESS TAG=0x%x STATUS=0x%x\n", tag, status));
6642      break;
6643    case OSSA_DFE_DATA_OVERFLOW:
6644      SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_DATA_OVERFLOW TAG=0x%x STATUS=0x%x\n", tag, status));
6645      break;
6646    case OSSA_DFE_MPI_ERR_RESOURCE_UNAVAILABLE:
6647      SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_MPI_ERR_RESOURCE_UNAVAILABLE TAG=0x%x STATUS=0x%x\n", tag, status));
6648      break;
6649    case OSSA_DFE_CHANNEL_DOWN:
6650      SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_CHANNEL_DOWN TAG=0x%x STATUS=0x%x\n", tag, status));
6651      break;
6652    case OSSA_DFE_MEASUREMENT_IN_PROGRESS:
6653      SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_MEASUREMENT_IN_PROGRESS TAG=0x%x STATUS=0x%x\n", tag, status));
6654      break;
6655    case OSSA_DFE_CHANNEL_INVALID:
6656      SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_CHANNEL_INVALID TAG=0x%x STATUS=0x%x\n", tag, status));
6657      break;
6658    case OSSA_DFE_DMA_FAILURE:
6659      SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_DMA_FAILURE TAG=0x%x STATUS=0x%x\n", tag, status));
6660      break;
6661    default:
6662      SA_DBG1(("mpiGetDFEDataRsp:  UNKNOWN status TAG=0x%x STATUS=0x%x\n", tag, status));
6663      break;
6664   }
6665
6666  /* get request from IOMap */
6667  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6668  if (agNULL == pRequest)
6669  {
6670    SA_DBG1(("mpiGetDFEDataRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, status));
6671    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2Y");
6672    return AGSA_RC_FAILURE;
6673  }
6674
6675  agContext = saRoot->IOMap[tag].agContext;
6676  /* remove the request from IOMap */
6677  saRoot->IOMap[tag].Tag = MARK_OFF;
6678  saRoot->IOMap[tag].IORequest = agNULL;
6679  saRoot->IOMap[tag].agContext = agNULL;
6680
6681  SA_ASSERT((pRequest->valid), "pRequest->valid");
6682
6683  ossaGetDFEDataCB(agRoot, agContext, status, NBT);
6684
6685  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6686  pRequest->valid = agFALSE;
6687  /* return the request to free pool */
6688  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6689  {
6690    SA_DBG1(("mpiGetDFEDataRsp: saving pRequest (%p) for later use\n", pRequest));
6691    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6692  }
6693  else
6694  {
6695    /* return the request to free pool */
6696    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6697  }
6698  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6699
6700  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2Y");
6701
6702  return ret;
6703}
6704
6705
6706/******************************************************************************/
6707/*! \brief SAS Set Controller Config Response
6708 *
6709 *  This routine handles the response of Set Controller Config Command
6710 *
6711 *  \param agRoot       Handles for this instance of SAS/SATA LLL
6712 *  \param pIomb        Pointer of IOMB Mesage
6713 *
6714 *  \return sucess or fail
6715 *
6716 */
6717/*******************************************************************************/
6718GLOBAL bit32 mpiSetControllerConfigRsp(
6719  agsaRoot_t                   *agRoot,
6720  agsaSetControllerConfigRsp_t *pIomb
6721  )
6722{
6723  agsaLLRoot_t          *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6724  agsaIORequestDesc_t   *pRequest;
6725  agsaHWEventMode_t     agMode;
6726  bit32                 status, errorQualifierPage, tag;
6727  bit32                 errorQualifier;
6728  bit32                 pagetype;
6729
6730  smTraceFuncEnter(hpDBG_VERY_LOUD,"3a");
6731
6732  SA_DBG1(("mpiSetControllerConfigRsp: HTag=0x%x\n", pIomb->tag));
6733
6734  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetControllerConfigRsp_t, tag));
6735  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetControllerConfigRsp_t, status));
6736  OSSA_READ_LE_32(AGROOT, &errorQualifierPage, pIomb, OSSA_OFFSET_OF(agsaSetControllerConfigRsp_t, errorQualifierPage));
6737
6738  /* get request from IOMap */
6739  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6740  if (agNULL == pRequest)
6741  {
6742    SA_DBG1(("mpiSetControllerConfigRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6743    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3a");
6744    return AGSA_RC_FAILURE;
6745  }
6746
6747  si_memset(&agMode, 0, sizeof(agsaHWEventMode_t));
6748  agMode.modePageOperation = agsaModePageSet;
6749  agMode.status = status;
6750  agMode.context = saRoot->IOMap[tag].agContext;
6751  errorQualifier = (errorQualifierPage & 0xFFFF0000) >> SHIFT16;
6752  pagetype = (errorQualifierPage & 0xFF);
6753
6754  if(status )
6755  {
6756    SA_DBG1(("mpiSetControllerConfigRsp: Error detected tag 0x%x pagetype 0x%x status 0x%x errorQualifier 0x%x\n",
6757      tag, pagetype,status, errorQualifier));
6758  }
6759  else
6760  {
6761    SA_DBG1(("mpiSetControllerConfigRsp: tag 0x%x pagetype 0x%x status 0x%x\n", tag, pagetype,status ));
6762  }
6763
6764
6765  switch( pagetype)
6766  {
6767    case AGSA_ENCRYPTION_DEK_CONFIG_PAGE:
6768    case AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE:
6769    case AGSA_INTERRUPT_CONFIGURATION_PAGE:
6770    case AGSA_ENCRYPTION_HMAC_CONFIG_PAGE:
6771    case AGSA_IO_GENERAL_CONFIG_PAGE:
6772    /*case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:*/
6773      /* Report the event before freeing the IOMB */
6774      SA_DBG1(("mpiSetControllerConfigRsp:OSSA_HW_EVENT_MODE\n"));
6775      ossaHwCB(agRoot,agMode.context, OSSA_HW_EVENT_MODE, errorQualifierPage, (void *) &agMode, 0);
6776
6777
6778      break;
6779
6780    case AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE:
6781      SA_DBG1(("mpiSetControllerConfigRsp:warning!!!! GENERAL_CONFIG_PAGE is read only, cannot be set\n"));
6782      break;
6783
6784    /* why we need to read the scrach pad register when handling ENCRYPTION_SECURITY_PARM_PAGE??? */
6785    case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:
6786    {
6787      bit32 ScratchPad1 = 0;
6788      bit32 ScratchPad3 = 0;
6789      agsaEncryptInfo_t encrypt;
6790      agsaEncryptInfo_t *encryptInfo = &encrypt;
6791      SA_DBG1(("mpiSetControllerConfigRsp: AGSA_ENCRYPTION_CONTROL_PARM_PAGE\n" ));
6792
6793      if( pRequest->modePageContext)
6794      {
6795        pRequest->modePageContext = agFALSE;
6796      }
6797
6798      si_memset(&encrypt, 0, sizeof(agsaEncryptInfo_t));
6799      encryptInfo->status = 0;
6800      encryptInfo->encryptionCipherMode = 0;
6801      encryptInfo->encryptionSecurityMode = 0;
6802
6803      ScratchPad1 = ossaHwRegRead(agRoot,V_Scratchpad_1_Register);
6804      ScratchPad3 = ossaHwRegRead(agRoot,V_Scratchpad_3_Register);
6805      if( ScratchPad3 & SCRATCH_PAD3_V_XTS_ENABLED)
6806      {
6807        encryptInfo->encryptionCipherMode = agsaEncryptCipherModeXTS;
6808      }
6809      if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMF_ENABLED )
6810      {
6811        encryptInfo->encryptionSecurityMode = agsaEncryptSMF;
6812      }
6813      if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMA_ENABLED)
6814      {
6815        encryptInfo->encryptionSecurityMode = agsaEncryptSMA;
6816      }
6817      if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMB_ENABLED )
6818      {
6819        encryptInfo->encryptionSecurityMode = agsaEncryptSMB;
6820      }
6821      if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) ==  SCRATCH_PAD1_V_RAAE_MASK)
6822      {
6823        if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK) == SCRATCH_PAD3_V_ENC_READY ) /* 3 */
6824        {
6825          encryptInfo->status = AGSA_RC_SUCCESS;
6826        }
6827        else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_READY) == SCRATCH_PAD3_V_ENC_DISABLED) /* 0 */
6828        {
6829          encryptInfo->status = 0xFFFF;
6830          encryptInfo->encryptionCipherMode = 0;
6831          encryptInfo->encryptionSecurityMode = 0;
6832        }
6833        else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_DIS_ERR) /* 1 */
6834        {
6835          encryptInfo->status = (ScratchPad3 & SCRATCH_PAD3_V_ERR_CODE ) >> SHIFT16;
6836        }
6837        else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_ENA_ERR) /* 2 */
6838        {
6839          encryptInfo->status = (ScratchPad3 & SCRATCH_PAD3_V_ERR_CODE ) >> SHIFT16;
6840        }
6841      }
6842      else  if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) ==  SCRATCH_PAD1_V_RAAE_ERR)
6843      {
6844        SA_DBG1(("mpiSetControllerConfigRsp, RAAE not ready SPC AGSA_RC_FAILURE\n"));
6845        encryptInfo->status = 0xFFFF;
6846        encryptInfo->encryptionCipherMode = 0;
6847        encryptInfo->encryptionSecurityMode = 0;
6848      }
6849      else  if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) == 0x0 )
6850      {
6851        SA_DBG2(("mpiSetControllerConfigRsp, RAAE not ready AGSA_RC_BUSY\n"));
6852      }
6853
6854      SA_DBG2(("mpiSetControllerConfigRsp, encryptionCipherMode 0x%x encryptionSecurityMode 0x%x status 0x%x\n",
6855                encryptInfo->encryptionCipherMode,
6856                encryptInfo->encryptionSecurityMode,
6857                encryptInfo->status));
6858      SA_DBG2(("mpiSetControllerConfigRsp, ScratchPad3 0x%x\n",ScratchPad3));
6859      SA_DBG1(("mpiSetControllerConfigRsp:AGSA_ENCRYPTION_CONTROL_PARM_PAGE 0x%X\n", agMode.modePageOperation));
6860      ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_SECURITY_MODE, errorQualifier, (void *)encryptInfo, agMode.context);
6861      break;
6862    }
6863
6864    default:
6865      SA_DBG1(("mpiSetControllerConfigRsp: Unknown page code 0x%X\n", pagetype));
6866      break;
6867  }
6868
6869  /* remove the request from IOMap */
6870  saRoot->IOMap[tag].Tag = MARK_OFF;
6871  saRoot->IOMap[tag].IORequest = agNULL;
6872  saRoot->IOMap[tag].agContext = agNULL;
6873
6874  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6875  SA_ASSERT((pRequest->valid), "pRequest->valid");
6876  pRequest->valid = agFALSE;
6877  /* return the request to free pool */
6878  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6879  {
6880    SA_DBG1(("mpiSetControllerRsp: saving pRequest (%p) for later use\n", pRequest));
6881    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6882  }
6883  else
6884  {
6885    /* return the request to free pool */
6886    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6887  }
6888  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6889
6890  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3a");
6891  return AGSA_RC_SUCCESS;
6892
6893}
6894
6895/******************************************************************************/
6896/*! \brief SAS Get Controller Config Response
6897 *
6898 *  This routine handles the response of Get Controller Config Command
6899 *
6900 *  \param agRoot       Handles for this instance of SAS/SATA LLL
6901 *  \param pIomb        Pointer of IOMB Mesage
6902 *
6903 *  \return sucess or fail
6904 *
6905 */
6906/*******************************************************************************/
6907GLOBAL bit32 mpiGetControllerConfigRsp(
6908  agsaRoot_t               *agRoot,
6909  agsaGetControllerConfigRsp_t *pIomb
6910  )
6911{
6912  agsaLLRoot_t          *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6913  agsaIORequestDesc_t   *pRequest;
6914  agsaHWEventMode_t     agMode;
6915  bit32                 status, errorQualifier, tag;
6916  bit32                 configPage[12];
6917
6918  smTraceFuncEnter(hpDBG_VERY_LOUD,"3b");
6919
6920  si_memset(&agMode, 0, sizeof(agsaHWEventMode_t));
6921  si_memset(configPage, 0, sizeof(configPage));
6922
6923
6924  SA_DBG2(("mpiGetControllerConfigRsp: HTag=0x%x\n", pIomb->tag));
6925
6926  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t, tag));
6927  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t, status));
6928  OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t, errorQualifier));
6929  OSSA_READ_LE_32(AGROOT, &configPage[0],  pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[0] ));
6930  OSSA_READ_LE_32(AGROOT, &configPage[1],  pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[1] ));
6931  OSSA_READ_LE_32(AGROOT, &configPage[2],  pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[2] ));
6932  OSSA_READ_LE_32(AGROOT, &configPage[3],  pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[3] ));
6933  OSSA_READ_LE_32(AGROOT, &configPage[4],  pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[4] ));
6934  OSSA_READ_LE_32(AGROOT, &configPage[5],  pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[5] ));
6935
6936  /* get request from IOMap */
6937  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6938  if (agNULL == pRequest)
6939  {
6940    SA_DBG1(("mpiGetControllerConfigRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6941    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3b");
6942    return AGSA_RC_FAILURE;
6943  }
6944
6945  si_memset(&agMode, 0, sizeof(agsaHWEventMode_t));
6946  agMode.modePageOperation = agsaModePageGet;
6947  agMode.status = status;
6948
6949  SA_DBG1(("mpiGetControllerConfigRsp: page 0x%x status 0x%x errorQualifier 0x%x \n", (pIomb->configPage[0] & 0xFF),status, errorQualifier));
6950
6951  switch (pIomb->configPage[0] & 0xFF)
6952  {
6953  case AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE:
6954      agMode.modePageLen = sizeof(agsaSASProtocolTimerConfigurationPage_t);
6955      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6956      break;
6957  case AGSA_INTERRUPT_CONFIGURATION_PAGE:
6958      agMode.modePageLen = sizeof(agsaInterruptConfigPage_t);
6959      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_INTERRUPT_CONFIGURATION_PAGE page len 0x%x \n",agMode.modePageLen));
6960      break;
6961  case AGSA_IO_GENERAL_CONFIG_PAGE:
6962      agMode.modePageLen = sizeof(agsaIoGeneralPage_t);
6963      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_IO_GENERAL_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6964      break;
6965  case AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE:
6966      agMode.modePageLen = sizeof(agsaEncryptGeneralPage_t);
6967      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6968#ifdef HIALEAH_ENCRYPTION
6969      saRoot->EncGenPage.numberOfKeksPageCode = configPage[0];
6970      saRoot->EncGenPage.KeyCardIdKekIndex    = configPage[1];
6971      saRoot->EncGenPage.KeyCardId3_0         = configPage[2];
6972      saRoot->EncGenPage.KeyCardId7_4         = configPage[3];
6973      saRoot->EncGenPage.KeyCardId11_8        = configPage[4];
6974
6975      SA_DBG1(("mpiGetControllerConfigRsp: numberOfKeksPageCode 0x%x\n",saRoot->EncGenPage.numberOfKeksPageCode));
6976      SA_DBG1(("mpiGetControllerConfigRsp: KeyCardIdKekIndex    0x%x\n",saRoot->EncGenPage.KeyCardIdKekIndex));
6977      SA_DBG1(("mpiGetControllerConfigRsp: KeyCardId3_0         0x%x\n",saRoot->EncGenPage.KeyCardId3_0));
6978      SA_DBG1(("mpiGetControllerConfigRsp: KeyCardId7_4         0x%x\n",saRoot->EncGenPage.KeyCardId7_4));
6979      SA_DBG1(("mpiGetControllerConfigRsp: KeyCardId11_8        0x%x\n",saRoot->EncGenPage.KeyCardId11_8));
6980#endif /* HIALEAH_ENCRYPTION */
6981
6982      break;
6983  case AGSA_ENCRYPTION_DEK_CONFIG_PAGE:
6984      agMode.modePageLen = sizeof(agsaEncryptDekConfigPage_t);
6985      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_DEK_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6986      break;
6987  case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:
6988      agMode.modePageLen = sizeof(agsaEncryptControlParamPage_t);
6989      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_CONTROL_PARM_PAGE page len 0x%x \n",agMode.modePageLen));
6990      break;
6991  case AGSA_ENCRYPTION_HMAC_CONFIG_PAGE:
6992      agMode.modePageLen = sizeof(agsaEncryptHMACConfigPage_t);
6993      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_HMAC_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6994      break;
6995  default:
6996      agMode.modePageLen = 0;
6997      SA_DBG1(("mpiGetControllerConfigRsp: Unknown !!! page len 0x%x \n",agMode.modePageLen));
6998      break;
6999  }
7000
7001  agMode.modePage = (void *) &pIomb->configPage[0];
7002  agMode.context = saRoot->IOMap[tag].agContext;
7003
7004  /* Report the event before freeing the IOMB */
7005  ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_MODE, errorQualifier, (void *) &agMode, 0);
7006
7007  /* remove the request from IOMap */
7008  saRoot->IOMap[tag].Tag = MARK_OFF;
7009  saRoot->IOMap[tag].IORequest = agNULL;
7010  saRoot->IOMap[tag].agContext = agNULL;
7011
7012  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7013  SA_ASSERT((pRequest->valid), "pRequest->valid");
7014  pRequest->valid = agFALSE;
7015  /* return the request to free pool */
7016  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7017  {
7018    SA_DBG1(("mpiGetControllerRsp: saving pRequest (%p) for later use\n", pRequest));
7019    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7020  }
7021  else
7022  {
7023    /* return the request to free pool */
7024    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7025  }
7026  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7027
7028  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3b");
7029  return AGSA_RC_SUCCESS;
7030}
7031
7032/******************************************************************************/
7033/*! \brief KEK Management Response
7034 *
7035 *  This routine handles the response of the KEK management message
7036 *
7037 *  \param agRoot       Handles for this instance of SAS/SATA LLL
7038 *  \param pIomb        Pointer of IOMB Mesage
7039 *
7040 *  \return sucess or fail
7041 *
7042 */
7043/*******************************************************************************/
7044GLOBAL bit32 mpiKekManagementRsp(
7045  agsaRoot_t               *agRoot,
7046  agsaKekManagementRsp_t *pIomb
7047  )
7048{
7049  agsaLLRoot_t          *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7050  agsaIORequestDesc_t   *pRequest;
7051  agsaContext_t         *agContext;
7052  agsaHWEventEncrypt_t  agEvent;
7053  bit32                 status, errorQualifier, tag, flags;
7054  smTraceFuncEnter(hpDBG_VERY_LOUD,"2A");
7055
7056  SA_DBG1(("mpiKekManagementRsp: HTag=0x%x\n", pIomb->tag));
7057
7058  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, tag));
7059  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, status));
7060  OSSA_READ_LE_32(AGROOT, &flags, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, flags));
7061  OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, errorQualifier));
7062
7063
7064  SA_DBG1(("mpiKekManagementRsp:status 0x%x flags 0x%x errorQualifier 0x%x\n", status, flags, errorQualifier));
7065
7066  si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
7067  if ((flags & 0xFF) == KEK_MGMT_SUBOP_UPDATE)
7068  {
7069    SA_DBG1(("mpiKekManagementRsp:KEK_MGMT_SUBOP_UPDATE 0x%x \n", status));
7070    if (flags & 0xFF00) /* update and store*/
7071    {
7072      agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE;
7073    }
7074    else /* update */
7075    {
7076      agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE;
7077    }
7078    agEvent.status = status;
7079    if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
7080    {
7081        agEvent.eq = errorQualifier;
7082    }
7083    agEvent.info = 0;
7084    /* Store the new KEK index in agEvent.handle */
7085    agEvent.handle = (void *) ((bitptr) (flags >> 24));
7086    /* Store the current KEK index in agEvent.param */
7087    agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
7088
7089  }
7090
7091  else if ((flags & 0xFF) == KEK_MGMT_SUBOP_INVALIDATE)
7092  {
7093      agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_INVALIDTE;
7094      agEvent.status = status;
7095      if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
7096      {
7097          agEvent.eq = errorQualifier;
7098      }
7099      agEvent.info = 0;
7100      /* Store the new KEK index in agEvent.handle */
7101      agEvent.handle = (void *) ((bitptr) (flags >> 24));
7102      /* Store the current KEK index in agEvent.param */
7103      agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
7104  }
7105
7106  else if ((flags & 0xFF) == KEK_MGMT_SUBOP_KEYCARDINVALIDATE)
7107  {
7108     agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE;
7109      agEvent.status = status;
7110      if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
7111      {
7112          agEvent.eq = errorQualifier;
7113      }
7114      agEvent.info = 0;
7115      /* Store the new KEK index in agEvent.handle */
7116      agEvent.handle = (void *) ((bitptr) (flags >> 24));
7117      /* Store the current KEK index in agEvent.param */
7118      agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
7119
7120  }
7121
7122  else if ((flags & 0xFF) == KEK_MGMT_SUBOP_KEYCARDUPDATE)
7123  {
7124     agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE;
7125      agEvent.status = status;
7126      if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
7127      {
7128          agEvent.eq = errorQualifier;
7129      }
7130      agEvent.info = 0;
7131      /* Store the new KEK index in agEvent.handle */
7132      agEvent.handle = (void *) ((bitptr) (flags >> 24));
7133      /* Store the current KEK index in agEvent.param */
7134      agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
7135
7136  }
7137  /* get request from IOMap */
7138  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7139  if (agNULL == pRequest)
7140  {
7141    SA_DBG1(("mpiKekManagementRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7142    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2A");
7143    return AGSA_RC_FAILURE;
7144  }
7145
7146  agContext = saRoot->IOMap[tag].agContext;
7147  /* remove the request from IOMap */
7148  saRoot->IOMap[tag].Tag = MARK_OFF;
7149  saRoot->IOMap[tag].IORequest = agNULL;
7150  saRoot->IOMap[tag].agContext = agNULL;
7151
7152  ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void *) &agEvent, agContext);
7153
7154  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7155  SA_ASSERT((pRequest->valid), "pRequest->valid");
7156  pRequest->valid = agFALSE;
7157  /* return the request to free pool */
7158  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7159  {
7160    SA_DBG1(("mpiKekManagementRsp: saving pRequest (%p) for later use\n", pRequest));
7161    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7162  }
7163  else
7164  {
7165    /* return the request to free pool */
7166    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7167  }
7168  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7169
7170  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2A");
7171
7172  return AGSA_RC_SUCCESS;
7173}
7174
7175/******************************************************************************/
7176/*! \brief DEK Management Response
7177 *
7178 *  This routine handles the response of the DEK management message
7179 *
7180 *  \param agRoot       Handles for this instance of SAS/SATA LLL
7181 *  \param pIomb        Pointer of IOMB Mesage
7182 *
7183 *  \return sucess or fail
7184 *
7185 */
7186/*******************************************************************************/
7187GLOBAL bit32 mpiDekManagementRsp(
7188  agsaRoot_t               *agRoot,
7189  agsaDekManagementRsp_t   *pIomb
7190  )
7191{
7192  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7193  agsaIORequestDesc_t *pRequest;
7194  agsaContext_t       *agContext;
7195  agsaHWEventEncrypt_t agEvent;
7196  bit32               flags, status, errorQualifier, tag, dekIndex;
7197
7198  smTraceFuncEnter(hpDBG_VERY_LOUD,"2B");
7199
7200  SA_DBG1(("mpiDekManagementRsp: HTag=0x%x\n", pIomb->tag));
7201
7202  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, tag));
7203  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, status));
7204  OSSA_READ_LE_32(AGROOT, &flags, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, flags));
7205  OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, errorQualifier));
7206  OSSA_READ_LE_32(AGROOT, &dekIndex, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, dekIndex));
7207
7208  SA_DBG2(("mpiDekManagementRsp:tag =0x%x\n",tag ));
7209  SA_DBG2(("mpiDekManagementRsp:status =0x%x\n", status));
7210  SA_DBG2(("mpiDekManagementRsp:flags =0x%x\n",flags ));
7211  SA_DBG2(("mpiDekManagementRsp:errorQualifier =0x%x\n", errorQualifier));
7212  SA_DBG2(("mpiDekManagementRsp:dekIndex =0x%x\n",dekIndex ));
7213
7214  si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
7215  if ((flags & 0xFF) == DEK_MGMT_SUBOP_UPDATE)
7216  {
7217     agEvent.encryptOperation = OSSA_HW_ENCRYPT_DEK_UPDATE;
7218  }
7219  else
7220  {
7221     agEvent.encryptOperation = OSSA_HW_ENCRYPT_DEK_INVALIDTE;
7222  }
7223  agEvent.status = status;
7224  if (status == OSSA_MPI_ENC_ERR_ILLEGAL_DEK_PARAM || OSSA_MPI_ERR_DEK_MANAGEMENT_DEK_UNWRAP_FAIL)
7225  {
7226    agEvent.eq = errorQualifier;
7227  }
7228  /* Store the DEK in agEvent.info */
7229  agEvent.info = (flags >> 8) & 0xF;
7230  /* Store the KEK index in agEvent.handle */
7231  agEvent.handle = (void *) ((bitptr) (flags >> 24));
7232  /* Store the DEK index in agEvent.param */
7233  agEvent.param = (void *) (bitptr) dekIndex;
7234
7235  /* get request from IOMap */
7236  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7237  if (agNULL == pRequest)
7238  {
7239    SA_DBG1(("mpiDekManagementRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7240    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2B");
7241    return AGSA_RC_FAILURE;
7242  }
7243
7244  agContext = saRoot->IOMap[tag].agContext;
7245  /* remove the request from IOMap */
7246  saRoot->IOMap[tag].Tag = MARK_OFF;
7247  saRoot->IOMap[tag].IORequest = agNULL;
7248  saRoot->IOMap[tag].agContext = agNULL;
7249
7250  ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void *) &agEvent,agContext );
7251
7252  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7253  SA_ASSERT((pRequest->valid), "pRequest->valid");
7254  pRequest->valid = agFALSE;
7255  /* return the request to free pool */
7256  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7257  {
7258    SA_DBG1(("mpiDekManagementRsp: saving pRequest (%p) for later use\n", pRequest));
7259    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7260  }
7261  else
7262  {
7263    /* return the request to free pool */
7264    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7265  }
7266
7267  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7268
7269  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2B");
7270
7271  return AGSA_RC_SUCCESS;
7272}
7273
7274/******************************************************************************/
7275/*! \brief Operator Management Response
7276 *
7277 *  This routine handles the response of the Operator management message
7278 *
7279 *  \param agRoot       Handles for this instance of SAS/SATA LLL
7280 *  \param pIomb        Pointer of IOMB Mesage
7281 *
7282 *  \return sucess or fail
7283 *
7284 */
7285/*******************************************************************************/
7286GLOBAL bit32 mpiOperatorManagementRsp(
7287  agsaRoot_t                *agRoot,
7288  agsaOperatorMangmenRsp_t  *pIomb
7289  )
7290{
7291  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7292  agsaIORequestDesc_t *pRequest;
7293  agsaContext_t       *agContext;
7294  agsaHWEventEncrypt_t agEvent;
7295  bit32               OPRIDX_AUTIDX_R_OMO,status, errorQualifier, tag;
7296
7297  smTraceFuncEnter(hpDBG_VERY_LOUD,"36");
7298
7299  SA_DBG1(("mpiOperatorManagementRsp: HTag=0x%x\n", pIomb->tag));
7300
7301  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, tag));
7302  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, status));
7303  OSSA_READ_LE_32(AGROOT, &OPRIDX_AUTIDX_R_OMO, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, OPRIDX_AUTIDX_R_OMO));
7304  OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, errorQualifier));
7305
7306  SA_DBG2(("mpiOperatorManagementRsp:tag =0x%x\n",tag ));
7307  SA_DBG2(("mpiOperatorManagementRsp:status =0x%x\n", status));
7308  SA_DBG2(("mpiOperatorManagementRsp:OPRIDX_AUTIDX_R_OMO =0x%x\n",OPRIDX_AUTIDX_R_OMO ));
7309  SA_DBG2(("mpiOperatorManagementRsp:errorQualifier =0x%x\n", errorQualifier));
7310
7311  /* get request from IOMap */
7312  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7313  if (agNULL == pRequest)
7314  {
7315    SA_DBG1(("mpiOperatorManagementRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7316    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "36");
7317    return AGSA_RC_FAILURE;
7318  }
7319
7320  agContext = saRoot->IOMap[tag].agContext;
7321  /* remove the request from IOMap */
7322  saRoot->IOMap[tag].Tag = MARK_OFF;
7323  saRoot->IOMap[tag].IORequest = agNULL;
7324  saRoot->IOMap[tag].agContext = agNULL;
7325
7326  si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
7327  agEvent.status = status;
7328  agEvent.info = OPRIDX_AUTIDX_R_OMO;
7329  agEvent.encryptOperation = OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT;
7330  if (status == OPR_MGMT_MPI_ENC_ERR_OPR_PARAM_ILLEGAL)
7331  {
7332    agEvent.eq = errorQualifier;
7333  }
7334
7335  ossaOperatorManagementCB(agRoot, agContext, status, errorQualifier);
7336
7337  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7338  SA_ASSERT((pRequest->valid), "pRequest->valid");
7339  pRequest->valid = agFALSE;
7340  /* return the request to free pool */
7341  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7342  {
7343    SA_DBG1(("mpiOperatorManagementRsp: saving pRequest (%p) for later use\n", pRequest));
7344    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7345  }
7346  else
7347  {
7348    /* return the request to free pool */
7349    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7350  }
7351
7352  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7353
7354  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "36");
7355
7356  return AGSA_RC_SUCCESS;
7357}
7358
7359GLOBAL bit32 mpiBistRsp(
7360  agsaRoot_t               *agRoot,
7361  agsaEncryptBistRsp_t     *pIomb
7362  )
7363{
7364  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7365  agsaIORequestDesc_t *pRequest;
7366  agsaContext_t       *agContext;
7367  agsaHWEventEncrypt_t agEvent;
7368  bit32               status;
7369  bit32               results[11];
7370  bit32               length;
7371  bit32               subop;
7372  bit32               tag;
7373
7374  smTraceFuncEnter(hpDBG_VERY_LOUD,"37");
7375
7376  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, tag));
7377  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, status));
7378  OSSA_READ_LE_32(AGROOT, &subop, pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, subop));
7379  OSSA_READ_LE_32(AGROOT, &results[0], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[0]));
7380  OSSA_READ_LE_32(AGROOT, &results[1], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[1]));
7381  OSSA_READ_LE_32(AGROOT, &results[2], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[2]));
7382  OSSA_READ_LE_32(AGROOT, &results[3], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[3]));
7383  OSSA_READ_LE_32(AGROOT, &results[4], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[4]));
7384  OSSA_READ_LE_32(AGROOT, &results[5], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[5]));
7385  OSSA_READ_LE_32(AGROOT, &results[6], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[6]));
7386  OSSA_READ_LE_32(AGROOT, &results[7], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[7]));
7387  OSSA_READ_LE_32(AGROOT, &results[8], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[8]));
7388  OSSA_READ_LE_32(AGROOT, &results[9], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[9]));
7389  OSSA_READ_LE_32(AGROOT, &results[10], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[10]));
7390
7391  subop &= 0xFF;
7392  SA_DBG1(("mpiBistRsp: HTag=0x%x subops =0x%x status =0x%x\n",pIomb->tag, subop, status));
7393
7394  switch(subop)
7395  {
7396    case AGSA_BIST_TEST:
7397      length =  sizeof(agsaEncryptSelfTestStatusBitMap_t);
7398      break;
7399    case AGSA_SHA_TEST:
7400      length = sizeof(agsaEncryptSHATestResult_t);
7401      break;
7402    case AGSA_HMAC_TEST:
7403      length = sizeof(agsaEncryptHMACTestResult_t);
7404      break;
7405    default:
7406      length = 0;
7407      break;
7408  }
7409
7410  si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
7411  agEvent.status = status;
7412  agEvent.encryptOperation = OSSA_HW_ENCRYPT_TEST_EXECUTE;
7413  agEvent.info = length;
7414  agEvent.eq   = subop;
7415  agEvent.handle = agNULL;
7416  agEvent.param = &results;
7417
7418  /* get request from IOMap */
7419  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7420  if (agNULL == pRequest)
7421  {
7422    SA_DBG1(("mpiBistRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7423    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "37");
7424    return AGSA_RC_FAILURE;
7425  }
7426
7427  agContext = saRoot->IOMap[tag].agContext;
7428
7429  ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void*)&agEvent, agContext);
7430
7431  /* remove the request from IOMap */
7432  saRoot->IOMap[tag].Tag = MARK_OFF;
7433  saRoot->IOMap[tag].IORequest = agNULL;
7434  saRoot->IOMap[tag].agContext = agNULL;
7435
7436  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7437  SA_ASSERT((pRequest->valid), "pRequest->valid");
7438  pRequest->valid = agFALSE;
7439  /* return the request to free pool */
7440  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7441  {
7442    SA_DBG1(("mpiBistRsp: saving pRequest (%p) for later use\n", pRequest));
7443    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7444  }
7445  else
7446  {
7447    /* return the request to free pool */
7448    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7449  }
7450
7451  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7452
7453  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "37");
7454
7455  return AGSA_RC_SUCCESS;
7456}
7457
7458/******************************************************************************/
7459/*! \brief Set Operator Response
7460 *
7461 *  This routine handles the response of the Operator management message
7462 *
7463 *  \param agRoot       Handles for this instance of SAS/SATA LLL
7464 *  \param pIomb        Pointer of IOMB Mesage
7465 *
7466 *  \return sucess or fail
7467 *
7468 */
7469/*******************************************************************************/
7470GLOBAL bit32 mpiSetOperatorRsp(
7471  agsaRoot_t               *agRoot,
7472  agsaSetOperatorRsp_t     *pIomb
7473  )
7474{
7475  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7476  agsaIORequestDesc_t *pRequest = agNULL;
7477  agsaContext_t       *agContext = agNULL;
7478  bit32               ERR_QLFR_OPRIDX_PIN_ACS, OPRIDX_PIN_ACS, status, errorQualifier, tag = 0;
7479
7480  smTraceFuncEnter(hpDBG_VERY_LOUD,"38");
7481
7482  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetOperatorRsp_t, tag));
7483  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetOperatorRsp_t, status));
7484  OSSA_READ_LE_32(AGROOT, &ERR_QLFR_OPRIDX_PIN_ACS, pIomb, OSSA_OFFSET_OF(agsaSetOperatorRsp_t, ERR_QLFR_OPRIDX_PIN_ACS));
7485
7486  errorQualifier = ERR_QLFR_OPRIDX_PIN_ACS >> 16;
7487  OPRIDX_PIN_ACS = ERR_QLFR_OPRIDX_PIN_ACS & 0xFFFF;
7488
7489  SA_DBG1(("mpiSetOperatorRsp: HTag=0x%x ERR_QLFR=0x%x OPRIDX_PIN_ACS=0x%x \n",tag, errorQualifier, OPRIDX_PIN_ACS));
7490
7491  /* get request from IOMap */
7492  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7493  if (agNULL == pRequest)
7494  {
7495    SA_DBG1(("mpiSetOperatorRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7496    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "38");
7497    return AGSA_RC_FAILURE;
7498  }
7499
7500  agContext = saRoot->IOMap[tag].agContext;
7501  /* remove the request from IOMap */
7502  saRoot->IOMap[tag].Tag = MARK_OFF;
7503  saRoot->IOMap[tag].IORequest = agNULL;
7504  saRoot->IOMap[tag].agContext = agNULL;
7505
7506
7507  ossaSetOperatorCB(agRoot,agContext,status,errorQualifier );
7508
7509  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7510  SA_ASSERT((pRequest->valid), "pRequest->valid");
7511  pRequest->valid = agFALSE;
7512  /* return the request to free pool */
7513  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7514  {
7515    SA_DBG1(("mpiSetOperatorRsp: saving pRequest (%p) for later use\n", pRequest));
7516    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7517  }
7518  else
7519  {
7520    /* return the request to free pool */
7521    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7522  }
7523
7524  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7525
7526  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "38");
7527
7528  return AGSA_RC_SUCCESS;
7529}
7530
7531/******************************************************************************/
7532/*! \brief Get Operator Response
7533 *
7534 *  This routine handles the response of the Operator management message
7535 *
7536 *  \param agRoot       Handles for this instance of SAS/SATA LLL
7537 *  \param pIomb        Pointer of IOMB Mesage
7538 *
7539 *  \return sucess or fail
7540 *
7541 */
7542/*******************************************************************************/
7543GLOBAL bit32 mpiGetOperatorRsp(
7544  agsaRoot_t               *agRoot,
7545  agsaGetOperatorRsp_t     *pIomb
7546  )
7547{
7548  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7549  agsaIORequestDesc_t *pRequest;
7550  agsaContext_t       *agContext;
7551  bit32                Num_Option, NumOperators ,status, tag;
7552  bit8                 option, Role = 0;
7553  bit32                IDstr[8];
7554  bit8                *tmpIDstr = agNULL;
7555  agsaID_t            *IDString = agNULL;
7556
7557  smTraceFuncEnter(hpDBG_VERY_LOUD,"3f");
7558
7559  si_memset(&IDstr, 0, sizeof(IDstr));
7560  OSSA_READ_LE_32(AGROOT, &tag,         pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, tag));
7561  OSSA_READ_LE_32(AGROOT, &status,      pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, status));
7562  OSSA_READ_LE_32(AGROOT, &Num_Option,  pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, Num_Option));
7563  OSSA_READ_LE_32(AGROOT, &IDstr[0],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[0]));
7564  OSSA_READ_LE_32(AGROOT, &IDstr[1],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[1]));
7565  OSSA_READ_LE_32(AGROOT, &IDstr[2],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[2]));
7566  OSSA_READ_LE_32(AGROOT, &IDstr[3],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[3]));
7567  OSSA_READ_LE_32(AGROOT, &IDstr[4],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[4]));
7568  OSSA_READ_LE_32(AGROOT, &IDstr[5],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[5]));
7569  OSSA_READ_LE_32(AGROOT, &IDstr[6],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[6]));
7570  OSSA_READ_LE_32(AGROOT, &IDstr[7],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[7]));
7571
7572  SA_DBG1(("mpiGetOperatorRsp:tag=0x%x status=0x%x Num_Option=0x%x IDString_Role=0x%x\n",
7573           tag, status, Num_Option, IDstr[0]));
7574
7575  /* get request from IOMap */
7576  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7577  if (agNULL == pRequest)
7578  {
7579    SA_DBG1(("mpiGetOperatorRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7580    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3f");
7581    return AGSA_RC_FAILURE;
7582  }
7583
7584  agContext = saRoot->IOMap[tag].agContext;
7585  /* remove the request from IOMap */
7586  saRoot->IOMap[tag].Tag = MARK_OFF;
7587  saRoot->IOMap[tag].IORequest = agNULL;
7588  saRoot->IOMap[tag].agContext = agNULL;
7589  option = Num_Option & 0xFF;
7590  NumOperators = (Num_Option >> SHIFT8) & 0xFF;
7591  /* current operator's Role/ID, valid only if option == 1 */
7592  if ( option == 1)
7593  {
7594    /* extra the role value as parameter */
7595    Role = IDstr[0] & 0xFF;
7596    tmpIDstr = (bit8*)&IDstr[0];
7597    tmpIDstr++; /* skip role byte */
7598    IDString = (agsaID_t *)tmpIDstr;
7599    SA_DBG1(("mpiGetOperatorRsp: OSSA_IO_SUCCESS\n"));
7600    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[0], IDString->ID[1], IDString->ID[2], IDString->ID[3]));
7601    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[4], IDString->ID[5], IDString->ID[6], IDString->ID[7]));
7602    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[8], IDString->ID[9], IDString->ID[10],IDString->ID[11]));
7603    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[12],IDString->ID[13],IDString->ID[14],IDString->ID[15]));
7604    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[16],IDString->ID[17],IDString->ID[18],IDString->ID[19]));
7605    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[20],IDString->ID[21],IDString->ID[22],IDString->ID[23]));
7606    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[24],IDString->ID[25],IDString->ID[26],IDString->ID[27]));
7607    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x\n",       IDString->ID[28],IDString->ID[29],IDString->ID[30]));
7608  }
7609
7610  SA_DBG1(("mpiGetOperatorRsp:status 0x%x option 0x%x Role 0x%x\n",status,option,Role ));
7611
7612  ossaGetOperatorCB(agRoot,agContext,status,option,NumOperators ,Role,IDString );
7613
7614  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7615  SA_ASSERT((pRequest->valid), "pRequest->valid");
7616  pRequest->valid = agFALSE;
7617  /* return the request to free pool */
7618  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7619  {
7620    SA_DBG1(("mpiGetOperatorRsp: saving pRequest (%p) for later use\n", pRequest));
7621    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7622  }
7623  else
7624  {
7625    /* return the request to free pool */
7626    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7627  }
7628
7629  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7630
7631  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3f");
7632
7633  return AGSA_RC_SUCCESS;
7634}
7635
7636
7637GLOBAL bit32 mpiGetVHistRsp(
7638   agsaRoot_t         *agRoot,
7639   agsaGetVHistCapRsp_t *pIomb
7640  )
7641{
7642
7643  bit32               ret = AGSA_RC_SUCCESS;
7644  agsaLLRoot_t        *saRoot = agNULL;
7645  agsaIORequestDesc_t *pRequest;
7646  agsaContext_t       *agContext;
7647
7648  bit32    tag = 0;           /* 1 */
7649  bit32    status = 0;        /* 2 */
7650  bit32    channel;          /* 3 */
7651  bit32    BistLo;           /* 4 */
7652  bit32    BistHi;           /* 5 */
7653  bit32    BytesXfered = 0;  /* 6 */
7654  bit32    PciLo;            /* 7 */
7655  bit32    PciHi;            /* 8 */
7656  bit32    PciBytecount = 0;  /* 9 */
7657
7658  smTraceFuncEnter(hpDBG_VERY_LOUD,"3K");
7659
7660  /* sanity check */
7661  SA_ASSERT((agNULL != agRoot), "");
7662  saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
7663  SA_ASSERT((agNULL != saRoot), "");
7664
7665  if(smIS_SPC12V(agRoot))
7666  {
7667    OSSA_READ_LE_32(AGROOT, &tag,          pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,tag));
7668    OSSA_READ_LE_32(AGROOT, &status,       pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,status));
7669    OSSA_READ_LE_32(AGROOT, &channel,      pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,channel));
7670    OSSA_READ_LE_32(AGROOT, &BistLo,       pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,BistLo));
7671    OSSA_READ_LE_32(AGROOT, &BistHi,       pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,BistHi));
7672    OSSA_READ_LE_32(AGROOT, &BytesXfered,  pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,BytesXfered));
7673    OSSA_READ_LE_32(AGROOT, &PciLo,        pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,PciLo));
7674    OSSA_READ_LE_32(AGROOT, &PciHi,        pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,PciHi));
7675    OSSA_READ_LE_32(AGROOT, &PciBytecount, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,PciBytecount));
7676  }
7677  else
7678  {
7679    /* SPC does not support this command */
7680    SA_DBG1(("mpiGetVHistRsp: smIS_SPC12V only\n"));
7681    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3K");
7682    return AGSA_RC_FAILURE;
7683  }
7684
7685  SA_DBG3(("mpiGetVHistRsp: HTag=0x%x\n", tag));
7686
7687  /* get request from IOMap */
7688  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7689  if (agNULL == pRequest)
7690  {
7691    SA_DBG1(("mpiGetVHistRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7692    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3K");
7693    return AGSA_RC_FAILURE;
7694  }
7695
7696  agContext = saRoot->IOMap[tag].agContext;
7697
7698  /* remove the request from IOMap */
7699  saRoot->IOMap[tag].Tag = MARK_OFF;
7700  saRoot->IOMap[tag].IORequest = agNULL;
7701  saRoot->IOMap[tag].agContext = agNULL;
7702
7703  SA_ASSERT((pRequest->valid), "pRequest->valid");
7704
7705  /* check status success or failure */
7706  if (status)
7707  {
7708    SA_DBG1(("mpiGetVHistRsp: status is FAILED, status = %x\n", status ));
7709
7710    if (pRequest->completionCB == agNULL)
7711    {
7712      ossaVhistCaptureCB(agRoot, agContext, status, BytesXfered);
7713    }
7714    else
7715    {
7716      (*(ossaVhistCaptureCB_t)(pRequest->completionCB))(agRoot, agContext, status, BytesXfered);
7717    }
7718
7719    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7720    pRequest->valid = agFALSE;
7721    /* return the request to free pool */
7722    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7723    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7724
7725    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3K");
7726    return AGSA_RC_FAILURE;
7727  }
7728
7729  /* status is SUCCESS */
7730  SA_DBG1(("mpiGetVHistRsp: status is SUCCESS\n" ));
7731
7732  if (pRequest->completionCB == agNULL)
7733  {
7734    ossaVhistCaptureCB(agRoot, agContext, status, BytesXfered);
7735  }
7736  else
7737  {
7738    (*(ossaVhistCaptureCB_t)(pRequest->completionCB))(agRoot, agContext, status, BytesXfered);
7739  }
7740
7741  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7742  pRequest->valid = agFALSE;
7743  /* return the request to free pool */
7744  saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7745  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7746
7747  /* return value */
7748  smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3K");
7749
7750  return ret;
7751}
7752
7753
7754
7755/******************************************************************************/
7756/*! \brief DifEncOffload Response
7757 *
7758 *  This routine handles the response of the DifEncOffload Response
7759 *
7760 *  \param agRoot       Handles for this instance of SAS/SATA LLL
7761 *  \param pIomb        Pointer of IOMB Mesage
7762 *
7763 *  \return sucess or fail
7764 *
7765 */
7766/*******************************************************************************/
7767GLOBAL bit32 mpiDifEncOffloadRsp(
7768  agsaRoot_t               *agRoot,
7769  agsaDifEncOffloadRspV_t  *pIomb
7770  )
7771{
7772
7773  bit32               ret = AGSA_RC_SUCCESS;
7774  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7775  agsaIORequestDesc_t *pRequest;
7776  agsaContext_t       *agContext;
7777  bit32               tag, status;
7778  agsaOffloadDifDetails_t details;
7779
7780  smTraceFuncEnter(hpDBG_VERY_LOUD,"3F");
7781
7782  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, tag));
7783  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, status));
7784  /* get TAG */
7785  SA_DBG3(("mpiDifEncOffloadRsp: HTag=0x%x\n", tag));
7786
7787  /* get request from IOMap */
7788  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7789  if (agNULL == pRequest)
7790  {
7791    SA_DBG1(("mpiDifEncOffloadRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7792    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3F");
7793    return AGSA_RC_FAILURE;
7794  }
7795
7796  agContext = saRoot->IOMap[tag].agContext;
7797
7798  /* remove the request from IOMap */
7799  saRoot->IOMap[tag].Tag = MARK_OFF;
7800  saRoot->IOMap[tag].IORequest = agNULL;
7801  saRoot->IOMap[tag].agContext = agNULL;
7802
7803  SA_ASSERT((pRequest->valid), "pRequest->valid");
7804
7805  /* check status success or failure */
7806  if (status)
7807  {
7808    SA_DBG1(("mpiDifEncOffloadRsp: status is FAILED, status = %x\n", status ));
7809
7810    if (status == OSSA_IO_XFR_ERROR_DIF_MISMATCH || status == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH ||
7811        status == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH || status == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH)
7812    {
7813      si_memset(&details, 0, sizeof(agsaOffloadDifDetails_t));
7814      OSSA_READ_LE_32(AGROOT, &details.ExpectedCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ExpectedCRCUDT01));
7815      OSSA_READ_LE_32(AGROOT, &details.ExpectedUDT2345, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ExpectedUDT2345));
7816      OSSA_READ_LE_32(AGROOT, &details.ActualCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ActualCRCUDT01));
7817      OSSA_READ_LE_32(AGROOT, &details.ActualUDT2345, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ActualUDT2345));
7818      OSSA_READ_LE_32(AGROOT, &details.DIFErr, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, DIFErr));
7819      OSSA_READ_LE_32(AGROOT, &details.ErrBoffset, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ErrBoffset));
7820
7821      if (pRequest->completionCB == agNULL)
7822      {
7823        ossaDIFEncryptionOffloadStartCB(agRoot, agContext, status, &details);
7824      }
7825      else
7826      {
7827        (*(ossaDIFEncryptionOffloadStartCB_t)(pRequest->completionCB))(agRoot, agContext, status, &details);
7828      }
7829    }
7830    else
7831    {
7832      if (pRequest->completionCB == agNULL)
7833      {
7834        ossaDIFEncryptionOffloadStartCB(agRoot, agContext, status, agNULL);
7835      }
7836      else
7837      {
7838        (*(ossaDIFEncryptionOffloadStartCB_t)(pRequest->completionCB))(agRoot, agContext, status, agNULL);
7839      }
7840    }
7841
7842    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3F");
7843
7844    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7845    pRequest->valid = agFALSE;
7846    /* return the request to free pool */
7847    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7848    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7849
7850    return AGSA_RC_FAILURE;
7851  }
7852
7853  /* status is SUCCESS */
7854  SA_DBG1(("mpiDifEncOffloadRsp: status is SUCCESS\n" ));
7855
7856  if (pRequest->completionCB == agNULL)
7857  {
7858    ossaDIFEncryptionOffloadStartCB(agRoot, agContext, status, agNULL);
7859  }
7860  else
7861  {
7862    (*(ossaDIFEncryptionOffloadStartCB_t)(pRequest->completionCB))(agRoot, agContext, status, agNULL);
7863  }
7864
7865  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7866  pRequest->valid = agFALSE;
7867  /* return the request to free pool */
7868  saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7869  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7870
7871  /* return value */
7872  smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3F");
7873
7874  return ret;
7875}
7876
7877