1285242Sachim/*******************************************************************************
2285242Sachim*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3285242Sachim*
4285242Sachim*Redistribution and use in source and binary forms, with or without modification, are permitted provided
5285242Sachim*that the following conditions are met:
6285242Sachim*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7285242Sachim*following disclaimer.
8285242Sachim*2. Redistributions in binary form must reproduce the above copyright notice,
9285242Sachim*this list of conditions and the following disclaimer in the documentation and/or other materials provided
10285242Sachim*with the distribution.
11285242Sachim*
12285242Sachim*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13285242Sachim*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14285242Sachim*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15285242Sachim*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16285242Sachim*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17285242Sachim*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18285242Sachim*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19285242Sachim*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20285242Sachim
21285242Sachim********************************************************************************/
22285242Sachim/*******************************************************************************/
23285242Sachim/*! \file sampirsp.c
24285242Sachim *  \brief The file implements the functions of MPI Outbound Response Message
25285242Sachim *
26285242Sachim */
27285242Sachim/******************************************************************************/
28285242Sachim#include <sys/cdefs.h>
29285242Sachim__FBSDID("$FreeBSD$");
30285242Sachim#include <dev/pms/config.h>
31285242Sachim
32285242Sachim#include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
33285242Sachim#ifdef SA_ENABLE_TRACE_FUNCTIONS
34285242Sachim#ifdef siTraceFileID
35285242Sachim#undef siTraceFileID
36285242Sachim#endif
37285242Sachim#define siTraceFileID 'J'
38285242Sachim#endif
39285242Sachim
40285242Sachim/******************************************************************************/
41285242Sachim/* Protoytpes */
42285242Sachimvoid saReturnRequestToFreePool(
43285242Sachim                            agsaRoot_t          *agRoot,
44285242Sachim                            agsaIORequestDesc_t *pRequest
45285242Sachim                            );
46285242Sachim
47285242Sachim/******************************************************************************/
48285242Sachim/*! \brief Process Outbound IOMB Message
49285242Sachim *
50285242Sachim *  Process Outbound IOMB from SPC
51285242Sachim *
52285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LL Layer
53285242Sachim *  \param pMsg1        Pointer of Response IOMB message 1
54285242Sachim *  \param category     category of outbpond IOMB header
55285242Sachim *  \param opcode       Opcode of Outbound IOMB header
56285242Sachim *  \param bc           buffer count of IOMB header
57285242Sachim *
58285242Sachim *  \return success or fail
59285242Sachim *
60285242Sachim */
61285242Sachim/*******************************************************************************/
62285242Sachim#if 0
63285242SachimFORCEINLINE bit32
64285242SachimmpiParseOBIomb(
65285242Sachim  agsaRoot_t        *agRoot,
66285242Sachim  bit32             *pMsg1,
67285242Sachim  mpiMsgCategory_t  category,
68285242Sachim  bit16             opcode
69285242Sachim  )
70285242Sachim{
71285242Sachim  agsaLLRoot_t      *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
72285242Sachim  bit32              ret = AGSA_RC_SUCCESS;
73285242Sachim  bit32              parserStatus = AGSA_RC_SUCCESS;
74285242Sachim
75285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD, "2f");
76285242Sachim
77285242Sachim  switch (opcode)
78285242Sachim  {
79285242Sachim    case OPC_OUB_COMBINED_SSP_COMP:
80285242Sachim    {
81285242Sachim      agsaSSPCoalescedCompletionRsp_t  *pIomb = (agsaSSPCoalescedCompletionRsp_t *)pMsg1;
82285242Sachim      agsaIORequestDesc_t              *pRequest = agNULL;
83285242Sachim      bit32  tag     = 0;
84285242Sachim      bit32  sspTag  = 0;
85285242Sachim      bit32  count   = 0;
86285242Sachim
87285242Sachim#ifdef SALL_API_TEST
88285242Sachim      saRoot->LLCounters.IOCounter.numSSPCompleted++;
89285242Sachim      SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p %d\n",
90285242Sachim         pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
91285242Sachim#else
92285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SSP_COMP Response received IOMB=%p\n", pMsg1));
93285242Sachim#endif
94285242Sachim      /* get Tag */
95285242Sachim      for (count = 0; count < pIomb->coalescedCount; count++)
96285242Sachim      {
97285242Sachim        tag = pIomb->sspComplCxt[count].tag;
98285242Sachim        sspTag = pIomb->sspComplCxt[count].SSPTag;
99285242Sachim        pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
100285242Sachim        SA_ASSERT((pRequest), "pRequest");
101285242Sachim
102285242Sachim        if(pRequest == agNULL)
103285242Sachim        {
104285242Sachim          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));
105285242Sachim          return(AGSA_RC_FAILURE);
106285242Sachim        }
107285242Sachim        SA_ASSERT((pRequest->valid), "pRequest->valid");
108285242Sachim
109285242Sachim        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));
110285242Sachim
111285242Sachim        /* Completion of SSP without Response Data */
112285242Sachim        siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, sspTag);
113285242Sachim      }
114285242Sachim    }
115285242Sachim    break;
116285242Sachim
117285242Sachim    case OPC_OUB_SSP_COMP:
118285242Sachim    {
119285242Sachim#ifdef SALL_API_TEST
120285242Sachim      saRoot->LLCounters.IOCounter.numSSPCompleted++;
121285242Sachim      SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p %d\n",
122285242Sachim         pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
123285242Sachim#else
124285242Sachim      SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p\n", pMsg1));
125285242Sachim#endif
126285242Sachim      /* process the SSP IO Completed response message */
127285242Sachim      mpiSSPCompletion(agRoot, pMsg1);
128285242Sachim      break;
129285242Sachim    }
130285242Sachim    case OPC_OUB_COMBINED_SATA_COMP:
131285242Sachim    {
132285242Sachim      agsaSATACoalescedCompletionRsp_t    *pIomb;
133285242Sachim      agsaIORequestDesc_t       *pRequest;
134285242Sachim      bit32                     tag;
135285242Sachim      bit32                     count;
136285242Sachim
137285242Sachim    #ifdef SALL_API_TEST
138285242Sachim      saRoot->LLCounters.IOCounter.numSSPCompleted++;
139285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP Response received IOMB=%p %d\n",
140285242Sachim         pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
141285242Sachim    #else
142285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP Response received IOMB=%p\n", pMsg1));
143285242Sachim    #endif
144285242Sachim
145285242Sachim      pIomb = (agsaSATACoalescedCompletionRsp_t *)pMsg1;
146285242Sachim      /* get Tag */
147285242Sachim      for (count = 0; count < pIomb->coalescedCount; count++)
148285242Sachim      {
149285242Sachim        tag = pIomb->stpComplCxt[count].tag;
150285242Sachim        pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
151285242Sachim        SA_ASSERT((pRequest), "pRequest");
152285242Sachim
153285242Sachim        if(pRequest == agNULL)
154285242Sachim        {
155285242Sachim          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));
156285242Sachim          return(AGSA_RC_FAILURE);
157285242Sachim        }
158285242Sachim        SA_ASSERT((pRequest->valid), "pRequest->valid");
159285242Sachim
160285242Sachim        SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP IOMB tag=0x%x, status=0x%x, param=0x%x\n", tag, OSSA_IO_SUCCESS, 0));
161285242Sachim
162285242Sachim        /* Completion of SATA without Response Data */
163285242Sachim        siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, 0);
164285242Sachim      }
165285242Sachim      break;
166285242Sachim    }
167285242Sachim    case OPC_OUB_SATA_COMP:
168285242Sachim    {
169285242Sachim#ifdef SALL_API_TEST
170285242Sachim      saRoot->LLCounters.IOCounter.numSataCompleted++;
171285242Sachim      SA_DBG3(("mpiParseOBIomb, SATA_COMP Response received IOMB=%p %d\n",
172285242Sachim             pMsg1, saRoot->LLCounters.IOCounter.numSataCompleted));
173285242Sachim#else
174285242Sachim      SA_DBG3(("mpiParseOBIomb, SATA_COMP Response received IOMB=%p\n", pMsg1));
175285242Sachim#endif
176285242Sachim      /* process the response message */
177285242Sachim      mpiSATACompletion(agRoot, pMsg1);
178285242Sachim      break;
179285242Sachim    }
180285242Sachim    case OPC_OUB_SSP_ABORT_RSP:
181285242Sachim    {
182285242Sachim#ifdef SALL_API_TEST
183285242Sachim      saRoot->LLCounters.IOCounter.numSSPAbortedCB++;
184285242Sachim#else
185285242Sachim      SA_DBG3(("mpiParseOBIomb, SSP_ABORT Response received IOMB=%p\n", pMsg1));
186285242Sachim#endif
187285242Sachim      /* process the response message */
188285242Sachim      parserStatus = mpiSSPAbortRsp(agRoot, (agsaSSPAbortRsp_t *)pMsg1);
189285242Sachim      if(parserStatus !=  AGSA_RC_SUCCESS)
190285242Sachim      {
191285242Sachim         SA_DBG3(("mpiParseOBIomb, mpiSSPAbortRsp FAIL IOMB=%p\n", pMsg1));
192285242Sachim      }
193285242Sachim
194285242Sachim      break;
195285242Sachim    }
196285242Sachim    case OPC_OUB_SATA_ABORT_RSP:
197285242Sachim    {
198285242Sachim#ifdef SALL_API_TEST
199285242Sachim      saRoot->LLCounters.IOCounter.numSataAbortedCB++;
200285242Sachim#else
201285242Sachim      SA_DBG3(("mpiParseOBIomb, SATA_ABORT Response received IOMB=%p\n", pMsg1));
202285242Sachim#endif
203285242Sachim      /* process the response message */
204285242Sachim      mpiSATAAbortRsp(agRoot, (agsaSATAAbortRsp_t *)pMsg1);
205285242Sachim      break;
206285242Sachim    }
207285242Sachim    case OPC_OUB_SATA_EVENT:
208285242Sachim    {
209285242Sachim      SA_DBG3(("mpiParseOBIomb, SATA_EVENT Response received IOMB=%p\n", pMsg1));
210285242Sachim      /* process the response message */
211285242Sachim      mpiSATAEvent(agRoot, (agsaSATAEventRsp_t *)pMsg1);
212285242Sachim      break;
213285242Sachim    }
214285242Sachim    case OPC_OUB_SSP_EVENT:
215285242Sachim    {
216285242Sachim      SA_DBG3(("mpiParseOBIomb, SSP_EVENT Response received IOMB=%p\n", pMsg1));
217285242Sachim      /* process the response message */
218285242Sachim      mpiSSPEvent(agRoot, (agsaSSPEventRsp_t *)pMsg1);
219285242Sachim      break;
220285242Sachim    }
221285242Sachim    case OPC_OUB_SMP_COMP:
222285242Sachim    {
223285242Sachim#ifdef SALL_API_TEST
224285242Sachim      saRoot->LLCounters.IOCounter.numSMPCompleted++;
225285242Sachim      SA_DBG3(("mpiParseOBIomb, SMP_COMP Response received IOMB=%p, %d\n",
226285242Sachim             pMsg1, saRoot->LLCounters.IOCounter.numSMPCompleted));
227285242Sachim#else
228285242Sachim      SA_DBG3(("mpiParseOBIomb, SMP_COMP Response received IOMB=%p\n", pMsg1));
229285242Sachim#endif
230285242Sachim      /* process the response message */
231285242Sachim      mpiSMPCompletion(agRoot, (agsaSMPCompletionRsp_t *)pMsg1);
232285242Sachim      break;
233285242Sachim    }
234285242Sachim#ifndef BIOS
235285242Sachim    case OPC_OUB_ECHO:
236285242Sachim    {
237285242Sachim#ifdef SALL_API_TEST
238285242Sachim      saRoot->LLCounters.IOCounter.numEchoCB++;
239285242Sachim      SA_DBG3(("mpiParseOBIomb, ECHO Response received %d\n", saRoot->LLCounters.IOCounter.numEchoCB));
240285242Sachim#else
241285242Sachim      SA_DBG3(("mpiParseOBIomb, ECHO Response received\n"));
242285242Sachim#endif
243285242Sachim      /* process the response message */
244285242Sachim      mpiEchoRsp(agRoot, (agsaEchoRsp_t *)pMsg1);
245285242Sachim      break;
246285242Sachim    }
247285242Sachim#endif
248285242Sachim    case OPC_OUB_GET_NVMD_DATA:
249285242Sachim    {
250285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_NVMD_DATA received IOMB=%p\n", pMsg1));
251285242Sachim      /* process the response message */
252285242Sachim      mpiGetNVMDataRsp(agRoot, (agsaGetNVMDataRsp_t *)pMsg1);
253285242Sachim      break;
254285242Sachim    }
255285242Sachim    case OPC_OUB_SPC_HW_EVENT:
256285242Sachim    {
257285242Sachim      SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
258285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SPC_HW_EVENT Response received IOMB=%p\n", pMsg1));
259285242Sachim      /* process the response message */
260285242Sachim      mpiHWevent(agRoot, (agsaHWEvent_SPC_OUB_t *)pMsg1);
261285242Sachim      break;
262285242Sachim    }
263285242Sachim    case OPC_OUB_HW_EVENT:
264285242Sachim    {
265285242Sachim      SA_DBG3(("mpiParseOBIomb, HW_EVENT Response received IOMB=%p\n", pMsg1));
266285242Sachim      /* process the response message */
267285242Sachim      mpiHWevent(agRoot, (agsaHWEvent_SPC_OUB_t *)pMsg1);
268285242Sachim      break;
269285242Sachim    }
270285242Sachim    case OPC_OUB_PHY_START_RESPONSE:
271285242Sachim    {
272285242Sachim      SA_DBG1(("mpiParseOBIomb, OPC_OUB_PHY_START_RESPONSE Response received IOMB=%p\n", pMsg1));
273285242Sachim      /* process the response message */
274285242Sachim      mpiPhyStartEvent( agRoot, (agsaHWEvent_Phy_OUB_t  *)pMsg1  );
275285242Sachim
276285242Sachim      break;
277285242Sachim    }
278285242Sachim    case OPC_OUB_PHY_STOP_RESPONSE:
279285242Sachim    {
280285242Sachim      SA_DBG1(("mpiParseOBIomb, OPC_OUB_PHY_STOP_RESPONSE Response received IOMB=%p\n", pMsg1));
281285242Sachim      /* process the response message */
282285242Sachim      mpiPhyStopEvent( agRoot, (agsaHWEvent_Phy_OUB_t  *)pMsg1  );
283285242Sachim      break;
284285242Sachim    }
285285242Sachim
286285242Sachim    case OPC_OUB_LOCAL_PHY_CNTRL:
287285242Sachim    {
288285242Sachim      SA_DBG3(("mpiParseOBIomb, PHY CONTROL Response received IOMB=%p\n", pMsg1));
289285242Sachim      /* process the response message */
290285242Sachim      mpiPhyCntrlRsp(agRoot, (agsaLocalPhyCntrlRsp_t *)pMsg1);
291285242Sachim      break;
292285242Sachim    }
293285242Sachim    case OPC_OUB_SPC_DEV_REGIST:
294285242Sachim    {
295285242Sachim      SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
296285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SPC_DEV_REGIST Response received IOMB=%p\n", pMsg1));
297285242Sachim      /* process the response message */
298285242Sachim      mpiDeviceRegRsp(agRoot, (agsaDeviceRegistrationRsp_t *)pMsg1);
299285242Sachim      break;
300285242Sachim    }
301285242Sachim    case OPC_OUB_DEV_REGIST:
302285242Sachim    {
303285242Sachim      SA_DBG2(("mpiParseOBIomb, DEV_REGISTRATION Response received IOMB=%p\n", pMsg1));
304285242Sachim      /* process the response message */
305285242Sachim      mpiDeviceRegRsp(agRoot, (agsaDeviceRegistrationRsp_t *)pMsg1);
306285242Sachim      break;
307285242Sachim    }
308285242Sachim    case OPC_OUB_DEREG_DEV:
309285242Sachim    {
310285242Sachim      SA_DBG3(("mpiParseOBIomb, DEREGISTRATION DEVICE Response received IOMB=%p\n", pMsg1));
311285242Sachim      /* process the response message */
312285242Sachim      mpiDeregDevHandleRsp(agRoot, (agsaDeregDevHandleRsp_t *)pMsg1);
313285242Sachim      break;
314285242Sachim    }
315285242Sachim#ifndef BIOS
316285242Sachim    case OPC_OUB_GET_DEV_HANDLE:
317285242Sachim    {
318285242Sachim      SA_DBG3(("mpiParseOBIomb, GET_DEV_HANDLE Response received IOMB=%p\n", pMsg1));
319285242Sachim      /* process the response message */
320285242Sachim      mpiGetDevHandleRsp(agRoot, (agsaGetDevHandleRsp_t *)pMsg1);
321285242Sachim      break;
322285242Sachim    }
323285242Sachim#endif
324285242Sachim    case OPC_OUB_SPC_DEV_HANDLE_ARRIV:
325285242Sachim    {
326285242Sachim      SA_DBG3(("mpiParseOBIomb, SPC_DEV_HANDLE_ARRIV Response received IOMB=%p\n", pMsg1));
327285242Sachim      /* process the response message */
328285242Sachim      mpiDeviceHandleArrived(agRoot, (agsaDeviceHandleArrivedNotify_t *)pMsg1);
329285242Sachim      break;
330285242Sachim    }
331285242Sachim    case OPC_OUB_DEV_HANDLE_ARRIV:
332285242Sachim    {
333285242Sachim      SA_DBG3(("mpiParseOBIomb, DEV_HANDLE_ARRIV Response received IOMB=%p\n", pMsg1));
334285242Sachim      /* process the response message */
335285242Sachim      mpiDeviceHandleArrived(agRoot, (agsaDeviceHandleArrivedNotify_t *)pMsg1);
336285242Sachim      break;
337285242Sachim    }
338285242Sachim#if 0 //Sunitha
339285242Sachim	case OPC_OUB_THERM_HW_EVENT:
340285242Sachim	{
341285242Sachim      SA_DBG3(("mpiParseOBIomb, THERM_HW_EVENT Response received IOMB=%p\n", pMsg1));
342285242Sachim      ossaLogThermalEvent(agRoot, (agsaThermal_Hw_Event_Notify_t *)pMsg1);
343285242Sachim      break;
344285242Sachim	}
345285242Sachim#endif //Sunitha
346285242Sachim    case OPC_OUB_SSP_RECV_EVENT:
347285242Sachim    {
348285242Sachim      SA_DBG3(("mpiParseOBIomb, SSP_RECV_EVENT Response received IOMB=%p\n", pMsg1));
349285242Sachim      /* process the response message */
350285242Sachim      mpiSSPReqReceivedNotify(agRoot, (agsaSSPReqReceivedNotify_t *)pMsg1);
351285242Sachim      break;
352285242Sachim    }
353285242Sachim    case OPC_OUB_DEV_INFO:
354285242Sachim    {
355285242Sachim      SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
356285242Sachim      SA_DBG3(("mpiParseOBIomb, DEV_INFO Response received IOMB=%p\n", pMsg1));
357285242Sachim      /* process the response message */
358285242Sachim      mpiGetDevInfoRsp(agRoot, (agsaGetDevInfoRspV_t *)pMsg1);
359285242Sachim      break;
360285242Sachim    }
361285242Sachim#ifndef BIOS
362285242Sachim    case OPC_OUB_GET_PHY_PROFILE_RSP:
363285242Sachim    {
364285242Sachim      SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
365285242Sachim      SA_DBG2(("mpiParseOBIomb, OPC_OUB_GET_PHY_PROFILE_RSP Response received IOMB=%p\n", pMsg1));
366285242Sachim      /* process the response message */
367285242Sachim      mpiGetPhyProfileRsp(agRoot, (agsaGetPhyProfileRspV_t *)pMsg1);
368285242Sachim      break;
369285242Sachim    }
370285242Sachim    case OPC_OUB_SET_PHY_PROFILE_RSP:
371285242Sachim    {
372285242Sachim      SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
373285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_PHY_PROFILE_RSP Response received IOMB=%p\n", pMsg1));
374285242Sachim      /* process the response message */
375285242Sachim      mpiSetPhyProfileRsp(agRoot, (agsaSetPhyProfileRspV_t *)pMsg1);
376285242Sachim      break;
377285242Sachim    }
378285242Sachim#endif /* BIOS */
379285242Sachim    case OPC_OUB_SPC_DEV_INFO:
380285242Sachim    {
381285242Sachim      SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
382285242Sachim      SA_DBG3(("mpiParseOBIomb, DEV_INFO Response received IOMB=%p\n", pMsg1));
383285242Sachim      /* process the response message */
384285242Sachim      mpiGetDevInfoRspSpc(agRoot, (agsaGetDevInfoRsp_t *)pMsg1);
385285242Sachim      break;
386285242Sachim    }
387285242Sachim    case OPC_OUB_FW_FLASH_UPDATE:
388285242Sachim    {
389285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_FLASH_UPDATE Response received IOMB=%p\n", pMsg1));
390285242Sachim      /* process the response message */
391285242Sachim      mpiFwFlashUpdateRsp(agRoot, (agsaFwFlashUpdateRsp_t *)pMsg1);
392285242Sachim      break;
393285242Sachim    }
394285242Sachim    case OPC_OUB_FLASH_OP_EXT_RSP:
395285242Sachim    {
396285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_FLASH_UPDATE Response received IOMB=%p\n", pMsg1));
397285242Sachim      /* process the response message */
398285242Sachim      mpiFwExtFlashUpdateRsp(agRoot, (agsaFwFlashOpExtRsp_t *)pMsg1);
399285242Sachim      break;
400285242Sachim    }
401285242Sachim#ifndef BIOS
402285242Sachim#ifdef SPC_ENABLE_PROFILE
403285242Sachim    case OPC_OUB_FW_PROFILE:
404285242Sachim    {
405285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_PROFILE Response received IOMB=%p\n", pMsg1));
406285242Sachim      /* process the response message */
407285242Sachim      mpiFwProfileRsp(agRoot, (agsaFwProfileRsp_t *)pMsg1);
408285242Sachim      break;
409285242Sachim    }
410285242Sachim#endif
411285242Sachim    case OPC_OUB_SET_NVMD_DATA:
412285242Sachim    {
413285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_NVMD_DATA received IOMB=%p\n", pMsg1));
414285242Sachim      /* process the response message */
415285242Sachim      mpiSetNVMDataRsp(agRoot, (agsaSetNVMDataRsp_t *)pMsg1);
416285242Sachim      break;
417285242Sachim    }
418285242Sachim
419285242Sachim    case OPC_OUB_GPIO_RESPONSE:
420285242Sachim    {
421285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
422285242Sachim      /* process the response message */
423285242Sachim      mpiGPIORsp(agRoot, (agsaGPIORsp_t *)pMsg1);
424285242Sachim      break;
425285242Sachim    }
426285242Sachim    case OPC_OUB_GPIO_EVENT:
427285242Sachim    {
428285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
429285242Sachim      /* process the response message */
430285242Sachim      mpiGPIOEventRsp(agRoot, (agsaGPIOEvent_t *)pMsg1);
431285242Sachim      break;
432285242Sachim    }
433285242Sachim#endif  /* BIOS */
434285242Sachim    case OPC_OUB_GENERAL_EVENT:
435285242Sachim    {
436285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GENERAL_EVENT Response received IOMB=%p\n", pMsg1));
437285242Sachim      /* process the response message */
438285242Sachim      mpiGeneralEventRsp(agRoot, (agsaGeneralEventRsp_t *)pMsg1);
439285242Sachim      break;
440285242Sachim    }
441285242Sachim#ifndef BIOS
442285242Sachim    case OPC_OUB_SAS_DIAG_MODE_START_END:
443285242Sachim    {
444285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_DIAG_MODE_START_END Response received IOMB=%p\n", pMsg1));
445285242Sachim      /* process the response message */
446285242Sachim      mpiSASDiagStartEndRsp(agRoot, (agsaSASDiagStartEndRsp_t *)pMsg1);
447285242Sachim      break;
448285242Sachim    }
449285242Sachim    case OPC_OUB_SAS_DIAG_EXECUTE:
450285242Sachim    {
451285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_DIAG_EXECUTE_RSP Response received IOMB=%p\n", pMsg1));
452285242Sachim      /* process the response message */
453285242Sachim      mpiSASDiagExecuteRsp(agRoot, (agsaSASDiagExecuteRsp_t *)pMsg1);
454285242Sachim      break;
455285242Sachim    }
456285242Sachim#endif /* BIOS */
457285242Sachim    case OPC_OUB_GET_TIME_STAMP:
458285242Sachim    {
459285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_TIME_STAMP Response received IOMB=%p\n", pMsg1));
460285242Sachim      /* process the response message */
461285242Sachim      mpiGetTimeStampRsp(agRoot, (agsaGetTimeStampRsp_t *)pMsg1);
462285242Sachim      break;
463285242Sachim    }
464285242Sachim
465285242Sachim    case OPC_OUB_SPC_SAS_HW_EVENT_ACK:
466285242Sachim    {
467285242Sachim      SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
468285242Sachim      SA_DBG3(("mpiParseOBIomb,OPC_OUB_SPC_SAS_HW_EVENT_ACK  Response received IOMB=%p\n", pMsg1));
469285242Sachim      /* process the response message */
470285242Sachim      mpiSASHwEventAckRsp(agRoot, (agsaSASHwEventAckRsp_t *)pMsg1);
471285242Sachim      break;
472285242Sachim    }
473285242Sachim
474285242Sachim    case OPC_OUB_SAS_HW_EVENT_ACK:
475285242Sachim    {
476285242Sachim      SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
477285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_HW_EVENT_ACK Response received IOMB=%p\n", pMsg1));
478285242Sachim      /* process the response message */
479285242Sachim      mpiSASHwEventAckRsp(agRoot, (agsaSASHwEventAckRsp_t *)pMsg1);
480285242Sachim      break;
481285242Sachim    }
482285242Sachim    case OPC_OUB_PORT_CONTROL:
483285242Sachim    {
484285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_PORT_CONTROL Response received IOMB=%p\n", pMsg1));
485285242Sachim      /* process the response message */
486285242Sachim      mpiPortControlRsp(agRoot, (agsaPortControlRsp_t *)pMsg1);
487285242Sachim      break;
488285242Sachim    }
489285242Sachim    case OPC_OUB_SMP_ABORT_RSP:
490285242Sachim    {
491285242Sachim#ifdef SALL_API_TEST
492285242Sachim      saRoot->LLCounters.IOCounter.numSMPAbortedCB++;
493285242Sachim      SA_DBG3(("mpiParseOBIomb, SMP_ABORT Response received IOMB=%p, %d\n",
494285242Sachim             pMsg1, saRoot->LLCounters.IOCounter.numSMPAbortedCB));
495285242Sachim#else
496285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SMP_ABORT_RSP Response received IOMB=%p\n", pMsg1));
497285242Sachim#endif
498285242Sachim      /* process the response message */
499285242Sachim      mpiSMPAbortRsp(agRoot, (agsaSMPAbortRsp_t *)pMsg1);
500285242Sachim      break;
501285242Sachim    }
502285242Sachim    case OPC_OUB_DEVICE_HANDLE_REMOVAL:
503285242Sachim    {
504285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_DEVICE_HANDLE_REMOVAL received IOMB=%p\n", pMsg1));
505285242Sachim      /* process the response message */
506285242Sachim      mpiDeviceHandleRemoval(agRoot, (agsaDeviceHandleRemoval_t *)pMsg1);
507285242Sachim      break;
508285242Sachim    }
509285242Sachim    case OPC_OUB_SET_DEVICE_STATE:
510285242Sachim    {
511285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_DEVICE_STATE received IOMB=%p\n", pMsg1));
512285242Sachim      /* process the response message */
513285242Sachim      mpiSetDeviceStateRsp(agRoot, (agsaSetDeviceStateRsp_t *)pMsg1);
514285242Sachim      break;
515285242Sachim    }
516285242Sachim
517285242Sachim#ifndef BIOS
518285242Sachim    case OPC_OUB_GET_DEVICE_STATE:
519285242Sachim    {
520285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_DEVICE_STATE received IOMB=%p\n", pMsg1));
521285242Sachim      /* process the response message */
522285242Sachim      mpiGetDeviceStateRsp(agRoot, (agsaGetDeviceStateRsp_t *)pMsg1);
523285242Sachim      break;
524285242Sachim    }
525285242Sachim#endif  /* BIOS */
526285242Sachim
527285242Sachim    case OPC_OUB_SET_DEV_INFO:
528285242Sachim    {
529285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_DEV_INFO received IOMB=%p\n", pMsg1));
530285242Sachim      /* process the response message */
531285242Sachim      mpiSetDevInfoRsp(agRoot, (agsaSetDeviceInfoRsp_t *)pMsg1);
532285242Sachim      break;
533285242Sachim    }
534285242Sachim
535285242Sachim#ifndef BIOS_DEBUG
536285242Sachim    case OPC_OUB_SAS_RE_INITIALIZE:
537285242Sachim    {
538285242Sachim      SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
539285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_RE_INITIALIZE received IOMB=%p\n", pMsg1));
540285242Sachim      /* process the response message */
541285242Sachim      mpiSasReInitializeRsp(agRoot, (agsaSasReInitializeRsp_t *)pMsg1);
542285242Sachim      break;
543285242Sachim    }
544285242Sachim#endif  /* BIOS */
545285242Sachim
546285242Sachim    case OPC_OUB_SGPIO_RESPONSE:
547285242Sachim    {
548285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SGPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
549285242Sachim      /* process the response message */
550285242Sachim      mpiSGpioRsp(agRoot, (agsaSGpioRsp_t *)pMsg1);
551285242Sachim      break;
552285242Sachim    }
553285242Sachim
554285242Sachim#ifndef BIOS
555285242Sachim    case OPC_OUB_PCIE_DIAG_EXECUTE:
556285242Sachim    {
557285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_PCIE_DIAG_EXECUTE Response received IOMB=%p\n", pMsg1));
558285242Sachim      /* process the response message */
559285242Sachim      mpiPCIeDiagExecuteRsp(agRoot, (agsaPCIeDiagExecuteRsp_t *)pMsg1);
560285242Sachim      break;
561285242Sachim    }
562285242Sachim    case 2104: //delray start
563285242Sachim    {
564285242Sachim      if(smIS_SPC6V(agRoot))
565285242Sachim      {
566285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_DFE_DATA_RSP Response received IOMB=%p\n", pMsg1));
567285242Sachim      /* process the response message */
568285242Sachim      mpiGetDFEDataRsp(agRoot, (agsaGetDDEFDataRsp_t *)pMsg1);
569285242Sachim      }
570285242Sachim      if(smIS_SPC12V(agRoot))
571285242Sachim      {
572285242Sachim        SA_DBG3(("mpiParseOBIomb, OPC_INB_GET_VIST_CAP Response received IOMB=%p\n", pMsg1));
573285242Sachim        mpiGetVisRsp(agRoot, (agsaGetVisCapRsp_t *)pMsg1);
574285242Sachim      }
575285242Sachim      else
576285242Sachim      {
577285242Sachim        SA_DBG1(("mpiParseOBIomb, 2104  Response received IOMB=%p\n", pMsg1));
578285242Sachim      }
579285242Sachim      break;
580285242Sachim    }
581285242Sachim#endif   /* BIOS */
582285242Sachim    case OPC_OUB_SET_CONTROLLER_CONFIG:
583285242Sachim    {
584285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_CONTROLLER_CONFIG Response received IOMB=%p\n", pMsg1));
585285242Sachim      mpiSetControllerConfigRsp(agRoot, (agsaSetControllerConfigRsp_t *)pMsg1);
586285242Sachim      break;
587285242Sachim    }
588285242Sachim#ifndef BIOS
589285242Sachim    case OPC_OUB_GET_CONTROLLER_CONFIG:
590285242Sachim    {
591285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_CONTROLLER_CONFIG Response received IOMB=%p\n", pMsg1));
592285242Sachim      mpiGetControllerConfigRsp(agRoot, (agsaGetControllerConfigRsp_t *)pMsg1);
593285242Sachim      break;
594285242Sachim    }
595285242Sachim    case OPC_OUB_KEK_MANAGEMENT:
596285242Sachim    {
597285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_KEK_MANAGEMENT Response received IOMB=%p\n", pMsg1));
598285242Sachim      mpiKekManagementRsp(agRoot, (agsaKekManagementRsp_t *)pMsg1);
599285242Sachim      break;
600285242Sachim    }
601285242Sachim#endif  /* BIOS */
602285242Sachim#ifdef UN_USED_FUNC
603285242Sachim    case OPC_OUB_DEK_MANAGEMENT:
604285242Sachim    {
605285242Sachim      SA_DBG3(("mpiParseOBIomb, OPC_OUB_DEK_MANAGEMENT Response received IOMB=%p\n", pMsg1));
606285242Sachim      mpiDekManagementRsp(agRoot, (agsaDekManagementRsp_t *)pMsg1);
607285242Sachim      break;
608285242Sachim    }
609285242Sachim#endif
610285242Sachim#ifndef BIOS
611285242Sachim    case OPC_OUB_OPR_MGMT:
612285242Sachim    {
613285242Sachim      SA_DBG1(("mpiParseOBIomb, OPC_OUB_OPR_MGMT Response received IOMB=%p\n", pMsg1));
614285242Sachim      mpiOperatorManagementRsp(agRoot, (agsaOperatorMangmenRsp_t *)pMsg1);
615285242Sachim      break;
616285242Sachim    }
617285242Sachim    case OPC_OUB_ENC_TEST_EXECUTE:
618285242Sachim    {
619285242Sachim      SA_DBG1(("mpiParseOBIomb, OPC_OUB_ENC_TEST_EXECUTE Response received IOMB=%p\n", pMsg1));
620285242Sachim      mpiBistRsp(agRoot, (agsaEncryptBistRsp_t *)pMsg1);
621285242Sachim      break;
622285242Sachim    }
623285242Sachim#endif /* BIOS */
624285242Sachim    case OPC_OUB_SET_OPERATOR:
625285242Sachim    {
626285242Sachim      SA_DBG1(("mpiParseOBIomb, OPC_OUB_SET_OPERATOR Response received IOMB=%p\n", pMsg1));
627285242Sachim      mpiSetOperatorRsp(agRoot, (agsaSetOperatorRsp_t *)pMsg1);
628285242Sachim      break;
629285242Sachim    }
630285242Sachim    case OPC_OUB_GET_OPERATOR:
631285242Sachim    {
632285242Sachim      SA_DBG1(("mpiParseOBIomb, OPC_OUB_GET_OPERATOR Response received IOMB=%p\n", pMsg1));
633285242Sachim      mpiGetOperatorRsp(agRoot, (agsaGetOperatorRsp_t *)pMsg1);
634285242Sachim      break;
635285242Sachim    }
636285242Sachim    case OPC_OUB_DIF_ENC_OFFLOAD_RSP://delray start
637285242Sachim    {
638285242Sachim      SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
639285242Sachim      SA_DBG1(("mpiParseOBIomb, OPC_OUB_DIF_ENC_OFFLOAD_RSP Response received IOMB=%p\n", pMsg1));
640285242Sachim      mpiDifEncOffloadRsp(agRoot, (agsaDifEncOffloadRspV_t *)pMsg1);
641285242Sachim      break;
642285242Sachim    }			//delray end
643285242Sachim    default:
644285242Sachim    {
645285242Sachim#ifdef SALL_API_TEST
646285242Sachim      saRoot->LLCounters.IOCounter.numUNKNWRespIOMB++;
647285242Sachim      SA_DBG1(("mpiParseOBIomb, UnKnown Response received IOMB=%p, %d\n",
648285242Sachim             pMsg1, saRoot->LLCounters.IOCounter.numUNKNWRespIOMB));
649285242Sachim#else
650285242Sachim      SA_DBG1(("mpiParseOBIomb, Unknown IOMB Response received opcode 0x%X IOMB=%p\n",opcode, pMsg1));
651285242Sachim#endif
652285242Sachim      break;
653285242Sachim    }
654285242Sachim  } /* switch */
655285242Sachim
656285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2f");
657285242Sachim
658285242Sachim  return ret;
659285242Sachim
660285242Sachim}
661285242Sachim#endif
662285242Sachim
663285242Sachim#ifndef BIOS
664285242Sachim#endif
665285242Sachim
666285242Sachim/******************************************************************************/
667285242Sachim/*! \brief ECHO Response
668285242Sachim *
669285242Sachim *  This routine handles the response of ECHO Command
670285242Sachim *
671285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
672285242Sachim *  \param pIomb        Pointer of IOMB Mesage
673285242Sachim *
674285242Sachim *  \return sucess or fail
675285242Sachim *
676285242Sachim */
677285242Sachim/*******************************************************************************/
678285242SachimGLOBAL bit32 mpiEchoRsp(
679285242Sachim  agsaRoot_t          *agRoot,
680285242Sachim  agsaEchoRsp_t       *pIomb
681285242Sachim  )
682285242Sachim{
683285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
684285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
685285242Sachim  agsaIORequestDesc_t *pRequest;
686285242Sachim  agsaContext_t       *agContext;
687285242Sachim  bit32               tag;
688285242Sachim
689285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD, "2g");
690285242Sachim
691285242Sachim  SA_DBG3(("mpiEchoRsp: HTAG=0x%x\n", pIomb->tag));
692285242Sachim
693285242Sachim  /* get request from IOMap */
694285242Sachim  OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaEchoRsp_t, tag));
695285242Sachim
696285242Sachim  pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
697285242Sachim  if (agNULL == pRequest)
698285242Sachim  {
699285242Sachim    SA_DBG1(("mpiEchoRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x\n", tag));
700285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2g");
701285242Sachim    return AGSA_RC_FAILURE;
702285242Sachim  }
703285242Sachim
704285242Sachim  agContext = saRoot->IOMap[tag].agContext;
705285242Sachim
706285242Sachim  ossaEchoCB(agRoot, agContext, (void *)&pIomb->payload[0]);
707285242Sachim
708285242Sachim  /* remove the request from IOMap */
709285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
710285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
711285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
712285242Sachim
713285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
714285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
715285242Sachim  pRequest->valid = agFALSE;
716285242Sachim  /* return the request to free pool */
717285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
718285242Sachim  {
719285242Sachim    SA_DBG1(("mpiEchoRsp: saving pRequest (%p) for later use\n", pRequest));
720285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
721285242Sachim  }
722285242Sachim  else
723285242Sachim  {
724285242Sachim    /* return the request to free pool */
725285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
726285242Sachim  }
727285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
728285242Sachim
729285242Sachim  /* return value */
730285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2g");
731285242Sachim  return ret;
732285242Sachim}
733285242Sachim
734285242Sachim/******************************************************************************/
735285242Sachim/*! \brief Get NVM Data Response
736285242Sachim *
737285242Sachim *  This routine handles the response of GET NVM Data Response
738285242Sachim *
739285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
740285242Sachim *  \param pIomb        Pointer of IOMB Mesage
741285242Sachim *
742285242Sachim *  \return sucess or fail
743285242Sachim *
744285242Sachim */
745285242Sachim/*******************************************************************************/
746285242SachimGLOBAL bit32 mpiGetNVMDataRsp(
747285242Sachim  agsaRoot_t          *agRoot,
748285242Sachim  agsaGetNVMDataRsp_t *pIomb
749285242Sachim  )
750285242Sachim{
751285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
752285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
753285242Sachim  agsaIORequestDesc_t *pRequest;
754285242Sachim  agsaContext_t       *agContext;
755285242Sachim  bit32               i, dataLen;
756285242Sachim  bit32               DlenStatus, tag, iRTdaBnDpsAsNvm;
757285242Sachim
758285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD, "2h");
759285242Sachim
760285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, tag));
761285242Sachim  OSSA_READ_LE_32(AGROOT, &DlenStatus, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, DlenStatus));
762285242Sachim  OSSA_READ_LE_32(AGROOT, &iRTdaBnDpsAsNvm, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, iRTdaBnDpsAsNvm));
763285242Sachim  OSSA_READ_LE_32(AGROOT, &dataLen, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, NVMData[10])) ;
764285242Sachim
765285242Sachim  SA_DBG1(("mpiGetNVMDataRsp: HTAG=0x%x\n", tag));
766285242Sachim
767285242Sachim  /* get request from IOMap */
768285242Sachim  pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
769285242Sachim  if (agNULL == pRequest)
770285242Sachim  {
771285242Sachim    SA_DBG1(("mpiGetNVMDataRsp: Bad Response IOMB!!! pRequest is NULL.\n"));
772285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2h");
773285242Sachim    return AGSA_RC_FAILURE;
774285242Sachim  }
775285242Sachim
776285242Sachim  agContext = saRoot->IOMap[tag].agContext;
777285242Sachim
778285242Sachim  if (iRTdaBnDpsAsNvm & IRMode)
779285242Sachim  {
780285242Sachim    /* indirect mode - IR bit set */
781285242Sachim    SA_DBG1(("mpiGetNVMDataRsp: OSSA_SUCCESS, IR=1, DataLen=%d\n", dataLen));
782285242Sachim    if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_CONFIG_SEEPROM) ||
783285242Sachim        ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_VPD_FLASH) ||
784285242Sachim        ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_TWI_DEVICES) ||
785285242Sachim        ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_EXPANSION_ROM) ||
786285242Sachim        ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_IOP_REG_FLASH))
787285242Sachim    {
788285242Sachim      /* CB for NVMD */
789285242Sachim//#ifdef UN_USED_FUNC
790285242Sachim      ossaGetNVMDResponseCB(agRoot, agContext, (DlenStatus & NVMD_STAT), INDIRECT_MODE, dataLen, agNULL);
791285242Sachim//#endif
792285242Sachim    }
793285242Sachim    else if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AAP1_RDUMP) ||
794285242Sachim             ((iRTdaBnDpsAsNvm & NVMD_TYPE) == IOP_RDUMP))
795285242Sachim    {
796285242Sachim#ifdef UN_USED_FUNC
797285242Sachim      if ((DlenStatus & NVMD_STAT) == 0)
798285242Sachim      {
799285242Sachim        /* CB for Register Dump */
800285242Sachim
801285242Sachim        ossaGetRegisterDumpCB(agRoot, agContext, OSSA_SUCCESS);
802285242Sachim      }
803285242Sachim      else
804285242Sachim      {
805285242Sachim        /* CB for Register Dump */
806285242Sachim        ossaGetRegisterDumpCB(agRoot, agContext, OSSA_FAILURE);
807285242Sachim      }
808285242Sachim#endif
809285242Sachim    }
810285242Sachim    else
811285242Sachim    {
812285242Sachim      /* Should not be happened */
813285242Sachim      SA_DBG1(("mpiGetNVMDataRsp: (IR=1)Wrong Device type 0x%x\n", iRTdaBnDpsAsNvm));
814285242Sachim    }
815285242Sachim  }
816285242Sachim  else /* direct mode */
817285242Sachim  {
818285242Sachim    SA_DBG1(("mpiGetNVMDataRsp: OSSA_SUCCESS, IR=0, DataLen=%d\n", ((DlenStatus & NVMD_LEN) >> SHIFT24)));
819285242Sachim    for (i = 0; i < (((DlenStatus & NVMD_LEN) >> SHIFT24)/4); i++)
820285242Sachim    {
821285242Sachim      SA_DBG1(("mpiGetNVMDataRsp: OSSA_SUCCESS, NVMDATA=0x%x\n", pIomb->NVMData[i]));
822285242Sachim    }
823285242Sachim    if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_CONFIG_SEEPROM) ||
824285242Sachim        ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_VPD_FLASH) ||
825285242Sachim        ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_TWI_DEVICES))
826285242Sachim    {
827285242Sachim      /* CB for NVMD */
828285242Sachim  //    char * safe_type_pun = (char *)(&pIomb->NVMData[0]);
829285242Sachim#ifdef UN_USED_FUNC
830285242Sachim      ossaGetNVMDResponseCB(agRoot, agContext, (DlenStatus & NVMD_STAT), DIRECT_MODE,
831285242Sachim         ((DlenStatus & NVMD_LEN) >> SHIFT24), (agsaFrameHandle_t *)safe_type_pun);
832285242Sachim#endif
833285242Sachim    }
834285242Sachim    else if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AAP1_RDUMP) ||
835285242Sachim             ((iRTdaBnDpsAsNvm & NVMD_TYPE) == IOP_RDUMP))
836285242Sachim    {
837285242Sachim#ifdef UN_USED_FUNC
838285242Sachim
839285242Sachim      if ((DlenStatus & NVMD_STAT) == 0)
840285242Sachim      {
841285242Sachim        /* CB for Register Dump */
842285242Sachim        ossaGetRegisterDumpCB(agRoot, agContext, OSSA_SUCCESS);
843285242Sachim      }
844285242Sachim      else
845285242Sachim      {
846285242Sachim        /* CB for Register Dump */
847285242Sachim        ossaGetRegisterDumpCB(agRoot, agContext, OSSA_FAILURE);
848285242Sachim      }
849285242Sachim#endif
850285242Sachim    }
851285242Sachim    else
852285242Sachim    {
853285242Sachim      /* Should not be happened */
854285242Sachim      SA_DBG1(("mpiGetNVMDataRsp: (IR=0)Wrong Device type 0x%x\n", iRTdaBnDpsAsNvm));
855285242Sachim    }
856285242Sachim  }
857285242Sachim
858285242Sachim  /* remove the request from IOMap */
859285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
860285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
861285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
862285242Sachim
863285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
864285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
865285242Sachim  pRequest->valid = agFALSE;
866285242Sachim  /* return the request to free pool */
867285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
868285242Sachim  {
869285242Sachim    SA_DBG1(("mpiGetNVMDataRsp: saving pRequest (%p) for later use\n", pRequest));
870285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
871285242Sachim  }
872285242Sachim  else
873285242Sachim  {
874285242Sachim    /* return the request to free pool */
875285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
876285242Sachim  }
877285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
878285242Sachim
879285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2h");
880285242Sachim
881285242Sachim  /* return value */
882285242Sachim  return ret;
883285242Sachim}
884285242Sachim
885285242Sachim/******************************************************************************/
886285242Sachim/*! \brief Phy Event Response from SPCv
887285242Sachim *
888285242Sachim *  Process Phy Event from SPC
889285242Sachim *
890285242Sachim *  \param agRoot        Handles for this instance of SAS/SATA LL Layer
891285242Sachim *  \param pIomb         pointer of IOMB
892285242Sachim *
893285242Sachim *  \return success or fail
894285242Sachim *
895285242Sachim */
896285242Sachim/*******************************************************************************/
897285242Sachim
898285242SachimGLOBAL bit32 mpiPhyStartEvent(
899285242Sachim  agsaRoot_t        *agRoot,
900285242Sachim  agsaHWEvent_Phy_OUB_t  *pIomb
901285242Sachim  )
902285242Sachim{
903285242Sachim  bit32                    ret = AGSA_RC_SUCCESS;
904285242Sachim  agsaLLRoot_t             *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
905285242Sachim
906285242Sachim  bit32                    phyId;
907285242Sachim  bit32                    IOMBStatus;
908285242Sachim  bit32                    tag;
909285242Sachim
910285242Sachim  agsaIORequestDesc_t *pRequest;
911285242Sachim  agsaContext_t       *agContext;
912285242Sachim  bit32                HwCBStatus;
913285242Sachim
914285242Sachim  if(saRoot == agNULL)
915285242Sachim  {
916285242Sachim    SA_DBG1(("mpiPhyStartEvent: saRoot == agNULL\n"));
917285242Sachim    return(AGSA_RC_FAILURE);
918285242Sachim  }
919285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD, "2H");
920285242Sachim
921285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t, tag)) ;
922285242Sachim
923285242Sachim  /* get request from IOMap */
924285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
925285242Sachim  agContext = saRoot->IOMap[tag].agContext;
926285242Sachim  /* remove the request from IOMap */
927285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
928285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
929285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
930285242Sachim  if (agNULL == pRequest)
931285242Sachim  {
932285242Sachim    SA_DBG1(("mpiPhyStartEvent: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x \n", tag));
933285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2H");
934285242Sachim    return AGSA_RC_FAILURE;
935285242Sachim  }
936285242Sachim
937285242Sachim  SA_DBG1(("mpiPhyStartEvent: Status 0x%X PhyId 0x%X\n",pIomb->Status,pIomb->ReservedPhyId));
938285242Sachim
939285242Sachim  OSSA_READ_LE_32(AGROOT, &IOMBStatus, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,Status ));
940285242Sachim  OSSA_READ_LE_32(AGROOT, &phyId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,ReservedPhyId ));
941285242Sachim
942285242Sachim  switch (IOMBStatus)
943285242Sachim  {
944285242Sachim    case OSSA_MPI_IO_SUCCESS:                  /* PhyStart operation completed successfully */
945285242Sachim      HwCBStatus = 0;
946285242Sachim      saRoot->phys[phyId].linkstatus = 1;
947285242Sachim      SA_DBG1(("mpiPhyStartEvent:MPI_IO_SUCCESS IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
948285242Sachim      /* Callback with PHY_UP */
949285242Sachim      break;
950285242Sachim    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. */
951285242Sachim      HwCBStatus = 1;
952285242Sachim      saRoot->phys[phyId].linkstatus = 0;
953285242Sachim      SA_DBG1(("mpiPhyStartEvent: MPI_ERR_INVALID_PHY_ID IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
954285242Sachim      ret = AGSA_RC_FAILURE;
955285242Sachim      break;
956285242Sachim    case OSSA_MPI_ERR_PHY_ALREADY_STARTED:
957285242Sachim      HwCBStatus = 2;
958285242Sachim      saRoot->phys[phyId].linkstatus = 1;
959285242Sachim      SA_DBG1(("mpiPhyStartEvent: MPI_ERR_PHY_ALREADY_STARTED IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
960285242Sachim      ret = AGSA_RC_FAILURE;
961285242Sachim      break;
962285242Sachim    case OSSA_MPI_ERR_INVALID_ANALOG_TBL_IDX:
963285242Sachim      HwCBStatus = 4;
964285242Sachim      saRoot->phys[phyId].linkstatus = 0;
965285242Sachim      SA_DBG1(("mpiPhyStartEvent: MPI_ERR_INVALID_ANALOG_TBL_IDX IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
966285242Sachim      ret = AGSA_RC_FAILURE;
967285242Sachim      break;
968285242Sachim    default:
969285242Sachim      HwCBStatus = 3;
970285242Sachim      saRoot->phys[phyId].linkstatus = 0;
971285242Sachim      SA_DBG1(("mpiPhyStartEvent: Unknown IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
972285242Sachim      ret = AGSA_RC_FAILURE;
973285242Sachim    break;
974285242Sachim  }
975285242Sachim
976285242Sachim  ossaHwCB(agRoot,agNULL, OSSA_HW_EVENT_PHY_START_STATUS ,((HwCBStatus << SHIFT8) | phyId) ,agContext, agNULL);
977285242Sachim
978285242Sachim  /* return the request to free pool */
979285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
980285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
981285242Sachim  pRequest->valid = agFALSE;
982285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
983285242Sachim  {
984285242Sachim    SA_DBG1(("mpiPhyStartEvent: saving pRequest (%p) for later use\n", pRequest));
985285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
986285242Sachim  }
987285242Sachim  else
988285242Sachim  {
989285242Sachim    /* return the request to free pool */
990285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
991285242Sachim  }
992285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
993285242Sachim
994285242Sachim  return(ret);
995285242Sachim}
996285242Sachim
997285242Sachim
998285242SachimGLOBAL bit32 mpiPhyStopEvent(
999285242Sachim  agsaRoot_t        *agRoot,
1000285242Sachim  agsaHWEvent_Phy_OUB_t  *pIomb
1001285242Sachim  )
1002285242Sachim{
1003285242Sachim  bit32                    ret = AGSA_RC_SUCCESS;
1004285242Sachim  agsaLLRoot_t             *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
1005285242Sachim  bit32                    phyId;
1006285242Sachim
1007285242Sachim  bit32                    IOMBStatus;
1008285242Sachim  bit32                    HwCBStatus;
1009285242Sachim
1010285242Sachim  bit32                    tag;
1011285242Sachim
1012285242Sachim  agsaIORequestDesc_t *pRequest;
1013285242Sachim  agsaContext_t       *agContext;
1014285242Sachim
1015285242Sachim  agsaPhy_t               *pPhy;
1016285242Sachim  agsaPort_t              *pPort;
1017285242Sachim
1018285242Sachim
1019285242Sachim  if(saRoot == agNULL)
1020285242Sachim  {
1021285242Sachim    SA_DBG1(("mpiPhyStopEvent: saRoot == agNULL\n"));
1022285242Sachim    return(AGSA_RC_FAILURE);
1023285242Sachim  }
1024285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t, tag)) ;
1025285242Sachim
1026285242Sachim  /* get request from IOMap */
1027285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
1028285242Sachim  agContext = saRoot->IOMap[tag].agContext;
1029285242Sachim  /* remove the request from IOMap */
1030285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
1031285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
1032285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
1033285242Sachim  if (agNULL == pRequest)
1034285242Sachim  {
1035285242Sachim    SA_DBG1(("mpiPhyStopEvent: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x \n", tag));
1036285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2H");
1037285242Sachim    return AGSA_RC_FAILURE;
1038285242Sachim  }
1039285242Sachim
1040285242Sachim  OSSA_READ_LE_32(AGROOT, &IOMBStatus, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,Status ));
1041285242Sachim  OSSA_READ_LE_32(AGROOT, &phyId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,ReservedPhyId ));
1042285242Sachim  SA_DBG1(("mpiPhyStopEvent: Status %08X PhyId %08X\n",IOMBStatus,phyId));
1043285242Sachim
1044285242Sachim  if(smIS_SPCV(agRoot))
1045285242Sachim  {
1046285242Sachim      phyId &= 0xff;  // SPCv PHY_ID is one byte wide
1047285242Sachim  }
1048285242Sachim
1049285242Sachim  saRoot->phys[phyId].linkstatus = 0;
1050285242Sachim
1051285242Sachim  switch (IOMBStatus)
1052285242Sachim  {
1053285242Sachim    case OSSA_MPI_IO_SUCCESS:                  /* PhyStart operation completed successfully */
1054285242Sachim      SA_DBG1(("mpiPhyStopEvent:MPI_IO_SUCCESS  0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1055285242Sachim      HwCBStatus = 0;
1056285242Sachim      /* Callback with PHY_DOWN */
1057285242Sachim      break;
1058285242Sachim    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. */
1059285242Sachim      SA_DBG1(("mpiPhyStopEvent: MPI_ERR_INVALID_PHY_ID 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1060285242Sachim      HwCBStatus = 1;
1061285242Sachim      break;
1062285242Sachim    case OSSA_MPI_ERR_PHY_NOT_STARTED:  /* An attempt to stop a phy which is not started  */
1063285242Sachim      HwCBStatus = 4;
1064285242Sachim      SA_DBG1(("mpiPhyStopEvent:  0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1065285242Sachim      break;
1066285242Sachim
1067285242Sachim    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  */
1068285242Sachim      HwCBStatus = 2;
1069285242Sachim      SA_DBG1(("mpiPhyStopEvent:  0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1070285242Sachim      break;
1071285242Sachim
1072285242Sachim    default:
1073285242Sachim      HwCBStatus = 3;
1074285242Sachim      SA_DBG1(("mpiPhyStopEvent: Unknown Status 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1075285242Sachim      break;
1076285242Sachim  }
1077285242Sachim
1078285242Sachim
1079285242Sachim  if(HwCBStatus == 0)
1080285242Sachim  {
1081285242Sachim    pPhy = &(saRoot->phys[phyId]);
1082285242Sachim    /* get the port of the phy */
1083285242Sachim    pPort = pPhy->pPort;
1084285242Sachim    if ( agNULL != pPort )
1085285242Sachim    {
1086285242Sachim      SA_DBG1(("siPhyStopCB: phy%d invalidating port\n", phyId));
1087285242Sachim      /* invalid port state, remove the port */
1088285242Sachim      pPort->status |= PORT_INVALIDATING;
1089285242Sachim      saRoot->PortMap[pPort->portId].PortStatus  |= PORT_INVALIDATING;
1090285242Sachim      /* invalid the port */
1091285242Sachim      siPortInvalid(agRoot, pPort);
1092285242Sachim      /* map out the portmap */
1093285242Sachim      saRoot->PortMap[pPort->portId].PortContext = agNULL;
1094285242Sachim      saRoot->PortMap[pPort->portId].PortID = PORT_MARK_OFF;
1095285242Sachim      saRoot->PortMap[pPort->portId].PortStatus  |= PORT_INVALIDATING;
1096285242Sachim      ossaHwCB(agRoot,&(pPort->portContext) , OSSA_HW_EVENT_PHY_STOP_STATUS, ((HwCBStatus << SHIFT8) | phyId ),agContext, agNULL);
1097285242Sachim    }
1098285242Sachim    else
1099285242Sachim    {
1100285242Sachim      SA_DBG1(("siPhyStopCB: phy%d - Port is not established\n", phyId));
1101285242Sachim      ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_PHY_STOP_STATUS, ((HwCBStatus << SHIFT8) | phyId ) , agContext, agNULL);
1102285242Sachim    }
1103285242Sachim
1104285242Sachim    /* set PHY_STOPPED status */
1105285242Sachim    PHY_STATUS_SET(pPhy, PHY_STOPPED);
1106285242Sachim
1107285242Sachim    /* Exclude the phy from a port */
1108285242Sachim    if ( agNULL != pPort )
1109285242Sachim    {
1110285242Sachim      /* Acquire port list lock */
1111285242Sachim      ossaSingleThreadedEnter(agRoot, LL_PORT_LOCK);
1112285242Sachim
1113285242Sachim      /* Delete the phy from the port */
1114285242Sachim      pPort->phyMap[phyId] = agFALSE;
1115285242Sachim      saRoot->phys[phyId].pPort = agNULL;
1116285242Sachim
1117285242Sachim      /* Release port list lock */
1118285242Sachim      ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
1119285242Sachim    }
1120285242Sachim
1121285242Sachim  }
1122285242Sachim  else
1123285242Sachim  {
1124285242Sachim    SA_DBG1(("siPhyStopCB: Error phy%d - Port is not established\n", phyId));
1125285242Sachim    ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_PHY_STOP_STATUS, ((HwCBStatus << SHIFT8) | phyId ) , agContext, agNULL);
1126285242Sachim  }
1127285242Sachim
1128285242Sachim  /* return the request to free pool */
1129285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1130285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
1131285242Sachim  pRequest->valid = agFALSE;
1132285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
1133285242Sachim  {
1134285242Sachim    SA_DBG1(("mpiPhyStartEvent: saving pRequest (%p) for later use\n", pRequest));
1135285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
1136285242Sachim  }
1137285242Sachim  else
1138285242Sachim  {
1139285242Sachim    /* return the request to free pool */
1140285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
1141285242Sachim  }
1142285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1143285242Sachim
1144285242Sachim  return(ret);
1145285242Sachim}
1146285242Sachim
1147285242Sachim
1148285242Sachim/******************************************************************************/
1149285242Sachim/*! \brief Hardware Event Response from SPC
1150285242Sachim *
1151285242Sachim *  Process HW Event from SPC
1152285242Sachim *
1153285242Sachim *  \param agRoot        Handles for this instance of SAS/SATA LL Layer
1154285242Sachim *  \param pIomb         pointer of IOMB
1155285242Sachim *
1156285242Sachim *  \return success or fail
1157285242Sachim *
1158285242Sachim */
1159285242Sachim/*******************************************************************************/
1160285242SachimGLOBAL bit32 mpiHWevent(
1161285242Sachim  agsaRoot_t            *agRoot,
1162285242Sachim  agsaHWEvent_SPC_OUB_t *pIomb
1163285242Sachim  )
1164285242Sachim{
1165285242Sachim  bit32                    ret = AGSA_RC_SUCCESS;
1166285242Sachim  agsaLLRoot_t             *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
1167285242Sachim  agsaIORequestDesc_t      *pRequest;
1168285242Sachim  agsaPortContext_t        *agPortContext;
1169285242Sachim  agsaSASIdentify_t        *IDframe;
1170285242Sachim  agsaFisRegDeviceToHost_t *sataFis;
1171285242Sachim  agsaContext_t            *agContext;
1172285242Sachim  agsaPort_t               *pPort = agNULL;
1173285242Sachim  bit32                    phyId;
1174285242Sachim  bit32                    portId;
1175285242Sachim  bit32                    Event;
1176285242Sachim  bit32                    tag, status;
1177285242Sachim  bit8                     linkRate;
1178285242Sachim  bit32                    LREventPhyIdPortId;
1179285242Sachim  bit32                    npipps, eventParam,npip,port_state;
1180285242Sachim
1181285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2j");
1182285242Sachim
1183285242Sachim  SA_ASSERT((agNULL !=saRoot ), "");
1184285242Sachim  if(saRoot == agNULL)
1185285242Sachim  {
1186285242Sachim    SA_DBG1(("mpiHWevent: saRoot == agNULL\n"));
1187285242Sachim    return(AGSA_RC_FAILURE);
1188285242Sachim  }
1189285242Sachim  if(smIS_SPC(agRoot))
1190285242Sachim  {
1191285242Sachim    OSSA_READ_LE_32(AGROOT, &LREventPhyIdPortId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, LRStatusEventPhyIdPortId));
1192285242Sachim    OSSA_READ_LE_32(AGROOT, &npipps, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, NpipPortState));
1193285242Sachim    OSSA_READ_LE_32(AGROOT, &eventParam, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, EVParam));
1194285242Sachim    SA_DBG2(("mpiHWEvent: S, LREventPhyIdPortId 0x%08x npipps 0x%08x eventParam 0x%08x\n", LREventPhyIdPortId ,npipps ,eventParam ));
1195285242Sachim
1196285242Sachim    /* get port context */
1197285242Sachim    portId = LREventPhyIdPortId & PORTID_MASK;
1198285242Sachim    smTrace(hpDBG_VERY_LOUD,"QK",portId);
1199285242Sachim    /* TP:QK portId */
1200285242Sachim
1201285242Sachim    /* get phyId */
1202285242Sachim    phyId = (LREventPhyIdPortId & PHY_ID_BITS) >> SHIFT4;
1203285242Sachim
1204285242Sachim    smTrace(hpDBG_VERY_LOUD,"QK",npipps);
1205285242Sachim    /* TP:QK npipps */
1206285242Sachim    smTrace(hpDBG_VERY_LOUD,"QL",portId);
1207285242Sachim    /* TP:QL portId */
1208285242Sachim    smTrace(hpDBG_VERY_LOUD,"QM",phyId);
1209285242Sachim    /* TP:QM phyId */
1210285242Sachim
1211285242Sachim    SA_DBG1(("mpiHWEvent:SPC, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1212285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, (npipps & PORT_STATE_MASK)));
1213285242Sachim  }
1214285242Sachim  else
1215285242Sachim  {
1216285242Sachim    OSSA_READ_LE_32(AGROOT, &LREventPhyIdPortId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_V_OUB_t, LRStatEventPortId));
1217285242Sachim    OSSA_READ_LE_32(AGROOT, &npipps, pIomb, OSSA_OFFSET_OF(agsaHWEvent_V_OUB_t, RsvPhyIdNpipRsvPortState));
1218285242Sachim    OSSA_READ_LE_32(AGROOT, &eventParam, pIomb, OSSA_OFFSET_OF(agsaHWEvent_V_OUB_t, EVParam));
1219285242Sachim    SA_DBG2(("mpiHWEvent: V, LREventPhyIdPortId 0x%08x npipps 0x%08x eventParam 0x%08x\n", LREventPhyIdPortId ,npipps ,eventParam ));
1220285242Sachim
1221285242Sachim    smTrace(hpDBG_VERY_LOUD,"QN",npipps);
1222285242Sachim    /* TP:QN npipps */
1223285242Sachim
1224285242Sachim    /* get port context */
1225285242Sachim    portId = LREventPhyIdPortId & PORTID_MASK;
1226285242Sachim
1227285242Sachim    smTrace(hpDBG_VERY_LOUD,"QO",portId);
1228285242Sachim    /* TP:QO portId */
1229285242Sachim
1230285242Sachim    /* get phyId */
1231285242Sachim    phyId = (npipps & PHY_ID_V_BITS) >> SHIFT16;
1232285242Sachim    smTrace(hpDBG_VERY_LOUD,"QP",phyId);
1233285242Sachim    /* TP:QP phyId */
1234285242Sachim
1235285242Sachim    /* get npipps */
1236285242Sachim    npip =(npipps & 0xFF00 ) >> SHIFT4;
1237285242Sachim    port_state  =(npipps & 0xF );
1238285242Sachim    npipps = npip | port_state; // Make it look like SPCs nipps
1239285242Sachim
1240285242Sachim
1241285242Sachim    SA_DBG1(("mpiHWEvent: V, PhyID 0x%x PortID 0x%x NPIP 0x%x PS 0x%x npipps 0x%x\n",
1242285242Sachim                phyId, portId,npip,port_state,npipps));
1243285242Sachim  }
1244285242Sachim
1245285242Sachim  Event = (LREventPhyIdPortId & HW_EVENT_BITS) >> SHIFT8;
1246285242Sachim
1247285242Sachim  /* get Link Rate */
1248285242Sachim  linkRate = (bit8)((LREventPhyIdPortId & LINK_RATE_MASK) >> SHIFT28);
1249285242Sachim  /* get status byte */
1250285242Sachim  status = (LREventPhyIdPortId & STATUS_BITS) >> SHIFT24;
1251285242Sachim
1252285242Sachim  smTrace(hpDBG_VERY_LOUD,"HA",portId);
1253285242Sachim  /* TP:HA portId */
1254285242Sachim  smTrace(hpDBG_VERY_LOUD,"HB",linkRate);
1255285242Sachim  /* TP:HB linkRate */
1256285242Sachim  smTrace(hpDBG_VERY_LOUD,"HC",phyId);
1257285242Sachim  /* TP:HC phyId */
1258285242Sachim  smTrace(hpDBG_VERY_LOUD,"HD",npipps);
1259285242Sachim  /* TP:HD npipps */
1260285242Sachim  smTrace(hpDBG_VERY_LOUD,"HE",status);
1261285242Sachim  /* TP:HE status */
1262285242Sachim
1263285242Sachim  if (portId > saRoot->phyCount)
1264285242Sachim  {
1265285242Sachim    if (OSSA_PORT_NOT_ESTABLISHED == (npipps & PORT_STATE_MASK))
1266285242Sachim    {
1267285242Sachim      /* out of range checking for portId */
1268285242Sachim      SA_DBG1(("mpiHWEvent: PORT_ID is out of range, PhyID %d PortID %d\n",
1269285242Sachim                phyId, portId));
1270285242Sachim      /* port is not estiblished */
1271285242Sachim      agPortContext = agNULL;
1272285242Sachim    }
1273285242Sachim    else
1274285242Sachim    {
1275285242Sachim      /* portId is bad and state is correct - should not happen */
1276285242Sachim      SA_DBG1(("mpiHWEvent: PORT_ID is bad with correct Port State, PhyID %d PortID %d\n",
1277285242Sachim                phyId, portId));
1278285242Sachim      smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2j");
1279285242Sachim      return AGSA_RC_FAILURE;
1280285242Sachim    }
1281285242Sachim  }
1282285242Sachim  else
1283285242Sachim  {
1284285242Sachim    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));
1285285242Sachim    agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
1286285242Sachim  }
1287285242Sachim
1288285242Sachim  if(agPortContext == agNULL)
1289285242Sachim  {
1290285242Sachim    SA_DBG1(("mpiHWEvent: agPortContext is NULL, PhyID %d PortID %d\n",
1291285242Sachim                phyId, portId));
1292285242Sachim  }
1293285242Sachim
1294285242Sachim  smTrace(hpDBG_VERY_LOUD,"HF",Event);
1295285242Sachim  /* TP:HF OSSA_HW_EVENT */
1296285242Sachim
1297285242Sachim  switch (Event)
1298285242Sachim  {
1299285242Sachim    case OSSA_HW_EVENT_SAS_PHY_UP:
1300285242Sachim    {
1301285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_SAS_PHY_UP, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1302285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, (npipps & PORT_STATE_MASK)));
1303285242Sachim
1304285242Sachim      /* get SAS Identify info */
1305285242Sachim      IDframe = (agsaSASIdentify_t *)&pIomb->sasIdentify;
1306285242Sachim      /* Callback about SAS link up */
1307285242Sachim      saRoot->phys[phyId].linkstatus |= 2;
1308285242Sachim      saRoot->phys[phyId].sasIdentify.phyIdentifier = IDframe->phyIdentifier;
1309285242Sachim      saRoot->phys[phyId].sasIdentify.deviceType_addressFrameType = IDframe->deviceType_addressFrameType;
1310285242Sachim
1311285242Sachim      si_memcpy(&(saRoot->phys[phyId].sasIdentify.sasAddressHi),&(IDframe->sasAddressHi),4);
1312285242Sachim      si_memcpy(&(saRoot->phys[phyId].sasIdentify.sasAddressLo),&(IDframe->sasAddressLo),4);
1313285242Sachim      siEventPhyUpRcvd(agRoot, phyId, IDframe, portId, npipps, linkRate);
1314285242Sachim      break;
1315285242Sachim    }
1316285242Sachim    case OSSA_HW_EVENT_SATA_PHY_UP:
1317285242Sachim    {
1318285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_SATA_PHY_UP, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1319285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, (npipps & PORT_STATE_MASK)));
1320285242Sachim
1321285242Sachim      /* get SATA FIS info */
1322285242Sachim      saRoot->phys[phyId].linkstatus |= 2;
1323285242Sachim      sataFis = (agsaFisRegDeviceToHost_t *)&pIomb->sataFis;
1324285242Sachim      /* Callback about SATA Link Up */
1325285242Sachim      siEventSATASignatureRcvd(agRoot, phyId, (void *)sataFis, portId, npipps, linkRate);
1326285242Sachim      break;
1327285242Sachim    }
1328285242Sachim    case OSSA_HW_EVENT_SATA_SPINUP_HOLD:
1329285242Sachim    {
1330285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_SATA_SPINUP_HOLD, PhyID %d\n", phyId));
1331285242Sachim      ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_SATA_SPINUP_HOLD, phyId, agNULL, agNULL);
1332285242Sachim      break;
1333285242Sachim    }
1334285242Sachim    case OSSA_HW_EVENT_PHY_DOWN:
1335285242Sachim    {
1336285242Sachim      agsaPhy_t *pPhy = &(saRoot->phys[phyId]);
1337285242Sachim
1338285242Sachim      if(pPhy) {
1339285242Sachim		osti_memset(&pPhy->sasIdentify,0,sizeof(agsaSASIdentify_t));
1340285242Sachim      }
1341285242Sachim      saRoot->phys[phyId].linkstatus &= 1;
1342285242Sachim      if (agNULL != agPortContext)
1343285242Sachim      {
1344285242Sachim        pPort = (agsaPort_t *) (agPortContext->sdkData);
1345285242Sachim      }
1346285242Sachim
1347285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1348285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1349285242Sachim
1350285242Sachim      /* callback */
1351285242Sachim      if ( agNULL != pPort )
1352285242Sachim      {
1353285242Sachim        if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
1354285242Sachim        {
1355285242Sachim          pPort->status &= ~PORT_INVALIDATING;
1356285242Sachim          saRoot->PortMap[portId].PortStatus  &= ~PORT_INVALIDATING;
1357285242Sachim          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN, PhyID %d  ~PORT_INVALIDATING \n", phyId));
1358285242Sachim        }
1359285242Sachim        else
1360285242Sachim        {
1361285242Sachim          if (OSSA_PORT_INVALID == (npipps & PORT_STATE_MASK))
1362285242Sachim          {
1363285242Sachim            /* set port invalid flag */
1364285242Sachim            pPort->status |= PORT_INVALIDATING;
1365285242Sachim            saRoot->PortMap[portId].PortStatus  |= PORT_INVALIDATING;
1366285242Sachim            SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN PortInvalid portID %d PortContext %p NPIP 0x%x\n", portId, agPortContext,npipps));
1367285242Sachim          }
1368285242Sachim          else
1369285242Sachim          {
1370285242Sachim            if (OSSA_PORT_IN_RESET == (npipps & PORT_STATE_MASK))
1371285242Sachim            {
1372285242Sachim              SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN PortInReset portID %d PortContext %p\n", portId, agPortContext));
1373285242Sachim            }
1374285242Sachim            else
1375285242Sachim            {
1376285242Sachim              SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN Not PortInReset portID %d PortContext %p\n", portId, agPortContext));
1377285242Sachim            }
1378285242Sachim          }
1379285242Sachim        }
1380285242Sachim
1381285242Sachim        /* report PhyId, NPIP, PortState */
1382285242Sachim        phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1383285242Sachim        /* Callback with PHY_DOWN */
1384285242Sachim        ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_DOWN, phyId, agNULL, agNULL);
1385285242Sachim      }
1386285242Sachim      else
1387285242Sachim      {
1388285242Sachim        /* no portcontext.- error */
1389285242Sachim        SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN PhyDown pPort is NULL.\n"));
1390285242Sachim      }
1391285242Sachim
1392285242Sachim      /* set PHY_DOWN status */
1393285242Sachim      PHY_STATUS_SET(pPhy, PHY_DOWN);
1394285242Sachim      break;
1395285242Sachim    }
1396285242Sachim    case OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC:
1397285242Sachim    {
1398285242Sachim      agsaPhyErrCountersPage_t errorParam;
1399285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1400285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1401285242Sachim      si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1402285242Sachim      errorParam.inboundCRCError = eventParam;
1403285242Sachim      /* report PhyId, NPIP, PortState */
1404285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1405285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC, phyId, (void *)&errorParam, agNULL);
1406285242Sachim      break;
1407285242Sachim    }
1408285242Sachim    case OSSA_HW_EVENT_HARD_RESET_RECEIVED:
1409285242Sachim    {
1410285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_HARD_RESET_RECEIVED, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1411285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1412285242Sachim      /* report PhyId, NPIP, PortState */
1413285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1414285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_HARD_RESET_RECEIVED, phyId, agNULL, agNULL);
1415285242Sachim      break;
1416285242Sachim    }
1417285242Sachim    case OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD:
1418285242Sachim    {
1419285242Sachim      agsaPhyErrCountersPage_t errorParam;
1420285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_INVALID_DWORD, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1421285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1422285242Sachim      si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1423285242Sachim      errorParam.invalidDword = eventParam;
1424285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1425285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD, phyId, (void *)&errorParam, agNULL);
1426285242Sachim      break;
1427285242Sachim    }
1428285242Sachim    case OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR:
1429285242Sachim    {
1430285242Sachim      agsaPhyErrCountersPage_t errorParam;
1431285242Sachim      SA_DBG3(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_DISPARITY_ERROR, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1432285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1433285242Sachim      /* report PhyId, NPIP, PortState */
1434285242Sachim      si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1435285242Sachim      errorParam.runningDisparityError = eventParam;
1436285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1437285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR, phyId, (void *)&errorParam, agNULL);
1438285242Sachim      break;
1439285242Sachim    }
1440285242Sachim    case OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION:
1441285242Sachim    {
1442285242Sachim      agsaPhyErrCountersPage_t errorParam;
1443285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1444285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1445285242Sachim      /* report PhyId, NPIP, PortState */
1446285242Sachim      si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1447285242Sachim      errorParam.codeViolation = eventParam;
1448285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1449285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION, phyId, (void *)&errorParam, agNULL);
1450285242Sachim      break;
1451285242Sachim    }
1452285242Sachim    case OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH:
1453285242Sachim    {
1454285242Sachim      agsaPhyErrCountersPage_t errorParam;
1455285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_LOSS_OF_DWORD_SYNCH, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1456285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1457285242Sachim      /* report PhyId, NPIP, PortState */
1458285242Sachim      si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1459285242Sachim      errorParam.lossOfDwordSynch = eventParam;
1460285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1461285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH, phyId, (void *)&errorParam, agNULL);
1462285242Sachim      break;
1463285242Sachim    }
1464285242Sachim    case OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO:
1465285242Sachim    {
1466285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1467285242Sachim        phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1468285242Sachim
1469285242Sachim      if (agNULL != agPortContext)
1470285242Sachim      {
1471285242Sachim        pPort = (agsaPort_t *) (agPortContext->sdkData);
1472285242Sachim      }
1473285242Sachim      else
1474285242Sachim      {
1475285242Sachim        SA_ASSERT((agPortContext), "agPortContext agNULL was there a PHY UP?");
1476285242Sachim        return(AGSA_RC_FAILURE);
1477285242Sachim      }
1478285242Sachim
1479285242Sachim      /* report PhyId, NPIP, PortState */
1480285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1481285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO, phyId, agNULL, agNULL);
1482285242Sachim
1483285242Sachim      if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
1484285242Sachim      {
1485285242Sachim         pPort->status &= ~PORT_INVALIDATING;
1486285242Sachim         saRoot->PortMap[portId].PortStatus  &= ~PORT_INVALIDATING;
1487285242Sachim         SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO NOT PORT_INVALIDATING portID %d PortContext %p\n", portId, agPortContext));
1488285242Sachim      }
1489285242Sachim      else
1490285242Sachim      {
1491285242Sachim        if (OSSA_PORT_INVALID == (npipps & PORT_STATE_MASK))
1492285242Sachim        {
1493285242Sachim          /* set port invalid flag */
1494285242Sachim          pPort->status |= PORT_INVALIDATING;
1495285242Sachim          saRoot->PortMap[portId].PortStatus  |= PORT_INVALIDATING;
1496285242Sachim          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO PORT_INVALIDATING portID %d PortContext %p\n", portId, agPortContext));
1497285242Sachim         }
1498285242Sachim        else
1499285242Sachim        {
1500285242Sachim          if (OSSA_PORT_IN_RESET == (npipps & PORT_STATE_MASK))
1501285242Sachim          {
1502285242Sachim            SA_DBG1(("mpiHWEvent: PortInReset portID %d PortContext %p\n", portId, agPortContext));
1503285242Sachim          }
1504285242Sachim        }
1505285242Sachim      }
1506285242Sachim      break;
1507285242Sachim    }
1508285242Sachim    case OSSA_HW_EVENT_PORT_RECOVER:
1509285242Sachim    {
1510285242Sachim      if (agNULL != agPortContext)
1511285242Sachim      {
1512285242Sachim        pPort = (agsaPort_t *) (agPortContext->sdkData);
1513285242Sachim      }
1514285242Sachim
1515285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVER, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1516285242Sachim        phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1517285242Sachim
1518285242Sachim      if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
1519285242Sachim      {
1520285242Sachim        if (agNULL != pPort)
1521285242Sachim        {
1522285242Sachim          /* reset port invalid flag */
1523285242Sachim          pPort->status &= ~PORT_INVALIDATING;
1524285242Sachim          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVER NOT PORT_INVALIDATING portID %d PortContext %p\n", portId, agPortContext));
1525285242Sachim        }
1526285242Sachim        saRoot->PortMap[portId].PortStatus  &= ~PORT_INVALIDATING;
1527285242Sachim      }
1528285242Sachim      /* get SAS Identify info */
1529285242Sachim      IDframe = (agsaSASIdentify_t *)&pIomb->sasIdentify;
1530285242Sachim      /* report PhyId, NPIP, PortState and LinkRate */
1531285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16) | (linkRate << SHIFT8);
1532285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RECOVER, phyId, agNULL, (void *)IDframe);
1533285242Sachim      break;
1534285242Sachim    }
1535285242Sachim    case OSSA_HW_EVENT_PHY_STOP_STATUS:
1536285242Sachim    {
1537285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS PhyId=0x%x, status=0x%x eventParam=0x%x\n", phyId, status,eventParam));
1538285242Sachim      OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, EVParam));
1539285242Sachim
1540285242Sachim      switch(eventParam)
1541285242Sachim      {
1542285242Sachim        case 0:
1543285242Sachim          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS Stopped 0\n" ));
1544285242Sachim        break;
1545285242Sachim        case 1:
1546285242Sachim          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS INVALID_PHY 1\n" ));
1547285242Sachim        break;
1548285242Sachim        case 2:
1549285242Sachim          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS DEVICES_ATTACHED 2\n" ));
1550285242Sachim        break;
1551285242Sachim        case 3:
1552285242Sachim          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS OTHER_FAILURE 3\n" ));
1553285242Sachim        break;
1554285242Sachim        case 4:
1555285242Sachim          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS PHY_NOT_ENABLED 4\n" ));
1556285242Sachim        break;
1557285242Sachim        default:
1558285242Sachim          SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS Unknown code 0x%x\n", eventParam));
1559285242Sachim          break;
1560285242Sachim      }
1561285242Sachim
1562285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS phyId 0x%x status 0x%x eventParam 0x%x\n", phyId, status,eventParam));
1563285242Sachim      /* get request from IOMap */
1564285242Sachim      pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
1565285242Sachim      SA_ASSERT((pRequest), "pRequest NULL");
1566285242Sachim      SA_ASSERT((pRequest->valid), "pRequest->valid");
1567285242Sachim
1568285242Sachim      agContext = saRoot->IOMap[tag].agContext;
1569285242Sachim
1570285242Sachim      siPhyStopCB(agRoot, phyId, status, agContext, portId, npipps);
1571285242Sachim
1572285242Sachim      /* remove the request from IOMap */
1573285242Sachim      saRoot->IOMap[tag].Tag = MARK_OFF;
1574285242Sachim      saRoot->IOMap[tag].IORequest = agNULL;
1575285242Sachim      saRoot->IOMap[tag].agContext = agNULL;
1576285242Sachim
1577285242Sachim      ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1578285242Sachim      pRequest->valid = agFALSE;
1579285242Sachim      /* return the request to free pool */
1580285242Sachim      if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
1581285242Sachim      {
1582285242Sachim        SA_DBG1(("mpiHWevent: saving pRequest (%p) for later use\n", pRequest));
1583285242Sachim        saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
1584285242Sachim      }
1585285242Sachim      else
1586285242Sachim      {
1587285242Sachim        /* return the request to free pool */
1588285242Sachim        saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
1589285242Sachim      }
1590285242Sachim      ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1591285242Sachim      break;
1592285242Sachim    }
1593285242Sachim    case OSSA_HW_EVENT_BROADCAST_CHANGE:
1594285242Sachim    {
1595285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_CHANGE, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1596285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1597285242Sachim      /* report PhyId, NPIP, PortState */
1598285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1599285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE, phyId, agNULL, agNULL);
1600285242Sachim      break;
1601285242Sachim    }
1602285242Sachim    case OSSA_HW_EVENT_BROADCAST_SES:
1603285242Sachim    {
1604285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_CHANGE_SES, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1605285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1606285242Sachim      /* report PhyId, NPIP, PortState */
1607285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1608285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_SES, phyId, agNULL, agNULL);
1609285242Sachim      break;
1610285242Sachim    }
1611285242Sachim    case OSSA_HW_EVENT_BROADCAST_EXP:
1612285242Sachim    {
1613285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_EXP, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1614285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1615285242Sachim      /* report PhyId, NPIP, PortState */
1616285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1617285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_EXP, phyId, agNULL, agNULL);
1618285242Sachim      break;
1619285242Sachim    }
1620285242Sachim    case OSSA_HW_EVENT_ID_FRAME_TIMEOUT:
1621285242Sachim    {
1622285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_ID_FRAME_TIMEOUT, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1623285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1624285242Sachim      /* report PhyId, NPIP, PortState */
1625285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1626285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_ID_FRAME_TIMEOUT, phyId, agNULL, agNULL);
1627285242Sachim      break;
1628285242Sachim    }
1629285242Sachim    case OSSA_HW_EVENT_PHY_START_STATUS:
1630285242Sachim    {
1631285242Sachim      OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, EVParam)) ;
1632285242Sachim      /* get request from IOMap */
1633285242Sachim      pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
1634285242Sachim
1635285242Sachim      SA_ASSERT((pRequest), "pRequest");
1636285242Sachim      if( pRequest == agNULL)
1637285242Sachim      {
1638285242Sachim         SA_DBG1(("mpiHWevent: pRequest (%p) NULL\n", pRequest));
1639285242Sachim         ret = AGSA_RC_FAILURE;
1640285242Sachim         break;
1641285242Sachim      }
1642285242Sachim
1643285242Sachim      agContext = saRoot->IOMap[tag].agContext;
1644285242Sachim
1645285242Sachim      /* makeup for CB */
1646285242Sachim      status = (status << 8) | phyId;
1647285242Sachim      ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_PHY_START_STATUS, status, agContext, agNULL);
1648285242Sachim
1649285242Sachim      /* remove the request from IOMap */
1650285242Sachim      saRoot->IOMap[tag].Tag = MARK_OFF;
1651285242Sachim      saRoot->IOMap[tag].IORequest = agNULL;
1652285242Sachim      saRoot->IOMap[tag].agContext = agNULL;
1653285242Sachim
1654285242Sachim      ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1655285242Sachim      SA_ASSERT((pRequest->valid), "pRequest->valid");
1656285242Sachim      pRequest->valid = agFALSE;
1657285242Sachim      /* return the request to free pool */
1658285242Sachim      if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
1659285242Sachim      {
1660285242Sachim        SA_DBG1(("mpiHWevent: saving pRequest (%p) for later use\n", pRequest));
1661285242Sachim        saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
1662285242Sachim      }
1663285242Sachim      else
1664285242Sachim      {
1665285242Sachim        /* return the request to free pool */
1666285242Sachim        saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
1667285242Sachim      }
1668285242Sachim      ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1669285242Sachim
1670285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_START_STATUS, PhyID %d\n", phyId));
1671285242Sachim
1672285242Sachim      break;
1673285242Sachim    }
1674285242Sachim    case OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED:
1675285242Sachim    {
1676285242Sachim      agsaPhyErrCountersPage_t errorParam;
1677285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1678285242Sachim                phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1679285242Sachim      /* report PhyId, NPIP, PortState */
1680285242Sachim      si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1681285242Sachim      errorParam.phyResetProblem = eventParam;
1682285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1683285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED, phyId, (void *)&errorParam, agNULL);
1684285242Sachim      break;
1685285242Sachim    }
1686285242Sachim    case OSSA_HW_EVENT_PORT_RESET_TIMER_TMO:
1687285242Sachim    {
1688285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RESET_TIMER_TMO, PhyID %d PortID %d\n", phyId, portId));
1689285242Sachim      /* report PhyId, NPIP, PortState */
1690285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1691285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RESET_TIMER_TMO, phyId, agNULL, agNULL);
1692285242Sachim      break;
1693285242Sachim    }
1694285242Sachim    case OSSA_HW_EVENT_PORT_RESET_COMPLETE:
1695285242Sachim    {
1696285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RESET_COMPLETE, PhyID %d PortID %d\n", phyId, portId));
1697285242Sachim      /* get SAS Identify info */
1698285242Sachim      IDframe = (agsaSASIdentify_t *)&pIomb->sasIdentify;
1699285242Sachim      /* report PhyId, NPIP, PortState and LinkRate */
1700285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16) | (linkRate << SHIFT8);
1701285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RESET_COMPLETE, phyId, agNULL, (void *)IDframe);
1702285242Sachim      break;
1703285242Sachim    }
1704285242Sachim    case OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT:
1705285242Sachim    {
1706285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT, PhyID %d PortID %d\n", phyId, portId));
1707285242Sachim      /* report PhyId, NPIP, PortState */
1708285242Sachim      phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1709285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT, phyId, agNULL, agNULL);
1710285242Sachim      break;
1711285242Sachim    }
1712285242Sachim    case OSSA_HW_EVENT_IT_NEXUS_LOSS:
1713285242Sachim    {
1714285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_IT_NEXUS_LOSS, PhyID %d PortID %d status 0x%X\n", phyId, portId,status));
1715285242Sachim      break;
1716285242Sachim    }
1717285242Sachim    case OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED:
1718285242Sachim    {
1719285242Sachim      SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED, PhyID %d PortID %d status 0x%X\n", phyId, portId,status));
1720285242Sachim      ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED, phyId, agNULL, agNULL);
1721285242Sachim      break;
1722285242Sachim    }
1723285242Sachim
1724285242Sachim    default:
1725285242Sachim    {
1726285242Sachim      SA_DBG1(("mpiHWEvent: Unknown HW Event 0x%x status 0x%X\n", Event ,status));
1727285242Sachim      break;
1728285242Sachim    }
1729285242Sachim  }
1730285242Sachim
1731285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2j");
1732285242Sachim  return ret;
1733285242Sachim}
1734285242Sachim
1735285242Sachim/******************************************************************************/
1736285242Sachim/*! \brief SPC MPI SMP Completion
1737285242Sachim *
1738285242Sachim *  This function handles the SMP completion.
1739285242Sachim *
1740285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA hardware
1741285242Sachim *  \param pIomb        pointer of Message1
1742285242Sachim *  \param bc           buffer count
1743285242Sachim *
1744285242Sachim *  \return The read value
1745285242Sachim *
1746285242Sachim */
1747285242Sachim/*******************************************************************************/
1748285242SachimGLOBAL bit32 mpiSMPCompletion(
1749285242Sachim  agsaRoot_t             *agRoot,
1750285242Sachim  agsaSMPCompletionRsp_t *pIomb
1751285242Sachim  )
1752285242Sachim{
1753285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
1754285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
1755285242Sachim  bit32               status;
1756285242Sachim  bit32               tag;
1757285242Sachim  bit32               param;
1758285242Sachim  agsaIORequestDesc_t *pRequest;
1759285242Sachim
1760285242Sachim  SA_DBG3(("mpiSMPCompletion: start, HTAG=0x%x\n", pIomb->tag));
1761285242Sachim
1762285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2k");
1763285242Sachim
1764285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSMPCompletionRsp_t, tag)) ;
1765285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSMPCompletionRsp_t, status)) ;
1766285242Sachim  OSSA_READ_LE_32(AGROOT, &param, pIomb, OSSA_OFFSET_OF(agsaSMPCompletionRsp_t, param)) ;
1767285242Sachim   /* get SMP request from IOMap */
1768285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
1769285242Sachim  if (agNULL == pRequest)
1770285242Sachim  {
1771285242Sachim    SA_DBG1(("mpiSMPCompletion: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x PARAM=0x%x\n", tag, status, param));
1772285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2k");
1773285242Sachim    return AGSA_RC_FAILURE;
1774285242Sachim  }
1775285242Sachim
1776285242Sachim  switch (status)
1777285242Sachim  {
1778285242Sachim  case OSSA_IO_SUCCESS:
1779285242Sachim    SA_DBG3(("mpiSMPCompletion: OSSA_IO_SUCCESS HTAG = 0x%x\n", tag));
1780285242Sachim    /* process message */
1781285242Sachim    siSMPRespRcvd(agRoot, pIomb, param, tag);
1782285242Sachim    break;
1783285242Sachim
1784285242Sachim  case OSSA_IO_OVERFLOW:
1785285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OVERFLOW HTAG = 0x%x\n", tag));
1786285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OVERFLOW++;
1787285242Sachim    /* SMP failed */
1788285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1789285242Sachim    break;
1790285242Sachim
1791285242Sachim  case OSSA_IO_ABORTED:
1792285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_ABORTED HTAG = 0x%x\n", tag));
1793285242Sachim
1794285242Sachim    saRoot->IoErrorCount.agOSSA_IO_ABORTED++;
1795285242Sachim#ifdef SA_PRINTOUT_IN_WINDBG
1796285242Sachim#ifndef DBG
1797285242Sachim        DbgPrint("agOSSA_IO_ABORTED  %d\n",  saRoot->IoErrorCount.agOSSA_IO_ABORTED);
1798285242Sachim#endif /* DBG  */
1799285242Sachim#endif /* SA_PRINTOUT_IN_WINDBG  */
1800285242Sachim    /* SMP failed */
1801285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1802285242Sachim    break;
1803285242Sachim
1804285242Sachim  case OSSA_IO_NO_DEVICE:
1805285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_NO_DEVICE HTAG = 0x%x\n", tag));
1806285242Sachim    saRoot->IoErrorCount.agOSSA_IO_NO_DEVICE++;
1807285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1808285242Sachim    break;
1809285242Sachim
1810285242Sachim  case OSSA_IO_ERROR_HW_TIMEOUT:
1811285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_ERROR_HW_TIMEOUT HTAG = 0x%x\n", tag));
1812285242Sachim    saRoot->IoErrorCount.agOSSA_IO_ERROR_HW_TIMEOUT++;
1813285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1814285242Sachim    break;
1815285242Sachim
1816285242Sachim  case OSSA_IO_XFER_ERROR_BREAK:
1817285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_ERROR_BREAK HTAG = 0x%x\n", tag));
1818285242Sachim    saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_BREAK++;
1819285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1820285242Sachim    break;
1821285242Sachim
1822285242Sachim  case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
1823285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_ERROR_PHY_NOT_READY HTAG = 0x%x\n", tag));
1824285242Sachim    saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
1825285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1826285242Sachim    break;
1827285242Sachim
1828285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
1829285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED HTAG = 0x%x\n", tag));
1830285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
1831285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1832285242Sachim    break;
1833285242Sachim
1834285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
1835285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION HTAG = 0x%x\n", tag));
1836285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
1837285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1838285242Sachim    break;
1839285242Sachim
1840285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_BREAK:
1841285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_BREAK HTAG = 0x%x\n", tag));
1842285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
1843285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1844285242Sachim    break;
1845285242Sachim
1846285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
1847285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS HTAG = 0x%x\n", tag));
1848285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
1849285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1850285242Sachim    break;
1851285242Sachim
1852285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
1853285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION HTAG = 0x%x\n", tag));
1854285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
1855285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1856285242Sachim    break;
1857285242Sachim
1858285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
1859285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED HTAG = 0x%x\n", tag));
1860285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
1861285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1862285242Sachim    break;
1863285242Sachim
1864285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
1865285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION HTAG = 0x%x\n", tag));
1866285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
1867285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1868285242Sachim    break;
1869285242Sachim
1870285242Sachim  case OSSA_IO_XFER_ERROR_RX_FRAME:
1871285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_ERROR_RX_FRAME HTAG = 0x%x\n", tag));
1872285242Sachim    saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_RX_FRAME++;
1873285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1874285242Sachim    break;
1875285242Sachim
1876285242Sachim  case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
1877285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT HTAG = 0x%x\n", tag));
1878285242Sachim    saRoot->IoErrorCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
1879285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1880285242Sachim    break;
1881285242Sachim
1882285242Sachim  case OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE:
1883285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE HTAG = 0x%x\n", tag));
1884285242Sachim    saRoot->IoErrorCount.agOSSA_IO_ERROR_INTERNAL_SMP_RESOURCE++;
1885285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1886285242Sachim    break;
1887285242Sachim
1888285242Sachim  case OSSA_IO_PORT_IN_RESET:
1889285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_PORT_IN_RESET HTAG = 0x%x\n", tag));
1890285242Sachim    saRoot->IoErrorCount.agOSSA_IO_PORT_IN_RESET++;
1891285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1892285242Sachim    break;
1893285242Sachim
1894285242Sachim  case OSSA_IO_DS_NON_OPERATIONAL:
1895285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_DS_NON_OPERATIONAL HTAG = 0x%x\n", tag));
1896285242Sachim    saRoot->IoErrorCount.agOSSA_IO_DS_NON_OPERATIONAL++;
1897285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1898285242Sachim    break;
1899285242Sachim
1900285242Sachim  case OSSA_IO_DS_IN_RECOVERY:
1901285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_DS_IN_RECOVERY HTAG = 0x%x\n", tag));
1902285242Sachim    saRoot->IoErrorCount.agOSSA_IO_DS_IN_RECOVERY++;
1903285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1904285242Sachim    break;
1905285242Sachim
1906285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY:
1907285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY HTAG = 0x%x\n", tag));
1908285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY++;
1909285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1910285242Sachim    break;
1911285242Sachim
1912285242Sachim  case OSSA_IO_ABORT_IN_PROGRESS:
1913285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_ABORT_IN_PROGRESS HTAG = 0x%x\n", tag));
1914285242Sachim    saRoot->IoErrorCount.agOSSA_IO_ABORT_IN_PROGRESS++;
1915285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1916285242Sachim    break;
1917285242Sachim
1918285242Sachim  case OSSA_IO_ABORT_DELAYED:
1919285242Sachim    SA_DBG1(("mpiSMPCompletion:OSSA_IO_ABORT_DELAYED  HTAG = 0x%x\n", tag));
1920285242Sachim    saRoot->IoErrorCount.agOSSA_IO_ABORT_DELAYED++;
1921285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1922285242Sachim    break;
1923285242Sachim
1924285242Sachim  case OSSA_IO_INVALID_LENGTH:
1925285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_INVALID_LENGTH HTAG = 0x%x\n", tag));
1926285242Sachim    saRoot->IoErrorCount.agOSSA_IO_INVALID_LENGTH++;
1927285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1928285242Sachim    break;
1929285242Sachim
1930285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
1931285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x\n", tag));
1932285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
1933285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1934285242Sachim    break;
1935285242Sachim
1936285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
1937285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO HTAG = 0x%x\n", tag));
1938285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO++;
1939285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1940285242Sachim    break;
1941285242Sachim
1942285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
1943285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST HTAG = 0x%x\n", tag));
1944285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
1945285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1946285242Sachim    break;
1947285242Sachim
1948285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
1949285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE HTAG = 0x%x\n", tag));
1950285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
1951285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1952285242Sachim    break;
1953285242Sachim
1954285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
1955285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED HTAG = 0x%x\n", tag));
1956285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
1957285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1958285242Sachim    break;
1959285242Sachim
1960285242Sachim  case OSSA_IO_DS_INVALID:
1961285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_DS_INVALID HTAG = 0x%x\n", tag));
1962285242Sachim    saRoot->IoErrorCount.agOSSA_IO_DS_INVALID++;
1963285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1964285242Sachim    break;
1965285242Sachim
1966285242Sachim  case OSSA_IO_XFER_READ_COMPL_ERR:
1967285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_READ_COMPL_ERR HTAG = 0x%x\n", tag));
1968285242Sachim    saRoot->IoErrorCount.agOSSA_IO_XFER_READ_COMPL_ERR++;
1969285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1970285242Sachim    break;
1971285242Sachim
1972285242Sachim  case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
1973285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE HTAG = 0x%x\n", tag));
1974285242Sachim    saRoot->IoErrorCount.agOSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE++;
1975285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1976285242Sachim    break;
1977285242Sachim
1978285242Sachim  case OSSA_MPI_ERR_OFFLOAD_DIF_OR_ENC_NOT_ENABLED:
1979285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE HTAG = 0x%x\n", tag));
1980285242Sachim    saRoot->IoErrorCount.agOSSA_MPI_ERR_OFFLOAD_DIF_OR_ENC_NOT_ENABLED++;
1981285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1982285242Sachim    break;
1983285242Sachim
1984285242Sachim  case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED:
1985285242Sachim    SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED HTAG = 0x%x\n", tag));
1986285242Sachim    saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED++;
1987285242Sachim    siAbnormal(agRoot, pRequest, status, 0, 0);
1988285242Sachim    break;
1989285242Sachim
1990285242Sachim  default:
1991285242Sachim    SA_DBG1(("mpiSMPCompletion: Unknown Status = 0x%x Tag 0x%x\n", status, tag));
1992285242Sachim    saRoot->IoErrorCount.agOSSA_IO_UNKNOWN_ERROR++;
1993285242Sachim    /* not allowed case. Therefore, assert */
1994285242Sachim    SA_ASSERT((agFALSE), "mpiSMPCompletion: Unknown Status");
1995285242Sachim    break;
1996285242Sachim  }
1997285242Sachim
1998285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2k");
1999285242Sachim  return ret;
2000285242Sachim}
2001285242Sachim
2002285242Sachim/******************************************************************************/
2003285242Sachim/*! \brief SPC MPI Get Device Handle Command Response
2004285242Sachim *
2005285242Sachim *  This function handles the response of Get Device Handle Command.
2006285242Sachim *
2007285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA hardware
2008285242Sachim *  \param pIomb        pointer of Message
2009285242Sachim *  \param bc           buffer count
2010285242Sachim *
2011285242Sachim *  \return The read value
2012285242Sachim *
2013285242Sachim */
2014285242Sachim/*******************************************************************************/
2015285242SachimGLOBAL bit32 mpiGetDevHandleRsp(
2016285242Sachim  agsaRoot_t             *agRoot,
2017285242Sachim  agsaGetDevHandleRsp_t  *pIomb
2018285242Sachim  )
2019285242Sachim{
2020285242Sachim  bit32 ret = AGSA_RC_SUCCESS;
2021285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2022285242Sachim  agsaIORequestDesc_t *pRequest;
2023285242Sachim  agsaPortContext_t   *agPortContext;
2024285242Sachim  agsaContext_t       *agContext;
2025285242Sachim  agsaDeviceDesc_t    *pDevice;
2026285242Sachim  bit8 portId;
2027285242Sachim  bit32 deviceid=0, deviceIdc, i;
2028285242Sachim  bit32 DeviceIdcPortId, tag;
2029285242Sachim
2030285242Sachim  SA_DBG3(("mpiGetDevHandleRsp: start, HTAG=0x%x\n", pIomb->tag));
2031285242Sachim
2032285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2m");
2033285242Sachim
2034285242Sachim  OSSA_READ_LE_32(AGROOT, &DeviceIdcPortId, pIomb, OSSA_OFFSET_OF(agsaGetDevHandleRsp_t, DeviceIdcPortId)) ;
2035285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDevHandleRsp_t, tag)) ;
2036285242Sachim  /* get request from IOMap */
2037285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2038285242Sachim  agContext = saRoot->IOMap[tag].agContext;
2039285242Sachim  /* remove the request from IOMap */
2040285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
2041285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
2042285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
2043285242Sachim  if (agNULL == pRequest)
2044285242Sachim  {
2045285242Sachim    SA_DBG1(("mpiGetDevHandleRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x DeviceIdcPortId=0x%x\n", tag, DeviceIdcPortId));
2046285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2m");
2047285242Sachim    return AGSA_RC_FAILURE;
2048285242Sachim  }
2049285242Sachim
2050285242Sachim  /* get port context */
2051285242Sachim  portId = (bit8)(DeviceIdcPortId & PORTID_MASK);
2052285242Sachim  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));
2053285242Sachim  agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
2054285242Sachim
2055285242Sachim  /* get Device ID count */
2056285242Sachim  deviceIdc = (bit8)((DeviceIdcPortId & DEVICE_IDC_BITS) >> SHIFT8);
2057285242Sachim
2058285242Sachim  /* based on the deviceIDC to get all device handles */
2059285242Sachim  for (i = 0; i < deviceIdc; i++)
2060285242Sachim  {
2061285242Sachim    OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaGetDevHandleRsp_t, deviceId[i])) ;
2062285242Sachim    /* find device handle from device index */
2063285242Sachim    pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
2064285242Sachim    if (pDevice->targetDevHandle.sdkData)
2065285242Sachim     saRoot->DeviceHandle[i] = &(pDevice->targetDevHandle);
2066285242Sachim    else
2067285242Sachim     saRoot->DeviceHandle[i] = &(pDevice->initiatorDevHandle);
2068285242Sachim  }
2069285242Sachim
2070285242Sachim  SA_DBG1(("mpiGetDevHandleRsp:deviceid 0x%x  0x%x\n",deviceid, (deviceid & DEVICE_ID_BITS)));
2071285242Sachim  /* call back oslayer */
2072285242Sachim  ossaGetDeviceHandlesCB(agRoot, agContext, agPortContext, saRoot->DeviceHandle, deviceIdc);
2073285242Sachim
2074285242Sachim  /* return the request to free pool */
2075285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2076285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
2077285242Sachim  pRequest->valid = agFALSE;
2078285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2079285242Sachim  {
2080285242Sachim    SA_DBG1(("mpiGetDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
2081285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2082285242Sachim  }
2083285242Sachim  else
2084285242Sachim  {
2085285242Sachim    /* return the request to free pool */
2086285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2087285242Sachim  }
2088285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2089285242Sachim
2090285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2m");
2091285242Sachim
2092285242Sachim  return ret;
2093285242Sachim}
2094285242Sachim
2095285242Sachim/******************************************************************************/
2096285242Sachim/*! \brief SPC MPI Phy Control Command Response
2097285242Sachim *
2098285242Sachim *  This function handles the response of PHY Control Command.
2099285242Sachim *
2100285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA hardware
2101285242Sachim *  \param pIomb        pointer of Message
2102285242Sachim *
2103285242Sachim *  \return The read value
2104285242Sachim *
2105285242Sachim */
2106285242Sachim/*******************************************************************************/
2107285242SachimGLOBAL bit32 mpiPhyCntrlRsp(
2108285242Sachim  agsaRoot_t             *agRoot,
2109285242Sachim  agsaLocalPhyCntrlRsp_t *pIomb
2110285242Sachim  )
2111285242Sachim{
2112285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
2113285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2114285242Sachim  agsaIORequestDesc_t *pRequest;
2115285242Sachim  agsaContext_t       *agContext = agNULL;
2116285242Sachim  bit32               phyId, operation, status, tag, phyOpId;
2117285242Sachim
2118285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2n");
2119285242Sachim
2120285242Sachim  SA_DBG3(("mpiPhyCntrlRsp: start, HTAG=0x%x,\n", pIomb->tag));
2121285242Sachim
2122285242Sachim  /* get tag */
2123285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaLocalPhyCntrlRsp_t, tag)) ;
2124285242Sachim  OSSA_READ_LE_32(AGROOT, &phyOpId, pIomb, OSSA_OFFSET_OF(agsaLocalPhyCntrlRsp_t, phyOpId)) ;
2125285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaLocalPhyCntrlRsp_t, status)) ;
2126285242Sachim  /* get request from IOMap */
2127285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2128285242Sachim  if (agNULL == pRequest)
2129285242Sachim  {
2130285242Sachim    SA_DBG1(("mpiPhyCntrlRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x PhyOpId=0x%x\n", tag, status, phyOpId));
2131285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2n");
2132285242Sachim    return AGSA_RC_FAILURE;
2133285242Sachim  }
2134285242Sachim  agContext = saRoot->IOMap[tag].agContext;
2135285242Sachim  /* remove the request from IOMap */
2136285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
2137285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
2138285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
2139285242Sachim
2140285242Sachim  phyId = phyOpId & LOCAL_PHY_PHYID;
2141285242Sachim  operation = (phyOpId & LOCAL_PHY_OP_BITS) >> SHIFT8;
2142285242Sachim
2143285242Sachim
2144285242Sachim  SA_DBG3(("mpiPhyCntrlRsp: phyId=0x%x Operation=0x%x Status=0x%x\n", phyId, operation, status));
2145285242Sachim
2146285242Sachim  if( pRequest->completionCB == agNULL )
2147285242Sachim  {
2148285242Sachim    /* call back with the status */
2149285242Sachim    ossaLocalPhyControlCB(agRoot, agContext, phyId, operation, status, agNULL);
2150285242Sachim  }
2151285242Sachim  else
2152285242Sachim  {
2153285242Sachim    (*(ossaLocalPhyControlCB_t)(pRequest->completionCB))(agRoot, agContext, phyId, operation, status, agNULL );
2154285242Sachim  }
2155285242Sachim
2156285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2157285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
2158285242Sachim  pRequest->valid = agFALSE;
2159285242Sachim  /* return the request to free pool */
2160285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2161285242Sachim  {
2162285242Sachim    SA_DBG1(("mpiPhyCntrlRsp: saving pRequest (%p) for later use\n", pRequest));
2163285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2164285242Sachim  }
2165285242Sachim  else
2166285242Sachim  {
2167285242Sachim    /* return the request to free pool */
2168285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2169285242Sachim  }
2170285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2171285242Sachim
2172285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2n");
2173285242Sachim  return ret;
2174285242Sachim}
2175285242Sachim
2176285242Sachim/******************************************************************************/
2177285242Sachim/*! \brief SPC MPI Device Register Command Response
2178285242Sachim *
2179285242Sachim *  This function handles the response of Device Register Command.
2180285242Sachim *
2181285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA hardware
2182285242Sachim *  \param pIomb        pointer of Message
2183285242Sachim *
2184285242Sachim *  \return The read value
2185285242Sachim *
2186285242Sachim */
2187285242Sachim/*******************************************************************************/
2188285242SachimGLOBAL bit32 mpiDeviceRegRsp(
2189285242Sachim  agsaRoot_t    *agRoot,
2190285242Sachim  agsaDeviceRegistrationRsp_t *pIomb
2191285242Sachim  )
2192285242Sachim{
2193285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
2194285242Sachim  agsaLLRoot_t        *saRoot = agNULL;
2195285242Sachim  agsaIORequestDesc_t *pRequest;
2196285242Sachim  agsaContext_t       *agContext;
2197285242Sachim  bit32               deviceId;
2198285242Sachim  agsaDeviceDesc_t    *pDevice = agNULL;
2199285242Sachim  agsaDeviceDesc_t    *pDeviceRemove = agNULL;
2200285242Sachim  bit32               deviceIdx,status, tag;
2201285242Sachim
2202285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2p");
2203285242Sachim
2204285242Sachim  /* sanity check */
2205285242Sachim  SA_ASSERT((agNULL != agRoot), "");
2206285242Sachim  saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
2207285242Sachim  SA_ASSERT((agNULL != saRoot), "");
2208285242Sachim
2209285242Sachim  SA_DBG3(("mpiDeviceRegRsp: start, HTAG=0x%x\n", pIomb->tag));
2210285242Sachim
2211285242Sachim  SA_ASSERT((NULL != saRoot->DeviceRegistrationCB), "DeviceRegistrationCB can not be NULL");
2212285242Sachim  OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaDeviceRegistrationRsp_t, deviceId)) ;
2213285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDeviceRegistrationRsp_t, tag)) ;
2214285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDeviceRegistrationRsp_t, status)) ;
2215285242Sachim
2216285242Sachim  SA_DBG1(("mpiDeviceRegRsp: deviceID 0x%x \n", deviceId));
2217285242Sachim
2218285242Sachim  /* get request from IOMap */
2219285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2220285242Sachim  if (agNULL == pRequest)
2221285242Sachim  {
2222285242Sachim    SA_DBG1(("mpiDeviceRegRsp: Bad IOMB!!! pRequest is NULL. TAG=0x%x, STATUS=0x%x DEVICEID=0x%x\n", tag, status, deviceId));
2223285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2p");
2224285242Sachim    return AGSA_RC_FAILURE;
2225285242Sachim  }
2226285242Sachim
2227285242Sachim  pDevice = pRequest->pDevice;
2228285242Sachim
2229285242Sachim  agContext = saRoot->IOMap[tag].agContext;
2230285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
2231285242Sachim  /* remove the request from IOMap */
2232285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
2233285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
2234285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
2235285242Sachim
2236285242Sachim  /* get Device Id or status */
2237285242Sachim  SA_DBG3(("mpiDeviceRegRsp: hosttag 0x%x\n", tag));
2238285242Sachim  SA_DBG3(("mpiDeviceRegRsp: deviceID 0x%x Device Context %p\n", deviceId, pDevice));
2239285242Sachim
2240285242Sachim  if (agNULL == pDevice)
2241285242Sachim  {
2242285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2243285242Sachim    pRequest->valid = agFALSE;
2244285242Sachim    /* return the request to free pool */
2245285242Sachim    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2246285242Sachim    {
2247285242Sachim      SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
2248285242Sachim      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2249285242Sachim    }
2250285242Sachim    else
2251285242Sachim    {
2252285242Sachim      /* return the request to free pool */
2253285242Sachim      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2254285242Sachim    }
2255285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2256285242Sachim
2257285242Sachim    SA_DBG1(("mpiDeviceRegRsp: warning!!! no device is found\n"));
2258285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2p");
2259285242Sachim    return AGSA_RC_FAILURE;
2260285242Sachim  }
2261285242Sachim
2262285242Sachim  if (agNULL == saRoot->DeviceRegistrationCB)
2263285242Sachim  {
2264285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2265285242Sachim    pRequest->valid = agFALSE;
2266285242Sachim    /* return the request to free pool */
2267285242Sachim    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2268285242Sachim    {
2269285242Sachim      SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
2270285242Sachim      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2271285242Sachim    }
2272285242Sachim    else
2273285242Sachim    {
2274285242Sachim      /* return the request to free pool */
2275285242Sachim      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2276285242Sachim    }
2277285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2278285242Sachim
2279285242Sachim    SA_DBG1(("mpiDeviceRegRsp: warning!!! no DeviceRegistrationCB is found\n"));
2280285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2p");
2281285242Sachim    return AGSA_RC_FAILURE;
2282285242Sachim  }
2283285242Sachim
2284285242Sachim
2285285242Sachim  if(smIS_SPCV(agRoot))
2286285242Sachim  {
2287285242Sachim    switch( status)
2288285242Sachim    {
2289285242Sachim      case 0:
2290285242Sachim          status = OSSA_SUCCESS;
2291285242Sachim          break;
2292285242Sachim      case MPI_ERR_DEVICE_HANDLE_UNAVAILABLE:
2293285242Sachim          status = OSSA_FAILURE_OUT_OF_RESOURCE;
2294285242Sachim          break;
2295285242Sachim      case MPI_ERR_DEVICE_ALREADY_REGISTERED:
2296285242Sachim          status = OSSA_FAILURE_DEVICE_ALREADY_REGISTERED;
2297285242Sachim          break;
2298285242Sachim      case MPI_ERR_PHY_ID_INVALID:
2299285242Sachim          status = OSSA_FAILURE_INVALID_PHY_ID;
2300285242Sachim          break;
2301285242Sachim      case MPI_ERR_PHY_ID_ALREADY_REGISTERED:
2302285242Sachim          status = OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED;
2303285242Sachim          break;
2304285242Sachim      case MPI_ERR_PORT_INVALID_PORT_ID:
2305285242Sachim          status = OSSA_FAILURE_PORT_ID_OUT_OF_RANGE;
2306285242Sachim          break;
2307285242Sachim      case MPI_ERR_PORT_STATE_NOT_VALID:
2308285242Sachim          status = OSSA_FAILURE_PORT_NOT_VALID_STATE;
2309285242Sachim          break;
2310285242Sachim      case MPI_ERR_DEVICE_TYPE_NOT_VALID:
2311285242Sachim          status = OSSA_FAILURE_DEVICE_TYPE_NOT_VALID;
2312285242Sachim          break;
2313285242Sachim      default:
2314285242Sachim        SA_ASSERT((0), "DeviceRegistration Unknown status");
2315285242Sachim        ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2316285242Sachim        pRequest->valid = agFALSE;
2317285242Sachim        /* return the request to free pool */
2318285242Sachim        if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2319285242Sachim        {
2320285242Sachim          SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
2321285242Sachim          saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2322285242Sachim        }
2323285242Sachim        else
2324285242Sachim        {
2325285242Sachim          /* return the request to free pool */
2326285242Sachim          saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2327285242Sachim        }
2328285242Sachim        ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2329285242Sachim
2330285242Sachim        return AGSA_RC_FAILURE;
2331285242Sachim    }
2332285242Sachim  }
2333285242Sachim
2334285242Sachim  switch (status)
2335285242Sachim  {
2336285242Sachim  case OSSA_SUCCESS:
2337285242Sachim    /* mapping the device handle and device id */
2338285242Sachim    deviceIdx = deviceId & DEVICE_ID_BITS;
2339285242Sachim    OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
2340285242Sachim    saRoot->DeviceMap[deviceIdx].DeviceIdFromFW = deviceId;
2341285242Sachim    saRoot->DeviceMap[deviceIdx].DeviceHandle = (void *)pDevice;
2342285242Sachim    pDevice->DeviceMapIndex = deviceId;
2343285242Sachim
2344285242Sachim    (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2345285242Sachim                                                                  agContext,
2346285242Sachim                                                                  OSSA_SUCCESS,
2347285242Sachim                                                                  &pDevice->targetDevHandle,
2348285242Sachim                                                                  deviceId
2349285242Sachim                                                                  );
2350285242Sachim
2351285242Sachim    break;
2352285242Sachim  case OSSA_FAILURE_OUT_OF_RESOURCE:
2353285242Sachim    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_OUT_OF_RESOURCE\n"));
2354285242Sachim    /* remove device from LL device list */
2355285242Sachim    siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2356285242Sachim
2357285242Sachim    /* call ossaDeviceRegistrationCB_t */
2358285242Sachim    (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2359285242Sachim                                                                  agContext,
2360285242Sachim                                                                  OSSA_FAILURE_OUT_OF_RESOURCE,
2361285242Sachim                                                                  &pDevice->targetDevHandle,
2362285242Sachim                                                                  deviceId
2363285242Sachim                                                                  );
2364285242Sachim
2365285242Sachim
2366285242Sachim    break;
2367285242Sachim  case OSSA_FAILURE_DEVICE_ALREADY_REGISTERED:
2368285242Sachim    /* get original device handle and device id */
2369285242Sachim    pDeviceRemove = pDevice;
2370285242Sachim    deviceIdx = deviceId & DEVICE_ID_BITS;
2371285242Sachim    OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
2372285242Sachim    pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
2373285242Sachim    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_DEVICE_ALREADY_REGISTERED, existing deviceContext %p\n", pDevice));
2374285242Sachim    /* no auto registration */
2375285242Sachim    if (pDevice != agNULL)
2376285242Sachim    {
2377285242Sachim      /* remove device from LL device list */
2378285242Sachim      siPortDeviceListRemove(agRoot, pDevice->pPort, pDeviceRemove);
2379285242Sachim
2380285242Sachim      /* call ossaDeviceRegistrationCB_t */
2381285242Sachim      (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2382285242Sachim                                                                    agContext,
2383285242Sachim                                                                    OSSA_FAILURE_DEVICE_ALREADY_REGISTERED,
2384285242Sachim                                                                    &pDevice->targetDevHandle,
2385285242Sachim                                                                    deviceId
2386285242Sachim                                                                    );
2387285242Sachim    }
2388285242Sachim    else
2389285242Sachim    {
2390285242Sachim      SA_DBG1(("mpiDeviceRegRsp: pDevice is NULL. TAG=0x%x, STATUS=0x%x DEVICEID=0x%x\n", tag, status, deviceId));
2391285242Sachim      smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2p");
2392285242Sachim      return AGSA_RC_FAILURE;
2393285242Sachim    }
2394285242Sachim
2395285242Sachim    break;
2396285242Sachim  case OSSA_FAILURE_INVALID_PHY_ID:
2397285242Sachim    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_INVALID_PHY_ID\n"));
2398285242Sachim    /* remove device from LL device list */
2399285242Sachim    siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2400285242Sachim
2401285242Sachim    /* call ossaDeviceRegistrationCB_t */
2402285242Sachim    (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2403285242Sachim                                                                  agContext,
2404285242Sachim                                                                  OSSA_FAILURE_INVALID_PHY_ID,
2405285242Sachim                                                                  &pDevice->targetDevHandle,
2406285242Sachim                                                                  deviceId
2407285242Sachim                                                                  );
2408285242Sachim    break;
2409285242Sachim  case OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED:
2410285242Sachim    /* get original device handle and device id */
2411285242Sachim    pDeviceRemove = pDevice;
2412285242Sachim    deviceIdx = deviceId & DEVICE_ID_BITS;
2413285242Sachim    OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
2414285242Sachim    pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
2415285242Sachim    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED, existing deviceContext %p\n", pDevice));
2416285242Sachim    /* no auto registration */
2417285242Sachim    if (pDevice != agNULL)
2418285242Sachim    {
2419285242Sachim      /* remove device from LL device list */
2420285242Sachim      siPortDeviceListRemove(agRoot, pDevice->pPort, pDeviceRemove);
2421285242Sachim
2422285242Sachim      /* call ossaDeviceRegistrationCB_t */
2423285242Sachim      (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2424285242Sachim                                                                    agContext,
2425285242Sachim                                                                    OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED,
2426285242Sachim                                                                    &pDevice->targetDevHandle,
2427285242Sachim                                                                    deviceId
2428285242Sachim                                                                    );
2429285242Sachim    }
2430285242Sachim    else
2431285242Sachim    {
2432285242Sachim      SA_DBG1(("mpiDeviceRegRsp: pDevice is NULL. TAG=0x%x, STATUS=0x%x DEVICEID=0x%x\n", tag, status, deviceId));
2433285242Sachim      smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2p");
2434285242Sachim      return AGSA_RC_FAILURE;
2435285242Sachim    }
2436285242Sachim
2437285242Sachim    break;
2438285242Sachim  case OSSA_FAILURE_PORT_ID_OUT_OF_RANGE:
2439285242Sachim    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_OUT_OF_RESOURCE\n"));
2440285242Sachim    /* remove device from LL device list */
2441285242Sachim    siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2442285242Sachim
2443285242Sachim    /* call ossaDeviceRegistrationCB_t */
2444285242Sachim    (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2445285242Sachim                                                                  agContext,
2446285242Sachim                                                                  OSSA_FAILURE_PORT_ID_OUT_OF_RANGE,
2447285242Sachim                                                                  &pDevice->targetDevHandle,
2448285242Sachim                                                                  deviceId
2449285242Sachim                                                                  );
2450285242Sachim    break;
2451285242Sachim  case OSSA_FAILURE_PORT_NOT_VALID_STATE:
2452285242Sachim    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_PORT_NOT_VALID_STATE\n"));
2453285242Sachim    /* remove device from LL device list */
2454285242Sachim    siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2455285242Sachim
2456285242Sachim    /* call ossaDeviceRegistrationCB_t */
2457285242Sachim    (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2458285242Sachim                                                                  agContext,
2459285242Sachim                                                                  OSSA_FAILURE_PORT_NOT_VALID_STATE,
2460285242Sachim                                                                  &pDevice->targetDevHandle,
2461285242Sachim                                                                  deviceId
2462285242Sachim                                                                  );
2463285242Sachim    break;
2464285242Sachim  case OSSA_FAILURE_DEVICE_TYPE_NOT_VALID:
2465285242Sachim    SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_DEVICE_TYPE_NOT_VALID\n"));
2466285242Sachim    /* remove device from LL device list */
2467285242Sachim    siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2468285242Sachim    /* call ossaDeviceRegistrationCB_t */
2469285242Sachim    (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2470285242Sachim                                                                  agContext,
2471285242Sachim                                                                  OSSA_FAILURE_DEVICE_TYPE_NOT_VALID,
2472285242Sachim                                                                  &pDevice->targetDevHandle,
2473285242Sachim                                                                  deviceId
2474285242Sachim                                                                  );
2475285242Sachim    break;
2476285242Sachim  default:
2477285242Sachim    SA_DBG3(("mpiDeviceRegRsp, unknown status in response %d\n", status));
2478285242Sachim    break;
2479285242Sachim  }
2480285242Sachim
2481285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2482285242Sachim  pRequest->valid = agFALSE;
2483285242Sachim  /* return the request to free pool */
2484285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2485285242Sachim  {
2486285242Sachim    SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
2487285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2488285242Sachim  }
2489285242Sachim  else
2490285242Sachim  {
2491285242Sachim    /* return the request to free pool */
2492285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2493285242Sachim  }
2494285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2495285242Sachim
2496285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "2p");
2497285242Sachim  return ret;
2498285242Sachim}
2499285242Sachim
2500285242Sachim/******************************************************************************/
2501285242Sachim/*! \brief SPC MPI Deregister Device Command Response
2502285242Sachim *
2503285242Sachim *  This function handles the response of Deregister Command.
2504285242Sachim *
2505285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA hardware
2506285242Sachim *  \param pIomb        pointer of Message
2507285242Sachim *
2508285242Sachim *  \return The read value
2509285242Sachim *
2510285242Sachim */
2511285242Sachim/*******************************************************************************/
2512285242SachimGLOBAL bit32 mpiDeregDevHandleRsp(
2513285242Sachim  agsaRoot_t              *agRoot,
2514285242Sachim  agsaDeregDevHandleRsp_t *pIomb
2515285242Sachim  )
2516285242Sachim{
2517285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
2518285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2519285242Sachim  agsaIORequestDesc_t *pRequest;
2520285242Sachim  agsaDevHandle_t     *agDevHandle;
2521285242Sachim  agsaContext_t       *agContext;
2522285242Sachim  agsaDeviceDesc_t    *pDevice;
2523285242Sachim  bit32               deviceIdx, status, tag;
2524285242Sachim
2525285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2r");
2526285242Sachim  SA_ASSERT((NULL != saRoot->DeviceDeregistrationCB), "DeviceDeregistrationCB can not be NULL");
2527285242Sachim
2528285242Sachim  SA_DBG3(("mpiDeregDevHandleRsp: start, HTAG=0x%x\n", pIomb->tag));
2529285242Sachim
2530285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDeregDevHandleRsp_t, tag)) ;
2531285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDeregDevHandleRsp_t, status)) ;
2532285242Sachim  OSSA_READ_LE_32(AGROOT, &deviceIdx, pIomb, OSSA_OFFSET_OF(agsaDeregDevHandleRsp_t, deviceId)) ;
2533285242Sachim  /* get request from IOMap */
2534285242Sachim
2535285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2536285242Sachim  if (agNULL == pRequest)
2537285242Sachim  {
2538285242Sachim    SA_DBG1(("mpiDeregDevHandleRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x deviceIdx 0x%x\n", tag, status,deviceIdx));
2539285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2r");
2540285242Sachim    return AGSA_RC_FAILURE;
2541285242Sachim  }
2542285242Sachim
2543285242Sachim  agContext = saRoot->IOMap[tag].agContext;
2544285242Sachim  /* remove the request from IOMap */
2545285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
2546285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
2547285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
2548285242Sachim
2549285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
2550285242Sachim
2551285242Sachim  pDevice = pRequest->pDevice;
2552285242Sachim  if (pDevice != agNULL)
2553285242Sachim  {
2554285242Sachim    if (pDevice->targetDevHandle.sdkData)
2555285242Sachim    {
2556285242Sachim      agDevHandle = &(pDevice->targetDevHandle);
2557285242Sachim    }
2558285242Sachim    else
2559285242Sachim    {
2560285242Sachim      agDevHandle = &(pDevice->initiatorDevHandle);
2561285242Sachim    }
2562285242Sachim  }
2563285242Sachim  else
2564285242Sachim  {
2565285242Sachim    SA_DBG1(("mpiDeregDevHandleRsp: pDevice is NULL"));
2566285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2r");
2567285242Sachim    return AGSA_RC_FAILURE;
2568285242Sachim  }
2569285242Sachim
2570285242Sachim  if (agNULL == agDevHandle)
2571285242Sachim  {
2572285242Sachim    SA_DBG1(("mpiDeregDevHandleRsp: warning!!! no deviceHandle is found"));
2573285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2r");
2574285242Sachim
2575285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2576285242Sachim    pRequest->valid = agFALSE;
2577285242Sachim    /* return the request to free pool */
2578285242Sachim    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2579285242Sachim    {
2580285242Sachim      SA_DBG1(("mpiDeregDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
2581285242Sachim      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2582285242Sachim    }
2583285242Sachim    else
2584285242Sachim    {
2585285242Sachim      /* return the request to free pool */
2586285242Sachim      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2587285242Sachim    }
2588285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2589285242Sachim
2590285242Sachim    return AGSA_RC_FAILURE;
2591285242Sachim  }
2592285242Sachim
2593285242Sachim  SA_DBG1(("mpiDeregDevHandleRsp: deviceID 0x%x Device Context %p\n", pDevice->DeviceMapIndex, pDevice));
2594285242Sachim
2595285242Sachim  if (agNULL == saRoot->DeviceDeregistrationCB)
2596285242Sachim  {
2597285242Sachim    SA_DBG1(("mpiDeregDevHandleRsp: warning!!! no DeviceDeregistrationCB is found"));
2598285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2r");
2599285242Sachim
2600285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2601285242Sachim    pRequest->valid = agFALSE;
2602285242Sachim    /* return the request to free pool */
2603285242Sachim    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2604285242Sachim    {
2605285242Sachim      SA_DBG1(("mpiDeregDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
2606285242Sachim      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2607285242Sachim    }
2608285242Sachim    else
2609285242Sachim    {
2610285242Sachim      /* return the request to free pool */
2611285242Sachim      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2612285242Sachim    }
2613285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2614285242Sachim
2615285242Sachim    return AGSA_RC_FAILURE;
2616285242Sachim  }
2617285242Sachim
2618285242Sachim  switch (status)
2619285242Sachim  {
2620285242Sachim    case OSSA_SUCCESS:
2621285242Sachim     (*(ossaDeregisterDeviceHandleCB_t)(saRoot->DeviceDeregistrationCB))(agRoot,
2622285242Sachim                                                                agContext,
2623285242Sachim                                                                agDevHandle,
2624285242Sachim                                                                OSSA_SUCCESS
2625285242Sachim                                                                );
2626285242Sachim      siRemoveDevHandle(agRoot, agDevHandle);
2627285242Sachim      break;
2628285242Sachim    case OSSA_ERR_DEVICE_HANDLE_INVALID:
2629285242Sachim    case OSSA_INVALID_HANDLE:
2630285242Sachim      (*(ossaDeregisterDeviceHandleCB_t)(saRoot->DeviceDeregistrationCB))(agRoot,
2631285242Sachim                                                                agContext,
2632285242Sachim                                                                agDevHandle,
2633285242Sachim                                                                status
2634285242Sachim                                                                );
2635285242Sachim// already removed and no device to remove
2636285242Sachim//      siRemoveDevHandle(agRoot, agDevHandle);
2637285242Sachim      SA_DBG1(("mpiDeregDevRegRsp, OSSA_INVALID_HANDLE status in response %d\n", status));
2638285242Sachim      break;
2639285242Sachim    case OSSA_ERR_DEVICE_BUSY:
2640285242Sachim      (*(ossaDeregisterDeviceHandleCB_t)(saRoot->DeviceDeregistrationCB))(agRoot,
2641285242Sachim                                                                agContext,
2642285242Sachim                                                                agDevHandle,
2643285242Sachim                                                                status
2644285242Sachim                                                                );
2645285242Sachim      SA_DBG1(("mpiDeregDevRegRsp, OSSA_ERR_DEVICE_BUSY status in response %d\n", status));
2646285242Sachim      ret = AGSA_RC_BUSY;
2647285242Sachim      break;
2648285242Sachim    default:
2649285242Sachim      SA_DBG1(("mpiDeregDevRegRsp, unknown status in response 0x%X\n", status));
2650285242Sachim      break;
2651285242Sachim  }
2652285242Sachim
2653285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2654285242Sachim  pRequest->valid = agFALSE;
2655285242Sachim  /* return the request to free pool */
2656285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2657285242Sachim  {
2658285242Sachim    SA_DBG1(("mpiDeregDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
2659285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2660285242Sachim  }
2661285242Sachim  else
2662285242Sachim  {
2663285242Sachim    /* return the request to free pool */
2664285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2665285242Sachim  }
2666285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2667285242Sachim
2668285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2r");
2669285242Sachim  return ret;
2670285242Sachim}
2671285242Sachim
2672285242Sachim
2673285242Sachim/******************************************************************************/
2674285242Sachim/*! \brief Get Phy Profile Response SPCv
2675285242Sachim *
2676285242Sachim *  This routine handles the response of Get Phy Profile Command Response
2677285242Sachim *
2678285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
2679285242Sachim *  \param pIomb        Pointer of IOMB Message
2680285242Sachim *
2681285242Sachim *  \return sucess or fail
2682285242Sachim *  SPC  only
2683285242Sachim */
2684285242Sachim/*******************************************************************************/
2685285242Sachim
2686285242SachimGLOBAL bit32 mpiGetPhyProfileRsp(
2687285242Sachim  agsaRoot_t             *agRoot,
2688285242Sachim  agsaGetPhyProfileRspV_t *pIomb
2689285242Sachim  )
2690285242Sachim{
2691285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
2692285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2693285242Sachim  agsaIORequestDesc_t *pRequest;
2694285242Sachim  agsaContext_t       *agContext;
2695285242Sachim  bit32              status, tag;
2696285242Sachim
2697285242Sachim  bit32          Reserved_SOP_PHYID;
2698285242Sachim  bit32          PhyId;
2699285242Sachim  bit32          SOP;
2700285242Sachim
2701285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2J");
2702285242Sachim  OSSA_READ_LE_32(agRoot, &status, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t, status));
2703285242Sachim  OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t, tag));
2704285242Sachim  /* get TAG */
2705285242Sachim  SA_DBG1(("mpiGetPhyProfileRsp: HTag=0x%x\n", tag));
2706285242Sachim
2707285242Sachim  /* get request from IOMap */
2708285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2709285242Sachim  if (agNULL == pRequest)
2710285242Sachim  {
2711285242Sachim    SA_DBG1(("mpiGetPhyProfileRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
2712285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2J");
2713285242Sachim    return AGSA_RC_FAILURE;
2714285242Sachim  }
2715285242Sachim
2716285242Sachim  agContext = saRoot->IOMap[tag].agContext;
2717285242Sachim
2718285242Sachim  OSSA_READ_LE_32(agRoot, &Reserved_SOP_PHYID, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,Reserved_Ppc_SOP_PHYID ));
2719285242Sachim
2720285242Sachim  /* remove the request from IOMap */
2721285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
2722285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
2723285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
2724285242Sachim
2725285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
2726285242Sachim  SA_DBG1(("mpiGetPhyProfileRsp:   %p\n",pIomb));
2727285242Sachim  SA_DBG1(("mpiGetPhyProfileRsp: completionCB %p\n",pRequest->completionCB ));
2728285242Sachim
2729285242Sachim  SOP = (Reserved_SOP_PHYID & 0xFF00) >> SHIFT8;
2730285242Sachim  PhyId = Reserved_SOP_PHYID & 0xFF;
2731285242Sachim
2732285242Sachim  /* check status success or failure */
2733285242Sachim  if (status)
2734285242Sachim  {
2735285242Sachim    /* status is FAILED */
2736285242Sachim    SA_DBG1(("mpiGetPhyProfileRsp:AGSA_RC_FAILURE  0x%08X\n", status));
2737285242Sachim    switch(SOP)
2738285242Sachim    {
2739285242Sachim      case AGSA_SAS_PHY_ERR_COUNTERS_PAGE:
2740285242Sachim      {
2741285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ERR_COUNTERS_PAGE SOP 0x%x\n", SOP));
2742285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2743285242Sachim        break;
2744285242Sachim      }
2745285242Sachim      case AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE:
2746285242Sachim      {
2747285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE SOP 0x%x\n", SOP));
2748285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2749285242Sachim        break;
2750285242Sachim      }
2751285242Sachim      case AGSA_SAS_PHY_BW_COUNTERS_PAGE:
2752285242Sachim      {
2753285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: GET_SAS_PHY_BW_COUNTERS SOP 0x%x\n", SOP));
2754285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2755285242Sachim        break;
2756285242Sachim      }
2757285242Sachim      case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
2758285242Sachim      {
2759285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE SOP 0x%x\n", SOP));
2760285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2761285242Sachim        break;
2762285242Sachim      }
2763285242Sachim      case AGSA_SAS_PHY_GENERAL_STATUS_PAGE:
2764285242Sachim      {
2765285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_GENERAL_STATUS_PAGE SOP 0x%x\n", SOP));
2766285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2767285242Sachim        break;
2768285242Sachim      }
2769285242Sachim      case AGSA_PHY_SNW3_PAGE:
2770285242Sachim      {
2771285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_SNW3_PAGE SOP 0x%x\n", SOP));
2772285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2773285242Sachim        break;
2774285242Sachim      }
2775285242Sachim      case AGSA_PHY_RATE_CONTROL_PAGE:
2776285242Sachim      {
2777285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_RATE_CONTROL_PAGE SOP 0x%x\n", SOP));
2778285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2779285242Sachim        break;
2780285242Sachim      }
2781285242Sachim      case AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE:
2782285242Sachim      {
2783285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE SOP 0x%x\n", SOP));
2784285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2785285242Sachim        break;
2786285242Sachim      }
2787285242Sachim      default:
2788285242Sachim      {
2789285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: undefined SOP 0x%x\n", SOP));
2790285242Sachim        break;
2791285242Sachim      }
2792285242Sachim    }
2793285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2J");
2794285242Sachim    return AGSA_RC_FAILURE;
2795285242Sachim  }
2796285242Sachim  else
2797285242Sachim  {
2798285242Sachim    SA_DBG1(("mpiGetPhyProfileRsp: SUCCESS type 0x%X\n",SOP ));
2799285242Sachim    switch(SOP)
2800285242Sachim    {
2801285242Sachim      case AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE:
2802285242Sachim        /* call back with the status */
2803285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE PhyId %d\n",PhyId));
2804285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL);
2805285242Sachim        break;
2806285242Sachim      case AGSA_SAS_PHY_ERR_COUNTERS_PAGE:
2807285242Sachim      {
2808285242Sachim
2809285242Sachim        agsaPhyErrCountersPage_t Errors;
2810285242Sachim
2811285242Sachim        OSSA_READ_LE_32(agRoot, &Errors.invalidDword,          pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2812285242Sachim        OSSA_READ_LE_32(agRoot, &Errors.runningDisparityError, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2813285242Sachim        OSSA_READ_LE_32(agRoot, &Errors.codeViolation,         pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
2814285242Sachim        OSSA_READ_LE_32(agRoot, &Errors.lossOfDwordSynch,      pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[3] ));
2815285242Sachim        OSSA_READ_LE_32(agRoot, &Errors.phyResetProblem,       pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[4] ));
2816285242Sachim        OSSA_READ_LE_32(agRoot, &Errors.inboundCRCError,       pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[5] ));
2817285242Sachim
2818285242Sachim        /* call back with the status */
2819285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &Errors);
2820285242Sachim        /* status is SUCCESS */
2821285242Sachim
2822285242Sachim        SA_DBG3(("mpiGetPhyProfileRsp: pIomb %p\n",pIomb));
2823285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: Reserved_SOP_PHYID    0x%08X\n",Reserved_SOP_PHYID));
2824285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: invalidDword          0x%08X\n",Errors.invalidDword ));
2825285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: runningDisparityError 0x%08X\n",Errors.runningDisparityError ));
2826285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: codeViolation         0x%08X\n",Errors.codeViolation ));
2827285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: lossOfDwordSynch      0x%08X\n",Errors.lossOfDwordSynch ));
2828285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: phyResetProblem       0x%08X\n",Errors.phyResetProblem ));
2829285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: inboundCRCError       0x%08X\n",Errors.inboundCRCError ));
2830285242Sachim        break;
2831285242Sachim
2832285242Sachim      }
2833285242Sachim      case AGSA_SAS_PHY_BW_COUNTERS_PAGE:
2834285242Sachim      {
2835285242Sachim
2836285242Sachim        agsaPhyBWCountersPage_t  bw_counts;
2837285242Sachim        OSSA_READ_LE_32(agRoot, &bw_counts.TXBWCounter, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2838285242Sachim        OSSA_READ_LE_32(agRoot, &bw_counts.RXBWCounter, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2839285242Sachim
2840285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: GET_SAS_PHY_BW_COUNTERS TX 0x%08X RX 0x%08X\n",bw_counts.TXBWCounter,bw_counts.RXBWCounter));
2841285242Sachim        /* call back with the status */
2842285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, &bw_counts);
2843285242Sachim        break;
2844285242Sachim      }
2845285242Sachim      case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
2846285242Sachim      {
2847285242Sachim        agsaPhyAnalogSettingsPage_t analog;
2848285242Sachim
2849285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE 0x%X\n",SOP));
2850285242Sachim        OSSA_READ_LE_32(agRoot, &analog.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2851285242Sachim        OSSA_READ_LE_32(agRoot, &analog.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2852285242Sachim        OSSA_READ_LE_32(agRoot, &analog.Dword2, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
2853285242Sachim        OSSA_READ_LE_32(agRoot, &analog.Dword3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[3] ));
2854285242Sachim        OSSA_READ_LE_32(agRoot, &analog.Dword4, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[4] ));
2855285242Sachim          /* call back with the status */
2856285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, &analog);
2857285242Sachim        break;
2858285242Sachim      }
2859285242Sachim
2860285242Sachim      case AGSA_SAS_PHY_GENERAL_STATUS_PAGE:
2861285242Sachim      {
2862285242Sachim        agsaSASPhyGeneralStatusPage_t GenStatus;
2863285242Sachim        OSSA_READ_LE_32(agRoot, &GenStatus.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2864285242Sachim        OSSA_READ_LE_32(agRoot, &GenStatus.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2865285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_GENERAL_STATUS_PAGE SOP 0x%x 0x%x 0x%x\n", SOP,GenStatus.Dword0,GenStatus.Dword1));
2866285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &GenStatus );
2867285242Sachim        break;
2868285242Sachim      }
2869285242Sachim      case AGSA_PHY_SNW3_PAGE:
2870285242Sachim      {
2871285242Sachim        agsaPhySNW3Page_t Snw3;
2872285242Sachim        OSSA_READ_LE_32(agRoot, &Snw3.LSNW3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2873285242Sachim        OSSA_READ_LE_32(agRoot, &Snw3.RSNW3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2874285242Sachim
2875285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_SNW3_PAGE SOP 0x%x\n", SOP));
2876285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &Snw3 );
2877285242Sachim        break;
2878285242Sachim      }
2879285242Sachim      case AGSA_PHY_RATE_CONTROL_PAGE:
2880285242Sachim      {
2881285242Sachim        agsaPhyRateControlPage_t RateControl;
2882285242Sachim        OSSA_READ_LE_32(agRoot, &RateControl.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2883285242Sachim        OSSA_READ_LE_32(agRoot, &RateControl.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2884285242Sachim        OSSA_READ_LE_32(agRoot, &RateControl.Dword2, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
2885285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_RATE_CONTROL_PAGE SOP 0x%x\n", SOP));
2886285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &RateControl );
2887285242Sachim        break;
2888285242Sachim      }
2889285242Sachim      case AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE:
2890285242Sachim      {
2891285242Sachim        agsaSASPhyOpenRejectRetryBackOffThresholdPage_t Backoff;
2892285242Sachim        OSSA_READ_LE_32(agRoot, &Backoff.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2893285242Sachim        OSSA_READ_LE_32(agRoot, &Backoff.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2894285242Sachim        OSSA_READ_LE_32(agRoot, &Backoff.Dword2, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
2895285242Sachim        OSSA_READ_LE_32(agRoot, &Backoff.Dword3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[3] ));
2896285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE SOP 0x%x\n", SOP));
2897285242Sachim        ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &Backoff );
2898285242Sachim        break;
2899285242Sachim      }
2900285242Sachim      default:
2901285242Sachim      {
2902285242Sachim        SA_DBG1(("mpiGetPhyProfileRsp: undefined successful SOP 0x%x\n", SOP));
2903285242Sachim        break;
2904285242Sachim      }
2905285242Sachim
2906285242Sachim    }
2907285242Sachim  }
2908285242Sachim
2909285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2910285242Sachim  pRequest->valid = agFALSE;
2911285242Sachim  /* return the request to free pool */
2912285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2913285242Sachim  {
2914285242Sachim    SA_DBG1(("mpiGetPhyProfileRsp: saving pRequest (%p) for later use\n", pRequest));
2915285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2916285242Sachim  }
2917285242Sachim  else
2918285242Sachim  {
2919285242Sachim    /* return the request to free pool */
2920285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2921285242Sachim  }
2922285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2923285242Sachim
2924285242Sachim  /* return value */
2925285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2J");
2926285242Sachim  return ret;
2927285242Sachim}
2928285242Sachim
2929285242Sachim
2930285242SachimGLOBAL bit32 mpiSetPhyProfileRsp(
2931285242Sachim  agsaRoot_t             *agRoot,
2932285242Sachim  agsaSetPhyProfileRspV_t *pIomb
2933285242Sachim  )
2934285242Sachim{
2935285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
2936285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2937285242Sachim  agsaIORequestDesc_t *pRequest;
2938285242Sachim  agsaContext_t       *agContext;
2939285242Sachim  bit32                status, tag;
2940285242Sachim
2941285242Sachim  bit32           Reserved_Ppc_PHYID;
2942285242Sachim  bit32           PhyId;
2943285242Sachim  bit16           SOP;
2944285242Sachim
2945285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2Q");
2946285242Sachim  OSSA_READ_LE_32(agRoot, &status, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t, status));
2947285242Sachim  OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t, tag));
2948285242Sachim  OSSA_READ_LE_32(agRoot, &Reserved_Ppc_PHYID, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t, Reserved_Ppc_PHYID));
2949285242Sachim  /* get TAG */
2950285242Sachim  SA_DBG1(("mpiSetPhyProfileRsp: HTag=0x%x\n", tag));
2951285242Sachim
2952285242Sachim  /* get request from IOMap */
2953285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2954285242Sachim  if (agNULL == pRequest)
2955285242Sachim  {
2956285242Sachim    SA_DBG1(("mpiSetPhyProfileRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
2957285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2Q");
2958285242Sachim    return AGSA_RC_FAILURE;
2959285242Sachim  }
2960285242Sachim
2961285242Sachim  agContext = saRoot->IOMap[tag].agContext;
2962285242Sachim
2963285242Sachim  /* remove the request from IOMap */
2964285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
2965285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
2966285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
2967285242Sachim
2968285242Sachim  SA_DBG1(("mpiSetPhyProfileRsp:   %p\n",pIomb));
2969285242Sachim
2970285242Sachim  SOP = pRequest->SOP;
2971285242Sachim  PhyId = Reserved_Ppc_PHYID & 0xFF;
2972285242Sachim
2973285242Sachim  /* check status success or failure */
2974285242Sachim  if (status)
2975285242Sachim  {
2976285242Sachim    /* status is FAILED */
2977285242Sachim    SA_DBG1(("mpiSetPhyProfileRsp:AGSA_RC_FAILURE  0x%08X\n", status));
2978285242Sachim    switch(SOP)
2979285242Sachim    {
2980285242Sachim      case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
2981285242Sachim      {
2982285242Sachim        SA_DBG1(("mpiSetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE SOP 0x%x\n", SOP));
2983285242Sachim        ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
2984285242Sachim        break;
2985285242Sachim      }
2986285242Sachim      case AGSA_PHY_SNW3_PAGE:
2987285242Sachim      {
2988285242Sachim        SA_DBG1(("mpiSetPhyProfileRsp: AGSA_PHY_SNW3_PAGE SOP 0x%x\n", SOP));
2989285242Sachim        ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
2990285242Sachim        break;
2991285242Sachim      }
2992285242Sachim
2993285242Sachim      case AGSA_PHY_RATE_CONTROL_PAGE:
2994285242Sachim      {
2995285242Sachim        SA_DBG1(("mpiSetPhyProfileRsp: AGSA_PHY_RATE_CONTROL_PAGE SOP 0x%x\n", SOP));
2996285242Sachim        ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
2997285242Sachim        break;
2998285242Sachim      }
2999285242Sachim     case AGSA_SAS_PHY_MISC_PAGE:
3000285242Sachim      {
3001285242Sachim        SA_DBG1(("mpiSetPhyProfileRsp: AGSA_SAS_PHY_MISC_PAGE SOP 0x%x\n", SOP));
3002285242Sachim        ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
3003285242Sachim        break;
3004285242Sachim      }
3005285242Sachim
3006285242Sachim      default:
3007285242Sachim      {
3008285242Sachim        SA_DBG1(("mpiSetPhyProfileRsp: undefined SOP 0x%x\n", SOP));
3009285242Sachim        break;
3010285242Sachim      }
3011285242Sachim    }
3012285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2Q");
3013285242Sachim    return AGSA_RC_FAILURE;
3014285242Sachim  }
3015285242Sachim  else
3016285242Sachim  {
3017285242Sachim    SA_DBG1(("mpiSetPhyProfileRsp: SUCCESS type 0x%X\n",SOP ));
3018285242Sachim    switch(SOP)
3019285242Sachim    {
3020285242Sachim      case AGSA_PHY_SNW3_PAGE:
3021285242Sachim      case AGSA_PHY_RATE_CONTROL_PAGE:
3022285242Sachim      {
3023285242Sachim        SA_DBG1(("mpiSetPhyProfileRsp: Status 0x%x SOP 0x%x PhyId %d\n",status, SOP, PhyId));
3024285242Sachim        ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
3025285242Sachim        break;
3026285242Sachim
3027285242Sachim      }
3028285242Sachim      case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
3029285242Sachim      {
3030285242Sachim        agsaPhyAnalogSettingsPage_t analog;
3031285242Sachim
3032285242Sachim        SA_DBG1(("mpiSetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE 0x%X\n",SOP));
3033285242Sachim        OSSA_READ_LE_32(agRoot, &analog.Dword0, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[0] ));
3034285242Sachim        OSSA_READ_LE_32(agRoot, &analog.Dword1, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[1] ));
3035285242Sachim        OSSA_READ_LE_32(agRoot, &analog.Dword2, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[2] ));
3036285242Sachim        OSSA_READ_LE_32(agRoot, &analog.Dword3, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[3] ));
3037285242Sachim        OSSA_READ_LE_32(agRoot, &analog.Dword4, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[4] ));
3038285242Sachim          /* call back with the status */
3039285242Sachim        ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, &analog );
3040285242Sachim        break;
3041285242Sachim      }
3042285242Sachim      default:
3043285242Sachim      {
3044285242Sachim        SA_DBG1(("mpiSetPhyProfileRsp: undefined successful SOP 0x%x\n", SOP));
3045285242Sachim        break;
3046285242Sachim      }
3047285242Sachim
3048285242Sachim    }
3049285242Sachim  }
3050285242Sachim
3051285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3052285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
3053285242Sachim  SA_DBG1(("mpiSetPhyProfileRsp: completionCB %p\n",pRequest->completionCB ));
3054285242Sachim
3055285242Sachim  pRequest->valid = agFALSE;
3056285242Sachim  /* return the request to free pool */
3057285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3058285242Sachim  {
3059285242Sachim    SA_DBG1(("mpiSetPhyProfileRsp: saving pRequest (%p) for later use\n", pRequest));
3060285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3061285242Sachim  }
3062285242Sachim  else
3063285242Sachim  {
3064285242Sachim    /* return the request to free pool */
3065285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3066285242Sachim  }
3067285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3068285242Sachim
3069285242Sachim  /* return value */
3070285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2Q");
3071285242Sachim  return ret;
3072285242Sachim}
3073285242Sachim
3074285242Sachim
3075285242Sachim
3076285242Sachim/******************************************************************************/
3077285242Sachim/*! \brief Get Device Information Response
3078285242Sachim *
3079285242Sachim *  This routine handles the response of Get Device Info Command Response
3080285242Sachim *
3081285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
3082285242Sachim *  \param pIomb        Pointer of IOMB Message
3083285242Sachim *
3084285242Sachim *  \return sucess or fail
3085285242Sachim *
3086285242Sachim */
3087285242Sachim/*******************************************************************************/
3088285242SachimGLOBAL bit32 mpiGetDevInfoRsp(
3089285242Sachim  agsaRoot_t          *agRoot,
3090285242Sachim  agsaGetDevInfoRspV_t *pIomb
3091285242Sachim  )
3092285242Sachim{
3093285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
3094285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
3095285242Sachim  agsaIORequestDesc_t *pRequest;
3096285242Sachim  agsaDevHandle_t     *agDevHandle;
3097285242Sachim  agsaDeviceDesc_t    *pDevice;
3098285242Sachim  agsaContext_t       *agContext;
3099285242Sachim  agsaDeviceInfo_t    commonDevInfo;
3100285242Sachim  bit32               ARSrateSMPTimeOutPortID, IRMcnITNexusTimeOut, status, tag;
3101285242Sachim  bit32               deviceid;
3102285242Sachim  bit32               sasAddrHi;
3103285242Sachim  bit32               sasAddrLow;
3104285242Sachim#if defined(SALLSDK_DEBUG)
3105285242Sachim  bit32               option;
3106285242Sachim#endif /* SALLSDK_DEBUG */
3107285242Sachim
3108285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2M");
3109285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, status));
3110285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, tag));
3111285242Sachim  /* get TAG */
3112285242Sachim  SA_DBG3(("mpiGetDevInfoRsp: HTag=0x%x\n", tag));
3113285242Sachim
3114285242Sachim  /* get request from IOMap */
3115285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
3116285242Sachim  if (agNULL == pRequest)
3117285242Sachim  {
3118285242Sachim    SA_DBG1(("mpiGetDevInfoRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
3119285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2M");
3120285242Sachim    return AGSA_RC_FAILURE;
3121285242Sachim  }
3122285242Sachim
3123285242Sachim  agContext = saRoot->IOMap[tag].agContext;
3124285242Sachim
3125285242Sachim  /* remove the request from IOMap */
3126285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
3127285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
3128285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
3129285242Sachim
3130285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
3131285242Sachim
3132285242Sachim  /* check status success or failure */
3133285242Sachim  if (status)
3134285242Sachim  {
3135285242Sachim    /* status is FAILED */
3136285242Sachim    ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
3137285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2M");
3138285242Sachim
3139285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3140285242Sachim    pRequest->valid = agFALSE;
3141285242Sachim#if defined(SALLSDK_DEBUG)
3142285242Sachim    option = (bit32)pRequest->DeviceInfoCmdOption;
3143285242Sachim#endif /* SALLSDK_DEBUG */
3144285242Sachim    /* return the request to free pool */
3145285242Sachim    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3146285242Sachim    {
3147285242Sachim      SA_DBG1(("mpiGetDevInfoRsp: saving pRequest (%p) for later use\n", pRequest));
3148285242Sachim      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3149285242Sachim    }
3150285242Sachim    else
3151285242Sachim    {
3152285242Sachim      /* return the request to free pool */
3153285242Sachim      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3154285242Sachim    }
3155285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3156285242Sachim
3157285242Sachim    return AGSA_RC_FAILURE;
3158285242Sachim  }
3159285242Sachim
3160285242Sachim  /* status is SUCCESS */
3161285242Sachim  OSSA_READ_LE_32(AGROOT, &deviceid, pIomb,                OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, deviceId));
3162285242Sachim  OSSA_READ_LE_32(AGROOT, &ARSrateSMPTimeOutPortID, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, ARSrateSMPTimeOutPortID));
3163285242Sachim  OSSA_READ_LE_32(AGROOT, &IRMcnITNexusTimeOut, pIomb,       OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, IRMcnITNexusTimeOut));
3164285242Sachim  OSSA_READ_LE_32(AGROOT, &sasAddrHi, pIomb,       OSSA_OFFSET_OF(agsaGetDevInfoRspV_t,sasAddrHi[0] ));
3165285242Sachim  OSSA_READ_LE_32(AGROOT, &sasAddrLow, pIomb,       OSSA_OFFSET_OF(agsaGetDevInfoRspV_t,sasAddrLow[0] ));
3166285242Sachim
3167285242Sachim  /* find device handle from device index */
3168285242Sachim  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
3169285242Sachim  if (pDevice != agNULL)
3170285242Sachim  {
3171285242Sachim    if (pDevice->targetDevHandle.sdkData)
3172285242Sachim    {
3173285242Sachim      agDevHandle = &(pDevice->targetDevHandle);
3174285242Sachim    }
3175285242Sachim    else
3176285242Sachim    {
3177285242Sachim      agDevHandle = &(pDevice->initiatorDevHandle);
3178285242Sachim    }
3179285242Sachim  }
3180285242Sachim  else
3181285242Sachim  {
3182285242Sachim    SA_DBG1(("mpiGetDevInfoRsp: pDevice is NULL"));
3183285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2M");
3184285242Sachim    return AGSA_RC_FAILURE;
3185285242Sachim  }
3186285242Sachim
3187285242Sachim  if (agDevHandle == agNULL)
3188285242Sachim  {
3189285242Sachim    SA_DBG1(("mpiGetDevInfoRsp: warning!!! no deviceHandle is found"));
3190285242Sachim    ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
3191285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2M");
3192285242Sachim
3193285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3194285242Sachim    pRequest->valid = agFALSE;
3195285242Sachim#if defined(SALLSDK_DEBUG)
3196285242Sachim    option = (bit32)pRequest->DeviceInfoCmdOption;
3197285242Sachim#endif /* SALLSDK_DEBUG */
3198285242Sachim    /* return the request to free pool */
3199285242Sachim    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3200285242Sachim    {
3201285242Sachim      SA_DBG1(("mpiGetDevInfoRsp: saving pRequest (%p) for later use\n", pRequest));
3202285242Sachim      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3203285242Sachim    }
3204285242Sachim    else
3205285242Sachim    {
3206285242Sachim      /* return the request to free pool */
3207285242Sachim      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3208285242Sachim    }
3209285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3210285242Sachim
3211285242Sachim    return AGSA_RC_FAILURE;
3212285242Sachim  }
3213285242Sachim
3214285242Sachim  /* setup common device information */
3215285242Sachim  si_memset(&commonDevInfo, 0, sizeof(agsaDeviceInfo_t));
3216285242Sachim  commonDevInfo.smpTimeout       = (bit16)((ARSrateSMPTimeOutPortID >> SHIFT8 ) & SMPTO_VBITS);
3217285242Sachim  commonDevInfo.it_NexusTimeout  = (bit16)(IRMcnITNexusTimeOut & NEXUSTO_VBITS);
3218285242Sachim  commonDevInfo.firstBurstSize   = (bit16)((IRMcnITNexusTimeOut >> SHIFT16) & FIRST_BURST_MCN);
3219285242Sachim  commonDevInfo.devType_S_Rate   = (bit8)((ARSrateSMPTimeOutPortID >> SHIFT24) & 0x3f);
3220285242Sachim  commonDevInfo.flag = (bit32)((ARSrateSMPTimeOutPortID >> SHIFT30 ) & FLAG_VBITS);
3221285242Sachim  commonDevInfo.flag |= IRMcnITNexusTimeOut & 0xf0000;
3222285242Sachim  if (IRMcnITNexusTimeOut & 0x1000000)
3223285242Sachim  {
3224285242Sachim    commonDevInfo.flag |= 0x100000;
3225285242Sachim  }
3226285242Sachim
3227285242Sachim  /* check SAS device then copy SAS Address */
3228285242Sachim  if ( ((ARSrateSMPTimeOutPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x00) ||
3229285242Sachim       ((ARSrateSMPTimeOutPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x01))
3230285242Sachim  {
3231285242Sachim    /* copy the sasAddressHi byte-by-byte : no endianness */
3232285242Sachim    commonDevInfo.sasAddressHi[0] = pIomb->sasAddrHi[0];
3233285242Sachim    commonDevInfo.sasAddressHi[1] = pIomb->sasAddrHi[1];
3234285242Sachim    commonDevInfo.sasAddressHi[2] = pIomb->sasAddrHi[2];
3235285242Sachim    commonDevInfo.sasAddressHi[3] = pIomb->sasAddrHi[3];
3236285242Sachim
3237285242Sachim    /* copy the sasAddressLow byte-by-byte : no endianness */
3238285242Sachim    commonDevInfo.sasAddressLo[0] = pIomb->sasAddrLow[0];
3239285242Sachim    commonDevInfo.sasAddressLo[1] = pIomb->sasAddrLow[1];
3240285242Sachim    commonDevInfo.sasAddressLo[2] = pIomb->sasAddrLow[2];
3241285242Sachim    commonDevInfo.sasAddressLo[3] = pIomb->sasAddrLow[3];
3242285242Sachim  }
3243285242Sachim
3244285242Sachim  /* copy common device information to SAS and SATA device common header*/
3245285242Sachim  si_memcpy(&pDevice->devInfo.sasDeviceInfo.commonDevInfo, &commonDevInfo, sizeof(agsaDeviceInfo_t));
3246285242Sachim  si_memcpy(&pDevice->devInfo.sataDeviceInfo.commonDevInfo, &commonDevInfo, sizeof(agsaDeviceInfo_t));
3247285242Sachim
3248285242Sachim  /* setup device firstBurstSize infomation */
3249285242Sachim  pDevice->devInfo.sataDeviceInfo.commonDevInfo.firstBurstSize =
3250285242Sachim       (bit16)((IRMcnITNexusTimeOut >> SHIFT16) & FIRST_BURST);
3251285242Sachim
3252285242Sachim  /* Display Device Information */
3253285242Sachim  SA_DBG3(("mpiGetDevInfoRsp: smpTimeout=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.smpTimeout));
3254285242Sachim  SA_DBG3(("mpiGetDevInfoRsp: it_NexusTimeout=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.it_NexusTimeout));
3255285242Sachim  SA_DBG3(("mpiGetDevInfoRsp: firstBurstSize=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.firstBurstSize));
3256285242Sachim  SA_DBG3(("mpiGetDevInfoRsp: devType_S_Rate=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate));
3257285242Sachim
3258285242Sachim  /*
3259285242Sachim  D518 P2I[15-12]: Disk  HP      DG0146FAMWL     , HPDE, WWID=5000c500:17459a31, 6.0G
3260285242Sachim  */
3261285242Sachim
3262285242Sachim  SA_DBG1(("mpiGetDevInfoRsp: Device 0x%08X flag 0x%08X %s WWID= %02x%02x%02x%02x:%02x%02x%02x%02x, %s\n",
3263285242Sachim    deviceid,
3264285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag,
3265285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x20 ? "SATA DA" :
3266285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x10 ? "SSP/SMP" :
3267285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x0 ? "  STP  " : "Unknown",
3268285242Sachim
3269285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3],
3270285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2],
3271285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1],
3272285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0],
3273285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3],
3274285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2],
3275285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1],
3276285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0],
3277285242Sachim
3278285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 8  ? " 1.5G" :
3279285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 9  ? " 3.0G" :
3280285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 10 ? " 6.0G" :
3281285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 11 ? "12.0G" : "????" ));
3282285242Sachim
3283285242Sachim  ossaGetDeviceInfoCB(agRoot, agContext, agDevHandle, OSSA_DEV_INFO_NO_EXTENDED_INFO, &commonDevInfo);
3284285242Sachim
3285285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3286285242Sachim  pRequest->valid = agFALSE;
3287285242Sachim#if defined(SALLSDK_DEBUG)
3288285242Sachim  option = (bit32)pRequest->DeviceInfoCmdOption;
3289285242Sachim#endif /* SALLSDK_DEBUG */
3290285242Sachim  /* return the request to free pool */
3291285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3292285242Sachim  {
3293285242Sachim    SA_DBG1(("mpiGetDevInfoRsp: saving pRequest (%p) for later use\n", pRequest));
3294285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3295285242Sachim  }
3296285242Sachim  else
3297285242Sachim  {
3298285242Sachim    /* return the request to free pool */
3299285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3300285242Sachim  }
3301285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3302285242Sachim
3303285242Sachim  /* return value */
3304285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2M");
3305285242Sachim  return ret;
3306285242Sachim}
3307285242Sachim
3308285242Sachim/******************************************************************************/
3309285242Sachim/*! \brief Get Device Information Response
3310285242Sachim *
3311285242Sachim *  This routine handles the response of Get Device Info Command Response
3312285242Sachim *
3313285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
3314285242Sachim *  \param pIomb        Pointer of IOMB Message
3315285242Sachim *
3316285242Sachim *  \return sucess or fail
3317285242Sachim *
3318285242Sachim */
3319285242Sachim/*******************************************************************************/
3320285242SachimGLOBAL bit32 mpiGetDevInfoRspSpc(
3321285242Sachim  agsaRoot_t          *agRoot,
3322285242Sachim  agsaGetDevInfoRsp_t *pIomb
3323285242Sachim  )
3324285242Sachim{
3325285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
3326285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
3327285242Sachim  agsaIORequestDesc_t *pRequest;
3328285242Sachim  agsaDevHandle_t     *agDevHandle;
3329285242Sachim  agsaDeviceDesc_t    *pDevice;
3330285242Sachim  agsaContext_t       *agContext;
3331285242Sachim  bit32               dTypeSrateSMPTOPortID, FirstBurstSizeITNexusTimeOut, status, tag;
3332285242Sachim  bit32               deviceid;
3333285242Sachim  bit32               sasAddrHi;
3334285242Sachim  bit32               sasAddrLow;
3335285242Sachim  bit32               Info_avail = 0;
3336285242Sachim
3337285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2t");
3338285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, status));
3339285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, tag));
3340285242Sachim  /* get TAG */
3341285242Sachim  SA_DBG3(("mpiGetDevInfoRspSpc: HTag=0x%x\n", tag));
3342285242Sachim
3343285242Sachim  /* get request from IOMap */
3344285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
3345285242Sachim  if (agNULL == pRequest)
3346285242Sachim  {
3347285242Sachim    SA_DBG1(("mpiGetDevInfoRspSpc: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
3348285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2t");
3349285242Sachim    return AGSA_RC_FAILURE;
3350285242Sachim  }
3351285242Sachim
3352285242Sachim  agContext = saRoot->IOMap[tag].agContext;
3353285242Sachim
3354285242Sachim  /* remove the request from IOMap */
3355285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
3356285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
3357285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
3358285242Sachim
3359285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
3360285242Sachim
3361285242Sachim  /* check status success or failure */
3362285242Sachim  if (status)
3363285242Sachim  {
3364285242Sachim    /* status is FAILED */
3365285242Sachim    ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
3366285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2t");
3367285242Sachim    return AGSA_RC_FAILURE;
3368285242Sachim  }
3369285242Sachim
3370285242Sachim  /* status is SUCCESS */
3371285242Sachim  OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, deviceId));
3372285242Sachim  OSSA_READ_LE_32(AGROOT, &dTypeSrateSMPTOPortID, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, dTypeSrateSMPTOArPortID));
3373285242Sachim  OSSA_READ_LE_32(AGROOT, &FirstBurstSizeITNexusTimeOut, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, FirstBurstSizeITNexusTimeOut));
3374285242Sachim  OSSA_READ_LE_32(AGROOT, &sasAddrHi, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, sasAddrHi[0]));
3375285242Sachim  OSSA_READ_LE_32(AGROOT, &sasAddrLow, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, sasAddrLow[0]));
3376285242Sachim
3377285242Sachim
3378285242Sachim  SA_DBG2(("mpiGetDevInfoRspSpc:deviceid                     0x%08X\n",deviceid));
3379285242Sachim  SA_DBG2(("mpiGetDevInfoRspSpc:dTypeSrateSMPTOPortID        0x%08X\n",dTypeSrateSMPTOPortID));
3380285242Sachim  SA_DBG2(("mpiGetDevInfoRspSpc:FirstBurstSizeITNexusTimeOut 0x%08X\n",FirstBurstSizeITNexusTimeOut));
3381285242Sachim  SA_DBG2(("mpiGetDevInfoRspSpc:sasAddrHi                    0x%08X\n",sasAddrHi));
3382285242Sachim  SA_DBG2(("mpiGetDevInfoRspSpc:sasAddrLow                   0x%08X\n",sasAddrLow));
3383285242Sachim
3384285242Sachim
3385285242Sachim  /* find device handle from device index */
3386285242Sachim  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
3387285242Sachim  if (pDevice != agNULL)
3388285242Sachim  {
3389285242Sachim    if (pDevice->targetDevHandle.sdkData)
3390285242Sachim    {
3391285242Sachim      agDevHandle = &(pDevice->targetDevHandle);
3392285242Sachim    }
3393285242Sachim    else
3394285242Sachim    {
3395285242Sachim      agDevHandle = &(pDevice->initiatorDevHandle);
3396285242Sachim    }
3397285242Sachim  }
3398285242Sachim  else
3399285242Sachim  {
3400285242Sachim    SA_DBG1(("mpiGetDevInfoRspSpc: pDevice is NULL"));
3401285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2t");
3402285242Sachim    return AGSA_RC_FAILURE;
3403285242Sachim  }
3404285242Sachim
3405285242Sachim  if (agDevHandle == agNULL)
3406285242Sachim  {
3407285242Sachim    SA_DBG1(("mpiGetDevInfoRspSpc: warning!!! no deviceHandle is found"));
3408285242Sachim    ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
3409285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2t");
3410285242Sachim
3411285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3412285242Sachim    pRequest->valid = agFALSE;
3413285242Sachim    /* return the request to free pool */
3414285242Sachim    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3415285242Sachim    {
3416285242Sachim      SA_DBG1(("mpiGetDevInfoRspSpc: saving pRequest (%p) for later use\n", pRequest));
3417285242Sachim      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3418285242Sachim    }
3419285242Sachim    else
3420285242Sachim    {
3421285242Sachim      /* return the request to free pool */
3422285242Sachim      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3423285242Sachim    }
3424285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3425285242Sachim
3426285242Sachim    return AGSA_RC_FAILURE;
3427285242Sachim  }
3428285242Sachim
3429285242Sachim  Info_avail = OSSA_DEV_INFO_NO_EXTENDED_INFO;
3430285242Sachim
3431285242Sachim  /* setup device common infomation */
3432285242Sachim  pDevice->devInfo.sasDeviceInfo.commonDevInfo.smpTimeout =
3433285242Sachim    (bit16)((dTypeSrateSMPTOPortID >> SHIFT8 ) & SMPTO_BITS);
3434285242Sachim
3435285242Sachim  pDevice->devInfo.sataDeviceInfo.commonDevInfo.smpTimeout =
3436285242Sachim    (bit16)((dTypeSrateSMPTOPortID >> SHIFT8 ) & SMPTO_BITS);
3437285242Sachim
3438285242Sachim  pDevice->devInfo.sasDeviceInfo.commonDevInfo.it_NexusTimeout =
3439285242Sachim    (bit16)(FirstBurstSizeITNexusTimeOut & NEXUSTO_BITS);
3440285242Sachim
3441285242Sachim  pDevice->devInfo.sataDeviceInfo.commonDevInfo.it_NexusTimeout =
3442285242Sachim    (bit16)(FirstBurstSizeITNexusTimeOut & NEXUSTO_BITS);
3443285242Sachim
3444285242Sachim  pDevice->devInfo.sasDeviceInfo.commonDevInfo.firstBurstSize =
3445285242Sachim    (bit16)((FirstBurstSizeITNexusTimeOut >> SHIFT16) & FIRST_BURST);
3446285242Sachim
3447285242Sachim  pDevice->devInfo.sataDeviceInfo.commonDevInfo.firstBurstSize =
3448285242Sachim    (bit16)((FirstBurstSizeITNexusTimeOut >> SHIFT16) & FIRST_BURST);
3449285242Sachim
3450285242Sachim  pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag = (bit32)((dTypeSrateSMPTOPortID >> SHIFT4 ) & FLAG_BITS);
3451285242Sachim
3452285242Sachim  pDevice->devInfo.sataDeviceInfo.commonDevInfo.flag = (bit32)((dTypeSrateSMPTOPortID >> SHIFT4 ) & FLAG_BITS);
3453285242Sachim
3454285242Sachim  pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate =
3455285242Sachim    (bit8)((dTypeSrateSMPTOPortID >> SHIFT24) & LINK_RATE_BITS);
3456285242Sachim
3457285242Sachim  pDevice->devInfo.sataDeviceInfo.commonDevInfo.devType_S_Rate =
3458285242Sachim    (bit8)((dTypeSrateSMPTOPortID >> SHIFT24) & LINK_RATE_BITS);
3459285242Sachim
3460285242Sachim  /* check SAS device then copy SAS Address */
3461285242Sachim  if ( ((dTypeSrateSMPTOPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x00) ||
3462285242Sachim       ((dTypeSrateSMPTOPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x01))
3463285242Sachim  {
3464285242Sachim    /* copy the sasAddressHi byte-by-byte : no endianness */
3465285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0] = pIomb->sasAddrHi[0];
3466285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1] = pIomb->sasAddrHi[1];
3467285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2] = pIomb->sasAddrHi[2];
3468285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3] = pIomb->sasAddrHi[3];
3469285242Sachim
3470285242Sachim    /* copy the sasAddressLow byte-by-byte : no endianness */
3471285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0] = pIomb->sasAddrLow[0];
3472285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1] = pIomb->sasAddrLow[1];
3473285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2] = pIomb->sasAddrLow[2];
3474285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3] = pIomb->sasAddrLow[3];
3475285242Sachim  }
3476285242Sachim
3477285242Sachim  /* Display Device Information */
3478285242Sachim  SA_DBG3(("mpiGetDevInfoRspSpc: smpTimeout=     0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.smpTimeout));
3479285242Sachim  SA_DBG3(("mpiGetDevInfoRspSpc: it_NexusTimeout=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.it_NexusTimeout));
3480285242Sachim  SA_DBG3(("mpiGetDevInfoRspSpc: firstBurstSize= 0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.firstBurstSize));
3481285242Sachim  SA_DBG3(("mpiGetDevInfoRspSpc: devType_S_Rate= 0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate));
3482285242Sachim
3483285242Sachim
3484285242Sachim  SA_DBG1(("Device SPC deviceid 0x%08X flag 0x%08X %s WWID= %02x%02x%02x%02x:%02x%02x%02x%02x, %s\n",
3485285242Sachim    deviceid,
3486285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag,
3487285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x20 ? "SATA DA" :
3488285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x10 ? "SSP/SMP" :
3489285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x0 ? "  STP  " : "Unknown",
3490285242Sachim
3491285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3],
3492285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2],
3493285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1],
3494285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0],
3495285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3],
3496285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2],
3497285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1],
3498285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0],
3499285242Sachim
3500285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 8  ? " 1.5G" :
3501285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 9  ? " 3.0G" :
3502285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 10 ? " 6.0G" :
3503285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 11 ? "12.0G" : "????" ));
3504285242Sachim
3505285242Sachim  ossaGetDeviceInfoCB(agRoot, agContext, agDevHandle, Info_avail, &pDevice->devInfo.sasDeviceInfo.commonDevInfo);
3506285242Sachim
3507285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3508285242Sachim  pRequest->valid = agFALSE;
3509285242Sachim  /* return the request to free pool */
3510285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3511285242Sachim  {
3512285242Sachim    SA_DBG1(("mpiGetDevInfoRspSpc: saving pRequest (%p) for later use\n", pRequest));
3513285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3514285242Sachim  }
3515285242Sachim  else
3516285242Sachim  {
3517285242Sachim    /* return the request to free pool */
3518285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3519285242Sachim  }
3520285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3521285242Sachim
3522285242Sachim  /* return value */
3523285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2t");
3524285242Sachim  return ret;
3525285242Sachim}
3526285242Sachim
3527285242Sachim/******************************************************************************/
3528285242Sachim/*! \brief Set Device Information Response
3529285242Sachim *
3530285242Sachim *  This routine handles the response of Set Device Info Command Response
3531285242Sachim *
3532285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
3533285242Sachim *  \param pIomb        Pointer of IOMB Message
3534285242Sachim *
3535285242Sachim *  \return sucess or fail
3536285242Sachim *
3537285242Sachim */
3538285242Sachim/*******************************************************************************/
3539285242SachimGLOBAL bit32 mpiSetDevInfoRsp(
3540285242Sachim  agsaRoot_t             *agRoot,
3541285242Sachim  agsaSetDeviceInfoRsp_t *pIomb
3542285242Sachim  )
3543285242Sachim{
3544285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
3545285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
3546285242Sachim  agsaIORequestDesc_t *pRequest;
3547285242Sachim  agsaDevHandle_t     *agDevHandle;
3548285242Sachim  agsaDeviceDesc_t    *pDevice;
3549285242Sachim  agsaContext_t       *agContext;
3550285242Sachim  bit32               tag, status, deviceid, option, param;
3551285242Sachim
3552285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2v");
3553285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, status));
3554285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, tag));
3555285242Sachim  /* get TAG */
3556285242Sachim  SA_DBG3(("mpiSetDevInfoRsp: HTag=0x%x\n", tag));
3557285242Sachim
3558285242Sachim  /* get request from IOMap */
3559285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
3560285242Sachim  if (agNULL == pRequest)
3561285242Sachim  {
3562285242Sachim    SA_DBG1(("mpiSetDevInfoRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
3563285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2v");
3564285242Sachim    return AGSA_RC_FAILURE;
3565285242Sachim  }
3566285242Sachim
3567285242Sachim  agContext = saRoot->IOMap[tag].agContext;
3568285242Sachim
3569285242Sachim  /* remove the request from IOMap */
3570285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
3571285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
3572285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
3573285242Sachim
3574285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
3575285242Sachim  /* check status success or failure */
3576285242Sachim  if (status)
3577285242Sachim  {
3578285242Sachim    /* status is FAILED */
3579285242Sachim    if (pRequest->completionCB == agNULL)
3580285242Sachim    {
3581285242Sachim      SA_DBG1(("mpiSetDevInfoRsp: status is FAILED pRequest->completionCB == agNULL\n" ));
3582285242Sachim      ossaSetDeviceInfoCB(agRoot, agContext, agNULL, status, 0, 0);
3583285242Sachim    }
3584285242Sachim    else
3585285242Sachim    {
3586285242Sachim      SA_DBG1(("mpiSetDevInfoRsp: status is FAILED use CB\n" ));
3587285242Sachim      (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agNULL, status, 0, 0);
3588285242Sachim    }
3589285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2v");
3590285242Sachim
3591285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3592285242Sachim    pRequest->valid = agFALSE;
3593285242Sachim    /* return the request to free pool */
3594285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3595285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3596285242Sachim
3597285242Sachim    return AGSA_RC_FAILURE;
3598285242Sachim  }
3599285242Sachim
3600285242Sachim  /* status is SUCCESS */
3601285242Sachim  OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, deviceId));
3602285242Sachim  OSSA_READ_LE_32(AGROOT, &option, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, SA_SR_SI));
3603285242Sachim  OSSA_READ_LE_32(AGROOT, &param, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, A_R_ITNT));
3604285242Sachim
3605285242Sachim  /* find device handle from device index */
3606285242Sachim  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
3607285242Sachim  if (pDevice != agNULL)
3608285242Sachim  {
3609285242Sachim    if (pDevice->targetDevHandle.sdkData)
3610285242Sachim    {
3611285242Sachim      agDevHandle = &(pDevice->targetDevHandle);
3612285242Sachim    }
3613285242Sachim    else
3614285242Sachim    {
3615285242Sachim      agDevHandle = &(pDevice->initiatorDevHandle);
3616285242Sachim    }
3617285242Sachim  }
3618285242Sachim  else
3619285242Sachim  {
3620285242Sachim    SA_DBG1(("mpiSetDevInfoRsp: pDevice is NULL"));
3621285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3622285242Sachim    pRequest->valid = agFALSE;
3623285242Sachim    /* return the request to free pool */
3624285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3625285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3626285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2v");
3627285242Sachim    return AGSA_RC_FAILURE;
3628285242Sachim  }
3629285242Sachim
3630285242Sachim  if (agDevHandle == agNULL)
3631285242Sachim  {
3632285242Sachim    SA_DBG1(("mpiSetDevInfoRsp: warning!!! no deviceHandle is found"));
3633285242Sachim    if (pRequest->completionCB == agNULL)
3634285242Sachim    {
3635285242Sachim      ossaSetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0, 0);
3636285242Sachim    }
3637285242Sachim    else
3638285242Sachim    {
3639285242Sachim      (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0, 0);
3640285242Sachim    }
3641285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2v");
3642285242Sachim
3643285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3644285242Sachim    pRequest->valid = agFALSE;
3645285242Sachim    /* return the request to free pool */
3646285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3647285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3648285242Sachim
3649285242Sachim    return AGSA_RC_FAILURE;
3650285242Sachim  }
3651285242Sachim
3652285242Sachim  SA_DBG2(("mpiSetDevInfoRsp:, option 0x%X param 0x%X\n", option, param));
3653285242Sachim
3654285242Sachim  if(smIS_SPCV(agRoot))
3655285242Sachim  {
3656285242Sachim    SA_DBG2(("mpiSetDevInfoRsp:was option 0x%X param 0x%X\n", option, param));
3657285242Sachim    SA_DBG2(("mpiSetDevInfoRsp:pDevice->option 0x%X pDevice->param 0x%X\n", pDevice->option, pDevice->param));
3658285242Sachim    option |= pDevice->option;
3659285242Sachim    param |= pDevice->param;
3660285242Sachim    SA_DBG2(("mpiSetDevInfoRsp:now option 0x%X param 0x%X\n", option, param));
3661285242Sachim    if (pRequest->completionCB == agNULL)
3662285242Sachim    {
3663285242Sachim      ossaSetDeviceInfoCB(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
3664285242Sachim    }
3665285242Sachim    else
3666285242Sachim    {
3667285242Sachim      (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
3668285242Sachim    }
3669285242Sachim  }
3670285242Sachim  else
3671285242Sachim  {
3672285242Sachim    SA_DBG2(("mpiSetDevInfoRsp:, option 0x%X param 0x%X\n", option, param));
3673285242Sachim    if (pRequest->completionCB == agNULL)
3674285242Sachim    {
3675285242Sachim      ossaSetDeviceInfoCB(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
3676285242Sachim    }
3677285242Sachim    else
3678285242Sachim    {
3679285242Sachim      (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
3680285242Sachim    }
3681285242Sachim  }
3682285242Sachim
3683285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3684285242Sachim  pRequest->valid = agFALSE;
3685285242Sachim  /* return the request to free pool */
3686285242Sachim  saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3687285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3688285242Sachim
3689285242Sachim  /* return value */
3690285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2v");
3691285242Sachim  return ret;
3692285242Sachim}
3693285242Sachim
3694285242Sachim/******************************************************************************/
3695285242Sachim/*! \brief SPC MPI SSP Event
3696285242Sachim *
3697285242Sachim *  This function handles the SAS Event.
3698285242Sachim *
3699285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
3700285242Sachim *  \param pIomb        pointer of Message
3701285242Sachim *
3702285242Sachim *  \return The read value
3703285242Sachim *
3704285242Sachim */
3705285242Sachim/*******************************************************************************/
3706285242SachimGLOBAL bit32 mpiSSPEvent(
3707285242Sachim  agsaRoot_t        *agRoot,
3708285242Sachim  agsaSSPEventRsp_t *pIomb
3709285242Sachim  )
3710285242Sachim{
3711285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
3712285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
3713285242Sachim  agsaIORequestDesc_t *pRequest;
3714285242Sachim  agsaPortContext_t   *agPortContext;
3715285242Sachim  agsaDevHandle_t     *agDevHandle;
3716285242Sachim  agsaDeviceDesc_t    *pDevice;
3717285242Sachim  bit32               event,deviceId;
3718285242Sachim  bit32               deviceIdx, tag, portId_tmp;
3719285242Sachim  bit32               SSPTag;
3720285242Sachim  bit16               sspTag;
3721285242Sachim  bit8                portId;
3722285242Sachim
3723285242Sachim  agsaDifDetails_t Dif_details;
3724285242Sachim
3725285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2u");
3726285242Sachim
3727285242Sachim  OSSA_READ_LE_32(AGROOT, &event, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, event));
3728285242Sachim  OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, deviceId));
3729285242Sachim  OSSA_READ_LE_32(AGROOT, &portId_tmp, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, portId));
3730285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, tag));
3731285242Sachim  OSSA_READ_LE_32(AGROOT, &SSPTag, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, SSPTag));
3732285242Sachim
3733285242Sachim
3734285242Sachim  sspTag = (bit16)(SSPTag & SSPTAG_BITS);
3735285242Sachim
3736285242Sachim  /* get IORequest from IOMap */
3737285242Sachim  pRequest  = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
3738285242Sachim
3739285242Sachim  SA_ASSERT((pRequest), "pRequest");
3740285242Sachim
3741285242Sachim  if(agNULL == pRequest)
3742285242Sachim  {
3743285242Sachim    SA_DBG1(("mpiSSPEvent: agNULL == pRequest event 0x%X\n", event));
3744285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2u");
3745285242Sachim    return AGSA_RC_FAILURE;
3746285242Sachim  }
3747285242Sachim
3748285242Sachim  /* get port context */
3749285242Sachim  portId = (bit8)(portId_tmp & PORTID_MASK);
3750285242Sachim  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));
3751285242Sachim  agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
3752285242Sachim  /* get device Id */
3753285242Sachim  deviceIdx = deviceId & DEVICE_ID_BITS;
3754285242Sachim  OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
3755285242Sachim  /* find device handle from device index */
3756285242Sachim  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
3757285242Sachim
3758285242Sachim  if( agNULL == pDevice )
3759285242Sachim  {
3760285242Sachim    OS_ASSERT(pDevice, "pDevice");
3761285242Sachim    agDevHandle = agNULL;
3762285242Sachim  }
3763285242Sachim  else
3764285242Sachim  {
3765285242Sachim    if (pDevice->targetDevHandle.sdkData)
3766285242Sachim    {
3767285242Sachim      agDevHandle = &(pDevice->targetDevHandle);
3768285242Sachim    }
3769285242Sachim    else
3770285242Sachim    {
3771285242Sachim      agDevHandle = &(pDevice->initiatorDevHandle);
3772285242Sachim    }
3773285242Sachim  }
3774285242Sachim
3775285242Sachim  switch (event)
3776285242Sachim  {
3777285242Sachim    case  OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
3778285242Sachim    case  OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
3779285242Sachim    case  OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
3780285242Sachim    case  OSSA_IO_XFR_ERROR_DIF_MISMATCH:
3781285242Sachim    {
3782285242Sachim
3783285242Sachim      SA_DBG1(("mpiSSPEvent:  DIF Event 0x%x HTAG = 0x%x\n", event, tag));
3784285242Sachim
3785285242Sachim      OSSA_READ_LE_32(AGROOT, &Dif_details.UpperLBA,           pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, EVT_PARAM0_or_LBAH));
3786285242Sachim      OSSA_READ_LE_32(AGROOT, &Dif_details.LowerLBA,           pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, EVT_PARAM1_or_LBAL));
3787285242Sachim      OSSA_READ_LE_32(AGROOT, &Dif_details.sasAddressHi,       pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, SAS_ADDRH));
3788285242Sachim      OSSA_READ_LE_32(AGROOT, &Dif_details.sasAddressLo,       pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, SAS_ADDRL));
3789285242Sachim      OSSA_READ_LE_32(AGROOT, &Dif_details.ExpectedCRCUDT01,   pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT1_E_UDT0_E_CRC_E));
3790285242Sachim      OSSA_READ_LE_32(AGROOT, &Dif_details.ExpectedUDT2345,    pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT5_E_UDT4_E_UDT3_E_UDT2_E));
3791285242Sachim      OSSA_READ_LE_32(AGROOT, &Dif_details.ActualCRCUDT01,     pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT1_A_UDT0_A_CRC_A));
3792285242Sachim      OSSA_READ_LE_32(AGROOT, &Dif_details.ActualUDT2345,      pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT5_A_UDT4_A_UDT3_A_UDT2_A));
3793285242Sachim      OSSA_READ_LE_32(AGROOT, &Dif_details.DIFErrDevID,        pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, HW_DEVID_Reserved_DIF_ERR));
3794285242Sachim      OSSA_READ_LE_32(AGROOT, &Dif_details.ErrBoffsetEDataLen, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, EDATA_LEN_ERR_BOFF));
3795285242Sachim
3796285242Sachim      SA_DBG2(("mpiSSPEvent: UpperLBA.         0x%08X LowerLBA.           0x%08X\n",Dif_details.UpperLBA,         Dif_details.LowerLBA));
3797285242Sachim      SA_DBG2(("mpiSSPEvent: sasAddressHi.     0x%02X%02X%02X%02X sasAddressLo.       0x%02X%02X%02X%02X\n",
3798285242Sachim                          Dif_details.sasAddressHi[0],Dif_details.sasAddressHi[1],Dif_details.sasAddressHi[2],Dif_details.sasAddressHi[3],
3799285242Sachim                          Dif_details.sasAddressLo[0],Dif_details.sasAddressLo[1],Dif_details.sasAddressLo[2],Dif_details.sasAddressLo[3]));
3800285242Sachim      SA_DBG2(("mpiSSPEvent: ExpectedCRCUDT01. 0x%08X ExpectedUDT2345.    0x%08X\n",Dif_details.ExpectedCRCUDT01, Dif_details.ExpectedUDT2345));
3801285242Sachim      SA_DBG2(("mpiSSPEvent: ActualCRCUDT01.   0x%08X ActualUDT2345.      0x%08X\n",Dif_details.ActualCRCUDT01,   Dif_details.ActualUDT2345));
3802285242Sachim      SA_DBG2(("mpiSSPEvent: DIFErrDevID.      0x%08X ErrBoffsetEDataLen. 0x%08X\n",Dif_details.DIFErrDevID,      Dif_details.ErrBoffsetEDataLen));
3803285242Sachim    }
3804285242Sachim
3805285242Sachim    default:
3806285242Sachim    {
3807285242Sachim      SA_DBG3(("mpiSSPEvent:  Non DIF event"));
3808285242Sachim      break;
3809285242Sachim    }
3810285242Sachim  }
3811285242Sachim
3812285242Sachim
3813285242Sachim  /* get event */
3814285242Sachim  switch (event)
3815285242Sachim  {
3816285242Sachim    case OSSA_IO_OVERFLOW:
3817285242Sachim    {
3818285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_OVERFLOW tag 0x%x ssptag 0x%x\n", tag, sspTag));
3819285242Sachim      saRoot->IoEventCount.agOSSA_IO_OVERFLOW++;
3820285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3821285242Sachim      break;
3822285242Sachim    }
3823285242Sachim    case OSSA_IO_XFER_ERROR_BREAK:
3824285242Sachim    {
3825285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_BREAK tag 0x%x ssptag 0x%x\n", tag, sspTag));
3826285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_BREAK++;
3827285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3828285242Sachim      break;
3829285242Sachim    }
3830285242Sachim    case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
3831285242Sachim    {
3832285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_PHY_NOT_READY tag 0x%x ssptag 0x%x\n", tag, sspTag));
3833285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
3834285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3835285242Sachim      break;
3836285242Sachim    }
3837285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
3838285242Sachim    {
3839285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3840285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
3841285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3842285242Sachim      break;
3843285242Sachim    }
3844285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
3845285242Sachim    {
3846285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION tag 0x%x ssptag 0x%x\n", tag, sspTag));
3847285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
3848285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3849285242Sachim      break;
3850285242Sachim    }
3851285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_BREAK:
3852285242Sachim    {
3853285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_BREAK tag 0x%x ssptag 0x%x\n", tag, sspTag));
3854285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
3855285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3856285242Sachim      break;
3857285242Sachim    }
3858285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
3859285242Sachim    {
3860285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS tag 0x%x ssptag 0x%x\n", tag, sspTag));
3861285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
3862285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3863285242Sachim      break;
3864285242Sachim    }
3865285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
3866285242Sachim    {
3867285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION tag 0x%x ssptag 0x%x\n", tag, sspTag));
3868285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
3869285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3870285242Sachim      break;
3871285242Sachim    }
3872285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
3873285242Sachim    {
3874285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3875285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
3876285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3877285242Sachim      break;
3878285242Sachim    }
3879285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
3880285242Sachim    {
3881285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION tag 0x%x ssptag 0x%x\n", tag, sspTag));
3882285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
3883285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3884285242Sachim      break;
3885285242Sachim    }
3886285242Sachim    case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
3887285242Sachim    {
3888285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_NAK_RECEIVED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3889285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_NAK_RECEIVED++;
3890285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3891285242Sachim      break;
3892285242Sachim    }
3893285242Sachim    case OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT:
3894285242Sachim    {
3895285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT tag 0x%x ssptag 0x%x\n", tag, sspTag));
3896285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT++;
3897285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3898285242Sachim      break;
3899285242Sachim    }
3900285242Sachim    case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH:
3901285242Sachim    {
3902285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
3903285242Sachim#ifdef SA_ENABLE_PCI_TRIGGER
3904285242Sachim      if( saRoot->swConfig.PCI_trigger & PCI_TRIGGER_OFFSET_MISMATCH )
3905285242Sachim      {
3906285242Sachim        siPCITriger(agRoot);
3907285242Sachim      }
3908285242Sachim#endif /* SA_ENABLE_PCI_TRIGGER */
3909285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_OFFSET_MISMATCH++;
3910285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3911285242Sachim      break;
3912285242Sachim    }
3913285242Sachim    case OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN:
3914285242Sachim    {
3915285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN tag 0x%x ssptag 0x%x\n", tag, sspTag));
3916285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN++;
3917285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3918285242Sachim      break;
3919285242Sachim    }
3920285242Sachim    case OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT:
3921285242Sachim    {
3922285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT tag 0x%x ssptag 0x%x\n", tag, sspTag));
3923285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT++;
3924285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3925285242Sachim      break;
3926285242Sachim    }
3927285242Sachim    case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
3928285242Sachim    {
3929285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT tag 0x%x ssptag 0x%x\n", tag, sspTag));
3930285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
3931285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3932285242Sachim      break;
3933285242Sachim    }
3934285242Sachim    case OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN:
3935285242Sachim    {
3936285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN tag 0x%x ssptag 0x%x\n", tag, sspTag));
3937285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN++;
3938285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3939285242Sachim      break;
3940285242Sachim    }
3941285242Sachim    case OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED:
3942285242Sachim    {
3943285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3944285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED++;
3945285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3946285242Sachim      break;
3947285242Sachim    }
3948285242Sachim    case OSSA_IO_XFER_CMD_FRAME_ISSUED:
3949285242Sachim    {
3950285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3951285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_CMD_FRAME_ISSUED++;
3952285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3953285242Sachim      break;
3954285242Sachim    }
3955285242Sachim    case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE:
3956285242Sachim    {
3957285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE tag 0x%x ssptag 0x%x\n", tag, sspTag));
3958285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_UNEXPECTED_PHASE++;
3959285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3960285242Sachim      break;
3961285242Sachim    }
3962285242Sachim    case  OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
3963285242Sachim    {
3964285242Sachim      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));
3965285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
3966285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3967285242Sachim      break;
3968285242Sachim    }
3969285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
3970285242Sachim    {
3971285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO tag 0x%x ssptag 0x%x\n", tag, sspTag));
3972285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO++;
3973285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3974285242Sachim      break;
3975285242Sachim    }
3976285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
3977285242Sachim    {
3978285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST tag 0x%x ssptag 0x%x\n", tag, sspTag));
3979285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
3980285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3981285242Sachim      break;
3982285242Sachim    }
3983285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
3984285242Sachim    {
3985285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE tag 0x%x ssptag 0x%x\n", tag, sspTag));
3986285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE++;
3987285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3988285242Sachim      break;
3989285242Sachim    }
3990285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
3991285242Sachim    {
3992285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3993285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
3994285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3995285242Sachim      break;
3996285242Sachim    }
3997285242Sachim    case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
3998285242Sachim    {
3999285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS tag 0x%x ssptag 0x%x\n", tag, sspTag));
4000285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS++;
4001285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
4002285242Sachim      break;
4003285242Sachim    }
4004285242Sachim    case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
4005285242Sachim    {
4006285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4007285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH++;
4008285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
4009285242Sachim      break;
4010285242Sachim    }
4011285242Sachim    case  OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR:
4012285242Sachim    {
4013285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR HTAG = 0x%x\n", tag));
4014285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR++;
4015285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
4016285242Sachim      break;
4017285242Sachim    }
4018285242Sachim    case  OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
4019285242Sachim    {
4020285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4021285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH++;
4022285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
4023285242Sachim      break;
4024285242Sachim    }
4025285242Sachim    case  OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
4026285242Sachim    {
4027285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4028285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH++;
4029285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
4030285242Sachim      break;
4031285242Sachim    }
4032285242Sachim    case  OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
4033285242Sachim    {
4034285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4035285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH++;
4036285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
4037285242Sachim      break;
4038285242Sachim    }
4039285242Sachim    case  OSSA_IO_XFR_ERROR_DIF_MISMATCH:
4040285242Sachim    {
4041285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4042285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_MISMATCH++;
4043285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
4044285242Sachim      break;
4045285242Sachim    }
4046285242Sachim    case  OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
4047285242Sachim    {
4048285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN tag 0x%x ssptag 0x%x\n", tag, sspTag));
4049285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERR_EOB_DATA_OVERRUN++;
4050285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0, agNULL);
4051285242Sachim      break;
4052285242Sachim    }
4053285242Sachim    case OSSA_IO_XFER_READ_COMPL_ERR:
4054285242Sachim    {
4055285242Sachim      SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_READ_COMPL_ERR tag 0x%x ssptag 0x%x\n", tag, sspTag));
4056285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_READ_COMPL_ERR++;
4057285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0, agNULL);
4058285242Sachim      break;
4059285242Sachim    }
4060285242Sachim    default:
4061285242Sachim    {
4062285242Sachim      SA_DBG1(("mpiSSPEvent:  Unknown Event 0x%x tag 0x%x ssptag 0x%x\n", event, tag, sspTag));
4063285242Sachim      saRoot->IoEventCount.agOSSA_IO_UNKNOWN_ERROR++;
4064285242Sachim      ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
4065285242Sachim      break;
4066285242Sachim    }
4067285242Sachim  }
4068285242Sachim
4069285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2u");
4070285242Sachim  /* return value */
4071285242Sachim  return ret;
4072285242Sachim}
4073285242Sachim
4074285242Sachim/******************************************************************************/
4075285242Sachim/*! \brief SPC MPI SATA Event
4076285242Sachim *
4077285242Sachim *  This function handles the SATA Event.
4078285242Sachim *
4079285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
4080285242Sachim *  \param pIomb        pointer of Message
4081285242Sachim *
4082285242Sachim *  \return The read value
4083285242Sachim *
4084285242Sachim */
4085285242Sachim/*******************************************************************************/
4086285242SachimGLOBAL bit32 mpiSATAEvent(
4087285242Sachim  agsaRoot_t         *agRoot,
4088285242Sachim  agsaSATAEventRsp_t *pIomb
4089285242Sachim  )
4090285242Sachim{
4091285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
4092285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4093285242Sachim  agsaIORequestDesc_t *pRequest = agNULL;
4094285242Sachim  agsaPortContext_t   *agPortContext;
4095285242Sachim  agsaDevHandle_t     *agDevHandle;
4096285242Sachim  agsaDeviceDesc_t    *pDevice;
4097285242Sachim  bit32               deviceIdx, portId_tmp, event, tag, deviceId;
4098285242Sachim  bit8                portId;
4099285242Sachim
4100285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2w");
4101285242Sachim
4102285242Sachim  /* get port context */
4103285242Sachim  OSSA_READ_LE_32(AGROOT, &portId_tmp, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, portId));
4104285242Sachim  OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, deviceId));
4105285242Sachim  OSSA_READ_LE_32(AGROOT, &event, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, event));
4106285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, tag));
4107285242Sachim
4108285242Sachim  if (OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE != event)
4109285242Sachim  {
4110285242Sachim    /* get IORequest from IOMap */
4111285242Sachim    pRequest  = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4112285242Sachim  }
4113285242Sachim  /* get port context - only for OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE */
4114285242Sachim  portId = (bit8)(portId_tmp & PORTID_MASK);
4115285242Sachim  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));
4116285242Sachim  agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
4117285242Sachim  /* get device Id - only for OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE*/
4118285242Sachim  deviceIdx = deviceId & DEVICE_ID_BITS;
4119285242Sachim  OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
4120285242Sachim  /* find device handle from device index */
4121285242Sachim  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
4122285242Sachim  agDevHandle = &(pDevice->targetDevHandle);
4123285242Sachim
4124285242Sachim  /* get event */
4125285242Sachim  switch (event)
4126285242Sachim  {
4127285242Sachim    case OSSA_IO_OVERFLOW:
4128285242Sachim    {
4129285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_OVERFLOW HTAG = 0x%x\n", tag));
4130285242Sachim      saRoot->IoEventCount.agOSSA_IO_OVERFLOW++;
4131285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4132285242Sachim      break;
4133285242Sachim    }
4134285242Sachim    case OSSA_IO_XFER_ERROR_BREAK:
4135285242Sachim    {
4136285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_BREAK HTAG = 0x%x\n", tag));
4137285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_BREAK++;
4138285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4139285242Sachim      break;
4140285242Sachim    }
4141285242Sachim    case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
4142285242Sachim    {
4143285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_PHY_NOT_READY HTAG = 0x%x\n", tag));
4144285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
4145285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4146285242Sachim      break;
4147285242Sachim    }
4148285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
4149285242Sachim    {
4150285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED HTAG = 0x%x\n", tag));
4151285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
4152285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4153285242Sachim      break;
4154285242Sachim    }
4155285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
4156285242Sachim    {
4157285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION HTAG = 0x%x\n", tag));
4158285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
4159285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4160285242Sachim      break;
4161285242Sachim    }
4162285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_BREAK:
4163285242Sachim    {
4164285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_BREAK HTAG = 0x%x\n", tag));
4165285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
4166285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4167285242Sachim      break;
4168285242Sachim    }
4169285242Sachim
4170285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
4171285242Sachim    {
4172285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST HTAG = 0x%x\n", tag));
4173285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
4174285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4175285242Sachim      break;
4176285242Sachim    }
4177285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
4178285242Sachim    {
4179285242Sachim      SA_DBG1(("mpiSATAEvent:  HTAG = 0x%x\n", tag));
4180285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE++;
4181285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4182285242Sachim      break;
4183285242Sachim    }
4184285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
4185285242Sachim    {
4186285242Sachim      SA_DBG1(("mpiSATAEvent:OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED  HTAG = 0x%x\n", tag));
4187285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
4188285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4189285242Sachim      break;
4190285242Sachim    }
4191285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
4192285242Sachim    {
4193285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS HTAG = 0x%x\n", tag));
4194285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
4195285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4196285242Sachim      break;
4197285242Sachim    }
4198285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
4199285242Sachim    {
4200285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION HTAG = 0x%x\n", tag));
4201285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
4202285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4203285242Sachim      break;
4204285242Sachim    }
4205285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
4206285242Sachim    {
4207285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED HTAG = 0x%x\n", tag));
4208285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
4209285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4210285242Sachim      break;
4211285242Sachim    }
4212285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
4213285242Sachim    {
4214285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION HTAG = 0x%x\n", tag));
4215285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
4216285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4217285242Sachim      break;
4218285242Sachim    }
4219285242Sachim    case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
4220285242Sachim    {
4221285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_NAK_RECEIVED HTAG = 0x%x\n", tag));
4222285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_NAK_RECEIVED++;
4223285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4224285242Sachim      break;
4225285242Sachim    }
4226285242Sachim    case OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE:
4227285242Sachim    {
4228285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE HTAG = 0x%x\n", tag));
4229285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE++;
4230285242Sachim      ossaSATAEvent(agRoot, agNULL, agPortContext, agDevHandle, event, 0, agNULL);
4231285242Sachim      break;
4232285242Sachim    }
4233285242Sachim    case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH:
4234285242Sachim    {
4235285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH HTAG = 0x%x\n", tag));
4236285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_OFFSET_MISMATCH++;
4237285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4238285242Sachim      break;
4239285242Sachim    }
4240285242Sachim    case OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN:
4241285242Sachim    {
4242285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN HTAG = 0x%x\n", tag));
4243285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN++;
4244285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4245285242Sachim      break;
4246285242Sachim    }
4247285242Sachim    case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
4248285242Sachim    {
4249285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT HTAG = 0x%x\n", tag));
4250285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
4251285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4252285242Sachim      break;
4253285242Sachim    }
4254285242Sachim    case OSSA_IO_XFER_ERROR_PEER_ABORTED:
4255285242Sachim    {
4256285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_PEER_ABORTED HTAG = 0x%x\n", tag));
4257285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_PEER_ABORTED++;
4258285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4259285242Sachim      break;
4260285242Sachim    }
4261285242Sachim    case OSSA_IO_XFER_CMD_FRAME_ISSUED:
4262285242Sachim    {
4263285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED HTAG = 0x%x\n", tag));
4264285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_CMD_FRAME_ISSUED++;
4265285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4266285242Sachim      break;
4267285242Sachim    }
4268285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
4269285242Sachim    {
4270285242Sachim      SA_DBG1(("mpiSATAEvent, OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY HTAG = 0x%x\n", tag));
4271285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY++;
4272285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4273285242Sachim      break;
4274285242Sachim    }
4275285242Sachim    case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE:
4276285242Sachim    {
4277285242Sachim      SA_DBG1(("mpiSATAEvent, OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE HTAG = 0x%x\n", tag));
4278285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_UNEXPECTED_PHASE++;
4279285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4280285242Sachim      break;
4281285242Sachim    }
4282285242Sachim    case OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN:
4283285242Sachim    {
4284285242Sachim      SA_DBG1(("mpiSATAEvent, OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN HTAG = 0x%x\n", tag));
4285285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN++;
4286285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4287285242Sachim      break;
4288285242Sachim    }
4289285242Sachim    case OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED:
4290285242Sachim    {
4291285242Sachim      SA_DBG1(("mpiSATAEvent, OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED HTAG = 0x%x\n", tag));
4292285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED++;
4293285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4294285242Sachim      break;
4295285242Sachim    }
4296285242Sachim    case OSSA_IO_XFER_PIO_SETUP_ERROR:
4297285242Sachim    {
4298285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_PIO_SETUP_ERROR HTAG = 0x%x\n", tag));
4299285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_PIO_SETUP_ERROR++;
4300285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4301285242Sachim      break;
4302285242Sachim    }
4303285242Sachim    case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
4304285242Sachim    {
4305285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFR_ERROR_DIF_MISMATCH HTAG = 0x%x\n", tag));
4306285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_MISMATCH++;
4307285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4308285242Sachim      break;
4309285242Sachim    }
4310285242Sachim    case OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR:
4311285242Sachim    {
4312285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR HTAG = 0x%x\n", tag));
4313285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR++;
4314285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4315285242Sachim      break;
4316285242Sachim    }
4317285242Sachim    case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
4318285242Sachim    {
4319285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x\n", tag));
4320285242Sachim      saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
4321285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4322285242Sachim      break;
4323285242Sachim    }
4324285242Sachim    case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
4325285242Sachim    {
4326285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN HTAG = 0x%x\n", tag));
4327285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERR_EOB_DATA_OVERRUN++;
4328285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4329285242Sachim      break;
4330285242Sachim    }
4331285242Sachim    case OSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT:
4332285242Sachim    {
4333285242Sachim      SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT HTAG = 0x%x\n", tag));
4334285242Sachim      saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT++;
4335285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4336285242Sachim      break;
4337285242Sachim    }
4338285242Sachim    default:
4339285242Sachim    {
4340285242Sachim      SA_DBG1(("mpiSATAEvent: Unknown Event 0x%x HTAG = 0x%x\n", event, tag));
4341285242Sachim      saRoot->IoEventCount.agOSSA_IO_UNKNOWN_ERROR++;
4342285242Sachim      ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4343285242Sachim      break;
4344285242Sachim    }
4345285242Sachim  }
4346285242Sachim
4347285242Sachim  /* return value */
4348285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2w");
4349285242Sachim  return ret;
4350285242Sachim}
4351285242Sachim
4352285242Sachim/******************************************************************************/
4353285242Sachim/*! \brief Set NVM Data Response
4354285242Sachim *
4355285242Sachim *  This routine handles the response of SET NVM Data Response
4356285242Sachim *
4357285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
4358285242Sachim *  \param pIomb        Pointer of IOMB Mesage
4359285242Sachim *
4360285242Sachim *  \return sucess or fail
4361285242Sachim *
4362285242Sachim */
4363285242Sachim/*******************************************************************************/
4364285242SachimGLOBAL bit32 mpiSetNVMDataRsp(
4365285242Sachim  agsaRoot_t          *agRoot,
4366285242Sachim  agsaSetNVMDataRsp_t *pIomb
4367285242Sachim  )
4368285242Sachim{
4369285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
4370285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4371285242Sachim  agsaIORequestDesc_t *pRequest;
4372285242Sachim  agsaContext_t       *agContext;
4373285242Sachim  bit32               tag, status, iPTdaBnDpsAsNvm;
4374285242Sachim
4375285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2x");
4376285242Sachim
4377285242Sachim  SA_DBG1(("mpiSetNVMDataRsp: HTag=0x%x\n", pIomb->tag));
4378285242Sachim
4379285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetNVMDataRsp_t, tag));
4380285242Sachim  OSSA_READ_LE_32(AGROOT, &iPTdaBnDpsAsNvm, pIomb, OSSA_OFFSET_OF(agsaSetNVMDataRsp_t, iPTdaBnDpsAsNvm));
4381285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetNVMDataRsp_t, status));
4382285242Sachim
4383285242Sachim  /* get request from IOMap */
4384285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4385285242Sachim  if (agNULL == pRequest)
4386285242Sachim  {
4387285242Sachim    SA_DBG1(("mpiSetNVMDataRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
4388285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2x");
4389285242Sachim    return AGSA_RC_FAILURE;
4390285242Sachim  }
4391285242Sachim
4392285242Sachim  agContext = saRoot->IOMap[tag].agContext;
4393285242Sachim  /* remove the request from IOMap */
4394285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
4395285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
4396285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
4397285242Sachim
4398285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
4399285242Sachim
4400285242Sachim  if (((iPTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_CONFIG_SEEPROM) ||
4401285242Sachim      ((iPTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_VPD_FLASH) ||
4402285242Sachim      ((iPTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_TWI_DEVICES))
4403285242Sachim  {
4404285242Sachim    /* CB for VPD for SEEPROM-0, VPD_FLASH and TWI */
4405285242Sachim    ossaSetNVMDResponseCB(agRoot, agContext, (status & NVMD_STAT));
4406285242Sachim  }
4407285242Sachim  else
4408285242Sachim  {
4409285242Sachim    /* should not happend */
4410285242Sachim    SA_DBG1(("mpiSetNVMDataRsp: NVMD is wrong. TAG=0x%x STATUS=0x%x\n", tag, (iPTdaBnDpsAsNvm & NVMD_TYPE)));
4411285242Sachim    ret = AGSA_RC_FAILURE;
4412285242Sachim  }
4413285242Sachim
4414285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4415285242Sachim  pRequest->valid = agFALSE;
4416285242Sachim  /* return the request to free pool */
4417285242Sachim  saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4418285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4419285242Sachim
4420285242Sachim  /* return value */
4421285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2x");
4422285242Sachim  return ret;
4423285242Sachim}
4424285242Sachim
4425285242Sachim/******************************************************************************/
4426285242Sachim/*! \brief SPC MPI SSP ABORT Response
4427285242Sachim *
4428285242Sachim *  This function handles the SSP Abort Response.
4429285242Sachim *
4430285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
4431285242Sachim *  \param pIomb        pointer of Message
4432285242Sachim *
4433285242Sachim *  \return The read value
4434285242Sachim *
4435285242Sachim */
4436285242Sachim/*******************************************************************************/
4437285242SachimGLOBAL bit32 mpiSSPAbortRsp(
4438285242Sachim  agsaRoot_t         *agRoot,
4439285242Sachim  agsaSSPAbortRsp_t  *pIomb
4440285242Sachim  )
4441285242Sachim{
4442285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
4443285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4444285242Sachim  agsaIORequestDesc_t *pRequest;
4445285242Sachim  agsaDeviceDesc_t    *pDevice;
4446285242Sachim  bit32               tag, status, scope;
4447285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2y");
4448285242Sachim
4449285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSSPAbortRsp_t, tag));
4450285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSSPAbortRsp_t, status));
4451285242Sachim  OSSA_READ_LE_32(AGROOT, &scope, pIomb, OSSA_OFFSET_OF(agsaSSPAbortRsp_t, scp));
4452285242Sachim  scope &= 3;
4453285242Sachim  /* get IORequest from IOMap */
4454285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4455285242Sachim
4456285242Sachim  if (agNULL == pRequest)
4457285242Sachim  {
4458285242Sachim    /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
4459285242Sachim    saRoot->IOMap[tag].Tag = MARK_OFF;
4460285242Sachim    saRoot->IOMap[tag].IORequest = agNULL;
4461285242Sachim    SA_ASSERT((pRequest), "pRequest");
4462285242Sachim    SA_DBG1(("mpiSSPAbortRsp: the request is NULL. Tag=%x\n", tag));
4463285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2y");
4464285242Sachim    return AGSA_RC_FAILURE;
4465285242Sachim  }
4466285242Sachim
4467285242Sachim
4468285242Sachim  if ( agTRUE == pRequest->valid )
4469285242Sachim  {
4470285242Sachim    pDevice = pRequest->pDevice;
4471285242Sachim    SA_ASSERT((pRequest->pDevice), "pRequest->pDevice");
4472285242Sachim
4473285242Sachim    SA_DBG3(("mpiSSPAbortRsp: request abort is valid Htag 0x%x\n", tag));
4474285242Sachim    /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
4475285242Sachim    saRoot->IOMap[tag].Tag = MARK_OFF;
4476285242Sachim    saRoot->IOMap[tag].IORequest = agNULL;
4477285242Sachim
4478285242Sachim    if( pRequest->completionCB == agNULL )
4479285242Sachim    {
4480285242Sachim      ossaSSPAbortCB(agRoot, pRequest->pIORequestContext, scope, status);
4481285242Sachim    }
4482285242Sachim    else
4483285242Sachim    {
4484285242Sachim      (*(ossaGenericAbortCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, scope, status);
4485285242Sachim    }
4486285242Sachim
4487285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4488285242Sachim    pRequest->valid = agFALSE;
4489285242Sachim    /* Delete the request from the pendingIORequests */
4490285242Sachim    saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
4491285242Sachim
4492285242Sachim    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
4493285242Sachim    {
4494285242Sachim      SA_DBG1(("mpiSSPAbortRsp: saving pRequest (%p) for later use\n", pRequest));
4495285242Sachim      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
4496285242Sachim    }
4497285242Sachim    else
4498285242Sachim    {
4499285242Sachim      /* return the request to free pool */
4500285242Sachim      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4501285242Sachim    }
4502285242Sachim
4503285242Sachim    if(scope)
4504285242Sachim    {
4505285242Sachim      siCountActiveIORequestsOnDevice( agRoot, pDevice->DeviceMapIndex );
4506285242Sachim    }
4507285242Sachim
4508285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4509285242Sachim
4510285242Sachim  }
4511285242Sachim  else
4512285242Sachim  {
4513285242Sachim    ret = AGSA_RC_FAILURE;
4514285242Sachim    SA_DBG1(("mpiSSPAbortRsp: the request is not valid any more. Tag=%x\n", pRequest->HTag));
4515285242Sachim  }
4516285242Sachim
4517285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2y");
4518285242Sachim  return ret;
4519285242Sachim}
4520285242Sachim
4521285242Sachim/******************************************************************************/
4522285242Sachim/*! \brief SPC MPI SATA ABORT Response
4523285242Sachim *
4524285242Sachim *  This function handles the SATA Event.
4525285242Sachim *
4526285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
4527285242Sachim *  \param pIomb        pointer of Message
4528285242Sachim *
4529285242Sachim *  \return The read value
4530285242Sachim *
4531285242Sachim */
4532285242Sachim/*******************************************************************************/
4533285242SachimGLOBAL bit32 mpiSATAAbortRsp(
4534285242Sachim  agsaRoot_t         *agRoot,
4535285242Sachim  agsaSATAAbortRsp_t *pIomb
4536285242Sachim  )
4537285242Sachim{
4538285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
4539285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4540285242Sachim  agsaIORequestDesc_t *pRequest;
4541285242Sachim  agsaDeviceDesc_t    *pDevice;
4542285242Sachim  bit32               tag, status, scope;
4543285242Sachim
4544285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3B");
4545285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSATAAbortRsp_t, tag));
4546285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSATAAbortRsp_t, status));
4547285242Sachim  OSSA_READ_LE_32(AGROOT, &scope, pIomb, OSSA_OFFSET_OF(agsaSATAAbortRsp_t, scp));
4548285242Sachim
4549285242Sachim  /* get IORequest from IOMap */
4550285242Sachim  pRequest  = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4551285242Sachim
4552285242Sachim  if (agNULL == pRequest)
4553285242Sachim  {
4554285242Sachim    /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
4555285242Sachim    saRoot->IOMap[tag].Tag = MARK_OFF;
4556285242Sachim    saRoot->IOMap[tag].IORequest = agNULL;
4557285242Sachim    SA_DBG1(("mpiSATAAbortRsp: the request is NULL. Tag=%x\n", tag));
4558285242Sachim    SA_ASSERT((pRequest), "pRequest");
4559285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3B");
4560285242Sachim    return AGSA_RC_FAILURE;
4561285242Sachim  }
4562285242Sachim
4563285242Sachim  if ( agTRUE == pRequest->valid )
4564285242Sachim  {
4565285242Sachim    pDevice = pRequest->pDevice;
4566285242Sachim    SA_ASSERT((pRequest->pDevice), "pRequest->pDevice");
4567285242Sachim
4568285242Sachim    SA_DBG3(("mpiSATAAbortRsp: request abort is valid Htag 0x%x\n", tag));
4569285242Sachim
4570285242Sachim    if( pRequest->completionCB == agNULL )
4571285242Sachim    {
4572285242Sachim      ossaSATAAbortCB(agRoot, pRequest->pIORequestContext, scope, status);
4573285242Sachim    }
4574285242Sachim    else
4575285242Sachim    {
4576285242Sachim      (*(ossaGenericAbortCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, scope, status);
4577285242Sachim    }
4578285242Sachim    /* remove the SATA_ABORT request from IOMap */
4579285242Sachim    saRoot->IOMap[tag].Tag = MARK_OFF;
4580285242Sachim    saRoot->IOMap[tag].IORequest = agNULL;
4581285242Sachim    saRoot->IOMap[tag].agContext = agNULL;
4582285242Sachim
4583285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4584285242Sachim    pRequest->valid = agFALSE;
4585285242Sachim    /* Delete the request from the pendingIORequests */
4586285242Sachim    saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
4587285242Sachim    /* return the request to free pool */
4588285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4589285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4590285242Sachim
4591285242Sachim  }
4592285242Sachim  else
4593285242Sachim  {
4594285242Sachim    ret = AGSA_RC_FAILURE;
4595285242Sachim    SA_DBG1(("mpiSATAAbortRsp: the request is not valid any more. Tag=%x\n", pRequest->HTag));
4596285242Sachim  }
4597285242Sachim
4598285242Sachim
4599285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3B");
4600285242Sachim  return ret;
4601285242Sachim}
4602285242Sachim
4603285242Sachim/******************************************************************************/
4604285242Sachim/*! \brief Set GPIO Response
4605285242Sachim *
4606285242Sachim *  This routine handles the response of GPIO Command
4607285242Sachim *
4608285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
4609285242Sachim *  \param pIomb        Pointer of IOMB Mesage
4610285242Sachim *
4611285242Sachim *  \return sucess or fail
4612285242Sachim *
4613285242Sachim */
4614285242Sachim/*******************************************************************************/
4615285242SachimGLOBAL bit32 mpiGPIORsp(
4616285242Sachim  agsaRoot_t          *agRoot,
4617285242Sachim  agsaGPIORsp_t       *pIomb
4618285242Sachim  )
4619285242Sachim{
4620285242Sachim  bit32                    ret = AGSA_RC_SUCCESS;
4621285242Sachim  agsaLLRoot_t             *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4622285242Sachim  agsaContext_t            *agContext;
4623285242Sachim  agsaIORequestDesc_t      *pRequest;
4624285242Sachim  agsaGpioPinSetupInfo_t   pinSetupInfo;
4625285242Sachim  agsaGpioEventSetupInfo_t eventSetupInfo;
4626285242Sachim  bit32 GpioIe, OT11_0, OT19_12, GPIEVChange, GPIEVFall, GPIEVRise, GpioRdVal, tag;
4627285242Sachim
4628285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"5C");
4629285242Sachim
4630285242Sachim  SA_DBG3(("mpiGPIORsp: HTag=0x%x\n", pIomb->tag));
4631285242Sachim
4632285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, tag));
4633285242Sachim
4634285242Sachim  /* get request from IOMap */
4635285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4636285242Sachim  if (agNULL == pRequest)
4637285242Sachim  {
4638285242Sachim    SA_DBG1(("mpiGPIORsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x\n", tag));
4639285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5C");
4640285242Sachim    return AGSA_RC_FAILURE;
4641285242Sachim  }
4642285242Sachim
4643285242Sachim  agContext = saRoot->IOMap[tag].agContext;
4644285242Sachim  /* remove the request from IOMap */
4645285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
4646285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
4647285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
4648285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
4649285242Sachim
4650285242Sachim  /* set payload to zeros */
4651285242Sachim  si_memset(&pinSetupInfo, 0, sizeof(agsaGpioPinSetupInfo_t));
4652285242Sachim  si_memset(&eventSetupInfo, 0, sizeof(agsaGpioEventSetupInfo_t));
4653285242Sachim
4654285242Sachim  OSSA_READ_LE_32(AGROOT, &GpioIe, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GpioIe));
4655285242Sachim  OSSA_READ_LE_32(AGROOT, &OT11_0, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, OT11_0));
4656285242Sachim  OSSA_READ_LE_32(AGROOT, &OT19_12, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, OT19_12));
4657285242Sachim  OSSA_READ_LE_32(AGROOT, &GPIEVChange, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GPIEVChange));
4658285242Sachim  OSSA_READ_LE_32(AGROOT, &GPIEVFall, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GPIEVFall));
4659285242Sachim  OSSA_READ_LE_32(AGROOT, &GPIEVRise, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GPIEVRise));
4660285242Sachim  OSSA_READ_LE_32(AGROOT, &GpioRdVal, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GpioRdVal));
4661285242Sachim  pinSetupInfo.gpioInputEnabled = GpioIe;
4662285242Sachim  pinSetupInfo.gpioTypePart1 = OT11_0;
4663285242Sachim  pinSetupInfo.gpioTypePart2 = OT19_12;
4664285242Sachim  eventSetupInfo.gpioEventLevel = GPIEVChange;
4665285242Sachim  eventSetupInfo.gpioEventFallingEdge = GPIEVFall;
4666285242Sachim  eventSetupInfo.gpioEventRisingEdge = GPIEVRise;
4667285242Sachim
4668285242Sachim  ossaGpioResponseCB(agRoot, agContext, OSSA_IO_SUCCESS, GpioRdVal,
4669285242Sachim                     &pinSetupInfo,
4670285242Sachim                     &eventSetupInfo);
4671285242Sachim
4672285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4673285242Sachim  pRequest->valid = agFALSE;
4674285242Sachim  /* return the request to free pool */
4675285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
4676285242Sachim  {
4677285242Sachim    SA_DBG1(("mpiGPIORsp: saving pRequest (%p) for later use\n", pRequest));
4678285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
4679285242Sachim  }
4680285242Sachim  else
4681285242Sachim  {
4682285242Sachim    /* return the request to free pool */
4683285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4684285242Sachim  }
4685285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4686285242Sachim
4687285242Sachim  /* return value */
4688285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5C");
4689285242Sachim  return ret;
4690285242Sachim}
4691285242Sachim
4692285242Sachim/******************************************************************************/
4693285242Sachim/*! \brief Set GPIO Event Response
4694285242Sachim *
4695285242Sachim *  This routine handles the response of GPIO Event
4696285242Sachim *
4697285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
4698285242Sachim *  \param pIomb        Pointer of IOMB Mesage
4699285242Sachim *
4700285242Sachim *  \return sucess or fail
4701285242Sachim *
4702285242Sachim */
4703285242Sachim/*******************************************************************************/
4704285242SachimGLOBAL bit32 mpiGPIOEventRsp(
4705285242Sachim  agsaRoot_t          *agRoot,
4706285242Sachim  agsaGPIOEvent_t     *pIomb
4707285242Sachim  )
4708285242Sachim{
4709285242Sachim  bit32       ret = AGSA_RC_SUCCESS;
4710285242Sachim  bit32       GpioEvent;
4711285242Sachim
4712285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3D");
4713285242Sachim
4714285242Sachim  OSSA_READ_LE_32(AGROOT, &GpioEvent, pIomb, OSSA_OFFSET_OF(agsaGPIOEvent_t, GpioEvent));
4715285242Sachim
4716285242Sachim  ossaGpioEvent(agRoot, GpioEvent);
4717285242Sachim
4718285242Sachim  /* return value */
4719285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3D");
4720285242Sachim  return ret;
4721285242Sachim}
4722285242Sachim
4723285242Sachim/******************************************************************************/
4724285242Sachim/*! \brief SAS Diagnostic Start/End Response
4725285242Sachim *
4726285242Sachim *  This routine handles the response of SAS Diagnostic Start/End Command
4727285242Sachim *
4728285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
4729285242Sachim *  \param pIomb        Pointer of IOMB Mesage
4730285242Sachim *
4731285242Sachim *  \return sucess or fail
4732285242Sachim *
4733285242Sachim */
4734285242Sachim/*******************************************************************************/
4735285242SachimGLOBAL bit32 mpiSASDiagStartEndRsp(
4736285242Sachim  agsaRoot_t               *agRoot,
4737285242Sachim  agsaSASDiagStartEndRsp_t *pIomb
4738285242Sachim  )
4739285242Sachim{
4740285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
4741285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4742285242Sachim  agsaIORequestDesc_t *pRequest;
4743285242Sachim  agsaContext_t       *agContext;
4744285242Sachim  bit32               tag, Status;
4745285242Sachim
4746285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2F");
4747285242Sachim
4748285242Sachim  SA_DBG3(("mpiSASDiagStartEndRsp: HTAG=0x%x\n", pIomb->tag));
4749285242Sachim
4750285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSASDiagStartEndRsp_t, tag));
4751285242Sachim  OSSA_READ_LE_32(AGROOT, &Status, pIomb, OSSA_OFFSET_OF(agsaSASDiagStartEndRsp_t, Status));
4752285242Sachim
4753285242Sachim  /* get request from IOMap */
4754285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4755285242Sachim  if (agNULL == pRequest)
4756285242Sachim  {
4757285242Sachim    SA_DBG1(("mpiSASDiagStartEndRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, Status));
4758285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2F");
4759285242Sachim    return AGSA_RC_FAILURE;
4760285242Sachim  }
4761285242Sachim
4762285242Sachim  agContext = saRoot->IOMap[tag].agContext;
4763285242Sachim  /* remove the request from IOMap */
4764285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
4765285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
4766285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
4767285242Sachim
4768285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
4769285242Sachim
4770285242Sachim  switch(Status)
4771285242Sachim  {
4772285242Sachim
4773285242Sachim    case OSSA_DIAG_SE_SUCCESS:
4774285242Sachim      SA_DBG3(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_SE_SUCCESS 0x%X \n", Status));
4775285242Sachim      break;
4776285242Sachim    case OSSA_DIAG_SE_INVALID_PHY_ID:
4777285242Sachim      SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_SE_INVALID_PHY_ID 0x%X \n", Status));
4778285242Sachim      break;
4779285242Sachim    case OSSA_DIAG_PHY_NOT_DISABLED:
4780285242Sachim      SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_PHY_NOT_DISABLED Status 0x%X \n", Status));
4781285242Sachim      break;
4782285242Sachim    case OSSA_DIAG_OTHER_FAILURE:
4783285242Sachim      if(smIS_SPCV(agRoot))
4784285242Sachim      {
4785285242Sachim        SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_OTHER_FAILURE Status 0x%X \n", Status));
4786285242Sachim      }
4787285242Sachim      else
4788285242Sachim      {
4789285242Sachim        SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_OPCODE_INVALID Status 0x%X \n", Status));
4790285242Sachim      }
4791285242Sachim      break;
4792285242Sachim    default:
4793285242Sachim      SA_DBG1(("mpiSASDiagStartEndRsp:Status UNKNOWN 0x%X \n", Status));
4794285242Sachim      break;
4795285242Sachim  }
4796285242Sachim
4797285242Sachim  ossaSASDiagStartEndCB(agRoot, agContext, Status);
4798285242Sachim
4799285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4800285242Sachim  pRequest->valid = agFALSE;
4801285242Sachim  /* return the request to free pool */
4802285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
4803285242Sachim  {
4804285242Sachim    SA_DBG1(("mpiSASDiagStartEndRsp: saving pRequest (%p) for later use\n", pRequest));
4805285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
4806285242Sachim  }
4807285242Sachim  else
4808285242Sachim  {
4809285242Sachim    /* return the request to free pool */
4810285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4811285242Sachim  }
4812285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4813285242Sachim
4814285242Sachim  /* return value */
4815285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2F");
4816285242Sachim  return ret;
4817285242Sachim}
4818285242Sachim
4819285242Sachim/******************************************************************************/
4820285242Sachim/*! \brief SAS Diagnostic Execute Response
4821285242Sachim *
4822285242Sachim *  This routine handles the response of SAS Diagnostic Execute Command
4823285242Sachim *
4824285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
4825285242Sachim *  \param pIomb        Pointer of IOMB Mesage
4826285242Sachim *
4827285242Sachim *  \return sucess or fail
4828285242Sachim *
4829285242Sachim */
4830285242Sachim/*******************************************************************************/
4831285242SachimGLOBAL bit32 mpiSASDiagExecuteRsp(
4832285242Sachim  agsaRoot_t               *agRoot,
4833285242Sachim  agsaSASDiagExecuteRsp_t  *pIomb
4834285242Sachim  )
4835285242Sachim{
4836285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
4837285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4838285242Sachim  agsaIORequestDesc_t *pRequest;
4839285242Sachim  agsaContext_t       *agContext;
4840285242Sachim  bit32               tag, Status, CmdTypeDescPhyId, ReportData;
4841285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3G");
4842285242Sachim
4843285242Sachim  SA_DBG3(("mpiSASDiagExecuteRsp: HTAG=0x%x\n", pIomb->tag));
4844285242Sachim
4845285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, tag));
4846285242Sachim  OSSA_READ_LE_32(AGROOT, &Status, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, Status));
4847285242Sachim  OSSA_READ_LE_32(AGROOT, &CmdTypeDescPhyId, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, CmdTypeDescPhyId));
4848285242Sachim  OSSA_READ_LE_32(AGROOT, &ReportData, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, ReportData));
4849285242Sachim  /* get request from IOMap */
4850285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4851285242Sachim  if (agNULL == pRequest)
4852285242Sachim  {
4853285242Sachim    SA_DBG1(("mpiSASDiagExecuteRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, Status));
4854285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3G");
4855285242Sachim    return AGSA_RC_FAILURE;
4856285242Sachim  }
4857285242Sachim
4858285242Sachim  switch(Status)
4859285242Sachim  {
4860285242Sachim
4861285242Sachim    case OSSA_DIAG_SUCCESS:
4862285242Sachim      SA_DBG3(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_SUCCESS 0x%X \n", Status));
4863285242Sachim      break;
4864285242Sachim    case OSSA_DIAG_INVALID_COMMAND:
4865285242Sachim      if(smIS_SPCV(agRoot))
4866285242Sachim      {
4867285242Sachim        SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_INVALID_COMMAND Status 0x%X \n", Status));
4868285242Sachim      }
4869285242Sachim      else
4870285242Sachim      {
4871285242Sachim        SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_FAIL Status 0x%X \n", Status));
4872285242Sachim      }
4873285242Sachim      break;
4874285242Sachim    case OSSA_REGISTER_ACCESS_TIMEOUT:
4875285242Sachim      SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_REGISTER_ACCESS_TIMEOUT Status 0x%X \n", Status));
4876285242Sachim      break;
4877285242Sachim    case OSSA_DIAG_NOT_IN_DIAGNOSTIC_MODE:
4878285242Sachim      SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_NOT_IN_DIAGNOSTIC_MODE Status 0x%X \n", Status));
4879285242Sachim      break;
4880285242Sachim    case OSSA_DIAG_INVALID_PHY:
4881285242Sachim      SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_INVALID_PHY Status 0x%X \n", Status));
4882285242Sachim      break;
4883285242Sachim    case OSSA_MEMORY_ALLOC_FAILURE:
4884285242Sachim      SA_DBG1(("mpiSASDiagExecuteRsp: Status  Status 0x%X \n", Status));
4885285242Sachim      break;
4886285242Sachim
4887285242Sachim    default:
4888285242Sachim      SA_DBG1(("mpiSASDiagExecuteRsp:Status UNKNOWN 0x%X \n", Status));
4889285242Sachim      break;
4890285242Sachim  }
4891285242Sachim
4892285242Sachim
4893285242Sachim  agContext = saRoot->IOMap[tag].agContext;
4894285242Sachim  /* remove the request from IOMap */
4895285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
4896285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
4897285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
4898285242Sachim
4899285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
4900285242Sachim
4901285242Sachim  ossaSASDiagExecuteCB(agRoot, agContext, Status, CmdTypeDescPhyId, ReportData);
4902285242Sachim
4903285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4904285242Sachim  pRequest->valid = agFALSE;
4905285242Sachim  /* return the request to free pool */
4906285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
4907285242Sachim  {
4908285242Sachim    SA_DBG1(("mpiSASDiagExecuteRsp: saving pRequest (%p) for later use\n", pRequest));
4909285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
4910285242Sachim  }
4911285242Sachim  else
4912285242Sachim  {
4913285242Sachim    /* return the request to free pool */
4914285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4915285242Sachim  }
4916285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4917285242Sachim
4918285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3G");
4919285242Sachim
4920285242Sachim  /* return value */
4921285242Sachim  return ret;
4922285242Sachim}
4923285242Sachim
4924285242Sachim/******************************************************************************/
4925285242Sachim/*! \brief SAS General Event Notification Response
4926285242Sachim *
4927285242Sachim *  This routine handles the response of Inbound IOMB Command with error case
4928285242Sachim *
4929285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
4930285242Sachim *  \param pIomb        Pointer of IOMB Mesage
4931285242Sachim *
4932285242Sachim *  \return sucess or fail
4933285242Sachim *
4934285242Sachim */
4935285242Sachim/*******************************************************************************/
4936285242SachimGLOBAL bit32 mpiGeneralEventRsp(
4937285242Sachim  agsaRoot_t               *agRoot,
4938285242Sachim  agsaGeneralEventRsp_t    *pIomb
4939285242Sachim  )
4940285242Sachim{
4941285242Sachim  bit32                 ret = AGSA_RC_SUCCESS;
4942285242Sachim  agsaLLRoot_t          *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4943285242Sachim  bit32                 i;
4944285242Sachim  bit32                 status;
4945285242Sachim  bit32                 tag;
4946285242Sachim  agsaIORequestDesc_t   *pRequest;
4947285242Sachim  agsaDeviceDesc_t      *pDevice;
4948285242Sachim  agsaContext_t         *agContext = NULL;
4949285242Sachim  agsaGeneralEventRsp_t GenEventData;
4950285242Sachim  agsaHWEventEncrypt_t  agEvent;
4951285242Sachim  bit16                 OpCode = 0;
4952285242Sachim
4953285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3H");
4954285242Sachim
4955285242Sachim  si_memset(&GenEventData,0,sizeof(agsaGeneralEventRsp_t));
4956285242Sachim
4957285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGeneralEventRsp_t, status));
4958285242Sachim
4959285242Sachim  SA_DBG3(("mpiGeneralEventRsp:  %p\n", pIomb));
4960285242Sachim
4961285242Sachim  SA_DBG1(("mpiGeneralEventRsp: OpCode 0x%X status 0x%x\n",pIomb->inbIOMBpayload[0] & OPCODE_BITS, status));
4962285242Sachim
4963285242Sachim  for (i = 0; i < GENERAL_EVENT_PAYLOAD; i++)
4964285242Sachim  {
4965285242Sachim    OSSA_READ_LE_32(AGROOT, &GenEventData.inbIOMBpayload[i], pIomb, OSSA_OFFSET_OF(agsaGeneralEventRsp_t,inbIOMBpayload[i] ));
4966285242Sachim  }
4967285242Sachim  SA_DBG1(("mpiGeneralEventRsp: inbIOMBpayload 0x%08x 0x%08x 0x%08x 0x%08x\n",
4968285242Sachim                                    GenEventData.inbIOMBpayload[0],GenEventData.inbIOMBpayload[1],
4969285242Sachim                                    GenEventData.inbIOMBpayload[2],GenEventData.inbIOMBpayload[3] ));
4970285242Sachim  SA_DBG1(("mpiGeneralEventRsp: inbIOMBpayload 0x%08x 0x%08x 0x%08x 0x%08x\n",
4971285242Sachim                                    GenEventData.inbIOMBpayload[4],GenEventData.inbIOMBpayload[8],
4972285242Sachim                                    GenEventData.inbIOMBpayload[6],GenEventData.inbIOMBpayload[7] ));
4973285242Sachim
4974285242Sachim  switch (status) /*status  */
4975285242Sachim  {
4976285242Sachim
4977285242Sachim    case GEN_EVENT_IOMB_V_BIT_NOT_SET:
4978285242Sachim      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_IOMB_V_BIT_NOT_SET\n" ));
4979285242Sachim      break;
4980285242Sachim    case GEN_EVENT_INBOUND_IOMB_OPC_NOT_SUPPORTED:
4981285242Sachim      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_INBOUND_IOMB_OPC_NOT_SUPPORTED\n" ));
4982285242Sachim      break;
4983285242Sachim    case GEN_EVENT_IOMB_INVALID_OBID:
4984285242Sachim      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_IOMB_INVALID_OBID\n" ));
4985285242Sachim      break;
4986285242Sachim    case GEN_EVENT_DS_IN_NON_OPERATIONAL:
4987285242Sachim      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_DS_IN_NON_OPERATIONAL\n" ));
4988285242Sachim      break;
4989285242Sachim    case GEN_EVENT_DS_IN_RECOVERY:
4990285242Sachim      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_DS_IN_RECOVERY\n" ));
4991285242Sachim      break;
4992285242Sachim    case GEN_EVENT_DS_INVALID:
4993285242Sachim      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_DS_INVALID\n" ));
4994285242Sachim      break;
4995285242Sachim    case GEN_EVENT_IO_XFER_READ_COMPL_ERR:
4996285242Sachim      SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_IO_XFER_READ_COMPL_ERR 0x%x 0x%x 0x%x\n",
4997285242Sachim                GenEventData.inbIOMBpayload[0],
4998285242Sachim                GenEventData.inbIOMBpayload[1],
4999285242Sachim                GenEventData.inbIOMBpayload[1] ));
5000285242Sachim      ossaGeneralEvent(agRoot, status, agContext, GenEventData.inbIOMBpayload);
5001285242Sachim      smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3H");
5002285242Sachim      return(ret);
5003285242Sachim    default:
5004285242Sachim      SA_DBG1(("mpiGeneralEventRsp: Unknown General Event status!!! 0x%x\n", status));
5005285242Sachim      smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3H");
5006285242Sachim      return AGSA_RC_FAILURE;
5007285242Sachim  }
5008285242Sachim
5009285242Sachim  OpCode = (bit16)(GenEventData.inbIOMBpayload[0] & OPCODE_BITS);
5010285242Sachim  tag = GenEventData.inbIOMBpayload[1];
5011285242Sachim  SA_DBG1(("mpiGeneralEventRsp:OpCode 0x%X [0] 0x%08x\n" ,OpCode,(bit16)(GenEventData.inbIOMBpayload[0] & OPCODE_BITS)));
5012285242Sachim
5013285242Sachim  switch (OpCode) /* OpCode */
5014285242Sachim    {
5015285242Sachim      case OPC_INB_DEV_HANDLE_ACCEPT:
5016285242Sachim      case OPC_INB_ECHO:
5017285242Sachim      case OPC_INB_FW_FLASH_UPDATE:
5018285242Sachim      case OPC_INB_GET_NVMD_DATA:
5019285242Sachim      case OPC_INB_SET_NVMD_DATA:
5020285242Sachim      case OPC_INB_DEREG_DEV_HANDLE:
5021285242Sachim      case OPC_INB_SPC_GET_DEV_INFO:
5022285242Sachim      case OPC_INB_GET_DEV_HANDLE:
5023285242Sachim      case OPC_INB_SPC_REG_DEV:
5024285242Sachim      case OPC_INB_SAS_DIAG_EXECUTE:
5025285242Sachim      case OPC_INB_SAS_DIAG_MODE_START_END:
5026285242Sachim      case OPC_INB_PHYSTART:
5027285242Sachim      case OPC_INB_PHYSTOP:
5028285242Sachim      case OPC_INB_LOCAL_PHY_CONTROL:
5029285242Sachim      case OPC_INB_GPIO:
5030285242Sachim      case OPC_INB_GET_TIME_STAMP:
5031285242Sachim      case OPC_INB_PORT_CONTROL:
5032285242Sachim      case OPC_INB_SET_DEVICE_STATE:
5033285242Sachim      case OPC_INB_GET_DEVICE_STATE:
5034285242Sachim      case OPC_INB_SET_DEV_INFO:
5035285242Sachim//      case OPC_INB_PCIE_DIAG_EXECUTE:
5036285242Sachim      case OPC_INB_SAS_HW_EVENT_ACK:
5037285242Sachim      case OPC_INB_SAS_RE_INITIALIZE:
5038285242Sachim      case OPC_INB_KEK_MANAGEMENT:
5039285242Sachim      case OPC_INB_SET_OPERATOR:
5040285242Sachim      case OPC_INB_GET_OPERATOR:
5041285242Sachim//      case OPC_INB_SGPIO:
5042285242Sachim
5043285242Sachim#ifdef SPC_ENABLE_PROFILE
5044285242Sachim      case OPC_INB_FW_PROFILE:
5045285242Sachim#endif
5046285242Sachim          /* Uses the tag table, so we have to free it up */
5047285242Sachim
5048285242Sachim          SA_ASSERT((tag < AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs),
5049285242Sachim                    "OPC_OUB_GENERAL_EVENT tag out of range");
5050285242Sachim          SA_ASSERT((saRoot->IOMap[ tag < (AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs) ? tag : 0 ].Tag != MARK_OFF),
5051285242Sachim                    "OPC_OUB_GENERAL_EVENT tag not in use 1");
5052285242Sachim
5053285242Sachim#if defined(SALLSDK_DEBUG)
5054285242Sachim          if (tag > AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs)
5055285242Sachim          {
5056285242Sachim            smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3H");
5057285242Sachim            return AGSA_RC_FAILURE;
5058285242Sachim          }
5059285242Sachim#endif /* SALLSDK_DEBUG */
5060285242Sachim
5061285242Sachim          SA_DBG1(("mpiGeneralEventRsp:OpCode found 0x%x htag 0x%x\n",OpCode, tag));
5062285242Sachim          /* get agContext */
5063285242Sachim          agContext = saRoot->IOMap[tag].agContext;
5064285242Sachim          /* get request from IOMap */
5065285242Sachim          pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5066285242Sachim          if(pRequest)
5067285242Sachim          {
5068285242Sachim            /* remove the request from IOMap */
5069285242Sachim            saRoot->IOMap[tag].Tag = MARK_OFF;
5070285242Sachim            saRoot->IOMap[tag].IORequest = agNULL;
5071285242Sachim            saRoot->IOMap[tag].agContext = agNULL;
5072285242Sachim
5073285242Sachim            ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5074285242Sachim            SA_ASSERT((pRequest->valid), "pRequest->valid");
5075285242Sachim            pRequest->valid = agFALSE;
5076285242Sachim            /* return the request to free pool */
5077285242Sachim            if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5078285242Sachim            {
5079285242Sachim              SA_DBG1(("mpiGeneralEventRsp: saving pRequest (%p) for later use\n", pRequest));
5080285242Sachim              saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5081285242Sachim            }
5082285242Sachim            else
5083285242Sachim            {
5084285242Sachim              /* return the request to free pool */
5085285242Sachim              saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5086285242Sachim            }
5087285242Sachim            ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5088285242Sachim          }
5089285242Sachim          else
5090285242Sachim          {
5091285242Sachim            SA_DBG1(("mpiGeneralEventRsp:pRequest (%p) NULL\n", pRequest));
5092285242Sachim            ret =  AGSA_RC_FAILURE;
5093285242Sachim          }
5094285242Sachim          break;
5095285242Sachim      /* ????  */
5096285242Sachim      case OPC_INB_SATA_HOST_OPSTART:
5097285242Sachim      case OPC_INB_SATA_ABORT:
5098285242Sachim      case OPC_INB_SSPINIIOSTART:
5099285242Sachim      case OPC_INB_SSPINITMSTART:
5100285242Sachim      case OPC_INB_SSPINIEXTIOSTART:
5101285242Sachim      case OPC_INB_SSPTGTIOSTART:
5102285242Sachim      case OPC_INB_SSPTGTRSPSTART:
5103285242Sachim      case OPC_INB_SSP_DIF_ENC_OPSTART:
5104285242Sachim      case OPC_INB_SATA_DIF_ENC_OPSTART:
5105285242Sachim
5106285242Sachim      case OPC_INB_SSP_ABORT:
5107285242Sachim      case OPC_INB_SMP_REQUEST:
5108285242Sachim      case OPC_INB_SMP_ABORT:
5109285242Sachim      {
5110285242Sachim        /* Uses the tag table, so we have to free it up */
5111285242Sachim        SA_DBG1(("mpiGeneralEventRsp:OpCode found 0x%x htag 0x%x\n",OpCode, tag));
5112285242Sachim
5113285242Sachim        tag = GenEventData.inbIOMBpayload[1];
5114285242Sachim
5115285242Sachim        SA_ASSERT((tag < AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs),
5116285242Sachim                  "OPC_OUB_GENERAL_EVENT tag out of range");
5117285242Sachim        SA_ASSERT((saRoot->IOMap[ tag < (AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs) ? tag : 0 ].Tag != MARK_OFF),
5118285242Sachim                  "OPC_OUB_GENERAL_EVENT tag not in use 2");
5119285242Sachim#if defined(SALLSDK_DEBUG)
5120285242Sachim        if (tag > AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs)
5121285242Sachim        {
5122285242Sachim          smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3H");
5123285242Sachim          return AGSA_RC_FAILURE;
5124285242Sachim        }
5125285242Sachim#endif
5126285242Sachim          /* get request from IOMap */
5127285242Sachim        pRequest  = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5128285242Sachim        if(pRequest)
5129285242Sachim        {
5130285242Sachim          pDevice   = pRequest->pDevice;
5131285242Sachim          /* return the request to free pool */
5132285242Sachim          /* get IORequestContext */
5133285242Sachim          agContext = (agsaContext_t *)pRequest->pIORequestContext;
5134285242Sachim          /* remove the request from IOMap */
5135285242Sachim          saRoot->IOMap[tag].Tag = MARK_OFF;
5136285242Sachim          saRoot->IOMap[tag].IORequest = agNULL;
5137285242Sachim          saRoot->IOMap[tag].agContext = agNULL;
5138285242Sachim
5139285242Sachim          ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5140285242Sachim          SA_ASSERT((pRequest->valid), "pRequest->valid");
5141285242Sachim          pRequest->valid = agFALSE;
5142285242Sachim          saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
5143285242Sachim          if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5144285242Sachim          {
5145285242Sachim            SA_DBG1(("mpiGeneralEventRsp: saving pRequest (%p) for later use\n", pRequest));
5146285242Sachim            saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5147285242Sachim          }
5148285242Sachim          else
5149285242Sachim          {
5150285242Sachim            /* return the request to free pool */
5151285242Sachim            saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5152285242Sachim          }
5153285242Sachim          ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5154285242Sachim          break;
5155285242Sachim        }
5156285242Sachim        else
5157285242Sachim        {
5158285242Sachim          SA_DBG1(("mpiGeneralEventRsp:pRequest (%p) NULL\n", pRequest));
5159285242Sachim          ret =  AGSA_RC_FAILURE;
5160285242Sachim        }
5161285242Sachim      }
5162285242Sachim    default:
5163285242Sachim    {
5164285242Sachim        SA_DBG1(("mpiGeneralEventRsp:OpCode Not found 0x%x htag 0x%x\n",OpCode, tag));
5165285242Sachim        ret =  AGSA_RC_FAILURE;
5166285242Sachim
5167285242Sachim        /* Uses the tag table, so we have to free it up */
5168285242Sachim        tag = GenEventData.inbIOMBpayload[1];
5169285242Sachim
5170285242Sachim        SA_ASSERT((tag < AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs),
5171285242Sachim                  "OPC_OUB_GENERAL_EVENT tag out of range");
5172285242Sachim        SA_ASSERT((saRoot->IOMap[ tag < (AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs) ? tag : 0 ].Tag != MARK_OFF),
5173285242Sachim                  "OPC_OUB_GENERAL_EVENT tag not in use 3");
5174285242Sachim
5175285242Sachim#if defined(SALLSDK_DEBUG)
5176285242Sachim        if (tag > AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs)
5177285242Sachim        {
5178285242Sachim          smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "3H");
5179285242Sachim          return AGSA_RC_FAILURE;
5180285242Sachim        }
5181285242Sachim#endif
5182285242Sachim        /* get agContext */
5183285242Sachim        agContext = saRoot->IOMap[tag].agContext;
5184285242Sachim        /* get request from IOMap */
5185285242Sachim        pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5186285242Sachim        if (pRequest == agNULL)
5187285242Sachim        {
5188285242Sachim          smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "3H");
5189285242Sachim          return AGSA_RC_FAILURE;
5190285242Sachim        }
5191285242Sachim
5192285242Sachim        /* remove the request from IOMap */
5193285242Sachim        saRoot->IOMap[tag].Tag = MARK_OFF;
5194285242Sachim        saRoot->IOMap[tag].IORequest = agNULL;
5195285242Sachim        saRoot->IOMap[tag].agContext = agNULL;
5196285242Sachim
5197285242Sachim        ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5198285242Sachim        SA_ASSERT((pRequest->valid), "pRequest->valid");
5199285242Sachim        pRequest->valid = agFALSE;
5200285242Sachim        /* return the request to free pool */
5201285242Sachim        if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5202285242Sachim        {
5203285242Sachim          SA_DBG1(("mpiGeneralEventRsp: saving pRequest (%p) for later use\n", pRequest));
5204285242Sachim          saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5205285242Sachim        }
5206285242Sachim        else
5207285242Sachim        {
5208285242Sachim          /* return the request to free pool */
5209285242Sachim          saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5210285242Sachim        }
5211285242Sachim        ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5212285242Sachim        break;
5213285242Sachim      }
5214285242Sachim      ret =  AGSA_RC_FAILURE;
5215285242Sachim
5216285242Sachim    }
5217285242Sachim
5218285242Sachim  switch (OpCode) /* OpCode */
5219285242Sachim  {
5220285242Sachim
5221285242Sachim    case OPC_INB_KEK_MANAGEMENT:
5222285242Sachim    {
5223285242Sachim      bit32 flags = GenEventData.inbIOMBpayload[2];
5224285242Sachim
5225285242Sachim      SA_DBG1(("mpiGeneralEventRsp: OPC_INB_KEK_MANAGEMENT 0x%x htag 0x%x flags 0x%x\n",OpCode, tag, flags));
5226285242Sachim      if (flags & 0xFF00) /* update and store*/
5227285242Sachim      {
5228285242Sachim        agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE;
5229285242Sachim        SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE\n"));
5230285242Sachim      }
5231285242Sachim      else /* update */
5232285242Sachim      {
5233285242Sachim        agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE;
5234285242Sachim        SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_KEK_UPDATE\n"));
5235285242Sachim      }
5236285242Sachim      agEvent.status = OSSA_INVALID_ENCRYPTION_SECURITY_MODE;
5237285242Sachim      si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
5238285242Sachim      agEvent.status = status;
5239285242Sachim
5240285242Sachim      SA_DBG1(("mpiGeneralEventRsp: ossaHwCB OSSA_HW_EVENT_ENCRYPTION\n" ));
5241285242Sachim      ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void*)&agEvent, agContext);
5242285242Sachim      break;
5243285242Sachim    }
5244285242Sachim    case OPC_INB_OPR_MGMT:
5245285242Sachim         si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
5246285242Sachim         agEvent.status = status;
5247285242Sachim         agEvent.encryptOperation = OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT;
5248285242Sachim
5249285242Sachim         SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT\n" ));
5250285242Sachim         ossaOperatorManagementCB(agRoot, agContext, status, 0);
5251285242Sachim         break;
5252285242Sachim    case OPC_INB_SET_OPERATOR:
5253285242Sachim         SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_SET_OPERATOR\n" ));
5254285242Sachim         ossaSetOperatorCB(agRoot,agContext,0xFF,0xFF );
5255285242Sachim         break;
5256285242Sachim    case OPC_INB_GET_OPERATOR:
5257285242Sachim         SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_GET_OPERATOR\n" ));
5258285242Sachim         ossaGetOperatorCB(agRoot,agContext,0xFF,0xFF,0xFF,0xFF,agNULL );
5259285242Sachim         break;
5260285242Sachim    case OPC_INB_ENC_TEST_EXECUTE:
5261285242Sachim         si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
5262285242Sachim         agEvent.status = status;
5263285242Sachim         agEvent.encryptOperation = OSSA_HW_ENCRYPT_TEST_EXECUTE;
5264285242Sachim
5265285242Sachim         SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_TEST_EXECUTE\n" ));
5266285242Sachim         ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void*)&agEvent, agContext);
5267285242Sachim         break;
5268285242Sachim    default:
5269285242Sachim         SA_DBG1(("mpiGeneralEventRsp: MGMNT OpCode Not found 0x%x\n",OpCode ));
5270285242Sachim         ossaGeneralEvent(agRoot, status, agContext, GenEventData.inbIOMBpayload);
5271285242Sachim         break;
5272285242Sachim  }
5273285242Sachim
5274285242Sachim  /* return value */
5275285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "3H");
5276285242Sachim  return ret;
5277285242Sachim}
5278285242Sachim
5279285242Sachim/******************************************************************************/
5280285242Sachim/*! \brief SPC MPI SSP Request Received Event (target mode)
5281285242Sachim *
5282285242Sachim *  This function handles the SSP Request Received Event.
5283285242Sachim *
5284285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
5285285242Sachim *  \param pMsg1        pointer of Message
5286285242Sachim *
5287285242Sachim *  \return The read value
5288285242Sachim *
5289285242Sachim */
5290285242Sachim/*******************************************************************************/
5291285242SachimGLOBAL bit32 mpiSSPReqReceivedNotify(
5292285242Sachim  agsaRoot_t *agRoot,
5293285242Sachim  agsaSSPReqReceivedNotify_t *pMsg1)
5294285242Sachim{
5295285242Sachim  bit32            ret = AGSA_RC_SUCCESS;
5296285242Sachim  agsaLLRoot_t     *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5297285242Sachim  agsaDeviceDesc_t *pDevice;
5298285242Sachim  bit32            deviceid, iniTagSSPIul, frameTypeHssa, TlrHdsa;
5299285242Sachim
5300285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3J");
5301285242Sachim  /* convert endiness if necassary */
5302285242Sachim  OSSA_READ_LE_32(AGROOT, &deviceid, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, deviceId));
5303285242Sachim  OSSA_READ_LE_32(AGROOT, &iniTagSSPIul, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, iniTagSSPIul));
5304285242Sachim  OSSA_READ_LE_32(AGROOT, &frameTypeHssa, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, frameTypeHssa));
5305285242Sachim  OSSA_READ_LE_32(AGROOT, &TlrHdsa, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, TlrHdsa));
5306285242Sachim  /* deviceId -> agDeviceHandle */
5307285242Sachim  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
5308285242Sachim
5309285242Sachim  if (agNULL == pDevice)
5310285242Sachim  {
5311285242Sachim    SA_DBG1(("mpiSSPReqReceivedNotify: warning!!! no deviceHandle is found"));
5312285242Sachim  }
5313285242Sachim  else
5314285242Sachim  {
5315285242Sachim    /* type punning only safe through char *. See gcc -fstrict_aliasing. */
5316285242Sachim    char * safe_type_pun = (char *)&(pMsg1->SSPIu[0]);
5317285242Sachim    if( pDevice->initiatorDevHandle.sdkData != agNULL)
5318285242Sachim    {
5319285242Sachim      ossaSSPReqReceived(agRoot, &(pDevice->initiatorDevHandle),
5320285242Sachim                        (agsaFrameHandle_t *)safe_type_pun,
5321285242Sachim                        (bit16)((iniTagSSPIul >> SHIFT16) & INITTAG_BITS),
5322285242Sachim                        ((frameTypeHssa >> SHIFT24) & FRAME_TYPE) |
5323285242Sachim                       ((TlrHdsa >> SHIFT16) & TLR_BITS),
5324285242Sachim                        (iniTagSSPIul & SSPIUL_BITS));
5325285242Sachim    }else if( pDevice->targetDevHandle.sdkData != agNULL)
5326285242Sachim    {
5327285242Sachim      ossaSSPReqReceived(agRoot, &(pDevice->targetDevHandle),
5328285242Sachim                        (agsaFrameHandle_t *)safe_type_pun,
5329285242Sachim                        (bit16)((iniTagSSPIul >> SHIFT16) & INITTAG_BITS),
5330285242Sachim                        ((frameTypeHssa >> SHIFT24) & FRAME_TYPE) |
5331285242Sachim                       ((TlrHdsa >> SHIFT16) & TLR_BITS),
5332285242Sachim                        (iniTagSSPIul & SSPIUL_BITS));
5333285242Sachim    }else
5334285242Sachim    {
5335285242Sachim      SA_ASSERT(0, "Device handle sdkData not set");
5336285242Sachim    }
5337285242Sachim  }
5338285242Sachim
5339285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3J");
5340285242Sachim  return ret;
5341285242Sachim}
5342285242Sachim
5343285242Sachim/******************************************************************************/
5344285242Sachim/*! \brief SPC MPI Device Handle Arrived Event (target mode)
5345285242Sachim *
5346285242Sachim *  This function handles the Device Handle Arrived Event.
5347285242Sachim *
5348285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
5349285242Sachim *  \param pMsg1        pointer of Message
5350285242Sachim *
5351285242Sachim *  \return The read value
5352285242Sachim *
5353285242Sachim */
5354285242Sachim/*******************************************************************************/
5355285242SachimGLOBAL bit32 mpiDeviceHandleArrived(
5356285242Sachim  agsaRoot_t *agRoot,
5357285242Sachim  agsaDeviceHandleArrivedNotify_t *pMsg1)
5358285242Sachim{
5359285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
5360285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5361285242Sachim  agsaDeviceDesc_t    *pDevice;
5362285242Sachim  agsaPort_t          *pPort;
5363285242Sachim  agsaSASDeviceInfo_t pDeviceInfo;
5364285242Sachim  agsaPortContext_t   *agPortContext;
5365285242Sachim  agsaSASIdentify_t   remoteIdentify;
5366285242Sachim  bit32               CTag;
5367285242Sachim  bit32               FwdDeviceId;
5368285242Sachim  bit32               ProtConrPortId;
5369285242Sachim  bit32               portId;
5370285242Sachim  bit32               conRate;
5371285242Sachim  bit8                i, protocol, dTypeSRate;
5372285242Sachim  bit32               HostAssignedId;
5373285242Sachim
5374285242Sachim  if(saRoot == agNULL)
5375285242Sachim  {
5376285242Sachim    SA_ASSERT((saRoot != agNULL), "saRoot");
5377285242Sachim    return AGSA_RC_FAILURE;
5378285242Sachim  }
5379285242Sachim
5380285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3L");
5381285242Sachim  /* convert endiness if necassary */
5382285242Sachim  OSSA_READ_LE_32(AGROOT, &CTag, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleArrivedNotify_t, CTag));
5383285242Sachim  OSSA_READ_LE_32(AGROOT, &FwdDeviceId, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleArrivedNotify_t, HostAssignedIdFwdDeviceId));
5384285242Sachim  OSSA_READ_LE_32(AGROOT, &ProtConrPortId, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleArrivedNotify_t, ProtConrPortId));
5385285242Sachim
5386285242Sachim
5387285242Sachim  if(smIS_SPCV(agRoot))
5388285242Sachim  {
5389285242Sachim    portId = ProtConrPortId & PortId_V_MASK;
5390285242Sachim    conRate = (ProtConrPortId & Conrate_V_MASK ) >> Conrate_V_SHIFT;
5391285242Sachim
5392285242Sachim    HostAssignedId = (FwdDeviceId & 0xFFFF0000) >> SHIFT16;
5393285242Sachim    if(HostAssignedId)
5394285242Sachim    {
5395285242Sachim      SA_DBG1(("mpiDeviceHandleArrived: HostAssignedId 0x%X\n",HostAssignedId));
5396285242Sachim    }
5397285242Sachim  }
5398285242Sachim  else
5399285242Sachim  {
5400285242Sachim    portId = ProtConrPortId & PortId_SPC_MASK;
5401285242Sachim    conRate = (ProtConrPortId & Conrate_SPC_MASK ) >> Conrate_SPC_SHIFT;
5402285242Sachim  }
5403285242Sachim  protocol =(bit8)((ProtConrPortId & PROTOCOL_BITS ) >> PROTOCOL_SHIFT);
5404285242Sachim
5405285242Sachim  SA_DBG1(("mpiDeviceHandleArrived: New Port portID %d deviceid 0x%X conRate 0x%X protocol 0x%X\n",portId, FwdDeviceId,conRate,protocol));
5406285242Sachim
5407285242Sachim  /* Port Map */
5408285242Sachim  agPortContext = saRoot->PortMap[portId].PortContext;
5409285242Sachim  if (agNULL == agPortContext)
5410285242Sachim  {
5411285242Sachim    ossaSingleThreadedEnter(agRoot, LL_PORT_LOCK);
5412285242Sachim    /* new port */
5413285242Sachim    /* Acquire port list lock */
5414285242Sachim    /* Allocate a free port */
5415285242Sachim    pPort = (agsaPort_t *) saLlistGetHead(&(saRoot->freePorts));
5416285242Sachim    if (agNULL != pPort)
5417285242Sachim    {
5418285242Sachim      saLlistRemove(&(saRoot->freePorts), &(pPort->linkNode));
5419285242Sachim
5420285242Sachim      /* setup the port data structure */
5421285242Sachim      pPort->portContext.osData = agNULL;
5422285242Sachim      pPort->portContext.sdkData = pPort;
5423285242Sachim      pPort->tobedeleted = agFALSE;
5424285242Sachim      /* Add to valid port list */
5425285242Sachim      saLlistAdd(&(saRoot->validPorts), &(pPort->linkNode));
5426285242Sachim      /* Release port list lock */
5427285242Sachim      ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
5428285242Sachim
5429285242Sachim      /* Setup portMap based on portId */
5430285242Sachim      saRoot->PortMap[portId].PortID = portId;
5431285242Sachim      saRoot->PortMap[portId].PortContext = &(pPort->portContext);
5432285242Sachim      saRoot->PortMap[portId].PortStatus  &= ~PORT_INVALIDATING;
5433285242Sachim      pPort->portId = portId;
5434285242Sachim
5435285242Sachim      pPort->status &= ~PORT_INVALIDATING;
5436285242Sachim      SA_DBG3(("mpiDeviceHandleArrived: ~PORT_INVALIDATING New Port portID %d PortContext %p\n",saRoot->PortMap[pPort->portId].PortID , &pPort->portContext));
5437285242Sachim    }
5438285242Sachim    else
5439285242Sachim    {
5440285242Sachim      ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
5441285242Sachim      SA_DBG2(("mpiDeviceHandleArrived:Port NULL\n"));
5442285242Sachim      /* pPort is agNULL*/
5443285242Sachim      smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3L");
5444285242Sachim      return AGSA_RC_FAILURE;
5445285242Sachim    }
5446285242Sachim  }
5447285242Sachim  else
5448285242Sachim  {
5449285242Sachim    /* exist port */
5450285242Sachim    pPort = (agsaPort_t *) (agPortContext->sdkData);
5451285242Sachim    pPort->status &= ~PORT_INVALIDATING;
5452285242Sachim    pPort->portId =portId;
5453285242Sachim    saRoot->PortMap[pPort->portId].PortStatus  &= ~PORT_INVALIDATING;
5454285242Sachim
5455285242Sachim    SA_DBG1(("mpiDeviceHandleArrived: ~PORT_INVALIDATING Old port portID %d PortContext %p\n", portId, &pPort->portContext));
5456285242Sachim
5457285242Sachim  }
5458285242Sachim  /* build Device Information structure */
5459285242Sachim  si_memset(&pDeviceInfo, 0, sizeof(agsaSASDeviceInfo_t));
5460285242Sachim  if (ProtConrPortId & PROTOCOL_BITS)
5461285242Sachim  {
5462285242Sachim    protocol = SA_IDFRM_SSP_BIT; /* SSP */
5463285242Sachim    pDeviceInfo.commonDevInfo.devType_S_Rate = (bit8)(conRate | 0x10);
5464285242Sachim
5465285242Sachim  }
5466285242Sachim  else
5467285242Sachim  {
5468285242Sachim    protocol = SA_IDFRM_SMP_BIT; /* SMP */
5469285242Sachim    pDeviceInfo.commonDevInfo.devType_S_Rate = (bit8)conRate;
5470285242Sachim  }
5471285242Sachim  pDeviceInfo.initiator_ssp_stp_smp = protocol;
5472285242Sachim  pDeviceInfo.numOfPhys = 1;
5473285242Sachim  pDeviceInfo.commonDevInfo.sasAddressHi[0] = pMsg1->sasAddrHi[0];
5474285242Sachim  pDeviceInfo.commonDevInfo.sasAddressHi[1] = pMsg1->sasAddrHi[1];
5475285242Sachim  pDeviceInfo.commonDevInfo.sasAddressHi[2] = pMsg1->sasAddrHi[2];
5476285242Sachim  pDeviceInfo.commonDevInfo.sasAddressHi[3] = pMsg1->sasAddrHi[3];
5477285242Sachim  pDeviceInfo.commonDevInfo.sasAddressLo[0] = pMsg1->sasAddrLow[0];
5478285242Sachim  pDeviceInfo.commonDevInfo.sasAddressLo[1] = pMsg1->sasAddrLow[1];
5479285242Sachim  pDeviceInfo.commonDevInfo.sasAddressLo[2] = pMsg1->sasAddrLow[2];
5480285242Sachim  pDeviceInfo.commonDevInfo.sasAddressLo[3] = pMsg1->sasAddrLow[3];
5481285242Sachim  pDeviceInfo.commonDevInfo.flag = 0;
5482285242Sachim  pDeviceInfo.commonDevInfo.it_NexusTimeout = ITL_TO_DEFAULT;
5483285242Sachim
5484285242Sachim  /* deviceId -> agDeviceHandle */
5485285242Sachim  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceHandle;
5486285242Sachim
5487285242Sachim  if (agNULL == pDevice)
5488285242Sachim  {
5489285242Sachim    /* new device */
5490285242Sachim    si_memset(&remoteIdentify, 0, sizeof(agsaSASIdentify_t));
5491285242Sachim    for (i=0;i<4;i++)
5492285242Sachim    {
5493285242Sachim      remoteIdentify.sasAddressHi[i] = pMsg1->sasAddrHi[i];
5494285242Sachim      remoteIdentify.sasAddressLo[i] = pMsg1->sasAddrLow[i];
5495285242Sachim    }
5496285242Sachim    remoteIdentify.deviceType_addressFrameType = (bit8)(pDeviceInfo.commonDevInfo.devType_S_Rate & 0xC0);
5497285242Sachim    dTypeSRate = pDeviceInfo.commonDevInfo.devType_S_Rate;
5498285242Sachim    /* get Device from free Device List */
5499285242Sachim    pDevice = siPortSASDeviceAdd(agRoot, pPort, remoteIdentify, agTRUE, SMP_TO_DEFAULT, ITL_TO_DEFAULT, 0, dTypeSRate, 0);
5500285242Sachim    if (agNULL == pDevice)
5501285242Sachim    {
5502285242Sachim      SA_DBG1(("mpiDeviceHandleArrived: Device Handle is NULL, Out of Resources Error.\n"));
5503285242Sachim    }
5504285242Sachim    else
5505285242Sachim    {
5506285242Sachim      bit32 AccStatus = 0;
5507285242Sachim      bit32 SaveId = FwdDeviceId & 0xFFFF;
5508285242Sachim      /* mapping the device handle and device id */
5509285242Sachim      saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceIdFromFW = FwdDeviceId;
5510285242Sachim      saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceHandle = (void *)pDevice;
5511285242Sachim      pDevice->DeviceMapIndex = FwdDeviceId;
5512285242Sachim      SA_DBG2(("mpiDeviceHandleArrived: New deviceID 0x%x Device Context %p DeviceTypeSRate 0x%x\n", FwdDeviceId, pDevice, dTypeSRate));
5513285242Sachim
5514285242Sachim      /* Call Back */
5515285242Sachim      AccStatus = ossaDeviceHandleAccept(agRoot, &(pDevice->initiatorDevHandle), &pDeviceInfo, agPortContext,&FwdDeviceId );
5516285242Sachim
5517285242Sachim      HostAssignedId = (FwdDeviceId & 0xFFFF0000) >> SHIFT16;
5518285242Sachim      if(HostAssignedId)
5519285242Sachim      {
5520285242Sachim        if( SaveId == (FwdDeviceId & 0xFFFF)  )
5521285242Sachim        {
5522285242Sachim
5523285242Sachim          saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceIdFromFW = FwdDeviceId;
5524285242Sachim          pDevice->DeviceMapIndex = FwdDeviceId;
5525285242Sachim
5526285242Sachim          SA_DBG1(("mpiDeviceHandleArrived:FwdDeviceId 0x%x HostAssignedId 0x%x\n",FwdDeviceId,HostAssignedId));
5527285242Sachim        }
5528285242Sachim        else
5529285242Sachim        {
5530285242Sachim          SA_DBG1(("mpiDeviceHandleArrived:Id mangled expect 0x%x Got 0x%x\n",SaveId, (FwdDeviceId & 0xFFFF)));
5531285242Sachim          ret = AGSA_RC_FAILURE;
5532285242Sachim        }
5533285242Sachim      }
5534285242Sachim
5535285242Sachim      /* get AWT flag and ITLN_TMO value */
5536285242Sachim
5537285242Sachim      if(AccStatus == OSSA_RC_ACCEPT )
5538285242Sachim      {
5539285242Sachim        /* build DEVICE_HANDLE_ACCEPT IOMB and send to SPC with action=accept */
5540285242Sachim        mpiDevHandleAcceptCmd(agRoot, agNULL, CTag, FwdDeviceId, 0, pDeviceInfo.commonDevInfo.flag, pDeviceInfo.commonDevInfo.it_NexusTimeout, 0);
5541285242Sachim      }
5542285242Sachim      else
5543285242Sachim      {
5544285242Sachim        mpiDevHandleAcceptCmd(agRoot, agNULL, CTag, FwdDeviceId, 1, pDeviceInfo.commonDevInfo.flag, pDeviceInfo.commonDevInfo.it_NexusTimeout, 0);
5545285242Sachim      }
5546285242Sachim    }
5547285242Sachim  }
5548285242Sachim
5549285242Sachim  SA_DBG1(("mpiDeviceHandleArrived Device 0x%08X flag 0x%08X %s WWID= %02x%02x%02x%02x:%02x%02x%02x%02x, %s\n",
5550285242Sachim    FwdDeviceId,
5551285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag,
5552285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x20 ? "SATA DA" :
5553285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x10 ? "SSP/SMP" :
5554285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x0 ? "  STP  " : "Unknown",
5555285242Sachim
5556285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3],
5557285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2],
5558285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1],
5559285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0],
5560285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3],
5561285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2],
5562285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1],
5563285242Sachim    pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0],
5564285242Sachim
5565285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 8  ? " 1.5G" :
5566285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 9  ? " 3.0G" :
5567285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 10 ? " 6.0G" :
5568285242Sachim    (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 11 ? "12.0G" : "????" ));
5569285242Sachim
5570285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3L");
5571285242Sachim  return ret;
5572285242Sachim}
5573285242Sachim
5574285242Sachim/******************************************************************************/
5575285242Sachim/*! \brief Get Time Stamp Response
5576285242Sachim *
5577285242Sachim *  This routine handles the response of Get Time Stamp Command
5578285242Sachim *
5579285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
5580285242Sachim *  \param pIomb        Pointer of IOMB Mesage
5581285242Sachim *
5582285242Sachim *  \return sucess or fail
5583285242Sachim *
5584285242Sachim */
5585285242Sachim/*******************************************************************************/
5586285242SachimGLOBAL bit32 mpiGetTimeStampRsp(
5587285242Sachim  agsaRoot_t               *agRoot,
5588285242Sachim  agsaGetTimeStampRsp_t    *pIomb
5589285242Sachim  )
5590285242Sachim{
5591285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
5592285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5593285242Sachim  agsaIORequestDesc_t *pRequest;
5594285242Sachim  agsaContext_t       *agContext;
5595285242Sachim  bit32               tag, timeStampLower, timeStampUpper;
5596285242Sachim
5597285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3M");
5598285242Sachim
5599285242Sachim  SA_DBG3(("mpiGetTimeStampRsp: HTAG=0x%x\n", pIomb->tag));
5600285242Sachim
5601285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetTimeStampRsp_t, tag));
5602285242Sachim  OSSA_READ_LE_32(AGROOT, &timeStampLower, pIomb, OSSA_OFFSET_OF(agsaGetTimeStampRsp_t, timeStampLower));
5603285242Sachim  OSSA_READ_LE_32(AGROOT, &timeStampUpper, pIomb, OSSA_OFFSET_OF(agsaGetTimeStampRsp_t, timeStampUpper));
5604285242Sachim  /* get request from IOMap */
5605285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5606285242Sachim  if (agNULL == pRequest)
5607285242Sachim  {
5608285242Sachim    SA_DBG1(("mpiGetTimeStampRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x\n", tag));
5609285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3M");
5610285242Sachim    return AGSA_RC_FAILURE;
5611285242Sachim  }
5612285242Sachim
5613285242Sachim  agContext = saRoot->IOMap[tag].agContext;
5614285242Sachim  /* remove the request from IOMap */
5615285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
5616285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
5617285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
5618285242Sachim
5619285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
5620285242Sachim
5621285242Sachim  SA_DBG3(("mpiGetTimeStampRsp: timeStampLower 0x%x timeStampUpper 0x%x\n", timeStampLower, timeStampUpper));
5622285242Sachim
5623285242Sachim  ossaGetTimeStampCB(agRoot, agContext, timeStampLower, timeStampUpper);
5624285242Sachim
5625285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5626285242Sachim  pRequest->valid = agFALSE;
5627285242Sachim  /* return the request to free pool */
5628285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5629285242Sachim  {
5630285242Sachim    SA_DBG1(("mpiGetTimeStampRsp: saving pRequest (%p) for later use\n", pRequest));
5631285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5632285242Sachim  }
5633285242Sachim  else
5634285242Sachim  {
5635285242Sachim    /* return the request to free pool */
5636285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5637285242Sachim  }
5638285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5639285242Sachim
5640285242Sachim  /* return value */
5641285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3M");
5642285242Sachim  return ret;
5643285242Sachim}
5644285242Sachim
5645285242Sachim/******************************************************************************/
5646285242Sachim/*! \brief SAS HW Event Ack Response
5647285242Sachim *
5648285242Sachim *  This routine handles the response of SAS HW Event Ack Command
5649285242Sachim *
5650285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
5651285242Sachim *  \param pIomb        Pointer of IOMB Mesage
5652285242Sachim *
5653285242Sachim *  \return sucess or fail
5654285242Sachim *
5655285242Sachim */
5656285242Sachim/*******************************************************************************/
5657285242SachimGLOBAL bit32 mpiSASHwEventAckRsp(
5658285242Sachim  agsaRoot_t               *agRoot,
5659285242Sachim  agsaSASHwEventAckRsp_t   *pIomb
5660285242Sachim  )
5661285242Sachim{
5662285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
5663285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5664285242Sachim  agsaIORequestDesc_t *pRequest;
5665285242Sachim  agsaContext_t       *agContext;
5666285242Sachim  agsaPort_t          *pPort;
5667285242Sachim  bit32               tag, status;
5668285242Sachim
5669285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2N");
5670285242Sachim
5671285242Sachim  SA_DBG2(("mpiSASHwEventAckRsp: Htag=0x%x %p\n", pIomb->tag,pIomb));
5672285242Sachim
5673285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSASHwEventAckRsp_t, tag));
5674285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSASHwEventAckRsp_t, status));
5675285242Sachim  /* get request from IOMap */
5676285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5677285242Sachim  if (agNULL == pRequest)
5678285242Sachim  {
5679285242Sachim    SA_DBG1(("mpiSASHwEventAckRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x Status=0x%x\n", tag, status));
5680285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2N");
5681285242Sachim    return AGSA_RC_FAILURE;
5682285242Sachim  }
5683285242Sachim
5684285242Sachim  agContext = saRoot->IOMap[tag].agContext;
5685285242Sachim  /* remove the request from IOMap */
5686285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
5687285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
5688285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
5689285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
5690285242Sachim
5691285242Sachim  SA_DBG1(("mpiSASHwEventAckRsp: status 0x%x Htag=0x%x HwAckType=0x%x\n",status,pIomb->tag,pRequest->HwAckType ));
5692285242Sachim
5693285242Sachim  ossaHwEventAckCB(agRoot, agContext, status);
5694285242Sachim
5695285242Sachim  pPort = pRequest->pPort;
5696285242Sachim  if (agNULL != pPort)
5697285242Sachim  {
5698285242Sachim    SA_DBG1(("mpiSASHwEventAckRsp: pPort %p tobedeleted %d\n", pPort, pPort->tobedeleted));
5699285242Sachim    if (pPort->status & PORT_INVALIDATING &&  pPort->tobedeleted )
5700285242Sachim    {
5701285242Sachim      SA_DBG1(("mpiSASHwEventAckRsp: PORT_INVALIDATING portInvalid portID %d pPort %p, nulling out PortContext\n", pPort->portId, pPort));
5702285242Sachim      /* invalid the port */
5703285242Sachim      siPortInvalid(agRoot, pPort);
5704285242Sachim      /* map out the portmap */
5705285242Sachim      saRoot->PortMap[pPort->portId].PortContext = agNULL;
5706285242Sachim      saRoot->PortMap[pPort->portId].PortID = PORT_MARK_OFF;
5707285242Sachim      saRoot->PortMap[pPort->portId].PortStatus  |= PORT_INVALIDATING;
5708285242Sachim    }
5709285242Sachim    else
5710285242Sachim    {
5711285242Sachim      SA_DBG1(("mpiSASHwEventAckRsp:pPort->status 0x%x Htag=0x%x %p\n",pPort->status, pIomb->tag,pIomb));
5712285242Sachim    }
5713285242Sachim  }
5714285242Sachim  else
5715285242Sachim  {
5716285242Sachim    SA_DBG1(("mpiSASHwEventAckRsp: pPort is NULL, no portId, HTag=0x%x\n", tag));
5717285242Sachim  }
5718285242Sachim
5719285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5720285242Sachim  pRequest->valid = agFALSE;
5721285242Sachim  /* return the request to free pool */
5722285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5723285242Sachim  {
5724285242Sachim    SA_DBG1(("mpiSASHwEventAckRsp: saving pRequest (%p) for later use\n", pRequest));
5725285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5726285242Sachim  }
5727285242Sachim  else
5728285242Sachim  {
5729285242Sachim    /* return the request to free pool */
5730285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5731285242Sachim  }
5732285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5733285242Sachim
5734285242Sachim  /* return value */
5735285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2N");
5736285242Sachim  return ret;
5737285242Sachim}
5738285242Sachim
5739285242Sachim/******************************************************************************/
5740285242Sachim/*! \brief Port Control Response
5741285242Sachim *
5742285242Sachim *  This routine handles the response of SAS HW Event Ack Command
5743285242Sachim *
5744285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
5745285242Sachim *  \param pIomb        Pointer of IOMB Mesage
5746285242Sachim *
5747285242Sachim *  \return sucess or fail
5748285242Sachim *
5749285242Sachim */
5750285242Sachim/*******************************************************************************/
5751285242SachimGLOBAL bit32 mpiPortControlRsp(
5752285242Sachim  agsaRoot_t           *agRoot,
5753285242Sachim  agsaPortControlRsp_t *pIomb
5754285242Sachim  )
5755285242Sachim{
5756285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
5757285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5758285242Sachim  agsaIORequestDesc_t *pRequest = agNULL;
5759285242Sachim  agsaContext_t       *agContext = agNULL;
5760285242Sachim  agsaPortContext_t   *agPortContext = agNULL;
5761285242Sachim  bit32               tag;
5762285242Sachim  bit32               port =0;
5763285242Sachim  bit32               operation =0;
5764285242Sachim  bit32               status =0;
5765285242Sachim  bit32               portState =0;
5766285242Sachim  bit32               portOperation =0;
5767285242Sachim
5768285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3O");
5769285242Sachim
5770285242Sachim  SA_DBG2(("mpiPortControlRsp: HTag=0x%x\n", pIomb->tag));
5771285242Sachim
5772285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t, tag));
5773285242Sachim  OSSA_READ_LE_32(AGROOT, &operation, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t, portOPPortId));
5774285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t, status));
5775285242Sachim  OSSA_READ_LE_32(AGROOT, &portState, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t,rsvdPortState ));
5776285242Sachim
5777285242Sachim  /* get request from IOMap */
5778285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5779285242Sachim  if (agNULL == pRequest)
5780285242Sachim  {
5781285242Sachim    SA_DBG1(("mpiPortControlRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x Status=0x%x\n", tag, status));
5782285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3O");
5783285242Sachim    return AGSA_RC_FAILURE;
5784285242Sachim  }
5785285242Sachim
5786285242Sachim  agContext = saRoot->IOMap[tag].agContext;
5787285242Sachim  /* remove the request from IOMap */
5788285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
5789285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
5790285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
5791285242Sachim
5792285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
5793285242Sachim
5794285242Sachim  if(!pRequest->valid)
5795285242Sachim  {
5796285242Sachim    SA_DBG1(("mpiPortControlRsp: pRequest->valid %d not set\n", pRequest->valid));
5797285242Sachim  }
5798285242Sachim
5799285242Sachim  SA_DBG2(("mpiPortControlRsp: pRequest->completionCB %p\n", pRequest->completionCB));
5800285242Sachim
5801285242Sachim  port = operation & PORTID_MASK;
5802285242Sachim
5803285242Sachim  if(port < AGSA_MAX_VALID_PORTS )
5804285242Sachim  {
5805285242Sachim    SA_DBG2(("mpiPortControlRsp: PortID 0x%x PortStatus 0x%x PortContext %p\n",
5806285242Sachim           saRoot->PortMap[port].PortID,
5807285242Sachim           saRoot->PortMap[port].PortStatus,
5808285242Sachim           saRoot->PortMap[port].PortContext));
5809285242Sachim
5810285242Sachim    agPortContext = (agsaPortContext_t *)saRoot->PortMap[port].PortContext;
5811285242Sachim  }
5812285242Sachim  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));
5813285242Sachim  agPortContext = (agsaPortContext_t *)saRoot->PortMap[operation & PORTID_MASK].PortContext;
5814285242Sachim  SA_DBG1(("mpiPortControlRsp: agPortContext %p\n",agPortContext ));
5815285242Sachim
5816285242Sachim
5817285242Sachim  SA_DBG2(("mpiPortControlRsp: portID 0x%x status 0x%x\n", (operation & PORTID_MASK), status));
5818285242Sachim
5819285242Sachim  SA_DBG1(("mpiPortControlRsp: portID 0x%x status 0x%x agPortContext %p\n",port, status,agPortContext));
5820285242Sachim
5821285242Sachim  portOperation = (((operation & LOCAL_PHY_OP_BITS) >> SHIFT8) | (portState << SHIFT28) );
5822285242Sachim
5823285242Sachim  SA_DBG1(("mpiPortControlRsp: portState 0x%x operation 0x%x portOperation 0x%x\n",portState, operation,portOperation ));
5824285242Sachim
5825285242Sachim  switch(portOperation)
5826285242Sachim  {
5827285242Sachim    case AGSA_PORT_SET_SMP_PHY_WIDTH:
5828285242Sachim      SA_DBG1(("mpiPortControlRsp: AGSA_PORT_SET_SMP_PHY_WIDTH  operation 0x%x\n",operation ));
5829285242Sachim      break;
5830285242Sachim    case AGSA_PORT_SET_PORT_RECOVERY_TIME:
5831285242Sachim      SA_DBG1(("mpiPortControlRsp: AGSA_PORT_SET_PORT_RECOVERY_TIME  operation 0x%x\n",operation ));
5832285242Sachim      break;
5833285242Sachim    case AGSA_PORT_IO_ABORT:
5834285242Sachim      SA_DBG1(("mpiPortControlRsp: AGSA_PORT_IO_ABORT  operation 0x%x\n",operation ));
5835285242Sachim      break;
5836285242Sachim    case AGSA_PORT_SET_PORT_RESET_TIME:
5837285242Sachim      SA_DBG1(("mpiPortControlRsp: AGSA_PORT_SET_PORT_RESET_TIME  operation 0x%x\n",operation ));
5838285242Sachim      break;
5839285242Sachim    case AGSA_PORT_HARD_RESET:
5840285242Sachim      SA_DBG1(("mpiPortControlRsp: AGSA_PORT_HARD_RESET  operation 0x%x\n",operation ));
5841285242Sachim      break;
5842285242Sachim    case AGSA_PORT_CLEAN_UP:
5843285242Sachim      SA_DBG1(("mpiPortControlRsp: AGSA_PORT_CLEAN_UP  operation 0x%x\n",operation ));
5844285242Sachim      break;
5845285242Sachim    case AGSA_STOP_PORT_RECOVERY_TIMER:
5846285242Sachim      SA_DBG1(("mpiPortControlRsp: AGSA_STOP_PORT_RECOVERY_TIMER  operation 0x%x\n",operation ));
5847285242Sachim      break;
5848285242Sachim    default:
5849285242Sachim    {
5850285242Sachim      SA_DBG1(("mpiPortControlRsp: Unknown  operation 0x%x\n",operation ));
5851285242Sachim    }
5852285242Sachim  }
5853285242Sachim
5854285242Sachim  ossaPortControlCB(agRoot, agContext, agPortContext, portOperation, status);
5855285242Sachim
5856285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5857285242Sachim  pRequest->valid = agFALSE;
5858285242Sachim  /* return the request to free pool */
5859285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5860285242Sachim  {
5861285242Sachim    SA_DBG1(("mpiPortControlRsp: saving pRequest (%p) for later use\n", pRequest));
5862285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5863285242Sachim  }
5864285242Sachim  else
5865285242Sachim  {
5866285242Sachim    /* return the request to free pool */
5867285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5868285242Sachim  }
5869285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5870285242Sachim
5871285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3O");
5872285242Sachim  /* return value */
5873285242Sachim  return ret;
5874285242Sachim}
5875285242Sachim
5876285242Sachim/******************************************************************************/
5877285242Sachim/*! \brief SPC MPI SMP ABORT Response
5878285242Sachim *
5879285242Sachim *  This function handles the SMP Abort Response.
5880285242Sachim *
5881285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
5882285242Sachim *  \param pIomb        pointer of Message
5883285242Sachim *
5884285242Sachim *  \return The read value
5885285242Sachim *
5886285242Sachim */
5887285242Sachim/*******************************************************************************/
5888285242SachimGLOBAL bit32 mpiSMPAbortRsp(
5889285242Sachim  agsaRoot_t         *agRoot,
5890285242Sachim  agsaSMPAbortRsp_t  *pIomb
5891285242Sachim  )
5892285242Sachim{
5893285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
5894285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5895285242Sachim  agsaIORequestDesc_t *pRequest;
5896285242Sachim  agsaDeviceDesc_t    *pDevice;
5897285242Sachim  bit32               tag, scp, status;
5898285242Sachim
5899285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3P");
5900285242Sachim
5901285242Sachim  SA_DBG3(("mpiSMPAbortRsp: HTag=0x%x Status=0x%x\n", pIomb->tag, pIomb->status));
5902285242Sachim
5903285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSMPAbortRsp_t, tag));
5904285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSMPAbortRsp_t, status));
5905285242Sachim  OSSA_READ_LE_32(AGROOT, &scp, pIomb, OSSA_OFFSET_OF(agsaSMPAbortRsp_t, scp));
5906285242Sachim
5907285242Sachim  /* get IORequest from IOMap */
5908285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5909285242Sachim
5910285242Sachim  if (agNULL == pRequest)
5911285242Sachim  {
5912285242Sachim    SA_DBG1(("mpiSMPAbortRsp: pRequest is NULL, HTag=0x%x Status=0x%x\n", pIomb->tag, pIomb->status));
5913285242Sachim    SA_ASSERT((pRequest), "pRequest");
5914285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3P");
5915285242Sachim    return AGSA_RC_FAILURE;
5916285242Sachim  }
5917285242Sachim
5918285242Sachim  if ( agTRUE == pRequest->valid )
5919285242Sachim  {
5920285242Sachim    pDevice = pRequest->pDevice;
5921285242Sachim    SA_ASSERT((pRequest->pDevice), "pRequest->pDevice");
5922285242Sachim
5923285242Sachim    SA_DBG3(("mpiSMPAbortRsp: request abort is valid Htag 0x%x\n", tag));
5924285242Sachim
5925285242Sachim    /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
5926285242Sachim    saRoot->IOMap[tag].Tag = MARK_OFF;
5927285242Sachim    saRoot->IOMap[tag].IORequest = agNULL;
5928285242Sachim    saRoot->IOMap[tag].agContext = agNULL;
5929285242Sachim
5930285242Sachim    if( pRequest->completionCB == agNULL )
5931285242Sachim    {
5932285242Sachim      SA_DBG1(("mpiSMPAbortRsp: ************************************************* Valid for Expander only tag 0x%x\n", tag));
5933285242Sachim      ossaSMPAbortCB(agRoot, pRequest->pIORequestContext, scp, status);
5934285242Sachim    }
5935285242Sachim    else
5936285242Sachim    {
5937285242Sachim      (*(ossaGenericAbortCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, scp, status);
5938285242Sachim    }
5939285242Sachim
5940285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5941285242Sachim
5942285242Sachim    /* Delete the request from the pendingIORequests */
5943285242Sachim    saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
5944285242Sachim    pRequest->valid = agFALSE;
5945285242Sachim    /* return the request to free pool */
5946285242Sachim    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5947285242Sachim    {
5948285242Sachim      SA_DBG1(("mpiSMPAbortRsp: saving pRequest (%p) for later use\n", pRequest));
5949285242Sachim      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5950285242Sachim    }
5951285242Sachim    else
5952285242Sachim    {
5953285242Sachim      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5954285242Sachim    }
5955285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5956285242Sachim
5957285242Sachim  }
5958285242Sachim  else
5959285242Sachim  {
5960285242Sachim    ret = AGSA_RC_FAILURE;
5961285242Sachim    SA_DBG1(("mpiSMPAbortRsp: the request is not valid any more. Tag=%x\n", pRequest->HTag));
5962285242Sachim  }
5963285242Sachim
5964285242Sachim
5965285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3P");
5966285242Sachim
5967285242Sachim  return ret;
5968285242Sachim}
5969285242Sachim
5970285242Sachim/******************************************************************************/
5971285242Sachim/*! \brief SPC MPI Device Handle Arrived Event (target mode)
5972285242Sachim *
5973285242Sachim *  This function handles the Device Handle Arrived Event.
5974285242Sachim *
5975285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
5976285242Sachim *  \param pMsg1        pointer of Message
5977285242Sachim *
5978285242Sachim *  \return The read value
5979285242Sachim *
5980285242Sachim */
5981285242Sachim/*******************************************************************************/
5982285242SachimGLOBAL bit32 mpiDeviceHandleRemoval(
5983285242Sachim  agsaRoot_t *agRoot,
5984285242Sachim  agsaDeviceHandleRemoval_t *pMsg1)
5985285242Sachim{
5986285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
5987285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5988285242Sachim  agsaDeviceDesc_t    *pDevice;
5989285242Sachim  agsaPortContext_t   *agPortContext;
5990285242Sachim  bit32               portId;
5991285242Sachim  bit32               deviceid, deviceIdx;
5992285242Sachim
5993285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3R");
5994285242Sachim
5995285242Sachim  /* convert endiness if necassary */
5996285242Sachim  OSSA_READ_LE_32(AGROOT, &portId, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleRemoval_t, portId));
5997285242Sachim  OSSA_READ_LE_32(AGROOT, &deviceid, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleRemoval_t, deviceId));
5998285242Sachim
5999285242Sachim  SA_DBG3(("mpiDeviceHandleRemoval: portId=0x%x deviceId=0x%x\n", portId, deviceid));
6000285242Sachim
6001285242Sachim  pDevice = saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
6002285242Sachim  SA_DBG2(("mpiDeviceHandleRemoval:PortID 0x%x PortStatus 0x%x PortContext %p\n",
6003285242Sachim          saRoot->PortMap[portId & PORTID_MASK].PortID,
6004285242Sachim          saRoot->PortMap[portId & PORTID_MASK].PortStatus,
6005285242Sachim          saRoot->PortMap[portId & PORTID_MASK].PortContext));
6006285242Sachim  agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId & PORTID_MASK].PortContext;
6007285242Sachim
6008285242Sachim  /* Call Back */
6009285242Sachim  SA_DBG1(("mpiDeviceHandleRemoval: portId=0x%x deviceId=0x%x autoDeregDeviceflag=0x%x\n", portId, deviceid,saRoot->autoDeregDeviceflag[portId & PORTID_MASK]));
6010285242Sachim  if (pDevice->targetDevHandle.sdkData)
6011285242Sachim  {
6012285242Sachim    ossaDeviceHandleRemovedEvent(agRoot, &(pDevice->targetDevHandle), agPortContext);
6013285242Sachim
6014285242Sachim    if (saRoot->autoDeregDeviceflag[portId & PORTID_MASK])
6015285242Sachim    {
6016285242Sachim      /* remove the DeviceMap and MapIndex */
6017285242Sachim      deviceIdx = pDevice->DeviceMapIndex & DEVICE_ID_BITS;
6018285242Sachim      SA_DBG1(("mpiDeviceHandleRemoval: A  Freed portId=0x%x deviceId=0x%x\n", portId, deviceid));
6019285242Sachim      OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
6020285242Sachim
6021285242Sachim      saRoot->DeviceMap[deviceIdx].DeviceIdFromFW = 0;
6022285242Sachim      saRoot->DeviceMap[deviceIdx].DeviceHandle = agNULL;
6023285242Sachim      pDevice->DeviceMapIndex = 0;
6024285242Sachim
6025285242Sachim      /* Reset the device data structure */
6026285242Sachim      pDevice->pPort = agNULL;
6027285242Sachim      pDevice->targetDevHandle.sdkData = agNULL;
6028285242Sachim      pDevice->targetDevHandle.osData = agNULL;
6029285242Sachim      ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6030285242Sachim      saLlistAdd(&(saRoot->freeDevicesList), &(pDevice->linkNode));
6031285242Sachim      SA_DBG1(("mpiDeviceHandleRemoval: portId=0x%x deviceId=0x%x\n", portId, deviceid));
6032285242Sachim
6033285242Sachim      ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6034285242Sachim    }
6035285242Sachim  }
6036285242Sachim  else
6037285242Sachim  {
6038285242Sachim    if (pDevice->initiatorDevHandle.sdkData)
6039285242Sachim    {
6040285242Sachim      ossaDeviceHandleRemovedEvent(agRoot, &(pDevice->initiatorDevHandle), agPortContext);
6041285242Sachim
6042285242Sachim      if (saRoot->autoDeregDeviceflag[portId & PORTID_MASK])
6043285242Sachim      {
6044285242Sachim        /* remove the DeviceMap and MapIndex */
6045285242Sachim        deviceIdx = pDevice->DeviceMapIndex & DEVICE_ID_BITS;
6046285242Sachim        SA_DBG1(("mpiDeviceHandleRemoval: A  Freed portId=0x%x deviceId=0x%x\n", portId, deviceid));
6047285242Sachim        OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
6048285242Sachim        saRoot->DeviceMap[deviceIdx].DeviceIdFromFW = 0;
6049285242Sachim        saRoot->DeviceMap[deviceIdx].DeviceHandle = agNULL;
6050285242Sachim        pDevice->DeviceMapIndex = 0;
6051285242Sachim
6052285242Sachim        /* Reset the device data structure */
6053285242Sachim        pDevice->pPort = agNULL;
6054285242Sachim        pDevice->initiatorDevHandle.sdkData = agNULL;
6055285242Sachim        pDevice->initiatorDevHandle.osData = agNULL;
6056285242Sachim        ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6057285242Sachim        saLlistAdd(&(saRoot->freeDevicesList), &(pDevice->linkNode));
6058285242Sachim        ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6059285242Sachim      }
6060285242Sachim    }
6061285242Sachim    else
6062285242Sachim    {
6063285242Sachim      /* no callback because bad device_id */
6064285242Sachim      SA_DBG1(("mpiDeviceHandleRemoval: Bad Device Handle, deviceId=0x%x\n", deviceid));
6065285242Sachim    }
6066285242Sachim  }
6067285242Sachim
6068285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3R");
6069285242Sachim  return ret;
6070285242Sachim}
6071285242Sachim
6072285242Sachim/******************************************************************************/
6073285242Sachim/*! \brief Set Device State Response
6074285242Sachim *
6075285242Sachim *  This routine handles the response of SET Device State Response
6076285242Sachim *
6077285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
6078285242Sachim *  \param pIomb        Pointer of IOMB Mesage
6079285242Sachim *
6080285242Sachim *  \return sucess or fail
6081285242Sachim *
6082285242Sachim */
6083285242Sachim/*******************************************************************************/
6084285242SachimGLOBAL bit32 mpiSetDeviceStateRsp(
6085285242Sachim  agsaRoot_t             *agRoot,
6086285242Sachim  agsaSetDeviceStateRsp_t *pIomb
6087285242Sachim  )
6088285242Sachim{
6089285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
6090285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6091285242Sachim  agsaIORequestDesc_t *pRequest;
6092285242Sachim  agsaDevHandle_t     *agDevHandle;
6093285242Sachim  agsaDeviceDesc_t    *pDevice;
6094285242Sachim  agsaContext_t       *agContext;
6095285242Sachim  bit32               tag, status, deviceState, deviceId;
6096285242Sachim
6097285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3Q");
6098285242Sachim
6099285242Sachim  SA_DBG1(("mpiSetDeviceStateRsp: HTag=0x%x, deviceId=0x%x\n", pIomb->tag, pIomb->deviceId));
6100285242Sachim
6101285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, tag));
6102285242Sachim  OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, deviceId));
6103285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, status));
6104285242Sachim
6105285242Sachim  /* get request from IOMap */
6106285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6107285242Sachim  if (agNULL == pRequest)
6108285242Sachim  {
6109285242Sachim    SA_DBG1(("mpiSetDeviceStateRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6110285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3Q");
6111285242Sachim    return AGSA_RC_FAILURE;
6112285242Sachim  }
6113285242Sachim
6114285242Sachim  agContext = saRoot->IOMap[tag].agContext;
6115285242Sachim  /* remove the request from IOMap */
6116285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
6117285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
6118285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
6119285242Sachim
6120285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
6121285242Sachim
6122285242Sachim  /* status is SUCCESS */
6123285242Sachim  OSSA_READ_LE_32(AGROOT, &deviceState, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, pds_nds));
6124285242Sachim
6125285242Sachim  /* find device handle from device index */
6126285242Sachim  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceId & DEVICE_ID_BITS].DeviceHandle;
6127285242Sachim  if (agNULL == pDevice)
6128285242Sachim  {
6129285242Sachim    SA_DBG1(("mpiSetDeviceStateRsp: DeviceHandle is NULL!!! deviceId=0x%x TAG=0x%x STATUS=0x%x \n", deviceId, tag, status));
6130285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3Q");
6131285242Sachim    return AGSA_RC_FAILURE;
6132285242Sachim  }
6133285242Sachim
6134285242Sachim  if (pDevice->targetDevHandle.sdkData)
6135285242Sachim  {
6136285242Sachim    agDevHandle = &(pDevice->targetDevHandle);
6137285242Sachim  }
6138285242Sachim  else
6139285242Sachim  {
6140285242Sachim    agDevHandle = &(pDevice->initiatorDevHandle);
6141285242Sachim  }
6142285242Sachim
6143285242Sachim  if (agDevHandle == agNULL)
6144285242Sachim  {
6145285242Sachim    SA_DBG1(("mpiSetDeviceStateRsp: warning!!! no deviceHandle is found"));
6146285242Sachim    ossaSetDeviceStateCB(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0, 0);
6147285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3Q");
6148285242Sachim
6149285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6150285242Sachim    pRequest->valid = agFALSE;
6151285242Sachim    /* return the request to free pool */
6152285242Sachim    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6153285242Sachim    {
6154285242Sachim      SA_DBG1(("mpiSetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
6155285242Sachim      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6156285242Sachim    }
6157285242Sachim    else
6158285242Sachim    {
6159285242Sachim      /* return the request to free pool */
6160285242Sachim      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6161285242Sachim    }
6162285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6163285242Sachim
6164285242Sachim    return AGSA_RC_FAILURE;
6165285242Sachim  }
6166285242Sachim
6167285242Sachim  ossaSetDeviceStateCB(agRoot, agContext, agDevHandle, status, (deviceState & NDS_BITS),
6168285242Sachim                      (deviceState & PDS_BITS) >> SHIFT4);
6169285242Sachim
6170285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6171285242Sachim  pRequest->valid = agFALSE;
6172285242Sachim  /* return the request to free pool */
6173285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6174285242Sachim  {
6175285242Sachim    SA_DBG1(("mpiSetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
6176285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6177285242Sachim  }
6178285242Sachim  else
6179285242Sachim  {
6180285242Sachim    /* return the request to free pool */
6181285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6182285242Sachim  }
6183285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6184285242Sachim
6185285242Sachim  /* return value */
6186285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3Q");
6187285242Sachim  return ret;
6188285242Sachim}
6189285242Sachim
6190285242Sachim/******************************************************************************/
6191285242Sachim/*! \brief Get Device State Response
6192285242Sachim *
6193285242Sachim *  This routine handles the response of GET Device State Response
6194285242Sachim *
6195285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
6196285242Sachim *  \param pIomb        Pointer of IOMB Mesage
6197285242Sachim *
6198285242Sachim *  \return sucess or fail
6199285242Sachim *
6200285242Sachim */
6201285242Sachim/*******************************************************************************/
6202285242SachimGLOBAL bit32 mpiGetDeviceStateRsp(
6203285242Sachim  agsaRoot_t             *agRoot,
6204285242Sachim  agsaGetDeviceStateRsp_t *pIomb
6205285242Sachim  )
6206285242Sachim{
6207285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
6208285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6209285242Sachim  agsaIORequestDesc_t *pRequest;
6210285242Sachim  agsaDevHandle_t     *agDevHandle;
6211285242Sachim  agsaDeviceDesc_t    *pDevice;
6212285242Sachim  agsaContext_t       *agContext;
6213285242Sachim  bit32               tag, status, deviceId, deviceState;
6214285242Sachim
6215285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3W");
6216285242Sachim
6217285242Sachim  SA_DBG1(("mpiGetDeviceStateRsp: HTag=0x%x, deviceId=0x%x\n", pIomb->tag, pIomb->deviceId));
6218285242Sachim
6219285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, tag));
6220285242Sachim  OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, deviceId));
6221285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, status));
6222285242Sachim
6223285242Sachim  /* get request from IOMap */
6224285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6225285242Sachim  if (agNULL == pRequest)
6226285242Sachim  {
6227285242Sachim    SA_DBG1(("mpiGetDeviceStateRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6228285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3W");
6229285242Sachim    return AGSA_RC_FAILURE;
6230285242Sachim  }
6231285242Sachim
6232285242Sachim  agContext = saRoot->IOMap[tag].agContext;
6233285242Sachim  /* remove the request from IOMap */
6234285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
6235285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
6236285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
6237285242Sachim
6238285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
6239285242Sachim
6240285242Sachim  /* status is SUCCESS */
6241285242Sachim  OSSA_READ_LE_32(AGROOT, &deviceState, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, ds));
6242285242Sachim
6243285242Sachim  /* find device handle from device index */
6244285242Sachim  pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceId & DEVICE_ID_BITS].DeviceHandle;
6245285242Sachim  if (pDevice != agNULL)
6246285242Sachim  {
6247285242Sachim    if (pDevice->targetDevHandle.sdkData)
6248285242Sachim    {
6249285242Sachim      agDevHandle = &(pDevice->targetDevHandle);
6250285242Sachim    }
6251285242Sachim    else
6252285242Sachim    {
6253285242Sachim      agDevHandle = &(pDevice->initiatorDevHandle);
6254285242Sachim    }
6255285242Sachim  }
6256285242Sachim  else
6257285242Sachim  {
6258285242Sachim    SA_DBG1(("mpiGetDeviceStateRsp: pDevice is NULL"));
6259285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3W");
6260285242Sachim    return AGSA_RC_FAILURE;
6261285242Sachim  }
6262285242Sachim
6263285242Sachim  if (agDevHandle == agNULL)
6264285242Sachim  {
6265285242Sachim    SA_DBG1(("mpiGetDeviceStateRsp: warning!!! no deviceHandle is found"));
6266285242Sachim    ossaGetDeviceStateCB(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0);
6267285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3W");
6268285242Sachim
6269285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6270285242Sachim    pRequest->valid = agFALSE;
6271285242Sachim    /* return the request to free pool */
6272285242Sachim    if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6273285242Sachim    {
6274285242Sachim      SA_DBG1(("mpiGetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
6275285242Sachim      saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6276285242Sachim    }
6277285242Sachim    else
6278285242Sachim    {
6279285242Sachim      /* return the request to free pool */
6280285242Sachim      saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6281285242Sachim    }
6282285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6283285242Sachim
6284285242Sachim    return AGSA_RC_FAILURE;
6285285242Sachim  }
6286285242Sachim
6287285242Sachim  ossaGetDeviceStateCB(agRoot, agContext, agDevHandle, status, deviceState);
6288285242Sachim
6289285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6290285242Sachim  pRequest->valid = agFALSE;
6291285242Sachim  /* return the request to free pool */
6292285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6293285242Sachim  {
6294285242Sachim    SA_DBG1(("mpiGetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
6295285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6296285242Sachim  }
6297285242Sachim  else
6298285242Sachim  {
6299285242Sachim    /* return the request to free pool */
6300285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6301285242Sachim  }
6302285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6303285242Sachim
6304285242Sachim  /* return value */
6305285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3W");
6306285242Sachim  return ret;
6307285242Sachim}
6308285242Sachim
6309285242Sachim/******************************************************************************/
6310285242Sachim/*! \brief SAS ReInitialize Response
6311285242Sachim *
6312285242Sachim *  This routine handles the response of SAS Reinitialize Response
6313285242Sachim *
6314285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
6315285242Sachim *  \param pIomb        Pointer of IOMB Mesage
6316285242Sachim *
6317285242Sachim *  \return sucess or fail
6318285242Sachim *
6319285242Sachim */
6320285242Sachim/*******************************************************************************/
6321285242SachimGLOBAL bit32 mpiSasReInitializeRsp(
6322285242Sachim  agsaRoot_t               *agRoot,
6323285242Sachim  agsaSasReInitializeRsp_t *pIomb
6324285242Sachim  )
6325285242Sachim{
6326285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
6327285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6328285242Sachim  agsaIORequestDesc_t *pRequest;
6329285242Sachim  agsaContext_t       *agContext;
6330285242Sachim  agsaSASReconfig_t   SASReconfig;
6331285242Sachim  bit32               tag, status, setFlags, MaxPorts;
6332285242Sachim  bit32               openRejReCmdData, sataHOLTMO;
6333285242Sachim
6334285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3X");
6335285242Sachim
6336285242Sachim  SA_DBG1(("mpiSasReInitializeRsp: HTag=0x%x, status=0x%x\n", pIomb->tag, pIomb->status));
6337285242Sachim
6338285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, tag));
6339285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, status));
6340285242Sachim  OSSA_READ_LE_32(AGROOT, &setFlags, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, setFlags));
6341285242Sachim  OSSA_READ_LE_32(AGROOT, &MaxPorts, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, MaxPorts));
6342285242Sachim  OSSA_READ_LE_32(AGROOT, &openRejReCmdData, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, openRejReCmdData));
6343285242Sachim  OSSA_READ_LE_32(AGROOT, &sataHOLTMO, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, sataHOLTMO));
6344285242Sachim
6345285242Sachim  /* get request from IOMap */
6346285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6347285242Sachim  if (agNULL == pRequest)
6348285242Sachim  {
6349285242Sachim    SA_DBG1(("mpiSasReInitializeRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6350285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3X");
6351285242Sachim    return AGSA_RC_FAILURE;
6352285242Sachim  }
6353285242Sachim
6354285242Sachim  agContext = saRoot->IOMap[tag].agContext;
6355285242Sachim  /* remove the request from IOMap */
6356285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
6357285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
6358285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
6359285242Sachim
6360285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
6361285242Sachim
6362285242Sachim  SASReconfig.flags = setFlags;
6363285242Sachim  SASReconfig.maxPorts = (bit8)(MaxPorts & 0xFF);
6364285242Sachim  SASReconfig.openRejectRetriesCmd = (bit16)((openRejReCmdData & 0xFFFF0000) >> SHIFT16);
6365285242Sachim  SASReconfig.openRejectRetriesData = (bit16)(openRejReCmdData & 0x0000FFFF);
6366285242Sachim  SASReconfig.sataHolTmo = (bit16)(sataHOLTMO & 0xFFFF);
6367285242Sachim  ossaReconfigSASParamsCB(agRoot, agContext, status, &SASReconfig);
6368285242Sachim
6369285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6370285242Sachim  pRequest->valid = agFALSE;
6371285242Sachim  /* return the request to free pool */
6372285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6373285242Sachim  {
6374285242Sachim    SA_DBG1(("mpiSasReInitializeRsp: saving pRequest (%p) for later use\n", pRequest));
6375285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6376285242Sachim  }
6377285242Sachim  else
6378285242Sachim  {
6379285242Sachim    /* return the request to free pool */
6380285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6381285242Sachim  }
6382285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6383285242Sachim
6384285242Sachim  /* return value */
6385285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3X");
6386285242Sachim
6387285242Sachim  return ret;
6388285242Sachim}
6389285242Sachim
6390285242Sachim/******************************************************************************/
6391285242Sachim/*! \brief serial GPIO Response
6392285242Sachim *
6393285242Sachim *  This routine handles the response of serial GPIO Response
6394285242Sachim *
6395285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
6396285242Sachim *  \param pIomb        Pointer of IOMB Mesage
6397285242Sachim *
6398285242Sachim *  \return sucess or fail
6399285242Sachim *
6400285242Sachim */
6401285242Sachim/*******************************************************************************/
6402285242SachimGLOBAL bit32 mpiSGpioRsp(
6403285242Sachim  agsaRoot_t        *agRoot,
6404285242Sachim  agsaSGpioRsp_t    *pInIomb
6405285242Sachim  )
6406285242Sachim{
6407285242Sachim  bit32                     ret = AGSA_RC_SUCCESS;
6408285242Sachim  agsaLLRoot_t              *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6409285242Sachim  agsaIORequestDesc_t       *pRequest = NULL;
6410285242Sachim  agsaContext_t             *agContext = NULL;
6411285242Sachim  bit32                     i, tag, resultFunctionFrameType;
6412285242Sachim  agsaSGpioReqResponse_t    SgpioResponse = {0};
6413285242Sachim
6414285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3Y");
6415285242Sachim
6416285242Sachim  SA_DBG3(("mpiSGpioRsp: HTAG=0x%x\n", pInIomb->tag));
6417285242Sachim
6418285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pInIomb, OSSA_OFFSET_OF(agsaSGpioRsp_t, tag));
6419285242Sachim  OSSA_READ_LE_32(AGROOT, &resultFunctionFrameType, pInIomb, OSSA_OFFSET_OF(agsaSGpioRsp_t, resultFunctionFrameType));
6420285242Sachim
6421285242Sachim  SgpioResponse.smpFrameType = resultFunctionFrameType & 0xFF;
6422285242Sachim  SgpioResponse.function = (resultFunctionFrameType & 0xFF00) >> 8;
6423285242Sachim  SgpioResponse.functionResult = (resultFunctionFrameType & 0xFF0000) >> 16;
6424285242Sachim
6425285242Sachim  if (SA_SAS_SMP_READ_GPIO_REGISTER == SgpioResponse.function)
6426285242Sachim  {
6427285242Sachim    for (i = 0; i < OSSA_SGPIO_MAX_READ_DATA_COUNT; i++)
6428285242Sachim    {
6429285242Sachim      OSSA_READ_LE_32(AGROOT, &SgpioResponse.readWriteData[i], pInIomb, OSSA_OFFSET_OF(agsaSGpioRsp_t, readData) + (i * 4));
6430285242Sachim    }
6431285242Sachim  }
6432285242Sachim
6433285242Sachim  /* Get the request from IOMap */
6434285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6435285242Sachim  if (agNULL == pRequest)
6436285242Sachim  {
6437285242Sachim    SA_DBG1(("mpiSGpioRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, SgpioResponse.functionResult));
6438285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3Y");
6439285242Sachim    ret = AGSA_RC_FAILURE;
6440285242Sachim  }
6441285242Sachim  else
6442285242Sachim  {
6443285242Sachim    agContext = saRoot->IOMap[tag].agContext;
6444285242Sachim    ossaSGpioCB(agRoot, agContext, &SgpioResponse);
6445285242Sachim
6446285242Sachim    /* Return the request to free pool */
6447285242Sachim    saReturnRequestToFreePool(agRoot, pRequest);
6448285242Sachim
6449285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3Y");
6450285242Sachim  }
6451285242Sachim
6452285242Sachim  return ret;
6453285242Sachim}
6454285242Sachim
6455285242Sachim/******************************************************************************/
6456285242Sachim/*! \brief PCIE Diagnostics Response
6457285242Sachim *
6458285242Sachim *  This routine handles the response of PCIE Diagnostics Response
6459285242Sachim *
6460285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
6461285242Sachim *  \param pIomb        Pointer of IOMB Mesage
6462285242Sachim *
6463285242Sachim *  \return sucess or fail
6464285242Sachim *
6465285242Sachim */
6466285242Sachim/*******************************************************************************/
6467285242SachimGLOBAL bit32 mpiPCIeDiagExecuteRsp(
6468285242Sachim  agsaRoot_t                *agRoot,
6469285242Sachim  void                      *pInIomb
6470285242Sachim  )
6471285242Sachim{
6472285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
6473285242Sachim  agsaLLRoot_t        *saRoot = agNULL;
6474285242Sachim  agsaIORequestDesc_t *pRequest;
6475285242Sachim  agsaContext_t       *agContext;
6476285242Sachim  bit32               tag, Status, Command;
6477285242Sachim  agsaPCIeDiagResponse_t pciediadrsp;
6478285242Sachim  bit32  *pIomb = (bit32  *)pInIomb;
6479285242Sachim
6480285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3Z");
6481285242Sachim
6482285242Sachim  /* sanity check */
6483285242Sachim  SA_ASSERT((agNULL != agRoot), "");
6484285242Sachim  saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
6485285242Sachim  SA_ASSERT((agNULL != saRoot), "");
6486285242Sachim
6487285242Sachim  si_memset(&pciediadrsp, 0, sizeof(agsaPCIeDiagResponse_t));
6488285242Sachim
6489285242Sachim  if(smIS_SPCV(agRoot))
6490285242Sachim  {
6491285242Sachim    OSSA_READ_LE_32(AGROOT, &tag,                  pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,tag));
6492285242Sachim    OSSA_READ_LE_32(AGROOT, &Command,              pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,CmdTypeDesc));
6493285242Sachim    OSSA_READ_LE_32(AGROOT, &Status,               pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,Status));
6494285242Sachim    OSSA_READ_LE_32(AGROOT, &pciediadrsp.ERR_BLKH, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,ERR_BLKH ));
6495285242Sachim    OSSA_READ_LE_32(AGROOT, &pciediadrsp.ERR_BLKL, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,ERR_BLKL ));
6496285242Sachim    OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord8,   pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord8 ));
6497285242Sachim    OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord9,   pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord9 ));
6498285242Sachim    OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord10,  pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord10 ));
6499285242Sachim    OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord11,  pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord11 ));
6500285242Sachim    OSSA_READ_LE_32(AGROOT, &pciediadrsp.DIF_ERR,  pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DIF_ERR ));
6501285242Sachim    SA_DBG3(("mpiPCIeDiagExecuteRsp: HTAG=0x%x\n",tag));
6502285242Sachim  }
6503285242Sachim  else
6504285242Sachim  {
6505285242Sachim    OSSA_READ_LE_32(AGROOT, &tag,        pIomb,           OSSA_OFFSET_OF(agsa_SPC_PCIeDiagExecuteRsp_t,tag));
6506285242Sachim    OSSA_READ_LE_32(AGROOT, &Command,    pIomb,           OSSA_OFFSET_OF(agsa_SPC_PCIeDiagExecuteRsp_t,CmdTypeDesc));
6507285242Sachim    OSSA_READ_LE_32(AGROOT, &Status,     pIomb,           OSSA_OFFSET_OF(agsa_SPC_PCIeDiagExecuteRsp_t,Status));
6508285242Sachim    SA_DBG3(("mpiPCIeDiagExecuteRsp: SPC HTAG=0x%x\n",tag));
6509285242Sachim  }
6510285242Sachim
6511285242Sachim  switch(Status)
6512285242Sachim  {
6513285242Sachim    case OSSA_PCIE_DIAG_SUCCESS:
6514285242Sachim      SA_DBG3(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_SUCCESS TAG=0x%x STATUS=0x%x\n", tag, Status));
6515285242Sachim      break;
6516285242Sachim    case OSSA_IO_INVALID_LENGTH:
6517285242Sachim      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_IO_INVALID_LENGTH TAG=0x%x STATUS=0x%x\n", tag, Status));
6518285242Sachim      break;
6519285242Sachim    case OSSA_PCIE_DIAG_INVALID_COMMAND:
6520285242Sachim      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_COMMAND TAG=0x%x STATUS=0x%x\n", tag, Status));
6521285242Sachim      break;
6522285242Sachim    case OSSA_PCIE_DIAG_INTERNAL_FAILURE:
6523285242Sachim      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INTERNAL_FAILURE TAG=0x%x STATUS=0x%x\n", tag, Status));
6524285242Sachim      break;
6525285242Sachim    case OSSA_PCIE_DIAG_INVALID_CMD_TYPE:
6526285242Sachim      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_CMD_TYPE TAG=0x%x STATUS=0x%x\n", tag, Status));
6527285242Sachim      break;
6528285242Sachim    case OSSA_PCIE_DIAG_INVALID_CMD_DESC:
6529285242Sachim      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_CMD_DESC TAG=0x%x STATUS=0x%x\n", tag, Status));
6530285242Sachim      break;
6531285242Sachim    case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
6532285242Sachim      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
6533285242Sachim      break;
6534285242Sachim    case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_CRC_MISMATCH:
6535285242Sachim      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_CRC_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
6536285242Sachim      break;
6537285242Sachim    case OSSA_PCIE_DIAG_INVALID_PCIE_ADDR:
6538285242Sachim      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_PCIE_ADDR TAG=0x%x STATUS=0x%x\n", tag, Status));
6539285242Sachim      break;
6540285242Sachim    case OSSA_PCIE_DIAG_INVALID_BLOCK_SIZE:
6541285242Sachim      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_BLOCK_SIZE TAG=0x%x STATUS=0x%x\n", tag, Status));
6542285242Sachim      break;
6543285242Sachim    case OSSA_PCIE_DIAG_LENGTH_NOT_BLOCK_SIZE_ALIGNED:
6544285242Sachim      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_LENGTH_NOT_BLOCK_SIZE_ALIGNED TAG=0x%x STATUS=0x%x\n", tag, Status));
6545285242Sachim      break;
6546285242Sachim    case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_MISMATCH:
6547285242Sachim      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
6548285242Sachim      break;
6549285242Sachim    case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
6550285242Sachim      SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
6551285242Sachim      break;
6552285242Sachim    default:
6553285242Sachim      SA_DBG1(("mpiPCIeDiagExecuteRsp:  UNKNOWN status TAG=0x%x STATUS=0x%x\n", tag, Status));
6554285242Sachim      break;
6555285242Sachim  }
6556285242Sachim  /* get request from IOMap */
6557285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6558285242Sachim  if (agNULL == pRequest)
6559285242Sachim  {
6560285242Sachim    SA_DBG1(("mpiPCIeDiagExecuteRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, Status));
6561285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3Z");
6562285242Sachim    return AGSA_RC_FAILURE;
6563285242Sachim  }
6564285242Sachim
6565285242Sachim  agContext = saRoot->IOMap[tag].agContext;
6566285242Sachim  /* remove the request from IOMap */
6567285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
6568285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
6569285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
6570285242Sachim
6571285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
6572285242Sachim
6573285242Sachim  ossaPCIeDiagExecuteCB(agRoot, agContext, Status, Command,&pciediadrsp);
6574285242Sachim
6575285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6576285242Sachim  pRequest->valid = agFALSE;
6577285242Sachim  /* return the request to free pool */
6578285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6579285242Sachim  {
6580285242Sachim    SA_DBG1(("mpiPCIeDiagExecuteRsp: saving pRequest (%p) for later use\n", pRequest));
6581285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6582285242Sachim  }
6583285242Sachim  else
6584285242Sachim  {
6585285242Sachim    /* return the request to free pool */
6586285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6587285242Sachim  }
6588285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6589285242Sachim
6590285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3Z");
6591285242Sachim
6592285242Sachim  /* return value */
6593285242Sachim  return ret;
6594285242Sachim}
6595285242Sachim/******************************************************************************/
6596285242Sachim/*! \brief Get DFE Data command Response
6597285242Sachim *
6598285242Sachim *  This routine handles the response of Get DFE Data command Response
6599285242Sachim *
6600285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
6601285242Sachim *  \param pIomb        Pointer of IOMB Mesage
6602285242Sachim *
6603285242Sachim *  \return sucess or fail
6604285242Sachim *
6605285242Sachim */
6606285242Sachim/*******************************************************************************/
6607285242SachimGLOBAL bit32 mpiGetDFEDataRsp(
6608285242Sachim  agsaRoot_t    *agRoot,
6609285242Sachim  void          *pIomb
6610285242Sachim  )
6611285242Sachim{
6612285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
6613285242Sachim  agsaLLRoot_t        *saRoot = agNULL;
6614285242Sachim  agsaIORequestDesc_t *pRequest;
6615285242Sachim  agsaContext_t       *agContext;
6616285242Sachim  bit32               tag = 0, status = 0, In_Ln = 0, MCNT = 0, NBT = 0;
6617285242Sachim
6618285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2Y");
6619285242Sachim
6620285242Sachim  /* sanity check */
6621285242Sachim  SA_ASSERT((agNULL != agRoot), "");
6622285242Sachim  saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
6623285242Sachim  SA_ASSERT((agNULL != saRoot), "");
6624285242Sachim
6625285242Sachim  if(smIS_SPCV(agRoot))
6626285242Sachim  {
6627285242Sachim    OSSA_READ_LE_32(AGROOT, &tag,                pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,tag));
6628285242Sachim    OSSA_READ_LE_32(AGROOT, &status,             pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,status));
6629285242Sachim    OSSA_READ_LE_32(AGROOT, &In_Ln,              pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,reserved_In_Ln));
6630285242Sachim    OSSA_READ_LE_32(AGROOT, &MCNT,               pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,MCNT));
6631285242Sachim    OSSA_READ_LE_32(AGROOT, &NBT,                pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,NBT));
6632285242Sachim  }
6633285242Sachim  else
6634285242Sachim  {
6635285242Sachim    /* SPC does not support this command */
6636285242Sachim  }
6637285242Sachim
6638285242Sachim  switch(status)
6639285242Sachim  {
6640285242Sachim    case OSSA_DFE_MPI_IO_SUCCESS:
6641285242Sachim      SA_DBG3(("mpiGetDFEDataRsp: OSSA_DFE_MPI_IO_SUCCESS TAG=0x%x STATUS=0x%x\n", tag, status));
6642285242Sachim      break;
6643285242Sachim    case OSSA_DFE_DATA_OVERFLOW:
6644285242Sachim      SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_DATA_OVERFLOW TAG=0x%x STATUS=0x%x\n", tag, status));
6645285242Sachim      break;
6646285242Sachim    case OSSA_DFE_MPI_ERR_RESOURCE_UNAVAILABLE:
6647285242Sachim      SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_MPI_ERR_RESOURCE_UNAVAILABLE TAG=0x%x STATUS=0x%x\n", tag, status));
6648285242Sachim      break;
6649285242Sachim    case OSSA_DFE_CHANNEL_DOWN:
6650285242Sachim      SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_CHANNEL_DOWN TAG=0x%x STATUS=0x%x\n", tag, status));
6651285242Sachim      break;
6652285242Sachim    case OSSA_DFE_MEASUREMENT_IN_PROGRESS:
6653285242Sachim      SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_MEASUREMENT_IN_PROGRESS TAG=0x%x STATUS=0x%x\n", tag, status));
6654285242Sachim      break;
6655285242Sachim    case OSSA_DFE_CHANNEL_INVALID:
6656285242Sachim      SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_CHANNEL_INVALID TAG=0x%x STATUS=0x%x\n", tag, status));
6657285242Sachim      break;
6658285242Sachim    case OSSA_DFE_DMA_FAILURE:
6659285242Sachim      SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_DMA_FAILURE TAG=0x%x STATUS=0x%x\n", tag, status));
6660285242Sachim      break;
6661285242Sachim    default:
6662285242Sachim      SA_DBG1(("mpiGetDFEDataRsp:  UNKNOWN status TAG=0x%x STATUS=0x%x\n", tag, status));
6663285242Sachim      break;
6664285242Sachim   }
6665285242Sachim
6666285242Sachim  /* get request from IOMap */
6667285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6668285242Sachim  if (agNULL == pRequest)
6669285242Sachim  {
6670285242Sachim    SA_DBG1(("mpiGetDFEDataRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, status));
6671285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2Y");
6672285242Sachim    return AGSA_RC_FAILURE;
6673285242Sachim  }
6674285242Sachim
6675285242Sachim  agContext = saRoot->IOMap[tag].agContext;
6676285242Sachim  /* remove the request from IOMap */
6677285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
6678285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
6679285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
6680285242Sachim
6681285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
6682285242Sachim
6683285242Sachim  ossaGetDFEDataCB(agRoot, agContext, status, NBT);
6684285242Sachim
6685285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6686285242Sachim  pRequest->valid = agFALSE;
6687285242Sachim  /* return the request to free pool */
6688285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6689285242Sachim  {
6690285242Sachim    SA_DBG1(("mpiGetDFEDataRsp: saving pRequest (%p) for later use\n", pRequest));
6691285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6692285242Sachim  }
6693285242Sachim  else
6694285242Sachim  {
6695285242Sachim    /* return the request to free pool */
6696285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6697285242Sachim  }
6698285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6699285242Sachim
6700285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2Y");
6701285242Sachim
6702285242Sachim  return ret;
6703285242Sachim}
6704285242Sachim
6705285242Sachim
6706285242Sachim/******************************************************************************/
6707285242Sachim/*! \brief SAS Set Controller Config Response
6708285242Sachim *
6709285242Sachim *  This routine handles the response of Set Controller Config Command
6710285242Sachim *
6711285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
6712285242Sachim *  \param pIomb        Pointer of IOMB Mesage
6713285242Sachim *
6714285242Sachim *  \return sucess or fail
6715285242Sachim *
6716285242Sachim */
6717285242Sachim/*******************************************************************************/
6718285242SachimGLOBAL bit32 mpiSetControllerConfigRsp(
6719285242Sachim  agsaRoot_t                   *agRoot,
6720285242Sachim  agsaSetControllerConfigRsp_t *pIomb
6721285242Sachim  )
6722285242Sachim{
6723285242Sachim  agsaLLRoot_t          *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6724285242Sachim  agsaIORequestDesc_t   *pRequest;
6725285242Sachim  agsaHWEventMode_t     agMode;
6726285242Sachim  bit32                 status, errorQualifierPage, tag;
6727285242Sachim  bit32                 errorQualifier;
6728285242Sachim  bit32                 pagetype;
6729285242Sachim
6730285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3a");
6731285242Sachim
6732285242Sachim  SA_DBG1(("mpiSetControllerConfigRsp: HTag=0x%x\n", pIomb->tag));
6733285242Sachim
6734285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetControllerConfigRsp_t, tag));
6735285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetControllerConfigRsp_t, status));
6736285242Sachim  OSSA_READ_LE_32(AGROOT, &errorQualifierPage, pIomb, OSSA_OFFSET_OF(agsaSetControllerConfigRsp_t, errorQualifierPage));
6737285242Sachim
6738285242Sachim  /* get request from IOMap */
6739285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6740285242Sachim  if (agNULL == pRequest)
6741285242Sachim  {
6742285242Sachim    SA_DBG1(("mpiSetControllerConfigRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6743285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3a");
6744285242Sachim    return AGSA_RC_FAILURE;
6745285242Sachim  }
6746285242Sachim
6747285242Sachim  si_memset(&agMode, 0, sizeof(agsaHWEventMode_t));
6748285242Sachim  agMode.modePageOperation = agsaModePageSet;
6749285242Sachim  agMode.status = status;
6750285242Sachim  agMode.context = saRoot->IOMap[tag].agContext;
6751285242Sachim  errorQualifier = (errorQualifierPage & 0xFFFF0000) >> SHIFT16;
6752285242Sachim  pagetype = (errorQualifierPage & 0xFF);
6753285242Sachim
6754285242Sachim  if(status )
6755285242Sachim  {
6756285242Sachim    SA_DBG1(("mpiSetControllerConfigRsp: Error detected tag 0x%x pagetype 0x%x status 0x%x errorQualifier 0x%x\n",
6757285242Sachim      tag, pagetype,status, errorQualifier));
6758285242Sachim  }
6759285242Sachim  else
6760285242Sachim  {
6761285242Sachim    SA_DBG1(("mpiSetControllerConfigRsp: tag 0x%x pagetype 0x%x status 0x%x\n", tag, pagetype,status ));
6762285242Sachim  }
6763285242Sachim
6764285242Sachim
6765285242Sachim  switch( pagetype)
6766285242Sachim  {
6767285242Sachim    case AGSA_ENCRYPTION_DEK_CONFIG_PAGE:
6768285242Sachim    case AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE:
6769285242Sachim    case AGSA_INTERRUPT_CONFIGURATION_PAGE:
6770285242Sachim    case AGSA_ENCRYPTION_HMAC_CONFIG_PAGE:
6771285242Sachim    case AGSA_IO_GENERAL_CONFIG_PAGE:
6772285242Sachim    /*case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:*/
6773285242Sachim      /* Report the event before freeing the IOMB */
6774285242Sachim      SA_DBG1(("mpiSetControllerConfigRsp:OSSA_HW_EVENT_MODE\n"));
6775285242Sachim      ossaHwCB(agRoot,agMode.context, OSSA_HW_EVENT_MODE, errorQualifierPage, (void *) &agMode, 0);
6776285242Sachim
6777285242Sachim
6778285242Sachim      break;
6779285242Sachim
6780285242Sachim    case AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE:
6781285242Sachim      SA_DBG1(("mpiSetControllerConfigRsp:warning!!!! GENERAL_CONFIG_PAGE is read only, cannot be set\n"));
6782285242Sachim      break;
6783285242Sachim
6784285242Sachim    /* why we need to read the scrach pad register when handling ENCRYPTION_SECURITY_PARM_PAGE??? */
6785285242Sachim    case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:
6786285242Sachim    {
6787285242Sachim      bit32 ScratchPad1 = 0;
6788285242Sachim      bit32 ScratchPad3 = 0;
6789285242Sachim      agsaEncryptInfo_t encrypt;
6790285242Sachim      agsaEncryptInfo_t *encryptInfo = &encrypt;
6791285242Sachim      SA_DBG1(("mpiSetControllerConfigRsp: AGSA_ENCRYPTION_CONTROL_PARM_PAGE\n" ));
6792285242Sachim
6793285242Sachim      if( pRequest->modePageContext)
6794285242Sachim      {
6795285242Sachim        pRequest->modePageContext = agFALSE;
6796285242Sachim      }
6797285242Sachim
6798285242Sachim      si_memset(&encrypt, 0, sizeof(agsaEncryptInfo_t));
6799285242Sachim      encryptInfo->status = 0;
6800285242Sachim      encryptInfo->encryptionCipherMode = 0;
6801285242Sachim      encryptInfo->encryptionSecurityMode = 0;
6802285242Sachim
6803285242Sachim      ScratchPad1 = ossaHwRegRead(agRoot,V_Scratchpad_1_Register);
6804285242Sachim      ScratchPad3 = ossaHwRegRead(agRoot,V_Scratchpad_3_Register);
6805285242Sachim      if( ScratchPad3 & SCRATCH_PAD3_V_XTS_ENABLED)
6806285242Sachim      {
6807285242Sachim        encryptInfo->encryptionCipherMode = agsaEncryptCipherModeXTS;
6808285242Sachim      }
6809285242Sachim      if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMF_ENABLED )
6810285242Sachim      {
6811285242Sachim        encryptInfo->encryptionSecurityMode = agsaEncryptSMF;
6812285242Sachim      }
6813285242Sachim      if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMA_ENABLED)
6814285242Sachim      {
6815285242Sachim        encryptInfo->encryptionSecurityMode = agsaEncryptSMA;
6816285242Sachim      }
6817285242Sachim      if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMB_ENABLED )
6818285242Sachim      {
6819285242Sachim        encryptInfo->encryptionSecurityMode = agsaEncryptSMB;
6820285242Sachim      }
6821285242Sachim      if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) ==  SCRATCH_PAD1_V_RAAE_MASK)
6822285242Sachim      {
6823285242Sachim        if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK) == SCRATCH_PAD3_V_ENC_READY ) /* 3 */
6824285242Sachim        {
6825285242Sachim          encryptInfo->status = AGSA_RC_SUCCESS;
6826285242Sachim        }
6827285242Sachim        else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_READY) == SCRATCH_PAD3_V_ENC_DISABLED) /* 0 */
6828285242Sachim        {
6829285242Sachim          encryptInfo->status = 0xFFFF;
6830285242Sachim          encryptInfo->encryptionCipherMode = 0;
6831285242Sachim          encryptInfo->encryptionSecurityMode = 0;
6832285242Sachim        }
6833285242Sachim        else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_DIS_ERR) /* 1 */
6834285242Sachim        {
6835285242Sachim          encryptInfo->status = (ScratchPad3 & SCRATCH_PAD3_V_ERR_CODE ) >> SHIFT16;
6836285242Sachim        }
6837285242Sachim        else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_ENA_ERR) /* 2 */
6838285242Sachim        {
6839285242Sachim          encryptInfo->status = (ScratchPad3 & SCRATCH_PAD3_V_ERR_CODE ) >> SHIFT16;
6840285242Sachim        }
6841285242Sachim      }
6842285242Sachim      else  if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) ==  SCRATCH_PAD1_V_RAAE_ERR)
6843285242Sachim      {
6844285242Sachim        SA_DBG1(("mpiSetControllerConfigRsp, RAAE not ready SPC AGSA_RC_FAILURE\n"));
6845285242Sachim        encryptInfo->status = 0xFFFF;
6846285242Sachim        encryptInfo->encryptionCipherMode = 0;
6847285242Sachim        encryptInfo->encryptionSecurityMode = 0;
6848285242Sachim      }
6849285242Sachim      else  if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) == 0x0 )
6850285242Sachim      {
6851285242Sachim        SA_DBG2(("mpiSetControllerConfigRsp, RAAE not ready AGSA_RC_BUSY\n"));
6852285242Sachim      }
6853285242Sachim
6854285242Sachim      SA_DBG2(("mpiSetControllerConfigRsp, encryptionCipherMode 0x%x encryptionSecurityMode 0x%x status 0x%x\n",
6855285242Sachim                encryptInfo->encryptionCipherMode,
6856285242Sachim                encryptInfo->encryptionSecurityMode,
6857285242Sachim                encryptInfo->status));
6858285242Sachim      SA_DBG2(("mpiSetControllerConfigRsp, ScratchPad3 0x%x\n",ScratchPad3));
6859285242Sachim      SA_DBG1(("mpiSetControllerConfigRsp:AGSA_ENCRYPTION_CONTROL_PARM_PAGE 0x%X\n", agMode.modePageOperation));
6860285242Sachim      ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_SECURITY_MODE, errorQualifier, (void *)encryptInfo, agMode.context);
6861285242Sachim      break;
6862285242Sachim    }
6863285242Sachim
6864285242Sachim    default:
6865285242Sachim      SA_DBG1(("mpiSetControllerConfigRsp: Unknown page code 0x%X\n", pagetype));
6866285242Sachim      break;
6867285242Sachim  }
6868285242Sachim
6869285242Sachim  /* remove the request from IOMap */
6870285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
6871285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
6872285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
6873285242Sachim
6874285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6875285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
6876285242Sachim  pRequest->valid = agFALSE;
6877285242Sachim  /* return the request to free pool */
6878285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6879285242Sachim  {
6880285242Sachim    SA_DBG1(("mpiSetControllerRsp: saving pRequest (%p) for later use\n", pRequest));
6881285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6882285242Sachim  }
6883285242Sachim  else
6884285242Sachim  {
6885285242Sachim    /* return the request to free pool */
6886285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6887285242Sachim  }
6888285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6889285242Sachim
6890285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3a");
6891285242Sachim  return AGSA_RC_SUCCESS;
6892285242Sachim
6893285242Sachim}
6894285242Sachim
6895285242Sachim/******************************************************************************/
6896285242Sachim/*! \brief SAS Get Controller Config Response
6897285242Sachim *
6898285242Sachim *  This routine handles the response of Get Controller Config Command
6899285242Sachim *
6900285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
6901285242Sachim *  \param pIomb        Pointer of IOMB Mesage
6902285242Sachim *
6903285242Sachim *  \return sucess or fail
6904285242Sachim *
6905285242Sachim */
6906285242Sachim/*******************************************************************************/
6907285242SachimGLOBAL bit32 mpiGetControllerConfigRsp(
6908285242Sachim  agsaRoot_t               *agRoot,
6909285242Sachim  agsaGetControllerConfigRsp_t *pIomb
6910285242Sachim  )
6911285242Sachim{
6912285242Sachim  agsaLLRoot_t          *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6913285242Sachim  agsaIORequestDesc_t   *pRequest;
6914285242Sachim  agsaHWEventMode_t     agMode;
6915285242Sachim  bit32                 status, errorQualifier, tag;
6916285242Sachim  bit32                 configPage[12];
6917285242Sachim
6918285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3b");
6919285242Sachim
6920285242Sachim  si_memset(&agMode, 0, sizeof(agsaHWEventMode_t));
6921285242Sachim  si_memset(configPage, 0, sizeof(configPage));
6922285242Sachim
6923285242Sachim
6924285242Sachim  SA_DBG2(("mpiGetControllerConfigRsp: HTag=0x%x\n", pIomb->tag));
6925285242Sachim
6926285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t, tag));
6927285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t, status));
6928285242Sachim  OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t, errorQualifier));
6929285242Sachim  OSSA_READ_LE_32(AGROOT, &configPage[0],  pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[0] ));
6930285242Sachim  OSSA_READ_LE_32(AGROOT, &configPage[1],  pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[1] ));
6931285242Sachim  OSSA_READ_LE_32(AGROOT, &configPage[2],  pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[2] ));
6932285242Sachim  OSSA_READ_LE_32(AGROOT, &configPage[3],  pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[3] ));
6933285242Sachim  OSSA_READ_LE_32(AGROOT, &configPage[4],  pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[4] ));
6934285242Sachim  OSSA_READ_LE_32(AGROOT, &configPage[5],  pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[5] ));
6935285242Sachim
6936285242Sachim  /* get request from IOMap */
6937285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6938285242Sachim  if (agNULL == pRequest)
6939285242Sachim  {
6940285242Sachim    SA_DBG1(("mpiGetControllerConfigRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6941285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3b");
6942285242Sachim    return AGSA_RC_FAILURE;
6943285242Sachim  }
6944285242Sachim
6945285242Sachim  si_memset(&agMode, 0, sizeof(agsaHWEventMode_t));
6946285242Sachim  agMode.modePageOperation = agsaModePageGet;
6947285242Sachim  agMode.status = status;
6948285242Sachim
6949285242Sachim  SA_DBG1(("mpiGetControllerConfigRsp: page 0x%x status 0x%x errorQualifier 0x%x \n", (pIomb->configPage[0] & 0xFF),status, errorQualifier));
6950285242Sachim
6951285242Sachim  switch (pIomb->configPage[0] & 0xFF)
6952285242Sachim  {
6953285242Sachim  case AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE:
6954285242Sachim      agMode.modePageLen = sizeof(agsaSASProtocolTimerConfigurationPage_t);
6955285242Sachim      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6956285242Sachim      break;
6957285242Sachim  case AGSA_INTERRUPT_CONFIGURATION_PAGE:
6958285242Sachim      agMode.modePageLen = sizeof(agsaInterruptConfigPage_t);
6959285242Sachim      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_INTERRUPT_CONFIGURATION_PAGE page len 0x%x \n",agMode.modePageLen));
6960285242Sachim      break;
6961285242Sachim  case AGSA_IO_GENERAL_CONFIG_PAGE:
6962285242Sachim      agMode.modePageLen = sizeof(agsaIoGeneralPage_t);
6963285242Sachim      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_IO_GENERAL_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6964285242Sachim      break;
6965285242Sachim  case AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE:
6966285242Sachim      agMode.modePageLen = sizeof(agsaEncryptGeneralPage_t);
6967285242Sachim      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6968285242Sachim#ifdef HIALEAH_ENCRYPTION
6969285242Sachim      saRoot->EncGenPage.numberOfKeksPageCode = configPage[0];
6970285242Sachim      saRoot->EncGenPage.KeyCardIdKekIndex    = configPage[1];
6971285242Sachim      saRoot->EncGenPage.KeyCardId3_0         = configPage[2];
6972285242Sachim      saRoot->EncGenPage.KeyCardId7_4         = configPage[3];
6973285242Sachim      saRoot->EncGenPage.KeyCardId11_8        = configPage[4];
6974285242Sachim
6975285242Sachim      SA_DBG1(("mpiGetControllerConfigRsp: numberOfKeksPageCode 0x%x\n",saRoot->EncGenPage.numberOfKeksPageCode));
6976285242Sachim      SA_DBG1(("mpiGetControllerConfigRsp: KeyCardIdKekIndex    0x%x\n",saRoot->EncGenPage.KeyCardIdKekIndex));
6977285242Sachim      SA_DBG1(("mpiGetControllerConfigRsp: KeyCardId3_0         0x%x\n",saRoot->EncGenPage.KeyCardId3_0));
6978285242Sachim      SA_DBG1(("mpiGetControllerConfigRsp: KeyCardId7_4         0x%x\n",saRoot->EncGenPage.KeyCardId7_4));
6979285242Sachim      SA_DBG1(("mpiGetControllerConfigRsp: KeyCardId11_8        0x%x\n",saRoot->EncGenPage.KeyCardId11_8));
6980285242Sachim#endif /* HIALEAH_ENCRYPTION */
6981285242Sachim
6982285242Sachim      break;
6983285242Sachim  case AGSA_ENCRYPTION_DEK_CONFIG_PAGE:
6984285242Sachim      agMode.modePageLen = sizeof(agsaEncryptDekConfigPage_t);
6985285242Sachim      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_DEK_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6986285242Sachim      break;
6987285242Sachim  case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:
6988285242Sachim      agMode.modePageLen = sizeof(agsaEncryptControlParamPage_t);
6989285242Sachim      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_CONTROL_PARM_PAGE page len 0x%x \n",agMode.modePageLen));
6990285242Sachim      break;
6991285242Sachim  case AGSA_ENCRYPTION_HMAC_CONFIG_PAGE:
6992285242Sachim      agMode.modePageLen = sizeof(agsaEncryptHMACConfigPage_t);
6993285242Sachim      SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_HMAC_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6994285242Sachim      break;
6995285242Sachim  default:
6996285242Sachim      agMode.modePageLen = 0;
6997285242Sachim      SA_DBG1(("mpiGetControllerConfigRsp: Unknown !!! page len 0x%x \n",agMode.modePageLen));
6998285242Sachim      break;
6999285242Sachim  }
7000285242Sachim
7001285242Sachim  agMode.modePage = (void *) &pIomb->configPage[0];
7002285242Sachim  agMode.context = saRoot->IOMap[tag].agContext;
7003285242Sachim
7004285242Sachim  /* Report the event before freeing the IOMB */
7005285242Sachim  ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_MODE, errorQualifier, (void *) &agMode, 0);
7006285242Sachim
7007285242Sachim  /* remove the request from IOMap */
7008285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
7009285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
7010285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
7011285242Sachim
7012285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7013285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
7014285242Sachim  pRequest->valid = agFALSE;
7015285242Sachim  /* return the request to free pool */
7016285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7017285242Sachim  {
7018285242Sachim    SA_DBG1(("mpiGetControllerRsp: saving pRequest (%p) for later use\n", pRequest));
7019285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7020285242Sachim  }
7021285242Sachim  else
7022285242Sachim  {
7023285242Sachim    /* return the request to free pool */
7024285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7025285242Sachim  }
7026285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7027285242Sachim
7028285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3b");
7029285242Sachim  return AGSA_RC_SUCCESS;
7030285242Sachim}
7031285242Sachim
7032285242Sachim/******************************************************************************/
7033285242Sachim/*! \brief KEK Management Response
7034285242Sachim *
7035285242Sachim *  This routine handles the response of the KEK management message
7036285242Sachim *
7037285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
7038285242Sachim *  \param pIomb        Pointer of IOMB Mesage
7039285242Sachim *
7040285242Sachim *  \return sucess or fail
7041285242Sachim *
7042285242Sachim */
7043285242Sachim/*******************************************************************************/
7044285242SachimGLOBAL bit32 mpiKekManagementRsp(
7045285242Sachim  agsaRoot_t               *agRoot,
7046285242Sachim  agsaKekManagementRsp_t *pIomb
7047285242Sachim  )
7048285242Sachim{
7049285242Sachim  agsaLLRoot_t          *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7050285242Sachim  agsaIORequestDesc_t   *pRequest;
7051285242Sachim  agsaContext_t         *agContext;
7052285242Sachim  agsaHWEventEncrypt_t  agEvent;
7053285242Sachim  bit32                 status, errorQualifier, tag, flags;
7054285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2A");
7055285242Sachim
7056285242Sachim  SA_DBG1(("mpiKekManagementRsp: HTag=0x%x\n", pIomb->tag));
7057285242Sachim
7058285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, tag));
7059285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, status));
7060285242Sachim  OSSA_READ_LE_32(AGROOT, &flags, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, flags));
7061285242Sachim  OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, errorQualifier));
7062285242Sachim
7063285242Sachim
7064285242Sachim  SA_DBG1(("mpiKekManagementRsp:status 0x%x flags 0x%x errorQualifier 0x%x\n", status, flags, errorQualifier));
7065285242Sachim
7066285242Sachim  si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
7067285242Sachim  if ((flags & 0xFF) == KEK_MGMT_SUBOP_UPDATE)
7068285242Sachim  {
7069285242Sachim    SA_DBG1(("mpiKekManagementRsp:KEK_MGMT_SUBOP_UPDATE 0x%x \n", status));
7070285242Sachim    if (flags & 0xFF00) /* update and store*/
7071285242Sachim    {
7072285242Sachim      agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE;
7073285242Sachim    }
7074285242Sachim    else /* update */
7075285242Sachim    {
7076285242Sachim      agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE;
7077285242Sachim    }
7078285242Sachim    agEvent.status = status;
7079285242Sachim    if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
7080285242Sachim    {
7081285242Sachim        agEvent.eq = errorQualifier;
7082285242Sachim    }
7083285242Sachim    agEvent.info = 0;
7084285242Sachim    /* Store the new KEK index in agEvent.handle */
7085285242Sachim    agEvent.handle = (void *) ((bitptr) (flags >> 24));
7086285242Sachim    /* Store the current KEK index in agEvent.param */
7087285242Sachim    agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
7088285242Sachim
7089285242Sachim  }
7090285242Sachim
7091285242Sachim  else if ((flags & 0xFF) == KEK_MGMT_SUBOP_INVALIDATE)
7092285242Sachim  {
7093285242Sachim      agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_INVALIDTE;
7094285242Sachim      agEvent.status = status;
7095285242Sachim      if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
7096285242Sachim      {
7097285242Sachim          agEvent.eq = errorQualifier;
7098285242Sachim      }
7099285242Sachim      agEvent.info = 0;
7100285242Sachim      /* Store the new KEK index in agEvent.handle */
7101285242Sachim      agEvent.handle = (void *) ((bitptr) (flags >> 24));
7102285242Sachim      /* Store the current KEK index in agEvent.param */
7103285242Sachim      agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
7104285242Sachim  }
7105285242Sachim
7106285242Sachim  else if ((flags & 0xFF) == KEK_MGMT_SUBOP_KEYCARDINVALIDATE)
7107285242Sachim  {
7108285242Sachim     agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE;
7109285242Sachim      agEvent.status = status;
7110285242Sachim      if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
7111285242Sachim      {
7112285242Sachim          agEvent.eq = errorQualifier;
7113285242Sachim      }
7114285242Sachim      agEvent.info = 0;
7115285242Sachim      /* Store the new KEK index in agEvent.handle */
7116285242Sachim      agEvent.handle = (void *) ((bitptr) (flags >> 24));
7117285242Sachim      /* Store the current KEK index in agEvent.param */
7118285242Sachim      agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
7119285242Sachim
7120285242Sachim  }
7121285242Sachim
7122285242Sachim  else if ((flags & 0xFF) == KEK_MGMT_SUBOP_KEYCARDUPDATE)
7123285242Sachim  {
7124285242Sachim     agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE;
7125285242Sachim      agEvent.status = status;
7126285242Sachim      if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
7127285242Sachim      {
7128285242Sachim          agEvent.eq = errorQualifier;
7129285242Sachim      }
7130285242Sachim      agEvent.info = 0;
7131285242Sachim      /* Store the new KEK index in agEvent.handle */
7132285242Sachim      agEvent.handle = (void *) ((bitptr) (flags >> 24));
7133285242Sachim      /* Store the current KEK index in agEvent.param */
7134285242Sachim      agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
7135285242Sachim
7136285242Sachim  }
7137285242Sachim  /* get request from IOMap */
7138285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7139285242Sachim  if (agNULL == pRequest)
7140285242Sachim  {
7141285242Sachim    SA_DBG1(("mpiKekManagementRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7142285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2A");
7143285242Sachim    return AGSA_RC_FAILURE;
7144285242Sachim  }
7145285242Sachim
7146285242Sachim  agContext = saRoot->IOMap[tag].agContext;
7147285242Sachim  /* remove the request from IOMap */
7148285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
7149285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
7150285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
7151285242Sachim
7152285242Sachim  ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void *) &agEvent, agContext);
7153285242Sachim
7154285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7155285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
7156285242Sachim  pRequest->valid = agFALSE;
7157285242Sachim  /* return the request to free pool */
7158285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7159285242Sachim  {
7160285242Sachim    SA_DBG1(("mpiKekManagementRsp: saving pRequest (%p) for later use\n", pRequest));
7161285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7162285242Sachim  }
7163285242Sachim  else
7164285242Sachim  {
7165285242Sachim    /* return the request to free pool */
7166285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7167285242Sachim  }
7168285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7169285242Sachim
7170285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2A");
7171285242Sachim
7172285242Sachim  return AGSA_RC_SUCCESS;
7173285242Sachim}
7174285242Sachim
7175285242Sachim/******************************************************************************/
7176285242Sachim/*! \brief DEK Management Response
7177285242Sachim *
7178285242Sachim *  This routine handles the response of the DEK management message
7179285242Sachim *
7180285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
7181285242Sachim *  \param pIomb        Pointer of IOMB Mesage
7182285242Sachim *
7183285242Sachim *  \return sucess or fail
7184285242Sachim *
7185285242Sachim */
7186285242Sachim/*******************************************************************************/
7187285242SachimGLOBAL bit32 mpiDekManagementRsp(
7188285242Sachim  agsaRoot_t               *agRoot,
7189285242Sachim  agsaDekManagementRsp_t   *pIomb
7190285242Sachim  )
7191285242Sachim{
7192285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7193285242Sachim  agsaIORequestDesc_t *pRequest;
7194285242Sachim  agsaContext_t       *agContext;
7195285242Sachim  agsaHWEventEncrypt_t agEvent;
7196285242Sachim  bit32               flags, status, errorQualifier, tag, dekIndex;
7197285242Sachim
7198285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"2B");
7199285242Sachim
7200285242Sachim  SA_DBG1(("mpiDekManagementRsp: HTag=0x%x\n", pIomb->tag));
7201285242Sachim
7202285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, tag));
7203285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, status));
7204285242Sachim  OSSA_READ_LE_32(AGROOT, &flags, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, flags));
7205285242Sachim  OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, errorQualifier));
7206285242Sachim  OSSA_READ_LE_32(AGROOT, &dekIndex, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, dekIndex));
7207285242Sachim
7208285242Sachim  SA_DBG2(("mpiDekManagementRsp:tag =0x%x\n",tag ));
7209285242Sachim  SA_DBG2(("mpiDekManagementRsp:status =0x%x\n", status));
7210285242Sachim  SA_DBG2(("mpiDekManagementRsp:flags =0x%x\n",flags ));
7211285242Sachim  SA_DBG2(("mpiDekManagementRsp:errorQualifier =0x%x\n", errorQualifier));
7212285242Sachim  SA_DBG2(("mpiDekManagementRsp:dekIndex =0x%x\n",dekIndex ));
7213285242Sachim
7214285242Sachim  si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
7215285242Sachim  if ((flags & 0xFF) == DEK_MGMT_SUBOP_UPDATE)
7216285242Sachim  {
7217285242Sachim     agEvent.encryptOperation = OSSA_HW_ENCRYPT_DEK_UPDATE;
7218285242Sachim  }
7219285242Sachim  else
7220285242Sachim  {
7221285242Sachim     agEvent.encryptOperation = OSSA_HW_ENCRYPT_DEK_INVALIDTE;
7222285242Sachim  }
7223285242Sachim  agEvent.status = status;
7224285242Sachim  if (status == OSSA_MPI_ENC_ERR_ILLEGAL_DEK_PARAM || OSSA_MPI_ERR_DEK_MANAGEMENT_DEK_UNWRAP_FAIL)
7225285242Sachim  {
7226285242Sachim    agEvent.eq = errorQualifier;
7227285242Sachim  }
7228285242Sachim  /* Store the DEK in agEvent.info */
7229285242Sachim  agEvent.info = (flags >> 8) & 0xF;
7230285242Sachim  /* Store the KEK index in agEvent.handle */
7231285242Sachim  agEvent.handle = (void *) ((bitptr) (flags >> 24));
7232285242Sachim  /* Store the DEK index in agEvent.param */
7233285242Sachim  agEvent.param = (void *) (bitptr) dekIndex;
7234285242Sachim
7235285242Sachim  /* get request from IOMap */
7236285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7237285242Sachim  if (agNULL == pRequest)
7238285242Sachim  {
7239285242Sachim    SA_DBG1(("mpiDekManagementRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7240285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2B");
7241285242Sachim    return AGSA_RC_FAILURE;
7242285242Sachim  }
7243285242Sachim
7244285242Sachim  agContext = saRoot->IOMap[tag].agContext;
7245285242Sachim  /* remove the request from IOMap */
7246285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
7247285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
7248285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
7249285242Sachim
7250285242Sachim  ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void *) &agEvent,agContext );
7251285242Sachim
7252285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7253285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
7254285242Sachim  pRequest->valid = agFALSE;
7255285242Sachim  /* return the request to free pool */
7256285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7257285242Sachim  {
7258285242Sachim    SA_DBG1(("mpiDekManagementRsp: saving pRequest (%p) for later use\n", pRequest));
7259285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7260285242Sachim  }
7261285242Sachim  else
7262285242Sachim  {
7263285242Sachim    /* return the request to free pool */
7264285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7265285242Sachim  }
7266285242Sachim
7267285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7268285242Sachim
7269285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2B");
7270285242Sachim
7271285242Sachim  return AGSA_RC_SUCCESS;
7272285242Sachim}
7273285242Sachim
7274285242Sachim/******************************************************************************/
7275285242Sachim/*! \brief Operator Management Response
7276285242Sachim *
7277285242Sachim *  This routine handles the response of the Operator management message
7278285242Sachim *
7279285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
7280285242Sachim *  \param pIomb        Pointer of IOMB Mesage
7281285242Sachim *
7282285242Sachim *  \return sucess or fail
7283285242Sachim *
7284285242Sachim */
7285285242Sachim/*******************************************************************************/
7286285242SachimGLOBAL bit32 mpiOperatorManagementRsp(
7287285242Sachim  agsaRoot_t                *agRoot,
7288285242Sachim  agsaOperatorMangmenRsp_t  *pIomb
7289285242Sachim  )
7290285242Sachim{
7291285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7292285242Sachim  agsaIORequestDesc_t *pRequest;
7293285242Sachim  agsaContext_t       *agContext;
7294285242Sachim  agsaHWEventEncrypt_t agEvent;
7295285242Sachim  bit32               OPRIDX_AUTIDX_R_OMO,status, errorQualifier, tag;
7296285242Sachim
7297285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"36");
7298285242Sachim
7299285242Sachim  SA_DBG1(("mpiOperatorManagementRsp: HTag=0x%x\n", pIomb->tag));
7300285242Sachim
7301285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, tag));
7302285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, status));
7303285242Sachim  OSSA_READ_LE_32(AGROOT, &OPRIDX_AUTIDX_R_OMO, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, OPRIDX_AUTIDX_R_OMO));
7304285242Sachim  OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, errorQualifier));
7305285242Sachim
7306285242Sachim  SA_DBG2(("mpiOperatorManagementRsp:tag =0x%x\n",tag ));
7307285242Sachim  SA_DBG2(("mpiOperatorManagementRsp:status =0x%x\n", status));
7308285242Sachim  SA_DBG2(("mpiOperatorManagementRsp:OPRIDX_AUTIDX_R_OMO =0x%x\n",OPRIDX_AUTIDX_R_OMO ));
7309285242Sachim  SA_DBG2(("mpiOperatorManagementRsp:errorQualifier =0x%x\n", errorQualifier));
7310285242Sachim
7311285242Sachim  /* get request from IOMap */
7312285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7313285242Sachim  if (agNULL == pRequest)
7314285242Sachim  {
7315285242Sachim    SA_DBG1(("mpiOperatorManagementRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7316285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "36");
7317285242Sachim    return AGSA_RC_FAILURE;
7318285242Sachim  }
7319285242Sachim
7320285242Sachim  agContext = saRoot->IOMap[tag].agContext;
7321285242Sachim  /* remove the request from IOMap */
7322285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
7323285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
7324285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
7325285242Sachim
7326285242Sachim  si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
7327285242Sachim  agEvent.status = status;
7328285242Sachim  agEvent.info = OPRIDX_AUTIDX_R_OMO;
7329285242Sachim  agEvent.encryptOperation = OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT;
7330285242Sachim  if (status == OPR_MGMT_MPI_ENC_ERR_OPR_PARAM_ILLEGAL)
7331285242Sachim  {
7332285242Sachim    agEvent.eq = errorQualifier;
7333285242Sachim  }
7334285242Sachim
7335285242Sachim  ossaOperatorManagementCB(agRoot, agContext, status, errorQualifier);
7336285242Sachim
7337285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7338285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
7339285242Sachim  pRequest->valid = agFALSE;
7340285242Sachim  /* return the request to free pool */
7341285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7342285242Sachim  {
7343285242Sachim    SA_DBG1(("mpiOperatorManagementRsp: saving pRequest (%p) for later use\n", pRequest));
7344285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7345285242Sachim  }
7346285242Sachim  else
7347285242Sachim  {
7348285242Sachim    /* return the request to free pool */
7349285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7350285242Sachim  }
7351285242Sachim
7352285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7353285242Sachim
7354285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "36");
7355285242Sachim
7356285242Sachim  return AGSA_RC_SUCCESS;
7357285242Sachim}
7358285242Sachim
7359285242SachimGLOBAL bit32 mpiBistRsp(
7360285242Sachim  agsaRoot_t               *agRoot,
7361285242Sachim  agsaEncryptBistRsp_t     *pIomb
7362285242Sachim  )
7363285242Sachim{
7364285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7365285242Sachim  agsaIORequestDesc_t *pRequest;
7366285242Sachim  agsaContext_t       *agContext;
7367285242Sachim  agsaHWEventEncrypt_t agEvent;
7368285242Sachim  bit32               status;
7369285242Sachim  bit32               results[11];
7370285242Sachim  bit32               length;
7371285242Sachim  bit32               subop;
7372285242Sachim  bit32               tag;
7373285242Sachim
7374285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"37");
7375285242Sachim
7376285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, tag));
7377285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, status));
7378285242Sachim  OSSA_READ_LE_32(AGROOT, &subop, pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, subop));
7379285242Sachim  OSSA_READ_LE_32(AGROOT, &results[0], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[0]));
7380285242Sachim  OSSA_READ_LE_32(AGROOT, &results[1], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[1]));
7381285242Sachim  OSSA_READ_LE_32(AGROOT, &results[2], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[2]));
7382285242Sachim  OSSA_READ_LE_32(AGROOT, &results[3], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[3]));
7383285242Sachim  OSSA_READ_LE_32(AGROOT, &results[4], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[4]));
7384285242Sachim  OSSA_READ_LE_32(AGROOT, &results[5], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[5]));
7385285242Sachim  OSSA_READ_LE_32(AGROOT, &results[6], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[6]));
7386285242Sachim  OSSA_READ_LE_32(AGROOT, &results[7], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[7]));
7387285242Sachim  OSSA_READ_LE_32(AGROOT, &results[8], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[8]));
7388285242Sachim  OSSA_READ_LE_32(AGROOT, &results[9], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[9]));
7389285242Sachim  OSSA_READ_LE_32(AGROOT, &results[10], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[10]));
7390285242Sachim
7391285242Sachim  subop &= 0xFF;
7392285242Sachim  SA_DBG1(("mpiBistRsp: HTag=0x%x subops =0x%x status =0x%x\n",pIomb->tag, subop, status));
7393285242Sachim
7394285242Sachim  switch(subop)
7395285242Sachim  {
7396285242Sachim    case AGSA_BIST_TEST:
7397285242Sachim      length =  sizeof(agsaEncryptSelfTestStatusBitMap_t);
7398285242Sachim      break;
7399285242Sachim    case AGSA_SHA_TEST:
7400285242Sachim      length = sizeof(agsaEncryptSHATestResult_t);
7401285242Sachim      break;
7402285242Sachim    case AGSA_HMAC_TEST:
7403285242Sachim      length = sizeof(agsaEncryptHMACTestResult_t);
7404285242Sachim      break;
7405285242Sachim    default:
7406285242Sachim      length = 0;
7407285242Sachim      break;
7408285242Sachim  }
7409285242Sachim
7410285242Sachim  si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
7411285242Sachim  agEvent.status = status;
7412285242Sachim  agEvent.encryptOperation = OSSA_HW_ENCRYPT_TEST_EXECUTE;
7413285242Sachim  agEvent.info = length;
7414285242Sachim  agEvent.eq   = subop;
7415285242Sachim  agEvent.handle = agNULL;
7416285242Sachim  agEvent.param = &results;
7417285242Sachim
7418285242Sachim  /* get request from IOMap */
7419285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7420285242Sachim  if (agNULL == pRequest)
7421285242Sachim  {
7422285242Sachim    SA_DBG1(("mpiBistRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7423285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "37");
7424285242Sachim    return AGSA_RC_FAILURE;
7425285242Sachim  }
7426285242Sachim
7427285242Sachim  agContext = saRoot->IOMap[tag].agContext;
7428285242Sachim
7429285242Sachim  ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void*)&agEvent, agContext);
7430285242Sachim
7431285242Sachim  /* remove the request from IOMap */
7432285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
7433285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
7434285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
7435285242Sachim
7436285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7437285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
7438285242Sachim  pRequest->valid = agFALSE;
7439285242Sachim  /* return the request to free pool */
7440285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7441285242Sachim  {
7442285242Sachim    SA_DBG1(("mpiBistRsp: saving pRequest (%p) for later use\n", pRequest));
7443285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7444285242Sachim  }
7445285242Sachim  else
7446285242Sachim  {
7447285242Sachim    /* return the request to free pool */
7448285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7449285242Sachim  }
7450285242Sachim
7451285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7452285242Sachim
7453285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "37");
7454285242Sachim
7455285242Sachim  return AGSA_RC_SUCCESS;
7456285242Sachim}
7457285242Sachim
7458285242Sachim/******************************************************************************/
7459285242Sachim/*! \brief Set Operator Response
7460285242Sachim *
7461285242Sachim *  This routine handles the response of the Operator management message
7462285242Sachim *
7463285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
7464285242Sachim *  \param pIomb        Pointer of IOMB Mesage
7465285242Sachim *
7466285242Sachim *  \return sucess or fail
7467285242Sachim *
7468285242Sachim */
7469285242Sachim/*******************************************************************************/
7470285242SachimGLOBAL bit32 mpiSetOperatorRsp(
7471285242Sachim  agsaRoot_t               *agRoot,
7472285242Sachim  agsaSetOperatorRsp_t     *pIomb
7473285242Sachim  )
7474285242Sachim{
7475285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7476285242Sachim  agsaIORequestDesc_t *pRequest = agNULL;
7477285242Sachim  agsaContext_t       *agContext = agNULL;
7478285242Sachim  bit32               ERR_QLFR_OPRIDX_PIN_ACS, OPRIDX_PIN_ACS, status, errorQualifier, tag = 0;
7479285242Sachim
7480285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"38");
7481285242Sachim
7482285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetOperatorRsp_t, tag));
7483285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetOperatorRsp_t, status));
7484285242Sachim  OSSA_READ_LE_32(AGROOT, &ERR_QLFR_OPRIDX_PIN_ACS, pIomb, OSSA_OFFSET_OF(agsaSetOperatorRsp_t, ERR_QLFR_OPRIDX_PIN_ACS));
7485285242Sachim
7486285242Sachim  errorQualifier = ERR_QLFR_OPRIDX_PIN_ACS >> 16;
7487285242Sachim  OPRIDX_PIN_ACS = ERR_QLFR_OPRIDX_PIN_ACS & 0xFFFF;
7488285242Sachim
7489285242Sachim  SA_DBG1(("mpiSetOperatorRsp: HTag=0x%x ERR_QLFR=0x%x OPRIDX_PIN_ACS=0x%x \n",tag, errorQualifier, OPRIDX_PIN_ACS));
7490285242Sachim
7491285242Sachim  /* get request from IOMap */
7492285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7493285242Sachim  if (agNULL == pRequest)
7494285242Sachim  {
7495285242Sachim    SA_DBG1(("mpiSetOperatorRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7496285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "38");
7497285242Sachim    return AGSA_RC_FAILURE;
7498285242Sachim  }
7499285242Sachim
7500285242Sachim  agContext = saRoot->IOMap[tag].agContext;
7501285242Sachim  /* remove the request from IOMap */
7502285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
7503285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
7504285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
7505285242Sachim
7506285242Sachim
7507285242Sachim  ossaSetOperatorCB(agRoot,agContext,status,errorQualifier );
7508285242Sachim
7509285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7510285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
7511285242Sachim  pRequest->valid = agFALSE;
7512285242Sachim  /* return the request to free pool */
7513285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7514285242Sachim  {
7515285242Sachim    SA_DBG1(("mpiSetOperatorRsp: saving pRequest (%p) for later use\n", pRequest));
7516285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7517285242Sachim  }
7518285242Sachim  else
7519285242Sachim  {
7520285242Sachim    /* return the request to free pool */
7521285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7522285242Sachim  }
7523285242Sachim
7524285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7525285242Sachim
7526285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "38");
7527285242Sachim
7528285242Sachim  return AGSA_RC_SUCCESS;
7529285242Sachim}
7530285242Sachim
7531285242Sachim/******************************************************************************/
7532285242Sachim/*! \brief Get Operator Response
7533285242Sachim *
7534285242Sachim *  This routine handles the response of the Operator management message
7535285242Sachim *
7536285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
7537285242Sachim *  \param pIomb        Pointer of IOMB Mesage
7538285242Sachim *
7539285242Sachim *  \return sucess or fail
7540285242Sachim *
7541285242Sachim */
7542285242Sachim/*******************************************************************************/
7543285242SachimGLOBAL bit32 mpiGetOperatorRsp(
7544285242Sachim  agsaRoot_t               *agRoot,
7545285242Sachim  agsaGetOperatorRsp_t     *pIomb
7546285242Sachim  )
7547285242Sachim{
7548285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7549285242Sachim  agsaIORequestDesc_t *pRequest;
7550285242Sachim  agsaContext_t       *agContext;
7551285242Sachim  bit32                Num_Option, NumOperators ,status, tag;
7552285242Sachim  bit8                 option, Role = 0;
7553285242Sachim  bit32                IDstr[8];
7554285242Sachim  bit8                *tmpIDstr = agNULL;
7555285242Sachim  agsaID_t            *IDString = agNULL;
7556285242Sachim
7557285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3f");
7558285242Sachim
7559285242Sachim  si_memset(&IDstr, 0, sizeof(IDstr));
7560285242Sachim  OSSA_READ_LE_32(AGROOT, &tag,         pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, tag));
7561285242Sachim  OSSA_READ_LE_32(AGROOT, &status,      pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, status));
7562285242Sachim  OSSA_READ_LE_32(AGROOT, &Num_Option,  pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, Num_Option));
7563285242Sachim  OSSA_READ_LE_32(AGROOT, &IDstr[0],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[0]));
7564285242Sachim  OSSA_READ_LE_32(AGROOT, &IDstr[1],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[1]));
7565285242Sachim  OSSA_READ_LE_32(AGROOT, &IDstr[2],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[2]));
7566285242Sachim  OSSA_READ_LE_32(AGROOT, &IDstr[3],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[3]));
7567285242Sachim  OSSA_READ_LE_32(AGROOT, &IDstr[4],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[4]));
7568285242Sachim  OSSA_READ_LE_32(AGROOT, &IDstr[5],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[5]));
7569285242Sachim  OSSA_READ_LE_32(AGROOT, &IDstr[6],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[6]));
7570285242Sachim  OSSA_READ_LE_32(AGROOT, &IDstr[7],    pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[7]));
7571285242Sachim
7572285242Sachim  SA_DBG1(("mpiGetOperatorRsp:tag=0x%x status=0x%x Num_Option=0x%x IDString_Role=0x%x\n",
7573285242Sachim           tag, status, Num_Option, IDstr[0]));
7574285242Sachim
7575285242Sachim  /* get request from IOMap */
7576285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7577285242Sachim  if (agNULL == pRequest)
7578285242Sachim  {
7579285242Sachim    SA_DBG1(("mpiGetOperatorRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7580285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3f");
7581285242Sachim    return AGSA_RC_FAILURE;
7582285242Sachim  }
7583285242Sachim
7584285242Sachim  agContext = saRoot->IOMap[tag].agContext;
7585285242Sachim  /* remove the request from IOMap */
7586285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
7587285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
7588285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
7589285242Sachim  option = Num_Option & 0xFF;
7590285242Sachim  NumOperators = (Num_Option >> SHIFT8) & 0xFF;
7591285242Sachim  /* current operator's Role/ID, valid only if option == 1 */
7592285242Sachim  if ( option == 1)
7593285242Sachim  {
7594285242Sachim    /* extra the role value as parameter */
7595285242Sachim    Role = IDstr[0] & 0xFF;
7596285242Sachim    tmpIDstr = (bit8*)&IDstr[0];
7597285242Sachim    tmpIDstr++; /* skip role byte */
7598285242Sachim    IDString = (agsaID_t *)tmpIDstr;
7599285242Sachim    SA_DBG1(("mpiGetOperatorRsp: OSSA_IO_SUCCESS\n"));
7600285242Sachim    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[0], IDString->ID[1], IDString->ID[2], IDString->ID[3]));
7601285242Sachim    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[4], IDString->ID[5], IDString->ID[6], IDString->ID[7]));
7602285242Sachim    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[8], IDString->ID[9], IDString->ID[10],IDString->ID[11]));
7603285242Sachim    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[12],IDString->ID[13],IDString->ID[14],IDString->ID[15]));
7604285242Sachim    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[16],IDString->ID[17],IDString->ID[18],IDString->ID[19]));
7605285242Sachim    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[20],IDString->ID[21],IDString->ID[22],IDString->ID[23]));
7606285242Sachim    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[24],IDString->ID[25],IDString->ID[26],IDString->ID[27]));
7607285242Sachim    SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x\n",       IDString->ID[28],IDString->ID[29],IDString->ID[30]));
7608285242Sachim  }
7609285242Sachim
7610285242Sachim  SA_DBG1(("mpiGetOperatorRsp:status 0x%x option 0x%x Role 0x%x\n",status,option,Role ));
7611285242Sachim
7612285242Sachim  ossaGetOperatorCB(agRoot,agContext,status,option,NumOperators ,Role,IDString );
7613285242Sachim
7614285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7615285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
7616285242Sachim  pRequest->valid = agFALSE;
7617285242Sachim  /* return the request to free pool */
7618285242Sachim  if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7619285242Sachim  {
7620285242Sachim    SA_DBG1(("mpiGetOperatorRsp: saving pRequest (%p) for later use\n", pRequest));
7621285242Sachim    saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7622285242Sachim  }
7623285242Sachim  else
7624285242Sachim  {
7625285242Sachim    /* return the request to free pool */
7626285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7627285242Sachim  }
7628285242Sachim
7629285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7630285242Sachim
7631285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3f");
7632285242Sachim
7633285242Sachim  return AGSA_RC_SUCCESS;
7634285242Sachim}
7635285242Sachim
7636285242Sachim
7637285242SachimGLOBAL bit32 mpiGetVHistRsp(
7638285242Sachim   agsaRoot_t         *agRoot,
7639285242Sachim   agsaGetVHistCapRsp_t *pIomb
7640285242Sachim  )
7641285242Sachim{
7642285242Sachim
7643285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
7644285242Sachim  agsaLLRoot_t        *saRoot = agNULL;
7645285242Sachim  agsaIORequestDesc_t *pRequest;
7646285242Sachim  agsaContext_t       *agContext;
7647285242Sachim
7648285242Sachim  bit32    tag = 0;           /* 1 */
7649285242Sachim  bit32    status = 0;        /* 2 */
7650285242Sachim  bit32    channel;          /* 3 */
7651285242Sachim  bit32    BistLo;           /* 4 */
7652285242Sachim  bit32    BistHi;           /* 5 */
7653285242Sachim  bit32    BytesXfered = 0;  /* 6 */
7654285242Sachim  bit32    PciLo;            /* 7 */
7655285242Sachim  bit32    PciHi;            /* 8 */
7656285242Sachim  bit32    PciBytecount = 0;  /* 9 */
7657285242Sachim
7658285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3K");
7659285242Sachim
7660285242Sachim  /* sanity check */
7661285242Sachim  SA_ASSERT((agNULL != agRoot), "");
7662285242Sachim  saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
7663285242Sachim  SA_ASSERT((agNULL != saRoot), "");
7664285242Sachim
7665285242Sachim  if(smIS_SPC12V(agRoot))
7666285242Sachim  {
7667285242Sachim    OSSA_READ_LE_32(AGROOT, &tag,          pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,tag));
7668285242Sachim    OSSA_READ_LE_32(AGROOT, &status,       pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,status));
7669285242Sachim    OSSA_READ_LE_32(AGROOT, &channel,      pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,channel));
7670285242Sachim    OSSA_READ_LE_32(AGROOT, &BistLo,       pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,BistLo));
7671285242Sachim    OSSA_READ_LE_32(AGROOT, &BistHi,       pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,BistHi));
7672285242Sachim    OSSA_READ_LE_32(AGROOT, &BytesXfered,  pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,BytesXfered));
7673285242Sachim    OSSA_READ_LE_32(AGROOT, &PciLo,        pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,PciLo));
7674285242Sachim    OSSA_READ_LE_32(AGROOT, &PciHi,        pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,PciHi));
7675285242Sachim    OSSA_READ_LE_32(AGROOT, &PciBytecount, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,PciBytecount));
7676285242Sachim  }
7677285242Sachim  else
7678285242Sachim  {
7679285242Sachim    /* SPC does not support this command */
7680285242Sachim    SA_DBG1(("mpiGetVHistRsp: smIS_SPC12V only\n"));
7681285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3K");
7682285242Sachim    return AGSA_RC_FAILURE;
7683285242Sachim  }
7684285242Sachim
7685285242Sachim  SA_DBG3(("mpiGetVHistRsp: HTag=0x%x\n", tag));
7686285242Sachim
7687285242Sachim  /* get request from IOMap */
7688285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7689285242Sachim  if (agNULL == pRequest)
7690285242Sachim  {
7691285242Sachim    SA_DBG1(("mpiGetVHistRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7692285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3K");
7693285242Sachim    return AGSA_RC_FAILURE;
7694285242Sachim  }
7695285242Sachim
7696285242Sachim  agContext = saRoot->IOMap[tag].agContext;
7697285242Sachim
7698285242Sachim  /* remove the request from IOMap */
7699285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
7700285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
7701285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
7702285242Sachim
7703285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
7704285242Sachim
7705285242Sachim  /* check status success or failure */
7706285242Sachim  if (status)
7707285242Sachim  {
7708285242Sachim    SA_DBG1(("mpiGetVHistRsp: status is FAILED, status = %x\n", status ));
7709285242Sachim
7710285242Sachim    if (pRequest->completionCB == agNULL)
7711285242Sachim    {
7712285242Sachim      ossaVhistCaptureCB(agRoot, agContext, status, BytesXfered);
7713285242Sachim    }
7714285242Sachim    else
7715285242Sachim    {
7716285242Sachim      (*(ossaVhistCaptureCB_t)(pRequest->completionCB))(agRoot, agContext, status, BytesXfered);
7717285242Sachim    }
7718285242Sachim
7719285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7720285242Sachim    pRequest->valid = agFALSE;
7721285242Sachim    /* return the request to free pool */
7722285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7723285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7724285242Sachim
7725285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3K");
7726285242Sachim    return AGSA_RC_FAILURE;
7727285242Sachim  }
7728285242Sachim
7729285242Sachim  /* status is SUCCESS */
7730285242Sachim  SA_DBG1(("mpiGetVHistRsp: status is SUCCESS\n" ));
7731285242Sachim
7732285242Sachim  if (pRequest->completionCB == agNULL)
7733285242Sachim  {
7734285242Sachim    ossaVhistCaptureCB(agRoot, agContext, status, BytesXfered);
7735285242Sachim  }
7736285242Sachim  else
7737285242Sachim  {
7738285242Sachim    (*(ossaVhistCaptureCB_t)(pRequest->completionCB))(agRoot, agContext, status, BytesXfered);
7739285242Sachim  }
7740285242Sachim
7741285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7742285242Sachim  pRequest->valid = agFALSE;
7743285242Sachim  /* return the request to free pool */
7744285242Sachim  saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7745285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7746285242Sachim
7747285242Sachim  /* return value */
7748285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3K");
7749285242Sachim
7750285242Sachim  return ret;
7751285242Sachim}
7752285242Sachim
7753285242Sachim
7754285242Sachim
7755285242Sachim/******************************************************************************/
7756285242Sachim/*! \brief DifEncOffload Response
7757285242Sachim *
7758285242Sachim *  This routine handles the response of the DifEncOffload Response
7759285242Sachim *
7760285242Sachim *  \param agRoot       Handles for this instance of SAS/SATA LLL
7761285242Sachim *  \param pIomb        Pointer of IOMB Mesage
7762285242Sachim *
7763285242Sachim *  \return sucess or fail
7764285242Sachim *
7765285242Sachim */
7766285242Sachim/*******************************************************************************/
7767285242SachimGLOBAL bit32 mpiDifEncOffloadRsp(
7768285242Sachim  agsaRoot_t               *agRoot,
7769285242Sachim  agsaDifEncOffloadRspV_t  *pIomb
7770285242Sachim  )
7771285242Sachim{
7772285242Sachim
7773285242Sachim  bit32               ret = AGSA_RC_SUCCESS;
7774285242Sachim  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7775285242Sachim  agsaIORequestDesc_t *pRequest;
7776285242Sachim  agsaContext_t       *agContext;
7777285242Sachim  bit32               tag, status;
7778285242Sachim  agsaOffloadDifDetails_t details;
7779285242Sachim
7780285242Sachim  smTraceFuncEnter(hpDBG_VERY_LOUD,"3F");
7781285242Sachim
7782285242Sachim  OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, tag));
7783285242Sachim  OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, status));
7784285242Sachim  /* get TAG */
7785285242Sachim  SA_DBG3(("mpiDifEncOffloadRsp: HTag=0x%x\n", tag));
7786285242Sachim
7787285242Sachim  /* get request from IOMap */
7788285242Sachim  pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7789285242Sachim  if (agNULL == pRequest)
7790285242Sachim  {
7791285242Sachim    SA_DBG1(("mpiDifEncOffloadRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7792285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3F");
7793285242Sachim    return AGSA_RC_FAILURE;
7794285242Sachim  }
7795285242Sachim
7796285242Sachim  agContext = saRoot->IOMap[tag].agContext;
7797285242Sachim
7798285242Sachim  /* remove the request from IOMap */
7799285242Sachim  saRoot->IOMap[tag].Tag = MARK_OFF;
7800285242Sachim  saRoot->IOMap[tag].IORequest = agNULL;
7801285242Sachim  saRoot->IOMap[tag].agContext = agNULL;
7802285242Sachim
7803285242Sachim  SA_ASSERT((pRequest->valid), "pRequest->valid");
7804285242Sachim
7805285242Sachim  /* check status success or failure */
7806285242Sachim  if (status)
7807285242Sachim  {
7808285242Sachim    SA_DBG1(("mpiDifEncOffloadRsp: status is FAILED, status = %x\n", status ));
7809285242Sachim
7810285242Sachim    if (status == OSSA_IO_XFR_ERROR_DIF_MISMATCH || status == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH ||
7811285242Sachim        status == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH || status == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH)
7812285242Sachim    {
7813285242Sachim      si_memset(&details, 0, sizeof(agsaOffloadDifDetails_t));
7814285242Sachim      OSSA_READ_LE_32(AGROOT, &details.ExpectedCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ExpectedCRCUDT01));
7815285242Sachim      OSSA_READ_LE_32(AGROOT, &details.ExpectedUDT2345, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ExpectedUDT2345));
7816285242Sachim      OSSA_READ_LE_32(AGROOT, &details.ActualCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ActualCRCUDT01));
7817285242Sachim      OSSA_READ_LE_32(AGROOT, &details.ActualUDT2345, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ActualUDT2345));
7818285242Sachim      OSSA_READ_LE_32(AGROOT, &details.DIFErr, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, DIFErr));
7819285242Sachim      OSSA_READ_LE_32(AGROOT, &details.ErrBoffset, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ErrBoffset));
7820285242Sachim
7821285242Sachim      if (pRequest->completionCB == agNULL)
7822285242Sachim      {
7823285242Sachim        ossaDIFEncryptionOffloadStartCB(agRoot, agContext, status, &details);
7824285242Sachim      }
7825285242Sachim      else
7826285242Sachim      {
7827285242Sachim        (*(ossaDIFEncryptionOffloadStartCB_t)(pRequest->completionCB))(agRoot, agContext, status, &details);
7828285242Sachim      }
7829285242Sachim    }
7830285242Sachim    else
7831285242Sachim    {
7832285242Sachim      if (pRequest->completionCB == agNULL)
7833285242Sachim      {
7834285242Sachim        ossaDIFEncryptionOffloadStartCB(agRoot, agContext, status, agNULL);
7835285242Sachim      }
7836285242Sachim      else
7837285242Sachim      {
7838285242Sachim        (*(ossaDIFEncryptionOffloadStartCB_t)(pRequest->completionCB))(agRoot, agContext, status, agNULL);
7839285242Sachim      }
7840285242Sachim    }
7841285242Sachim
7842285242Sachim    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3F");
7843285242Sachim
7844285242Sachim    ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7845285242Sachim    pRequest->valid = agFALSE;
7846285242Sachim    /* return the request to free pool */
7847285242Sachim    saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7848285242Sachim    ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7849285242Sachim
7850285242Sachim    return AGSA_RC_FAILURE;
7851285242Sachim  }
7852285242Sachim
7853285242Sachim  /* status is SUCCESS */
7854285242Sachim  SA_DBG1(("mpiDifEncOffloadRsp: status is SUCCESS\n" ));
7855285242Sachim
7856285242Sachim  if (pRequest->completionCB == agNULL)
7857285242Sachim  {
7858285242Sachim    ossaDIFEncryptionOffloadStartCB(agRoot, agContext, status, agNULL);
7859285242Sachim  }
7860285242Sachim  else
7861285242Sachim  {
7862285242Sachim    (*(ossaDIFEncryptionOffloadStartCB_t)(pRequest->completionCB))(agRoot, agContext, status, agNULL);
7863285242Sachim  }
7864285242Sachim
7865285242Sachim  ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7866285242Sachim  pRequest->valid = agFALSE;
7867285242Sachim  /* return the request to free pool */
7868285242Sachim  saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7869285242Sachim  ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7870285242Sachim
7871285242Sachim  /* return value */
7872285242Sachim  smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3F");
7873285242Sachim
7874285242Sachim  return ret;
7875285242Sachim}
7876285242Sachim
7877