1 /*******************************************************************************
2 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
4 *Redistribution and use in source and binary forms, with or without modification, are permitted provided
5 *that the following conditions are met:
6 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
8 *2. Redistributions in binary form must reproduce the above copyright notice,
9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10 *with the distribution.
12 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
21 ********************************************************************************/
22 /*******************************************************************************/
24 * \brief The file implements the functions of MPI Outbound Response Message
27 /******************************************************************************/
28 #include <sys/cdefs.h>
29 __FBSDID("$FreeBSD$");
30 #include <dev/pms/config.h>
32 #include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
33 #ifdef SA_ENABLE_TRACE_FUNCTIONS
37 #define siTraceFileID 'J'
40 /******************************************************************************/
42 void saReturnRequestToFreePool(
44 agsaIORequestDesc_t *pRequest
47 /******************************************************************************/
48 /*! \brief Process Outbound IOMB Message
50 * Process Outbound IOMB from SPC
52 * \param agRoot Handles for this instance of SAS/SATA LL Layer
53 * \param pMsg1 Pointer of Response IOMB message 1
54 * \param category category of outbpond IOMB header
55 * \param opcode Opcode of Outbound IOMB header
56 * \param bc buffer count of IOMB header
58 * \return success or fail
61 /*******************************************************************************/
67 mpiMsgCategory_t category,
71 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
72 bit32 ret = AGSA_RC_SUCCESS;
73 bit32 parserStatus = AGSA_RC_SUCCESS;
75 smTraceFuncEnter(hpDBG_VERY_LOUD, "2f");
79 case OPC_OUB_COMBINED_SSP_COMP:
81 agsaSSPCoalescedCompletionRsp_t *pIomb = (agsaSSPCoalescedCompletionRsp_t *)pMsg1;
82 agsaIORequestDesc_t *pRequest = agNULL;
88 saRoot->LLCounters.IOCounter.numSSPCompleted++;
89 SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p %d\n",
90 pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
92 SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SSP_COMP Response received IOMB=%p\n", pMsg1));
95 for (count = 0; count < pIomb->coalescedCount; count++)
97 tag = pIomb->sspComplCxt[count].tag;
98 sspTag = pIomb->sspComplCxt[count].SSPTag;
99 pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
100 SA_ASSERT((pRequest), "pRequest");
102 if(pRequest == agNULL)
104 SA_DBG1(("mpiParseOBIomb,OPC_OUB_COMBINED_SSP_COMP Resp IOMB tag=0x%x, status=0x%x, param=0x%x, SSPTag=0x%x\n", tag, OSSA_IO_SUCCESS, 0, sspTag));
105 return(AGSA_RC_FAILURE);
107 SA_ASSERT((pRequest->valid), "pRequest->valid");
109 SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SSP_COMP IOMB tag=0x%x, status=0x%x, param=0x%x, SSPTag=0x%x\n", tag, OSSA_IO_SUCCESS, 0, sspTag));
111 /* Completion of SSP without Response Data */
112 siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, sspTag);
117 case OPC_OUB_SSP_COMP:
120 saRoot->LLCounters.IOCounter.numSSPCompleted++;
121 SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p %d\n",
122 pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
124 SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p\n", pMsg1));
126 /* process the SSP IO Completed response message */
127 mpiSSPCompletion(agRoot, pMsg1);
130 case OPC_OUB_COMBINED_SATA_COMP:
132 agsaSATACoalescedCompletionRsp_t *pIomb;
133 agsaIORequestDesc_t *pRequest;
138 saRoot->LLCounters.IOCounter.numSSPCompleted++;
139 SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP Response received IOMB=%p %d\n",
140 pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
142 SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP Response received IOMB=%p\n", pMsg1));
145 pIomb = (agsaSATACoalescedCompletionRsp_t *)pMsg1;
147 for (count = 0; count < pIomb->coalescedCount; count++)
149 tag = pIomb->stpComplCxt[count].tag;
150 pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
151 SA_ASSERT((pRequest), "pRequest");
153 if(pRequest == agNULL)
155 SA_DBG1(("mpiParseOBIomb,OPC_OUB_COMBINED_SATA_COMP Resp IOMB tag=0x%x, status=0x%x, param=0x%x\n", tag, OSSA_IO_SUCCESS, 0));
156 return(AGSA_RC_FAILURE);
158 SA_ASSERT((pRequest->valid), "pRequest->valid");
160 SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP IOMB tag=0x%x, status=0x%x, param=0x%x\n", tag, OSSA_IO_SUCCESS, 0));
162 /* Completion of SATA without Response Data */
163 siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, 0);
167 case OPC_OUB_SATA_COMP:
170 saRoot->LLCounters.IOCounter.numSataCompleted++;
171 SA_DBG3(("mpiParseOBIomb, SATA_COMP Response received IOMB=%p %d\n",
172 pMsg1, saRoot->LLCounters.IOCounter.numSataCompleted));
174 SA_DBG3(("mpiParseOBIomb, SATA_COMP Response received IOMB=%p\n", pMsg1));
176 /* process the response message */
177 mpiSATACompletion(agRoot, pMsg1);
180 case OPC_OUB_SSP_ABORT_RSP:
183 saRoot->LLCounters.IOCounter.numSSPAbortedCB++;
185 SA_DBG3(("mpiParseOBIomb, SSP_ABORT Response received IOMB=%p\n", pMsg1));
187 /* process the response message */
188 parserStatus = mpiSSPAbortRsp(agRoot, (agsaSSPAbortRsp_t *)pMsg1);
189 if(parserStatus != AGSA_RC_SUCCESS)
191 SA_DBG3(("mpiParseOBIomb, mpiSSPAbortRsp FAIL IOMB=%p\n", pMsg1));
196 case OPC_OUB_SATA_ABORT_RSP:
199 saRoot->LLCounters.IOCounter.numSataAbortedCB++;
201 SA_DBG3(("mpiParseOBIomb, SATA_ABORT Response received IOMB=%p\n", pMsg1));
203 /* process the response message */
204 mpiSATAAbortRsp(agRoot, (agsaSATAAbortRsp_t *)pMsg1);
207 case OPC_OUB_SATA_EVENT:
209 SA_DBG3(("mpiParseOBIomb, SATA_EVENT Response received IOMB=%p\n", pMsg1));
210 /* process the response message */
211 mpiSATAEvent(agRoot, (agsaSATAEventRsp_t *)pMsg1);
214 case OPC_OUB_SSP_EVENT:
216 SA_DBG3(("mpiParseOBIomb, SSP_EVENT Response received IOMB=%p\n", pMsg1));
217 /* process the response message */
218 mpiSSPEvent(agRoot, (agsaSSPEventRsp_t *)pMsg1);
221 case OPC_OUB_SMP_COMP:
224 saRoot->LLCounters.IOCounter.numSMPCompleted++;
225 SA_DBG3(("mpiParseOBIomb, SMP_COMP Response received IOMB=%p, %d\n",
226 pMsg1, saRoot->LLCounters.IOCounter.numSMPCompleted));
228 SA_DBG3(("mpiParseOBIomb, SMP_COMP Response received IOMB=%p\n", pMsg1));
230 /* process the response message */
231 mpiSMPCompletion(agRoot, (agsaSMPCompletionRsp_t *)pMsg1);
238 saRoot->LLCounters.IOCounter.numEchoCB++;
239 SA_DBG3(("mpiParseOBIomb, ECHO Response received %d\n", saRoot->LLCounters.IOCounter.numEchoCB));
241 SA_DBG3(("mpiParseOBIomb, ECHO Response received\n"));
243 /* process the response message */
244 mpiEchoRsp(agRoot, (agsaEchoRsp_t *)pMsg1);
248 case OPC_OUB_GET_NVMD_DATA:
250 SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_NVMD_DATA received IOMB=%p\n", pMsg1));
251 /* process the response message */
252 mpiGetNVMDataRsp(agRoot, (agsaGetNVMDataRsp_t *)pMsg1);
255 case OPC_OUB_SPC_HW_EVENT:
257 SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
258 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SPC_HW_EVENT Response received IOMB=%p\n", pMsg1));
259 /* process the response message */
260 mpiHWevent(agRoot, (agsaHWEvent_SPC_OUB_t *)pMsg1);
263 case OPC_OUB_HW_EVENT:
265 SA_DBG3(("mpiParseOBIomb, HW_EVENT Response received IOMB=%p\n", pMsg1));
266 /* process the response message */
267 mpiHWevent(agRoot, (agsaHWEvent_SPC_OUB_t *)pMsg1);
270 case OPC_OUB_PHY_START_RESPONSE:
272 SA_DBG1(("mpiParseOBIomb, OPC_OUB_PHY_START_RESPONSE Response received IOMB=%p\n", pMsg1));
273 /* process the response message */
274 mpiPhyStartEvent( agRoot, (agsaHWEvent_Phy_OUB_t *)pMsg1 );
278 case OPC_OUB_PHY_STOP_RESPONSE:
280 SA_DBG1(("mpiParseOBIomb, OPC_OUB_PHY_STOP_RESPONSE Response received IOMB=%p\n", pMsg1));
281 /* process the response message */
282 mpiPhyStopEvent( agRoot, (agsaHWEvent_Phy_OUB_t *)pMsg1 );
286 case OPC_OUB_LOCAL_PHY_CNTRL:
288 SA_DBG3(("mpiParseOBIomb, PHY CONTROL Response received IOMB=%p\n", pMsg1));
289 /* process the response message */
290 mpiPhyCntrlRsp(agRoot, (agsaLocalPhyCntrlRsp_t *)pMsg1);
293 case OPC_OUB_SPC_DEV_REGIST:
295 SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
296 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SPC_DEV_REGIST Response received IOMB=%p\n", pMsg1));
297 /* process the response message */
298 mpiDeviceRegRsp(agRoot, (agsaDeviceRegistrationRsp_t *)pMsg1);
301 case OPC_OUB_DEV_REGIST:
303 SA_DBG2(("mpiParseOBIomb, DEV_REGISTRATION Response received IOMB=%p\n", pMsg1));
304 /* process the response message */
305 mpiDeviceRegRsp(agRoot, (agsaDeviceRegistrationRsp_t *)pMsg1);
308 case OPC_OUB_DEREG_DEV:
310 SA_DBG3(("mpiParseOBIomb, DEREGISTRATION DEVICE Response received IOMB=%p\n", pMsg1));
311 /* process the response message */
312 mpiDeregDevHandleRsp(agRoot, (agsaDeregDevHandleRsp_t *)pMsg1);
316 case OPC_OUB_GET_DEV_HANDLE:
318 SA_DBG3(("mpiParseOBIomb, GET_DEV_HANDLE Response received IOMB=%p\n", pMsg1));
319 /* process the response message */
320 mpiGetDevHandleRsp(agRoot, (agsaGetDevHandleRsp_t *)pMsg1);
324 case OPC_OUB_SPC_DEV_HANDLE_ARRIV:
326 SA_DBG3(("mpiParseOBIomb, SPC_DEV_HANDLE_ARRIV Response received IOMB=%p\n", pMsg1));
327 /* process the response message */
328 mpiDeviceHandleArrived(agRoot, (agsaDeviceHandleArrivedNotify_t *)pMsg1);
331 case OPC_OUB_DEV_HANDLE_ARRIV:
333 SA_DBG3(("mpiParseOBIomb, DEV_HANDLE_ARRIV Response received IOMB=%p\n", pMsg1));
334 /* process the response message */
335 mpiDeviceHandleArrived(agRoot, (agsaDeviceHandleArrivedNotify_t *)pMsg1);
339 case OPC_OUB_THERM_HW_EVENT:
341 SA_DBG3(("mpiParseOBIomb, THERM_HW_EVENT Response received IOMB=%p\n", pMsg1));
342 ossaLogThermalEvent(agRoot, (agsaThermal_Hw_Event_Notify_t *)pMsg1);
346 case OPC_OUB_SSP_RECV_EVENT:
348 SA_DBG3(("mpiParseOBIomb, SSP_RECV_EVENT Response received IOMB=%p\n", pMsg1));
349 /* process the response message */
350 mpiSSPReqReceivedNotify(agRoot, (agsaSSPReqReceivedNotify_t *)pMsg1);
353 case OPC_OUB_DEV_INFO:
355 SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
356 SA_DBG3(("mpiParseOBIomb, DEV_INFO Response received IOMB=%p\n", pMsg1));
357 /* process the response message */
358 mpiGetDevInfoRsp(agRoot, (agsaGetDevInfoRspV_t *)pMsg1);
362 case OPC_OUB_GET_PHY_PROFILE_RSP:
364 SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
365 SA_DBG2(("mpiParseOBIomb, OPC_OUB_GET_PHY_PROFILE_RSP Response received IOMB=%p\n", pMsg1));
366 /* process the response message */
367 mpiGetPhyProfileRsp(agRoot, (agsaGetPhyProfileRspV_t *)pMsg1);
370 case OPC_OUB_SET_PHY_PROFILE_RSP:
372 SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
373 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_PHY_PROFILE_RSP Response received IOMB=%p\n", pMsg1));
374 /* process the response message */
375 mpiSetPhyProfileRsp(agRoot, (agsaSetPhyProfileRspV_t *)pMsg1);
379 case OPC_OUB_SPC_DEV_INFO:
381 SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
382 SA_DBG3(("mpiParseOBIomb, DEV_INFO Response received IOMB=%p\n", pMsg1));
383 /* process the response message */
384 mpiGetDevInfoRspSpc(agRoot, (agsaGetDevInfoRsp_t *)pMsg1);
387 case OPC_OUB_FW_FLASH_UPDATE:
389 SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_FLASH_UPDATE Response received IOMB=%p\n", pMsg1));
390 /* process the response message */
391 mpiFwFlashUpdateRsp(agRoot, (agsaFwFlashUpdateRsp_t *)pMsg1);
394 case OPC_OUB_FLASH_OP_EXT_RSP:
396 SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_FLASH_UPDATE Response received IOMB=%p\n", pMsg1));
397 /* process the response message */
398 mpiFwExtFlashUpdateRsp(agRoot, (agsaFwFlashOpExtRsp_t *)pMsg1);
402 #ifdef SPC_ENABLE_PROFILE
403 case OPC_OUB_FW_PROFILE:
405 SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_PROFILE Response received IOMB=%p\n", pMsg1));
406 /* process the response message */
407 mpiFwProfileRsp(agRoot, (agsaFwProfileRsp_t *)pMsg1);
411 case OPC_OUB_SET_NVMD_DATA:
413 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_NVMD_DATA received IOMB=%p\n", pMsg1));
414 /* process the response message */
415 mpiSetNVMDataRsp(agRoot, (agsaSetNVMDataRsp_t *)pMsg1);
419 case OPC_OUB_GPIO_RESPONSE:
421 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
422 /* process the response message */
423 mpiGPIORsp(agRoot, (agsaGPIORsp_t *)pMsg1);
426 case OPC_OUB_GPIO_EVENT:
428 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
429 /* process the response message */
430 mpiGPIOEventRsp(agRoot, (agsaGPIOEvent_t *)pMsg1);
434 case OPC_OUB_GENERAL_EVENT:
436 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GENERAL_EVENT Response received IOMB=%p\n", pMsg1));
437 /* process the response message */
438 mpiGeneralEventRsp(agRoot, (agsaGeneralEventRsp_t *)pMsg1);
442 case OPC_OUB_SAS_DIAG_MODE_START_END:
444 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_DIAG_MODE_START_END Response received IOMB=%p\n", pMsg1));
445 /* process the response message */
446 mpiSASDiagStartEndRsp(agRoot, (agsaSASDiagStartEndRsp_t *)pMsg1);
449 case OPC_OUB_SAS_DIAG_EXECUTE:
451 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_DIAG_EXECUTE_RSP Response received IOMB=%p\n", pMsg1));
452 /* process the response message */
453 mpiSASDiagExecuteRsp(agRoot, (agsaSASDiagExecuteRsp_t *)pMsg1);
457 case OPC_OUB_GET_TIME_STAMP:
459 SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_TIME_STAMP Response received IOMB=%p\n", pMsg1));
460 /* process the response message */
461 mpiGetTimeStampRsp(agRoot, (agsaGetTimeStampRsp_t *)pMsg1);
465 case OPC_OUB_SPC_SAS_HW_EVENT_ACK:
467 SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
468 SA_DBG3(("mpiParseOBIomb,OPC_OUB_SPC_SAS_HW_EVENT_ACK Response received IOMB=%p\n", pMsg1));
469 /* process the response message */
470 mpiSASHwEventAckRsp(agRoot, (agsaSASHwEventAckRsp_t *)pMsg1);
474 case OPC_OUB_SAS_HW_EVENT_ACK:
476 SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
477 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_HW_EVENT_ACK Response received IOMB=%p\n", pMsg1));
478 /* process the response message */
479 mpiSASHwEventAckRsp(agRoot, (agsaSASHwEventAckRsp_t *)pMsg1);
482 case OPC_OUB_PORT_CONTROL:
484 SA_DBG3(("mpiParseOBIomb, OPC_OUB_PORT_CONTROL Response received IOMB=%p\n", pMsg1));
485 /* process the response message */
486 mpiPortControlRsp(agRoot, (agsaPortControlRsp_t *)pMsg1);
489 case OPC_OUB_SMP_ABORT_RSP:
492 saRoot->LLCounters.IOCounter.numSMPAbortedCB++;
493 SA_DBG3(("mpiParseOBIomb, SMP_ABORT Response received IOMB=%p, %d\n",
494 pMsg1, saRoot->LLCounters.IOCounter.numSMPAbortedCB));
496 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SMP_ABORT_RSP Response received IOMB=%p\n", pMsg1));
498 /* process the response message */
499 mpiSMPAbortRsp(agRoot, (agsaSMPAbortRsp_t *)pMsg1);
502 case OPC_OUB_DEVICE_HANDLE_REMOVAL:
504 SA_DBG3(("mpiParseOBIomb, OPC_OUB_DEVICE_HANDLE_REMOVAL received IOMB=%p\n", pMsg1));
505 /* process the response message */
506 mpiDeviceHandleRemoval(agRoot, (agsaDeviceHandleRemoval_t *)pMsg1);
509 case OPC_OUB_SET_DEVICE_STATE:
511 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_DEVICE_STATE received IOMB=%p\n", pMsg1));
512 /* process the response message */
513 mpiSetDeviceStateRsp(agRoot, (agsaSetDeviceStateRsp_t *)pMsg1);
518 case OPC_OUB_GET_DEVICE_STATE:
520 SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_DEVICE_STATE received IOMB=%p\n", pMsg1));
521 /* process the response message */
522 mpiGetDeviceStateRsp(agRoot, (agsaGetDeviceStateRsp_t *)pMsg1);
527 case OPC_OUB_SET_DEV_INFO:
529 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_DEV_INFO received IOMB=%p\n", pMsg1));
530 /* process the response message */
531 mpiSetDevInfoRsp(agRoot, (agsaSetDeviceInfoRsp_t *)pMsg1);
536 case OPC_OUB_SAS_RE_INITIALIZE:
538 SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
539 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_RE_INITIALIZE received IOMB=%p\n", pMsg1));
540 /* process the response message */
541 mpiSasReInitializeRsp(agRoot, (agsaSasReInitializeRsp_t *)pMsg1);
546 case OPC_OUB_SGPIO_RESPONSE:
548 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SGPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
549 /* process the response message */
550 mpiSGpioRsp(agRoot, (agsaSGpioRsp_t *)pMsg1);
555 case OPC_OUB_PCIE_DIAG_EXECUTE:
557 SA_DBG3(("mpiParseOBIomb, OPC_OUB_PCIE_DIAG_EXECUTE Response received IOMB=%p\n", pMsg1));
558 /* process the response message */
559 mpiPCIeDiagExecuteRsp(agRoot, (agsaPCIeDiagExecuteRsp_t *)pMsg1);
562 case 2104: //delray start
564 if(smIS_SPC6V(agRoot))
566 SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_DFE_DATA_RSP Response received IOMB=%p\n", pMsg1));
567 /* process the response message */
568 mpiGetDFEDataRsp(agRoot, (agsaGetDDEFDataRsp_t *)pMsg1);
570 if(smIS_SPC12V(agRoot))
572 SA_DBG3(("mpiParseOBIomb, OPC_INB_GET_VIST_CAP Response received IOMB=%p\n", pMsg1));
573 mpiGetVisRsp(agRoot, (agsaGetVisCapRsp_t *)pMsg1);
577 SA_DBG1(("mpiParseOBIomb, 2104 Response received IOMB=%p\n", pMsg1));
582 case OPC_OUB_SET_CONTROLLER_CONFIG:
584 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_CONTROLLER_CONFIG Response received IOMB=%p\n", pMsg1));
585 mpiSetControllerConfigRsp(agRoot, (agsaSetControllerConfigRsp_t *)pMsg1);
589 case OPC_OUB_GET_CONTROLLER_CONFIG:
591 SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_CONTROLLER_CONFIG Response received IOMB=%p\n", pMsg1));
592 mpiGetControllerConfigRsp(agRoot, (agsaGetControllerConfigRsp_t *)pMsg1);
595 case OPC_OUB_KEK_MANAGEMENT:
597 SA_DBG3(("mpiParseOBIomb, OPC_OUB_KEK_MANAGEMENT Response received IOMB=%p\n", pMsg1));
598 mpiKekManagementRsp(agRoot, (agsaKekManagementRsp_t *)pMsg1);
603 case OPC_OUB_DEK_MANAGEMENT:
605 SA_DBG3(("mpiParseOBIomb, OPC_OUB_DEK_MANAGEMENT Response received IOMB=%p\n", pMsg1));
606 mpiDekManagementRsp(agRoot, (agsaDekManagementRsp_t *)pMsg1);
611 case OPC_OUB_OPR_MGMT:
613 SA_DBG1(("mpiParseOBIomb, OPC_OUB_OPR_MGMT Response received IOMB=%p\n", pMsg1));
614 mpiOperatorManagementRsp(agRoot, (agsaOperatorMangmenRsp_t *)pMsg1);
617 case OPC_OUB_ENC_TEST_EXECUTE:
619 SA_DBG1(("mpiParseOBIomb, OPC_OUB_ENC_TEST_EXECUTE Response received IOMB=%p\n", pMsg1));
620 mpiBistRsp(agRoot, (agsaEncryptBistRsp_t *)pMsg1);
624 case OPC_OUB_SET_OPERATOR:
626 SA_DBG1(("mpiParseOBIomb, OPC_OUB_SET_OPERATOR Response received IOMB=%p\n", pMsg1));
627 mpiSetOperatorRsp(agRoot, (agsaSetOperatorRsp_t *)pMsg1);
630 case OPC_OUB_GET_OPERATOR:
632 SA_DBG1(("mpiParseOBIomb, OPC_OUB_GET_OPERATOR Response received IOMB=%p\n", pMsg1));
633 mpiGetOperatorRsp(agRoot, (agsaGetOperatorRsp_t *)pMsg1);
636 case OPC_OUB_DIF_ENC_OFFLOAD_RSP://delray start
638 SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
639 SA_DBG1(("mpiParseOBIomb, OPC_OUB_DIF_ENC_OFFLOAD_RSP Response received IOMB=%p\n", pMsg1));
640 mpiDifEncOffloadRsp(agRoot, (agsaDifEncOffloadRspV_t *)pMsg1);
646 saRoot->LLCounters.IOCounter.numUNKNWRespIOMB++;
647 SA_DBG1(("mpiParseOBIomb, UnKnown Response received IOMB=%p, %d\n",
648 pMsg1, saRoot->LLCounters.IOCounter.numUNKNWRespIOMB));
650 SA_DBG1(("mpiParseOBIomb, Unknown IOMB Response received opcode 0x%X IOMB=%p\n",opcode, pMsg1));
656 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2f");
666 /******************************************************************************/
667 /*! \brief ECHO Response
669 * This routine handles the response of ECHO Command
671 * \param agRoot Handles for this instance of SAS/SATA LLL
672 * \param pIomb Pointer of IOMB Mesage
674 * \return sucess or fail
677 /*******************************************************************************/
678 GLOBAL bit32 mpiEchoRsp(
683 bit32 ret = AGSA_RC_SUCCESS;
684 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
685 agsaIORequestDesc_t *pRequest;
686 agsaContext_t *agContext;
689 smTraceFuncEnter(hpDBG_VERY_LOUD, "2g");
691 SA_DBG3(("mpiEchoRsp: HTAG=0x%x\n", pIomb->tag));
693 /* get request from IOMap */
694 OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaEchoRsp_t, tag));
696 pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
697 if (agNULL == pRequest)
699 SA_DBG1(("mpiEchoRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x\n", tag));
700 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2g");
701 return AGSA_RC_FAILURE;
704 agContext = saRoot->IOMap[tag].agContext;
706 ossaEchoCB(agRoot, agContext, (void *)&pIomb->payload[0]);
708 /* remove the request from IOMap */
709 saRoot->IOMap[tag].Tag = MARK_OFF;
710 saRoot->IOMap[tag].IORequest = agNULL;
711 saRoot->IOMap[tag].agContext = agNULL;
713 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
714 SA_ASSERT((pRequest->valid), "pRequest->valid");
715 pRequest->valid = agFALSE;
716 /* return the request to free pool */
717 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
719 SA_DBG1(("mpiEchoRsp: saving pRequest (%p) for later use\n", pRequest));
720 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
724 /* return the request to free pool */
725 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
727 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
730 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2g");
734 /******************************************************************************/
735 /*! \brief Get NVM Data Response
737 * This routine handles the response of GET NVM Data Response
739 * \param agRoot Handles for this instance of SAS/SATA LLL
740 * \param pIomb Pointer of IOMB Mesage
742 * \return sucess or fail
745 /*******************************************************************************/
746 GLOBAL bit32 mpiGetNVMDataRsp(
748 agsaGetNVMDataRsp_t *pIomb
751 bit32 ret = AGSA_RC_SUCCESS;
752 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
753 agsaIORequestDesc_t *pRequest;
754 agsaContext_t *agContext;
756 bit32 DlenStatus, tag, iRTdaBnDpsAsNvm;
758 smTraceFuncEnter(hpDBG_VERY_LOUD, "2h");
760 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, tag));
761 OSSA_READ_LE_32(AGROOT, &DlenStatus, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, DlenStatus));
762 OSSA_READ_LE_32(AGROOT, &iRTdaBnDpsAsNvm, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, iRTdaBnDpsAsNvm));
763 OSSA_READ_LE_32(AGROOT, &dataLen, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, NVMData[10])) ;
765 SA_DBG1(("mpiGetNVMDataRsp: HTAG=0x%x\n", tag));
767 /* get request from IOMap */
768 pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
769 if (agNULL == pRequest)
771 SA_DBG1(("mpiGetNVMDataRsp: Bad Response IOMB!!! pRequest is NULL.\n"));
772 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2h");
773 return AGSA_RC_FAILURE;
776 agContext = saRoot->IOMap[tag].agContext;
778 if (iRTdaBnDpsAsNvm & IRMode)
780 /* indirect mode - IR bit set */
781 SA_DBG1(("mpiGetNVMDataRsp: OSSA_SUCCESS, IR=1, DataLen=%d\n", dataLen));
782 if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_CONFIG_SEEPROM) ||
783 ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_VPD_FLASH) ||
784 ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_TWI_DEVICES) ||
785 ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_EXPANSION_ROM) ||
786 ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_IOP_REG_FLASH))
789 //#ifdef UN_USED_FUNC
790 ossaGetNVMDResponseCB(agRoot, agContext, (DlenStatus & NVMD_STAT), INDIRECT_MODE, dataLen, agNULL);
793 else if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AAP1_RDUMP) ||
794 ((iRTdaBnDpsAsNvm & NVMD_TYPE) == IOP_RDUMP))
797 if ((DlenStatus & NVMD_STAT) == 0)
799 /* CB for Register Dump */
801 ossaGetRegisterDumpCB(agRoot, agContext, OSSA_SUCCESS);
805 /* CB for Register Dump */
806 ossaGetRegisterDumpCB(agRoot, agContext, OSSA_FAILURE);
812 /* Should not be happened */
813 SA_DBG1(("mpiGetNVMDataRsp: (IR=1)Wrong Device type 0x%x\n", iRTdaBnDpsAsNvm));
816 else /* direct mode */
818 SA_DBG1(("mpiGetNVMDataRsp: OSSA_SUCCESS, IR=0, DataLen=%d\n", ((DlenStatus & NVMD_LEN) >> SHIFT24)));
819 for (i = 0; i < (((DlenStatus & NVMD_LEN) >> SHIFT24)/4); i++)
821 SA_DBG1(("mpiGetNVMDataRsp: OSSA_SUCCESS, NVMDATA=0x%x\n", pIomb->NVMData[i]));
823 if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_CONFIG_SEEPROM) ||
824 ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_VPD_FLASH) ||
825 ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_TWI_DEVICES))
828 // char * safe_type_pun = (char *)(&pIomb->NVMData[0]);
830 ossaGetNVMDResponseCB(agRoot, agContext, (DlenStatus & NVMD_STAT), DIRECT_MODE,
831 ((DlenStatus & NVMD_LEN) >> SHIFT24), (agsaFrameHandle_t *)safe_type_pun);
834 else if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AAP1_RDUMP) ||
835 ((iRTdaBnDpsAsNvm & NVMD_TYPE) == IOP_RDUMP))
839 if ((DlenStatus & NVMD_STAT) == 0)
841 /* CB for Register Dump */
842 ossaGetRegisterDumpCB(agRoot, agContext, OSSA_SUCCESS);
846 /* CB for Register Dump */
847 ossaGetRegisterDumpCB(agRoot, agContext, OSSA_FAILURE);
853 /* Should not be happened */
854 SA_DBG1(("mpiGetNVMDataRsp: (IR=0)Wrong Device type 0x%x\n", iRTdaBnDpsAsNvm));
858 /* remove the request from IOMap */
859 saRoot->IOMap[tag].Tag = MARK_OFF;
860 saRoot->IOMap[tag].IORequest = agNULL;
861 saRoot->IOMap[tag].agContext = agNULL;
863 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
864 SA_ASSERT((pRequest->valid), "pRequest->valid");
865 pRequest->valid = agFALSE;
866 /* return the request to free pool */
867 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
869 SA_DBG1(("mpiGetNVMDataRsp: saving pRequest (%p) for later use\n", pRequest));
870 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
874 /* return the request to free pool */
875 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
877 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
879 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2h");
885 /******************************************************************************/
886 /*! \brief Phy Event Response from SPCv
888 * Process Phy Event from SPC
890 * \param agRoot Handles for this instance of SAS/SATA LL Layer
891 * \param pIomb pointer of IOMB
893 * \return success or fail
896 /*******************************************************************************/
898 GLOBAL bit32 mpiPhyStartEvent(
900 agsaHWEvent_Phy_OUB_t *pIomb
903 bit32 ret = AGSA_RC_SUCCESS;
904 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
910 agsaIORequestDesc_t *pRequest;
911 agsaContext_t *agContext;
916 SA_DBG1(("mpiPhyStartEvent: saRoot == agNULL\n"));
917 return(AGSA_RC_FAILURE);
919 smTraceFuncEnter(hpDBG_VERY_LOUD, "2H");
921 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t, tag)) ;
923 /* get request from IOMap */
924 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
925 agContext = saRoot->IOMap[tag].agContext;
926 /* remove the request from IOMap */
927 saRoot->IOMap[tag].Tag = MARK_OFF;
928 saRoot->IOMap[tag].IORequest = agNULL;
929 saRoot->IOMap[tag].agContext = agNULL;
930 if (agNULL == pRequest)
932 SA_DBG1(("mpiPhyStartEvent: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x \n", tag));
933 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2H");
934 return AGSA_RC_FAILURE;
937 SA_DBG1(("mpiPhyStartEvent: Status 0x%X PhyId 0x%X\n",pIomb->Status,pIomb->ReservedPhyId));
939 OSSA_READ_LE_32(AGROOT, &IOMBStatus, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,Status ));
940 OSSA_READ_LE_32(AGROOT, &phyId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,ReservedPhyId ));
944 case OSSA_MPI_IO_SUCCESS: /* PhyStart operation completed successfully */
946 saRoot->phys[phyId].linkstatus = 1;
947 SA_DBG1(("mpiPhyStartEvent:MPI_IO_SUCCESS IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
948 /* Callback with PHY_UP */
950 case OSSA_MPI_ERR_INVALID_PHY_ID: /* identifier specified in the PHY_START command is invalid i.e out of supported range for this product. */
952 saRoot->phys[phyId].linkstatus = 0;
953 SA_DBG1(("mpiPhyStartEvent: MPI_ERR_INVALID_PHY_ID IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
954 ret = AGSA_RC_FAILURE;
956 case OSSA_MPI_ERR_PHY_ALREADY_STARTED:
958 saRoot->phys[phyId].linkstatus = 1;
959 SA_DBG1(("mpiPhyStartEvent: MPI_ERR_PHY_ALREADY_STARTED IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
960 ret = AGSA_RC_FAILURE;
962 case OSSA_MPI_ERR_INVALID_ANALOG_TBL_IDX:
964 saRoot->phys[phyId].linkstatus = 0;
965 SA_DBG1(("mpiPhyStartEvent: MPI_ERR_INVALID_ANALOG_TBL_IDX IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
966 ret = AGSA_RC_FAILURE;
970 saRoot->phys[phyId].linkstatus = 0;
971 SA_DBG1(("mpiPhyStartEvent: Unknown IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
972 ret = AGSA_RC_FAILURE;
976 ossaHwCB(agRoot,agNULL, OSSA_HW_EVENT_PHY_START_STATUS ,((HwCBStatus << SHIFT8) | phyId) ,agContext, agNULL);
978 /* return the request to free pool */
979 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
980 SA_ASSERT((pRequest->valid), "pRequest->valid");
981 pRequest->valid = agFALSE;
982 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
984 SA_DBG1(("mpiPhyStartEvent: saving pRequest (%p) for later use\n", pRequest));
985 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
989 /* return the request to free pool */
990 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
992 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
998 GLOBAL bit32 mpiPhyStopEvent(
1000 agsaHWEvent_Phy_OUB_t *pIomb
1003 bit32 ret = AGSA_RC_SUCCESS;
1004 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
1012 agsaIORequestDesc_t *pRequest;
1013 agsaContext_t *agContext;
1019 if(saRoot == agNULL)
1021 SA_DBG1(("mpiPhyStopEvent: saRoot == agNULL\n"));
1022 return(AGSA_RC_FAILURE);
1024 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t, tag)) ;
1026 /* get request from IOMap */
1027 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
1028 agContext = saRoot->IOMap[tag].agContext;
1029 /* remove the request from IOMap */
1030 saRoot->IOMap[tag].Tag = MARK_OFF;
1031 saRoot->IOMap[tag].IORequest = agNULL;
1032 saRoot->IOMap[tag].agContext = agNULL;
1033 if (agNULL == pRequest)
1035 SA_DBG1(("mpiPhyStopEvent: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x \n", tag));
1036 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2H");
1037 return AGSA_RC_FAILURE;
1040 OSSA_READ_LE_32(AGROOT, &IOMBStatus, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,Status ));
1041 OSSA_READ_LE_32(AGROOT, &phyId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,ReservedPhyId ));
1042 SA_DBG1(("mpiPhyStopEvent: Status %08X PhyId %08X\n",IOMBStatus,phyId));
1044 if(smIS_SPCV(agRoot))
1046 phyId &= 0xff; // SPCv PHY_ID is one byte wide
1049 saRoot->phys[phyId].linkstatus = 0;
1053 case OSSA_MPI_IO_SUCCESS: /* PhyStart operation completed successfully */
1054 SA_DBG1(("mpiPhyStopEvent:MPI_IO_SUCCESS 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1056 /* Callback with PHY_DOWN */
1058 case OSSA_MPI_ERR_INVALID_PHY_ID: /* identifier specified in the PHY_START command is invalid i.e out of supported range for this product. */
1059 SA_DBG1(("mpiPhyStopEvent: MPI_ERR_INVALID_PHY_ID 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1062 case OSSA_MPI_ERR_PHY_NOT_STARTED: /* An attempt to stop a phy which is not started */
1064 SA_DBG1(("mpiPhyStopEvent: 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1067 case OSSA_MPI_ERR_DEVICES_ATTACHED: /* All the devices in a port need to be deregistered if the PHY_STOP is for the last phy */
1069 SA_DBG1(("mpiPhyStopEvent: 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1074 SA_DBG1(("mpiPhyStopEvent: Unknown Status 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
1081 pPhy = &(saRoot->phys[phyId]);
1082 /* get the port of the phy */
1083 pPort = pPhy->pPort;
1084 if ( agNULL != pPort )
1086 SA_DBG1(("siPhyStopCB: phy%d invalidating port\n", phyId));
1087 /* invalid port state, remove the port */
1088 pPort->status |= PORT_INVALIDATING;
1089 saRoot->PortMap[pPort->portId].PortStatus |= PORT_INVALIDATING;
1090 /* invalid the port */
1091 siPortInvalid(agRoot, pPort);
1092 /* map out the portmap */
1093 saRoot->PortMap[pPort->portId].PortContext = agNULL;
1094 saRoot->PortMap[pPort->portId].PortID = PORT_MARK_OFF;
1095 saRoot->PortMap[pPort->portId].PortStatus |= PORT_INVALIDATING;
1096 ossaHwCB(agRoot,&(pPort->portContext) , OSSA_HW_EVENT_PHY_STOP_STATUS, ((HwCBStatus << SHIFT8) | phyId ),agContext, agNULL);
1100 SA_DBG1(("siPhyStopCB: phy%d - Port is not established\n", phyId));
1101 ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_PHY_STOP_STATUS, ((HwCBStatus << SHIFT8) | phyId ) , agContext, agNULL);
1104 /* set PHY_STOPPED status */
1105 PHY_STATUS_SET(pPhy, PHY_STOPPED);
1107 /* Exclude the phy from a port */
1108 if ( agNULL != pPort )
1110 /* Acquire port list lock */
1111 ossaSingleThreadedEnter(agRoot, LL_PORT_LOCK);
1113 /* Delete the phy from the port */
1114 pPort->phyMap[phyId] = agFALSE;
1115 saRoot->phys[phyId].pPort = agNULL;
1117 /* Release port list lock */
1118 ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
1124 SA_DBG1(("siPhyStopCB: Error phy%d - Port is not established\n", phyId));
1125 ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_PHY_STOP_STATUS, ((HwCBStatus << SHIFT8) | phyId ) , agContext, agNULL);
1128 /* return the request to free pool */
1129 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1130 SA_ASSERT((pRequest->valid), "pRequest->valid");
1131 pRequest->valid = agFALSE;
1132 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
1134 SA_DBG1(("mpiPhyStartEvent: saving pRequest (%p) for later use\n", pRequest));
1135 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
1139 /* return the request to free pool */
1140 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
1142 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1148 /******************************************************************************/
1149 /*! \brief Hardware Event Response from SPC
1151 * Process HW Event from SPC
1153 * \param agRoot Handles for this instance of SAS/SATA LL Layer
1154 * \param pIomb pointer of IOMB
1156 * \return success or fail
1159 /*******************************************************************************/
1160 GLOBAL bit32 mpiHWevent(
1162 agsaHWEvent_SPC_OUB_t *pIomb
1165 bit32 ret = AGSA_RC_SUCCESS;
1166 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
1167 agsaIORequestDesc_t *pRequest;
1168 agsaPortContext_t *agPortContext;
1169 agsaSASIdentify_t *IDframe;
1170 agsaFisRegDeviceToHost_t *sataFis;
1171 agsaContext_t *agContext;
1172 agsaPort_t *pPort = agNULL;
1178 bit32 LREventPhyIdPortId;
1179 bit32 npipps, eventParam,npip,port_state;
1181 smTraceFuncEnter(hpDBG_VERY_LOUD,"2j");
1183 SA_ASSERT((agNULL !=saRoot ), "");
1184 if(saRoot == agNULL)
1186 SA_DBG1(("mpiHWevent: saRoot == agNULL\n"));
1187 return(AGSA_RC_FAILURE);
1189 if(smIS_SPC(agRoot))
1191 OSSA_READ_LE_32(AGROOT, &LREventPhyIdPortId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, LRStatusEventPhyIdPortId));
1192 OSSA_READ_LE_32(AGROOT, &npipps, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, NpipPortState));
1193 OSSA_READ_LE_32(AGROOT, &eventParam, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, EVParam));
1194 SA_DBG2(("mpiHWEvent: S, LREventPhyIdPortId 0x%08x npipps 0x%08x eventParam 0x%08x\n", LREventPhyIdPortId ,npipps ,eventParam ));
1196 /* get port context */
1197 portId = LREventPhyIdPortId & PORTID_MASK;
1198 smTrace(hpDBG_VERY_LOUD,"QK",portId);
1202 phyId = (LREventPhyIdPortId & PHY_ID_BITS) >> SHIFT4;
1204 smTrace(hpDBG_VERY_LOUD,"QK",npipps);
1206 smTrace(hpDBG_VERY_LOUD,"QL",portId);
1208 smTrace(hpDBG_VERY_LOUD,"QM",phyId);
1211 SA_DBG1(("mpiHWEvent:SPC, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1212 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, (npipps & PORT_STATE_MASK)));
1216 OSSA_READ_LE_32(AGROOT, &LREventPhyIdPortId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_V_OUB_t, LRStatEventPortId));
1217 OSSA_READ_LE_32(AGROOT, &npipps, pIomb, OSSA_OFFSET_OF(agsaHWEvent_V_OUB_t, RsvPhyIdNpipRsvPortState));
1218 OSSA_READ_LE_32(AGROOT, &eventParam, pIomb, OSSA_OFFSET_OF(agsaHWEvent_V_OUB_t, EVParam));
1219 SA_DBG2(("mpiHWEvent: V, LREventPhyIdPortId 0x%08x npipps 0x%08x eventParam 0x%08x\n", LREventPhyIdPortId ,npipps ,eventParam ));
1221 smTrace(hpDBG_VERY_LOUD,"QN",npipps);
1224 /* get port context */
1225 portId = LREventPhyIdPortId & PORTID_MASK;
1227 smTrace(hpDBG_VERY_LOUD,"QO",portId);
1231 phyId = (npipps & PHY_ID_V_BITS) >> SHIFT16;
1232 smTrace(hpDBG_VERY_LOUD,"QP",phyId);
1236 npip =(npipps & 0xFF00 ) >> SHIFT4;
1237 port_state =(npipps & 0xF );
1238 npipps = npip | port_state; // Make it look like SPCs nipps
1241 SA_DBG1(("mpiHWEvent: V, PhyID 0x%x PortID 0x%x NPIP 0x%x PS 0x%x npipps 0x%x\n",
1242 phyId, portId,npip,port_state,npipps));
1245 Event = (LREventPhyIdPortId & HW_EVENT_BITS) >> SHIFT8;
1248 linkRate = (bit8)((LREventPhyIdPortId & LINK_RATE_MASK) >> SHIFT28);
1249 /* get status byte */
1250 status = (LREventPhyIdPortId & STATUS_BITS) >> SHIFT24;
1252 smTrace(hpDBG_VERY_LOUD,"HA",portId);
1254 smTrace(hpDBG_VERY_LOUD,"HB",linkRate);
1255 /* TP:HB linkRate */
1256 smTrace(hpDBG_VERY_LOUD,"HC",phyId);
1258 smTrace(hpDBG_VERY_LOUD,"HD",npipps);
1260 smTrace(hpDBG_VERY_LOUD,"HE",status);
1263 if (portId > saRoot->phyCount)
1265 if (OSSA_PORT_NOT_ESTABLISHED == (npipps & PORT_STATE_MASK))
1267 /* out of range checking for portId */
1268 SA_DBG1(("mpiHWEvent: PORT_ID is out of range, PhyID %d PortID %d\n",
1270 /* port is not estiblished */
1271 agPortContext = agNULL;
1275 /* portId is bad and state is correct - should not happen */
1276 SA_DBG1(("mpiHWEvent: PORT_ID is bad with correct Port State, PhyID %d PortID %d\n",
1278 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2j");
1279 return AGSA_RC_FAILURE;
1284 SA_DBG2(("mpiHWEvent:PortID 0x%x PortStatus 0x%x PortContext %p\n",saRoot->PortMap[portId & PORTID_MASK].PortID,saRoot->PortMap[portId & PORTID_MASK].PortStatus,saRoot->PortMap[portId & PORTID_MASK].PortContext));
1285 agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
1288 if(agPortContext == agNULL)
1290 SA_DBG1(("mpiHWEvent: agPortContext is NULL, PhyID %d PortID %d\n",
1294 smTrace(hpDBG_VERY_LOUD,"HF",Event);
1295 /* TP:HF OSSA_HW_EVENT */
1299 case OSSA_HW_EVENT_SAS_PHY_UP:
1301 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_SAS_PHY_UP, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1302 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, (npipps & PORT_STATE_MASK)));
1304 /* get SAS Identify info */
1305 IDframe = (agsaSASIdentify_t *)&pIomb->sasIdentify;
1306 /* Callback about SAS link up */
1307 saRoot->phys[phyId].linkstatus |= 2;
1308 saRoot->phys[phyId].sasIdentify.phyIdentifier = IDframe->phyIdentifier;
1309 saRoot->phys[phyId].sasIdentify.deviceType_addressFrameType = IDframe->deviceType_addressFrameType;
1311 si_memcpy(&(saRoot->phys[phyId].sasIdentify.sasAddressHi),&(IDframe->sasAddressHi),4);
1312 si_memcpy(&(saRoot->phys[phyId].sasIdentify.sasAddressLo),&(IDframe->sasAddressLo),4);
1313 siEventPhyUpRcvd(agRoot, phyId, IDframe, portId, npipps, linkRate);
1316 case OSSA_HW_EVENT_SATA_PHY_UP:
1318 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_SATA_PHY_UP, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1319 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, (npipps & PORT_STATE_MASK)));
1321 /* get SATA FIS info */
1322 saRoot->phys[phyId].linkstatus |= 2;
1323 sataFis = (agsaFisRegDeviceToHost_t *)&pIomb->sataFis;
1324 /* Callback about SATA Link Up */
1325 siEventSATASignatureRcvd(agRoot, phyId, (void *)sataFis, portId, npipps, linkRate);
1328 case OSSA_HW_EVENT_SATA_SPINUP_HOLD:
1330 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_SATA_SPINUP_HOLD, PhyID %d\n", phyId));
1331 ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_SATA_SPINUP_HOLD, phyId, agNULL, agNULL);
1334 case OSSA_HW_EVENT_PHY_DOWN:
1336 agsaPhy_t *pPhy = &(saRoot->phys[phyId]);
1339 osti_memset(&pPhy->sasIdentify,0,sizeof(agsaSASIdentify_t));
1341 saRoot->phys[phyId].linkstatus &= 1;
1342 if (agNULL != agPortContext)
1344 pPort = (agsaPort_t *) (agPortContext->sdkData);
1347 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1348 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1351 if ( agNULL != pPort )
1353 if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
1355 pPort->status &= ~PORT_INVALIDATING;
1356 saRoot->PortMap[portId].PortStatus &= ~PORT_INVALIDATING;
1357 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN, PhyID %d ~PORT_INVALIDATING \n", phyId));
1361 if (OSSA_PORT_INVALID == (npipps & PORT_STATE_MASK))
1363 /* set port invalid flag */
1364 pPort->status |= PORT_INVALIDATING;
1365 saRoot->PortMap[portId].PortStatus |= PORT_INVALIDATING;
1366 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN PortInvalid portID %d PortContext %p NPIP 0x%x\n", portId, agPortContext,npipps));
1370 if (OSSA_PORT_IN_RESET == (npipps & PORT_STATE_MASK))
1372 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN PortInReset portID %d PortContext %p\n", portId, agPortContext));
1376 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN Not PortInReset portID %d PortContext %p\n", portId, agPortContext));
1381 /* report PhyId, NPIP, PortState */
1382 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1383 /* Callback with PHY_DOWN */
1384 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_DOWN, phyId, agNULL, agNULL);
1388 /* no portcontext.- error */
1389 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN PhyDown pPort is NULL.\n"));
1392 /* set PHY_DOWN status */
1393 PHY_STATUS_SET(pPhy, PHY_DOWN);
1396 case OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC:
1398 agsaPhyErrCountersPage_t errorParam;
1399 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1400 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1401 si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1402 errorParam.inboundCRCError = eventParam;
1403 /* report PhyId, NPIP, PortState */
1404 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1405 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC, phyId, (void *)&errorParam, agNULL);
1408 case OSSA_HW_EVENT_HARD_RESET_RECEIVED:
1410 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_HARD_RESET_RECEIVED, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1411 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1412 /* report PhyId, NPIP, PortState */
1413 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1414 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_HARD_RESET_RECEIVED, phyId, agNULL, agNULL);
1417 case OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD:
1419 agsaPhyErrCountersPage_t errorParam;
1420 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_INVALID_DWORD, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1421 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1422 si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1423 errorParam.invalidDword = eventParam;
1424 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1425 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD, phyId, (void *)&errorParam, agNULL);
1428 case OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR:
1430 agsaPhyErrCountersPage_t errorParam;
1431 SA_DBG3(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_DISPARITY_ERROR, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1432 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1433 /* report PhyId, NPIP, PortState */
1434 si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1435 errorParam.runningDisparityError = eventParam;
1436 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1437 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR, phyId, (void *)&errorParam, agNULL);
1440 case OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION:
1442 agsaPhyErrCountersPage_t errorParam;
1443 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1444 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1445 /* report PhyId, NPIP, PortState */
1446 si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1447 errorParam.codeViolation = eventParam;
1448 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1449 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION, phyId, (void *)&errorParam, agNULL);
1452 case OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH:
1454 agsaPhyErrCountersPage_t errorParam;
1455 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_LOSS_OF_DWORD_SYNCH, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1456 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1457 /* report PhyId, NPIP, PortState */
1458 si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1459 errorParam.lossOfDwordSynch = eventParam;
1460 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1461 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH, phyId, (void *)&errorParam, agNULL);
1464 case OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO:
1466 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1467 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1469 if (agNULL != agPortContext)
1471 pPort = (agsaPort_t *) (agPortContext->sdkData);
1475 SA_ASSERT((agPortContext), "agPortContext agNULL was there a PHY UP?");
1476 return(AGSA_RC_FAILURE);
1479 /* report PhyId, NPIP, PortState */
1480 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1481 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO, phyId, agNULL, agNULL);
1483 if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
1485 pPort->status &= ~PORT_INVALIDATING;
1486 saRoot->PortMap[portId].PortStatus &= ~PORT_INVALIDATING;
1487 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO NOT PORT_INVALIDATING portID %d PortContext %p\n", portId, agPortContext));
1491 if (OSSA_PORT_INVALID == (npipps & PORT_STATE_MASK))
1493 /* set port invalid flag */
1494 pPort->status |= PORT_INVALIDATING;
1495 saRoot->PortMap[portId].PortStatus |= PORT_INVALIDATING;
1496 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO PORT_INVALIDATING portID %d PortContext %p\n", portId, agPortContext));
1500 if (OSSA_PORT_IN_RESET == (npipps & PORT_STATE_MASK))
1502 SA_DBG1(("mpiHWEvent: PortInReset portID %d PortContext %p\n", portId, agPortContext));
1508 case OSSA_HW_EVENT_PORT_RECOVER:
1510 if (agNULL != agPortContext)
1512 pPort = (agsaPort_t *) (agPortContext->sdkData);
1515 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVER, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1516 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1518 if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
1520 if (agNULL != pPort)
1522 /* reset port invalid flag */
1523 pPort->status &= ~PORT_INVALIDATING;
1524 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVER NOT PORT_INVALIDATING portID %d PortContext %p\n", portId, agPortContext));
1526 saRoot->PortMap[portId].PortStatus &= ~PORT_INVALIDATING;
1528 /* get SAS Identify info */
1529 IDframe = (agsaSASIdentify_t *)&pIomb->sasIdentify;
1530 /* report PhyId, NPIP, PortState and LinkRate */
1531 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16) | (linkRate << SHIFT8);
1532 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RECOVER, phyId, agNULL, (void *)IDframe);
1535 case OSSA_HW_EVENT_PHY_STOP_STATUS:
1537 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS PhyId=0x%x, status=0x%x eventParam=0x%x\n", phyId, status,eventParam));
1538 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, EVParam));
1543 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS Stopped 0\n" ));
1546 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS INVALID_PHY 1\n" ));
1549 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS DEVICES_ATTACHED 2\n" ));
1552 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS OTHER_FAILURE 3\n" ));
1555 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS PHY_NOT_ENABLED 4\n" ));
1558 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS Unknown code 0x%x\n", eventParam));
1562 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS phyId 0x%x status 0x%x eventParam 0x%x\n", phyId, status,eventParam));
1563 /* get request from IOMap */
1564 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
1565 SA_ASSERT((pRequest), "pRequest NULL");
1566 SA_ASSERT((pRequest->valid), "pRequest->valid");
1568 agContext = saRoot->IOMap[tag].agContext;
1570 siPhyStopCB(agRoot, phyId, status, agContext, portId, npipps);
1572 /* remove the request from IOMap */
1573 saRoot->IOMap[tag].Tag = MARK_OFF;
1574 saRoot->IOMap[tag].IORequest = agNULL;
1575 saRoot->IOMap[tag].agContext = agNULL;
1577 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1578 pRequest->valid = agFALSE;
1579 /* return the request to free pool */
1580 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
1582 SA_DBG1(("mpiHWevent: saving pRequest (%p) for later use\n", pRequest));
1583 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
1587 /* return the request to free pool */
1588 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
1590 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1593 case OSSA_HW_EVENT_BROADCAST_CHANGE:
1595 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_CHANGE, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1596 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1597 /* report PhyId, NPIP, PortState */
1598 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1599 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE, phyId, agNULL, agNULL);
1602 case OSSA_HW_EVENT_BROADCAST_SES:
1604 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_CHANGE_SES, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1605 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1606 /* report PhyId, NPIP, PortState */
1607 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1608 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_SES, phyId, agNULL, agNULL);
1611 case OSSA_HW_EVENT_BROADCAST_EXP:
1613 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_EXP, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1614 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1615 /* report PhyId, NPIP, PortState */
1616 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1617 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_EXP, phyId, agNULL, agNULL);
1620 case OSSA_HW_EVENT_ID_FRAME_TIMEOUT:
1622 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_ID_FRAME_TIMEOUT, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1623 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1624 /* report PhyId, NPIP, PortState */
1625 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1626 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_ID_FRAME_TIMEOUT, phyId, agNULL, agNULL);
1629 case OSSA_HW_EVENT_PHY_START_STATUS:
1631 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, EVParam)) ;
1632 /* get request from IOMap */
1633 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
1635 SA_ASSERT((pRequest), "pRequest");
1636 if( pRequest == agNULL)
1638 SA_DBG1(("mpiHWevent: pRequest (%p) NULL\n", pRequest));
1639 ret = AGSA_RC_FAILURE;
1643 agContext = saRoot->IOMap[tag].agContext;
1646 status = (status << 8) | phyId;
1647 ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_PHY_START_STATUS, status, agContext, agNULL);
1649 /* remove the request from IOMap */
1650 saRoot->IOMap[tag].Tag = MARK_OFF;
1651 saRoot->IOMap[tag].IORequest = agNULL;
1652 saRoot->IOMap[tag].agContext = agNULL;
1654 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1655 SA_ASSERT((pRequest->valid), "pRequest->valid");
1656 pRequest->valid = agFALSE;
1657 /* return the request to free pool */
1658 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
1660 SA_DBG1(("mpiHWevent: saving pRequest (%p) for later use\n", pRequest));
1661 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
1665 /* return the request to free pool */
1666 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
1668 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
1670 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_START_STATUS, PhyID %d\n", phyId));
1674 case OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED:
1676 agsaPhyErrCountersPage_t errorParam;
1677 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
1678 phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
1679 /* report PhyId, NPIP, PortState */
1680 si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
1681 errorParam.phyResetProblem = eventParam;
1682 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1683 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED, phyId, (void *)&errorParam, agNULL);
1686 case OSSA_HW_EVENT_PORT_RESET_TIMER_TMO:
1688 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RESET_TIMER_TMO, PhyID %d PortID %d\n", phyId, portId));
1689 /* report PhyId, NPIP, PortState */
1690 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1691 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RESET_TIMER_TMO, phyId, agNULL, agNULL);
1694 case OSSA_HW_EVENT_PORT_RESET_COMPLETE:
1696 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RESET_COMPLETE, PhyID %d PortID %d\n", phyId, portId));
1697 /* get SAS Identify info */
1698 IDframe = (agsaSASIdentify_t *)&pIomb->sasIdentify;
1699 /* report PhyId, NPIP, PortState and LinkRate */
1700 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16) | (linkRate << SHIFT8);
1701 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RESET_COMPLETE, phyId, agNULL, (void *)IDframe);
1704 case OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT:
1706 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT, PhyID %d PortID %d\n", phyId, portId));
1707 /* report PhyId, NPIP, PortState */
1708 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
1709 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT, phyId, agNULL, agNULL);
1712 case OSSA_HW_EVENT_IT_NEXUS_LOSS:
1714 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_IT_NEXUS_LOSS, PhyID %d PortID %d status 0x%X\n", phyId, portId,status));
1717 case OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED:
1719 SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED, PhyID %d PortID %d status 0x%X\n", phyId, portId,status));
1720 ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED, phyId, agNULL, agNULL);
1726 SA_DBG1(("mpiHWEvent: Unknown HW Event 0x%x status 0x%X\n", Event ,status));
1731 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2j");
1735 /******************************************************************************/
1736 /*! \brief SPC MPI SMP Completion
1738 * This function handles the SMP completion.
1740 * \param agRoot Handles for this instance of SAS/SATA hardware
1741 * \param pIomb pointer of Message1
1742 * \param bc buffer count
1744 * \return The read value
1747 /*******************************************************************************/
1748 GLOBAL bit32 mpiSMPCompletion(
1750 agsaSMPCompletionRsp_t *pIomb
1753 bit32 ret = AGSA_RC_SUCCESS;
1754 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
1758 agsaIORequestDesc_t *pRequest;
1760 SA_DBG3(("mpiSMPCompletion: start, HTAG=0x%x\n", pIomb->tag));
1762 smTraceFuncEnter(hpDBG_VERY_LOUD,"2k");
1764 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSMPCompletionRsp_t, tag)) ;
1765 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSMPCompletionRsp_t, status)) ;
1766 OSSA_READ_LE_32(AGROOT, ¶m, pIomb, OSSA_OFFSET_OF(agsaSMPCompletionRsp_t, param)) ;
1767 /* get SMP request from IOMap */
1768 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
1769 if (agNULL == pRequest)
1771 SA_DBG1(("mpiSMPCompletion: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x PARAM=0x%x\n", tag, status, param));
1772 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2k");
1773 return AGSA_RC_FAILURE;
1778 case OSSA_IO_SUCCESS:
1779 SA_DBG3(("mpiSMPCompletion: OSSA_IO_SUCCESS HTAG = 0x%x\n", tag));
1780 /* process message */
1781 siSMPRespRcvd(agRoot, pIomb, param, tag);
1784 case OSSA_IO_OVERFLOW:
1785 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OVERFLOW HTAG = 0x%x\n", tag));
1786 saRoot->IoErrorCount.agOSSA_IO_OVERFLOW++;
1788 siAbnormal(agRoot, pRequest, status, 0, 0);
1791 case OSSA_IO_ABORTED:
1792 SA_DBG1(("mpiSMPCompletion: OSSA_IO_ABORTED HTAG = 0x%x\n", tag));
1794 saRoot->IoErrorCount.agOSSA_IO_ABORTED++;
1795 #ifdef SA_PRINTOUT_IN_WINDBG
1797 DbgPrint("agOSSA_IO_ABORTED %d\n", saRoot->IoErrorCount.agOSSA_IO_ABORTED);
1799 #endif /* SA_PRINTOUT_IN_WINDBG */
1801 siAbnormal(agRoot, pRequest, status, 0, 0);
1804 case OSSA_IO_NO_DEVICE:
1805 SA_DBG1(("mpiSMPCompletion: OSSA_IO_NO_DEVICE HTAG = 0x%x\n", tag));
1806 saRoot->IoErrorCount.agOSSA_IO_NO_DEVICE++;
1807 siAbnormal(agRoot, pRequest, status, 0, 0);
1810 case OSSA_IO_ERROR_HW_TIMEOUT:
1811 SA_DBG1(("mpiSMPCompletion: OSSA_IO_ERROR_HW_TIMEOUT HTAG = 0x%x\n", tag));
1812 saRoot->IoErrorCount.agOSSA_IO_ERROR_HW_TIMEOUT++;
1813 siAbnormal(agRoot, pRequest, status, 0, 0);
1816 case OSSA_IO_XFER_ERROR_BREAK:
1817 SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_ERROR_BREAK HTAG = 0x%x\n", tag));
1818 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_BREAK++;
1819 siAbnormal(agRoot, pRequest, status, 0, 0);
1822 case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
1823 SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_ERROR_PHY_NOT_READY HTAG = 0x%x\n", tag));
1824 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
1825 siAbnormal(agRoot, pRequest, status, 0, 0);
1828 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
1829 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED HTAG = 0x%x\n", tag));
1830 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
1831 siAbnormal(agRoot, pRequest, status, 0, 0);
1834 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
1835 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION HTAG = 0x%x\n", tag));
1836 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
1837 siAbnormal(agRoot, pRequest, status, 0, 0);
1840 case OSSA_IO_OPEN_CNX_ERROR_BREAK:
1841 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_BREAK HTAG = 0x%x\n", tag));
1842 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
1843 siAbnormal(agRoot, pRequest, status, 0, 0);
1846 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
1847 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS HTAG = 0x%x\n", tag));
1848 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
1849 siAbnormal(agRoot, pRequest, status, 0, 0);
1852 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
1853 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION HTAG = 0x%x\n", tag));
1854 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
1855 siAbnormal(agRoot, pRequest, status, 0, 0);
1858 case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
1859 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED HTAG = 0x%x\n", tag));
1860 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
1861 siAbnormal(agRoot, pRequest, status, 0, 0);
1864 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
1865 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION HTAG = 0x%x\n", tag));
1866 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
1867 siAbnormal(agRoot, pRequest, status, 0, 0);
1870 case OSSA_IO_XFER_ERROR_RX_FRAME:
1871 SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_ERROR_RX_FRAME HTAG = 0x%x\n", tag));
1872 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_RX_FRAME++;
1873 siAbnormal(agRoot, pRequest, status, 0, 0);
1876 case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
1877 SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT HTAG = 0x%x\n", tag));
1878 saRoot->IoErrorCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
1879 siAbnormal(agRoot, pRequest, status, 0, 0);
1882 case OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE:
1883 SA_DBG1(("mpiSMPCompletion: OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE HTAG = 0x%x\n", tag));
1884 saRoot->IoErrorCount.agOSSA_IO_ERROR_INTERNAL_SMP_RESOURCE++;
1885 siAbnormal(agRoot, pRequest, status, 0, 0);
1888 case OSSA_IO_PORT_IN_RESET:
1889 SA_DBG1(("mpiSMPCompletion: OSSA_IO_PORT_IN_RESET HTAG = 0x%x\n", tag));
1890 saRoot->IoErrorCount.agOSSA_IO_PORT_IN_RESET++;
1891 siAbnormal(agRoot, pRequest, status, 0, 0);
1894 case OSSA_IO_DS_NON_OPERATIONAL:
1895 SA_DBG1(("mpiSMPCompletion: OSSA_IO_DS_NON_OPERATIONAL HTAG = 0x%x\n", tag));
1896 saRoot->IoErrorCount.agOSSA_IO_DS_NON_OPERATIONAL++;
1897 siAbnormal(agRoot, pRequest, status, 0, 0);
1900 case OSSA_IO_DS_IN_RECOVERY:
1901 SA_DBG1(("mpiSMPCompletion: OSSA_IO_DS_IN_RECOVERY HTAG = 0x%x\n", tag));
1902 saRoot->IoErrorCount.agOSSA_IO_DS_IN_RECOVERY++;
1903 siAbnormal(agRoot, pRequest, status, 0, 0);
1906 case OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY:
1907 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY HTAG = 0x%x\n", tag));
1908 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY++;
1909 siAbnormal(agRoot, pRequest, status, 0, 0);
1912 case OSSA_IO_ABORT_IN_PROGRESS:
1913 SA_DBG1(("mpiSMPCompletion: OSSA_IO_ABORT_IN_PROGRESS HTAG = 0x%x\n", tag));
1914 saRoot->IoErrorCount.agOSSA_IO_ABORT_IN_PROGRESS++;
1915 siAbnormal(agRoot, pRequest, status, 0, 0);
1918 case OSSA_IO_ABORT_DELAYED:
1919 SA_DBG1(("mpiSMPCompletion:OSSA_IO_ABORT_DELAYED HTAG = 0x%x\n", tag));
1920 saRoot->IoErrorCount.agOSSA_IO_ABORT_DELAYED++;
1921 siAbnormal(agRoot, pRequest, status, 0, 0);
1924 case OSSA_IO_INVALID_LENGTH:
1925 SA_DBG1(("mpiSMPCompletion: OSSA_IO_INVALID_LENGTH HTAG = 0x%x\n", tag));
1926 saRoot->IoErrorCount.agOSSA_IO_INVALID_LENGTH++;
1927 siAbnormal(agRoot, pRequest, status, 0, 0);
1930 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
1931 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x\n", tag));
1932 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
1933 siAbnormal(agRoot, pRequest, status, 0, 0);
1936 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
1937 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO HTAG = 0x%x\n", tag));
1938 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO++;
1939 siAbnormal(agRoot, pRequest, status, 0, 0);
1942 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
1943 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST HTAG = 0x%x\n", tag));
1944 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
1945 siAbnormal(agRoot, pRequest, status, 0, 0);
1948 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
1949 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE HTAG = 0x%x\n", tag));
1950 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
1951 siAbnormal(agRoot, pRequest, status, 0, 0);
1954 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
1955 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED HTAG = 0x%x\n", tag));
1956 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
1957 siAbnormal(agRoot, pRequest, status, 0, 0);
1960 case OSSA_IO_DS_INVALID:
1961 SA_DBG1(("mpiSMPCompletion: OSSA_IO_DS_INVALID HTAG = 0x%x\n", tag));
1962 saRoot->IoErrorCount.agOSSA_IO_DS_INVALID++;
1963 siAbnormal(agRoot, pRequest, status, 0, 0);
1966 case OSSA_IO_XFER_READ_COMPL_ERR:
1967 SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_READ_COMPL_ERR HTAG = 0x%x\n", tag));
1968 saRoot->IoErrorCount.agOSSA_IO_XFER_READ_COMPL_ERR++;
1969 siAbnormal(agRoot, pRequest, status, 0, 0);
1972 case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
1973 SA_DBG1(("mpiSMPCompletion: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE HTAG = 0x%x\n", tag));
1974 saRoot->IoErrorCount.agOSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE++;
1975 siAbnormal(agRoot, pRequest, status, 0, 0);
1978 case OSSA_MPI_ERR_OFFLOAD_DIF_OR_ENC_NOT_ENABLED:
1979 SA_DBG1(("mpiSMPCompletion: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE HTAG = 0x%x\n", tag));
1980 saRoot->IoErrorCount.agOSSA_MPI_ERR_OFFLOAD_DIF_OR_ENC_NOT_ENABLED++;
1981 siAbnormal(agRoot, pRequest, status, 0, 0);
1984 case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED:
1985 SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED HTAG = 0x%x\n", tag));
1986 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED++;
1987 siAbnormal(agRoot, pRequest, status, 0, 0);
1991 SA_DBG1(("mpiSMPCompletion: Unknown Status = 0x%x Tag 0x%x\n", status, tag));
1992 saRoot->IoErrorCount.agOSSA_IO_UNKNOWN_ERROR++;
1993 /* not allowed case. Therefore, assert */
1994 SA_ASSERT((agFALSE), "mpiSMPCompletion: Unknown Status");
1998 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2k");
2002 /******************************************************************************/
2003 /*! \brief SPC MPI Get Device Handle Command Response
2005 * This function handles the response of Get Device Handle Command.
2007 * \param agRoot Handles for this instance of SAS/SATA hardware
2008 * \param pIomb pointer of Message
2009 * \param bc buffer count
2011 * \return The read value
2014 /*******************************************************************************/
2015 GLOBAL bit32 mpiGetDevHandleRsp(
2017 agsaGetDevHandleRsp_t *pIomb
2020 bit32 ret = AGSA_RC_SUCCESS;
2021 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2022 agsaIORequestDesc_t *pRequest;
2023 agsaPortContext_t *agPortContext;
2024 agsaContext_t *agContext;
2025 agsaDeviceDesc_t *pDevice;
2027 bit32 deviceid=0, deviceIdc, i;
2028 bit32 DeviceIdcPortId, tag;
2030 SA_DBG3(("mpiGetDevHandleRsp: start, HTAG=0x%x\n", pIomb->tag));
2032 smTraceFuncEnter(hpDBG_VERY_LOUD,"2m");
2034 OSSA_READ_LE_32(AGROOT, &DeviceIdcPortId, pIomb, OSSA_OFFSET_OF(agsaGetDevHandleRsp_t, DeviceIdcPortId)) ;
2035 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDevHandleRsp_t, tag)) ;
2036 /* get request from IOMap */
2037 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2038 agContext = saRoot->IOMap[tag].agContext;
2039 /* remove the request from IOMap */
2040 saRoot->IOMap[tag].Tag = MARK_OFF;
2041 saRoot->IOMap[tag].IORequest = agNULL;
2042 saRoot->IOMap[tag].agContext = agNULL;
2043 if (agNULL == pRequest)
2045 SA_DBG1(("mpiGetDevHandleRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x DeviceIdcPortId=0x%x\n", tag, DeviceIdcPortId));
2046 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2m");
2047 return AGSA_RC_FAILURE;
2050 /* get port context */
2051 portId = (bit8)(DeviceIdcPortId & PORTID_MASK);
2052 SA_DBG2(("mpiGetDevHandleRsp:PortID 0x%x PortStatus 0x%x PortContext %p\n",saRoot->PortMap[portId & PORTID_MASK].PortID,saRoot->PortMap[portId & PORTID_MASK].PortStatus,saRoot->PortMap[portId & PORTID_MASK].PortContext));
2053 agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
2055 /* get Device ID count */
2056 deviceIdc = (bit8)((DeviceIdcPortId & DEVICE_IDC_BITS) >> SHIFT8);
2058 /* based on the deviceIDC to get all device handles */
2059 for (i = 0; i < deviceIdc; i++)
2061 OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaGetDevHandleRsp_t, deviceId[i])) ;
2062 /* find device handle from device index */
2063 pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
2064 if (pDevice->targetDevHandle.sdkData)
2065 saRoot->DeviceHandle[i] = &(pDevice->targetDevHandle);
2067 saRoot->DeviceHandle[i] = &(pDevice->initiatorDevHandle);
2070 SA_DBG1(("mpiGetDevHandleRsp:deviceid 0x%x 0x%x\n",deviceid, (deviceid & DEVICE_ID_BITS)));
2071 /* call back oslayer */
2072 ossaGetDeviceHandlesCB(agRoot, agContext, agPortContext, saRoot->DeviceHandle, deviceIdc);
2074 /* return the request to free pool */
2075 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2076 SA_ASSERT((pRequest->valid), "pRequest->valid");
2077 pRequest->valid = agFALSE;
2078 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2080 SA_DBG1(("mpiGetDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
2081 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2085 /* return the request to free pool */
2086 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2088 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2090 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2m");
2095 /******************************************************************************/
2096 /*! \brief SPC MPI Phy Control Command Response
2098 * This function handles the response of PHY Control Command.
2100 * \param agRoot Handles for this instance of SAS/SATA hardware
2101 * \param pIomb pointer of Message
2103 * \return The read value
2106 /*******************************************************************************/
2107 GLOBAL bit32 mpiPhyCntrlRsp(
2109 agsaLocalPhyCntrlRsp_t *pIomb
2112 bit32 ret = AGSA_RC_SUCCESS;
2113 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2114 agsaIORequestDesc_t *pRequest;
2115 agsaContext_t *agContext = agNULL;
2116 bit32 phyId, operation, status, tag, phyOpId;
2118 smTraceFuncEnter(hpDBG_VERY_LOUD,"2n");
2120 SA_DBG3(("mpiPhyCntrlRsp: start, HTAG=0x%x,\n", pIomb->tag));
2123 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaLocalPhyCntrlRsp_t, tag)) ;
2124 OSSA_READ_LE_32(AGROOT, &phyOpId, pIomb, OSSA_OFFSET_OF(agsaLocalPhyCntrlRsp_t, phyOpId)) ;
2125 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaLocalPhyCntrlRsp_t, status)) ;
2126 /* get request from IOMap */
2127 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2128 if (agNULL == pRequest)
2130 SA_DBG1(("mpiPhyCntrlRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x PhyOpId=0x%x\n", tag, status, phyOpId));
2131 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2n");
2132 return AGSA_RC_FAILURE;
2134 agContext = saRoot->IOMap[tag].agContext;
2135 /* remove the request from IOMap */
2136 saRoot->IOMap[tag].Tag = MARK_OFF;
2137 saRoot->IOMap[tag].IORequest = agNULL;
2138 saRoot->IOMap[tag].agContext = agNULL;
2140 phyId = phyOpId & LOCAL_PHY_PHYID;
2141 operation = (phyOpId & LOCAL_PHY_OP_BITS) >> SHIFT8;
2144 SA_DBG3(("mpiPhyCntrlRsp: phyId=0x%x Operation=0x%x Status=0x%x\n", phyId, operation, status));
2146 if( pRequest->completionCB == agNULL )
2148 /* call back with the status */
2149 ossaLocalPhyControlCB(agRoot, agContext, phyId, operation, status, agNULL);
2153 (*(ossaLocalPhyControlCB_t)(pRequest->completionCB))(agRoot, agContext, phyId, operation, status, agNULL );
2156 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2157 SA_ASSERT((pRequest->valid), "pRequest->valid");
2158 pRequest->valid = agFALSE;
2159 /* return the request to free pool */
2160 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2162 SA_DBG1(("mpiPhyCntrlRsp: saving pRequest (%p) for later use\n", pRequest));
2163 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2167 /* return the request to free pool */
2168 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2170 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2172 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2n");
2176 /******************************************************************************/
2177 /*! \brief SPC MPI Device Register Command Response
2179 * This function handles the response of Device Register Command.
2181 * \param agRoot Handles for this instance of SAS/SATA hardware
2182 * \param pIomb pointer of Message
2184 * \return The read value
2187 /*******************************************************************************/
2188 GLOBAL bit32 mpiDeviceRegRsp(
2190 agsaDeviceRegistrationRsp_t *pIomb
2193 bit32 ret = AGSA_RC_SUCCESS;
2194 agsaLLRoot_t *saRoot = agNULL;
2195 agsaIORequestDesc_t *pRequest;
2196 agsaContext_t *agContext;
2198 agsaDeviceDesc_t *pDevice = agNULL;
2199 agsaDeviceDesc_t *pDeviceRemove = agNULL;
2200 bit32 deviceIdx,status, tag;
2202 smTraceFuncEnter(hpDBG_VERY_LOUD,"2p");
2205 SA_ASSERT((agNULL != agRoot), "");
2206 saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
2207 SA_ASSERT((agNULL != saRoot), "");
2209 SA_DBG3(("mpiDeviceRegRsp: start, HTAG=0x%x\n", pIomb->tag));
2211 SA_ASSERT((NULL != saRoot->DeviceRegistrationCB), "DeviceRegistrationCB can not be NULL");
2212 OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaDeviceRegistrationRsp_t, deviceId)) ;
2213 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDeviceRegistrationRsp_t, tag)) ;
2214 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDeviceRegistrationRsp_t, status)) ;
2216 SA_DBG1(("mpiDeviceRegRsp: deviceID 0x%x \n", deviceId));
2218 /* get request from IOMap */
2219 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2220 if (agNULL == pRequest)
2222 SA_DBG1(("mpiDeviceRegRsp: Bad IOMB!!! pRequest is NULL. TAG=0x%x, STATUS=0x%x DEVICEID=0x%x\n", tag, status, deviceId));
2223 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2p");
2224 return AGSA_RC_FAILURE;
2227 pDevice = pRequest->pDevice;
2229 agContext = saRoot->IOMap[tag].agContext;
2230 SA_ASSERT((pRequest->valid), "pRequest->valid");
2231 /* remove the request from IOMap */
2232 saRoot->IOMap[tag].Tag = MARK_OFF;
2233 saRoot->IOMap[tag].IORequest = agNULL;
2234 saRoot->IOMap[tag].agContext = agNULL;
2236 /* get Device Id or status */
2237 SA_DBG3(("mpiDeviceRegRsp: hosttag 0x%x\n", tag));
2238 SA_DBG3(("mpiDeviceRegRsp: deviceID 0x%x Device Context %p\n", deviceId, pDevice));
2240 if (agNULL == pDevice)
2242 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2243 pRequest->valid = agFALSE;
2244 /* return the request to free pool */
2245 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2247 SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
2248 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2252 /* return the request to free pool */
2253 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2255 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2257 SA_DBG1(("mpiDeviceRegRsp: warning!!! no device is found\n"));
2258 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2p");
2259 return AGSA_RC_FAILURE;
2262 if (agNULL == saRoot->DeviceRegistrationCB)
2264 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2265 pRequest->valid = agFALSE;
2266 /* return the request to free pool */
2267 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2269 SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
2270 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2274 /* return the request to free pool */
2275 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2277 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2279 SA_DBG1(("mpiDeviceRegRsp: warning!!! no DeviceRegistrationCB is found\n"));
2280 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2p");
2281 return AGSA_RC_FAILURE;
2285 if(smIS_SPCV(agRoot))
2290 status = OSSA_SUCCESS;
2292 case MPI_ERR_DEVICE_HANDLE_UNAVAILABLE:
2293 status = OSSA_FAILURE_OUT_OF_RESOURCE;
2295 case MPI_ERR_DEVICE_ALREADY_REGISTERED:
2296 status = OSSA_FAILURE_DEVICE_ALREADY_REGISTERED;
2298 case MPI_ERR_PHY_ID_INVALID:
2299 status = OSSA_FAILURE_INVALID_PHY_ID;
2301 case MPI_ERR_PHY_ID_ALREADY_REGISTERED:
2302 status = OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED;
2304 case MPI_ERR_PORT_INVALID_PORT_ID:
2305 status = OSSA_FAILURE_PORT_ID_OUT_OF_RANGE;
2307 case MPI_ERR_PORT_STATE_NOT_VALID:
2308 status = OSSA_FAILURE_PORT_NOT_VALID_STATE;
2310 case MPI_ERR_DEVICE_TYPE_NOT_VALID:
2311 status = OSSA_FAILURE_DEVICE_TYPE_NOT_VALID;
2314 SA_ASSERT((0), "DeviceRegistration Unknown status");
2315 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2316 pRequest->valid = agFALSE;
2317 /* return the request to free pool */
2318 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2320 SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
2321 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2325 /* return the request to free pool */
2326 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2328 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2330 return AGSA_RC_FAILURE;
2337 /* mapping the device handle and device id */
2338 deviceIdx = deviceId & DEVICE_ID_BITS;
2339 OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
2340 saRoot->DeviceMap[deviceIdx].DeviceIdFromFW = deviceId;
2341 saRoot->DeviceMap[deviceIdx].DeviceHandle = (void *)pDevice;
2342 pDevice->DeviceMapIndex = deviceId;
2344 (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2347 &pDevice->targetDevHandle,
2352 case OSSA_FAILURE_OUT_OF_RESOURCE:
2353 SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_OUT_OF_RESOURCE\n"));
2354 /* remove device from LL device list */
2355 siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2357 /* call ossaDeviceRegistrationCB_t */
2358 (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2360 OSSA_FAILURE_OUT_OF_RESOURCE,
2361 &pDevice->targetDevHandle,
2367 case OSSA_FAILURE_DEVICE_ALREADY_REGISTERED:
2368 /* get original device handle and device id */
2369 pDeviceRemove = pDevice;
2370 deviceIdx = deviceId & DEVICE_ID_BITS;
2371 OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
2372 pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
2373 SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_DEVICE_ALREADY_REGISTERED, existing deviceContext %p\n", pDevice));
2374 /* no auto registration */
2375 if (pDevice != agNULL)
2377 /* remove device from LL device list */
2378 siPortDeviceListRemove(agRoot, pDevice->pPort, pDeviceRemove);
2380 /* call ossaDeviceRegistrationCB_t */
2381 (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2383 OSSA_FAILURE_DEVICE_ALREADY_REGISTERED,
2384 &pDevice->targetDevHandle,
2390 SA_DBG1(("mpiDeviceRegRsp: pDevice is NULL. TAG=0x%x, STATUS=0x%x DEVICEID=0x%x\n", tag, status, deviceId));
2391 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2p");
2392 return AGSA_RC_FAILURE;
2396 case OSSA_FAILURE_INVALID_PHY_ID:
2397 SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_INVALID_PHY_ID\n"));
2398 /* remove device from LL device list */
2399 siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2401 /* call ossaDeviceRegistrationCB_t */
2402 (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2404 OSSA_FAILURE_INVALID_PHY_ID,
2405 &pDevice->targetDevHandle,
2409 case OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED:
2410 /* get original device handle and device id */
2411 pDeviceRemove = pDevice;
2412 deviceIdx = deviceId & DEVICE_ID_BITS;
2413 OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
2414 pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
2415 SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED, existing deviceContext %p\n", pDevice));
2416 /* no auto registration */
2417 if (pDevice != agNULL)
2419 /* remove device from LL device list */
2420 siPortDeviceListRemove(agRoot, pDevice->pPort, pDeviceRemove);
2422 /* call ossaDeviceRegistrationCB_t */
2423 (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2425 OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED,
2426 &pDevice->targetDevHandle,
2432 SA_DBG1(("mpiDeviceRegRsp: pDevice is NULL. TAG=0x%x, STATUS=0x%x DEVICEID=0x%x\n", tag, status, deviceId));
2433 smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2p");
2434 return AGSA_RC_FAILURE;
2438 case OSSA_FAILURE_PORT_ID_OUT_OF_RANGE:
2439 SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_OUT_OF_RESOURCE\n"));
2440 /* remove device from LL device list */
2441 siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2443 /* call ossaDeviceRegistrationCB_t */
2444 (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2446 OSSA_FAILURE_PORT_ID_OUT_OF_RANGE,
2447 &pDevice->targetDevHandle,
2451 case OSSA_FAILURE_PORT_NOT_VALID_STATE:
2452 SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_PORT_NOT_VALID_STATE\n"));
2453 /* remove device from LL device list */
2454 siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2456 /* call ossaDeviceRegistrationCB_t */
2457 (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2459 OSSA_FAILURE_PORT_NOT_VALID_STATE,
2460 &pDevice->targetDevHandle,
2464 case OSSA_FAILURE_DEVICE_TYPE_NOT_VALID:
2465 SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_DEVICE_TYPE_NOT_VALID\n"));
2466 /* remove device from LL device list */
2467 siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
2468 /* call ossaDeviceRegistrationCB_t */
2469 (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
2471 OSSA_FAILURE_DEVICE_TYPE_NOT_VALID,
2472 &pDevice->targetDevHandle,
2477 SA_DBG3(("mpiDeviceRegRsp, unknown status in response %d\n", status));
2481 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2482 pRequest->valid = agFALSE;
2483 /* return the request to free pool */
2484 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2486 SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
2487 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2491 /* return the request to free pool */
2492 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2494 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2496 smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "2p");
2500 /******************************************************************************/
2501 /*! \brief SPC MPI Deregister Device Command Response
2503 * This function handles the response of Deregister Command.
2505 * \param agRoot Handles for this instance of SAS/SATA hardware
2506 * \param pIomb pointer of Message
2508 * \return The read value
2511 /*******************************************************************************/
2512 GLOBAL bit32 mpiDeregDevHandleRsp(
2514 agsaDeregDevHandleRsp_t *pIomb
2517 bit32 ret = AGSA_RC_SUCCESS;
2518 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2519 agsaIORequestDesc_t *pRequest;
2520 agsaDevHandle_t *agDevHandle;
2521 agsaContext_t *agContext;
2522 agsaDeviceDesc_t *pDevice;
2523 bit32 deviceIdx, status, tag;
2525 smTraceFuncEnter(hpDBG_VERY_LOUD,"2r");
2526 SA_ASSERT((NULL != saRoot->DeviceDeregistrationCB), "DeviceDeregistrationCB can not be NULL");
2528 SA_DBG3(("mpiDeregDevHandleRsp: start, HTAG=0x%x\n", pIomb->tag));
2530 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDeregDevHandleRsp_t, tag)) ;
2531 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDeregDevHandleRsp_t, status)) ;
2532 OSSA_READ_LE_32(AGROOT, &deviceIdx, pIomb, OSSA_OFFSET_OF(agsaDeregDevHandleRsp_t, deviceId)) ;
2533 /* get request from IOMap */
2535 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2536 if (agNULL == pRequest)
2538 SA_DBG1(("mpiDeregDevHandleRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x deviceIdx 0x%x\n", tag, status,deviceIdx));
2539 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2r");
2540 return AGSA_RC_FAILURE;
2543 agContext = saRoot->IOMap[tag].agContext;
2544 /* remove the request from IOMap */
2545 saRoot->IOMap[tag].Tag = MARK_OFF;
2546 saRoot->IOMap[tag].IORequest = agNULL;
2547 saRoot->IOMap[tag].agContext = agNULL;
2549 SA_ASSERT((pRequest->valid), "pRequest->valid");
2551 pDevice = pRequest->pDevice;
2552 if (pDevice != agNULL)
2554 if (pDevice->targetDevHandle.sdkData)
2556 agDevHandle = &(pDevice->targetDevHandle);
2560 agDevHandle = &(pDevice->initiatorDevHandle);
2565 SA_DBG1(("mpiDeregDevHandleRsp: pDevice is NULL"));
2566 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2r");
2567 return AGSA_RC_FAILURE;
2570 if (agNULL == agDevHandle)
2572 SA_DBG1(("mpiDeregDevHandleRsp: warning!!! no deviceHandle is found"));
2573 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2r");
2575 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2576 pRequest->valid = agFALSE;
2577 /* return the request to free pool */
2578 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2580 SA_DBG1(("mpiDeregDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
2581 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2585 /* return the request to free pool */
2586 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2588 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2590 return AGSA_RC_FAILURE;
2593 SA_DBG1(("mpiDeregDevHandleRsp: deviceID 0x%x Device Context %p\n", pDevice->DeviceMapIndex, pDevice));
2595 if (agNULL == saRoot->DeviceDeregistrationCB)
2597 SA_DBG1(("mpiDeregDevHandleRsp: warning!!! no DeviceDeregistrationCB is found"));
2598 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2r");
2600 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2601 pRequest->valid = agFALSE;
2602 /* return the request to free pool */
2603 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2605 SA_DBG1(("mpiDeregDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
2606 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2610 /* return the request to free pool */
2611 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2613 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2615 return AGSA_RC_FAILURE;
2621 (*(ossaDeregisterDeviceHandleCB_t)(saRoot->DeviceDeregistrationCB))(agRoot,
2626 siRemoveDevHandle(agRoot, agDevHandle);
2628 case OSSA_ERR_DEVICE_HANDLE_INVALID:
2629 case OSSA_INVALID_HANDLE:
2630 (*(ossaDeregisterDeviceHandleCB_t)(saRoot->DeviceDeregistrationCB))(agRoot,
2635 // already removed and no device to remove
2636 // siRemoveDevHandle(agRoot, agDevHandle);
2637 SA_DBG1(("mpiDeregDevRegRsp, OSSA_INVALID_HANDLE status in response %d\n", status));
2639 case OSSA_ERR_DEVICE_BUSY:
2640 (*(ossaDeregisterDeviceHandleCB_t)(saRoot->DeviceDeregistrationCB))(agRoot,
2645 SA_DBG1(("mpiDeregDevRegRsp, OSSA_ERR_DEVICE_BUSY status in response %d\n", status));
2649 SA_DBG1(("mpiDeregDevRegRsp, unknown status in response 0x%X\n", status));
2653 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2654 pRequest->valid = agFALSE;
2655 /* return the request to free pool */
2656 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2658 SA_DBG1(("mpiDeregDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
2659 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2663 /* return the request to free pool */
2664 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2666 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2668 smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2r");
2673 /******************************************************************************/
2674 /*! \brief Get Phy Profile Response SPCv
2676 * This routine handles the response of Get Phy Profile Command Response
2678 * \param agRoot Handles for this instance of SAS/SATA LLL
2679 * \param pIomb Pointer of IOMB Message
2681 * \return sucess or fail
2684 /*******************************************************************************/
2686 GLOBAL bit32 mpiGetPhyProfileRsp(
2688 agsaGetPhyProfileRspV_t *pIomb
2691 bit32 ret = AGSA_RC_SUCCESS;
2692 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2693 agsaIORequestDesc_t *pRequest;
2694 agsaContext_t *agContext;
2697 bit32 Reserved_SOP_PHYID;
2701 smTraceFuncEnter(hpDBG_VERY_LOUD,"2J");
2702 OSSA_READ_LE_32(agRoot, &status, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t, status));
2703 OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t, tag));
2705 SA_DBG1(("mpiGetPhyProfileRsp: HTag=0x%x\n", tag));
2707 /* get request from IOMap */
2708 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2709 if (agNULL == pRequest)
2711 SA_DBG1(("mpiGetPhyProfileRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
2712 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2J");
2713 return AGSA_RC_FAILURE;
2716 agContext = saRoot->IOMap[tag].agContext;
2718 OSSA_READ_LE_32(agRoot, &Reserved_SOP_PHYID, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,Reserved_Ppc_SOP_PHYID ));
2720 /* remove the request from IOMap */
2721 saRoot->IOMap[tag].Tag = MARK_OFF;
2722 saRoot->IOMap[tag].IORequest = agNULL;
2723 saRoot->IOMap[tag].agContext = agNULL;
2725 SA_ASSERT((pRequest->valid), "pRequest->valid");
2726 SA_DBG1(("mpiGetPhyProfileRsp: %p\n",pIomb));
2727 SA_DBG1(("mpiGetPhyProfileRsp: completionCB %p\n",pRequest->completionCB ));
2729 SOP = (Reserved_SOP_PHYID & 0xFF00) >> SHIFT8;
2730 PhyId = Reserved_SOP_PHYID & 0xFF;
2732 /* check status success or failure */
2735 /* status is FAILED */
2736 SA_DBG1(("mpiGetPhyProfileRsp:AGSA_RC_FAILURE 0x%08X\n", status));
2739 case AGSA_SAS_PHY_ERR_COUNTERS_PAGE:
2741 SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ERR_COUNTERS_PAGE SOP 0x%x\n", SOP));
2742 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2745 case AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE:
2747 SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE SOP 0x%x\n", SOP));
2748 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2751 case AGSA_SAS_PHY_BW_COUNTERS_PAGE:
2753 SA_DBG1(("mpiGetPhyProfileRsp: GET_SAS_PHY_BW_COUNTERS SOP 0x%x\n", SOP));
2754 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2757 case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
2759 SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE SOP 0x%x\n", SOP));
2760 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2763 case AGSA_SAS_PHY_GENERAL_STATUS_PAGE:
2765 SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_GENERAL_STATUS_PAGE SOP 0x%x\n", SOP));
2766 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2769 case AGSA_PHY_SNW3_PAGE:
2771 SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_SNW3_PAGE SOP 0x%x\n", SOP));
2772 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2775 case AGSA_PHY_RATE_CONTROL_PAGE:
2777 SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_RATE_CONTROL_PAGE SOP 0x%x\n", SOP));
2778 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2781 case AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE:
2783 SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE SOP 0x%x\n", SOP));
2784 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
2789 SA_DBG1(("mpiGetPhyProfileRsp: undefined SOP 0x%x\n", SOP));
2793 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2J");
2794 return AGSA_RC_FAILURE;
2798 SA_DBG1(("mpiGetPhyProfileRsp: SUCCESS type 0x%X\n",SOP ));
2801 case AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE:
2802 /* call back with the status */
2803 SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE PhyId %d\n",PhyId));
2804 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL);
2806 case AGSA_SAS_PHY_ERR_COUNTERS_PAGE:
2809 agsaPhyErrCountersPage_t Errors;
2811 OSSA_READ_LE_32(agRoot, &Errors.invalidDword, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2812 OSSA_READ_LE_32(agRoot, &Errors.runningDisparityError, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2813 OSSA_READ_LE_32(agRoot, &Errors.codeViolation, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
2814 OSSA_READ_LE_32(agRoot, &Errors.lossOfDwordSynch, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[3] ));
2815 OSSA_READ_LE_32(agRoot, &Errors.phyResetProblem, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[4] ));
2816 OSSA_READ_LE_32(agRoot, &Errors.inboundCRCError, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[5] ));
2818 /* call back with the status */
2819 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &Errors);
2820 /* status is SUCCESS */
2822 SA_DBG3(("mpiGetPhyProfileRsp: pIomb %p\n",pIomb));
2823 SA_DBG1(("mpiGetPhyProfileRsp: Reserved_SOP_PHYID 0x%08X\n",Reserved_SOP_PHYID));
2824 SA_DBG1(("mpiGetPhyProfileRsp: invalidDword 0x%08X\n",Errors.invalidDword ));
2825 SA_DBG1(("mpiGetPhyProfileRsp: runningDisparityError 0x%08X\n",Errors.runningDisparityError ));
2826 SA_DBG1(("mpiGetPhyProfileRsp: codeViolation 0x%08X\n",Errors.codeViolation ));
2827 SA_DBG1(("mpiGetPhyProfileRsp: lossOfDwordSynch 0x%08X\n",Errors.lossOfDwordSynch ));
2828 SA_DBG1(("mpiGetPhyProfileRsp: phyResetProblem 0x%08X\n",Errors.phyResetProblem ));
2829 SA_DBG1(("mpiGetPhyProfileRsp: inboundCRCError 0x%08X\n",Errors.inboundCRCError ));
2833 case AGSA_SAS_PHY_BW_COUNTERS_PAGE:
2836 agsaPhyBWCountersPage_t bw_counts;
2837 OSSA_READ_LE_32(agRoot, &bw_counts.TXBWCounter, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2838 OSSA_READ_LE_32(agRoot, &bw_counts.RXBWCounter, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2840 SA_DBG1(("mpiGetPhyProfileRsp: GET_SAS_PHY_BW_COUNTERS TX 0x%08X RX 0x%08X\n",bw_counts.TXBWCounter,bw_counts.RXBWCounter));
2841 /* call back with the status */
2842 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, &bw_counts);
2845 case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
2847 agsaPhyAnalogSettingsPage_t analog;
2849 SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE 0x%X\n",SOP));
2850 OSSA_READ_LE_32(agRoot, &analog.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2851 OSSA_READ_LE_32(agRoot, &analog.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2852 OSSA_READ_LE_32(agRoot, &analog.Dword2, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
2853 OSSA_READ_LE_32(agRoot, &analog.Dword3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[3] ));
2854 OSSA_READ_LE_32(agRoot, &analog.Dword4, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[4] ));
2855 /* call back with the status */
2856 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, &analog);
2860 case AGSA_SAS_PHY_GENERAL_STATUS_PAGE:
2862 agsaSASPhyGeneralStatusPage_t GenStatus;
2863 OSSA_READ_LE_32(agRoot, &GenStatus.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2864 OSSA_READ_LE_32(agRoot, &GenStatus.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2865 SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_GENERAL_STATUS_PAGE SOP 0x%x 0x%x 0x%x\n", SOP,GenStatus.Dword0,GenStatus.Dword1));
2866 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &GenStatus );
2869 case AGSA_PHY_SNW3_PAGE:
2871 agsaPhySNW3Page_t Snw3;
2872 OSSA_READ_LE_32(agRoot, &Snw3.LSNW3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2873 OSSA_READ_LE_32(agRoot, &Snw3.RSNW3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2875 SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_SNW3_PAGE SOP 0x%x\n", SOP));
2876 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &Snw3 );
2879 case AGSA_PHY_RATE_CONTROL_PAGE:
2881 agsaPhyRateControlPage_t RateControl;
2882 OSSA_READ_LE_32(agRoot, &RateControl.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2883 OSSA_READ_LE_32(agRoot, &RateControl.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2884 OSSA_READ_LE_32(agRoot, &RateControl.Dword2, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
2885 SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_RATE_CONTROL_PAGE SOP 0x%x\n", SOP));
2886 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &RateControl );
2889 case AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE:
2891 agsaSASPhyOpenRejectRetryBackOffThresholdPage_t Backoff;
2892 OSSA_READ_LE_32(agRoot, &Backoff.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
2893 OSSA_READ_LE_32(agRoot, &Backoff.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
2894 OSSA_READ_LE_32(agRoot, &Backoff.Dword2, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
2895 OSSA_READ_LE_32(agRoot, &Backoff.Dword3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[3] ));
2896 SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE SOP 0x%x\n", SOP));
2897 ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &Backoff );
2902 SA_DBG1(("mpiGetPhyProfileRsp: undefined successful SOP 0x%x\n", SOP));
2909 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2910 pRequest->valid = agFALSE;
2911 /* return the request to free pool */
2912 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
2914 SA_DBG1(("mpiGetPhyProfileRsp: saving pRequest (%p) for later use\n", pRequest));
2915 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
2919 /* return the request to free pool */
2920 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2922 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2925 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2J");
2930 GLOBAL bit32 mpiSetPhyProfileRsp(
2932 agsaSetPhyProfileRspV_t *pIomb
2935 bit32 ret = AGSA_RC_SUCCESS;
2936 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2937 agsaIORequestDesc_t *pRequest;
2938 agsaContext_t *agContext;
2941 bit32 Reserved_Ppc_PHYID;
2945 smTraceFuncEnter(hpDBG_VERY_LOUD,"2Q");
2946 OSSA_READ_LE_32(agRoot, &status, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t, status));
2947 OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t, tag));
2948 OSSA_READ_LE_32(agRoot, &Reserved_Ppc_PHYID, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t, Reserved_Ppc_PHYID));
2950 SA_DBG1(("mpiSetPhyProfileRsp: HTag=0x%x\n", tag));
2952 /* get request from IOMap */
2953 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
2954 if (agNULL == pRequest)
2956 SA_DBG1(("mpiSetPhyProfileRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
2957 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2Q");
2958 return AGSA_RC_FAILURE;
2961 agContext = saRoot->IOMap[tag].agContext;
2963 /* remove the request from IOMap */
2964 saRoot->IOMap[tag].Tag = MARK_OFF;
2965 saRoot->IOMap[tag].IORequest = agNULL;
2966 saRoot->IOMap[tag].agContext = agNULL;
2968 SA_DBG1(("mpiSetPhyProfileRsp: %p\n",pIomb));
2970 SOP = pRequest->SOP;
2971 PhyId = Reserved_Ppc_PHYID & 0xFF;
2973 /* check status success or failure */
2976 /* status is FAILED */
2977 SA_DBG1(("mpiSetPhyProfileRsp:AGSA_RC_FAILURE 0x%08X\n", status));
2980 case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
2982 SA_DBG1(("mpiSetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE SOP 0x%x\n", SOP));
2983 ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
2986 case AGSA_PHY_SNW3_PAGE:
2988 SA_DBG1(("mpiSetPhyProfileRsp: AGSA_PHY_SNW3_PAGE SOP 0x%x\n", SOP));
2989 ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
2993 case AGSA_PHY_RATE_CONTROL_PAGE:
2995 SA_DBG1(("mpiSetPhyProfileRsp: AGSA_PHY_RATE_CONTROL_PAGE SOP 0x%x\n", SOP));
2996 ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
2999 case AGSA_SAS_PHY_MISC_PAGE:
3001 SA_DBG1(("mpiSetPhyProfileRsp: AGSA_SAS_PHY_MISC_PAGE SOP 0x%x\n", SOP));
3002 ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
3008 SA_DBG1(("mpiSetPhyProfileRsp: undefined SOP 0x%x\n", SOP));
3012 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2Q");
3013 return AGSA_RC_FAILURE;
3017 SA_DBG1(("mpiSetPhyProfileRsp: SUCCESS type 0x%X\n",SOP ));
3020 case AGSA_PHY_SNW3_PAGE:
3021 case AGSA_PHY_RATE_CONTROL_PAGE:
3023 SA_DBG1(("mpiSetPhyProfileRsp: Status 0x%x SOP 0x%x PhyId %d\n",status, SOP, PhyId));
3024 ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
3028 case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
3030 agsaPhyAnalogSettingsPage_t analog;
3032 SA_DBG1(("mpiSetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE 0x%X\n",SOP));
3033 OSSA_READ_LE_32(agRoot, &analog.Dword0, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[0] ));
3034 OSSA_READ_LE_32(agRoot, &analog.Dword1, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[1] ));
3035 OSSA_READ_LE_32(agRoot, &analog.Dword2, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[2] ));
3036 OSSA_READ_LE_32(agRoot, &analog.Dword3, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[3] ));
3037 OSSA_READ_LE_32(agRoot, &analog.Dword4, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[4] ));
3038 /* call back with the status */
3039 ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, &analog );
3044 SA_DBG1(("mpiSetPhyProfileRsp: undefined successful SOP 0x%x\n", SOP));
3051 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3052 SA_ASSERT((pRequest->valid), "pRequest->valid");
3053 SA_DBG1(("mpiSetPhyProfileRsp: completionCB %p\n",pRequest->completionCB ));
3055 pRequest->valid = agFALSE;
3056 /* return the request to free pool */
3057 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3059 SA_DBG1(("mpiSetPhyProfileRsp: saving pRequest (%p) for later use\n", pRequest));
3060 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3064 /* return the request to free pool */
3065 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3067 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3070 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2Q");
3076 /******************************************************************************/
3077 /*! \brief Get Device Information Response
3079 * This routine handles the response of Get Device Info Command Response
3081 * \param agRoot Handles for this instance of SAS/SATA LLL
3082 * \param pIomb Pointer of IOMB Message
3084 * \return sucess or fail
3087 /*******************************************************************************/
3088 GLOBAL bit32 mpiGetDevInfoRsp(
3090 agsaGetDevInfoRspV_t *pIomb
3093 bit32 ret = AGSA_RC_SUCCESS;
3094 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
3095 agsaIORequestDesc_t *pRequest;
3096 agsaDevHandle_t *agDevHandle;
3097 agsaDeviceDesc_t *pDevice;
3098 agsaContext_t *agContext;
3099 agsaDeviceInfo_t commonDevInfo;
3100 bit32 ARSrateSMPTimeOutPortID, IRMcnITNexusTimeOut, status, tag;
3104 #if defined(SALLSDK_DEBUG)
3106 #endif /* SALLSDK_DEBUG */
3108 smTraceFuncEnter(hpDBG_VERY_LOUD,"2M");
3109 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, status));
3110 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, tag));
3112 SA_DBG3(("mpiGetDevInfoRsp: HTag=0x%x\n", tag));
3114 /* get request from IOMap */
3115 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
3116 if (agNULL == pRequest)
3118 SA_DBG1(("mpiGetDevInfoRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
3119 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2M");
3120 return AGSA_RC_FAILURE;
3123 agContext = saRoot->IOMap[tag].agContext;
3125 /* remove the request from IOMap */
3126 saRoot->IOMap[tag].Tag = MARK_OFF;
3127 saRoot->IOMap[tag].IORequest = agNULL;
3128 saRoot->IOMap[tag].agContext = agNULL;
3130 SA_ASSERT((pRequest->valid), "pRequest->valid");
3132 /* check status success or failure */
3135 /* status is FAILED */
3136 ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
3137 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2M");
3139 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3140 pRequest->valid = agFALSE;
3141 #if defined(SALLSDK_DEBUG)
3142 option = (bit32)pRequest->DeviceInfoCmdOption;
3143 #endif /* SALLSDK_DEBUG */
3144 /* return the request to free pool */
3145 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3147 SA_DBG1(("mpiGetDevInfoRsp: saving pRequest (%p) for later use\n", pRequest));
3148 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3152 /* return the request to free pool */
3153 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3155 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3157 return AGSA_RC_FAILURE;
3160 /* status is SUCCESS */
3161 OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, deviceId));
3162 OSSA_READ_LE_32(AGROOT, &ARSrateSMPTimeOutPortID, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, ARSrateSMPTimeOutPortID));
3163 OSSA_READ_LE_32(AGROOT, &IRMcnITNexusTimeOut, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, IRMcnITNexusTimeOut));
3164 OSSA_READ_LE_32(AGROOT, &sasAddrHi, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t,sasAddrHi[0] ));
3165 OSSA_READ_LE_32(AGROOT, &sasAddrLow, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t,sasAddrLow[0] ));
3167 /* find device handle from device index */
3168 pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
3169 if (pDevice != agNULL)
3171 if (pDevice->targetDevHandle.sdkData)
3173 agDevHandle = &(pDevice->targetDevHandle);
3177 agDevHandle = &(pDevice->initiatorDevHandle);
3182 SA_DBG1(("mpiGetDevInfoRsp: pDevice is NULL"));
3183 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2M");
3184 return AGSA_RC_FAILURE;
3187 if (agDevHandle == agNULL)
3189 SA_DBG1(("mpiGetDevInfoRsp: warning!!! no deviceHandle is found"));
3190 ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
3191 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2M");
3193 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3194 pRequest->valid = agFALSE;
3195 #if defined(SALLSDK_DEBUG)
3196 option = (bit32)pRequest->DeviceInfoCmdOption;
3197 #endif /* SALLSDK_DEBUG */
3198 /* return the request to free pool */
3199 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3201 SA_DBG1(("mpiGetDevInfoRsp: saving pRequest (%p) for later use\n", pRequest));
3202 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3206 /* return the request to free pool */
3207 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3209 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3211 return AGSA_RC_FAILURE;
3214 /* setup common device information */
3215 si_memset(&commonDevInfo, 0, sizeof(agsaDeviceInfo_t));
3216 commonDevInfo.smpTimeout = (bit16)((ARSrateSMPTimeOutPortID >> SHIFT8 ) & SMPTO_VBITS);
3217 commonDevInfo.it_NexusTimeout = (bit16)(IRMcnITNexusTimeOut & NEXUSTO_VBITS);
3218 commonDevInfo.firstBurstSize = (bit16)((IRMcnITNexusTimeOut >> SHIFT16) & FIRST_BURST_MCN);
3219 commonDevInfo.devType_S_Rate = (bit8)((ARSrateSMPTimeOutPortID >> SHIFT24) & 0x3f);
3220 commonDevInfo.flag = (bit32)((ARSrateSMPTimeOutPortID >> SHIFT30 ) & FLAG_VBITS);
3221 commonDevInfo.flag |= IRMcnITNexusTimeOut & 0xf0000;
3222 if (IRMcnITNexusTimeOut & 0x1000000)
3224 commonDevInfo.flag |= 0x100000;
3227 /* check SAS device then copy SAS Address */
3228 if ( ((ARSrateSMPTimeOutPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x00) ||
3229 ((ARSrateSMPTimeOutPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x01))
3231 /* copy the sasAddressHi byte-by-byte : no endianness */
3232 commonDevInfo.sasAddressHi[0] = pIomb->sasAddrHi[0];
3233 commonDevInfo.sasAddressHi[1] = pIomb->sasAddrHi[1];
3234 commonDevInfo.sasAddressHi[2] = pIomb->sasAddrHi[2];
3235 commonDevInfo.sasAddressHi[3] = pIomb->sasAddrHi[3];
3237 /* copy the sasAddressLow byte-by-byte : no endianness */
3238 commonDevInfo.sasAddressLo[0] = pIomb->sasAddrLow[0];
3239 commonDevInfo.sasAddressLo[1] = pIomb->sasAddrLow[1];
3240 commonDevInfo.sasAddressLo[2] = pIomb->sasAddrLow[2];
3241 commonDevInfo.sasAddressLo[3] = pIomb->sasAddrLow[3];
3244 /* copy common device information to SAS and SATA device common header*/
3245 si_memcpy(&pDevice->devInfo.sasDeviceInfo.commonDevInfo, &commonDevInfo, sizeof(agsaDeviceInfo_t));
3246 si_memcpy(&pDevice->devInfo.sataDeviceInfo.commonDevInfo, &commonDevInfo, sizeof(agsaDeviceInfo_t));
3248 /* setup device firstBurstSize infomation */
3249 pDevice->devInfo.sataDeviceInfo.commonDevInfo.firstBurstSize =
3250 (bit16)((IRMcnITNexusTimeOut >> SHIFT16) & FIRST_BURST);
3252 /* Display Device Information */
3253 SA_DBG3(("mpiGetDevInfoRsp: smpTimeout=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.smpTimeout));
3254 SA_DBG3(("mpiGetDevInfoRsp: it_NexusTimeout=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.it_NexusTimeout));
3255 SA_DBG3(("mpiGetDevInfoRsp: firstBurstSize=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.firstBurstSize));
3256 SA_DBG3(("mpiGetDevInfoRsp: devType_S_Rate=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate));
3259 D518 P2I[15-12]: Disk HP DG0146FAMWL , HPDE, WWID=5000c500:17459a31, 6.0G
3262 SA_DBG1(("mpiGetDevInfoRsp: Device 0x%08X flag 0x%08X %s WWID= %02x%02x%02x%02x:%02x%02x%02x%02x, %s\n",
3264 pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag,
3265 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x20 ? "SATA DA" :
3266 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x10 ? "SSP/SMP" :
3267 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x0 ? " STP " : "Unknown",
3269 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3],
3270 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2],
3271 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1],
3272 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0],
3273 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3],
3274 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2],
3275 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1],
3276 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0],
3278 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 8 ? " 1.5G" :
3279 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 9 ? " 3.0G" :
3280 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 10 ? " 6.0G" :
3281 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 11 ? "12.0G" : "????" ));
3283 ossaGetDeviceInfoCB(agRoot, agContext, agDevHandle, OSSA_DEV_INFO_NO_EXTENDED_INFO, &commonDevInfo);
3285 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3286 pRequest->valid = agFALSE;
3287 #if defined(SALLSDK_DEBUG)
3288 option = (bit32)pRequest->DeviceInfoCmdOption;
3289 #endif /* SALLSDK_DEBUG */
3290 /* return the request to free pool */
3291 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3293 SA_DBG1(("mpiGetDevInfoRsp: saving pRequest (%p) for later use\n", pRequest));
3294 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3298 /* return the request to free pool */
3299 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3301 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3304 smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2M");
3308 /******************************************************************************/
3309 /*! \brief Get Device Information Response
3311 * This routine handles the response of Get Device Info Command Response
3313 * \param agRoot Handles for this instance of SAS/SATA LLL
3314 * \param pIomb Pointer of IOMB Message
3316 * \return sucess or fail
3319 /*******************************************************************************/
3320 GLOBAL bit32 mpiGetDevInfoRspSpc(
3322 agsaGetDevInfoRsp_t *pIomb
3325 bit32 ret = AGSA_RC_SUCCESS;
3326 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
3327 agsaIORequestDesc_t *pRequest;
3328 agsaDevHandle_t *agDevHandle;
3329 agsaDeviceDesc_t *pDevice;
3330 agsaContext_t *agContext;
3331 bit32 dTypeSrateSMPTOPortID, FirstBurstSizeITNexusTimeOut, status, tag;
3335 bit32 Info_avail = 0;
3337 smTraceFuncEnter(hpDBG_VERY_LOUD,"2t");
3338 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, status));
3339 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, tag));
3341 SA_DBG3(("mpiGetDevInfoRspSpc: HTag=0x%x\n", tag));
3343 /* get request from IOMap */
3344 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
3345 if (agNULL == pRequest)
3347 SA_DBG1(("mpiGetDevInfoRspSpc: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
3348 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2t");
3349 return AGSA_RC_FAILURE;
3352 agContext = saRoot->IOMap[tag].agContext;
3354 /* remove the request from IOMap */
3355 saRoot->IOMap[tag].Tag = MARK_OFF;
3356 saRoot->IOMap[tag].IORequest = agNULL;
3357 saRoot->IOMap[tag].agContext = agNULL;
3359 SA_ASSERT((pRequest->valid), "pRequest->valid");
3361 /* check status success or failure */
3364 /* status is FAILED */
3365 ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
3366 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2t");
3367 return AGSA_RC_FAILURE;
3370 /* status is SUCCESS */
3371 OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, deviceId));
3372 OSSA_READ_LE_32(AGROOT, &dTypeSrateSMPTOPortID, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, dTypeSrateSMPTOArPortID));
3373 OSSA_READ_LE_32(AGROOT, &FirstBurstSizeITNexusTimeOut, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, FirstBurstSizeITNexusTimeOut));
3374 OSSA_READ_LE_32(AGROOT, &sasAddrHi, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, sasAddrHi[0]));
3375 OSSA_READ_LE_32(AGROOT, &sasAddrLow, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, sasAddrLow[0]));
3378 SA_DBG2(("mpiGetDevInfoRspSpc:deviceid 0x%08X\n",deviceid));
3379 SA_DBG2(("mpiGetDevInfoRspSpc:dTypeSrateSMPTOPortID 0x%08X\n",dTypeSrateSMPTOPortID));
3380 SA_DBG2(("mpiGetDevInfoRspSpc:FirstBurstSizeITNexusTimeOut 0x%08X\n",FirstBurstSizeITNexusTimeOut));
3381 SA_DBG2(("mpiGetDevInfoRspSpc:sasAddrHi 0x%08X\n",sasAddrHi));
3382 SA_DBG2(("mpiGetDevInfoRspSpc:sasAddrLow 0x%08X\n",sasAddrLow));
3385 /* find device handle from device index */
3386 pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
3387 if (pDevice != agNULL)
3389 if (pDevice->targetDevHandle.sdkData)
3391 agDevHandle = &(pDevice->targetDevHandle);
3395 agDevHandle = &(pDevice->initiatorDevHandle);
3400 SA_DBG1(("mpiGetDevInfoRspSpc: pDevice is NULL"));
3401 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2t");
3402 return AGSA_RC_FAILURE;
3405 if (agDevHandle == agNULL)
3407 SA_DBG1(("mpiGetDevInfoRspSpc: warning!!! no deviceHandle is found"));
3408 ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
3409 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2t");
3411 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3412 pRequest->valid = agFALSE;
3413 /* return the request to free pool */
3414 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3416 SA_DBG1(("mpiGetDevInfoRspSpc: saving pRequest (%p) for later use\n", pRequest));
3417 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3421 /* return the request to free pool */
3422 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3424 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3426 return AGSA_RC_FAILURE;
3429 Info_avail = OSSA_DEV_INFO_NO_EXTENDED_INFO;
3431 /* setup device common infomation */
3432 pDevice->devInfo.sasDeviceInfo.commonDevInfo.smpTimeout =
3433 (bit16)((dTypeSrateSMPTOPortID >> SHIFT8 ) & SMPTO_BITS);
3435 pDevice->devInfo.sataDeviceInfo.commonDevInfo.smpTimeout =
3436 (bit16)((dTypeSrateSMPTOPortID >> SHIFT8 ) & SMPTO_BITS);
3438 pDevice->devInfo.sasDeviceInfo.commonDevInfo.it_NexusTimeout =
3439 (bit16)(FirstBurstSizeITNexusTimeOut & NEXUSTO_BITS);
3441 pDevice->devInfo.sataDeviceInfo.commonDevInfo.it_NexusTimeout =
3442 (bit16)(FirstBurstSizeITNexusTimeOut & NEXUSTO_BITS);
3444 pDevice->devInfo.sasDeviceInfo.commonDevInfo.firstBurstSize =
3445 (bit16)((FirstBurstSizeITNexusTimeOut >> SHIFT16) & FIRST_BURST);
3447 pDevice->devInfo.sataDeviceInfo.commonDevInfo.firstBurstSize =
3448 (bit16)((FirstBurstSizeITNexusTimeOut >> SHIFT16) & FIRST_BURST);
3450 pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag = (bit32)((dTypeSrateSMPTOPortID >> SHIFT4 ) & FLAG_BITS);
3452 pDevice->devInfo.sataDeviceInfo.commonDevInfo.flag = (bit32)((dTypeSrateSMPTOPortID >> SHIFT4 ) & FLAG_BITS);
3454 pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate =
3455 (bit8)((dTypeSrateSMPTOPortID >> SHIFT24) & LINK_RATE_BITS);
3457 pDevice->devInfo.sataDeviceInfo.commonDevInfo.devType_S_Rate =
3458 (bit8)((dTypeSrateSMPTOPortID >> SHIFT24) & LINK_RATE_BITS);
3460 /* check SAS device then copy SAS Address */
3461 if ( ((dTypeSrateSMPTOPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x00) ||
3462 ((dTypeSrateSMPTOPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x01))
3464 /* copy the sasAddressHi byte-by-byte : no endianness */
3465 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0] = pIomb->sasAddrHi[0];
3466 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1] = pIomb->sasAddrHi[1];
3467 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2] = pIomb->sasAddrHi[2];
3468 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3] = pIomb->sasAddrHi[3];
3470 /* copy the sasAddressLow byte-by-byte : no endianness */
3471 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0] = pIomb->sasAddrLow[0];
3472 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1] = pIomb->sasAddrLow[1];
3473 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2] = pIomb->sasAddrLow[2];
3474 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3] = pIomb->sasAddrLow[3];
3477 /* Display Device Information */
3478 SA_DBG3(("mpiGetDevInfoRspSpc: smpTimeout= 0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.smpTimeout));
3479 SA_DBG3(("mpiGetDevInfoRspSpc: it_NexusTimeout=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.it_NexusTimeout));
3480 SA_DBG3(("mpiGetDevInfoRspSpc: firstBurstSize= 0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.firstBurstSize));
3481 SA_DBG3(("mpiGetDevInfoRspSpc: devType_S_Rate= 0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate));
3484 SA_DBG1(("Device SPC deviceid 0x%08X flag 0x%08X %s WWID= %02x%02x%02x%02x:%02x%02x%02x%02x, %s\n",
3486 pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag,
3487 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x20 ? "SATA DA" :
3488 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x10 ? "SSP/SMP" :
3489 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x0 ? " STP " : "Unknown",
3491 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3],
3492 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2],
3493 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1],
3494 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0],
3495 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3],
3496 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2],
3497 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1],
3498 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0],
3500 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 8 ? " 1.5G" :
3501 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 9 ? " 3.0G" :
3502 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 10 ? " 6.0G" :
3503 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 11 ? "12.0G" : "????" ));
3505 ossaGetDeviceInfoCB(agRoot, agContext, agDevHandle, Info_avail, &pDevice->devInfo.sasDeviceInfo.commonDevInfo);
3507 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3508 pRequest->valid = agFALSE;
3509 /* return the request to free pool */
3510 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
3512 SA_DBG1(("mpiGetDevInfoRspSpc: saving pRequest (%p) for later use\n", pRequest));
3513 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3517 /* return the request to free pool */
3518 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3520 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3523 smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2t");
3527 /******************************************************************************/
3528 /*! \brief Set Device Information Response
3530 * This routine handles the response of Set Device Info Command Response
3532 * \param agRoot Handles for this instance of SAS/SATA LLL
3533 * \param pIomb Pointer of IOMB Message
3535 * \return sucess or fail
3538 /*******************************************************************************/
3539 GLOBAL bit32 mpiSetDevInfoRsp(
3541 agsaSetDeviceInfoRsp_t *pIomb
3544 bit32 ret = AGSA_RC_SUCCESS;
3545 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
3546 agsaIORequestDesc_t *pRequest;
3547 agsaDevHandle_t *agDevHandle;
3548 agsaDeviceDesc_t *pDevice;
3549 agsaContext_t *agContext;
3550 bit32 tag, status, deviceid, option, param;
3552 smTraceFuncEnter(hpDBG_VERY_LOUD,"2v");
3553 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, status));
3554 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, tag));
3556 SA_DBG3(("mpiSetDevInfoRsp: HTag=0x%x\n", tag));
3558 /* get request from IOMap */
3559 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
3560 if (agNULL == pRequest)
3562 SA_DBG1(("mpiSetDevInfoRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
3563 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2v");
3564 return AGSA_RC_FAILURE;
3567 agContext = saRoot->IOMap[tag].agContext;
3569 /* remove the request from IOMap */
3570 saRoot->IOMap[tag].Tag = MARK_OFF;
3571 saRoot->IOMap[tag].IORequest = agNULL;
3572 saRoot->IOMap[tag].agContext = agNULL;
3574 SA_ASSERT((pRequest->valid), "pRequest->valid");
3575 /* check status success or failure */
3578 /* status is FAILED */
3579 if (pRequest->completionCB == agNULL)
3581 SA_DBG1(("mpiSetDevInfoRsp: status is FAILED pRequest->completionCB == agNULL\n" ));
3582 ossaSetDeviceInfoCB(agRoot, agContext, agNULL, status, 0, 0);
3586 SA_DBG1(("mpiSetDevInfoRsp: status is FAILED use CB\n" ));
3587 (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agNULL, status, 0, 0);
3589 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2v");
3591 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3592 pRequest->valid = agFALSE;
3593 /* return the request to free pool */
3594 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3595 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3597 return AGSA_RC_FAILURE;
3600 /* status is SUCCESS */
3601 OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, deviceId));
3602 OSSA_READ_LE_32(AGROOT, &option, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, SA_SR_SI));
3603 OSSA_READ_LE_32(AGROOT, ¶m, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, A_R_ITNT));
3605 /* find device handle from device index */
3606 pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
3607 if (pDevice != agNULL)
3609 if (pDevice->targetDevHandle.sdkData)
3611 agDevHandle = &(pDevice->targetDevHandle);
3615 agDevHandle = &(pDevice->initiatorDevHandle);
3620 SA_DBG1(("mpiSetDevInfoRsp: pDevice is NULL"));
3621 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3622 pRequest->valid = agFALSE;
3623 /* return the request to free pool */
3624 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3625 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3626 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2v");
3627 return AGSA_RC_FAILURE;
3630 if (agDevHandle == agNULL)
3632 SA_DBG1(("mpiSetDevInfoRsp: warning!!! no deviceHandle is found"));
3633 if (pRequest->completionCB == agNULL)
3635 ossaSetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0, 0);
3639 (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0, 0);
3641 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2v");
3643 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3644 pRequest->valid = agFALSE;
3645 /* return the request to free pool */
3646 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3647 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3649 return AGSA_RC_FAILURE;
3652 SA_DBG2(("mpiSetDevInfoRsp:, option 0x%X param 0x%X\n", option, param));
3654 if(smIS_SPCV(agRoot))
3656 SA_DBG2(("mpiSetDevInfoRsp:was option 0x%X param 0x%X\n", option, param));
3657 SA_DBG2(("mpiSetDevInfoRsp:pDevice->option 0x%X pDevice->param 0x%X\n", pDevice->option, pDevice->param));
3658 option |= pDevice->option;
3659 param |= pDevice->param;
3660 SA_DBG2(("mpiSetDevInfoRsp:now option 0x%X param 0x%X\n", option, param));
3661 if (pRequest->completionCB == agNULL)
3663 ossaSetDeviceInfoCB(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
3667 (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
3672 SA_DBG2(("mpiSetDevInfoRsp:, option 0x%X param 0x%X\n", option, param));
3673 if (pRequest->completionCB == agNULL)
3675 ossaSetDeviceInfoCB(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
3679 (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
3683 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3684 pRequest->valid = agFALSE;
3685 /* return the request to free pool */
3686 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3687 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3690 smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2v");
3694 /******************************************************************************/
3695 /*! \brief SPC MPI SSP Event
3697 * This function handles the SAS Event.
3699 * \param agRoot Handles for this instance of SAS/SATA LLL
3700 * \param pIomb pointer of Message
3702 * \return The read value
3705 /*******************************************************************************/
3706 GLOBAL bit32 mpiSSPEvent(
3708 agsaSSPEventRsp_t *pIomb
3711 bit32 ret = AGSA_RC_SUCCESS;
3712 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
3713 agsaIORequestDesc_t *pRequest;
3714 agsaPortContext_t *agPortContext;
3715 agsaDevHandle_t *agDevHandle;
3716 agsaDeviceDesc_t *pDevice;
3717 bit32 event,deviceId;
3718 bit32 deviceIdx, tag, portId_tmp;
3723 agsaDifDetails_t Dif_details;
3725 smTraceFuncEnter(hpDBG_VERY_LOUD,"2u");
3727 OSSA_READ_LE_32(AGROOT, &event, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, event));
3728 OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, deviceId));
3729 OSSA_READ_LE_32(AGROOT, &portId_tmp, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, portId));
3730 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, tag));
3731 OSSA_READ_LE_32(AGROOT, &SSPTag, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, SSPTag));
3734 sspTag = (bit16)(SSPTag & SSPTAG_BITS);
3736 /* get IORequest from IOMap */
3737 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
3739 SA_ASSERT((pRequest), "pRequest");
3741 if(agNULL == pRequest)
3743 SA_DBG1(("mpiSSPEvent: agNULL == pRequest event 0x%X\n", event));
3744 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2u");
3745 return AGSA_RC_FAILURE;
3748 /* get port context */
3749 portId = (bit8)(portId_tmp & PORTID_MASK);
3750 SA_DBG2(("mpiSSPEvent:PortID 0x%x PortStatus 0x%x PortContext %p\n",saRoot->PortMap[portId & PORTID_MASK].PortID,saRoot->PortMap[portId & PORTID_MASK].PortStatus,saRoot->PortMap[portId & PORTID_MASK].PortContext));
3751 agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
3753 deviceIdx = deviceId & DEVICE_ID_BITS;
3754 OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
3755 /* find device handle from device index */
3756 pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
3758 if( agNULL == pDevice )
3760 OS_ASSERT(pDevice, "pDevice");
3761 agDevHandle = agNULL;
3765 if (pDevice->targetDevHandle.sdkData)
3767 agDevHandle = &(pDevice->targetDevHandle);
3771 agDevHandle = &(pDevice->initiatorDevHandle);
3777 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
3778 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
3779 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
3780 case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
3783 SA_DBG1(("mpiSSPEvent: DIF Event 0x%x HTAG = 0x%x\n", event, tag));
3785 OSSA_READ_LE_32(AGROOT, &Dif_details.UpperLBA, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, EVT_PARAM0_or_LBAH));
3786 OSSA_READ_LE_32(AGROOT, &Dif_details.LowerLBA, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, EVT_PARAM1_or_LBAL));
3787 OSSA_READ_LE_32(AGROOT, &Dif_details.sasAddressHi, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, SAS_ADDRH));
3788 OSSA_READ_LE_32(AGROOT, &Dif_details.sasAddressLo, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, SAS_ADDRL));
3789 OSSA_READ_LE_32(AGROOT, &Dif_details.ExpectedCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT1_E_UDT0_E_CRC_E));
3790 OSSA_READ_LE_32(AGROOT, &Dif_details.ExpectedUDT2345, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT5_E_UDT4_E_UDT3_E_UDT2_E));
3791 OSSA_READ_LE_32(AGROOT, &Dif_details.ActualCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT1_A_UDT0_A_CRC_A));
3792 OSSA_READ_LE_32(AGROOT, &Dif_details.ActualUDT2345, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT5_A_UDT4_A_UDT3_A_UDT2_A));
3793 OSSA_READ_LE_32(AGROOT, &Dif_details.DIFErrDevID, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, HW_DEVID_Reserved_DIF_ERR));
3794 OSSA_READ_LE_32(AGROOT, &Dif_details.ErrBoffsetEDataLen, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, EDATA_LEN_ERR_BOFF));
3796 SA_DBG2(("mpiSSPEvent: UpperLBA. 0x%08X LowerLBA. 0x%08X\n",Dif_details.UpperLBA, Dif_details.LowerLBA));
3797 SA_DBG2(("mpiSSPEvent: sasAddressHi. 0x%02X%02X%02X%02X sasAddressLo. 0x%02X%02X%02X%02X\n",
3798 Dif_details.sasAddressHi[0],Dif_details.sasAddressHi[1],Dif_details.sasAddressHi[2],Dif_details.sasAddressHi[3],
3799 Dif_details.sasAddressLo[0],Dif_details.sasAddressLo[1],Dif_details.sasAddressLo[2],Dif_details.sasAddressLo[3]));
3800 SA_DBG2(("mpiSSPEvent: ExpectedCRCUDT01. 0x%08X ExpectedUDT2345. 0x%08X\n",Dif_details.ExpectedCRCUDT01, Dif_details.ExpectedUDT2345));
3801 SA_DBG2(("mpiSSPEvent: ActualCRCUDT01. 0x%08X ActualUDT2345. 0x%08X\n",Dif_details.ActualCRCUDT01, Dif_details.ActualUDT2345));
3802 SA_DBG2(("mpiSSPEvent: DIFErrDevID. 0x%08X ErrBoffsetEDataLen. 0x%08X\n",Dif_details.DIFErrDevID, Dif_details.ErrBoffsetEDataLen));
3807 SA_DBG3(("mpiSSPEvent: Non DIF event"));
3816 case OSSA_IO_OVERFLOW:
3818 SA_DBG1(("mpiSSPEvent: OSSA_IO_OVERFLOW tag 0x%x ssptag 0x%x\n", tag, sspTag));
3819 saRoot->IoEventCount.agOSSA_IO_OVERFLOW++;
3820 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3823 case OSSA_IO_XFER_ERROR_BREAK:
3825 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_BREAK tag 0x%x ssptag 0x%x\n", tag, sspTag));
3826 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_BREAK++;
3827 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3830 case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
3832 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_PHY_NOT_READY tag 0x%x ssptag 0x%x\n", tag, sspTag));
3833 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
3834 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3837 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
3839 SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3840 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
3841 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3844 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
3846 SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION tag 0x%x ssptag 0x%x\n", tag, sspTag));
3847 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
3848 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3851 case OSSA_IO_OPEN_CNX_ERROR_BREAK:
3853 SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_BREAK tag 0x%x ssptag 0x%x\n", tag, sspTag));
3854 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
3855 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3858 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
3860 SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS tag 0x%x ssptag 0x%x\n", tag, sspTag));
3861 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
3862 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3865 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
3867 SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION tag 0x%x ssptag 0x%x\n", tag, sspTag));
3868 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
3869 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3872 case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
3874 SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3875 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
3876 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3879 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
3881 SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION tag 0x%x ssptag 0x%x\n", tag, sspTag));
3882 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
3883 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3886 case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
3888 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_NAK_RECEIVED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3889 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_NAK_RECEIVED++;
3890 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3893 case OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT:
3895 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT tag 0x%x ssptag 0x%x\n", tag, sspTag));
3896 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT++;
3897 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3900 case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH:
3902 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
3903 #ifdef SA_ENABLE_PCI_TRIGGER
3904 if( saRoot->swConfig.PCI_trigger & PCI_TRIGGER_OFFSET_MISMATCH )
3906 siPCITriger(agRoot);
3908 #endif /* SA_ENABLE_PCI_TRIGGER */
3909 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_OFFSET_MISMATCH++;
3910 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3913 case OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN:
3915 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN tag 0x%x ssptag 0x%x\n", tag, sspTag));
3916 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN++;
3917 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3920 case OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT:
3922 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT tag 0x%x ssptag 0x%x\n", tag, sspTag));
3923 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT++;
3924 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3927 case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
3929 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT tag 0x%x ssptag 0x%x\n", tag, sspTag));
3930 saRoot->IoEventCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
3931 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3934 case OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN:
3936 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN tag 0x%x ssptag 0x%x\n", tag, sspTag));
3937 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN++;
3938 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3941 case OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED:
3943 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3944 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED++;
3945 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3948 case OSSA_IO_XFER_CMD_FRAME_ISSUED:
3950 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3951 saRoot->IoEventCount.agOSSA_IO_XFER_CMD_FRAME_ISSUED++;
3952 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3955 case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE:
3957 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE tag 0x%x ssptag 0x%x\n", tag, sspTag));
3958 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_UNEXPECTED_PHASE++;
3959 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3962 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
3964 SA_DBG1(("mpiSSPEvent:OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x sspTag = 0x%x\n", tag, sspTag));
3965 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
3966 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3969 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
3971 SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO tag 0x%x ssptag 0x%x\n", tag, sspTag));
3972 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO++;
3973 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3976 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
3978 SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST tag 0x%x ssptag 0x%x\n", tag, sspTag));
3979 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
3980 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3983 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
3985 SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE tag 0x%x ssptag 0x%x\n", tag, sspTag));
3986 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE++;
3987 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3990 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
3992 SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED tag 0x%x ssptag 0x%x\n", tag, sspTag));
3993 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
3994 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
3997 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
3999 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS tag 0x%x ssptag 0x%x\n", tag, sspTag));
4000 saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS++;
4001 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
4004 case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
4006 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4007 saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH++;
4008 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
4011 case OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR:
4013 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR HTAG = 0x%x\n", tag));
4014 saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR++;
4015 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
4018 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
4020 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4021 saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH++;
4022 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
4025 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
4027 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4028 saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH++;
4029 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
4032 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
4034 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4035 saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH++;
4036 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
4039 case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
4041 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
4042 saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_MISMATCH++;
4043 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
4046 case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
4048 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN tag 0x%x ssptag 0x%x\n", tag, sspTag));
4049 saRoot->IoEventCount.agOSSA_IO_XFER_ERR_EOB_DATA_OVERRUN++;
4050 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0, agNULL);
4053 case OSSA_IO_XFER_READ_COMPL_ERR:
4055 SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_READ_COMPL_ERR tag 0x%x ssptag 0x%x\n", tag, sspTag));
4056 saRoot->IoEventCount.agOSSA_IO_XFER_READ_COMPL_ERR++;
4057 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0, agNULL);
4062 SA_DBG1(("mpiSSPEvent: Unknown Event 0x%x tag 0x%x ssptag 0x%x\n", event, tag, sspTag));
4063 saRoot->IoEventCount.agOSSA_IO_UNKNOWN_ERROR++;
4064 ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
4069 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2u");
4074 /******************************************************************************/
4075 /*! \brief SPC MPI SATA Event
4077 * This function handles the SATA Event.
4079 * \param agRoot Handles for this instance of SAS/SATA LLL
4080 * \param pIomb pointer of Message
4082 * \return The read value
4085 /*******************************************************************************/
4086 GLOBAL bit32 mpiSATAEvent(
4088 agsaSATAEventRsp_t *pIomb
4091 bit32 ret = AGSA_RC_SUCCESS;
4092 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4093 agsaIORequestDesc_t *pRequest = agNULL;
4094 agsaPortContext_t *agPortContext;
4095 agsaDevHandle_t *agDevHandle;
4096 agsaDeviceDesc_t *pDevice;
4097 bit32 deviceIdx, portId_tmp, event, tag, deviceId;
4100 smTraceFuncEnter(hpDBG_VERY_LOUD,"2w");
4102 /* get port context */
4103 OSSA_READ_LE_32(AGROOT, &portId_tmp, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, portId));
4104 OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, deviceId));
4105 OSSA_READ_LE_32(AGROOT, &event, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, event));
4106 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, tag));
4108 if (OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE != event)
4110 /* get IORequest from IOMap */
4111 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4113 /* get port context - only for OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE */
4114 portId = (bit8)(portId_tmp & PORTID_MASK);
4115 SA_DBG2(("mpiSATAEvent:PortID 0x%x PortStatus 0x%x PortContext %p\n",saRoot->PortMap[portId & PORTID_MASK].PortID,saRoot->PortMap[portId & PORTID_MASK].PortStatus,saRoot->PortMap[portId & PORTID_MASK].PortContext));
4116 agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
4117 /* get device Id - only for OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE*/
4118 deviceIdx = deviceId & DEVICE_ID_BITS;
4119 OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
4120 /* find device handle from device index */
4121 pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
4122 agDevHandle = &(pDevice->targetDevHandle);
4127 case OSSA_IO_OVERFLOW:
4129 SA_DBG1(("mpiSATAEvent: OSSA_IO_OVERFLOW HTAG = 0x%x\n", tag));
4130 saRoot->IoEventCount.agOSSA_IO_OVERFLOW++;
4131 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4134 case OSSA_IO_XFER_ERROR_BREAK:
4136 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_BREAK HTAG = 0x%x\n", tag));
4137 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_BREAK++;
4138 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4141 case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
4143 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_PHY_NOT_READY HTAG = 0x%x\n", tag));
4144 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
4145 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4148 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
4150 SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED HTAG = 0x%x\n", tag));
4151 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
4152 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4155 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
4157 SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION HTAG = 0x%x\n", tag));
4158 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
4159 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4162 case OSSA_IO_OPEN_CNX_ERROR_BREAK:
4164 SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_BREAK HTAG = 0x%x\n", tag));
4165 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
4166 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4170 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
4172 SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST HTAG = 0x%x\n", tag));
4173 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
4174 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4177 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
4179 SA_DBG1(("mpiSATAEvent: HTAG = 0x%x\n", tag));
4180 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE++;
4181 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4184 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
4186 SA_DBG1(("mpiSATAEvent:OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED HTAG = 0x%x\n", tag));
4187 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
4188 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4191 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
4193 SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS HTAG = 0x%x\n", tag));
4194 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
4195 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4198 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
4200 SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION HTAG = 0x%x\n", tag));
4201 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
4202 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4205 case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
4207 SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED HTAG = 0x%x\n", tag));
4208 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
4209 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4212 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
4214 SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION HTAG = 0x%x\n", tag));
4215 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
4216 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4219 case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
4221 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_NAK_RECEIVED HTAG = 0x%x\n", tag));
4222 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_NAK_RECEIVED++;
4223 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4226 case OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE:
4228 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE HTAG = 0x%x\n", tag));
4229 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE++;
4230 ossaSATAEvent(agRoot, agNULL, agPortContext, agDevHandle, event, 0, agNULL);
4233 case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH:
4235 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH HTAG = 0x%x\n", tag));
4236 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_OFFSET_MISMATCH++;
4237 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4240 case OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN:
4242 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN HTAG = 0x%x\n", tag));
4243 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN++;
4244 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4247 case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
4249 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT HTAG = 0x%x\n", tag));
4250 saRoot->IoEventCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
4251 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4254 case OSSA_IO_XFER_ERROR_PEER_ABORTED:
4256 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_PEER_ABORTED HTAG = 0x%x\n", tag));
4257 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_PEER_ABORTED++;
4258 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4261 case OSSA_IO_XFER_CMD_FRAME_ISSUED:
4263 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED HTAG = 0x%x\n", tag));
4264 saRoot->IoEventCount.agOSSA_IO_XFER_CMD_FRAME_ISSUED++;
4265 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4268 case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
4270 SA_DBG1(("mpiSATAEvent, OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY HTAG = 0x%x\n", tag));
4271 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY++;
4272 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4275 case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE:
4277 SA_DBG1(("mpiSATAEvent, OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE HTAG = 0x%x\n", tag));
4278 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_UNEXPECTED_PHASE++;
4279 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4282 case OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN:
4284 SA_DBG1(("mpiSATAEvent, OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN HTAG = 0x%x\n", tag));
4285 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN++;
4286 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4289 case OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED:
4291 SA_DBG1(("mpiSATAEvent, OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED HTAG = 0x%x\n", tag));
4292 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED++;
4293 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4296 case OSSA_IO_XFER_PIO_SETUP_ERROR:
4298 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_PIO_SETUP_ERROR HTAG = 0x%x\n", tag));
4299 saRoot->IoEventCount.agOSSA_IO_XFER_PIO_SETUP_ERROR++;
4300 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4303 case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
4305 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFR_ERROR_DIF_MISMATCH HTAG = 0x%x\n", tag));
4306 saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_MISMATCH++;
4307 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4310 case OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR:
4312 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR HTAG = 0x%x\n", tag));
4313 saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR++;
4314 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4317 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
4319 SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x\n", tag));
4320 saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
4321 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4324 case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
4326 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN HTAG = 0x%x\n", tag));
4327 saRoot->IoEventCount.agOSSA_IO_XFER_ERR_EOB_DATA_OVERRUN++;
4328 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4331 case OSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT:
4333 SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT HTAG = 0x%x\n", tag));
4334 saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT++;
4335 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4340 SA_DBG1(("mpiSATAEvent: Unknown Event 0x%x HTAG = 0x%x\n", event, tag));
4341 saRoot->IoEventCount.agOSSA_IO_UNKNOWN_ERROR++;
4342 ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
4348 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2w");
4352 /******************************************************************************/
4353 /*! \brief Set NVM Data Response
4355 * This routine handles the response of SET NVM Data Response
4357 * \param agRoot Handles for this instance of SAS/SATA LLL
4358 * \param pIomb Pointer of IOMB Mesage
4360 * \return sucess or fail
4363 /*******************************************************************************/
4364 GLOBAL bit32 mpiSetNVMDataRsp(
4366 agsaSetNVMDataRsp_t *pIomb
4369 bit32 ret = AGSA_RC_SUCCESS;
4370 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4371 agsaIORequestDesc_t *pRequest;
4372 agsaContext_t *agContext;
4373 bit32 tag, status, iPTdaBnDpsAsNvm;
4375 smTraceFuncEnter(hpDBG_VERY_LOUD,"2x");
4377 SA_DBG1(("mpiSetNVMDataRsp: HTag=0x%x\n", pIomb->tag));
4379 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetNVMDataRsp_t, tag));
4380 OSSA_READ_LE_32(AGROOT, &iPTdaBnDpsAsNvm, pIomb, OSSA_OFFSET_OF(agsaSetNVMDataRsp_t, iPTdaBnDpsAsNvm));
4381 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetNVMDataRsp_t, status));
4383 /* get request from IOMap */
4384 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4385 if (agNULL == pRequest)
4387 SA_DBG1(("mpiSetNVMDataRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
4388 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2x");
4389 return AGSA_RC_FAILURE;
4392 agContext = saRoot->IOMap[tag].agContext;
4393 /* remove the request from IOMap */
4394 saRoot->IOMap[tag].Tag = MARK_OFF;
4395 saRoot->IOMap[tag].IORequest = agNULL;
4396 saRoot->IOMap[tag].agContext = agNULL;
4398 SA_ASSERT((pRequest->valid), "pRequest->valid");
4400 if (((iPTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_CONFIG_SEEPROM) ||
4401 ((iPTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_VPD_FLASH) ||
4402 ((iPTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_TWI_DEVICES))
4404 /* CB for VPD for SEEPROM-0, VPD_FLASH and TWI */
4405 ossaSetNVMDResponseCB(agRoot, agContext, (status & NVMD_STAT));
4409 /* should not happend */
4410 SA_DBG1(("mpiSetNVMDataRsp: NVMD is wrong. TAG=0x%x STATUS=0x%x\n", tag, (iPTdaBnDpsAsNvm & NVMD_TYPE)));
4411 ret = AGSA_RC_FAILURE;
4414 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4415 pRequest->valid = agFALSE;
4416 /* return the request to free pool */
4417 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4418 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4421 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2x");
4425 /******************************************************************************/
4426 /*! \brief SPC MPI SSP ABORT Response
4428 * This function handles the SSP Abort Response.
4430 * \param agRoot Handles for this instance of SAS/SATA LLL
4431 * \param pIomb pointer of Message
4433 * \return The read value
4436 /*******************************************************************************/
4437 GLOBAL bit32 mpiSSPAbortRsp(
4439 agsaSSPAbortRsp_t *pIomb
4442 bit32 ret = AGSA_RC_SUCCESS;
4443 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4444 agsaIORequestDesc_t *pRequest;
4445 agsaDeviceDesc_t *pDevice;
4446 bit32 tag, status, scope;
4447 smTraceFuncEnter(hpDBG_VERY_LOUD,"2y");
4449 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSSPAbortRsp_t, tag));
4450 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSSPAbortRsp_t, status));
4451 OSSA_READ_LE_32(AGROOT, &scope, pIomb, OSSA_OFFSET_OF(agsaSSPAbortRsp_t, scp));
4453 /* get IORequest from IOMap */
4454 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4456 if (agNULL == pRequest)
4458 /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
4459 saRoot->IOMap[tag].Tag = MARK_OFF;
4460 saRoot->IOMap[tag].IORequest = agNULL;
4461 SA_ASSERT((pRequest), "pRequest");
4462 SA_DBG1(("mpiSSPAbortRsp: the request is NULL. Tag=%x\n", tag));
4463 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2y");
4464 return AGSA_RC_FAILURE;
4468 if ( agTRUE == pRequest->valid )
4470 pDevice = pRequest->pDevice;
4471 SA_ASSERT((pRequest->pDevice), "pRequest->pDevice");
4473 SA_DBG3(("mpiSSPAbortRsp: request abort is valid Htag 0x%x\n", tag));
4474 /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
4475 saRoot->IOMap[tag].Tag = MARK_OFF;
4476 saRoot->IOMap[tag].IORequest = agNULL;
4478 if( pRequest->completionCB == agNULL )
4480 ossaSSPAbortCB(agRoot, pRequest->pIORequestContext, scope, status);
4484 (*(ossaGenericAbortCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, scope, status);
4487 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4488 pRequest->valid = agFALSE;
4489 /* Delete the request from the pendingIORequests */
4490 saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
4492 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
4494 SA_DBG1(("mpiSSPAbortRsp: saving pRequest (%p) for later use\n", pRequest));
4495 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
4499 /* return the request to free pool */
4500 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4505 siCountActiveIORequestsOnDevice( agRoot, pDevice->DeviceMapIndex );
4508 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4513 ret = AGSA_RC_FAILURE;
4514 SA_DBG1(("mpiSSPAbortRsp: the request is not valid any more. Tag=%x\n", pRequest->HTag));
4517 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2y");
4521 /******************************************************************************/
4522 /*! \brief SPC MPI SATA ABORT Response
4524 * This function handles the SATA Event.
4526 * \param agRoot Handles for this instance of SAS/SATA LLL
4527 * \param pIomb pointer of Message
4529 * \return The read value
4532 /*******************************************************************************/
4533 GLOBAL bit32 mpiSATAAbortRsp(
4535 agsaSATAAbortRsp_t *pIomb
4538 bit32 ret = AGSA_RC_SUCCESS;
4539 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4540 agsaIORequestDesc_t *pRequest;
4541 agsaDeviceDesc_t *pDevice;
4542 bit32 tag, status, scope;
4544 smTraceFuncEnter(hpDBG_VERY_LOUD,"3B");
4545 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSATAAbortRsp_t, tag));
4546 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSATAAbortRsp_t, status));
4547 OSSA_READ_LE_32(AGROOT, &scope, pIomb, OSSA_OFFSET_OF(agsaSATAAbortRsp_t, scp));
4549 /* get IORequest from IOMap */
4550 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4552 if (agNULL == pRequest)
4554 /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
4555 saRoot->IOMap[tag].Tag = MARK_OFF;
4556 saRoot->IOMap[tag].IORequest = agNULL;
4557 SA_DBG1(("mpiSATAAbortRsp: the request is NULL. Tag=%x\n", tag));
4558 SA_ASSERT((pRequest), "pRequest");
4559 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3B");
4560 return AGSA_RC_FAILURE;
4563 if ( agTRUE == pRequest->valid )
4565 pDevice = pRequest->pDevice;
4566 SA_ASSERT((pRequest->pDevice), "pRequest->pDevice");
4568 SA_DBG3(("mpiSATAAbortRsp: request abort is valid Htag 0x%x\n", tag));
4570 if( pRequest->completionCB == agNULL )
4572 ossaSATAAbortCB(agRoot, pRequest->pIORequestContext, scope, status);
4576 (*(ossaGenericAbortCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, scope, status);
4578 /* remove the SATA_ABORT request from IOMap */
4579 saRoot->IOMap[tag].Tag = MARK_OFF;
4580 saRoot->IOMap[tag].IORequest = agNULL;
4581 saRoot->IOMap[tag].agContext = agNULL;
4583 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4584 pRequest->valid = agFALSE;
4585 /* Delete the request from the pendingIORequests */
4586 saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
4587 /* return the request to free pool */
4588 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4589 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4594 ret = AGSA_RC_FAILURE;
4595 SA_DBG1(("mpiSATAAbortRsp: the request is not valid any more. Tag=%x\n", pRequest->HTag));
4599 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3B");
4603 /******************************************************************************/
4604 /*! \brief Set GPIO Response
4606 * This routine handles the response of GPIO Command
4608 * \param agRoot Handles for this instance of SAS/SATA LLL
4609 * \param pIomb Pointer of IOMB Mesage
4611 * \return sucess or fail
4614 /*******************************************************************************/
4615 GLOBAL bit32 mpiGPIORsp(
4617 agsaGPIORsp_t *pIomb
4620 bit32 ret = AGSA_RC_SUCCESS;
4621 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4622 agsaContext_t *agContext;
4623 agsaIORequestDesc_t *pRequest;
4624 agsaGpioPinSetupInfo_t pinSetupInfo;
4625 agsaGpioEventSetupInfo_t eventSetupInfo;
4626 bit32 GpioIe, OT11_0, OT19_12, GPIEVChange, GPIEVFall, GPIEVRise, GpioRdVal, tag;
4628 smTraceFuncEnter(hpDBG_VERY_LOUD,"5C");
4630 SA_DBG3(("mpiGPIORsp: HTag=0x%x\n", pIomb->tag));
4632 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, tag));
4634 /* get request from IOMap */
4635 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4636 if (agNULL == pRequest)
4638 SA_DBG1(("mpiGPIORsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x\n", tag));
4639 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5C");
4640 return AGSA_RC_FAILURE;
4643 agContext = saRoot->IOMap[tag].agContext;
4644 /* remove the request from IOMap */
4645 saRoot->IOMap[tag].Tag = MARK_OFF;
4646 saRoot->IOMap[tag].IORequest = agNULL;
4647 saRoot->IOMap[tag].agContext = agNULL;
4648 SA_ASSERT((pRequest->valid), "pRequest->valid");
4650 /* set payload to zeros */
4651 si_memset(&pinSetupInfo, 0, sizeof(agsaGpioPinSetupInfo_t));
4652 si_memset(&eventSetupInfo, 0, sizeof(agsaGpioEventSetupInfo_t));
4654 OSSA_READ_LE_32(AGROOT, &GpioIe, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GpioIe));
4655 OSSA_READ_LE_32(AGROOT, &OT11_0, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, OT11_0));
4656 OSSA_READ_LE_32(AGROOT, &OT19_12, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, OT19_12));
4657 OSSA_READ_LE_32(AGROOT, &GPIEVChange, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GPIEVChange));
4658 OSSA_READ_LE_32(AGROOT, &GPIEVFall, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GPIEVFall));
4659 OSSA_READ_LE_32(AGROOT, &GPIEVRise, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GPIEVRise));
4660 OSSA_READ_LE_32(AGROOT, &GpioRdVal, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GpioRdVal));
4661 pinSetupInfo.gpioInputEnabled = GpioIe;
4662 pinSetupInfo.gpioTypePart1 = OT11_0;
4663 pinSetupInfo.gpioTypePart2 = OT19_12;
4664 eventSetupInfo.gpioEventLevel = GPIEVChange;
4665 eventSetupInfo.gpioEventFallingEdge = GPIEVFall;
4666 eventSetupInfo.gpioEventRisingEdge = GPIEVRise;
4668 ossaGpioResponseCB(agRoot, agContext, OSSA_IO_SUCCESS, GpioRdVal,
4672 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4673 pRequest->valid = agFALSE;
4674 /* return the request to free pool */
4675 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
4677 SA_DBG1(("mpiGPIORsp: saving pRequest (%p) for later use\n", pRequest));
4678 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
4682 /* return the request to free pool */
4683 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4685 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4688 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5C");
4692 /******************************************************************************/
4693 /*! \brief Set GPIO Event Response
4695 * This routine handles the response of GPIO Event
4697 * \param agRoot Handles for this instance of SAS/SATA LLL
4698 * \param pIomb Pointer of IOMB Mesage
4700 * \return sucess or fail
4703 /*******************************************************************************/
4704 GLOBAL bit32 mpiGPIOEventRsp(
4706 agsaGPIOEvent_t *pIomb
4709 bit32 ret = AGSA_RC_SUCCESS;
4712 smTraceFuncEnter(hpDBG_VERY_LOUD,"3D");
4714 OSSA_READ_LE_32(AGROOT, &GpioEvent, pIomb, OSSA_OFFSET_OF(agsaGPIOEvent_t, GpioEvent));
4716 ossaGpioEvent(agRoot, GpioEvent);
4719 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3D");
4723 /******************************************************************************/
4724 /*! \brief SAS Diagnostic Start/End Response
4726 * This routine handles the response of SAS Diagnostic Start/End Command
4728 * \param agRoot Handles for this instance of SAS/SATA LLL
4729 * \param pIomb Pointer of IOMB Mesage
4731 * \return sucess or fail
4734 /*******************************************************************************/
4735 GLOBAL bit32 mpiSASDiagStartEndRsp(
4737 agsaSASDiagStartEndRsp_t *pIomb
4740 bit32 ret = AGSA_RC_SUCCESS;
4741 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4742 agsaIORequestDesc_t *pRequest;
4743 agsaContext_t *agContext;
4746 smTraceFuncEnter(hpDBG_VERY_LOUD,"2F");
4748 SA_DBG3(("mpiSASDiagStartEndRsp: HTAG=0x%x\n", pIomb->tag));
4750 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSASDiagStartEndRsp_t, tag));
4751 OSSA_READ_LE_32(AGROOT, &Status, pIomb, OSSA_OFFSET_OF(agsaSASDiagStartEndRsp_t, Status));
4753 /* get request from IOMap */
4754 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4755 if (agNULL == pRequest)
4757 SA_DBG1(("mpiSASDiagStartEndRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, Status));
4758 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2F");
4759 return AGSA_RC_FAILURE;
4762 agContext = saRoot->IOMap[tag].agContext;
4763 /* remove the request from IOMap */
4764 saRoot->IOMap[tag].Tag = MARK_OFF;
4765 saRoot->IOMap[tag].IORequest = agNULL;
4766 saRoot->IOMap[tag].agContext = agNULL;
4768 SA_ASSERT((pRequest->valid), "pRequest->valid");
4773 case OSSA_DIAG_SE_SUCCESS:
4774 SA_DBG3(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_SE_SUCCESS 0x%X \n", Status));
4776 case OSSA_DIAG_SE_INVALID_PHY_ID:
4777 SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_SE_INVALID_PHY_ID 0x%X \n", Status));
4779 case OSSA_DIAG_PHY_NOT_DISABLED:
4780 SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_PHY_NOT_DISABLED Status 0x%X \n", Status));
4782 case OSSA_DIAG_OTHER_FAILURE:
4783 if(smIS_SPCV(agRoot))
4785 SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_OTHER_FAILURE Status 0x%X \n", Status));
4789 SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_OPCODE_INVALID Status 0x%X \n", Status));
4793 SA_DBG1(("mpiSASDiagStartEndRsp:Status UNKNOWN 0x%X \n", Status));
4797 ossaSASDiagStartEndCB(agRoot, agContext, Status);
4799 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4800 pRequest->valid = agFALSE;
4801 /* return the request to free pool */
4802 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
4804 SA_DBG1(("mpiSASDiagStartEndRsp: saving pRequest (%p) for later use\n", pRequest));
4805 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
4809 /* return the request to free pool */
4810 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4812 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4815 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2F");
4819 /******************************************************************************/
4820 /*! \brief SAS Diagnostic Execute Response
4822 * This routine handles the response of SAS Diagnostic Execute Command
4824 * \param agRoot Handles for this instance of SAS/SATA LLL
4825 * \param pIomb Pointer of IOMB Mesage
4827 * \return sucess or fail
4830 /*******************************************************************************/
4831 GLOBAL bit32 mpiSASDiagExecuteRsp(
4833 agsaSASDiagExecuteRsp_t *pIomb
4836 bit32 ret = AGSA_RC_SUCCESS;
4837 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4838 agsaIORequestDesc_t *pRequest;
4839 agsaContext_t *agContext;
4840 bit32 tag, Status, CmdTypeDescPhyId, ReportData;
4841 smTraceFuncEnter(hpDBG_VERY_LOUD,"3G");
4843 SA_DBG3(("mpiSASDiagExecuteRsp: HTAG=0x%x\n", pIomb->tag));
4845 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, tag));
4846 OSSA_READ_LE_32(AGROOT, &Status, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, Status));
4847 OSSA_READ_LE_32(AGROOT, &CmdTypeDescPhyId, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, CmdTypeDescPhyId));
4848 OSSA_READ_LE_32(AGROOT, &ReportData, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, ReportData));
4849 /* get request from IOMap */
4850 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
4851 if (agNULL == pRequest)
4853 SA_DBG1(("mpiSASDiagExecuteRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, Status));
4854 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3G");
4855 return AGSA_RC_FAILURE;
4861 case OSSA_DIAG_SUCCESS:
4862 SA_DBG3(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_SUCCESS 0x%X \n", Status));
4864 case OSSA_DIAG_INVALID_COMMAND:
4865 if(smIS_SPCV(agRoot))
4867 SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_INVALID_COMMAND Status 0x%X \n", Status));
4871 SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_FAIL Status 0x%X \n", Status));
4874 case OSSA_REGISTER_ACCESS_TIMEOUT:
4875 SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_REGISTER_ACCESS_TIMEOUT Status 0x%X \n", Status));
4877 case OSSA_DIAG_NOT_IN_DIAGNOSTIC_MODE:
4878 SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_NOT_IN_DIAGNOSTIC_MODE Status 0x%X \n", Status));
4880 case OSSA_DIAG_INVALID_PHY:
4881 SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_INVALID_PHY Status 0x%X \n", Status));
4883 case OSSA_MEMORY_ALLOC_FAILURE:
4884 SA_DBG1(("mpiSASDiagExecuteRsp: Status Status 0x%X \n", Status));
4888 SA_DBG1(("mpiSASDiagExecuteRsp:Status UNKNOWN 0x%X \n", Status));
4893 agContext = saRoot->IOMap[tag].agContext;
4894 /* remove the request from IOMap */
4895 saRoot->IOMap[tag].Tag = MARK_OFF;
4896 saRoot->IOMap[tag].IORequest = agNULL;
4897 saRoot->IOMap[tag].agContext = agNULL;
4899 SA_ASSERT((pRequest->valid), "pRequest->valid");
4901 ossaSASDiagExecuteCB(agRoot, agContext, Status, CmdTypeDescPhyId, ReportData);
4903 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4904 pRequest->valid = agFALSE;
4905 /* return the request to free pool */
4906 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
4908 SA_DBG1(("mpiSASDiagExecuteRsp: saving pRequest (%p) for later use\n", pRequest));
4909 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
4913 /* return the request to free pool */
4914 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4916 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4918 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3G");
4924 /******************************************************************************/
4925 /*! \brief SAS General Event Notification Response
4927 * This routine handles the response of Inbound IOMB Command with error case
4929 * \param agRoot Handles for this instance of SAS/SATA LLL
4930 * \param pIomb Pointer of IOMB Mesage
4932 * \return sucess or fail
4935 /*******************************************************************************/
4936 GLOBAL bit32 mpiGeneralEventRsp(
4938 agsaGeneralEventRsp_t *pIomb
4941 bit32 ret = AGSA_RC_SUCCESS;
4942 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
4946 agsaIORequestDesc_t *pRequest;
4947 agsaDeviceDesc_t *pDevice;
4948 agsaContext_t *agContext = NULL;
4949 agsaGeneralEventRsp_t GenEventData;
4950 agsaHWEventEncrypt_t agEvent;
4953 smTraceFuncEnter(hpDBG_VERY_LOUD,"3H");
4955 si_memset(&GenEventData,0,sizeof(agsaGeneralEventRsp_t));
4957 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGeneralEventRsp_t, status));
4959 SA_DBG3(("mpiGeneralEventRsp: %p\n", pIomb));
4961 SA_DBG1(("mpiGeneralEventRsp: OpCode 0x%X status 0x%x\n",pIomb->inbIOMBpayload[0] & OPCODE_BITS, status));
4963 for (i = 0; i < GENERAL_EVENT_PAYLOAD; i++)
4965 OSSA_READ_LE_32(AGROOT, &GenEventData.inbIOMBpayload[i], pIomb, OSSA_OFFSET_OF(agsaGeneralEventRsp_t,inbIOMBpayload[i] ));
4967 SA_DBG1(("mpiGeneralEventRsp: inbIOMBpayload 0x%08x 0x%08x 0x%08x 0x%08x\n",
4968 GenEventData.inbIOMBpayload[0],GenEventData.inbIOMBpayload[1],
4969 GenEventData.inbIOMBpayload[2],GenEventData.inbIOMBpayload[3] ));
4970 SA_DBG1(("mpiGeneralEventRsp: inbIOMBpayload 0x%08x 0x%08x 0x%08x 0x%08x\n",
4971 GenEventData.inbIOMBpayload[4],GenEventData.inbIOMBpayload[8],
4972 GenEventData.inbIOMBpayload[6],GenEventData.inbIOMBpayload[7] ));
4974 switch (status) /*status */
4977 case GEN_EVENT_IOMB_V_BIT_NOT_SET:
4978 SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_IOMB_V_BIT_NOT_SET\n" ));
4980 case GEN_EVENT_INBOUND_IOMB_OPC_NOT_SUPPORTED:
4981 SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_INBOUND_IOMB_OPC_NOT_SUPPORTED\n" ));
4983 case GEN_EVENT_IOMB_INVALID_OBID:
4984 SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_IOMB_INVALID_OBID\n" ));
4986 case GEN_EVENT_DS_IN_NON_OPERATIONAL:
4987 SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_DS_IN_NON_OPERATIONAL\n" ));
4989 case GEN_EVENT_DS_IN_RECOVERY:
4990 SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_DS_IN_RECOVERY\n" ));
4992 case GEN_EVENT_DS_INVALID:
4993 SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_DS_INVALID\n" ));
4995 case GEN_EVENT_IO_XFER_READ_COMPL_ERR:
4996 SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_IO_XFER_READ_COMPL_ERR 0x%x 0x%x 0x%x\n",
4997 GenEventData.inbIOMBpayload[0],
4998 GenEventData.inbIOMBpayload[1],
4999 GenEventData.inbIOMBpayload[1] ));
5000 ossaGeneralEvent(agRoot, status, agContext, GenEventData.inbIOMBpayload);
5001 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3H");
5004 SA_DBG1(("mpiGeneralEventRsp: Unknown General Event status!!! 0x%x\n", status));
5005 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3H");
5006 return AGSA_RC_FAILURE;
5009 OpCode = (bit16)(GenEventData.inbIOMBpayload[0] & OPCODE_BITS);
5010 tag = GenEventData.inbIOMBpayload[1];
5011 SA_DBG1(("mpiGeneralEventRsp:OpCode 0x%X [0] 0x%08x\n" ,OpCode,(bit16)(GenEventData.inbIOMBpayload[0] & OPCODE_BITS)));
5013 switch (OpCode) /* OpCode */
5015 case OPC_INB_DEV_HANDLE_ACCEPT:
5017 case OPC_INB_FW_FLASH_UPDATE:
5018 case OPC_INB_GET_NVMD_DATA:
5019 case OPC_INB_SET_NVMD_DATA:
5020 case OPC_INB_DEREG_DEV_HANDLE:
5021 case OPC_INB_SPC_GET_DEV_INFO:
5022 case OPC_INB_GET_DEV_HANDLE:
5023 case OPC_INB_SPC_REG_DEV:
5024 case OPC_INB_SAS_DIAG_EXECUTE:
5025 case OPC_INB_SAS_DIAG_MODE_START_END:
5026 case OPC_INB_PHYSTART:
5027 case OPC_INB_PHYSTOP:
5028 case OPC_INB_LOCAL_PHY_CONTROL:
5030 case OPC_INB_GET_TIME_STAMP:
5031 case OPC_INB_PORT_CONTROL:
5032 case OPC_INB_SET_DEVICE_STATE:
5033 case OPC_INB_GET_DEVICE_STATE:
5034 case OPC_INB_SET_DEV_INFO:
5035 // case OPC_INB_PCIE_DIAG_EXECUTE:
5036 case OPC_INB_SAS_HW_EVENT_ACK:
5037 case OPC_INB_SAS_RE_INITIALIZE:
5038 case OPC_INB_KEK_MANAGEMENT:
5039 case OPC_INB_SET_OPERATOR:
5040 case OPC_INB_GET_OPERATOR:
5041 // case OPC_INB_SGPIO:
5043 #ifdef SPC_ENABLE_PROFILE
5044 case OPC_INB_FW_PROFILE:
5046 /* Uses the tag table, so we have to free it up */
5048 SA_ASSERT((tag < AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs),
5049 "OPC_OUB_GENERAL_EVENT tag out of range");
5050 SA_ASSERT((saRoot->IOMap[ tag < (AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs) ? tag : 0 ].Tag != MARK_OFF),
5051 "OPC_OUB_GENERAL_EVENT tag not in use 1");
5053 #if defined(SALLSDK_DEBUG)
5054 if (tag > AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs)
5056 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3H");
5057 return AGSA_RC_FAILURE;
5059 #endif /* SALLSDK_DEBUG */
5061 SA_DBG1(("mpiGeneralEventRsp:OpCode found 0x%x htag 0x%x\n",OpCode, tag));
5063 agContext = saRoot->IOMap[tag].agContext;
5064 /* get request from IOMap */
5065 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5068 /* remove the request from IOMap */
5069 saRoot->IOMap[tag].Tag = MARK_OFF;
5070 saRoot->IOMap[tag].IORequest = agNULL;
5071 saRoot->IOMap[tag].agContext = agNULL;
5073 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5074 SA_ASSERT((pRequest->valid), "pRequest->valid");
5075 pRequest->valid = agFALSE;
5076 /* return the request to free pool */
5077 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5079 SA_DBG1(("mpiGeneralEventRsp: saving pRequest (%p) for later use\n", pRequest));
5080 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5084 /* return the request to free pool */
5085 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5087 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5091 SA_DBG1(("mpiGeneralEventRsp:pRequest (%p) NULL\n", pRequest));
5092 ret = AGSA_RC_FAILURE;
5096 case OPC_INB_SATA_HOST_OPSTART:
5097 case OPC_INB_SATA_ABORT:
5098 case OPC_INB_SSPINIIOSTART:
5099 case OPC_INB_SSPINITMSTART:
5100 case OPC_INB_SSPINIEXTIOSTART:
5101 case OPC_INB_SSPTGTIOSTART:
5102 case OPC_INB_SSPTGTRSPSTART:
5103 case OPC_INB_SSP_DIF_ENC_OPSTART:
5104 case OPC_INB_SATA_DIF_ENC_OPSTART:
5106 case OPC_INB_SSP_ABORT:
5107 case OPC_INB_SMP_REQUEST:
5108 case OPC_INB_SMP_ABORT:
5110 /* Uses the tag table, so we have to free it up */
5111 SA_DBG1(("mpiGeneralEventRsp:OpCode found 0x%x htag 0x%x\n",OpCode, tag));
5113 tag = GenEventData.inbIOMBpayload[1];
5115 SA_ASSERT((tag < AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs),
5116 "OPC_OUB_GENERAL_EVENT tag out of range");
5117 SA_ASSERT((saRoot->IOMap[ tag < (AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs) ? tag : 0 ].Tag != MARK_OFF),
5118 "OPC_OUB_GENERAL_EVENT tag not in use 2");
5119 #if defined(SALLSDK_DEBUG)
5120 if (tag > AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs)
5122 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3H");
5123 return AGSA_RC_FAILURE;
5126 /* get request from IOMap */
5127 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5130 pDevice = pRequest->pDevice;
5131 /* return the request to free pool */
5132 /* get IORequestContext */
5133 agContext = (agsaContext_t *)pRequest->pIORequestContext;
5134 /* remove the request from IOMap */
5135 saRoot->IOMap[tag].Tag = MARK_OFF;
5136 saRoot->IOMap[tag].IORequest = agNULL;
5137 saRoot->IOMap[tag].agContext = agNULL;
5139 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5140 SA_ASSERT((pRequest->valid), "pRequest->valid");
5141 pRequest->valid = agFALSE;
5142 saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
5143 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5145 SA_DBG1(("mpiGeneralEventRsp: saving pRequest (%p) for later use\n", pRequest));
5146 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5150 /* return the request to free pool */
5151 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5153 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5158 SA_DBG1(("mpiGeneralEventRsp:pRequest (%p) NULL\n", pRequest));
5159 ret = AGSA_RC_FAILURE;
5164 SA_DBG1(("mpiGeneralEventRsp:OpCode Not found 0x%x htag 0x%x\n",OpCode, tag));
5165 ret = AGSA_RC_FAILURE;
5167 /* Uses the tag table, so we have to free it up */
5168 tag = GenEventData.inbIOMBpayload[1];
5170 SA_ASSERT((tag < AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs),
5171 "OPC_OUB_GENERAL_EVENT tag out of range");
5172 SA_ASSERT((saRoot->IOMap[ tag < (AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs) ? tag : 0 ].Tag != MARK_OFF),
5173 "OPC_OUB_GENERAL_EVENT tag not in use 3");
5175 #if defined(SALLSDK_DEBUG)
5176 if (tag > AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs)
5178 smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "3H");
5179 return AGSA_RC_FAILURE;
5183 agContext = saRoot->IOMap[tag].agContext;
5184 /* get request from IOMap */
5185 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5186 if (pRequest == agNULL)
5188 smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "3H");
5189 return AGSA_RC_FAILURE;
5192 /* remove the request from IOMap */
5193 saRoot->IOMap[tag].Tag = MARK_OFF;
5194 saRoot->IOMap[tag].IORequest = agNULL;
5195 saRoot->IOMap[tag].agContext = agNULL;
5197 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5198 SA_ASSERT((pRequest->valid), "pRequest->valid");
5199 pRequest->valid = agFALSE;
5200 /* return the request to free pool */
5201 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5203 SA_DBG1(("mpiGeneralEventRsp: saving pRequest (%p) for later use\n", pRequest));
5204 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5208 /* return the request to free pool */
5209 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5211 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5214 ret = AGSA_RC_FAILURE;
5218 switch (OpCode) /* OpCode */
5221 case OPC_INB_KEK_MANAGEMENT:
5223 bit32 flags = GenEventData.inbIOMBpayload[2];
5225 SA_DBG1(("mpiGeneralEventRsp: OPC_INB_KEK_MANAGEMENT 0x%x htag 0x%x flags 0x%x\n",OpCode, tag, flags));
5226 if (flags & 0xFF00) /* update and store*/
5228 agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE;
5229 SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE\n"));
5233 agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE;
5234 SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_KEK_UPDATE\n"));
5236 agEvent.status = OSSA_INVALID_ENCRYPTION_SECURITY_MODE;
5237 si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
5238 agEvent.status = status;
5240 SA_DBG1(("mpiGeneralEventRsp: ossaHwCB OSSA_HW_EVENT_ENCRYPTION\n" ));
5241 ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void*)&agEvent, agContext);
5244 case OPC_INB_OPR_MGMT:
5245 si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
5246 agEvent.status = status;
5247 agEvent.encryptOperation = OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT;
5249 SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT\n" ));
5250 ossaOperatorManagementCB(agRoot, agContext, status, 0);
5252 case OPC_INB_SET_OPERATOR:
5253 SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_SET_OPERATOR\n" ));
5254 ossaSetOperatorCB(agRoot,agContext,0xFF,0xFF );
5256 case OPC_INB_GET_OPERATOR:
5257 SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_GET_OPERATOR\n" ));
5258 ossaGetOperatorCB(agRoot,agContext,0xFF,0xFF,0xFF,0xFF,agNULL );
5260 case OPC_INB_ENC_TEST_EXECUTE:
5261 si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
5262 agEvent.status = status;
5263 agEvent.encryptOperation = OSSA_HW_ENCRYPT_TEST_EXECUTE;
5265 SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_TEST_EXECUTE\n" ));
5266 ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void*)&agEvent, agContext);
5269 SA_DBG1(("mpiGeneralEventRsp: MGMNT OpCode Not found 0x%x\n",OpCode ));
5270 ossaGeneralEvent(agRoot, status, agContext, GenEventData.inbIOMBpayload);
5275 smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "3H");
5279 /******************************************************************************/
5280 /*! \brief SPC MPI SSP Request Received Event (target mode)
5282 * This function handles the SSP Request Received Event.
5284 * \param agRoot Handles for this instance of SAS/SATA LLL
5285 * \param pMsg1 pointer of Message
5287 * \return The read value
5290 /*******************************************************************************/
5291 GLOBAL bit32 mpiSSPReqReceivedNotify(
5293 agsaSSPReqReceivedNotify_t *pMsg1)
5295 bit32 ret = AGSA_RC_SUCCESS;
5296 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5297 agsaDeviceDesc_t *pDevice;
5298 bit32 deviceid, iniTagSSPIul, frameTypeHssa, TlrHdsa;
5300 smTraceFuncEnter(hpDBG_VERY_LOUD,"3J");
5301 /* convert endiness if necassary */
5302 OSSA_READ_LE_32(AGROOT, &deviceid, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, deviceId));
5303 OSSA_READ_LE_32(AGROOT, &iniTagSSPIul, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, iniTagSSPIul));
5304 OSSA_READ_LE_32(AGROOT, &frameTypeHssa, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, frameTypeHssa));
5305 OSSA_READ_LE_32(AGROOT, &TlrHdsa, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, TlrHdsa));
5306 /* deviceId -> agDeviceHandle */
5307 pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
5309 if (agNULL == pDevice)
5311 SA_DBG1(("mpiSSPReqReceivedNotify: warning!!! no deviceHandle is found"));
5315 /* type punning only safe through char *. See gcc -fstrict_aliasing. */
5316 char * safe_type_pun = (char *)&(pMsg1->SSPIu[0]);
5317 if( pDevice->initiatorDevHandle.sdkData != agNULL)
5319 ossaSSPReqReceived(agRoot, &(pDevice->initiatorDevHandle),
5320 (agsaFrameHandle_t *)safe_type_pun,
5321 (bit16)((iniTagSSPIul >> SHIFT16) & INITTAG_BITS),
5322 ((frameTypeHssa >> SHIFT24) & FRAME_TYPE) |
5323 ((TlrHdsa >> SHIFT16) & TLR_BITS),
5324 (iniTagSSPIul & SSPIUL_BITS));
5325 }else if( pDevice->targetDevHandle.sdkData != agNULL)
5327 ossaSSPReqReceived(agRoot, &(pDevice->targetDevHandle),
5328 (agsaFrameHandle_t *)safe_type_pun,
5329 (bit16)((iniTagSSPIul >> SHIFT16) & INITTAG_BITS),
5330 ((frameTypeHssa >> SHIFT24) & FRAME_TYPE) |
5331 ((TlrHdsa >> SHIFT16) & TLR_BITS),
5332 (iniTagSSPIul & SSPIUL_BITS));
5335 SA_ASSERT(0, "Device handle sdkData not set");
5339 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3J");
5343 /******************************************************************************/
5344 /*! \brief SPC MPI Device Handle Arrived Event (target mode)
5346 * This function handles the Device Handle Arrived Event.
5348 * \param agRoot Handles for this instance of SAS/SATA LLL
5349 * \param pMsg1 pointer of Message
5351 * \return The read value
5354 /*******************************************************************************/
5355 GLOBAL bit32 mpiDeviceHandleArrived(
5357 agsaDeviceHandleArrivedNotify_t *pMsg1)
5359 bit32 ret = AGSA_RC_SUCCESS;
5360 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5361 agsaDeviceDesc_t *pDevice;
5363 agsaSASDeviceInfo_t pDeviceInfo;
5364 agsaPortContext_t *agPortContext;
5365 agsaSASIdentify_t remoteIdentify;
5368 bit32 ProtConrPortId;
5371 bit8 i, protocol, dTypeSRate;
5372 bit32 HostAssignedId;
5374 if(saRoot == agNULL)
5376 SA_ASSERT((saRoot != agNULL), "saRoot");
5377 return AGSA_RC_FAILURE;
5380 smTraceFuncEnter(hpDBG_VERY_LOUD,"3L");
5381 /* convert endiness if necassary */
5382 OSSA_READ_LE_32(AGROOT, &CTag, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleArrivedNotify_t, CTag));
5383 OSSA_READ_LE_32(AGROOT, &FwdDeviceId, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleArrivedNotify_t, HostAssignedIdFwdDeviceId));
5384 OSSA_READ_LE_32(AGROOT, &ProtConrPortId, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleArrivedNotify_t, ProtConrPortId));
5387 if(smIS_SPCV(agRoot))
5389 portId = ProtConrPortId & PortId_V_MASK;
5390 conRate = (ProtConrPortId & Conrate_V_MASK ) >> Conrate_V_SHIFT;
5392 HostAssignedId = (FwdDeviceId & 0xFFFF0000) >> SHIFT16;
5395 SA_DBG1(("mpiDeviceHandleArrived: HostAssignedId 0x%X\n",HostAssignedId));
5400 portId = ProtConrPortId & PortId_SPC_MASK;
5401 conRate = (ProtConrPortId & Conrate_SPC_MASK ) >> Conrate_SPC_SHIFT;
5403 protocol =(bit8)((ProtConrPortId & PROTOCOL_BITS ) >> PROTOCOL_SHIFT);
5405 SA_DBG1(("mpiDeviceHandleArrived: New Port portID %d deviceid 0x%X conRate 0x%X protocol 0x%X\n",portId, FwdDeviceId,conRate,protocol));
5408 agPortContext = saRoot->PortMap[portId].PortContext;
5409 if (agNULL == agPortContext)
5411 ossaSingleThreadedEnter(agRoot, LL_PORT_LOCK);
5413 /* Acquire port list lock */
5414 /* Allocate a free port */
5415 pPort = (agsaPort_t *) saLlistGetHead(&(saRoot->freePorts));
5416 if (agNULL != pPort)
5418 saLlistRemove(&(saRoot->freePorts), &(pPort->linkNode));
5420 /* setup the port data structure */
5421 pPort->portContext.osData = agNULL;
5422 pPort->portContext.sdkData = pPort;
5423 pPort->tobedeleted = agFALSE;
5424 /* Add to valid port list */
5425 saLlistAdd(&(saRoot->validPorts), &(pPort->linkNode));
5426 /* Release port list lock */
5427 ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
5429 /* Setup portMap based on portId */
5430 saRoot->PortMap[portId].PortID = portId;
5431 saRoot->PortMap[portId].PortContext = &(pPort->portContext);
5432 saRoot->PortMap[portId].PortStatus &= ~PORT_INVALIDATING;
5433 pPort->portId = portId;
5435 pPort->status &= ~PORT_INVALIDATING;
5436 SA_DBG3(("mpiDeviceHandleArrived: ~PORT_INVALIDATING New Port portID %d PortContext %p\n",saRoot->PortMap[pPort->portId].PortID , &pPort->portContext));
5440 ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
5441 SA_DBG2(("mpiDeviceHandleArrived:Port NULL\n"));
5442 /* pPort is agNULL*/
5443 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3L");
5444 return AGSA_RC_FAILURE;
5450 pPort = (agsaPort_t *) (agPortContext->sdkData);
5451 pPort->status &= ~PORT_INVALIDATING;
5452 pPort->portId =portId;
5453 saRoot->PortMap[pPort->portId].PortStatus &= ~PORT_INVALIDATING;
5455 SA_DBG1(("mpiDeviceHandleArrived: ~PORT_INVALIDATING Old port portID %d PortContext %p\n", portId, &pPort->portContext));
5458 /* build Device Information structure */
5459 si_memset(&pDeviceInfo, 0, sizeof(agsaSASDeviceInfo_t));
5460 if (ProtConrPortId & PROTOCOL_BITS)
5462 protocol = SA_IDFRM_SSP_BIT; /* SSP */
5463 pDeviceInfo.commonDevInfo.devType_S_Rate = (bit8)(conRate | 0x10);
5468 protocol = SA_IDFRM_SMP_BIT; /* SMP */
5469 pDeviceInfo.commonDevInfo.devType_S_Rate = (bit8)conRate;
5471 pDeviceInfo.initiator_ssp_stp_smp = protocol;
5472 pDeviceInfo.numOfPhys = 1;
5473 pDeviceInfo.commonDevInfo.sasAddressHi[0] = pMsg1->sasAddrHi[0];
5474 pDeviceInfo.commonDevInfo.sasAddressHi[1] = pMsg1->sasAddrHi[1];
5475 pDeviceInfo.commonDevInfo.sasAddressHi[2] = pMsg1->sasAddrHi[2];
5476 pDeviceInfo.commonDevInfo.sasAddressHi[3] = pMsg1->sasAddrHi[3];
5477 pDeviceInfo.commonDevInfo.sasAddressLo[0] = pMsg1->sasAddrLow[0];
5478 pDeviceInfo.commonDevInfo.sasAddressLo[1] = pMsg1->sasAddrLow[1];
5479 pDeviceInfo.commonDevInfo.sasAddressLo[2] = pMsg1->sasAddrLow[2];
5480 pDeviceInfo.commonDevInfo.sasAddressLo[3] = pMsg1->sasAddrLow[3];
5481 pDeviceInfo.commonDevInfo.flag = 0;
5482 pDeviceInfo.commonDevInfo.it_NexusTimeout = ITL_TO_DEFAULT;
5484 /* deviceId -> agDeviceHandle */
5485 pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceHandle;
5487 if (agNULL == pDevice)
5490 si_memset(&remoteIdentify, 0, sizeof(agsaSASIdentify_t));
5493 remoteIdentify.sasAddressHi[i] = pMsg1->sasAddrHi[i];
5494 remoteIdentify.sasAddressLo[i] = pMsg1->sasAddrLow[i];
5496 remoteIdentify.deviceType_addressFrameType = (bit8)(pDeviceInfo.commonDevInfo.devType_S_Rate & 0xC0);
5497 dTypeSRate = pDeviceInfo.commonDevInfo.devType_S_Rate;
5498 /* get Device from free Device List */
5499 pDevice = siPortSASDeviceAdd(agRoot, pPort, remoteIdentify, agTRUE, SMP_TO_DEFAULT, ITL_TO_DEFAULT, 0, dTypeSRate, 0);
5500 if (agNULL == pDevice)
5502 SA_DBG1(("mpiDeviceHandleArrived: Device Handle is NULL, Out of Resources Error.\n"));
5506 bit32 AccStatus = 0;
5507 bit32 SaveId = FwdDeviceId & 0xFFFF;
5508 /* mapping the device handle and device id */
5509 saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceIdFromFW = FwdDeviceId;
5510 saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceHandle = (void *)pDevice;
5511 pDevice->DeviceMapIndex = FwdDeviceId;
5512 SA_DBG2(("mpiDeviceHandleArrived: New deviceID 0x%x Device Context %p DeviceTypeSRate 0x%x\n", FwdDeviceId, pDevice, dTypeSRate));
5515 AccStatus = ossaDeviceHandleAccept(agRoot, &(pDevice->initiatorDevHandle), &pDeviceInfo, agPortContext,&FwdDeviceId );
5517 HostAssignedId = (FwdDeviceId & 0xFFFF0000) >> SHIFT16;
5520 if( SaveId == (FwdDeviceId & 0xFFFF) )
5523 saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceIdFromFW = FwdDeviceId;
5524 pDevice->DeviceMapIndex = FwdDeviceId;
5526 SA_DBG1(("mpiDeviceHandleArrived:FwdDeviceId 0x%x HostAssignedId 0x%x\n",FwdDeviceId,HostAssignedId));
5530 SA_DBG1(("mpiDeviceHandleArrived:Id mangled expect 0x%x Got 0x%x\n",SaveId, (FwdDeviceId & 0xFFFF)));
5531 ret = AGSA_RC_FAILURE;
5535 /* get AWT flag and ITLN_TMO value */
5537 if(AccStatus == OSSA_RC_ACCEPT )
5539 /* build DEVICE_HANDLE_ACCEPT IOMB and send to SPC with action=accept */
5540 mpiDevHandleAcceptCmd(agRoot, agNULL, CTag, FwdDeviceId, 0, pDeviceInfo.commonDevInfo.flag, pDeviceInfo.commonDevInfo.it_NexusTimeout, 0);
5544 mpiDevHandleAcceptCmd(agRoot, agNULL, CTag, FwdDeviceId, 1, pDeviceInfo.commonDevInfo.flag, pDeviceInfo.commonDevInfo.it_NexusTimeout, 0);
5549 SA_DBG1(("mpiDeviceHandleArrived Device 0x%08X flag 0x%08X %s WWID= %02x%02x%02x%02x:%02x%02x%02x%02x, %s\n",
5551 pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag,
5552 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x20 ? "SATA DA" :
5553 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x10 ? "SSP/SMP" :
5554 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x0 ? " STP " : "Unknown",
5556 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3],
5557 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2],
5558 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1],
5559 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0],
5560 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3],
5561 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2],
5562 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1],
5563 pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0],
5565 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 8 ? " 1.5G" :
5566 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 9 ? " 3.0G" :
5567 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 10 ? " 6.0G" :
5568 (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 11 ? "12.0G" : "????" ));
5570 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3L");
5574 /******************************************************************************/
5575 /*! \brief Get Time Stamp Response
5577 * This routine handles the response of Get Time Stamp Command
5579 * \param agRoot Handles for this instance of SAS/SATA LLL
5580 * \param pIomb Pointer of IOMB Mesage
5582 * \return sucess or fail
5585 /*******************************************************************************/
5586 GLOBAL bit32 mpiGetTimeStampRsp(
5588 agsaGetTimeStampRsp_t *pIomb
5591 bit32 ret = AGSA_RC_SUCCESS;
5592 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5593 agsaIORequestDesc_t *pRequest;
5594 agsaContext_t *agContext;
5595 bit32 tag, timeStampLower, timeStampUpper;
5597 smTraceFuncEnter(hpDBG_VERY_LOUD,"3M");
5599 SA_DBG3(("mpiGetTimeStampRsp: HTAG=0x%x\n", pIomb->tag));
5601 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetTimeStampRsp_t, tag));
5602 OSSA_READ_LE_32(AGROOT, &timeStampLower, pIomb, OSSA_OFFSET_OF(agsaGetTimeStampRsp_t, timeStampLower));
5603 OSSA_READ_LE_32(AGROOT, &timeStampUpper, pIomb, OSSA_OFFSET_OF(agsaGetTimeStampRsp_t, timeStampUpper));
5604 /* get request from IOMap */
5605 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5606 if (agNULL == pRequest)
5608 SA_DBG1(("mpiGetTimeStampRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x\n", tag));
5609 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3M");
5610 return AGSA_RC_FAILURE;
5613 agContext = saRoot->IOMap[tag].agContext;
5614 /* remove the request from IOMap */
5615 saRoot->IOMap[tag].Tag = MARK_OFF;
5616 saRoot->IOMap[tag].IORequest = agNULL;
5617 saRoot->IOMap[tag].agContext = agNULL;
5619 SA_ASSERT((pRequest->valid), "pRequest->valid");
5621 SA_DBG3(("mpiGetTimeStampRsp: timeStampLower 0x%x timeStampUpper 0x%x\n", timeStampLower, timeStampUpper));
5623 ossaGetTimeStampCB(agRoot, agContext, timeStampLower, timeStampUpper);
5625 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5626 pRequest->valid = agFALSE;
5627 /* return the request to free pool */
5628 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5630 SA_DBG1(("mpiGetTimeStampRsp: saving pRequest (%p) for later use\n", pRequest));
5631 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5635 /* return the request to free pool */
5636 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5638 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5641 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3M");
5645 /******************************************************************************/
5646 /*! \brief SAS HW Event Ack Response
5648 * This routine handles the response of SAS HW Event Ack Command
5650 * \param agRoot Handles for this instance of SAS/SATA LLL
5651 * \param pIomb Pointer of IOMB Mesage
5653 * \return sucess or fail
5656 /*******************************************************************************/
5657 GLOBAL bit32 mpiSASHwEventAckRsp(
5659 agsaSASHwEventAckRsp_t *pIomb
5662 bit32 ret = AGSA_RC_SUCCESS;
5663 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5664 agsaIORequestDesc_t *pRequest;
5665 agsaContext_t *agContext;
5669 smTraceFuncEnter(hpDBG_VERY_LOUD,"2N");
5671 SA_DBG2(("mpiSASHwEventAckRsp: Htag=0x%x %p\n", pIomb->tag,pIomb));
5673 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSASHwEventAckRsp_t, tag));
5674 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSASHwEventAckRsp_t, status));
5675 /* get request from IOMap */
5676 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5677 if (agNULL == pRequest)
5679 SA_DBG1(("mpiSASHwEventAckRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x Status=0x%x\n", tag, status));
5680 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2N");
5681 return AGSA_RC_FAILURE;
5684 agContext = saRoot->IOMap[tag].agContext;
5685 /* remove the request from IOMap */
5686 saRoot->IOMap[tag].Tag = MARK_OFF;
5687 saRoot->IOMap[tag].IORequest = agNULL;
5688 saRoot->IOMap[tag].agContext = agNULL;
5689 SA_ASSERT((pRequest->valid), "pRequest->valid");
5691 SA_DBG1(("mpiSASHwEventAckRsp: status 0x%x Htag=0x%x HwAckType=0x%x\n",status,pIomb->tag,pRequest->HwAckType ));
5693 ossaHwEventAckCB(agRoot, agContext, status);
5695 pPort = pRequest->pPort;
5696 if (agNULL != pPort)
5698 SA_DBG1(("mpiSASHwEventAckRsp: pPort %p tobedeleted %d\n", pPort, pPort->tobedeleted));
5699 if (pPort->status & PORT_INVALIDATING && pPort->tobedeleted )
5701 SA_DBG1(("mpiSASHwEventAckRsp: PORT_INVALIDATING portInvalid portID %d pPort %p, nulling out PortContext\n", pPort->portId, pPort));
5702 /* invalid the port */
5703 siPortInvalid(agRoot, pPort);
5704 /* map out the portmap */
5705 saRoot->PortMap[pPort->portId].PortContext = agNULL;
5706 saRoot->PortMap[pPort->portId].PortID = PORT_MARK_OFF;
5707 saRoot->PortMap[pPort->portId].PortStatus |= PORT_INVALIDATING;
5711 SA_DBG1(("mpiSASHwEventAckRsp:pPort->status 0x%x Htag=0x%x %p\n",pPort->status, pIomb->tag,pIomb));
5716 SA_DBG1(("mpiSASHwEventAckRsp: pPort is NULL, no portId, HTag=0x%x\n", tag));
5719 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5720 pRequest->valid = agFALSE;
5721 /* return the request to free pool */
5722 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5724 SA_DBG1(("mpiSASHwEventAckRsp: saving pRequest (%p) for later use\n", pRequest));
5725 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5729 /* return the request to free pool */
5730 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5732 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5735 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2N");
5739 /******************************************************************************/
5740 /*! \brief Port Control Response
5742 * This routine handles the response of SAS HW Event Ack Command
5744 * \param agRoot Handles for this instance of SAS/SATA LLL
5745 * \param pIomb Pointer of IOMB Mesage
5747 * \return sucess or fail
5750 /*******************************************************************************/
5751 GLOBAL bit32 mpiPortControlRsp(
5753 agsaPortControlRsp_t *pIomb
5756 bit32 ret = AGSA_RC_SUCCESS;
5757 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5758 agsaIORequestDesc_t *pRequest = agNULL;
5759 agsaContext_t *agContext = agNULL;
5760 agsaPortContext_t *agPortContext = agNULL;
5766 bit32 portOperation =0;
5768 smTraceFuncEnter(hpDBG_VERY_LOUD,"3O");
5770 SA_DBG2(("mpiPortControlRsp: HTag=0x%x\n", pIomb->tag));
5772 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t, tag));
5773 OSSA_READ_LE_32(AGROOT, &operation, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t, portOPPortId));
5774 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t, status));
5775 OSSA_READ_LE_32(AGROOT, &portState, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t,rsvdPortState ));
5777 /* get request from IOMap */
5778 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5779 if (agNULL == pRequest)
5781 SA_DBG1(("mpiPortControlRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x Status=0x%x\n", tag, status));
5782 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3O");
5783 return AGSA_RC_FAILURE;
5786 agContext = saRoot->IOMap[tag].agContext;
5787 /* remove the request from IOMap */
5788 saRoot->IOMap[tag].Tag = MARK_OFF;
5789 saRoot->IOMap[tag].IORequest = agNULL;
5790 saRoot->IOMap[tag].agContext = agNULL;
5792 SA_ASSERT((pRequest->valid), "pRequest->valid");
5794 if(!pRequest->valid)
5796 SA_DBG1(("mpiPortControlRsp: pRequest->valid %d not set\n", pRequest->valid));
5799 SA_DBG2(("mpiPortControlRsp: pRequest->completionCB %p\n", pRequest->completionCB));
5801 port = operation & PORTID_MASK;
5803 if(port < AGSA_MAX_VALID_PORTS )
5805 SA_DBG2(("mpiPortControlRsp: PortID 0x%x PortStatus 0x%x PortContext %p\n",
5806 saRoot->PortMap[port].PortID,
5807 saRoot->PortMap[port].PortStatus,
5808 saRoot->PortMap[port].PortContext));
5810 agPortContext = (agsaPortContext_t *)saRoot->PortMap[port].PortContext;
5812 SA_DBG2(("mpiPortControlRsp: PortID 0x%x PortStatus 0x%x PortContext %p\n",saRoot->PortMap[operation & PORTID_MASK].PortID,saRoot->PortMap[operation & PORTID_MASK].PortStatus,saRoot->PortMap[operation & PORTID_MASK].PortContext));
5813 agPortContext = (agsaPortContext_t *)saRoot->PortMap[operation & PORTID_MASK].PortContext;
5814 SA_DBG1(("mpiPortControlRsp: agPortContext %p\n",agPortContext ));
5817 SA_DBG2(("mpiPortControlRsp: portID 0x%x status 0x%x\n", (operation & PORTID_MASK), status));
5819 SA_DBG1(("mpiPortControlRsp: portID 0x%x status 0x%x agPortContext %p\n",port, status,agPortContext));
5821 portOperation = (((operation & LOCAL_PHY_OP_BITS) >> SHIFT8) | (portState << SHIFT28) );
5823 SA_DBG1(("mpiPortControlRsp: portState 0x%x operation 0x%x portOperation 0x%x\n",portState, operation,portOperation ));
5825 switch(portOperation)
5827 case AGSA_PORT_SET_SMP_PHY_WIDTH:
5828 SA_DBG1(("mpiPortControlRsp: AGSA_PORT_SET_SMP_PHY_WIDTH operation 0x%x\n",operation ));
5830 case AGSA_PORT_SET_PORT_RECOVERY_TIME:
5831 SA_DBG1(("mpiPortControlRsp: AGSA_PORT_SET_PORT_RECOVERY_TIME operation 0x%x\n",operation ));
5833 case AGSA_PORT_IO_ABORT:
5834 SA_DBG1(("mpiPortControlRsp: AGSA_PORT_IO_ABORT operation 0x%x\n",operation ));
5836 case AGSA_PORT_SET_PORT_RESET_TIME:
5837 SA_DBG1(("mpiPortControlRsp: AGSA_PORT_SET_PORT_RESET_TIME operation 0x%x\n",operation ));
5839 case AGSA_PORT_HARD_RESET:
5840 SA_DBG1(("mpiPortControlRsp: AGSA_PORT_HARD_RESET operation 0x%x\n",operation ));
5842 case AGSA_PORT_CLEAN_UP:
5843 SA_DBG1(("mpiPortControlRsp: AGSA_PORT_CLEAN_UP operation 0x%x\n",operation ));
5845 case AGSA_STOP_PORT_RECOVERY_TIMER:
5846 SA_DBG1(("mpiPortControlRsp: AGSA_STOP_PORT_RECOVERY_TIMER operation 0x%x\n",operation ));
5850 SA_DBG1(("mpiPortControlRsp: Unknown operation 0x%x\n",operation ));
5854 ossaPortControlCB(agRoot, agContext, agPortContext, portOperation, status);
5856 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5857 pRequest->valid = agFALSE;
5858 /* return the request to free pool */
5859 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5861 SA_DBG1(("mpiPortControlRsp: saving pRequest (%p) for later use\n", pRequest));
5862 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5866 /* return the request to free pool */
5867 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5869 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5871 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3O");
5876 /******************************************************************************/
5877 /*! \brief SPC MPI SMP ABORT Response
5879 * This function handles the SMP Abort Response.
5881 * \param agRoot Handles for this instance of SAS/SATA LLL
5882 * \param pIomb pointer of Message
5884 * \return The read value
5887 /*******************************************************************************/
5888 GLOBAL bit32 mpiSMPAbortRsp(
5890 agsaSMPAbortRsp_t *pIomb
5893 bit32 ret = AGSA_RC_SUCCESS;
5894 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5895 agsaIORequestDesc_t *pRequest;
5896 agsaDeviceDesc_t *pDevice;
5897 bit32 tag, scp, status;
5899 smTraceFuncEnter(hpDBG_VERY_LOUD,"3P");
5901 SA_DBG3(("mpiSMPAbortRsp: HTag=0x%x Status=0x%x\n", pIomb->tag, pIomb->status));
5903 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSMPAbortRsp_t, tag));
5904 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSMPAbortRsp_t, status));
5905 OSSA_READ_LE_32(AGROOT, &scp, pIomb, OSSA_OFFSET_OF(agsaSMPAbortRsp_t, scp));
5907 /* get IORequest from IOMap */
5908 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
5910 if (agNULL == pRequest)
5912 SA_DBG1(("mpiSMPAbortRsp: pRequest is NULL, HTag=0x%x Status=0x%x\n", pIomb->tag, pIomb->status));
5913 SA_ASSERT((pRequest), "pRequest");
5914 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3P");
5915 return AGSA_RC_FAILURE;
5918 if ( agTRUE == pRequest->valid )
5920 pDevice = pRequest->pDevice;
5921 SA_ASSERT((pRequest->pDevice), "pRequest->pDevice");
5923 SA_DBG3(("mpiSMPAbortRsp: request abort is valid Htag 0x%x\n", tag));
5925 /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
5926 saRoot->IOMap[tag].Tag = MARK_OFF;
5927 saRoot->IOMap[tag].IORequest = agNULL;
5928 saRoot->IOMap[tag].agContext = agNULL;
5930 if( pRequest->completionCB == agNULL )
5932 SA_DBG1(("mpiSMPAbortRsp: ************************************************* Valid for Expander only tag 0x%x\n", tag));
5933 ossaSMPAbortCB(agRoot, pRequest->pIORequestContext, scp, status);
5937 (*(ossaGenericAbortCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, scp, status);
5940 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5942 /* Delete the request from the pendingIORequests */
5943 saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
5944 pRequest->valid = agFALSE;
5945 /* return the request to free pool */
5946 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5948 SA_DBG1(("mpiSMPAbortRsp: saving pRequest (%p) for later use\n", pRequest));
5949 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5953 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5955 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5960 ret = AGSA_RC_FAILURE;
5961 SA_DBG1(("mpiSMPAbortRsp: the request is not valid any more. Tag=%x\n", pRequest->HTag));
5965 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3P");
5970 /******************************************************************************/
5971 /*! \brief SPC MPI Device Handle Arrived Event (target mode)
5973 * This function handles the Device Handle Arrived Event.
5975 * \param agRoot Handles for this instance of SAS/SATA LLL
5976 * \param pMsg1 pointer of Message
5978 * \return The read value
5981 /*******************************************************************************/
5982 GLOBAL bit32 mpiDeviceHandleRemoval(
5984 agsaDeviceHandleRemoval_t *pMsg1)
5986 bit32 ret = AGSA_RC_SUCCESS;
5987 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5988 agsaDeviceDesc_t *pDevice;
5989 agsaPortContext_t *agPortContext;
5991 bit32 deviceid, deviceIdx;
5993 smTraceFuncEnter(hpDBG_VERY_LOUD,"3R");
5995 /* convert endiness if necassary */
5996 OSSA_READ_LE_32(AGROOT, &portId, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleRemoval_t, portId));
5997 OSSA_READ_LE_32(AGROOT, &deviceid, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleRemoval_t, deviceId));
5999 SA_DBG3(("mpiDeviceHandleRemoval: portId=0x%x deviceId=0x%x\n", portId, deviceid));
6001 pDevice = saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
6002 SA_DBG2(("mpiDeviceHandleRemoval:PortID 0x%x PortStatus 0x%x PortContext %p\n",
6003 saRoot->PortMap[portId & PORTID_MASK].PortID,
6004 saRoot->PortMap[portId & PORTID_MASK].PortStatus,
6005 saRoot->PortMap[portId & PORTID_MASK].PortContext));
6006 agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId & PORTID_MASK].PortContext;
6009 SA_DBG1(("mpiDeviceHandleRemoval: portId=0x%x deviceId=0x%x autoDeregDeviceflag=0x%x\n", portId, deviceid,saRoot->autoDeregDeviceflag[portId & PORTID_MASK]));
6010 if (pDevice->targetDevHandle.sdkData)
6012 ossaDeviceHandleRemovedEvent(agRoot, &(pDevice->targetDevHandle), agPortContext);
6014 if (saRoot->autoDeregDeviceflag[portId & PORTID_MASK])
6016 /* remove the DeviceMap and MapIndex */
6017 deviceIdx = pDevice->DeviceMapIndex & DEVICE_ID_BITS;
6018 SA_DBG1(("mpiDeviceHandleRemoval: A Freed portId=0x%x deviceId=0x%x\n", portId, deviceid));
6019 OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
6021 saRoot->DeviceMap[deviceIdx].DeviceIdFromFW = 0;
6022 saRoot->DeviceMap[deviceIdx].DeviceHandle = agNULL;
6023 pDevice->DeviceMapIndex = 0;
6025 /* Reset the device data structure */
6026 pDevice->pPort = agNULL;
6027 pDevice->targetDevHandle.sdkData = agNULL;
6028 pDevice->targetDevHandle.osData = agNULL;
6029 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6030 saLlistAdd(&(saRoot->freeDevicesList), &(pDevice->linkNode));
6031 SA_DBG1(("mpiDeviceHandleRemoval: portId=0x%x deviceId=0x%x\n", portId, deviceid));
6033 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6038 if (pDevice->initiatorDevHandle.sdkData)
6040 ossaDeviceHandleRemovedEvent(agRoot, &(pDevice->initiatorDevHandle), agPortContext);
6042 if (saRoot->autoDeregDeviceflag[portId & PORTID_MASK])
6044 /* remove the DeviceMap and MapIndex */
6045 deviceIdx = pDevice->DeviceMapIndex & DEVICE_ID_BITS;
6046 SA_DBG1(("mpiDeviceHandleRemoval: A Freed portId=0x%x deviceId=0x%x\n", portId, deviceid));
6047 OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
6048 saRoot->DeviceMap[deviceIdx].DeviceIdFromFW = 0;
6049 saRoot->DeviceMap[deviceIdx].DeviceHandle = agNULL;
6050 pDevice->DeviceMapIndex = 0;
6052 /* Reset the device data structure */
6053 pDevice->pPort = agNULL;
6054 pDevice->initiatorDevHandle.sdkData = agNULL;
6055 pDevice->initiatorDevHandle.osData = agNULL;
6056 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6057 saLlistAdd(&(saRoot->freeDevicesList), &(pDevice->linkNode));
6058 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6063 /* no callback because bad device_id */
6064 SA_DBG1(("mpiDeviceHandleRemoval: Bad Device Handle, deviceId=0x%x\n", deviceid));
6068 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3R");
6072 /******************************************************************************/
6073 /*! \brief Set Device State Response
6075 * This routine handles the response of SET Device State Response
6077 * \param agRoot Handles for this instance of SAS/SATA LLL
6078 * \param pIomb Pointer of IOMB Mesage
6080 * \return sucess or fail
6083 /*******************************************************************************/
6084 GLOBAL bit32 mpiSetDeviceStateRsp(
6086 agsaSetDeviceStateRsp_t *pIomb
6089 bit32 ret = AGSA_RC_SUCCESS;
6090 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6091 agsaIORequestDesc_t *pRequest;
6092 agsaDevHandle_t *agDevHandle;
6093 agsaDeviceDesc_t *pDevice;
6094 agsaContext_t *agContext;
6095 bit32 tag, status, deviceState, deviceId;
6097 smTraceFuncEnter(hpDBG_VERY_LOUD,"3Q");
6099 SA_DBG1(("mpiSetDeviceStateRsp: HTag=0x%x, deviceId=0x%x\n", pIomb->tag, pIomb->deviceId));
6101 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, tag));
6102 OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, deviceId));
6103 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, status));
6105 /* get request from IOMap */
6106 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6107 if (agNULL == pRequest)
6109 SA_DBG1(("mpiSetDeviceStateRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6110 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3Q");
6111 return AGSA_RC_FAILURE;
6114 agContext = saRoot->IOMap[tag].agContext;
6115 /* remove the request from IOMap */
6116 saRoot->IOMap[tag].Tag = MARK_OFF;
6117 saRoot->IOMap[tag].IORequest = agNULL;
6118 saRoot->IOMap[tag].agContext = agNULL;
6120 SA_ASSERT((pRequest->valid), "pRequest->valid");
6122 /* status is SUCCESS */
6123 OSSA_READ_LE_32(AGROOT, &deviceState, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, pds_nds));
6125 /* find device handle from device index */
6126 pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceId & DEVICE_ID_BITS].DeviceHandle;
6127 if (agNULL == pDevice)
6129 SA_DBG1(("mpiSetDeviceStateRsp: DeviceHandle is NULL!!! deviceId=0x%x TAG=0x%x STATUS=0x%x \n", deviceId, tag, status));
6130 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3Q");
6131 return AGSA_RC_FAILURE;
6134 if (pDevice->targetDevHandle.sdkData)
6136 agDevHandle = &(pDevice->targetDevHandle);
6140 agDevHandle = &(pDevice->initiatorDevHandle);
6143 if (agDevHandle == agNULL)
6145 SA_DBG1(("mpiSetDeviceStateRsp: warning!!! no deviceHandle is found"));
6146 ossaSetDeviceStateCB(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0, 0);
6147 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3Q");
6149 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6150 pRequest->valid = agFALSE;
6151 /* return the request to free pool */
6152 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6154 SA_DBG1(("mpiSetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
6155 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6159 /* return the request to free pool */
6160 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6162 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6164 return AGSA_RC_FAILURE;
6167 ossaSetDeviceStateCB(agRoot, agContext, agDevHandle, status, (deviceState & NDS_BITS),
6168 (deviceState & PDS_BITS) >> SHIFT4);
6170 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6171 pRequest->valid = agFALSE;
6172 /* return the request to free pool */
6173 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6175 SA_DBG1(("mpiSetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
6176 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6180 /* return the request to free pool */
6181 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6183 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6186 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3Q");
6190 /******************************************************************************/
6191 /*! \brief Get Device State Response
6193 * This routine handles the response of GET Device State Response
6195 * \param agRoot Handles for this instance of SAS/SATA LLL
6196 * \param pIomb Pointer of IOMB Mesage
6198 * \return sucess or fail
6201 /*******************************************************************************/
6202 GLOBAL bit32 mpiGetDeviceStateRsp(
6204 agsaGetDeviceStateRsp_t *pIomb
6207 bit32 ret = AGSA_RC_SUCCESS;
6208 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6209 agsaIORequestDesc_t *pRequest;
6210 agsaDevHandle_t *agDevHandle;
6211 agsaDeviceDesc_t *pDevice;
6212 agsaContext_t *agContext;
6213 bit32 tag, status, deviceId, deviceState;
6215 smTraceFuncEnter(hpDBG_VERY_LOUD,"3W");
6217 SA_DBG1(("mpiGetDeviceStateRsp: HTag=0x%x, deviceId=0x%x\n", pIomb->tag, pIomb->deviceId));
6219 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, tag));
6220 OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, deviceId));
6221 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, status));
6223 /* get request from IOMap */
6224 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6225 if (agNULL == pRequest)
6227 SA_DBG1(("mpiGetDeviceStateRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6228 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3W");
6229 return AGSA_RC_FAILURE;
6232 agContext = saRoot->IOMap[tag].agContext;
6233 /* remove the request from IOMap */
6234 saRoot->IOMap[tag].Tag = MARK_OFF;
6235 saRoot->IOMap[tag].IORequest = agNULL;
6236 saRoot->IOMap[tag].agContext = agNULL;
6238 SA_ASSERT((pRequest->valid), "pRequest->valid");
6240 /* status is SUCCESS */
6241 OSSA_READ_LE_32(AGROOT, &deviceState, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, ds));
6243 /* find device handle from device index */
6244 pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceId & DEVICE_ID_BITS].DeviceHandle;
6245 if (pDevice != agNULL)
6247 if (pDevice->targetDevHandle.sdkData)
6249 agDevHandle = &(pDevice->targetDevHandle);
6253 agDevHandle = &(pDevice->initiatorDevHandle);
6258 SA_DBG1(("mpiGetDeviceStateRsp: pDevice is NULL"));
6259 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3W");
6260 return AGSA_RC_FAILURE;
6263 if (agDevHandle == agNULL)
6265 SA_DBG1(("mpiGetDeviceStateRsp: warning!!! no deviceHandle is found"));
6266 ossaGetDeviceStateCB(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0);
6267 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3W");
6269 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6270 pRequest->valid = agFALSE;
6271 /* return the request to free pool */
6272 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6274 SA_DBG1(("mpiGetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
6275 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6279 /* return the request to free pool */
6280 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6282 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6284 return AGSA_RC_FAILURE;
6287 ossaGetDeviceStateCB(agRoot, agContext, agDevHandle, status, deviceState);
6289 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6290 pRequest->valid = agFALSE;
6291 /* return the request to free pool */
6292 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6294 SA_DBG1(("mpiGetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
6295 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6299 /* return the request to free pool */
6300 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6302 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6305 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3W");
6309 /******************************************************************************/
6310 /*! \brief SAS ReInitialize Response
6312 * This routine handles the response of SAS Reinitialize Response
6314 * \param agRoot Handles for this instance of SAS/SATA LLL
6315 * \param pIomb Pointer of IOMB Mesage
6317 * \return sucess or fail
6320 /*******************************************************************************/
6321 GLOBAL bit32 mpiSasReInitializeRsp(
6323 agsaSasReInitializeRsp_t *pIomb
6326 bit32 ret = AGSA_RC_SUCCESS;
6327 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6328 agsaIORequestDesc_t *pRequest;
6329 agsaContext_t *agContext;
6330 agsaSASReconfig_t SASReconfig;
6331 bit32 tag, status, setFlags, MaxPorts;
6332 bit32 openRejReCmdData, sataHOLTMO;
6334 smTraceFuncEnter(hpDBG_VERY_LOUD,"3X");
6336 SA_DBG1(("mpiSasReInitializeRsp: HTag=0x%x, status=0x%x\n", pIomb->tag, pIomb->status));
6338 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, tag));
6339 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, status));
6340 OSSA_READ_LE_32(AGROOT, &setFlags, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, setFlags));
6341 OSSA_READ_LE_32(AGROOT, &MaxPorts, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, MaxPorts));
6342 OSSA_READ_LE_32(AGROOT, &openRejReCmdData, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, openRejReCmdData));
6343 OSSA_READ_LE_32(AGROOT, &sataHOLTMO, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, sataHOLTMO));
6345 /* get request from IOMap */
6346 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6347 if (agNULL == pRequest)
6349 SA_DBG1(("mpiSasReInitializeRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6350 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3X");
6351 return AGSA_RC_FAILURE;
6354 agContext = saRoot->IOMap[tag].agContext;
6355 /* remove the request from IOMap */
6356 saRoot->IOMap[tag].Tag = MARK_OFF;
6357 saRoot->IOMap[tag].IORequest = agNULL;
6358 saRoot->IOMap[tag].agContext = agNULL;
6360 SA_ASSERT((pRequest->valid), "pRequest->valid");
6362 SASReconfig.flags = setFlags;
6363 SASReconfig.maxPorts = (bit8)(MaxPorts & 0xFF);
6364 SASReconfig.openRejectRetriesCmd = (bit16)((openRejReCmdData & 0xFFFF0000) >> SHIFT16);
6365 SASReconfig.openRejectRetriesData = (bit16)(openRejReCmdData & 0x0000FFFF);
6366 SASReconfig.sataHolTmo = (bit16)(sataHOLTMO & 0xFFFF);
6367 ossaReconfigSASParamsCB(agRoot, agContext, status, &SASReconfig);
6369 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6370 pRequest->valid = agFALSE;
6371 /* return the request to free pool */
6372 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6374 SA_DBG1(("mpiSasReInitializeRsp: saving pRequest (%p) for later use\n", pRequest));
6375 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6379 /* return the request to free pool */
6380 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6382 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6385 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3X");
6390 /******************************************************************************/
6391 /*! \brief serial GPIO Response
6393 * This routine handles the response of serial GPIO Response
6395 * \param agRoot Handles for this instance of SAS/SATA LLL
6396 * \param pIomb Pointer of IOMB Mesage
6398 * \return sucess or fail
6401 /*******************************************************************************/
6402 GLOBAL bit32 mpiSGpioRsp(
6404 agsaSGpioRsp_t *pInIomb
6407 bit32 ret = AGSA_RC_SUCCESS;
6408 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6409 agsaIORequestDesc_t *pRequest = NULL;
6410 agsaContext_t *agContext = NULL;
6411 bit32 i, tag, resultFunctionFrameType;
6412 agsaSGpioReqResponse_t SgpioResponse = {0};
6414 smTraceFuncEnter(hpDBG_VERY_LOUD,"3Y");
6416 SA_DBG3(("mpiSGpioRsp: HTAG=0x%x\n", pInIomb->tag));
6418 OSSA_READ_LE_32(AGROOT, &tag, pInIomb, OSSA_OFFSET_OF(agsaSGpioRsp_t, tag));
6419 OSSA_READ_LE_32(AGROOT, &resultFunctionFrameType, pInIomb, OSSA_OFFSET_OF(agsaSGpioRsp_t, resultFunctionFrameType));
6421 SgpioResponse.smpFrameType = resultFunctionFrameType & 0xFF;
6422 SgpioResponse.function = (resultFunctionFrameType & 0xFF00) >> 8;
6423 SgpioResponse.functionResult = (resultFunctionFrameType & 0xFF0000) >> 16;
6425 if (SA_SAS_SMP_READ_GPIO_REGISTER == SgpioResponse.function)
6427 for (i = 0; i < OSSA_SGPIO_MAX_READ_DATA_COUNT; i++)
6429 OSSA_READ_LE_32(AGROOT, &SgpioResponse.readWriteData[i], pInIomb, OSSA_OFFSET_OF(agsaSGpioRsp_t, readData) + (i * 4));
6433 /* Get the request from IOMap */
6434 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6435 if (agNULL == pRequest)
6437 SA_DBG1(("mpiSGpioRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, SgpioResponse.functionResult));
6438 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3Y");
6439 ret = AGSA_RC_FAILURE;
6443 agContext = saRoot->IOMap[tag].agContext;
6444 ossaSGpioCB(agRoot, agContext, &SgpioResponse);
6446 /* Return the request to free pool */
6447 saReturnRequestToFreePool(agRoot, pRequest);
6449 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3Y");
6455 /******************************************************************************/
6456 /*! \brief PCIE Diagnostics Response
6458 * This routine handles the response of PCIE Diagnostics Response
6460 * \param agRoot Handles for this instance of SAS/SATA LLL
6461 * \param pIomb Pointer of IOMB Mesage
6463 * \return sucess or fail
6466 /*******************************************************************************/
6467 GLOBAL bit32 mpiPCIeDiagExecuteRsp(
6472 bit32 ret = AGSA_RC_SUCCESS;
6473 agsaLLRoot_t *saRoot = agNULL;
6474 agsaIORequestDesc_t *pRequest;
6475 agsaContext_t *agContext;
6476 bit32 tag, Status, Command;
6477 agsaPCIeDiagResponse_t pciediadrsp;
6478 bit32 *pIomb = (bit32 *)pInIomb;
6480 smTraceFuncEnter(hpDBG_VERY_LOUD,"3Z");
6483 SA_ASSERT((agNULL != agRoot), "");
6484 saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
6485 SA_ASSERT((agNULL != saRoot), "");
6487 si_memset(&pciediadrsp, 0, sizeof(agsaPCIeDiagResponse_t));
6489 if(smIS_SPCV(agRoot))
6491 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,tag));
6492 OSSA_READ_LE_32(AGROOT, &Command, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,CmdTypeDesc));
6493 OSSA_READ_LE_32(AGROOT, &Status, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,Status));
6494 OSSA_READ_LE_32(AGROOT, &pciediadrsp.ERR_BLKH, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,ERR_BLKH ));
6495 OSSA_READ_LE_32(AGROOT, &pciediadrsp.ERR_BLKL, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,ERR_BLKL ));
6496 OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord8, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord8 ));
6497 OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord9, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord9 ));
6498 OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord10, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord10 ));
6499 OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord11, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord11 ));
6500 OSSA_READ_LE_32(AGROOT, &pciediadrsp.DIF_ERR, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DIF_ERR ));
6501 SA_DBG3(("mpiPCIeDiagExecuteRsp: HTAG=0x%x\n",tag));
6505 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsa_SPC_PCIeDiagExecuteRsp_t,tag));
6506 OSSA_READ_LE_32(AGROOT, &Command, pIomb, OSSA_OFFSET_OF(agsa_SPC_PCIeDiagExecuteRsp_t,CmdTypeDesc));
6507 OSSA_READ_LE_32(AGROOT, &Status, pIomb, OSSA_OFFSET_OF(agsa_SPC_PCIeDiagExecuteRsp_t,Status));
6508 SA_DBG3(("mpiPCIeDiagExecuteRsp: SPC HTAG=0x%x\n",tag));
6513 case OSSA_PCIE_DIAG_SUCCESS:
6514 SA_DBG3(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_SUCCESS TAG=0x%x STATUS=0x%x\n", tag, Status));
6516 case OSSA_IO_INVALID_LENGTH:
6517 SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_IO_INVALID_LENGTH TAG=0x%x STATUS=0x%x\n", tag, Status));
6519 case OSSA_PCIE_DIAG_INVALID_COMMAND:
6520 SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_COMMAND TAG=0x%x STATUS=0x%x\n", tag, Status));
6522 case OSSA_PCIE_DIAG_INTERNAL_FAILURE:
6523 SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INTERNAL_FAILURE TAG=0x%x STATUS=0x%x\n", tag, Status));
6525 case OSSA_PCIE_DIAG_INVALID_CMD_TYPE:
6526 SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_CMD_TYPE TAG=0x%x STATUS=0x%x\n", tag, Status));
6528 case OSSA_PCIE_DIAG_INVALID_CMD_DESC:
6529 SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_CMD_DESC TAG=0x%x STATUS=0x%x\n", tag, Status));
6531 case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
6532 SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
6534 case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_CRC_MISMATCH:
6535 SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_CRC_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
6537 case OSSA_PCIE_DIAG_INVALID_PCIE_ADDR:
6538 SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_PCIE_ADDR TAG=0x%x STATUS=0x%x\n", tag, Status));
6540 case OSSA_PCIE_DIAG_INVALID_BLOCK_SIZE:
6541 SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_BLOCK_SIZE TAG=0x%x STATUS=0x%x\n", tag, Status));
6543 case OSSA_PCIE_DIAG_LENGTH_NOT_BLOCK_SIZE_ALIGNED:
6544 SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_LENGTH_NOT_BLOCK_SIZE_ALIGNED TAG=0x%x STATUS=0x%x\n", tag, Status));
6546 case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_MISMATCH:
6547 SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
6549 case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
6550 SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
6553 SA_DBG1(("mpiPCIeDiagExecuteRsp: UNKNOWN status TAG=0x%x STATUS=0x%x\n", tag, Status));
6556 /* get request from IOMap */
6557 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6558 if (agNULL == pRequest)
6560 SA_DBG1(("mpiPCIeDiagExecuteRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, Status));
6561 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3Z");
6562 return AGSA_RC_FAILURE;
6565 agContext = saRoot->IOMap[tag].agContext;
6566 /* remove the request from IOMap */
6567 saRoot->IOMap[tag].Tag = MARK_OFF;
6568 saRoot->IOMap[tag].IORequest = agNULL;
6569 saRoot->IOMap[tag].agContext = agNULL;
6571 SA_ASSERT((pRequest->valid), "pRequest->valid");
6573 ossaPCIeDiagExecuteCB(agRoot, agContext, Status, Command,&pciediadrsp);
6575 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6576 pRequest->valid = agFALSE;
6577 /* return the request to free pool */
6578 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6580 SA_DBG1(("mpiPCIeDiagExecuteRsp: saving pRequest (%p) for later use\n", pRequest));
6581 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6585 /* return the request to free pool */
6586 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6588 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6590 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3Z");
6595 /******************************************************************************/
6596 /*! \brief Get DFE Data command Response
6598 * This routine handles the response of Get DFE Data command Response
6600 * \param agRoot Handles for this instance of SAS/SATA LLL
6601 * \param pIomb Pointer of IOMB Mesage
6603 * \return sucess or fail
6606 /*******************************************************************************/
6607 GLOBAL bit32 mpiGetDFEDataRsp(
6612 bit32 ret = AGSA_RC_SUCCESS;
6613 agsaLLRoot_t *saRoot = agNULL;
6614 agsaIORequestDesc_t *pRequest;
6615 agsaContext_t *agContext;
6616 bit32 tag = 0, status = 0, In_Ln = 0, MCNT = 0, NBT = 0;
6618 smTraceFuncEnter(hpDBG_VERY_LOUD,"2Y");
6621 SA_ASSERT((agNULL != agRoot), "");
6622 saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
6623 SA_ASSERT((agNULL != saRoot), "");
6625 if(smIS_SPCV(agRoot))
6627 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,tag));
6628 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,status));
6629 OSSA_READ_LE_32(AGROOT, &In_Ln, pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,reserved_In_Ln));
6630 OSSA_READ_LE_32(AGROOT, &MCNT, pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,MCNT));
6631 OSSA_READ_LE_32(AGROOT, &NBT, pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,NBT));
6635 /* SPC does not support this command */
6640 case OSSA_DFE_MPI_IO_SUCCESS:
6641 SA_DBG3(("mpiGetDFEDataRsp: OSSA_DFE_MPI_IO_SUCCESS TAG=0x%x STATUS=0x%x\n", tag, status));
6643 case OSSA_DFE_DATA_OVERFLOW:
6644 SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_DATA_OVERFLOW TAG=0x%x STATUS=0x%x\n", tag, status));
6646 case OSSA_DFE_MPI_ERR_RESOURCE_UNAVAILABLE:
6647 SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_MPI_ERR_RESOURCE_UNAVAILABLE TAG=0x%x STATUS=0x%x\n", tag, status));
6649 case OSSA_DFE_CHANNEL_DOWN:
6650 SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_CHANNEL_DOWN TAG=0x%x STATUS=0x%x\n", tag, status));
6652 case OSSA_DFE_MEASUREMENT_IN_PROGRESS:
6653 SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_MEASUREMENT_IN_PROGRESS TAG=0x%x STATUS=0x%x\n", tag, status));
6655 case OSSA_DFE_CHANNEL_INVALID:
6656 SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_CHANNEL_INVALID TAG=0x%x STATUS=0x%x\n", tag, status));
6658 case OSSA_DFE_DMA_FAILURE:
6659 SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_DMA_FAILURE TAG=0x%x STATUS=0x%x\n", tag, status));
6662 SA_DBG1(("mpiGetDFEDataRsp: UNKNOWN status TAG=0x%x STATUS=0x%x\n", tag, status));
6666 /* get request from IOMap */
6667 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6668 if (agNULL == pRequest)
6670 SA_DBG1(("mpiGetDFEDataRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, status));
6671 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2Y");
6672 return AGSA_RC_FAILURE;
6675 agContext = saRoot->IOMap[tag].agContext;
6676 /* remove the request from IOMap */
6677 saRoot->IOMap[tag].Tag = MARK_OFF;
6678 saRoot->IOMap[tag].IORequest = agNULL;
6679 saRoot->IOMap[tag].agContext = agNULL;
6681 SA_ASSERT((pRequest->valid), "pRequest->valid");
6683 ossaGetDFEDataCB(agRoot, agContext, status, NBT);
6685 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6686 pRequest->valid = agFALSE;
6687 /* return the request to free pool */
6688 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6690 SA_DBG1(("mpiGetDFEDataRsp: saving pRequest (%p) for later use\n", pRequest));
6691 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6695 /* return the request to free pool */
6696 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6698 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6700 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2Y");
6706 /******************************************************************************/
6707 /*! \brief SAS Set Controller Config Response
6709 * This routine handles the response of Set Controller Config Command
6711 * \param agRoot Handles for this instance of SAS/SATA LLL
6712 * \param pIomb Pointer of IOMB Mesage
6714 * \return sucess or fail
6717 /*******************************************************************************/
6718 GLOBAL bit32 mpiSetControllerConfigRsp(
6720 agsaSetControllerConfigRsp_t *pIomb
6723 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6724 agsaIORequestDesc_t *pRequest;
6725 agsaHWEventMode_t agMode;
6726 bit32 status, errorQualifierPage, tag;
6727 bit32 errorQualifier;
6730 smTraceFuncEnter(hpDBG_VERY_LOUD,"3a");
6732 SA_DBG1(("mpiSetControllerConfigRsp: HTag=0x%x\n", pIomb->tag));
6734 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetControllerConfigRsp_t, tag));
6735 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetControllerConfigRsp_t, status));
6736 OSSA_READ_LE_32(AGROOT, &errorQualifierPage, pIomb, OSSA_OFFSET_OF(agsaSetControllerConfigRsp_t, errorQualifierPage));
6738 /* get request from IOMap */
6739 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6740 if (agNULL == pRequest)
6742 SA_DBG1(("mpiSetControllerConfigRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6743 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3a");
6744 return AGSA_RC_FAILURE;
6747 si_memset(&agMode, 0, sizeof(agsaHWEventMode_t));
6748 agMode.modePageOperation = agsaModePageSet;
6749 agMode.status = status;
6750 agMode.context = saRoot->IOMap[tag].agContext;
6751 errorQualifier = (errorQualifierPage & 0xFFFF0000) >> SHIFT16;
6752 pagetype = (errorQualifierPage & 0xFF);
6756 SA_DBG1(("mpiSetControllerConfigRsp: Error detected tag 0x%x pagetype 0x%x status 0x%x errorQualifier 0x%x\n",
6757 tag, pagetype,status, errorQualifier));
6761 SA_DBG1(("mpiSetControllerConfigRsp: tag 0x%x pagetype 0x%x status 0x%x\n", tag, pagetype,status ));
6767 case AGSA_ENCRYPTION_DEK_CONFIG_PAGE:
6768 case AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE:
6769 case AGSA_INTERRUPT_CONFIGURATION_PAGE:
6770 case AGSA_ENCRYPTION_HMAC_CONFIG_PAGE:
6771 case AGSA_IO_GENERAL_CONFIG_PAGE:
6772 /*case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:*/
6773 /* Report the event before freeing the IOMB */
6774 SA_DBG1(("mpiSetControllerConfigRsp:OSSA_HW_EVENT_MODE\n"));
6775 ossaHwCB(agRoot,agMode.context, OSSA_HW_EVENT_MODE, errorQualifierPage, (void *) &agMode, 0);
6780 case AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE:
6781 SA_DBG1(("mpiSetControllerConfigRsp:warning!!!! GENERAL_CONFIG_PAGE is read only, cannot be set\n"));
6784 /* why we need to read the scrach pad register when handling ENCRYPTION_SECURITY_PARM_PAGE??? */
6785 case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:
6787 bit32 ScratchPad1 = 0;
6788 bit32 ScratchPad3 = 0;
6789 agsaEncryptInfo_t encrypt;
6790 agsaEncryptInfo_t *encryptInfo = &encrypt;
6791 SA_DBG1(("mpiSetControllerConfigRsp: AGSA_ENCRYPTION_CONTROL_PARM_PAGE\n" ));
6793 if( pRequest->modePageContext)
6795 pRequest->modePageContext = agFALSE;
6798 si_memset(&encrypt, 0, sizeof(agsaEncryptInfo_t));
6799 encryptInfo->status = 0;
6800 encryptInfo->encryptionCipherMode = 0;
6801 encryptInfo->encryptionSecurityMode = 0;
6803 ScratchPad1 = ossaHwRegRead(agRoot,V_Scratchpad_1_Register);
6804 ScratchPad3 = ossaHwRegRead(agRoot,V_Scratchpad_3_Register);
6805 if( ScratchPad3 & SCRATCH_PAD3_V_XTS_ENABLED)
6807 encryptInfo->encryptionCipherMode = agsaEncryptCipherModeXTS;
6809 if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMF_ENABLED )
6811 encryptInfo->encryptionSecurityMode = agsaEncryptSMF;
6813 if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMA_ENABLED)
6815 encryptInfo->encryptionSecurityMode = agsaEncryptSMA;
6817 if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMB_ENABLED )
6819 encryptInfo->encryptionSecurityMode = agsaEncryptSMB;
6821 if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) == SCRATCH_PAD1_V_RAAE_MASK)
6823 if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK) == SCRATCH_PAD3_V_ENC_READY ) /* 3 */
6825 encryptInfo->status = AGSA_RC_SUCCESS;
6827 else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_READY) == SCRATCH_PAD3_V_ENC_DISABLED) /* 0 */
6829 encryptInfo->status = 0xFFFF;
6830 encryptInfo->encryptionCipherMode = 0;
6831 encryptInfo->encryptionSecurityMode = 0;
6833 else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_DIS_ERR) /* 1 */
6835 encryptInfo->status = (ScratchPad3 & SCRATCH_PAD3_V_ERR_CODE ) >> SHIFT16;
6837 else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_ENA_ERR) /* 2 */
6839 encryptInfo->status = (ScratchPad3 & SCRATCH_PAD3_V_ERR_CODE ) >> SHIFT16;
6842 else if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) == SCRATCH_PAD1_V_RAAE_ERR)
6844 SA_DBG1(("mpiSetControllerConfigRsp, RAAE not ready SPC AGSA_RC_FAILURE\n"));
6845 encryptInfo->status = 0xFFFF;
6846 encryptInfo->encryptionCipherMode = 0;
6847 encryptInfo->encryptionSecurityMode = 0;
6849 else if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) == 0x0 )
6851 SA_DBG2(("mpiSetControllerConfigRsp, RAAE not ready AGSA_RC_BUSY\n"));
6854 SA_DBG2(("mpiSetControllerConfigRsp, encryptionCipherMode 0x%x encryptionSecurityMode 0x%x status 0x%x\n",
6855 encryptInfo->encryptionCipherMode,
6856 encryptInfo->encryptionSecurityMode,
6857 encryptInfo->status));
6858 SA_DBG2(("mpiSetControllerConfigRsp, ScratchPad3 0x%x\n",ScratchPad3));
6859 SA_DBG1(("mpiSetControllerConfigRsp:AGSA_ENCRYPTION_CONTROL_PARM_PAGE 0x%X\n", agMode.modePageOperation));
6860 ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_SECURITY_MODE, errorQualifier, (void *)encryptInfo, agMode.context);
6865 SA_DBG1(("mpiSetControllerConfigRsp: Unknown page code 0x%X\n", pagetype));
6869 /* remove the request from IOMap */
6870 saRoot->IOMap[tag].Tag = MARK_OFF;
6871 saRoot->IOMap[tag].IORequest = agNULL;
6872 saRoot->IOMap[tag].agContext = agNULL;
6874 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6875 SA_ASSERT((pRequest->valid), "pRequest->valid");
6876 pRequest->valid = agFALSE;
6877 /* return the request to free pool */
6878 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
6880 SA_DBG1(("mpiSetControllerRsp: saving pRequest (%p) for later use\n", pRequest));
6881 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
6885 /* return the request to free pool */
6886 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6888 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6890 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3a");
6891 return AGSA_RC_SUCCESS;
6895 /******************************************************************************/
6896 /*! \brief SAS Get Controller Config Response
6898 * This routine handles the response of Get Controller Config Command
6900 * \param agRoot Handles for this instance of SAS/SATA LLL
6901 * \param pIomb Pointer of IOMB Mesage
6903 * \return sucess or fail
6906 /*******************************************************************************/
6907 GLOBAL bit32 mpiGetControllerConfigRsp(
6909 agsaGetControllerConfigRsp_t *pIomb
6912 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6913 agsaIORequestDesc_t *pRequest;
6914 agsaHWEventMode_t agMode;
6915 bit32 status, errorQualifier, tag;
6916 bit32 configPage[12];
6918 smTraceFuncEnter(hpDBG_VERY_LOUD,"3b");
6920 si_memset(&agMode, 0, sizeof(agsaHWEventMode_t));
6921 si_memset(configPage, 0, sizeof(configPage));
6924 SA_DBG2(("mpiGetControllerConfigRsp: HTag=0x%x\n", pIomb->tag));
6926 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t, tag));
6927 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t, status));
6928 OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t, errorQualifier));
6929 OSSA_READ_LE_32(AGROOT, &configPage[0], pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[0] ));
6930 OSSA_READ_LE_32(AGROOT, &configPage[1], pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[1] ));
6931 OSSA_READ_LE_32(AGROOT, &configPage[2], pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[2] ));
6932 OSSA_READ_LE_32(AGROOT, &configPage[3], pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[3] ));
6933 OSSA_READ_LE_32(AGROOT, &configPage[4], pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[4] ));
6934 OSSA_READ_LE_32(AGROOT, &configPage[5], pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[5] ));
6936 /* get request from IOMap */
6937 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
6938 if (agNULL == pRequest)
6940 SA_DBG1(("mpiGetControllerConfigRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
6941 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3b");
6942 return AGSA_RC_FAILURE;
6945 si_memset(&agMode, 0, sizeof(agsaHWEventMode_t));
6946 agMode.modePageOperation = agsaModePageGet;
6947 agMode.status = status;
6949 SA_DBG1(("mpiGetControllerConfigRsp: page 0x%x status 0x%x errorQualifier 0x%x \n", (pIomb->configPage[0] & 0xFF),status, errorQualifier));
6951 switch (pIomb->configPage[0] & 0xFF)
6953 case AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE:
6954 agMode.modePageLen = sizeof(agsaSASProtocolTimerConfigurationPage_t);
6955 SA_DBG1(("mpiGetControllerConfigRsp: AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6957 case AGSA_INTERRUPT_CONFIGURATION_PAGE:
6958 agMode.modePageLen = sizeof(agsaInterruptConfigPage_t);
6959 SA_DBG1(("mpiGetControllerConfigRsp: AGSA_INTERRUPT_CONFIGURATION_PAGE page len 0x%x \n",agMode.modePageLen));
6961 case AGSA_IO_GENERAL_CONFIG_PAGE:
6962 agMode.modePageLen = sizeof(agsaIoGeneralPage_t);
6963 SA_DBG1(("mpiGetControllerConfigRsp: AGSA_IO_GENERAL_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6965 case AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE:
6966 agMode.modePageLen = sizeof(agsaEncryptGeneralPage_t);
6967 SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6968 #ifdef HIALEAH_ENCRYPTION
6969 saRoot->EncGenPage.numberOfKeksPageCode = configPage[0];
6970 saRoot->EncGenPage.KeyCardIdKekIndex = configPage[1];
6971 saRoot->EncGenPage.KeyCardId3_0 = configPage[2];
6972 saRoot->EncGenPage.KeyCardId7_4 = configPage[3];
6973 saRoot->EncGenPage.KeyCardId11_8 = configPage[4];
6975 SA_DBG1(("mpiGetControllerConfigRsp: numberOfKeksPageCode 0x%x\n",saRoot->EncGenPage.numberOfKeksPageCode));
6976 SA_DBG1(("mpiGetControllerConfigRsp: KeyCardIdKekIndex 0x%x\n",saRoot->EncGenPage.KeyCardIdKekIndex));
6977 SA_DBG1(("mpiGetControllerConfigRsp: KeyCardId3_0 0x%x\n",saRoot->EncGenPage.KeyCardId3_0));
6978 SA_DBG1(("mpiGetControllerConfigRsp: KeyCardId7_4 0x%x\n",saRoot->EncGenPage.KeyCardId7_4));
6979 SA_DBG1(("mpiGetControllerConfigRsp: KeyCardId11_8 0x%x\n",saRoot->EncGenPage.KeyCardId11_8));
6980 #endif /* HIALEAH_ENCRYPTION */
6983 case AGSA_ENCRYPTION_DEK_CONFIG_PAGE:
6984 agMode.modePageLen = sizeof(agsaEncryptDekConfigPage_t);
6985 SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_DEK_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6987 case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:
6988 agMode.modePageLen = sizeof(agsaEncryptControlParamPage_t);
6989 SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_CONTROL_PARM_PAGE page len 0x%x \n",agMode.modePageLen));
6991 case AGSA_ENCRYPTION_HMAC_CONFIG_PAGE:
6992 agMode.modePageLen = sizeof(agsaEncryptHMACConfigPage_t);
6993 SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_HMAC_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
6996 agMode.modePageLen = 0;
6997 SA_DBG1(("mpiGetControllerConfigRsp: Unknown !!! page len 0x%x \n",agMode.modePageLen));
7001 agMode.modePage = (void *) &pIomb->configPage[0];
7002 agMode.context = saRoot->IOMap[tag].agContext;
7004 /* Report the event before freeing the IOMB */
7005 ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_MODE, errorQualifier, (void *) &agMode, 0);
7007 /* remove the request from IOMap */
7008 saRoot->IOMap[tag].Tag = MARK_OFF;
7009 saRoot->IOMap[tag].IORequest = agNULL;
7010 saRoot->IOMap[tag].agContext = agNULL;
7012 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7013 SA_ASSERT((pRequest->valid), "pRequest->valid");
7014 pRequest->valid = agFALSE;
7015 /* return the request to free pool */
7016 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7018 SA_DBG1(("mpiGetControllerRsp: saving pRequest (%p) for later use\n", pRequest));
7019 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7023 /* return the request to free pool */
7024 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7026 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7028 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3b");
7029 return AGSA_RC_SUCCESS;
7032 /******************************************************************************/
7033 /*! \brief KEK Management Response
7035 * This routine handles the response of the KEK management message
7037 * \param agRoot Handles for this instance of SAS/SATA LLL
7038 * \param pIomb Pointer of IOMB Mesage
7040 * \return sucess or fail
7043 /*******************************************************************************/
7044 GLOBAL bit32 mpiKekManagementRsp(
7046 agsaKekManagementRsp_t *pIomb
7049 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7050 agsaIORequestDesc_t *pRequest;
7051 agsaContext_t *agContext;
7052 agsaHWEventEncrypt_t agEvent;
7053 bit32 status, errorQualifier, tag, flags;
7054 smTraceFuncEnter(hpDBG_VERY_LOUD,"2A");
7056 SA_DBG1(("mpiKekManagementRsp: HTag=0x%x\n", pIomb->tag));
7058 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, tag));
7059 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, status));
7060 OSSA_READ_LE_32(AGROOT, &flags, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, flags));
7061 OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, errorQualifier));
7064 SA_DBG1(("mpiKekManagementRsp:status 0x%x flags 0x%x errorQualifier 0x%x\n", status, flags, errorQualifier));
7066 si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
7067 if ((flags & 0xFF) == KEK_MGMT_SUBOP_UPDATE)
7069 SA_DBG1(("mpiKekManagementRsp:KEK_MGMT_SUBOP_UPDATE 0x%x \n", status));
7070 if (flags & 0xFF00) /* update and store*/
7072 agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE;
7076 agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE;
7078 agEvent.status = status;
7079 if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
7081 agEvent.eq = errorQualifier;
7084 /* Store the new KEK index in agEvent.handle */
7085 agEvent.handle = (void *) ((bitptr) (flags >> 24));
7086 /* Store the current KEK index in agEvent.param */
7087 agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
7091 else if ((flags & 0xFF) == KEK_MGMT_SUBOP_INVALIDATE)
7093 agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_INVALIDTE;
7094 agEvent.status = status;
7095 if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
7097 agEvent.eq = errorQualifier;
7100 /* Store the new KEK index in agEvent.handle */
7101 agEvent.handle = (void *) ((bitptr) (flags >> 24));
7102 /* Store the current KEK index in agEvent.param */
7103 agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
7106 else if ((flags & 0xFF) == KEK_MGMT_SUBOP_KEYCARDINVALIDATE)
7108 agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE;
7109 agEvent.status = status;
7110 if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
7112 agEvent.eq = errorQualifier;
7115 /* Store the new KEK index in agEvent.handle */
7116 agEvent.handle = (void *) ((bitptr) (flags >> 24));
7117 /* Store the current KEK index in agEvent.param */
7118 agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
7122 else if ((flags & 0xFF) == KEK_MGMT_SUBOP_KEYCARDUPDATE)
7124 agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE;
7125 agEvent.status = status;
7126 if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
7128 agEvent.eq = errorQualifier;
7131 /* Store the new KEK index in agEvent.handle */
7132 agEvent.handle = (void *) ((bitptr) (flags >> 24));
7133 /* Store the current KEK index in agEvent.param */
7134 agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
7137 /* get request from IOMap */
7138 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7139 if (agNULL == pRequest)
7141 SA_DBG1(("mpiKekManagementRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7142 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2A");
7143 return AGSA_RC_FAILURE;
7146 agContext = saRoot->IOMap[tag].agContext;
7147 /* remove the request from IOMap */
7148 saRoot->IOMap[tag].Tag = MARK_OFF;
7149 saRoot->IOMap[tag].IORequest = agNULL;
7150 saRoot->IOMap[tag].agContext = agNULL;
7152 ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void *) &agEvent, agContext);
7154 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7155 SA_ASSERT((pRequest->valid), "pRequest->valid");
7156 pRequest->valid = agFALSE;
7157 /* return the request to free pool */
7158 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7160 SA_DBG1(("mpiKekManagementRsp: saving pRequest (%p) for later use\n", pRequest));
7161 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7165 /* return the request to free pool */
7166 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7168 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7170 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2A");
7172 return AGSA_RC_SUCCESS;
7175 /******************************************************************************/
7176 /*! \brief DEK Management Response
7178 * This routine handles the response of the DEK management message
7180 * \param agRoot Handles for this instance of SAS/SATA LLL
7181 * \param pIomb Pointer of IOMB Mesage
7183 * \return sucess or fail
7186 /*******************************************************************************/
7187 GLOBAL bit32 mpiDekManagementRsp(
7189 agsaDekManagementRsp_t *pIomb
7192 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7193 agsaIORequestDesc_t *pRequest;
7194 agsaContext_t *agContext;
7195 agsaHWEventEncrypt_t agEvent;
7196 bit32 flags, status, errorQualifier, tag, dekIndex;
7198 smTraceFuncEnter(hpDBG_VERY_LOUD,"2B");
7200 SA_DBG1(("mpiDekManagementRsp: HTag=0x%x\n", pIomb->tag));
7202 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, tag));
7203 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, status));
7204 OSSA_READ_LE_32(AGROOT, &flags, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, flags));
7205 OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, errorQualifier));
7206 OSSA_READ_LE_32(AGROOT, &dekIndex, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, dekIndex));
7208 SA_DBG2(("mpiDekManagementRsp:tag =0x%x\n",tag ));
7209 SA_DBG2(("mpiDekManagementRsp:status =0x%x\n", status));
7210 SA_DBG2(("mpiDekManagementRsp:flags =0x%x\n",flags ));
7211 SA_DBG2(("mpiDekManagementRsp:errorQualifier =0x%x\n", errorQualifier));
7212 SA_DBG2(("mpiDekManagementRsp:dekIndex =0x%x\n",dekIndex ));
7214 si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
7215 if ((flags & 0xFF) == DEK_MGMT_SUBOP_UPDATE)
7217 agEvent.encryptOperation = OSSA_HW_ENCRYPT_DEK_UPDATE;
7221 agEvent.encryptOperation = OSSA_HW_ENCRYPT_DEK_INVALIDTE;
7223 agEvent.status = status;
7224 if (status == OSSA_MPI_ENC_ERR_ILLEGAL_DEK_PARAM || OSSA_MPI_ERR_DEK_MANAGEMENT_DEK_UNWRAP_FAIL)
7226 agEvent.eq = errorQualifier;
7228 /* Store the DEK in agEvent.info */
7229 agEvent.info = (flags >> 8) & 0xF;
7230 /* Store the KEK index in agEvent.handle */
7231 agEvent.handle = (void *) ((bitptr) (flags >> 24));
7232 /* Store the DEK index in agEvent.param */
7233 agEvent.param = (void *) (bitptr) dekIndex;
7235 /* get request from IOMap */
7236 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7237 if (agNULL == pRequest)
7239 SA_DBG1(("mpiDekManagementRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7240 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2B");
7241 return AGSA_RC_FAILURE;
7244 agContext = saRoot->IOMap[tag].agContext;
7245 /* remove the request from IOMap */
7246 saRoot->IOMap[tag].Tag = MARK_OFF;
7247 saRoot->IOMap[tag].IORequest = agNULL;
7248 saRoot->IOMap[tag].agContext = agNULL;
7250 ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void *) &agEvent,agContext );
7252 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7253 SA_ASSERT((pRequest->valid), "pRequest->valid");
7254 pRequest->valid = agFALSE;
7255 /* return the request to free pool */
7256 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7258 SA_DBG1(("mpiDekManagementRsp: saving pRequest (%p) for later use\n", pRequest));
7259 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7263 /* return the request to free pool */
7264 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7267 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7269 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2B");
7271 return AGSA_RC_SUCCESS;
7274 /******************************************************************************/
7275 /*! \brief Operator Management Response
7277 * This routine handles the response of the Operator management message
7279 * \param agRoot Handles for this instance of SAS/SATA LLL
7280 * \param pIomb Pointer of IOMB Mesage
7282 * \return sucess or fail
7285 /*******************************************************************************/
7286 GLOBAL bit32 mpiOperatorManagementRsp(
7288 agsaOperatorMangmenRsp_t *pIomb
7291 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7292 agsaIORequestDesc_t *pRequest;
7293 agsaContext_t *agContext;
7294 agsaHWEventEncrypt_t agEvent;
7295 bit32 OPRIDX_AUTIDX_R_OMO,status, errorQualifier, tag;
7297 smTraceFuncEnter(hpDBG_VERY_LOUD,"36");
7299 SA_DBG1(("mpiOperatorManagementRsp: HTag=0x%x\n", pIomb->tag));
7301 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, tag));
7302 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, status));
7303 OSSA_READ_LE_32(AGROOT, &OPRIDX_AUTIDX_R_OMO, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, OPRIDX_AUTIDX_R_OMO));
7304 OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, errorQualifier));
7306 SA_DBG2(("mpiOperatorManagementRsp:tag =0x%x\n",tag ));
7307 SA_DBG2(("mpiOperatorManagementRsp:status =0x%x\n", status));
7308 SA_DBG2(("mpiOperatorManagementRsp:OPRIDX_AUTIDX_R_OMO =0x%x\n",OPRIDX_AUTIDX_R_OMO ));
7309 SA_DBG2(("mpiOperatorManagementRsp:errorQualifier =0x%x\n", errorQualifier));
7311 /* get request from IOMap */
7312 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7313 if (agNULL == pRequest)
7315 SA_DBG1(("mpiOperatorManagementRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7316 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "36");
7317 return AGSA_RC_FAILURE;
7320 agContext = saRoot->IOMap[tag].agContext;
7321 /* remove the request from IOMap */
7322 saRoot->IOMap[tag].Tag = MARK_OFF;
7323 saRoot->IOMap[tag].IORequest = agNULL;
7324 saRoot->IOMap[tag].agContext = agNULL;
7326 si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
7327 agEvent.status = status;
7328 agEvent.info = OPRIDX_AUTIDX_R_OMO;
7329 agEvent.encryptOperation = OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT;
7330 if (status == OPR_MGMT_MPI_ENC_ERR_OPR_PARAM_ILLEGAL)
7332 agEvent.eq = errorQualifier;
7335 ossaOperatorManagementCB(agRoot, agContext, status, errorQualifier);
7337 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7338 SA_ASSERT((pRequest->valid), "pRequest->valid");
7339 pRequest->valid = agFALSE;
7340 /* return the request to free pool */
7341 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7343 SA_DBG1(("mpiOperatorManagementRsp: saving pRequest (%p) for later use\n", pRequest));
7344 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7348 /* return the request to free pool */
7349 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7352 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7354 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "36");
7356 return AGSA_RC_SUCCESS;
7359 GLOBAL bit32 mpiBistRsp(
7361 agsaEncryptBistRsp_t *pIomb
7364 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7365 agsaIORequestDesc_t *pRequest;
7366 agsaContext_t *agContext;
7367 agsaHWEventEncrypt_t agEvent;
7374 smTraceFuncEnter(hpDBG_VERY_LOUD,"37");
7376 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, tag));
7377 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, status));
7378 OSSA_READ_LE_32(AGROOT, &subop, pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, subop));
7379 OSSA_READ_LE_32(AGROOT, &results[0], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[0]));
7380 OSSA_READ_LE_32(AGROOT, &results[1], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[1]));
7381 OSSA_READ_LE_32(AGROOT, &results[2], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[2]));
7382 OSSA_READ_LE_32(AGROOT, &results[3], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[3]));
7383 OSSA_READ_LE_32(AGROOT, &results[4], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[4]));
7384 OSSA_READ_LE_32(AGROOT, &results[5], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[5]));
7385 OSSA_READ_LE_32(AGROOT, &results[6], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[6]));
7386 OSSA_READ_LE_32(AGROOT, &results[7], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[7]));
7387 OSSA_READ_LE_32(AGROOT, &results[8], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[8]));
7388 OSSA_READ_LE_32(AGROOT, &results[9], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[9]));
7389 OSSA_READ_LE_32(AGROOT, &results[10], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[10]));
7392 SA_DBG1(("mpiBistRsp: HTag=0x%x subops =0x%x status =0x%x\n",pIomb->tag, subop, status));
7396 case AGSA_BIST_TEST:
7397 length = sizeof(agsaEncryptSelfTestStatusBitMap_t);
7400 length = sizeof(agsaEncryptSHATestResult_t);
7402 case AGSA_HMAC_TEST:
7403 length = sizeof(agsaEncryptHMACTestResult_t);
7410 si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
7411 agEvent.status = status;
7412 agEvent.encryptOperation = OSSA_HW_ENCRYPT_TEST_EXECUTE;
7413 agEvent.info = length;
7415 agEvent.handle = agNULL;
7416 agEvent.param = &results;
7418 /* get request from IOMap */
7419 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7420 if (agNULL == pRequest)
7422 SA_DBG1(("mpiBistRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7423 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "37");
7424 return AGSA_RC_FAILURE;
7427 agContext = saRoot->IOMap[tag].agContext;
7429 ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void*)&agEvent, agContext);
7431 /* remove the request from IOMap */
7432 saRoot->IOMap[tag].Tag = MARK_OFF;
7433 saRoot->IOMap[tag].IORequest = agNULL;
7434 saRoot->IOMap[tag].agContext = agNULL;
7436 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7437 SA_ASSERT((pRequest->valid), "pRequest->valid");
7438 pRequest->valid = agFALSE;
7439 /* return the request to free pool */
7440 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7442 SA_DBG1(("mpiBistRsp: saving pRequest (%p) for later use\n", pRequest));
7443 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7447 /* return the request to free pool */
7448 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7451 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7453 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "37");
7455 return AGSA_RC_SUCCESS;
7458 /******************************************************************************/
7459 /*! \brief Set Operator Response
7461 * This routine handles the response of the Operator management message
7463 * \param agRoot Handles for this instance of SAS/SATA LLL
7464 * \param pIomb Pointer of IOMB Mesage
7466 * \return sucess or fail
7469 /*******************************************************************************/
7470 GLOBAL bit32 mpiSetOperatorRsp(
7472 agsaSetOperatorRsp_t *pIomb
7475 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7476 agsaIORequestDesc_t *pRequest = agNULL;
7477 agsaContext_t *agContext = agNULL;
7478 bit32 ERR_QLFR_OPRIDX_PIN_ACS, OPRIDX_PIN_ACS, status, errorQualifier, tag = 0;
7480 smTraceFuncEnter(hpDBG_VERY_LOUD,"38");
7482 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetOperatorRsp_t, tag));
7483 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetOperatorRsp_t, status));
7484 OSSA_READ_LE_32(AGROOT, &ERR_QLFR_OPRIDX_PIN_ACS, pIomb, OSSA_OFFSET_OF(agsaSetOperatorRsp_t, ERR_QLFR_OPRIDX_PIN_ACS));
7486 errorQualifier = ERR_QLFR_OPRIDX_PIN_ACS >> 16;
7487 OPRIDX_PIN_ACS = ERR_QLFR_OPRIDX_PIN_ACS & 0xFFFF;
7489 SA_DBG1(("mpiSetOperatorRsp: HTag=0x%x ERR_QLFR=0x%x OPRIDX_PIN_ACS=0x%x \n",tag, errorQualifier, OPRIDX_PIN_ACS));
7491 /* get request from IOMap */
7492 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7493 if (agNULL == pRequest)
7495 SA_DBG1(("mpiSetOperatorRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7496 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "38");
7497 return AGSA_RC_FAILURE;
7500 agContext = saRoot->IOMap[tag].agContext;
7501 /* remove the request from IOMap */
7502 saRoot->IOMap[tag].Tag = MARK_OFF;
7503 saRoot->IOMap[tag].IORequest = agNULL;
7504 saRoot->IOMap[tag].agContext = agNULL;
7507 ossaSetOperatorCB(agRoot,agContext,status,errorQualifier );
7509 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7510 SA_ASSERT((pRequest->valid), "pRequest->valid");
7511 pRequest->valid = agFALSE;
7512 /* return the request to free pool */
7513 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7515 SA_DBG1(("mpiSetOperatorRsp: saving pRequest (%p) for later use\n", pRequest));
7516 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7520 /* return the request to free pool */
7521 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7524 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7526 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "38");
7528 return AGSA_RC_SUCCESS;
7531 /******************************************************************************/
7532 /*! \brief Get Operator Response
7534 * This routine handles the response of the Operator management message
7536 * \param agRoot Handles for this instance of SAS/SATA LLL
7537 * \param pIomb Pointer of IOMB Mesage
7539 * \return sucess or fail
7542 /*******************************************************************************/
7543 GLOBAL bit32 mpiGetOperatorRsp(
7545 agsaGetOperatorRsp_t *pIomb
7548 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7549 agsaIORequestDesc_t *pRequest;
7550 agsaContext_t *agContext;
7551 bit32 Num_Option, NumOperators ,status, tag;
7552 bit8 option, Role = 0;
7554 bit8 *tmpIDstr = agNULL;
7555 agsaID_t *IDString = agNULL;
7557 smTraceFuncEnter(hpDBG_VERY_LOUD,"3f");
7559 si_memset(&IDstr, 0, sizeof(IDstr));
7560 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, tag));
7561 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, status));
7562 OSSA_READ_LE_32(AGROOT, &Num_Option, pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, Num_Option));
7563 OSSA_READ_LE_32(AGROOT, &IDstr[0], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[0]));
7564 OSSA_READ_LE_32(AGROOT, &IDstr[1], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[1]));
7565 OSSA_READ_LE_32(AGROOT, &IDstr[2], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[2]));
7566 OSSA_READ_LE_32(AGROOT, &IDstr[3], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[3]));
7567 OSSA_READ_LE_32(AGROOT, &IDstr[4], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[4]));
7568 OSSA_READ_LE_32(AGROOT, &IDstr[5], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[5]));
7569 OSSA_READ_LE_32(AGROOT, &IDstr[6], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[6]));
7570 OSSA_READ_LE_32(AGROOT, &IDstr[7], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[7]));
7572 SA_DBG1(("mpiGetOperatorRsp:tag=0x%x status=0x%x Num_Option=0x%x IDString_Role=0x%x\n",
7573 tag, status, Num_Option, IDstr[0]));
7575 /* get request from IOMap */
7576 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7577 if (agNULL == pRequest)
7579 SA_DBG1(("mpiGetOperatorRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7580 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3f");
7581 return AGSA_RC_FAILURE;
7584 agContext = saRoot->IOMap[tag].agContext;
7585 /* remove the request from IOMap */
7586 saRoot->IOMap[tag].Tag = MARK_OFF;
7587 saRoot->IOMap[tag].IORequest = agNULL;
7588 saRoot->IOMap[tag].agContext = agNULL;
7589 option = Num_Option & 0xFF;
7590 NumOperators = (Num_Option >> SHIFT8) & 0xFF;
7591 /* current operator's Role/ID, valid only if option == 1 */
7594 /* extra the role value as parameter */
7595 Role = IDstr[0] & 0xFF;
7596 tmpIDstr = (bit8*)&IDstr[0];
7597 tmpIDstr++; /* skip role byte */
7598 IDString = (agsaID_t *)tmpIDstr;
7599 SA_DBG1(("mpiGetOperatorRsp: OSSA_IO_SUCCESS\n"));
7600 SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[0], IDString->ID[1], IDString->ID[2], IDString->ID[3]));
7601 SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[4], IDString->ID[5], IDString->ID[6], IDString->ID[7]));
7602 SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[8], IDString->ID[9], IDString->ID[10],IDString->ID[11]));
7603 SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[12],IDString->ID[13],IDString->ID[14],IDString->ID[15]));
7604 SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[16],IDString->ID[17],IDString->ID[18],IDString->ID[19]));
7605 SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[20],IDString->ID[21],IDString->ID[22],IDString->ID[23]));
7606 SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[24],IDString->ID[25],IDString->ID[26],IDString->ID[27]));
7607 SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x\n", IDString->ID[28],IDString->ID[29],IDString->ID[30]));
7610 SA_DBG1(("mpiGetOperatorRsp:status 0x%x option 0x%x Role 0x%x\n",status,option,Role ));
7612 ossaGetOperatorCB(agRoot,agContext,status,option,NumOperators ,Role,IDString );
7614 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7615 SA_ASSERT((pRequest->valid), "pRequest->valid");
7616 pRequest->valid = agFALSE;
7617 /* return the request to free pool */
7618 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7620 SA_DBG1(("mpiGetOperatorRsp: saving pRequest (%p) for later use\n", pRequest));
7621 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7625 /* return the request to free pool */
7626 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7629 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7631 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3f");
7633 return AGSA_RC_SUCCESS;
7637 GLOBAL bit32 mpiGetVHistRsp(
7639 agsaGetVHistCapRsp_t *pIomb
7643 bit32 ret = AGSA_RC_SUCCESS;
7644 agsaLLRoot_t *saRoot = agNULL;
7645 agsaIORequestDesc_t *pRequest;
7646 agsaContext_t *agContext;
7648 bit32 tag = 0; /* 1 */
7649 bit32 status = 0; /* 2 */
7650 bit32 channel; /* 3 */
7651 bit32 BistLo; /* 4 */
7652 bit32 BistHi; /* 5 */
7653 bit32 BytesXfered = 0; /* 6 */
7654 bit32 PciLo; /* 7 */
7655 bit32 PciHi; /* 8 */
7656 bit32 PciBytecount = 0; /* 9 */
7658 smTraceFuncEnter(hpDBG_VERY_LOUD,"3K");
7661 SA_ASSERT((agNULL != agRoot), "");
7662 saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
7663 SA_ASSERT((agNULL != saRoot), "");
7665 if(smIS_SPC12V(agRoot))
7667 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,tag));
7668 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,status));
7669 OSSA_READ_LE_32(AGROOT, &channel, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,channel));
7670 OSSA_READ_LE_32(AGROOT, &BistLo, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,BistLo));
7671 OSSA_READ_LE_32(AGROOT, &BistHi, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,BistHi));
7672 OSSA_READ_LE_32(AGROOT, &BytesXfered, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,BytesXfered));
7673 OSSA_READ_LE_32(AGROOT, &PciLo, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,PciLo));
7674 OSSA_READ_LE_32(AGROOT, &PciHi, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,PciHi));
7675 OSSA_READ_LE_32(AGROOT, &PciBytecount, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,PciBytecount));
7679 /* SPC does not support this command */
7680 SA_DBG1(("mpiGetVHistRsp: smIS_SPC12V only\n"));
7681 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3K");
7682 return AGSA_RC_FAILURE;
7685 SA_DBG3(("mpiGetVHistRsp: HTag=0x%x\n", tag));
7687 /* get request from IOMap */
7688 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7689 if (agNULL == pRequest)
7691 SA_DBG1(("mpiGetVHistRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7692 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3K");
7693 return AGSA_RC_FAILURE;
7696 agContext = saRoot->IOMap[tag].agContext;
7698 /* remove the request from IOMap */
7699 saRoot->IOMap[tag].Tag = MARK_OFF;
7700 saRoot->IOMap[tag].IORequest = agNULL;
7701 saRoot->IOMap[tag].agContext = agNULL;
7703 SA_ASSERT((pRequest->valid), "pRequest->valid");
7705 /* check status success or failure */
7708 SA_DBG1(("mpiGetVHistRsp: status is FAILED, status = %x\n", status ));
7710 if (pRequest->completionCB == agNULL)
7712 ossaVhistCaptureCB(agRoot, agContext, status, BytesXfered);
7716 (*(ossaVhistCaptureCB_t)(pRequest->completionCB))(agRoot, agContext, status, BytesXfered);
7719 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7720 pRequest->valid = agFALSE;
7721 /* return the request to free pool */
7722 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7723 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7725 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3K");
7726 return AGSA_RC_FAILURE;
7729 /* status is SUCCESS */
7730 SA_DBG1(("mpiGetVHistRsp: status is SUCCESS\n" ));
7732 if (pRequest->completionCB == agNULL)
7734 ossaVhistCaptureCB(agRoot, agContext, status, BytesXfered);
7738 (*(ossaVhistCaptureCB_t)(pRequest->completionCB))(agRoot, agContext, status, BytesXfered);
7741 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7742 pRequest->valid = agFALSE;
7743 /* return the request to free pool */
7744 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7745 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7748 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3K");
7755 /******************************************************************************/
7756 /*! \brief DifEncOffload Response
7758 * This routine handles the response of the DifEncOffload Response
7760 * \param agRoot Handles for this instance of SAS/SATA LLL
7761 * \param pIomb Pointer of IOMB Mesage
7763 * \return sucess or fail
7766 /*******************************************************************************/
7767 GLOBAL bit32 mpiDifEncOffloadRsp(
7769 agsaDifEncOffloadRspV_t *pIomb
7773 bit32 ret = AGSA_RC_SUCCESS;
7774 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7775 agsaIORequestDesc_t *pRequest;
7776 agsaContext_t *agContext;
7778 agsaOffloadDifDetails_t details;
7780 smTraceFuncEnter(hpDBG_VERY_LOUD,"3F");
7782 OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, tag));
7783 OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, status));
7785 SA_DBG3(("mpiDifEncOffloadRsp: HTag=0x%x\n", tag));
7787 /* get request from IOMap */
7788 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
7789 if (agNULL == pRequest)
7791 SA_DBG1(("mpiDifEncOffloadRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
7792 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3F");
7793 return AGSA_RC_FAILURE;
7796 agContext = saRoot->IOMap[tag].agContext;
7798 /* remove the request from IOMap */
7799 saRoot->IOMap[tag].Tag = MARK_OFF;
7800 saRoot->IOMap[tag].IORequest = agNULL;
7801 saRoot->IOMap[tag].agContext = agNULL;
7803 SA_ASSERT((pRequest->valid), "pRequest->valid");
7805 /* check status success or failure */
7808 SA_DBG1(("mpiDifEncOffloadRsp: status is FAILED, status = %x\n", status ));
7810 if (status == OSSA_IO_XFR_ERROR_DIF_MISMATCH || status == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH ||
7811 status == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH || status == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH)
7813 si_memset(&details, 0, sizeof(agsaOffloadDifDetails_t));
7814 OSSA_READ_LE_32(AGROOT, &details.ExpectedCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ExpectedCRCUDT01));
7815 OSSA_READ_LE_32(AGROOT, &details.ExpectedUDT2345, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ExpectedUDT2345));
7816 OSSA_READ_LE_32(AGROOT, &details.ActualCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ActualCRCUDT01));
7817 OSSA_READ_LE_32(AGROOT, &details.ActualUDT2345, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ActualUDT2345));
7818 OSSA_READ_LE_32(AGROOT, &details.DIFErr, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, DIFErr));
7819 OSSA_READ_LE_32(AGROOT, &details.ErrBoffset, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ErrBoffset));
7821 if (pRequest->completionCB == agNULL)
7823 ossaDIFEncryptionOffloadStartCB(agRoot, agContext, status, &details);
7827 (*(ossaDIFEncryptionOffloadStartCB_t)(pRequest->completionCB))(agRoot, agContext, status, &details);
7832 if (pRequest->completionCB == agNULL)
7834 ossaDIFEncryptionOffloadStartCB(agRoot, agContext, status, agNULL);
7838 (*(ossaDIFEncryptionOffloadStartCB_t)(pRequest->completionCB))(agRoot, agContext, status, agNULL);
7842 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3F");
7844 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7845 pRequest->valid = agFALSE;
7846 /* return the request to free pool */
7847 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7848 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7850 return AGSA_RC_FAILURE;
7853 /* status is SUCCESS */
7854 SA_DBG1(("mpiDifEncOffloadRsp: status is SUCCESS\n" ));
7856 if (pRequest->completionCB == agNULL)
7858 ossaDIFEncryptionOffloadStartCB(agRoot, agContext, status, agNULL);
7862 (*(ossaDIFEncryptionOffloadStartCB_t)(pRequest->completionCB))(agRoot, agContext, status, agNULL);
7865 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7866 pRequest->valid = agFALSE;
7867 /* return the request to free pool */
7868 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7869 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7872 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3F");