14e1bc9a0SAchim Leubner /*******************************************************************************
24e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
34e1bc9a0SAchim Leubner *
44e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
54e1bc9a0SAchim Leubner *that the following conditions are met:
64e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
74e1bc9a0SAchim Leubner *following disclaimer.
84e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
94e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
104e1bc9a0SAchim Leubner *with the distribution.
114e1bc9a0SAchim Leubner *
124e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
134e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
144e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
154e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
164e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
174e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
184e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
194e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
204e1bc9a0SAchim Leubner
214e1bc9a0SAchim Leubner ********************************************************************************/
224e1bc9a0SAchim Leubner /*******************************************************************************/
234e1bc9a0SAchim Leubner /*! \file sampirsp.c
244e1bc9a0SAchim Leubner * \brief The file implements the functions of MPI Outbound Response Message
254e1bc9a0SAchim Leubner *
264e1bc9a0SAchim Leubner */
274e1bc9a0SAchim Leubner /******************************************************************************/
284e1bc9a0SAchim Leubner #include <sys/cdefs.h>
294e1bc9a0SAchim Leubner #include <dev/pms/config.h>
304e1bc9a0SAchim Leubner
314e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
324e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS
334e1bc9a0SAchim Leubner #ifdef siTraceFileID
344e1bc9a0SAchim Leubner #undef siTraceFileID
354e1bc9a0SAchim Leubner #endif
364e1bc9a0SAchim Leubner #define siTraceFileID 'J'
374e1bc9a0SAchim Leubner #endif
384e1bc9a0SAchim Leubner
394e1bc9a0SAchim Leubner /******************************************************************************/
404e1bc9a0SAchim Leubner /* Protoytpes */
414e1bc9a0SAchim Leubner void saReturnRequestToFreePool(
424e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
434e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest
444e1bc9a0SAchim Leubner );
454e1bc9a0SAchim Leubner
464e1bc9a0SAchim Leubner /******************************************************************************/
474e1bc9a0SAchim Leubner /*! \brief Process Outbound IOMB Message
484e1bc9a0SAchim Leubner *
494e1bc9a0SAchim Leubner * Process Outbound IOMB from SPC
504e1bc9a0SAchim Leubner *
514e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LL Layer
524e1bc9a0SAchim Leubner * \param pMsg1 Pointer of Response IOMB message 1
534e1bc9a0SAchim Leubner * \param category category of outbpond IOMB header
544e1bc9a0SAchim Leubner * \param opcode Opcode of Outbound IOMB header
554e1bc9a0SAchim Leubner * \param bc buffer count of IOMB header
564e1bc9a0SAchim Leubner *
574e1bc9a0SAchim Leubner * \return success or fail
584e1bc9a0SAchim Leubner *
594e1bc9a0SAchim Leubner */
604e1bc9a0SAchim Leubner /*******************************************************************************/
614e1bc9a0SAchim Leubner #if 0
624e1bc9a0SAchim Leubner FORCEINLINE bit32
634e1bc9a0SAchim Leubner mpiParseOBIomb(
644e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
654e1bc9a0SAchim Leubner bit32 *pMsg1,
664e1bc9a0SAchim Leubner mpiMsgCategory_t category,
674e1bc9a0SAchim Leubner bit16 opcode
684e1bc9a0SAchim Leubner )
694e1bc9a0SAchim Leubner {
704e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
714e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
724e1bc9a0SAchim Leubner bit32 parserStatus = AGSA_RC_SUCCESS;
734e1bc9a0SAchim Leubner
744e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD, "2f");
754e1bc9a0SAchim Leubner
764e1bc9a0SAchim Leubner switch (opcode)
774e1bc9a0SAchim Leubner {
784e1bc9a0SAchim Leubner case OPC_OUB_COMBINED_SSP_COMP:
794e1bc9a0SAchim Leubner {
804e1bc9a0SAchim Leubner agsaSSPCoalescedCompletionRsp_t *pIomb = (agsaSSPCoalescedCompletionRsp_t *)pMsg1;
814e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest = agNULL;
824e1bc9a0SAchim Leubner bit32 tag = 0;
834e1bc9a0SAchim Leubner bit32 sspTag = 0;
844e1bc9a0SAchim Leubner bit32 count = 0;
854e1bc9a0SAchim Leubner
864e1bc9a0SAchim Leubner #ifdef SALL_API_TEST
874e1bc9a0SAchim Leubner saRoot->LLCounters.IOCounter.numSSPCompleted++;
884e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p %d\n",
894e1bc9a0SAchim Leubner pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
904e1bc9a0SAchim Leubner #else
914e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SSP_COMP Response received IOMB=%p\n", pMsg1));
924e1bc9a0SAchim Leubner #endif
934e1bc9a0SAchim Leubner /* get Tag */
944e1bc9a0SAchim Leubner for (count = 0; count < pIomb->coalescedCount; count++)
954e1bc9a0SAchim Leubner {
964e1bc9a0SAchim Leubner tag = pIomb->sspComplCxt[count].tag;
974e1bc9a0SAchim Leubner sspTag = pIomb->sspComplCxt[count].SSPTag;
984e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
994e1bc9a0SAchim Leubner SA_ASSERT((pRequest), "pRequest");
1004e1bc9a0SAchim Leubner
1014e1bc9a0SAchim Leubner if(pRequest == agNULL)
1024e1bc9a0SAchim Leubner {
1034e1bc9a0SAchim Leubner 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));
1044e1bc9a0SAchim Leubner return(AGSA_RC_FAILURE);
1054e1bc9a0SAchim Leubner }
1064e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
1074e1bc9a0SAchim Leubner
1084e1bc9a0SAchim Leubner 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));
1094e1bc9a0SAchim Leubner
1104e1bc9a0SAchim Leubner /* Completion of SSP without Response Data */
1114e1bc9a0SAchim Leubner siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, sspTag);
1124e1bc9a0SAchim Leubner }
1134e1bc9a0SAchim Leubner }
1144e1bc9a0SAchim Leubner break;
1154e1bc9a0SAchim Leubner
1164e1bc9a0SAchim Leubner case OPC_OUB_SSP_COMP:
1174e1bc9a0SAchim Leubner {
1184e1bc9a0SAchim Leubner #ifdef SALL_API_TEST
1194e1bc9a0SAchim Leubner saRoot->LLCounters.IOCounter.numSSPCompleted++;
1204e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p %d\n",
1214e1bc9a0SAchim Leubner pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
1224e1bc9a0SAchim Leubner #else
1234e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p\n", pMsg1));
1244e1bc9a0SAchim Leubner #endif
1254e1bc9a0SAchim Leubner /* process the SSP IO Completed response message */
1264e1bc9a0SAchim Leubner mpiSSPCompletion(agRoot, pMsg1);
1274e1bc9a0SAchim Leubner break;
1284e1bc9a0SAchim Leubner }
1294e1bc9a0SAchim Leubner case OPC_OUB_COMBINED_SATA_COMP:
1304e1bc9a0SAchim Leubner {
1314e1bc9a0SAchim Leubner agsaSATACoalescedCompletionRsp_t *pIomb;
1324e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
1334e1bc9a0SAchim Leubner bit32 tag;
1344e1bc9a0SAchim Leubner bit32 count;
1354e1bc9a0SAchim Leubner
1364e1bc9a0SAchim Leubner #ifdef SALL_API_TEST
1374e1bc9a0SAchim Leubner saRoot->LLCounters.IOCounter.numSSPCompleted++;
1384e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP Response received IOMB=%p %d\n",
1394e1bc9a0SAchim Leubner pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
1404e1bc9a0SAchim Leubner #else
1414e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP Response received IOMB=%p\n", pMsg1));
1424e1bc9a0SAchim Leubner #endif
1434e1bc9a0SAchim Leubner
1444e1bc9a0SAchim Leubner pIomb = (agsaSATACoalescedCompletionRsp_t *)pMsg1;
1454e1bc9a0SAchim Leubner /* get Tag */
1464e1bc9a0SAchim Leubner for (count = 0; count < pIomb->coalescedCount; count++)
1474e1bc9a0SAchim Leubner {
1484e1bc9a0SAchim Leubner tag = pIomb->stpComplCxt[count].tag;
1494e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
1504e1bc9a0SAchim Leubner SA_ASSERT((pRequest), "pRequest");
1514e1bc9a0SAchim Leubner
1524e1bc9a0SAchim Leubner if(pRequest == agNULL)
1534e1bc9a0SAchim Leubner {
1544e1bc9a0SAchim Leubner 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));
1554e1bc9a0SAchim Leubner return(AGSA_RC_FAILURE);
1564e1bc9a0SAchim Leubner }
1574e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
1584e1bc9a0SAchim Leubner
1594e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP IOMB tag=0x%x, status=0x%x, param=0x%x\n", tag, OSSA_IO_SUCCESS, 0));
1604e1bc9a0SAchim Leubner
1614e1bc9a0SAchim Leubner /* Completion of SATA without Response Data */
1624e1bc9a0SAchim Leubner siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, 0);
1634e1bc9a0SAchim Leubner }
1644e1bc9a0SAchim Leubner break;
1654e1bc9a0SAchim Leubner }
1664e1bc9a0SAchim Leubner case OPC_OUB_SATA_COMP:
1674e1bc9a0SAchim Leubner {
1684e1bc9a0SAchim Leubner #ifdef SALL_API_TEST
1694e1bc9a0SAchim Leubner saRoot->LLCounters.IOCounter.numSataCompleted++;
1704e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SATA_COMP Response received IOMB=%p %d\n",
1714e1bc9a0SAchim Leubner pMsg1, saRoot->LLCounters.IOCounter.numSataCompleted));
1724e1bc9a0SAchim Leubner #else
1734e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SATA_COMP Response received IOMB=%p\n", pMsg1));
1744e1bc9a0SAchim Leubner #endif
1754e1bc9a0SAchim Leubner /* process the response message */
1764e1bc9a0SAchim Leubner mpiSATACompletion(agRoot, pMsg1);
1774e1bc9a0SAchim Leubner break;
1784e1bc9a0SAchim Leubner }
1794e1bc9a0SAchim Leubner case OPC_OUB_SSP_ABORT_RSP:
1804e1bc9a0SAchim Leubner {
1814e1bc9a0SAchim Leubner #ifdef SALL_API_TEST
1824e1bc9a0SAchim Leubner saRoot->LLCounters.IOCounter.numSSPAbortedCB++;
1834e1bc9a0SAchim Leubner #else
1844e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SSP_ABORT Response received IOMB=%p\n", pMsg1));
1854e1bc9a0SAchim Leubner #endif
1864e1bc9a0SAchim Leubner /* process the response message */
1874e1bc9a0SAchim Leubner parserStatus = mpiSSPAbortRsp(agRoot, (agsaSSPAbortRsp_t *)pMsg1);
1884e1bc9a0SAchim Leubner if(parserStatus != AGSA_RC_SUCCESS)
1894e1bc9a0SAchim Leubner {
1904e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, mpiSSPAbortRsp FAIL IOMB=%p\n", pMsg1));
1914e1bc9a0SAchim Leubner }
1924e1bc9a0SAchim Leubner
1934e1bc9a0SAchim Leubner break;
1944e1bc9a0SAchim Leubner }
1954e1bc9a0SAchim Leubner case OPC_OUB_SATA_ABORT_RSP:
1964e1bc9a0SAchim Leubner {
1974e1bc9a0SAchim Leubner #ifdef SALL_API_TEST
1984e1bc9a0SAchim Leubner saRoot->LLCounters.IOCounter.numSataAbortedCB++;
1994e1bc9a0SAchim Leubner #else
2004e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SATA_ABORT Response received IOMB=%p\n", pMsg1));
2014e1bc9a0SAchim Leubner #endif
2024e1bc9a0SAchim Leubner /* process the response message */
2034e1bc9a0SAchim Leubner mpiSATAAbortRsp(agRoot, (agsaSATAAbortRsp_t *)pMsg1);
2044e1bc9a0SAchim Leubner break;
2054e1bc9a0SAchim Leubner }
2064e1bc9a0SAchim Leubner case OPC_OUB_SATA_EVENT:
2074e1bc9a0SAchim Leubner {
2084e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SATA_EVENT Response received IOMB=%p\n", pMsg1));
2094e1bc9a0SAchim Leubner /* process the response message */
2104e1bc9a0SAchim Leubner mpiSATAEvent(agRoot, (agsaSATAEventRsp_t *)pMsg1);
2114e1bc9a0SAchim Leubner break;
2124e1bc9a0SAchim Leubner }
2134e1bc9a0SAchim Leubner case OPC_OUB_SSP_EVENT:
2144e1bc9a0SAchim Leubner {
2154e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SSP_EVENT Response received IOMB=%p\n", pMsg1));
2164e1bc9a0SAchim Leubner /* process the response message */
2174e1bc9a0SAchim Leubner mpiSSPEvent(agRoot, (agsaSSPEventRsp_t *)pMsg1);
2184e1bc9a0SAchim Leubner break;
2194e1bc9a0SAchim Leubner }
2204e1bc9a0SAchim Leubner case OPC_OUB_SMP_COMP:
2214e1bc9a0SAchim Leubner {
2224e1bc9a0SAchim Leubner #ifdef SALL_API_TEST
2234e1bc9a0SAchim Leubner saRoot->LLCounters.IOCounter.numSMPCompleted++;
2244e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SMP_COMP Response received IOMB=%p, %d\n",
2254e1bc9a0SAchim Leubner pMsg1, saRoot->LLCounters.IOCounter.numSMPCompleted));
2264e1bc9a0SAchim Leubner #else
2274e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SMP_COMP Response received IOMB=%p\n", pMsg1));
2284e1bc9a0SAchim Leubner #endif
2294e1bc9a0SAchim Leubner /* process the response message */
2304e1bc9a0SAchim Leubner mpiSMPCompletion(agRoot, (agsaSMPCompletionRsp_t *)pMsg1);
2314e1bc9a0SAchim Leubner break;
2324e1bc9a0SAchim Leubner }
2334e1bc9a0SAchim Leubner #ifndef BIOS
2344e1bc9a0SAchim Leubner case OPC_OUB_ECHO:
2354e1bc9a0SAchim Leubner {
2364e1bc9a0SAchim Leubner #ifdef SALL_API_TEST
2374e1bc9a0SAchim Leubner saRoot->LLCounters.IOCounter.numEchoCB++;
2384e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, ECHO Response received %d\n", saRoot->LLCounters.IOCounter.numEchoCB));
2394e1bc9a0SAchim Leubner #else
2404e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, ECHO Response received\n"));
2414e1bc9a0SAchim Leubner #endif
2424e1bc9a0SAchim Leubner /* process the response message */
2434e1bc9a0SAchim Leubner mpiEchoRsp(agRoot, (agsaEchoRsp_t *)pMsg1);
2444e1bc9a0SAchim Leubner break;
2454e1bc9a0SAchim Leubner }
2464e1bc9a0SAchim Leubner #endif
2474e1bc9a0SAchim Leubner case OPC_OUB_GET_NVMD_DATA:
2484e1bc9a0SAchim Leubner {
2494e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_NVMD_DATA received IOMB=%p\n", pMsg1));
2504e1bc9a0SAchim Leubner /* process the response message */
2514e1bc9a0SAchim Leubner mpiGetNVMDataRsp(agRoot, (agsaGetNVMDataRsp_t *)pMsg1);
2524e1bc9a0SAchim Leubner break;
2534e1bc9a0SAchim Leubner }
2544e1bc9a0SAchim Leubner case OPC_OUB_SPC_HW_EVENT:
2554e1bc9a0SAchim Leubner {
2564e1bc9a0SAchim Leubner SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
2574e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SPC_HW_EVENT Response received IOMB=%p\n", pMsg1));
2584e1bc9a0SAchim Leubner /* process the response message */
2594e1bc9a0SAchim Leubner mpiHWevent(agRoot, (agsaHWEvent_SPC_OUB_t *)pMsg1);
2604e1bc9a0SAchim Leubner break;
2614e1bc9a0SAchim Leubner }
2624e1bc9a0SAchim Leubner case OPC_OUB_HW_EVENT:
2634e1bc9a0SAchim Leubner {
2644e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, HW_EVENT Response received IOMB=%p\n", pMsg1));
2654e1bc9a0SAchim Leubner /* process the response message */
2664e1bc9a0SAchim Leubner mpiHWevent(agRoot, (agsaHWEvent_SPC_OUB_t *)pMsg1);
2674e1bc9a0SAchim Leubner break;
2684e1bc9a0SAchim Leubner }
2694e1bc9a0SAchim Leubner case OPC_OUB_PHY_START_RESPONSE:
2704e1bc9a0SAchim Leubner {
2714e1bc9a0SAchim Leubner SA_DBG1(("mpiParseOBIomb, OPC_OUB_PHY_START_RESPONSE Response received IOMB=%p\n", pMsg1));
2724e1bc9a0SAchim Leubner /* process the response message */
2734e1bc9a0SAchim Leubner mpiPhyStartEvent( agRoot, (agsaHWEvent_Phy_OUB_t *)pMsg1 );
2744e1bc9a0SAchim Leubner
2754e1bc9a0SAchim Leubner break;
2764e1bc9a0SAchim Leubner }
2774e1bc9a0SAchim Leubner case OPC_OUB_PHY_STOP_RESPONSE:
2784e1bc9a0SAchim Leubner {
2794e1bc9a0SAchim Leubner SA_DBG1(("mpiParseOBIomb, OPC_OUB_PHY_STOP_RESPONSE Response received IOMB=%p\n", pMsg1));
2804e1bc9a0SAchim Leubner /* process the response message */
2814e1bc9a0SAchim Leubner mpiPhyStopEvent( agRoot, (agsaHWEvent_Phy_OUB_t *)pMsg1 );
2824e1bc9a0SAchim Leubner break;
2834e1bc9a0SAchim Leubner }
2844e1bc9a0SAchim Leubner
2854e1bc9a0SAchim Leubner case OPC_OUB_LOCAL_PHY_CNTRL:
2864e1bc9a0SAchim Leubner {
2874e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, PHY CONTROL Response received IOMB=%p\n", pMsg1));
2884e1bc9a0SAchim Leubner /* process the response message */
2894e1bc9a0SAchim Leubner mpiPhyCntrlRsp(agRoot, (agsaLocalPhyCntrlRsp_t *)pMsg1);
2904e1bc9a0SAchim Leubner break;
2914e1bc9a0SAchim Leubner }
2924e1bc9a0SAchim Leubner case OPC_OUB_SPC_DEV_REGIST:
2934e1bc9a0SAchim Leubner {
2944e1bc9a0SAchim Leubner SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
2954e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SPC_DEV_REGIST Response received IOMB=%p\n", pMsg1));
2964e1bc9a0SAchim Leubner /* process the response message */
2974e1bc9a0SAchim Leubner mpiDeviceRegRsp(agRoot, (agsaDeviceRegistrationRsp_t *)pMsg1);
2984e1bc9a0SAchim Leubner break;
2994e1bc9a0SAchim Leubner }
3004e1bc9a0SAchim Leubner case OPC_OUB_DEV_REGIST:
3014e1bc9a0SAchim Leubner {
3024e1bc9a0SAchim Leubner SA_DBG2(("mpiParseOBIomb, DEV_REGISTRATION Response received IOMB=%p\n", pMsg1));
3034e1bc9a0SAchim Leubner /* process the response message */
3044e1bc9a0SAchim Leubner mpiDeviceRegRsp(agRoot, (agsaDeviceRegistrationRsp_t *)pMsg1);
3054e1bc9a0SAchim Leubner break;
3064e1bc9a0SAchim Leubner }
3074e1bc9a0SAchim Leubner case OPC_OUB_DEREG_DEV:
3084e1bc9a0SAchim Leubner {
3094e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, DEREGISTRATION DEVICE Response received IOMB=%p\n", pMsg1));
3104e1bc9a0SAchim Leubner /* process the response message */
3114e1bc9a0SAchim Leubner mpiDeregDevHandleRsp(agRoot, (agsaDeregDevHandleRsp_t *)pMsg1);
3124e1bc9a0SAchim Leubner break;
3134e1bc9a0SAchim Leubner }
3144e1bc9a0SAchim Leubner #ifndef BIOS
3154e1bc9a0SAchim Leubner case OPC_OUB_GET_DEV_HANDLE:
3164e1bc9a0SAchim Leubner {
3174e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, GET_DEV_HANDLE Response received IOMB=%p\n", pMsg1));
3184e1bc9a0SAchim Leubner /* process the response message */
3194e1bc9a0SAchim Leubner mpiGetDevHandleRsp(agRoot, (agsaGetDevHandleRsp_t *)pMsg1);
3204e1bc9a0SAchim Leubner break;
3214e1bc9a0SAchim Leubner }
3224e1bc9a0SAchim Leubner #endif
3234e1bc9a0SAchim Leubner case OPC_OUB_SPC_DEV_HANDLE_ARRIV:
3244e1bc9a0SAchim Leubner {
3254e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SPC_DEV_HANDLE_ARRIV Response received IOMB=%p\n", pMsg1));
3264e1bc9a0SAchim Leubner /* process the response message */
3274e1bc9a0SAchim Leubner mpiDeviceHandleArrived(agRoot, (agsaDeviceHandleArrivedNotify_t *)pMsg1);
3284e1bc9a0SAchim Leubner break;
3294e1bc9a0SAchim Leubner }
3304e1bc9a0SAchim Leubner case OPC_OUB_DEV_HANDLE_ARRIV:
3314e1bc9a0SAchim Leubner {
3324e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, DEV_HANDLE_ARRIV Response received IOMB=%p\n", pMsg1));
3334e1bc9a0SAchim Leubner /* process the response message */
3344e1bc9a0SAchim Leubner mpiDeviceHandleArrived(agRoot, (agsaDeviceHandleArrivedNotify_t *)pMsg1);
3354e1bc9a0SAchim Leubner break;
3364e1bc9a0SAchim Leubner }
3374e1bc9a0SAchim Leubner #if 0 //Sunitha
3384e1bc9a0SAchim Leubner case OPC_OUB_THERM_HW_EVENT:
3394e1bc9a0SAchim Leubner {
3404e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, THERM_HW_EVENT Response received IOMB=%p\n", pMsg1));
3414e1bc9a0SAchim Leubner ossaLogThermalEvent(agRoot, (agsaThermal_Hw_Event_Notify_t *)pMsg1);
3424e1bc9a0SAchim Leubner break;
3434e1bc9a0SAchim Leubner }
3444e1bc9a0SAchim Leubner #endif //Sunitha
3454e1bc9a0SAchim Leubner case OPC_OUB_SSP_RECV_EVENT:
3464e1bc9a0SAchim Leubner {
3474e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SSP_RECV_EVENT Response received IOMB=%p\n", pMsg1));
3484e1bc9a0SAchim Leubner /* process the response message */
3494e1bc9a0SAchim Leubner mpiSSPReqReceivedNotify(agRoot, (agsaSSPReqReceivedNotify_t *)pMsg1);
3504e1bc9a0SAchim Leubner break;
3514e1bc9a0SAchim Leubner }
3524e1bc9a0SAchim Leubner case OPC_OUB_DEV_INFO:
3534e1bc9a0SAchim Leubner {
3544e1bc9a0SAchim Leubner SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
3554e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, DEV_INFO Response received IOMB=%p\n", pMsg1));
3564e1bc9a0SAchim Leubner /* process the response message */
3574e1bc9a0SAchim Leubner mpiGetDevInfoRsp(agRoot, (agsaGetDevInfoRspV_t *)pMsg1);
3584e1bc9a0SAchim Leubner break;
3594e1bc9a0SAchim Leubner }
3604e1bc9a0SAchim Leubner #ifndef BIOS
3614e1bc9a0SAchim Leubner case OPC_OUB_GET_PHY_PROFILE_RSP:
3624e1bc9a0SAchim Leubner {
3634e1bc9a0SAchim Leubner SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
3644e1bc9a0SAchim Leubner SA_DBG2(("mpiParseOBIomb, OPC_OUB_GET_PHY_PROFILE_RSP Response received IOMB=%p\n", pMsg1));
3654e1bc9a0SAchim Leubner /* process the response message */
3664e1bc9a0SAchim Leubner mpiGetPhyProfileRsp(agRoot, (agsaGetPhyProfileRspV_t *)pMsg1);
3674e1bc9a0SAchim Leubner break;
3684e1bc9a0SAchim Leubner }
3694e1bc9a0SAchim Leubner case OPC_OUB_SET_PHY_PROFILE_RSP:
3704e1bc9a0SAchim Leubner {
3714e1bc9a0SAchim Leubner SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
3724e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_PHY_PROFILE_RSP Response received IOMB=%p\n", pMsg1));
3734e1bc9a0SAchim Leubner /* process the response message */
3744e1bc9a0SAchim Leubner mpiSetPhyProfileRsp(agRoot, (agsaSetPhyProfileRspV_t *)pMsg1);
3754e1bc9a0SAchim Leubner break;
3764e1bc9a0SAchim Leubner }
3774e1bc9a0SAchim Leubner #endif /* BIOS */
3784e1bc9a0SAchim Leubner case OPC_OUB_SPC_DEV_INFO:
3794e1bc9a0SAchim Leubner {
3804e1bc9a0SAchim Leubner SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
3814e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, DEV_INFO Response received IOMB=%p\n", pMsg1));
3824e1bc9a0SAchim Leubner /* process the response message */
3834e1bc9a0SAchim Leubner mpiGetDevInfoRspSpc(agRoot, (agsaGetDevInfoRsp_t *)pMsg1);
3844e1bc9a0SAchim Leubner break;
3854e1bc9a0SAchim Leubner }
3864e1bc9a0SAchim Leubner case OPC_OUB_FW_FLASH_UPDATE:
3874e1bc9a0SAchim Leubner {
3884e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_FLASH_UPDATE Response received IOMB=%p\n", pMsg1));
3894e1bc9a0SAchim Leubner /* process the response message */
3904e1bc9a0SAchim Leubner mpiFwFlashUpdateRsp(agRoot, (agsaFwFlashUpdateRsp_t *)pMsg1);
3914e1bc9a0SAchim Leubner break;
3924e1bc9a0SAchim Leubner }
3934e1bc9a0SAchim Leubner case OPC_OUB_FLASH_OP_EXT_RSP:
3944e1bc9a0SAchim Leubner {
3954e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_FLASH_UPDATE Response received IOMB=%p\n", pMsg1));
3964e1bc9a0SAchim Leubner /* process the response message */
3974e1bc9a0SAchim Leubner mpiFwExtFlashUpdateRsp(agRoot, (agsaFwFlashOpExtRsp_t *)pMsg1);
3984e1bc9a0SAchim Leubner break;
3994e1bc9a0SAchim Leubner }
4004e1bc9a0SAchim Leubner #ifndef BIOS
4014e1bc9a0SAchim Leubner #ifdef SPC_ENABLE_PROFILE
4024e1bc9a0SAchim Leubner case OPC_OUB_FW_PROFILE:
4034e1bc9a0SAchim Leubner {
4044e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_PROFILE Response received IOMB=%p\n", pMsg1));
4054e1bc9a0SAchim Leubner /* process the response message */
4064e1bc9a0SAchim Leubner mpiFwProfileRsp(agRoot, (agsaFwProfileRsp_t *)pMsg1);
4074e1bc9a0SAchim Leubner break;
4084e1bc9a0SAchim Leubner }
4094e1bc9a0SAchim Leubner #endif
4104e1bc9a0SAchim Leubner case OPC_OUB_SET_NVMD_DATA:
4114e1bc9a0SAchim Leubner {
4124e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_NVMD_DATA received IOMB=%p\n", pMsg1));
4134e1bc9a0SAchim Leubner /* process the response message */
4144e1bc9a0SAchim Leubner mpiSetNVMDataRsp(agRoot, (agsaSetNVMDataRsp_t *)pMsg1);
4154e1bc9a0SAchim Leubner break;
4164e1bc9a0SAchim Leubner }
4174e1bc9a0SAchim Leubner
4184e1bc9a0SAchim Leubner case OPC_OUB_GPIO_RESPONSE:
4194e1bc9a0SAchim Leubner {
4204e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
4214e1bc9a0SAchim Leubner /* process the response message */
4224e1bc9a0SAchim Leubner mpiGPIORsp(agRoot, (agsaGPIORsp_t *)pMsg1);
4234e1bc9a0SAchim Leubner break;
4244e1bc9a0SAchim Leubner }
4254e1bc9a0SAchim Leubner case OPC_OUB_GPIO_EVENT:
4264e1bc9a0SAchim Leubner {
4274e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
4284e1bc9a0SAchim Leubner /* process the response message */
4294e1bc9a0SAchim Leubner mpiGPIOEventRsp(agRoot, (agsaGPIOEvent_t *)pMsg1);
4304e1bc9a0SAchim Leubner break;
4314e1bc9a0SAchim Leubner }
4324e1bc9a0SAchim Leubner #endif /* BIOS */
4334e1bc9a0SAchim Leubner case OPC_OUB_GENERAL_EVENT:
4344e1bc9a0SAchim Leubner {
4354e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GENERAL_EVENT Response received IOMB=%p\n", pMsg1));
4364e1bc9a0SAchim Leubner /* process the response message */
4374e1bc9a0SAchim Leubner mpiGeneralEventRsp(agRoot, (agsaGeneralEventRsp_t *)pMsg1);
4384e1bc9a0SAchim Leubner break;
4394e1bc9a0SAchim Leubner }
4404e1bc9a0SAchim Leubner #ifndef BIOS
4414e1bc9a0SAchim Leubner case OPC_OUB_SAS_DIAG_MODE_START_END:
4424e1bc9a0SAchim Leubner {
4434e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_DIAG_MODE_START_END Response received IOMB=%p\n", pMsg1));
4444e1bc9a0SAchim Leubner /* process the response message */
4454e1bc9a0SAchim Leubner mpiSASDiagStartEndRsp(agRoot, (agsaSASDiagStartEndRsp_t *)pMsg1);
4464e1bc9a0SAchim Leubner break;
4474e1bc9a0SAchim Leubner }
4484e1bc9a0SAchim Leubner case OPC_OUB_SAS_DIAG_EXECUTE:
4494e1bc9a0SAchim Leubner {
4504e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_DIAG_EXECUTE_RSP Response received IOMB=%p\n", pMsg1));
4514e1bc9a0SAchim Leubner /* process the response message */
4524e1bc9a0SAchim Leubner mpiSASDiagExecuteRsp(agRoot, (agsaSASDiagExecuteRsp_t *)pMsg1);
4534e1bc9a0SAchim Leubner break;
4544e1bc9a0SAchim Leubner }
4554e1bc9a0SAchim Leubner #endif /* BIOS */
4564e1bc9a0SAchim Leubner case OPC_OUB_GET_TIME_STAMP:
4574e1bc9a0SAchim Leubner {
4584e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_TIME_STAMP Response received IOMB=%p\n", pMsg1));
4594e1bc9a0SAchim Leubner /* process the response message */
4604e1bc9a0SAchim Leubner mpiGetTimeStampRsp(agRoot, (agsaGetTimeStampRsp_t *)pMsg1);
4614e1bc9a0SAchim Leubner break;
4624e1bc9a0SAchim Leubner }
4634e1bc9a0SAchim Leubner
4644e1bc9a0SAchim Leubner case OPC_OUB_SPC_SAS_HW_EVENT_ACK:
4654e1bc9a0SAchim Leubner {
4664e1bc9a0SAchim Leubner SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
4674e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb,OPC_OUB_SPC_SAS_HW_EVENT_ACK Response received IOMB=%p\n", pMsg1));
4684e1bc9a0SAchim Leubner /* process the response message */
4694e1bc9a0SAchim Leubner mpiSASHwEventAckRsp(agRoot, (agsaSASHwEventAckRsp_t *)pMsg1);
4704e1bc9a0SAchim Leubner break;
4714e1bc9a0SAchim Leubner }
4724e1bc9a0SAchim Leubner
4734e1bc9a0SAchim Leubner case OPC_OUB_SAS_HW_EVENT_ACK:
4744e1bc9a0SAchim Leubner {
4754e1bc9a0SAchim Leubner SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
4764e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_HW_EVENT_ACK Response received IOMB=%p\n", pMsg1));
4774e1bc9a0SAchim Leubner /* process the response message */
4784e1bc9a0SAchim Leubner mpiSASHwEventAckRsp(agRoot, (agsaSASHwEventAckRsp_t *)pMsg1);
4794e1bc9a0SAchim Leubner break;
4804e1bc9a0SAchim Leubner }
4814e1bc9a0SAchim Leubner case OPC_OUB_PORT_CONTROL:
4824e1bc9a0SAchim Leubner {
4834e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_PORT_CONTROL Response received IOMB=%p\n", pMsg1));
4844e1bc9a0SAchim Leubner /* process the response message */
4854e1bc9a0SAchim Leubner mpiPortControlRsp(agRoot, (agsaPortControlRsp_t *)pMsg1);
4864e1bc9a0SAchim Leubner break;
4874e1bc9a0SAchim Leubner }
4884e1bc9a0SAchim Leubner case OPC_OUB_SMP_ABORT_RSP:
4894e1bc9a0SAchim Leubner {
4904e1bc9a0SAchim Leubner #ifdef SALL_API_TEST
4914e1bc9a0SAchim Leubner saRoot->LLCounters.IOCounter.numSMPAbortedCB++;
4924e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, SMP_ABORT Response received IOMB=%p, %d\n",
4934e1bc9a0SAchim Leubner pMsg1, saRoot->LLCounters.IOCounter.numSMPAbortedCB));
4944e1bc9a0SAchim Leubner #else
4954e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SMP_ABORT_RSP Response received IOMB=%p\n", pMsg1));
4964e1bc9a0SAchim Leubner #endif
4974e1bc9a0SAchim Leubner /* process the response message */
4984e1bc9a0SAchim Leubner mpiSMPAbortRsp(agRoot, (agsaSMPAbortRsp_t *)pMsg1);
4994e1bc9a0SAchim Leubner break;
5004e1bc9a0SAchim Leubner }
5014e1bc9a0SAchim Leubner case OPC_OUB_DEVICE_HANDLE_REMOVAL:
5024e1bc9a0SAchim Leubner {
5034e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_DEVICE_HANDLE_REMOVAL received IOMB=%p\n", pMsg1));
5044e1bc9a0SAchim Leubner /* process the response message */
5054e1bc9a0SAchim Leubner mpiDeviceHandleRemoval(agRoot, (agsaDeviceHandleRemoval_t *)pMsg1);
5064e1bc9a0SAchim Leubner break;
5074e1bc9a0SAchim Leubner }
5084e1bc9a0SAchim Leubner case OPC_OUB_SET_DEVICE_STATE:
5094e1bc9a0SAchim Leubner {
5104e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_DEVICE_STATE received IOMB=%p\n", pMsg1));
5114e1bc9a0SAchim Leubner /* process the response message */
5124e1bc9a0SAchim Leubner mpiSetDeviceStateRsp(agRoot, (agsaSetDeviceStateRsp_t *)pMsg1);
5134e1bc9a0SAchim Leubner break;
5144e1bc9a0SAchim Leubner }
5154e1bc9a0SAchim Leubner
5164e1bc9a0SAchim Leubner #ifndef BIOS
5174e1bc9a0SAchim Leubner case OPC_OUB_GET_DEVICE_STATE:
5184e1bc9a0SAchim Leubner {
5194e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_DEVICE_STATE received IOMB=%p\n", pMsg1));
5204e1bc9a0SAchim Leubner /* process the response message */
5214e1bc9a0SAchim Leubner mpiGetDeviceStateRsp(agRoot, (agsaGetDeviceStateRsp_t *)pMsg1);
5224e1bc9a0SAchim Leubner break;
5234e1bc9a0SAchim Leubner }
5244e1bc9a0SAchim Leubner #endif /* BIOS */
5254e1bc9a0SAchim Leubner
5264e1bc9a0SAchim Leubner case OPC_OUB_SET_DEV_INFO:
5274e1bc9a0SAchim Leubner {
5284e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_DEV_INFO received IOMB=%p\n", pMsg1));
5294e1bc9a0SAchim Leubner /* process the response message */
5304e1bc9a0SAchim Leubner mpiSetDevInfoRsp(agRoot, (agsaSetDeviceInfoRsp_t *)pMsg1);
5314e1bc9a0SAchim Leubner break;
5324e1bc9a0SAchim Leubner }
5334e1bc9a0SAchim Leubner
5344e1bc9a0SAchim Leubner #ifndef BIOS_DEBUG
5354e1bc9a0SAchim Leubner case OPC_OUB_SAS_RE_INITIALIZE:
5364e1bc9a0SAchim Leubner {
5374e1bc9a0SAchim Leubner SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
5384e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_RE_INITIALIZE received IOMB=%p\n", pMsg1));
5394e1bc9a0SAchim Leubner /* process the response message */
5404e1bc9a0SAchim Leubner mpiSasReInitializeRsp(agRoot, (agsaSasReInitializeRsp_t *)pMsg1);
5414e1bc9a0SAchim Leubner break;
5424e1bc9a0SAchim Leubner }
5434e1bc9a0SAchim Leubner #endif /* BIOS */
5444e1bc9a0SAchim Leubner
5454e1bc9a0SAchim Leubner case OPC_OUB_SGPIO_RESPONSE:
5464e1bc9a0SAchim Leubner {
5474e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SGPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
5484e1bc9a0SAchim Leubner /* process the response message */
5494e1bc9a0SAchim Leubner mpiSGpioRsp(agRoot, (agsaSGpioRsp_t *)pMsg1);
5504e1bc9a0SAchim Leubner break;
5514e1bc9a0SAchim Leubner }
5524e1bc9a0SAchim Leubner
5534e1bc9a0SAchim Leubner #ifndef BIOS
5544e1bc9a0SAchim Leubner case OPC_OUB_PCIE_DIAG_EXECUTE:
5554e1bc9a0SAchim Leubner {
5564e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_PCIE_DIAG_EXECUTE Response received IOMB=%p\n", pMsg1));
5574e1bc9a0SAchim Leubner /* process the response message */
5584e1bc9a0SAchim Leubner mpiPCIeDiagExecuteRsp(agRoot, (agsaPCIeDiagExecuteRsp_t *)pMsg1);
5594e1bc9a0SAchim Leubner break;
5604e1bc9a0SAchim Leubner }
5614e1bc9a0SAchim Leubner case 2104: //delray start
5624e1bc9a0SAchim Leubner {
5634e1bc9a0SAchim Leubner if(smIS_SPC6V(agRoot))
5644e1bc9a0SAchim Leubner {
5654e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_DFE_DATA_RSP Response received IOMB=%p\n", pMsg1));
5664e1bc9a0SAchim Leubner /* process the response message */
5674e1bc9a0SAchim Leubner mpiGetDFEDataRsp(agRoot, (agsaGetDDEFDataRsp_t *)pMsg1);
5684e1bc9a0SAchim Leubner }
5694e1bc9a0SAchim Leubner if(smIS_SPC12V(agRoot))
5704e1bc9a0SAchim Leubner {
5714e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_INB_GET_VIST_CAP Response received IOMB=%p\n", pMsg1));
5724e1bc9a0SAchim Leubner mpiGetVisRsp(agRoot, (agsaGetVisCapRsp_t *)pMsg1);
5734e1bc9a0SAchim Leubner }
5744e1bc9a0SAchim Leubner else
5754e1bc9a0SAchim Leubner {
5764e1bc9a0SAchim Leubner SA_DBG1(("mpiParseOBIomb, 2104 Response received IOMB=%p\n", pMsg1));
5774e1bc9a0SAchim Leubner }
5784e1bc9a0SAchim Leubner break;
5794e1bc9a0SAchim Leubner }
5804e1bc9a0SAchim Leubner #endif /* BIOS */
5814e1bc9a0SAchim Leubner case OPC_OUB_SET_CONTROLLER_CONFIG:
5824e1bc9a0SAchim Leubner {
5834e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_CONTROLLER_CONFIG Response received IOMB=%p\n", pMsg1));
5844e1bc9a0SAchim Leubner mpiSetControllerConfigRsp(agRoot, (agsaSetControllerConfigRsp_t *)pMsg1);
5854e1bc9a0SAchim Leubner break;
5864e1bc9a0SAchim Leubner }
5874e1bc9a0SAchim Leubner #ifndef BIOS
5884e1bc9a0SAchim Leubner case OPC_OUB_GET_CONTROLLER_CONFIG:
5894e1bc9a0SAchim Leubner {
5904e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_CONTROLLER_CONFIG Response received IOMB=%p\n", pMsg1));
5914e1bc9a0SAchim Leubner mpiGetControllerConfigRsp(agRoot, (agsaGetControllerConfigRsp_t *)pMsg1);
5924e1bc9a0SAchim Leubner break;
5934e1bc9a0SAchim Leubner }
5944e1bc9a0SAchim Leubner case OPC_OUB_KEK_MANAGEMENT:
5954e1bc9a0SAchim Leubner {
5964e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_KEK_MANAGEMENT Response received IOMB=%p\n", pMsg1));
5974e1bc9a0SAchim Leubner mpiKekManagementRsp(agRoot, (agsaKekManagementRsp_t *)pMsg1);
5984e1bc9a0SAchim Leubner break;
5994e1bc9a0SAchim Leubner }
6004e1bc9a0SAchim Leubner #endif /* BIOS */
6014e1bc9a0SAchim Leubner #ifdef UN_USED_FUNC
6024e1bc9a0SAchim Leubner case OPC_OUB_DEK_MANAGEMENT:
6034e1bc9a0SAchim Leubner {
6044e1bc9a0SAchim Leubner SA_DBG3(("mpiParseOBIomb, OPC_OUB_DEK_MANAGEMENT Response received IOMB=%p\n", pMsg1));
6054e1bc9a0SAchim Leubner mpiDekManagementRsp(agRoot, (agsaDekManagementRsp_t *)pMsg1);
6064e1bc9a0SAchim Leubner break;
6074e1bc9a0SAchim Leubner }
6084e1bc9a0SAchim Leubner #endif
6094e1bc9a0SAchim Leubner #ifndef BIOS
6104e1bc9a0SAchim Leubner case OPC_OUB_OPR_MGMT:
6114e1bc9a0SAchim Leubner {
6124e1bc9a0SAchim Leubner SA_DBG1(("mpiParseOBIomb, OPC_OUB_OPR_MGMT Response received IOMB=%p\n", pMsg1));
6134e1bc9a0SAchim Leubner mpiOperatorManagementRsp(agRoot, (agsaOperatorMangmenRsp_t *)pMsg1);
6144e1bc9a0SAchim Leubner break;
6154e1bc9a0SAchim Leubner }
6164e1bc9a0SAchim Leubner case OPC_OUB_ENC_TEST_EXECUTE:
6174e1bc9a0SAchim Leubner {
6184e1bc9a0SAchim Leubner SA_DBG1(("mpiParseOBIomb, OPC_OUB_ENC_TEST_EXECUTE Response received IOMB=%p\n", pMsg1));
6194e1bc9a0SAchim Leubner mpiBistRsp(agRoot, (agsaEncryptBistRsp_t *)pMsg1);
6204e1bc9a0SAchim Leubner break;
6214e1bc9a0SAchim Leubner }
6224e1bc9a0SAchim Leubner #endif /* BIOS */
6234e1bc9a0SAchim Leubner case OPC_OUB_SET_OPERATOR:
6244e1bc9a0SAchim Leubner {
6254e1bc9a0SAchim Leubner SA_DBG1(("mpiParseOBIomb, OPC_OUB_SET_OPERATOR Response received IOMB=%p\n", pMsg1));
6264e1bc9a0SAchim Leubner mpiSetOperatorRsp(agRoot, (agsaSetOperatorRsp_t *)pMsg1);
6274e1bc9a0SAchim Leubner break;
6284e1bc9a0SAchim Leubner }
6294e1bc9a0SAchim Leubner case OPC_OUB_GET_OPERATOR:
6304e1bc9a0SAchim Leubner {
6314e1bc9a0SAchim Leubner SA_DBG1(("mpiParseOBIomb, OPC_OUB_GET_OPERATOR Response received IOMB=%p\n", pMsg1));
6324e1bc9a0SAchim Leubner mpiGetOperatorRsp(agRoot, (agsaGetOperatorRsp_t *)pMsg1);
6334e1bc9a0SAchim Leubner break;
6344e1bc9a0SAchim Leubner }
6354e1bc9a0SAchim Leubner case OPC_OUB_DIF_ENC_OFFLOAD_RSP://delray start
6364e1bc9a0SAchim Leubner {
6374e1bc9a0SAchim Leubner SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
6384e1bc9a0SAchim Leubner SA_DBG1(("mpiParseOBIomb, OPC_OUB_DIF_ENC_OFFLOAD_RSP Response received IOMB=%p\n", pMsg1));
6394e1bc9a0SAchim Leubner mpiDifEncOffloadRsp(agRoot, (agsaDifEncOffloadRspV_t *)pMsg1);
6404e1bc9a0SAchim Leubner break;
6414e1bc9a0SAchim Leubner } //delray end
6424e1bc9a0SAchim Leubner default:
6434e1bc9a0SAchim Leubner {
6444e1bc9a0SAchim Leubner #ifdef SALL_API_TEST
6454e1bc9a0SAchim Leubner saRoot->LLCounters.IOCounter.numUNKNWRespIOMB++;
6464e1bc9a0SAchim Leubner SA_DBG1(("mpiParseOBIomb, UnKnown Response received IOMB=%p, %d\n",
6474e1bc9a0SAchim Leubner pMsg1, saRoot->LLCounters.IOCounter.numUNKNWRespIOMB));
6484e1bc9a0SAchim Leubner #else
6494e1bc9a0SAchim Leubner SA_DBG1(("mpiParseOBIomb, Unknown IOMB Response received opcode 0x%X IOMB=%p\n",opcode, pMsg1));
6504e1bc9a0SAchim Leubner #endif
6514e1bc9a0SAchim Leubner break;
6524e1bc9a0SAchim Leubner }
6534e1bc9a0SAchim Leubner } /* switch */
6544e1bc9a0SAchim Leubner
6554e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2f");
6564e1bc9a0SAchim Leubner
6574e1bc9a0SAchim Leubner return ret;
6584e1bc9a0SAchim Leubner
6594e1bc9a0SAchim Leubner }
6604e1bc9a0SAchim Leubner #endif
6614e1bc9a0SAchim Leubner
6624e1bc9a0SAchim Leubner /******************************************************************************/
6634e1bc9a0SAchim Leubner /*! \brief ECHO Response
6644e1bc9a0SAchim Leubner *
6654e1bc9a0SAchim Leubner * This routine handles the response of ECHO Command
6664e1bc9a0SAchim Leubner *
6674e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
6684e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
6694e1bc9a0SAchim Leubner *
6704e1bc9a0SAchim Leubner * \return sucess or fail
6714e1bc9a0SAchim Leubner *
6724e1bc9a0SAchim Leubner */
6734e1bc9a0SAchim Leubner /*******************************************************************************/
mpiEchoRsp(agsaRoot_t * agRoot,agsaEchoRsp_t * pIomb)6744e1bc9a0SAchim Leubner GLOBAL bit32 mpiEchoRsp(
6754e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
6764e1bc9a0SAchim Leubner agsaEchoRsp_t *pIomb
6774e1bc9a0SAchim Leubner )
6784e1bc9a0SAchim Leubner {
6794e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
6804e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6814e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
6824e1bc9a0SAchim Leubner agsaContext_t *agContext;
6834e1bc9a0SAchim Leubner bit32 tag;
6844e1bc9a0SAchim Leubner
6854e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD, "2g");
6864e1bc9a0SAchim Leubner
6874e1bc9a0SAchim Leubner SA_DBG3(("mpiEchoRsp: HTAG=0x%x\n", pIomb->tag));
6884e1bc9a0SAchim Leubner
6894e1bc9a0SAchim Leubner /* get request from IOMap */
6904e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaEchoRsp_t, tag));
6914e1bc9a0SAchim Leubner
6924e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
6934e1bc9a0SAchim Leubner if (agNULL == pRequest)
6944e1bc9a0SAchim Leubner {
6954e1bc9a0SAchim Leubner SA_DBG1(("mpiEchoRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x\n", tag));
6964e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2g");
6974e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
6984e1bc9a0SAchim Leubner }
6994e1bc9a0SAchim Leubner
7004e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
7014e1bc9a0SAchim Leubner
7024e1bc9a0SAchim Leubner ossaEchoCB(agRoot, agContext, (void *)&pIomb->payload[0]);
7034e1bc9a0SAchim Leubner
7044e1bc9a0SAchim Leubner /* remove the request from IOMap */
7054e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
7064e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
7074e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
7084e1bc9a0SAchim Leubner
7094e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7104e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
7114e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
7124e1bc9a0SAchim Leubner /* return the request to free pool */
7134e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
7144e1bc9a0SAchim Leubner {
7154e1bc9a0SAchim Leubner SA_DBG1(("mpiEchoRsp: saving pRequest (%p) for later use\n", pRequest));
7164e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
7174e1bc9a0SAchim Leubner }
7184e1bc9a0SAchim Leubner else
7194e1bc9a0SAchim Leubner {
7204e1bc9a0SAchim Leubner /* return the request to free pool */
7214e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7224e1bc9a0SAchim Leubner }
7234e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7244e1bc9a0SAchim Leubner
7254e1bc9a0SAchim Leubner /* return value */
7264e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2g");
7274e1bc9a0SAchim Leubner return ret;
7284e1bc9a0SAchim Leubner }
7294e1bc9a0SAchim Leubner
7304e1bc9a0SAchim Leubner /******************************************************************************/
7314e1bc9a0SAchim Leubner /*! \brief Get NVM Data Response
7324e1bc9a0SAchim Leubner *
7334e1bc9a0SAchim Leubner * This routine handles the response of GET NVM Data Response
7344e1bc9a0SAchim Leubner *
7354e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
7364e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
7374e1bc9a0SAchim Leubner *
7384e1bc9a0SAchim Leubner * \return sucess or fail
7394e1bc9a0SAchim Leubner *
7404e1bc9a0SAchim Leubner */
7414e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetNVMDataRsp(agsaRoot_t * agRoot,agsaGetNVMDataRsp_t * pIomb)7424e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetNVMDataRsp(
7434e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
7444e1bc9a0SAchim Leubner agsaGetNVMDataRsp_t *pIomb
7454e1bc9a0SAchim Leubner )
7464e1bc9a0SAchim Leubner {
7474e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
7484e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7494e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
7504e1bc9a0SAchim Leubner agsaContext_t *agContext;
7514e1bc9a0SAchim Leubner bit32 i, dataLen;
7524e1bc9a0SAchim Leubner bit32 DlenStatus, tag, iRTdaBnDpsAsNvm;
7534e1bc9a0SAchim Leubner
7544e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD, "2h");
7554e1bc9a0SAchim Leubner
7564e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, tag));
7574e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &DlenStatus, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, DlenStatus));
7584e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &iRTdaBnDpsAsNvm, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, iRTdaBnDpsAsNvm));
7594e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &dataLen, pIomb, OSSA_OFFSET_OF(agsaGetNVMDataRsp_t, NVMData[10])) ;
7604e1bc9a0SAchim Leubner
7614e1bc9a0SAchim Leubner SA_DBG1(("mpiGetNVMDataRsp: HTAG=0x%x\n", tag));
7624e1bc9a0SAchim Leubner
7634e1bc9a0SAchim Leubner /* get request from IOMap */
7644e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
7654e1bc9a0SAchim Leubner if (agNULL == pRequest)
7664e1bc9a0SAchim Leubner {
7674e1bc9a0SAchim Leubner SA_DBG1(("mpiGetNVMDataRsp: Bad Response IOMB!!! pRequest is NULL.\n"));
7684e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2h");
7694e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
7704e1bc9a0SAchim Leubner }
7714e1bc9a0SAchim Leubner
7724e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
7734e1bc9a0SAchim Leubner
7744e1bc9a0SAchim Leubner if (iRTdaBnDpsAsNvm & IRMode)
7754e1bc9a0SAchim Leubner {
7764e1bc9a0SAchim Leubner /* indirect mode - IR bit set */
7774e1bc9a0SAchim Leubner SA_DBG1(("mpiGetNVMDataRsp: OSSA_SUCCESS, IR=1, DataLen=%d\n", dataLen));
7784e1bc9a0SAchim Leubner if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_CONFIG_SEEPROM) ||
7794e1bc9a0SAchim Leubner ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_VPD_FLASH) ||
7804e1bc9a0SAchim Leubner ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_TWI_DEVICES) ||
7814e1bc9a0SAchim Leubner ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_EXPANSION_ROM) ||
7824e1bc9a0SAchim Leubner ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_IOP_REG_FLASH))
7834e1bc9a0SAchim Leubner {
7844e1bc9a0SAchim Leubner /* CB for NVMD */
7854e1bc9a0SAchim Leubner //#ifdef UN_USED_FUNC
7864e1bc9a0SAchim Leubner ossaGetNVMDResponseCB(agRoot, agContext, (DlenStatus & NVMD_STAT), INDIRECT_MODE, dataLen, agNULL);
7874e1bc9a0SAchim Leubner //#endif
7884e1bc9a0SAchim Leubner }
7894e1bc9a0SAchim Leubner else if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AAP1_RDUMP) ||
7904e1bc9a0SAchim Leubner ((iRTdaBnDpsAsNvm & NVMD_TYPE) == IOP_RDUMP))
7914e1bc9a0SAchim Leubner {
7924e1bc9a0SAchim Leubner #ifdef UN_USED_FUNC
7934e1bc9a0SAchim Leubner if ((DlenStatus & NVMD_STAT) == 0)
7944e1bc9a0SAchim Leubner {
7954e1bc9a0SAchim Leubner /* CB for Register Dump */
7964e1bc9a0SAchim Leubner
7974e1bc9a0SAchim Leubner ossaGetRegisterDumpCB(agRoot, agContext, OSSA_SUCCESS);
7984e1bc9a0SAchim Leubner }
7994e1bc9a0SAchim Leubner else
8004e1bc9a0SAchim Leubner {
8014e1bc9a0SAchim Leubner /* CB for Register Dump */
8024e1bc9a0SAchim Leubner ossaGetRegisterDumpCB(agRoot, agContext, OSSA_FAILURE);
8034e1bc9a0SAchim Leubner }
8044e1bc9a0SAchim Leubner #endif
8054e1bc9a0SAchim Leubner }
8064e1bc9a0SAchim Leubner else
8074e1bc9a0SAchim Leubner {
8084e1bc9a0SAchim Leubner /* Should not be happened */
8094e1bc9a0SAchim Leubner SA_DBG1(("mpiGetNVMDataRsp: (IR=1)Wrong Device type 0x%x\n", iRTdaBnDpsAsNvm));
8104e1bc9a0SAchim Leubner }
8114e1bc9a0SAchim Leubner }
8124e1bc9a0SAchim Leubner else /* direct mode */
8134e1bc9a0SAchim Leubner {
8144e1bc9a0SAchim Leubner SA_DBG1(("mpiGetNVMDataRsp: OSSA_SUCCESS, IR=0, DataLen=%d\n", ((DlenStatus & NVMD_LEN) >> SHIFT24)));
8154e1bc9a0SAchim Leubner for (i = 0; i < (((DlenStatus & NVMD_LEN) >> SHIFT24)/4); i++)
8164e1bc9a0SAchim Leubner {
8174e1bc9a0SAchim Leubner SA_DBG1(("mpiGetNVMDataRsp: OSSA_SUCCESS, NVMDATA=0x%x\n", pIomb->NVMData[i]));
8184e1bc9a0SAchim Leubner }
8194e1bc9a0SAchim Leubner if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_CONFIG_SEEPROM) ||
8204e1bc9a0SAchim Leubner ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_VPD_FLASH) ||
8214e1bc9a0SAchim Leubner ((iRTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_TWI_DEVICES))
8224e1bc9a0SAchim Leubner {
8234e1bc9a0SAchim Leubner /* CB for NVMD */
8244e1bc9a0SAchim Leubner // char * safe_type_pun = (char *)(&pIomb->NVMData[0]);
8254e1bc9a0SAchim Leubner #ifdef UN_USED_FUNC
8264e1bc9a0SAchim Leubner ossaGetNVMDResponseCB(agRoot, agContext, (DlenStatus & NVMD_STAT), DIRECT_MODE,
8274e1bc9a0SAchim Leubner ((DlenStatus & NVMD_LEN) >> SHIFT24), (agsaFrameHandle_t *)safe_type_pun);
8284e1bc9a0SAchim Leubner #endif
8294e1bc9a0SAchim Leubner }
8304e1bc9a0SAchim Leubner else if (((iRTdaBnDpsAsNvm & NVMD_TYPE) == AAP1_RDUMP) ||
8314e1bc9a0SAchim Leubner ((iRTdaBnDpsAsNvm & NVMD_TYPE) == IOP_RDUMP))
8324e1bc9a0SAchim Leubner {
8334e1bc9a0SAchim Leubner #ifdef UN_USED_FUNC
8344e1bc9a0SAchim Leubner
8354e1bc9a0SAchim Leubner if ((DlenStatus & NVMD_STAT) == 0)
8364e1bc9a0SAchim Leubner {
8374e1bc9a0SAchim Leubner /* CB for Register Dump */
8384e1bc9a0SAchim Leubner ossaGetRegisterDumpCB(agRoot, agContext, OSSA_SUCCESS);
8394e1bc9a0SAchim Leubner }
8404e1bc9a0SAchim Leubner else
8414e1bc9a0SAchim Leubner {
8424e1bc9a0SAchim Leubner /* CB for Register Dump */
8434e1bc9a0SAchim Leubner ossaGetRegisterDumpCB(agRoot, agContext, OSSA_FAILURE);
8444e1bc9a0SAchim Leubner }
8454e1bc9a0SAchim Leubner #endif
8464e1bc9a0SAchim Leubner }
8474e1bc9a0SAchim Leubner else
8484e1bc9a0SAchim Leubner {
8494e1bc9a0SAchim Leubner /* Should not be happened */
8504e1bc9a0SAchim Leubner SA_DBG1(("mpiGetNVMDataRsp: (IR=0)Wrong Device type 0x%x\n", iRTdaBnDpsAsNvm));
8514e1bc9a0SAchim Leubner }
8524e1bc9a0SAchim Leubner }
8534e1bc9a0SAchim Leubner
8544e1bc9a0SAchim Leubner /* remove the request from IOMap */
8554e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
8564e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
8574e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
8584e1bc9a0SAchim Leubner
8594e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
8604e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
8614e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
8624e1bc9a0SAchim Leubner /* return the request to free pool */
8634e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
8644e1bc9a0SAchim Leubner {
8654e1bc9a0SAchim Leubner SA_DBG1(("mpiGetNVMDataRsp: saving pRequest (%p) for later use\n", pRequest));
8664e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
8674e1bc9a0SAchim Leubner }
8684e1bc9a0SAchim Leubner else
8694e1bc9a0SAchim Leubner {
8704e1bc9a0SAchim Leubner /* return the request to free pool */
8714e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
8724e1bc9a0SAchim Leubner }
8734e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
8744e1bc9a0SAchim Leubner
8754e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2h");
8764e1bc9a0SAchim Leubner
8774e1bc9a0SAchim Leubner /* return value */
8784e1bc9a0SAchim Leubner return ret;
8794e1bc9a0SAchim Leubner }
8804e1bc9a0SAchim Leubner
8814e1bc9a0SAchim Leubner /******************************************************************************/
8824e1bc9a0SAchim Leubner /*! \brief Phy Event Response from SPCv
8834e1bc9a0SAchim Leubner *
8844e1bc9a0SAchim Leubner * Process Phy Event from SPC
8854e1bc9a0SAchim Leubner *
8864e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LL Layer
8874e1bc9a0SAchim Leubner * \param pIomb pointer of IOMB
8884e1bc9a0SAchim Leubner *
8894e1bc9a0SAchim Leubner * \return success or fail
8904e1bc9a0SAchim Leubner *
8914e1bc9a0SAchim Leubner */
8924e1bc9a0SAchim Leubner /*******************************************************************************/
8934e1bc9a0SAchim Leubner
mpiPhyStartEvent(agsaRoot_t * agRoot,agsaHWEvent_Phy_OUB_t * pIomb)8944e1bc9a0SAchim Leubner GLOBAL bit32 mpiPhyStartEvent(
8954e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
8964e1bc9a0SAchim Leubner agsaHWEvent_Phy_OUB_t *pIomb
8974e1bc9a0SAchim Leubner )
8984e1bc9a0SAchim Leubner {
8994e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
9004e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
9014e1bc9a0SAchim Leubner
9024e1bc9a0SAchim Leubner bit32 phyId;
9034e1bc9a0SAchim Leubner bit32 IOMBStatus;
9044e1bc9a0SAchim Leubner bit32 tag;
9054e1bc9a0SAchim Leubner
9064e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
9074e1bc9a0SAchim Leubner agsaContext_t *agContext;
9084e1bc9a0SAchim Leubner bit32 HwCBStatus;
9094e1bc9a0SAchim Leubner
9104e1bc9a0SAchim Leubner if(saRoot == agNULL)
9114e1bc9a0SAchim Leubner {
9124e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStartEvent: saRoot == agNULL\n"));
9134e1bc9a0SAchim Leubner return(AGSA_RC_FAILURE);
9144e1bc9a0SAchim Leubner }
9154e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD, "2H");
9164e1bc9a0SAchim Leubner
9174e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t, tag)) ;
9184e1bc9a0SAchim Leubner
9194e1bc9a0SAchim Leubner /* get request from IOMap */
9204e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
9214e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
9224e1bc9a0SAchim Leubner /* remove the request from IOMap */
9234e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
9244e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
9254e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
9264e1bc9a0SAchim Leubner if (agNULL == pRequest)
9274e1bc9a0SAchim Leubner {
9284e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStartEvent: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x \n", tag));
9294e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2H");
9304e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
9314e1bc9a0SAchim Leubner }
9324e1bc9a0SAchim Leubner
9334e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStartEvent: Status 0x%X PhyId 0x%X\n",pIomb->Status,pIomb->ReservedPhyId));
9344e1bc9a0SAchim Leubner
9354e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &IOMBStatus, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,Status ));
9364e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &phyId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,ReservedPhyId ));
9374e1bc9a0SAchim Leubner
9384e1bc9a0SAchim Leubner switch (IOMBStatus)
9394e1bc9a0SAchim Leubner {
9404e1bc9a0SAchim Leubner case OSSA_MPI_IO_SUCCESS: /* PhyStart operation completed successfully */
9414e1bc9a0SAchim Leubner HwCBStatus = 0;
9424e1bc9a0SAchim Leubner saRoot->phys[phyId].linkstatus = 1;
9434e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStartEvent:MPI_IO_SUCCESS IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
9444e1bc9a0SAchim Leubner /* Callback with PHY_UP */
9454e1bc9a0SAchim Leubner break;
9464e1bc9a0SAchim Leubner 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. */
9474e1bc9a0SAchim Leubner HwCBStatus = 1;
9484e1bc9a0SAchim Leubner saRoot->phys[phyId].linkstatus = 0;
9494e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStartEvent: MPI_ERR_INVALID_PHY_ID IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
9504e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
9514e1bc9a0SAchim Leubner break;
9524e1bc9a0SAchim Leubner case OSSA_MPI_ERR_PHY_ALREADY_STARTED:
9534e1bc9a0SAchim Leubner HwCBStatus = 2;
9544e1bc9a0SAchim Leubner saRoot->phys[phyId].linkstatus = 1;
9554e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStartEvent: MPI_ERR_PHY_ALREADY_STARTED IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
9564e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
9574e1bc9a0SAchim Leubner break;
9584e1bc9a0SAchim Leubner case OSSA_MPI_ERR_INVALID_ANALOG_TBL_IDX:
9594e1bc9a0SAchim Leubner HwCBStatus = 4;
9604e1bc9a0SAchim Leubner saRoot->phys[phyId].linkstatus = 0;
9614e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStartEvent: MPI_ERR_INVALID_ANALOG_TBL_IDX IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
9624e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
9634e1bc9a0SAchim Leubner break;
9644e1bc9a0SAchim Leubner default:
9654e1bc9a0SAchim Leubner HwCBStatus = 3;
9664e1bc9a0SAchim Leubner saRoot->phys[phyId].linkstatus = 0;
9674e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStartEvent: Unknown IOMBStatus 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
9684e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
9694e1bc9a0SAchim Leubner break;
9704e1bc9a0SAchim Leubner }
9714e1bc9a0SAchim Leubner
9724e1bc9a0SAchim Leubner ossaHwCB(agRoot,agNULL, OSSA_HW_EVENT_PHY_START_STATUS ,((HwCBStatus << SHIFT8) | phyId) ,agContext, agNULL);
9734e1bc9a0SAchim Leubner
9744e1bc9a0SAchim Leubner /* return the request to free pool */
9754e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
9764e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
9774e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
9784e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
9794e1bc9a0SAchim Leubner {
9804e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStartEvent: saving pRequest (%p) for later use\n", pRequest));
9814e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
9824e1bc9a0SAchim Leubner }
9834e1bc9a0SAchim Leubner else
9844e1bc9a0SAchim Leubner {
9854e1bc9a0SAchim Leubner /* return the request to free pool */
9864e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
9874e1bc9a0SAchim Leubner }
9884e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
9894e1bc9a0SAchim Leubner
9904e1bc9a0SAchim Leubner return(ret);
9914e1bc9a0SAchim Leubner }
9924e1bc9a0SAchim Leubner
9934e1bc9a0SAchim Leubner
mpiPhyStopEvent(agsaRoot_t * agRoot,agsaHWEvent_Phy_OUB_t * pIomb)9944e1bc9a0SAchim Leubner GLOBAL bit32 mpiPhyStopEvent(
9954e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
9964e1bc9a0SAchim Leubner agsaHWEvent_Phy_OUB_t *pIomb
9974e1bc9a0SAchim Leubner )
9984e1bc9a0SAchim Leubner {
9994e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
10004e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
10014e1bc9a0SAchim Leubner bit32 phyId;
10024e1bc9a0SAchim Leubner
10034e1bc9a0SAchim Leubner bit32 IOMBStatus;
10044e1bc9a0SAchim Leubner bit32 HwCBStatus;
10054e1bc9a0SAchim Leubner
10064e1bc9a0SAchim Leubner bit32 tag;
10074e1bc9a0SAchim Leubner
10084e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
10094e1bc9a0SAchim Leubner agsaContext_t *agContext;
10104e1bc9a0SAchim Leubner
10114e1bc9a0SAchim Leubner agsaPhy_t *pPhy;
10124e1bc9a0SAchim Leubner agsaPort_t *pPort;
10134e1bc9a0SAchim Leubner
10144e1bc9a0SAchim Leubner
10154e1bc9a0SAchim Leubner if(saRoot == agNULL)
10164e1bc9a0SAchim Leubner {
10174e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStopEvent: saRoot == agNULL\n"));
10184e1bc9a0SAchim Leubner return(AGSA_RC_FAILURE);
10194e1bc9a0SAchim Leubner }
10204e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t, tag)) ;
10214e1bc9a0SAchim Leubner
10224e1bc9a0SAchim Leubner /* get request from IOMap */
10234e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
10244e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
10254e1bc9a0SAchim Leubner /* remove the request from IOMap */
10264e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
10274e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
10284e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
10294e1bc9a0SAchim Leubner if (agNULL == pRequest)
10304e1bc9a0SAchim Leubner {
10314e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStopEvent: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x \n", tag));
10324e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2H");
10334e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
10344e1bc9a0SAchim Leubner }
10354e1bc9a0SAchim Leubner
10364e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &IOMBStatus, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,Status ));
10374e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &phyId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_Phy_OUB_t,ReservedPhyId ));
10384e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStopEvent: Status %08X PhyId %08X\n",IOMBStatus,phyId));
10394e1bc9a0SAchim Leubner
10404e1bc9a0SAchim Leubner if(smIS_SPCV(agRoot))
10414e1bc9a0SAchim Leubner {
10424e1bc9a0SAchim Leubner phyId &= 0xff; // SPCv PHY_ID is one byte wide
10434e1bc9a0SAchim Leubner }
10444e1bc9a0SAchim Leubner
10454e1bc9a0SAchim Leubner saRoot->phys[phyId].linkstatus = 0;
10464e1bc9a0SAchim Leubner
10474e1bc9a0SAchim Leubner switch (IOMBStatus)
10484e1bc9a0SAchim Leubner {
10494e1bc9a0SAchim Leubner case OSSA_MPI_IO_SUCCESS: /* PhyStart operation completed successfully */
10504e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStopEvent:MPI_IO_SUCCESS 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
10514e1bc9a0SAchim Leubner HwCBStatus = 0;
10524e1bc9a0SAchim Leubner /* Callback with PHY_DOWN */
10534e1bc9a0SAchim Leubner break;
10544e1bc9a0SAchim Leubner 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. */
10554e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStopEvent: MPI_ERR_INVALID_PHY_ID 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
10564e1bc9a0SAchim Leubner HwCBStatus = 1;
10574e1bc9a0SAchim Leubner break;
10584e1bc9a0SAchim Leubner case OSSA_MPI_ERR_PHY_NOT_STARTED: /* An attempt to stop a phy which is not started */
10594e1bc9a0SAchim Leubner HwCBStatus = 4;
10604e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStopEvent: 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
10614e1bc9a0SAchim Leubner break;
10624e1bc9a0SAchim Leubner
10634e1bc9a0SAchim Leubner 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 */
10644e1bc9a0SAchim Leubner HwCBStatus = 2;
10654e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStopEvent: 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
10664e1bc9a0SAchim Leubner break;
10674e1bc9a0SAchim Leubner
10684e1bc9a0SAchim Leubner default:
10694e1bc9a0SAchim Leubner HwCBStatus = 3;
10704e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStopEvent: Unknown Status 0x%x for phyId 0x%x\n",IOMBStatus,phyId));
10714e1bc9a0SAchim Leubner break;
10724e1bc9a0SAchim Leubner }
10734e1bc9a0SAchim Leubner
10744e1bc9a0SAchim Leubner
10754e1bc9a0SAchim Leubner if(HwCBStatus == 0)
10764e1bc9a0SAchim Leubner {
10774e1bc9a0SAchim Leubner pPhy = &(saRoot->phys[phyId]);
10784e1bc9a0SAchim Leubner /* get the port of the phy */
10794e1bc9a0SAchim Leubner pPort = pPhy->pPort;
10804e1bc9a0SAchim Leubner if ( agNULL != pPort )
10814e1bc9a0SAchim Leubner {
10824e1bc9a0SAchim Leubner SA_DBG1(("siPhyStopCB: phy%d invalidating port\n", phyId));
10834e1bc9a0SAchim Leubner /* invalid port state, remove the port */
10844e1bc9a0SAchim Leubner pPort->status |= PORT_INVALIDATING;
10854e1bc9a0SAchim Leubner saRoot->PortMap[pPort->portId].PortStatus |= PORT_INVALIDATING;
10864e1bc9a0SAchim Leubner /* invalid the port */
10874e1bc9a0SAchim Leubner siPortInvalid(agRoot, pPort);
10884e1bc9a0SAchim Leubner /* map out the portmap */
10894e1bc9a0SAchim Leubner saRoot->PortMap[pPort->portId].PortContext = agNULL;
10904e1bc9a0SAchim Leubner saRoot->PortMap[pPort->portId].PortID = PORT_MARK_OFF;
10914e1bc9a0SAchim Leubner saRoot->PortMap[pPort->portId].PortStatus |= PORT_INVALIDATING;
10924e1bc9a0SAchim Leubner ossaHwCB(agRoot,&(pPort->portContext) , OSSA_HW_EVENT_PHY_STOP_STATUS, ((HwCBStatus << SHIFT8) | phyId ),agContext, agNULL);
10934e1bc9a0SAchim Leubner }
10944e1bc9a0SAchim Leubner else
10954e1bc9a0SAchim Leubner {
10964e1bc9a0SAchim Leubner SA_DBG1(("siPhyStopCB: phy%d - Port is not established\n", phyId));
10974e1bc9a0SAchim Leubner ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_PHY_STOP_STATUS, ((HwCBStatus << SHIFT8) | phyId ) , agContext, agNULL);
10984e1bc9a0SAchim Leubner }
10994e1bc9a0SAchim Leubner
11004e1bc9a0SAchim Leubner /* set PHY_STOPPED status */
11014e1bc9a0SAchim Leubner PHY_STATUS_SET(pPhy, PHY_STOPPED);
11024e1bc9a0SAchim Leubner
11034e1bc9a0SAchim Leubner /* Exclude the phy from a port */
11044e1bc9a0SAchim Leubner if ( agNULL != pPort )
11054e1bc9a0SAchim Leubner {
11064e1bc9a0SAchim Leubner /* Acquire port list lock */
11074e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_PORT_LOCK);
11084e1bc9a0SAchim Leubner
11094e1bc9a0SAchim Leubner /* Delete the phy from the port */
11104e1bc9a0SAchim Leubner pPort->phyMap[phyId] = agFALSE;
11114e1bc9a0SAchim Leubner saRoot->phys[phyId].pPort = agNULL;
11124e1bc9a0SAchim Leubner
11134e1bc9a0SAchim Leubner /* Release port list lock */
11144e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
11154e1bc9a0SAchim Leubner }
11164e1bc9a0SAchim Leubner
11174e1bc9a0SAchim Leubner }
11184e1bc9a0SAchim Leubner else
11194e1bc9a0SAchim Leubner {
11204e1bc9a0SAchim Leubner SA_DBG1(("siPhyStopCB: Error phy%d - Port is not established\n", phyId));
11214e1bc9a0SAchim Leubner ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_PHY_STOP_STATUS, ((HwCBStatus << SHIFT8) | phyId ) , agContext, agNULL);
11224e1bc9a0SAchim Leubner }
11234e1bc9a0SAchim Leubner
11244e1bc9a0SAchim Leubner /* return the request to free pool */
11254e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
11264e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
11274e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
11284e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
11294e1bc9a0SAchim Leubner {
11304e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyStartEvent: saving pRequest (%p) for later use\n", pRequest));
11314e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
11324e1bc9a0SAchim Leubner }
11334e1bc9a0SAchim Leubner else
11344e1bc9a0SAchim Leubner {
11354e1bc9a0SAchim Leubner /* return the request to free pool */
11364e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
11374e1bc9a0SAchim Leubner }
11384e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
11394e1bc9a0SAchim Leubner
11404e1bc9a0SAchim Leubner return(ret);
11414e1bc9a0SAchim Leubner }
11424e1bc9a0SAchim Leubner
11434e1bc9a0SAchim Leubner
11444e1bc9a0SAchim Leubner /******************************************************************************/
11454e1bc9a0SAchim Leubner /*! \brief Hardware Event Response from SPC
11464e1bc9a0SAchim Leubner *
11474e1bc9a0SAchim Leubner * Process HW Event from SPC
11484e1bc9a0SAchim Leubner *
11494e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LL Layer
11504e1bc9a0SAchim Leubner * \param pIomb pointer of IOMB
11514e1bc9a0SAchim Leubner *
11524e1bc9a0SAchim Leubner * \return success or fail
11534e1bc9a0SAchim Leubner *
11544e1bc9a0SAchim Leubner */
11554e1bc9a0SAchim Leubner /*******************************************************************************/
mpiHWevent(agsaRoot_t * agRoot,agsaHWEvent_SPC_OUB_t * pIomb)11564e1bc9a0SAchim Leubner GLOBAL bit32 mpiHWevent(
11574e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
11584e1bc9a0SAchim Leubner agsaHWEvent_SPC_OUB_t *pIomb
11594e1bc9a0SAchim Leubner )
11604e1bc9a0SAchim Leubner {
11614e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
11624e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
11634e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
11644e1bc9a0SAchim Leubner agsaPortContext_t *agPortContext;
11654e1bc9a0SAchim Leubner agsaSASIdentify_t *IDframe;
11664e1bc9a0SAchim Leubner agsaFisRegDeviceToHost_t *sataFis;
11674e1bc9a0SAchim Leubner agsaContext_t *agContext;
11684e1bc9a0SAchim Leubner agsaPort_t *pPort = agNULL;
11694e1bc9a0SAchim Leubner bit32 phyId;
11704e1bc9a0SAchim Leubner bit32 portId;
11714e1bc9a0SAchim Leubner bit32 Event;
11724e1bc9a0SAchim Leubner bit32 tag, status;
11734e1bc9a0SAchim Leubner bit8 linkRate;
11744e1bc9a0SAchim Leubner bit32 LREventPhyIdPortId;
11754e1bc9a0SAchim Leubner bit32 npipps, eventParam,npip,port_state;
11764e1bc9a0SAchim Leubner
11774e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2j");
11784e1bc9a0SAchim Leubner
11794e1bc9a0SAchim Leubner SA_ASSERT((agNULL !=saRoot ), "");
11804e1bc9a0SAchim Leubner if(saRoot == agNULL)
11814e1bc9a0SAchim Leubner {
11824e1bc9a0SAchim Leubner SA_DBG1(("mpiHWevent: saRoot == agNULL\n"));
11834e1bc9a0SAchim Leubner return(AGSA_RC_FAILURE);
11844e1bc9a0SAchim Leubner }
11854e1bc9a0SAchim Leubner if(smIS_SPC(agRoot))
11864e1bc9a0SAchim Leubner {
11874e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &LREventPhyIdPortId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, LRStatusEventPhyIdPortId));
11884e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &npipps, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, NpipPortState));
11894e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &eventParam, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, EVParam));
11904e1bc9a0SAchim Leubner SA_DBG2(("mpiHWEvent: S, LREventPhyIdPortId 0x%08x npipps 0x%08x eventParam 0x%08x\n", LREventPhyIdPortId ,npipps ,eventParam ));
11914e1bc9a0SAchim Leubner
11924e1bc9a0SAchim Leubner /* get port context */
11934e1bc9a0SAchim Leubner portId = LREventPhyIdPortId & PORTID_MASK;
11944e1bc9a0SAchim Leubner smTrace(hpDBG_VERY_LOUD,"QK",portId);
11954e1bc9a0SAchim Leubner /* TP:QK portId */
11964e1bc9a0SAchim Leubner
11974e1bc9a0SAchim Leubner /* get phyId */
11984e1bc9a0SAchim Leubner phyId = (LREventPhyIdPortId & PHY_ID_BITS) >> SHIFT4;
11994e1bc9a0SAchim Leubner
12004e1bc9a0SAchim Leubner smTrace(hpDBG_VERY_LOUD,"QK",npipps);
12014e1bc9a0SAchim Leubner /* TP:QK npipps */
12024e1bc9a0SAchim Leubner smTrace(hpDBG_VERY_LOUD,"QL",portId);
12034e1bc9a0SAchim Leubner /* TP:QL portId */
12044e1bc9a0SAchim Leubner smTrace(hpDBG_VERY_LOUD,"QM",phyId);
12054e1bc9a0SAchim Leubner /* TP:QM phyId */
12064e1bc9a0SAchim Leubner
12074e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent:SPC, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
12084e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, (npipps & PORT_STATE_MASK)));
12094e1bc9a0SAchim Leubner }
12104e1bc9a0SAchim Leubner else
12114e1bc9a0SAchim Leubner {
12124e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &LREventPhyIdPortId, pIomb, OSSA_OFFSET_OF(agsaHWEvent_V_OUB_t, LRStatEventPortId));
12134e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &npipps, pIomb, OSSA_OFFSET_OF(agsaHWEvent_V_OUB_t, RsvPhyIdNpipRsvPortState));
12144e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &eventParam, pIomb, OSSA_OFFSET_OF(agsaHWEvent_V_OUB_t, EVParam));
12154e1bc9a0SAchim Leubner SA_DBG2(("mpiHWEvent: V, LREventPhyIdPortId 0x%08x npipps 0x%08x eventParam 0x%08x\n", LREventPhyIdPortId ,npipps ,eventParam ));
12164e1bc9a0SAchim Leubner
12174e1bc9a0SAchim Leubner smTrace(hpDBG_VERY_LOUD,"QN",npipps);
12184e1bc9a0SAchim Leubner /* TP:QN npipps */
12194e1bc9a0SAchim Leubner
12204e1bc9a0SAchim Leubner /* get port context */
12214e1bc9a0SAchim Leubner portId = LREventPhyIdPortId & PORTID_MASK;
12224e1bc9a0SAchim Leubner
12234e1bc9a0SAchim Leubner smTrace(hpDBG_VERY_LOUD,"QO",portId);
12244e1bc9a0SAchim Leubner /* TP:QO portId */
12254e1bc9a0SAchim Leubner
12264e1bc9a0SAchim Leubner /* get phyId */
12274e1bc9a0SAchim Leubner phyId = (npipps & PHY_ID_V_BITS) >> SHIFT16;
12284e1bc9a0SAchim Leubner smTrace(hpDBG_VERY_LOUD,"QP",phyId);
12294e1bc9a0SAchim Leubner /* TP:QP phyId */
12304e1bc9a0SAchim Leubner
12314e1bc9a0SAchim Leubner /* get npipps */
12324e1bc9a0SAchim Leubner npip =(npipps & 0xFF00 ) >> SHIFT4;
12334e1bc9a0SAchim Leubner port_state =(npipps & 0xF );
12344e1bc9a0SAchim Leubner npipps = npip | port_state; // Make it look like SPCs nipps
12354e1bc9a0SAchim Leubner
12364e1bc9a0SAchim Leubner
12374e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: V, PhyID 0x%x PortID 0x%x NPIP 0x%x PS 0x%x npipps 0x%x\n",
12384e1bc9a0SAchim Leubner phyId, portId,npip,port_state,npipps));
12394e1bc9a0SAchim Leubner }
12404e1bc9a0SAchim Leubner
12414e1bc9a0SAchim Leubner Event = (LREventPhyIdPortId & HW_EVENT_BITS) >> SHIFT8;
12424e1bc9a0SAchim Leubner
12434e1bc9a0SAchim Leubner /* get Link Rate */
12444e1bc9a0SAchim Leubner linkRate = (bit8)((LREventPhyIdPortId & LINK_RATE_MASK) >> SHIFT28);
12454e1bc9a0SAchim Leubner /* get status byte */
12464e1bc9a0SAchim Leubner status = (LREventPhyIdPortId & STATUS_BITS) >> SHIFT24;
12474e1bc9a0SAchim Leubner
12484e1bc9a0SAchim Leubner smTrace(hpDBG_VERY_LOUD,"HA",portId);
12494e1bc9a0SAchim Leubner /* TP:HA portId */
12504e1bc9a0SAchim Leubner smTrace(hpDBG_VERY_LOUD,"HB",linkRate);
12514e1bc9a0SAchim Leubner /* TP:HB linkRate */
12524e1bc9a0SAchim Leubner smTrace(hpDBG_VERY_LOUD,"HC",phyId);
12534e1bc9a0SAchim Leubner /* TP:HC phyId */
12544e1bc9a0SAchim Leubner smTrace(hpDBG_VERY_LOUD,"HD",npipps);
12554e1bc9a0SAchim Leubner /* TP:HD npipps */
12564e1bc9a0SAchim Leubner smTrace(hpDBG_VERY_LOUD,"HE",status);
12574e1bc9a0SAchim Leubner /* TP:HE status */
12584e1bc9a0SAchim Leubner
12594e1bc9a0SAchim Leubner if (portId > saRoot->phyCount)
12604e1bc9a0SAchim Leubner {
12614e1bc9a0SAchim Leubner if (OSSA_PORT_NOT_ESTABLISHED == (npipps & PORT_STATE_MASK))
12624e1bc9a0SAchim Leubner {
12634e1bc9a0SAchim Leubner /* out of range checking for portId */
12644e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: PORT_ID is out of range, PhyID %d PortID %d\n",
12654e1bc9a0SAchim Leubner phyId, portId));
12664e1bc9a0SAchim Leubner /* port is not estiblished */
12674e1bc9a0SAchim Leubner agPortContext = agNULL;
12684e1bc9a0SAchim Leubner }
12694e1bc9a0SAchim Leubner else
12704e1bc9a0SAchim Leubner {
12714e1bc9a0SAchim Leubner /* portId is bad and state is correct - should not happen */
12724e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: PORT_ID is bad with correct Port State, PhyID %d PortID %d\n",
12734e1bc9a0SAchim Leubner phyId, portId));
12744e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2j");
12754e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
12764e1bc9a0SAchim Leubner }
12774e1bc9a0SAchim Leubner }
12784e1bc9a0SAchim Leubner else
12794e1bc9a0SAchim Leubner {
12804e1bc9a0SAchim Leubner 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));
12814e1bc9a0SAchim Leubner agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
12824e1bc9a0SAchim Leubner }
12834e1bc9a0SAchim Leubner
12844e1bc9a0SAchim Leubner if(agPortContext == agNULL)
12854e1bc9a0SAchim Leubner {
12864e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: agPortContext is NULL, PhyID %d PortID %d\n",
12874e1bc9a0SAchim Leubner phyId, portId));
12884e1bc9a0SAchim Leubner }
12894e1bc9a0SAchim Leubner
12904e1bc9a0SAchim Leubner smTrace(hpDBG_VERY_LOUD,"HF",Event);
12914e1bc9a0SAchim Leubner /* TP:HF OSSA_HW_EVENT */
12924e1bc9a0SAchim Leubner
12934e1bc9a0SAchim Leubner switch (Event)
12944e1bc9a0SAchim Leubner {
12954e1bc9a0SAchim Leubner case OSSA_HW_EVENT_SAS_PHY_UP:
12964e1bc9a0SAchim Leubner {
12974e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_SAS_PHY_UP, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
12984e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, (npipps & PORT_STATE_MASK)));
12994e1bc9a0SAchim Leubner
13004e1bc9a0SAchim Leubner /* get SAS Identify info */
13014e1bc9a0SAchim Leubner IDframe = (agsaSASIdentify_t *)&pIomb->sasIdentify;
13024e1bc9a0SAchim Leubner /* Callback about SAS link up */
13034e1bc9a0SAchim Leubner saRoot->phys[phyId].linkstatus |= 2;
13044e1bc9a0SAchim Leubner saRoot->phys[phyId].sasIdentify.phyIdentifier = IDframe->phyIdentifier;
13054e1bc9a0SAchim Leubner saRoot->phys[phyId].sasIdentify.deviceType_addressFrameType = IDframe->deviceType_addressFrameType;
13064e1bc9a0SAchim Leubner
13074e1bc9a0SAchim Leubner si_memcpy(&(saRoot->phys[phyId].sasIdentify.sasAddressHi),&(IDframe->sasAddressHi),4);
13084e1bc9a0SAchim Leubner si_memcpy(&(saRoot->phys[phyId].sasIdentify.sasAddressLo),&(IDframe->sasAddressLo),4);
13094e1bc9a0SAchim Leubner siEventPhyUpRcvd(agRoot, phyId, IDframe, portId, npipps, linkRate);
13104e1bc9a0SAchim Leubner break;
13114e1bc9a0SAchim Leubner }
13124e1bc9a0SAchim Leubner case OSSA_HW_EVENT_SATA_PHY_UP:
13134e1bc9a0SAchim Leubner {
13144e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_SATA_PHY_UP, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
13154e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, (npipps & PORT_STATE_MASK)));
13164e1bc9a0SAchim Leubner
13174e1bc9a0SAchim Leubner /* get SATA FIS info */
13184e1bc9a0SAchim Leubner saRoot->phys[phyId].linkstatus |= 2;
13194e1bc9a0SAchim Leubner sataFis = (agsaFisRegDeviceToHost_t *)&pIomb->sataFis;
13204e1bc9a0SAchim Leubner /* Callback about SATA Link Up */
13214e1bc9a0SAchim Leubner siEventSATASignatureRcvd(agRoot, phyId, (void *)sataFis, portId, npipps, linkRate);
13224e1bc9a0SAchim Leubner break;
13234e1bc9a0SAchim Leubner }
13244e1bc9a0SAchim Leubner case OSSA_HW_EVENT_SATA_SPINUP_HOLD:
13254e1bc9a0SAchim Leubner {
13264e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_SATA_SPINUP_HOLD, PhyID %d\n", phyId));
13274e1bc9a0SAchim Leubner ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_SATA_SPINUP_HOLD, phyId, agNULL, agNULL);
13284e1bc9a0SAchim Leubner break;
13294e1bc9a0SAchim Leubner }
13304e1bc9a0SAchim Leubner case OSSA_HW_EVENT_PHY_DOWN:
13314e1bc9a0SAchim Leubner {
13324e1bc9a0SAchim Leubner agsaPhy_t *pPhy = &(saRoot->phys[phyId]);
13334e1bc9a0SAchim Leubner
13344e1bc9a0SAchim Leubner if(pPhy) {
13354e1bc9a0SAchim Leubner osti_memset(&pPhy->sasIdentify,0,sizeof(agsaSASIdentify_t));
13364e1bc9a0SAchim Leubner }
13374e1bc9a0SAchim Leubner saRoot->phys[phyId].linkstatus &= 1;
13384e1bc9a0SAchim Leubner if (agNULL != agPortContext)
13394e1bc9a0SAchim Leubner {
13404e1bc9a0SAchim Leubner pPort = (agsaPort_t *) (agPortContext->sdkData);
13414e1bc9a0SAchim Leubner }
13424e1bc9a0SAchim Leubner
13434e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
13444e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
13454e1bc9a0SAchim Leubner
13464e1bc9a0SAchim Leubner /* callback */
13474e1bc9a0SAchim Leubner if ( agNULL != pPort )
13484e1bc9a0SAchim Leubner {
13494e1bc9a0SAchim Leubner if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
13504e1bc9a0SAchim Leubner {
13514e1bc9a0SAchim Leubner pPort->status &= ~PORT_INVALIDATING;
13524e1bc9a0SAchim Leubner saRoot->PortMap[portId].PortStatus &= ~PORT_INVALIDATING;
13534e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN, PhyID %d ~PORT_INVALIDATING \n", phyId));
13544e1bc9a0SAchim Leubner }
13554e1bc9a0SAchim Leubner else
13564e1bc9a0SAchim Leubner {
13574e1bc9a0SAchim Leubner if (OSSA_PORT_INVALID == (npipps & PORT_STATE_MASK))
13584e1bc9a0SAchim Leubner {
13594e1bc9a0SAchim Leubner /* set port invalid flag */
13604e1bc9a0SAchim Leubner pPort->status |= PORT_INVALIDATING;
13614e1bc9a0SAchim Leubner saRoot->PortMap[portId].PortStatus |= PORT_INVALIDATING;
13624e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN PortInvalid portID %d PortContext %p NPIP 0x%x\n", portId, agPortContext,npipps));
13634e1bc9a0SAchim Leubner }
13644e1bc9a0SAchim Leubner else
13654e1bc9a0SAchim Leubner {
13664e1bc9a0SAchim Leubner if (OSSA_PORT_IN_RESET == (npipps & PORT_STATE_MASK))
13674e1bc9a0SAchim Leubner {
13684e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN PortInReset portID %d PortContext %p\n", portId, agPortContext));
13694e1bc9a0SAchim Leubner }
13704e1bc9a0SAchim Leubner else
13714e1bc9a0SAchim Leubner {
13724e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN Not PortInReset portID %d PortContext %p\n", portId, agPortContext));
13734e1bc9a0SAchim Leubner }
13744e1bc9a0SAchim Leubner }
13754e1bc9a0SAchim Leubner }
13764e1bc9a0SAchim Leubner
13774e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
13784e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
13794e1bc9a0SAchim Leubner /* Callback with PHY_DOWN */
13804e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_DOWN, phyId, agNULL, agNULL);
13814e1bc9a0SAchim Leubner }
13824e1bc9a0SAchim Leubner else
13834e1bc9a0SAchim Leubner {
13844e1bc9a0SAchim Leubner /* no portcontext.- error */
13854e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_DOWN PhyDown pPort is NULL.\n"));
13864e1bc9a0SAchim Leubner }
13874e1bc9a0SAchim Leubner
13884e1bc9a0SAchim Leubner /* set PHY_DOWN status */
13894e1bc9a0SAchim Leubner PHY_STATUS_SET(pPhy, PHY_DOWN);
13904e1bc9a0SAchim Leubner break;
13914e1bc9a0SAchim Leubner }
13924e1bc9a0SAchim Leubner case OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC:
13934e1bc9a0SAchim Leubner {
13944e1bc9a0SAchim Leubner agsaPhyErrCountersPage_t errorParam;
13954e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
13964e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
13974e1bc9a0SAchim Leubner si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
13984e1bc9a0SAchim Leubner errorParam.inboundCRCError = eventParam;
13994e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
14004e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
14014e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC, phyId, (void *)&errorParam, agNULL);
14024e1bc9a0SAchim Leubner break;
14034e1bc9a0SAchim Leubner }
14044e1bc9a0SAchim Leubner case OSSA_HW_EVENT_HARD_RESET_RECEIVED:
14054e1bc9a0SAchim Leubner {
14064e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_HARD_RESET_RECEIVED, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
14074e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
14084e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
14094e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
14104e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_HARD_RESET_RECEIVED, phyId, agNULL, agNULL);
14114e1bc9a0SAchim Leubner break;
14124e1bc9a0SAchim Leubner }
14134e1bc9a0SAchim Leubner case OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD:
14144e1bc9a0SAchim Leubner {
14154e1bc9a0SAchim Leubner agsaPhyErrCountersPage_t errorParam;
14164e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_INVALID_DWORD, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
14174e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
14184e1bc9a0SAchim Leubner si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
14194e1bc9a0SAchim Leubner errorParam.invalidDword = eventParam;
14204e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
14214e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD, phyId, (void *)&errorParam, agNULL);
14224e1bc9a0SAchim Leubner break;
14234e1bc9a0SAchim Leubner }
14244e1bc9a0SAchim Leubner case OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR:
14254e1bc9a0SAchim Leubner {
14264e1bc9a0SAchim Leubner agsaPhyErrCountersPage_t errorParam;
14274e1bc9a0SAchim Leubner SA_DBG3(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_DISPARITY_ERROR, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
14284e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
14294e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
14304e1bc9a0SAchim Leubner si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
14314e1bc9a0SAchim Leubner errorParam.runningDisparityError = eventParam;
14324e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
14334e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR, phyId, (void *)&errorParam, agNULL);
14344e1bc9a0SAchim Leubner break;
14354e1bc9a0SAchim Leubner }
14364e1bc9a0SAchim Leubner case OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION:
14374e1bc9a0SAchim Leubner {
14384e1bc9a0SAchim Leubner agsaPhyErrCountersPage_t errorParam;
14394e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
14404e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
14414e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
14424e1bc9a0SAchim Leubner si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
14434e1bc9a0SAchim Leubner errorParam.codeViolation = eventParam;
14444e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
14454e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION, phyId, (void *)&errorParam, agNULL);
14464e1bc9a0SAchim Leubner break;
14474e1bc9a0SAchim Leubner }
14484e1bc9a0SAchim Leubner case OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH:
14494e1bc9a0SAchim Leubner {
14504e1bc9a0SAchim Leubner agsaPhyErrCountersPage_t errorParam;
14514e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_LINK_ERR_LOSS_OF_DWORD_SYNCH, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
14524e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
14534e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
14544e1bc9a0SAchim Leubner si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
14554e1bc9a0SAchim Leubner errorParam.lossOfDwordSynch = eventParam;
14564e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
14574e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH, phyId, (void *)&errorParam, agNULL);
14584e1bc9a0SAchim Leubner break;
14594e1bc9a0SAchim Leubner }
14604e1bc9a0SAchim Leubner case OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO:
14614e1bc9a0SAchim Leubner {
14624e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
14634e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
14644e1bc9a0SAchim Leubner
14654e1bc9a0SAchim Leubner if (agNULL != agPortContext)
14664e1bc9a0SAchim Leubner {
14674e1bc9a0SAchim Leubner pPort = (agsaPort_t *) (agPortContext->sdkData);
14684e1bc9a0SAchim Leubner }
14694e1bc9a0SAchim Leubner else
14704e1bc9a0SAchim Leubner {
14714e1bc9a0SAchim Leubner SA_ASSERT((agPortContext), "agPortContext agNULL was there a PHY UP?");
14724e1bc9a0SAchim Leubner return(AGSA_RC_FAILURE);
14734e1bc9a0SAchim Leubner }
14744e1bc9a0SAchim Leubner
14754e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
14764e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
14774e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO, phyId, agNULL, agNULL);
14784e1bc9a0SAchim Leubner
14794e1bc9a0SAchim Leubner if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
14804e1bc9a0SAchim Leubner {
14814e1bc9a0SAchim Leubner pPort->status &= ~PORT_INVALIDATING;
14824e1bc9a0SAchim Leubner saRoot->PortMap[portId].PortStatus &= ~PORT_INVALIDATING;
14834e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO NOT PORT_INVALIDATING portID %d PortContext %p\n", portId, agPortContext));
14844e1bc9a0SAchim Leubner }
14854e1bc9a0SAchim Leubner else
14864e1bc9a0SAchim Leubner {
14874e1bc9a0SAchim Leubner if (OSSA_PORT_INVALID == (npipps & PORT_STATE_MASK))
14884e1bc9a0SAchim Leubner {
14894e1bc9a0SAchim Leubner /* set port invalid flag */
14904e1bc9a0SAchim Leubner pPort->status |= PORT_INVALIDATING;
14914e1bc9a0SAchim Leubner saRoot->PortMap[portId].PortStatus |= PORT_INVALIDATING;
14924e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO PORT_INVALIDATING portID %d PortContext %p\n", portId, agPortContext));
14934e1bc9a0SAchim Leubner }
14944e1bc9a0SAchim Leubner else
14954e1bc9a0SAchim Leubner {
14964e1bc9a0SAchim Leubner if (OSSA_PORT_IN_RESET == (npipps & PORT_STATE_MASK))
14974e1bc9a0SAchim Leubner {
14984e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: PortInReset portID %d PortContext %p\n", portId, agPortContext));
14994e1bc9a0SAchim Leubner }
15004e1bc9a0SAchim Leubner }
15014e1bc9a0SAchim Leubner }
15024e1bc9a0SAchim Leubner break;
15034e1bc9a0SAchim Leubner }
15044e1bc9a0SAchim Leubner case OSSA_HW_EVENT_PORT_RECOVER:
15054e1bc9a0SAchim Leubner {
15064e1bc9a0SAchim Leubner if (agNULL != agPortContext)
15074e1bc9a0SAchim Leubner {
15084e1bc9a0SAchim Leubner pPort = (agsaPort_t *) (agPortContext->sdkData);
15094e1bc9a0SAchim Leubner }
15104e1bc9a0SAchim Leubner
15114e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVER, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
15124e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
15134e1bc9a0SAchim Leubner
15144e1bc9a0SAchim Leubner if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
15154e1bc9a0SAchim Leubner {
15164e1bc9a0SAchim Leubner if (agNULL != pPort)
15174e1bc9a0SAchim Leubner {
15184e1bc9a0SAchim Leubner /* reset port invalid flag */
15194e1bc9a0SAchim Leubner pPort->status &= ~PORT_INVALIDATING;
15204e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RECOVER NOT PORT_INVALIDATING portID %d PortContext %p\n", portId, agPortContext));
15214e1bc9a0SAchim Leubner }
15224e1bc9a0SAchim Leubner saRoot->PortMap[portId].PortStatus &= ~PORT_INVALIDATING;
15234e1bc9a0SAchim Leubner }
15244e1bc9a0SAchim Leubner /* get SAS Identify info */
15254e1bc9a0SAchim Leubner IDframe = (agsaSASIdentify_t *)&pIomb->sasIdentify;
15264e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState and LinkRate */
15274e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16) | (linkRate << SHIFT8);
15284e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RECOVER, phyId, agNULL, (void *)IDframe);
15294e1bc9a0SAchim Leubner break;
15304e1bc9a0SAchim Leubner }
15314e1bc9a0SAchim Leubner case OSSA_HW_EVENT_PHY_STOP_STATUS:
15324e1bc9a0SAchim Leubner {
15334e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS PhyId=0x%x, status=0x%x eventParam=0x%x\n", phyId, status,eventParam));
15344e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, EVParam));
15354e1bc9a0SAchim Leubner
15364e1bc9a0SAchim Leubner switch(eventParam)
15374e1bc9a0SAchim Leubner {
15384e1bc9a0SAchim Leubner case 0:
15394e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS Stopped 0\n" ));
15404e1bc9a0SAchim Leubner break;
15414e1bc9a0SAchim Leubner case 1:
15424e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS INVALID_PHY 1\n" ));
15434e1bc9a0SAchim Leubner break;
15444e1bc9a0SAchim Leubner case 2:
15454e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS DEVICES_ATTACHED 2\n" ));
15464e1bc9a0SAchim Leubner break;
15474e1bc9a0SAchim Leubner case 3:
15484e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS OTHER_FAILURE 3\n" ));
15494e1bc9a0SAchim Leubner break;
15504e1bc9a0SAchim Leubner case 4:
15514e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS PHY_NOT_ENABLED 4\n" ));
15524e1bc9a0SAchim Leubner break;
15534e1bc9a0SAchim Leubner default:
15544e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS Unknown code 0x%x\n", eventParam));
15554e1bc9a0SAchim Leubner break;
15564e1bc9a0SAchim Leubner }
15574e1bc9a0SAchim Leubner
15584e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_STOP_STATUS phyId 0x%x status 0x%x eventParam 0x%x\n", phyId, status,eventParam));
15594e1bc9a0SAchim Leubner /* get request from IOMap */
15604e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
15614e1bc9a0SAchim Leubner SA_ASSERT((pRequest), "pRequest NULL");
15624e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
15634e1bc9a0SAchim Leubner
15644e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
15654e1bc9a0SAchim Leubner
15664e1bc9a0SAchim Leubner siPhyStopCB(agRoot, phyId, status, agContext, portId, npipps);
15674e1bc9a0SAchim Leubner
15684e1bc9a0SAchim Leubner /* remove the request from IOMap */
15694e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
15704e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
15714e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
15724e1bc9a0SAchim Leubner
15734e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
15744e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
15754e1bc9a0SAchim Leubner /* return the request to free pool */
15764e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
15774e1bc9a0SAchim Leubner {
15784e1bc9a0SAchim Leubner SA_DBG1(("mpiHWevent: saving pRequest (%p) for later use\n", pRequest));
15794e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
15804e1bc9a0SAchim Leubner }
15814e1bc9a0SAchim Leubner else
15824e1bc9a0SAchim Leubner {
15834e1bc9a0SAchim Leubner /* return the request to free pool */
15844e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
15854e1bc9a0SAchim Leubner }
15864e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
15874e1bc9a0SAchim Leubner break;
15884e1bc9a0SAchim Leubner }
15894e1bc9a0SAchim Leubner case OSSA_HW_EVENT_BROADCAST_CHANGE:
15904e1bc9a0SAchim Leubner {
15914e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_CHANGE, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
15924e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
15934e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
15944e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
15954e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE, phyId, agNULL, agNULL);
15964e1bc9a0SAchim Leubner break;
15974e1bc9a0SAchim Leubner }
15984e1bc9a0SAchim Leubner case OSSA_HW_EVENT_BROADCAST_SES:
15994e1bc9a0SAchim Leubner {
16004e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_CHANGE_SES, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
16014e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
16024e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
16034e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
16044e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_SES, phyId, agNULL, agNULL);
16054e1bc9a0SAchim Leubner break;
16064e1bc9a0SAchim Leubner }
16074e1bc9a0SAchim Leubner case OSSA_HW_EVENT_BROADCAST_EXP:
16084e1bc9a0SAchim Leubner {
16094e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_EXP, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
16104e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
16114e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
16124e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
16134e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_EXP, phyId, agNULL, agNULL);
16144e1bc9a0SAchim Leubner break;
16154e1bc9a0SAchim Leubner }
16164e1bc9a0SAchim Leubner case OSSA_HW_EVENT_ID_FRAME_TIMEOUT:
16174e1bc9a0SAchim Leubner {
16184e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_ID_FRAME_TIMEOUT, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
16194e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
16204e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
16214e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
16224e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_ID_FRAME_TIMEOUT, phyId, agNULL, agNULL);
16234e1bc9a0SAchim Leubner break;
16244e1bc9a0SAchim Leubner }
16254e1bc9a0SAchim Leubner case OSSA_HW_EVENT_PHY_START_STATUS:
16264e1bc9a0SAchim Leubner {
16274e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaHWEvent_SPC_OUB_t, EVParam)) ;
16284e1bc9a0SAchim Leubner /* get request from IOMap */
16294e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
16304e1bc9a0SAchim Leubner
16314e1bc9a0SAchim Leubner SA_ASSERT((pRequest), "pRequest");
16324e1bc9a0SAchim Leubner if( pRequest == agNULL)
16334e1bc9a0SAchim Leubner {
16344e1bc9a0SAchim Leubner SA_DBG1(("mpiHWevent: pRequest (%p) NULL\n", pRequest));
16354e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
16364e1bc9a0SAchim Leubner break;
16374e1bc9a0SAchim Leubner }
16384e1bc9a0SAchim Leubner
16394e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
16404e1bc9a0SAchim Leubner
16414e1bc9a0SAchim Leubner /* makeup for CB */
16424e1bc9a0SAchim Leubner status = (status << 8) | phyId;
16434e1bc9a0SAchim Leubner ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_PHY_START_STATUS, status, agContext, agNULL);
16444e1bc9a0SAchim Leubner
16454e1bc9a0SAchim Leubner /* remove the request from IOMap */
16464e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
16474e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
16484e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
16494e1bc9a0SAchim Leubner
16504e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
16514e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
16524e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
16534e1bc9a0SAchim Leubner /* return the request to free pool */
16544e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
16554e1bc9a0SAchim Leubner {
16564e1bc9a0SAchim Leubner SA_DBG1(("mpiHWevent: saving pRequest (%p) for later use\n", pRequest));
16574e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
16584e1bc9a0SAchim Leubner }
16594e1bc9a0SAchim Leubner else
16604e1bc9a0SAchim Leubner {
16614e1bc9a0SAchim Leubner /* return the request to free pool */
16624e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
16634e1bc9a0SAchim Leubner }
16644e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
16654e1bc9a0SAchim Leubner
16664e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_START_STATUS, PhyID %d\n", phyId));
16674e1bc9a0SAchim Leubner
16684e1bc9a0SAchim Leubner break;
16694e1bc9a0SAchim Leubner }
16704e1bc9a0SAchim Leubner case OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED:
16714e1bc9a0SAchim Leubner {
16724e1bc9a0SAchim Leubner agsaPhyErrCountersPage_t errorParam;
16734e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED, PhyID %d PortID %d NPIP 0x%x PS 0x%x\n",
16744e1bc9a0SAchim Leubner phyId, portId, (npipps & PHY_IN_PORT_MASK) >> SHIFT4, npipps & PORT_STATE_MASK));
16754e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
16764e1bc9a0SAchim Leubner si_memset(&errorParam, 0, sizeof(agsaPhyErrCountersPage_t));
16774e1bc9a0SAchim Leubner errorParam.phyResetProblem = eventParam;
16784e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
16794e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED, phyId, (void *)&errorParam, agNULL);
16804e1bc9a0SAchim Leubner break;
16814e1bc9a0SAchim Leubner }
16824e1bc9a0SAchim Leubner case OSSA_HW_EVENT_PORT_RESET_TIMER_TMO:
16834e1bc9a0SAchim Leubner {
16844e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RESET_TIMER_TMO, PhyID %d PortID %d\n", phyId, portId));
16854e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
16864e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
16874e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RESET_TIMER_TMO, phyId, agNULL, agNULL);
16884e1bc9a0SAchim Leubner break;
16894e1bc9a0SAchim Leubner }
16904e1bc9a0SAchim Leubner case OSSA_HW_EVENT_PORT_RESET_COMPLETE:
16914e1bc9a0SAchim Leubner {
16924e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_PORT_RESET_COMPLETE, PhyID %d PortID %d\n", phyId, portId));
16934e1bc9a0SAchim Leubner /* get SAS Identify info */
16944e1bc9a0SAchim Leubner IDframe = (agsaSASIdentify_t *)&pIomb->sasIdentify;
16954e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState and LinkRate */
16964e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16) | (linkRate << SHIFT8);
16974e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_PORT_RESET_COMPLETE, phyId, agNULL, (void *)IDframe);
16984e1bc9a0SAchim Leubner break;
16994e1bc9a0SAchim Leubner }
17004e1bc9a0SAchim Leubner case OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT:
17014e1bc9a0SAchim Leubner {
17024e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT, PhyID %d PortID %d\n", phyId, portId));
17034e1bc9a0SAchim Leubner /* report PhyId, NPIP, PortState */
17044e1bc9a0SAchim Leubner phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
17054e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT, phyId, agNULL, agNULL);
17064e1bc9a0SAchim Leubner break;
17074e1bc9a0SAchim Leubner }
17084e1bc9a0SAchim Leubner case OSSA_HW_EVENT_IT_NEXUS_LOSS:
17094e1bc9a0SAchim Leubner {
17104e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_IT_NEXUS_LOSS, PhyID %d PortID %d status 0x%X\n", phyId, portId,status));
17114e1bc9a0SAchim Leubner break;
17124e1bc9a0SAchim Leubner }
17134e1bc9a0SAchim Leubner case OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED:
17144e1bc9a0SAchim Leubner {
17154e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED, PhyID %d PortID %d status 0x%X\n", phyId, portId,status));
17164e1bc9a0SAchim Leubner ossaHwCB(agRoot, agPortContext, OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED, phyId, agNULL, agNULL);
17174e1bc9a0SAchim Leubner break;
17184e1bc9a0SAchim Leubner }
17194e1bc9a0SAchim Leubner
17204e1bc9a0SAchim Leubner default:
17214e1bc9a0SAchim Leubner {
17224e1bc9a0SAchim Leubner SA_DBG1(("mpiHWEvent: Unknown HW Event 0x%x status 0x%X\n", Event ,status));
17234e1bc9a0SAchim Leubner break;
17244e1bc9a0SAchim Leubner }
17254e1bc9a0SAchim Leubner }
17264e1bc9a0SAchim Leubner
17274e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2j");
17284e1bc9a0SAchim Leubner return ret;
17294e1bc9a0SAchim Leubner }
17304e1bc9a0SAchim Leubner
17314e1bc9a0SAchim Leubner /******************************************************************************/
17324e1bc9a0SAchim Leubner /*! \brief SPC MPI SMP Completion
17334e1bc9a0SAchim Leubner *
17344e1bc9a0SAchim Leubner * This function handles the SMP completion.
17354e1bc9a0SAchim Leubner *
17364e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA hardware
17374e1bc9a0SAchim Leubner * \param pIomb pointer of Message1
17384e1bc9a0SAchim Leubner * \param bc buffer count
17394e1bc9a0SAchim Leubner *
17404e1bc9a0SAchim Leubner * \return The read value
17414e1bc9a0SAchim Leubner *
17424e1bc9a0SAchim Leubner */
17434e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSMPCompletion(agsaRoot_t * agRoot,agsaSMPCompletionRsp_t * pIomb)17444e1bc9a0SAchim Leubner GLOBAL bit32 mpiSMPCompletion(
17454e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
17464e1bc9a0SAchim Leubner agsaSMPCompletionRsp_t *pIomb
17474e1bc9a0SAchim Leubner )
17484e1bc9a0SAchim Leubner {
17494e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
17504e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
17514e1bc9a0SAchim Leubner bit32 status;
17524e1bc9a0SAchim Leubner bit32 tag;
17534e1bc9a0SAchim Leubner bit32 param;
17544e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
17554e1bc9a0SAchim Leubner
17564e1bc9a0SAchim Leubner SA_DBG3(("mpiSMPCompletion: start, HTAG=0x%x\n", pIomb->tag));
17574e1bc9a0SAchim Leubner
17584e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2k");
17594e1bc9a0SAchim Leubner
17604e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSMPCompletionRsp_t, tag)) ;
17614e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSMPCompletionRsp_t, status)) ;
17624e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, ¶m, pIomb, OSSA_OFFSET_OF(agsaSMPCompletionRsp_t, param)) ;
17634e1bc9a0SAchim Leubner /* get SMP request from IOMap */
17644e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
17654e1bc9a0SAchim Leubner if (agNULL == pRequest)
17664e1bc9a0SAchim Leubner {
17674e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x PARAM=0x%x\n", tag, status, param));
17684e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2k");
17694e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
17704e1bc9a0SAchim Leubner }
17714e1bc9a0SAchim Leubner
17724e1bc9a0SAchim Leubner switch (status)
17734e1bc9a0SAchim Leubner {
17744e1bc9a0SAchim Leubner case OSSA_IO_SUCCESS:
17754e1bc9a0SAchim Leubner SA_DBG3(("mpiSMPCompletion: OSSA_IO_SUCCESS HTAG = 0x%x\n", tag));
17764e1bc9a0SAchim Leubner /* process message */
17774e1bc9a0SAchim Leubner siSMPRespRcvd(agRoot, pIomb, param, tag);
17784e1bc9a0SAchim Leubner break;
17794e1bc9a0SAchim Leubner
17804e1bc9a0SAchim Leubner case OSSA_IO_OVERFLOW:
17814e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OVERFLOW HTAG = 0x%x\n", tag));
17824e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OVERFLOW++;
17834e1bc9a0SAchim Leubner /* SMP failed */
17844e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
17854e1bc9a0SAchim Leubner break;
17864e1bc9a0SAchim Leubner
17874e1bc9a0SAchim Leubner case OSSA_IO_ABORTED:
17884e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_ABORTED HTAG = 0x%x\n", tag));
17894e1bc9a0SAchim Leubner
17904e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_ABORTED++;
17914e1bc9a0SAchim Leubner #ifdef SA_PRINTOUT_IN_WINDBG
17924e1bc9a0SAchim Leubner #ifndef DBG
17934e1bc9a0SAchim Leubner DbgPrint("agOSSA_IO_ABORTED %d\n", saRoot->IoErrorCount.agOSSA_IO_ABORTED);
17944e1bc9a0SAchim Leubner #endif /* DBG */
17954e1bc9a0SAchim Leubner #endif /* SA_PRINTOUT_IN_WINDBG */
17964e1bc9a0SAchim Leubner /* SMP failed */
17974e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
17984e1bc9a0SAchim Leubner break;
17994e1bc9a0SAchim Leubner
18004e1bc9a0SAchim Leubner case OSSA_IO_NO_DEVICE:
18014e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_NO_DEVICE HTAG = 0x%x\n", tag));
18024e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_NO_DEVICE++;
18034e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18044e1bc9a0SAchim Leubner break;
18054e1bc9a0SAchim Leubner
18064e1bc9a0SAchim Leubner case OSSA_IO_ERROR_HW_TIMEOUT:
18074e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_ERROR_HW_TIMEOUT HTAG = 0x%x\n", tag));
18084e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_ERROR_HW_TIMEOUT++;
18094e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18104e1bc9a0SAchim Leubner break;
18114e1bc9a0SAchim Leubner
18124e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_BREAK:
18134e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_ERROR_BREAK HTAG = 0x%x\n", tag));
18144e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_BREAK++;
18154e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18164e1bc9a0SAchim Leubner break;
18174e1bc9a0SAchim Leubner
18184e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
18194e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_ERROR_PHY_NOT_READY HTAG = 0x%x\n", tag));
18204e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
18214e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18224e1bc9a0SAchim Leubner break;
18234e1bc9a0SAchim Leubner
18244e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
18254e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED HTAG = 0x%x\n", tag));
18264e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
18274e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18284e1bc9a0SAchim Leubner break;
18294e1bc9a0SAchim Leubner
18304e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
18314e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION HTAG = 0x%x\n", tag));
18324e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
18334e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18344e1bc9a0SAchim Leubner break;
18354e1bc9a0SAchim Leubner
18364e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_BREAK:
18374e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_BREAK HTAG = 0x%x\n", tag));
18384e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
18394e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18404e1bc9a0SAchim Leubner break;
18414e1bc9a0SAchim Leubner
18424e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
18434e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS HTAG = 0x%x\n", tag));
18444e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
18454e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18464e1bc9a0SAchim Leubner break;
18474e1bc9a0SAchim Leubner
18484e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
18494e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION HTAG = 0x%x\n", tag));
18504e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
18514e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18524e1bc9a0SAchim Leubner break;
18534e1bc9a0SAchim Leubner
18544e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
18554e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED HTAG = 0x%x\n", tag));
18564e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
18574e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18584e1bc9a0SAchim Leubner break;
18594e1bc9a0SAchim Leubner
18604e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
18614e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION HTAG = 0x%x\n", tag));
18624e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
18634e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18644e1bc9a0SAchim Leubner break;
18654e1bc9a0SAchim Leubner
18664e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_RX_FRAME:
18674e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_ERROR_RX_FRAME HTAG = 0x%x\n", tag));
18684e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_RX_FRAME++;
18694e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18704e1bc9a0SAchim Leubner break;
18714e1bc9a0SAchim Leubner
18724e1bc9a0SAchim Leubner case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
18734e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT HTAG = 0x%x\n", tag));
18744e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
18754e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18764e1bc9a0SAchim Leubner break;
18774e1bc9a0SAchim Leubner
18784e1bc9a0SAchim Leubner case OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE:
18794e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE HTAG = 0x%x\n", tag));
18804e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_ERROR_INTERNAL_SMP_RESOURCE++;
18814e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18824e1bc9a0SAchim Leubner break;
18834e1bc9a0SAchim Leubner
18844e1bc9a0SAchim Leubner case OSSA_IO_PORT_IN_RESET:
18854e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_PORT_IN_RESET HTAG = 0x%x\n", tag));
18864e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_PORT_IN_RESET++;
18874e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18884e1bc9a0SAchim Leubner break;
18894e1bc9a0SAchim Leubner
18904e1bc9a0SAchim Leubner case OSSA_IO_DS_NON_OPERATIONAL:
18914e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_DS_NON_OPERATIONAL HTAG = 0x%x\n", tag));
18924e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_DS_NON_OPERATIONAL++;
18934e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
18944e1bc9a0SAchim Leubner break;
18954e1bc9a0SAchim Leubner
18964e1bc9a0SAchim Leubner case OSSA_IO_DS_IN_RECOVERY:
18974e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_DS_IN_RECOVERY HTAG = 0x%x\n", tag));
18984e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_DS_IN_RECOVERY++;
18994e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19004e1bc9a0SAchim Leubner break;
19014e1bc9a0SAchim Leubner
19024e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY:
19034e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY HTAG = 0x%x\n", tag));
19044e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY++;
19054e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19064e1bc9a0SAchim Leubner break;
19074e1bc9a0SAchim Leubner
19084e1bc9a0SAchim Leubner case OSSA_IO_ABORT_IN_PROGRESS:
19094e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_ABORT_IN_PROGRESS HTAG = 0x%x\n", tag));
19104e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_ABORT_IN_PROGRESS++;
19114e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19124e1bc9a0SAchim Leubner break;
19134e1bc9a0SAchim Leubner
19144e1bc9a0SAchim Leubner case OSSA_IO_ABORT_DELAYED:
19154e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion:OSSA_IO_ABORT_DELAYED HTAG = 0x%x\n", tag));
19164e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_ABORT_DELAYED++;
19174e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19184e1bc9a0SAchim Leubner break;
19194e1bc9a0SAchim Leubner
19204e1bc9a0SAchim Leubner case OSSA_IO_INVALID_LENGTH:
19214e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_INVALID_LENGTH HTAG = 0x%x\n", tag));
19224e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_INVALID_LENGTH++;
19234e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19244e1bc9a0SAchim Leubner break;
19254e1bc9a0SAchim Leubner
19264e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
19274e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x\n", tag));
19284e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
19294e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19304e1bc9a0SAchim Leubner break;
19314e1bc9a0SAchim Leubner
19324e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
19334e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO HTAG = 0x%x\n", tag));
19344e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO++;
19354e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19364e1bc9a0SAchim Leubner break;
19374e1bc9a0SAchim Leubner
19384e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
19394e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST HTAG = 0x%x\n", tag));
19404e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
19414e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19424e1bc9a0SAchim Leubner break;
19434e1bc9a0SAchim Leubner
19444e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
19454e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE HTAG = 0x%x\n", tag));
19464e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
19474e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19484e1bc9a0SAchim Leubner break;
19494e1bc9a0SAchim Leubner
19504e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
19514e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED HTAG = 0x%x\n", tag));
19524e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
19534e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19544e1bc9a0SAchim Leubner break;
19554e1bc9a0SAchim Leubner
19564e1bc9a0SAchim Leubner case OSSA_IO_DS_INVALID:
19574e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_DS_INVALID HTAG = 0x%x\n", tag));
19584e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_DS_INVALID++;
19594e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19604e1bc9a0SAchim Leubner break;
19614e1bc9a0SAchim Leubner
19624e1bc9a0SAchim Leubner case OSSA_IO_XFER_READ_COMPL_ERR:
19634e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_XFER_READ_COMPL_ERR HTAG = 0x%x\n", tag));
19644e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_XFER_READ_COMPL_ERR++;
19654e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19664e1bc9a0SAchim Leubner break;
19674e1bc9a0SAchim Leubner
19684e1bc9a0SAchim Leubner case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
19694e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE HTAG = 0x%x\n", tag));
19704e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE++;
19714e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19724e1bc9a0SAchim Leubner break;
19734e1bc9a0SAchim Leubner
19744e1bc9a0SAchim Leubner case OSSA_MPI_ERR_OFFLOAD_DIF_OR_ENC_NOT_ENABLED:
19754e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE HTAG = 0x%x\n", tag));
19764e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_MPI_ERR_OFFLOAD_DIF_OR_ENC_NOT_ENABLED++;
19774e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19784e1bc9a0SAchim Leubner break;
19794e1bc9a0SAchim Leubner
19804e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED:
19814e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED HTAG = 0x%x\n", tag));
19824e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED++;
19834e1bc9a0SAchim Leubner siAbnormal(agRoot, pRequest, status, 0, 0);
19844e1bc9a0SAchim Leubner break;
19854e1bc9a0SAchim Leubner
19864e1bc9a0SAchim Leubner default:
19874e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPCompletion: Unknown Status = 0x%x Tag 0x%x\n", status, tag));
19884e1bc9a0SAchim Leubner saRoot->IoErrorCount.agOSSA_IO_UNKNOWN_ERROR++;
19894e1bc9a0SAchim Leubner /* not allowed case. Therefore, assert */
19904e1bc9a0SAchim Leubner SA_ASSERT((agFALSE), "mpiSMPCompletion: Unknown Status");
19914e1bc9a0SAchim Leubner break;
19924e1bc9a0SAchim Leubner }
19934e1bc9a0SAchim Leubner
19944e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2k");
19954e1bc9a0SAchim Leubner return ret;
19964e1bc9a0SAchim Leubner }
19974e1bc9a0SAchim Leubner
19984e1bc9a0SAchim Leubner /******************************************************************************/
19994e1bc9a0SAchim Leubner /*! \brief SPC MPI Get Device Handle Command Response
20004e1bc9a0SAchim Leubner *
20014e1bc9a0SAchim Leubner * This function handles the response of Get Device Handle Command.
20024e1bc9a0SAchim Leubner *
20034e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA hardware
20044e1bc9a0SAchim Leubner * \param pIomb pointer of Message
20054e1bc9a0SAchim Leubner * \param bc buffer count
20064e1bc9a0SAchim Leubner *
20074e1bc9a0SAchim Leubner * \return The read value
20084e1bc9a0SAchim Leubner *
20094e1bc9a0SAchim Leubner */
20104e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetDevHandleRsp(agsaRoot_t * agRoot,agsaGetDevHandleRsp_t * pIomb)20114e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetDevHandleRsp(
20124e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
20134e1bc9a0SAchim Leubner agsaGetDevHandleRsp_t *pIomb
20144e1bc9a0SAchim Leubner )
20154e1bc9a0SAchim Leubner {
20164e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
20174e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
20184e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
20194e1bc9a0SAchim Leubner agsaPortContext_t *agPortContext;
20204e1bc9a0SAchim Leubner agsaContext_t *agContext;
20214e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
20224e1bc9a0SAchim Leubner bit8 portId;
20234e1bc9a0SAchim Leubner bit32 deviceid=0, deviceIdc, i;
20244e1bc9a0SAchim Leubner bit32 DeviceIdcPortId, tag;
20254e1bc9a0SAchim Leubner
20264e1bc9a0SAchim Leubner SA_DBG3(("mpiGetDevHandleRsp: start, HTAG=0x%x\n", pIomb->tag));
20274e1bc9a0SAchim Leubner
20284e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2m");
20294e1bc9a0SAchim Leubner
20304e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &DeviceIdcPortId, pIomb, OSSA_OFFSET_OF(agsaGetDevHandleRsp_t, DeviceIdcPortId)) ;
20314e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDevHandleRsp_t, tag)) ;
20324e1bc9a0SAchim Leubner /* get request from IOMap */
20334e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
20344e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
20354e1bc9a0SAchim Leubner /* remove the request from IOMap */
20364e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
20374e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
20384e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
20394e1bc9a0SAchim Leubner if (agNULL == pRequest)
20404e1bc9a0SAchim Leubner {
20414e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevHandleRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x DeviceIdcPortId=0x%x\n", tag, DeviceIdcPortId));
20424e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2m");
20434e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
20444e1bc9a0SAchim Leubner }
20454e1bc9a0SAchim Leubner
20464e1bc9a0SAchim Leubner /* get port context */
20474e1bc9a0SAchim Leubner portId = (bit8)(DeviceIdcPortId & PORTID_MASK);
20484e1bc9a0SAchim Leubner 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));
20494e1bc9a0SAchim Leubner agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
20504e1bc9a0SAchim Leubner
20514e1bc9a0SAchim Leubner /* get Device ID count */
20524e1bc9a0SAchim Leubner deviceIdc = (bit8)((DeviceIdcPortId & DEVICE_IDC_BITS) >> SHIFT8);
20534e1bc9a0SAchim Leubner
20544e1bc9a0SAchim Leubner /* based on the deviceIDC to get all device handles */
20554e1bc9a0SAchim Leubner for (i = 0; i < deviceIdc; i++)
20564e1bc9a0SAchim Leubner {
20574e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaGetDevHandleRsp_t, deviceId[i])) ;
20584e1bc9a0SAchim Leubner /* find device handle from device index */
20594e1bc9a0SAchim Leubner pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
20604e1bc9a0SAchim Leubner if (pDevice->targetDevHandle.sdkData)
20614e1bc9a0SAchim Leubner saRoot->DeviceHandle[i] = &(pDevice->targetDevHandle);
20624e1bc9a0SAchim Leubner else
20634e1bc9a0SAchim Leubner saRoot->DeviceHandle[i] = &(pDevice->initiatorDevHandle);
20644e1bc9a0SAchim Leubner }
20654e1bc9a0SAchim Leubner
20664e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevHandleRsp:deviceid 0x%x 0x%x\n",deviceid, (deviceid & DEVICE_ID_BITS)));
20674e1bc9a0SAchim Leubner /* call back oslayer */
20684e1bc9a0SAchim Leubner ossaGetDeviceHandlesCB(agRoot, agContext, agPortContext, saRoot->DeviceHandle, deviceIdc);
20694e1bc9a0SAchim Leubner
20704e1bc9a0SAchim Leubner /* return the request to free pool */
20714e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
20724e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
20734e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
20744e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
20754e1bc9a0SAchim Leubner {
20764e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
20774e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
20784e1bc9a0SAchim Leubner }
20794e1bc9a0SAchim Leubner else
20804e1bc9a0SAchim Leubner {
20814e1bc9a0SAchim Leubner /* return the request to free pool */
20824e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
20834e1bc9a0SAchim Leubner }
20844e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
20854e1bc9a0SAchim Leubner
20864e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2m");
20874e1bc9a0SAchim Leubner
20884e1bc9a0SAchim Leubner return ret;
20894e1bc9a0SAchim Leubner }
20904e1bc9a0SAchim Leubner
20914e1bc9a0SAchim Leubner /******************************************************************************/
20924e1bc9a0SAchim Leubner /*! \brief SPC MPI Phy Control Command Response
20934e1bc9a0SAchim Leubner *
20944e1bc9a0SAchim Leubner * This function handles the response of PHY Control Command.
20954e1bc9a0SAchim Leubner *
20964e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA hardware
20974e1bc9a0SAchim Leubner * \param pIomb pointer of Message
20984e1bc9a0SAchim Leubner *
20994e1bc9a0SAchim Leubner * \return The read value
21004e1bc9a0SAchim Leubner *
21014e1bc9a0SAchim Leubner */
21024e1bc9a0SAchim Leubner /*******************************************************************************/
mpiPhyCntrlRsp(agsaRoot_t * agRoot,agsaLocalPhyCntrlRsp_t * pIomb)21034e1bc9a0SAchim Leubner GLOBAL bit32 mpiPhyCntrlRsp(
21044e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
21054e1bc9a0SAchim Leubner agsaLocalPhyCntrlRsp_t *pIomb
21064e1bc9a0SAchim Leubner )
21074e1bc9a0SAchim Leubner {
21084e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
21094e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
21104e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
21114e1bc9a0SAchim Leubner agsaContext_t *agContext = agNULL;
21124e1bc9a0SAchim Leubner bit32 phyId, operation, status, tag, phyOpId;
21134e1bc9a0SAchim Leubner
21144e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2n");
21154e1bc9a0SAchim Leubner
21164e1bc9a0SAchim Leubner SA_DBG3(("mpiPhyCntrlRsp: start, HTAG=0x%x,\n", pIomb->tag));
21174e1bc9a0SAchim Leubner
21184e1bc9a0SAchim Leubner /* get tag */
21194e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaLocalPhyCntrlRsp_t, tag)) ;
21204e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &phyOpId, pIomb, OSSA_OFFSET_OF(agsaLocalPhyCntrlRsp_t, phyOpId)) ;
21214e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaLocalPhyCntrlRsp_t, status)) ;
21224e1bc9a0SAchim Leubner /* get request from IOMap */
21234e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
21244e1bc9a0SAchim Leubner if (agNULL == pRequest)
21254e1bc9a0SAchim Leubner {
21264e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyCntrlRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x PhyOpId=0x%x\n", tag, status, phyOpId));
21274e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2n");
21284e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
21294e1bc9a0SAchim Leubner }
21304e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
21314e1bc9a0SAchim Leubner /* remove the request from IOMap */
21324e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
21334e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
21344e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
21354e1bc9a0SAchim Leubner
21364e1bc9a0SAchim Leubner phyId = phyOpId & LOCAL_PHY_PHYID;
21374e1bc9a0SAchim Leubner operation = (phyOpId & LOCAL_PHY_OP_BITS) >> SHIFT8;
21384e1bc9a0SAchim Leubner
21394e1bc9a0SAchim Leubner
21404e1bc9a0SAchim Leubner SA_DBG3(("mpiPhyCntrlRsp: phyId=0x%x Operation=0x%x Status=0x%x\n", phyId, operation, status));
21414e1bc9a0SAchim Leubner
21424e1bc9a0SAchim Leubner if( pRequest->completionCB == agNULL )
21434e1bc9a0SAchim Leubner {
21444e1bc9a0SAchim Leubner /* call back with the status */
21454e1bc9a0SAchim Leubner ossaLocalPhyControlCB(agRoot, agContext, phyId, operation, status, agNULL);
21464e1bc9a0SAchim Leubner }
21474e1bc9a0SAchim Leubner else
21484e1bc9a0SAchim Leubner {
21494e1bc9a0SAchim Leubner (*(ossaLocalPhyControlCB_t)(pRequest->completionCB))(agRoot, agContext, phyId, operation, status, agNULL );
21504e1bc9a0SAchim Leubner }
21514e1bc9a0SAchim Leubner
21524e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
21534e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
21544e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
21554e1bc9a0SAchim Leubner /* return the request to free pool */
21564e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
21574e1bc9a0SAchim Leubner {
21584e1bc9a0SAchim Leubner SA_DBG1(("mpiPhyCntrlRsp: saving pRequest (%p) for later use\n", pRequest));
21594e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
21604e1bc9a0SAchim Leubner }
21614e1bc9a0SAchim Leubner else
21624e1bc9a0SAchim Leubner {
21634e1bc9a0SAchim Leubner /* return the request to free pool */
21644e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
21654e1bc9a0SAchim Leubner }
21664e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
21674e1bc9a0SAchim Leubner
21684e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2n");
21694e1bc9a0SAchim Leubner return ret;
21704e1bc9a0SAchim Leubner }
21714e1bc9a0SAchim Leubner
21724e1bc9a0SAchim Leubner /******************************************************************************/
21734e1bc9a0SAchim Leubner /*! \brief SPC MPI Device Register Command Response
21744e1bc9a0SAchim Leubner *
21754e1bc9a0SAchim Leubner * This function handles the response of Device Register Command.
21764e1bc9a0SAchim Leubner *
21774e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA hardware
21784e1bc9a0SAchim Leubner * \param pIomb pointer of Message
21794e1bc9a0SAchim Leubner *
21804e1bc9a0SAchim Leubner * \return The read value
21814e1bc9a0SAchim Leubner *
21824e1bc9a0SAchim Leubner */
21834e1bc9a0SAchim Leubner /*******************************************************************************/
mpiDeviceRegRsp(agsaRoot_t * agRoot,agsaDeviceRegistrationRsp_t * pIomb)21844e1bc9a0SAchim Leubner GLOBAL bit32 mpiDeviceRegRsp(
21854e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
21864e1bc9a0SAchim Leubner agsaDeviceRegistrationRsp_t *pIomb
21874e1bc9a0SAchim Leubner )
21884e1bc9a0SAchim Leubner {
21894e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
21904e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = agNULL;
21914e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
21924e1bc9a0SAchim Leubner agsaContext_t *agContext;
21934e1bc9a0SAchim Leubner bit32 deviceId;
21944e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice = agNULL;
21954e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDeviceRemove = agNULL;
21964e1bc9a0SAchim Leubner bit32 deviceIdx,status, tag;
21974e1bc9a0SAchim Leubner
21984e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2p");
21994e1bc9a0SAchim Leubner
22004e1bc9a0SAchim Leubner /* sanity check */
22014e1bc9a0SAchim Leubner SA_ASSERT((agNULL != agRoot), "");
22024e1bc9a0SAchim Leubner saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
22034e1bc9a0SAchim Leubner SA_ASSERT((agNULL != saRoot), "");
22044e1bc9a0SAchim Leubner
22054e1bc9a0SAchim Leubner SA_DBG3(("mpiDeviceRegRsp: start, HTAG=0x%x\n", pIomb->tag));
22064e1bc9a0SAchim Leubner
22074e1bc9a0SAchim Leubner SA_ASSERT((NULL != saRoot->DeviceRegistrationCB), "DeviceRegistrationCB can not be NULL");
22084e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaDeviceRegistrationRsp_t, deviceId)) ;
22094e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDeviceRegistrationRsp_t, tag)) ;
22104e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDeviceRegistrationRsp_t, status)) ;
22114e1bc9a0SAchim Leubner
22124e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: deviceID 0x%x \n", deviceId));
22134e1bc9a0SAchim Leubner
22144e1bc9a0SAchim Leubner /* get request from IOMap */
22154e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
22164e1bc9a0SAchim Leubner if (agNULL == pRequest)
22174e1bc9a0SAchim Leubner {
22184e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: Bad IOMB!!! pRequest is NULL. TAG=0x%x, STATUS=0x%x DEVICEID=0x%x\n", tag, status, deviceId));
22194e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2p");
22204e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
22214e1bc9a0SAchim Leubner }
22224e1bc9a0SAchim Leubner
22234e1bc9a0SAchim Leubner pDevice = pRequest->pDevice;
22244e1bc9a0SAchim Leubner
22254e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
22264e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
22274e1bc9a0SAchim Leubner /* remove the request from IOMap */
22284e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
22294e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
22304e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
22314e1bc9a0SAchim Leubner
22324e1bc9a0SAchim Leubner /* get Device Id or status */
22334e1bc9a0SAchim Leubner SA_DBG3(("mpiDeviceRegRsp: hosttag 0x%x\n", tag));
22344e1bc9a0SAchim Leubner SA_DBG3(("mpiDeviceRegRsp: deviceID 0x%x Device Context %p\n", deviceId, pDevice));
22354e1bc9a0SAchim Leubner
22364e1bc9a0SAchim Leubner if (agNULL == pDevice)
22374e1bc9a0SAchim Leubner {
22384e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
22394e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
22404e1bc9a0SAchim Leubner /* return the request to free pool */
22414e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
22424e1bc9a0SAchim Leubner {
22434e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
22444e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
22454e1bc9a0SAchim Leubner }
22464e1bc9a0SAchim Leubner else
22474e1bc9a0SAchim Leubner {
22484e1bc9a0SAchim Leubner /* return the request to free pool */
22494e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
22504e1bc9a0SAchim Leubner }
22514e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
22524e1bc9a0SAchim Leubner
22534e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: warning!!! no device is found\n"));
22544e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2p");
22554e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
22564e1bc9a0SAchim Leubner }
22574e1bc9a0SAchim Leubner
22584e1bc9a0SAchim Leubner if (agNULL == saRoot->DeviceRegistrationCB)
22594e1bc9a0SAchim Leubner {
22604e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
22614e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
22624e1bc9a0SAchim Leubner /* return the request to free pool */
22634e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
22644e1bc9a0SAchim Leubner {
22654e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
22664e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
22674e1bc9a0SAchim Leubner }
22684e1bc9a0SAchim Leubner else
22694e1bc9a0SAchim Leubner {
22704e1bc9a0SAchim Leubner /* return the request to free pool */
22714e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
22724e1bc9a0SAchim Leubner }
22734e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
22744e1bc9a0SAchim Leubner
22754e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: warning!!! no DeviceRegistrationCB is found\n"));
22764e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2p");
22774e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
22784e1bc9a0SAchim Leubner }
22794e1bc9a0SAchim Leubner
22804e1bc9a0SAchim Leubner
22814e1bc9a0SAchim Leubner if(smIS_SPCV(agRoot))
22824e1bc9a0SAchim Leubner {
22834e1bc9a0SAchim Leubner switch( status)
22844e1bc9a0SAchim Leubner {
22854e1bc9a0SAchim Leubner case 0:
22864e1bc9a0SAchim Leubner status = OSSA_SUCCESS;
22874e1bc9a0SAchim Leubner break;
22884e1bc9a0SAchim Leubner case MPI_ERR_DEVICE_HANDLE_UNAVAILABLE:
22894e1bc9a0SAchim Leubner status = OSSA_FAILURE_OUT_OF_RESOURCE;
22904e1bc9a0SAchim Leubner break;
22914e1bc9a0SAchim Leubner case MPI_ERR_DEVICE_ALREADY_REGISTERED:
22924e1bc9a0SAchim Leubner status = OSSA_FAILURE_DEVICE_ALREADY_REGISTERED;
22934e1bc9a0SAchim Leubner break;
22944e1bc9a0SAchim Leubner case MPI_ERR_PHY_ID_INVALID:
22954e1bc9a0SAchim Leubner status = OSSA_FAILURE_INVALID_PHY_ID;
22964e1bc9a0SAchim Leubner break;
22974e1bc9a0SAchim Leubner case MPI_ERR_PHY_ID_ALREADY_REGISTERED:
22984e1bc9a0SAchim Leubner status = OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED;
22994e1bc9a0SAchim Leubner break;
23004e1bc9a0SAchim Leubner case MPI_ERR_PORT_INVALID_PORT_ID:
23014e1bc9a0SAchim Leubner status = OSSA_FAILURE_PORT_ID_OUT_OF_RANGE;
23024e1bc9a0SAchim Leubner break;
23034e1bc9a0SAchim Leubner case MPI_ERR_PORT_STATE_NOT_VALID:
23044e1bc9a0SAchim Leubner status = OSSA_FAILURE_PORT_NOT_VALID_STATE;
23054e1bc9a0SAchim Leubner break;
23064e1bc9a0SAchim Leubner case MPI_ERR_DEVICE_TYPE_NOT_VALID:
23074e1bc9a0SAchim Leubner status = OSSA_FAILURE_DEVICE_TYPE_NOT_VALID;
23084e1bc9a0SAchim Leubner break;
23094e1bc9a0SAchim Leubner default:
23104e1bc9a0SAchim Leubner SA_ASSERT((0), "DeviceRegistration Unknown status");
23114e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
23124e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
23134e1bc9a0SAchim Leubner /* return the request to free pool */
23144e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
23154e1bc9a0SAchim Leubner {
23164e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
23174e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
23184e1bc9a0SAchim Leubner }
23194e1bc9a0SAchim Leubner else
23204e1bc9a0SAchim Leubner {
23214e1bc9a0SAchim Leubner /* return the request to free pool */
23224e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
23234e1bc9a0SAchim Leubner }
23244e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
23254e1bc9a0SAchim Leubner
23264e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
23274e1bc9a0SAchim Leubner }
23284e1bc9a0SAchim Leubner }
23294e1bc9a0SAchim Leubner
23304e1bc9a0SAchim Leubner switch (status)
23314e1bc9a0SAchim Leubner {
23324e1bc9a0SAchim Leubner case OSSA_SUCCESS:
23334e1bc9a0SAchim Leubner /* mapping the device handle and device id */
23344e1bc9a0SAchim Leubner deviceIdx = deviceId & DEVICE_ID_BITS;
23354e1bc9a0SAchim Leubner OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
23364e1bc9a0SAchim Leubner saRoot->DeviceMap[deviceIdx].DeviceIdFromFW = deviceId;
23374e1bc9a0SAchim Leubner saRoot->DeviceMap[deviceIdx].DeviceHandle = (void *)pDevice;
23384e1bc9a0SAchim Leubner pDevice->DeviceMapIndex = deviceId;
23394e1bc9a0SAchim Leubner
23404e1bc9a0SAchim Leubner (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
23414e1bc9a0SAchim Leubner agContext,
23424e1bc9a0SAchim Leubner OSSA_SUCCESS,
23434e1bc9a0SAchim Leubner &pDevice->targetDevHandle,
23444e1bc9a0SAchim Leubner deviceId
23454e1bc9a0SAchim Leubner );
23464e1bc9a0SAchim Leubner
23474e1bc9a0SAchim Leubner break;
23484e1bc9a0SAchim Leubner case OSSA_FAILURE_OUT_OF_RESOURCE:
23494e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_OUT_OF_RESOURCE\n"));
23504e1bc9a0SAchim Leubner /* remove device from LL device list */
23514e1bc9a0SAchim Leubner siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
23524e1bc9a0SAchim Leubner
23534e1bc9a0SAchim Leubner /* call ossaDeviceRegistrationCB_t */
23544e1bc9a0SAchim Leubner (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
23554e1bc9a0SAchim Leubner agContext,
23564e1bc9a0SAchim Leubner OSSA_FAILURE_OUT_OF_RESOURCE,
23574e1bc9a0SAchim Leubner &pDevice->targetDevHandle,
23584e1bc9a0SAchim Leubner deviceId
23594e1bc9a0SAchim Leubner );
23604e1bc9a0SAchim Leubner
23614e1bc9a0SAchim Leubner
23624e1bc9a0SAchim Leubner break;
23634e1bc9a0SAchim Leubner case OSSA_FAILURE_DEVICE_ALREADY_REGISTERED:
23644e1bc9a0SAchim Leubner /* get original device handle and device id */
23654e1bc9a0SAchim Leubner pDeviceRemove = pDevice;
23664e1bc9a0SAchim Leubner deviceIdx = deviceId & DEVICE_ID_BITS;
23674e1bc9a0SAchim Leubner OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
23684e1bc9a0SAchim Leubner pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
23694e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_DEVICE_ALREADY_REGISTERED, existing deviceContext %p\n", pDevice));
23704e1bc9a0SAchim Leubner /* no auto registration */
23714e1bc9a0SAchim Leubner if (pDevice != agNULL)
23724e1bc9a0SAchim Leubner {
23734e1bc9a0SAchim Leubner /* remove device from LL device list */
23744e1bc9a0SAchim Leubner siPortDeviceListRemove(agRoot, pDevice->pPort, pDeviceRemove);
23754e1bc9a0SAchim Leubner
23764e1bc9a0SAchim Leubner /* call ossaDeviceRegistrationCB_t */
23774e1bc9a0SAchim Leubner (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
23784e1bc9a0SAchim Leubner agContext,
23794e1bc9a0SAchim Leubner OSSA_FAILURE_DEVICE_ALREADY_REGISTERED,
23804e1bc9a0SAchim Leubner &pDevice->targetDevHandle,
23814e1bc9a0SAchim Leubner deviceId
23824e1bc9a0SAchim Leubner );
23834e1bc9a0SAchim Leubner }
23844e1bc9a0SAchim Leubner else
23854e1bc9a0SAchim Leubner {
23864e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: pDevice is NULL. TAG=0x%x, STATUS=0x%x DEVICEID=0x%x\n", tag, status, deviceId));
23874e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2p");
23884e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
23894e1bc9a0SAchim Leubner }
23904e1bc9a0SAchim Leubner
23914e1bc9a0SAchim Leubner break;
23924e1bc9a0SAchim Leubner case OSSA_FAILURE_INVALID_PHY_ID:
23934e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_INVALID_PHY_ID\n"));
23944e1bc9a0SAchim Leubner /* remove device from LL device list */
23954e1bc9a0SAchim Leubner siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
23964e1bc9a0SAchim Leubner
23974e1bc9a0SAchim Leubner /* call ossaDeviceRegistrationCB_t */
23984e1bc9a0SAchim Leubner (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
23994e1bc9a0SAchim Leubner agContext,
24004e1bc9a0SAchim Leubner OSSA_FAILURE_INVALID_PHY_ID,
24014e1bc9a0SAchim Leubner &pDevice->targetDevHandle,
24024e1bc9a0SAchim Leubner deviceId
24034e1bc9a0SAchim Leubner );
24044e1bc9a0SAchim Leubner break;
24054e1bc9a0SAchim Leubner case OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED:
24064e1bc9a0SAchim Leubner /* get original device handle and device id */
24074e1bc9a0SAchim Leubner pDeviceRemove = pDevice;
24084e1bc9a0SAchim Leubner deviceIdx = deviceId & DEVICE_ID_BITS;
24094e1bc9a0SAchim Leubner OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
24104e1bc9a0SAchim Leubner pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
24114e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED, existing deviceContext %p\n", pDevice));
24124e1bc9a0SAchim Leubner /* no auto registration */
24134e1bc9a0SAchim Leubner if (pDevice != agNULL)
24144e1bc9a0SAchim Leubner {
24154e1bc9a0SAchim Leubner /* remove device from LL device list */
24164e1bc9a0SAchim Leubner siPortDeviceListRemove(agRoot, pDevice->pPort, pDeviceRemove);
24174e1bc9a0SAchim Leubner
24184e1bc9a0SAchim Leubner /* call ossaDeviceRegistrationCB_t */
24194e1bc9a0SAchim Leubner (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
24204e1bc9a0SAchim Leubner agContext,
24214e1bc9a0SAchim Leubner OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED,
24224e1bc9a0SAchim Leubner &pDevice->targetDevHandle,
24234e1bc9a0SAchim Leubner deviceId
24244e1bc9a0SAchim Leubner );
24254e1bc9a0SAchim Leubner }
24264e1bc9a0SAchim Leubner else
24274e1bc9a0SAchim Leubner {
24284e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: pDevice is NULL. TAG=0x%x, STATUS=0x%x DEVICEID=0x%x\n", tag, status, deviceId));
24294e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2p");
24304e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
24314e1bc9a0SAchim Leubner }
24324e1bc9a0SAchim Leubner
24334e1bc9a0SAchim Leubner break;
24344e1bc9a0SAchim Leubner case OSSA_FAILURE_PORT_ID_OUT_OF_RANGE:
24354e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_OUT_OF_RESOURCE\n"));
24364e1bc9a0SAchim Leubner /* remove device from LL device list */
24374e1bc9a0SAchim Leubner siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
24384e1bc9a0SAchim Leubner
24394e1bc9a0SAchim Leubner /* call ossaDeviceRegistrationCB_t */
24404e1bc9a0SAchim Leubner (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
24414e1bc9a0SAchim Leubner agContext,
24424e1bc9a0SAchim Leubner OSSA_FAILURE_PORT_ID_OUT_OF_RANGE,
24434e1bc9a0SAchim Leubner &pDevice->targetDevHandle,
24444e1bc9a0SAchim Leubner deviceId
24454e1bc9a0SAchim Leubner );
24464e1bc9a0SAchim Leubner break;
24474e1bc9a0SAchim Leubner case OSSA_FAILURE_PORT_NOT_VALID_STATE:
24484e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_PORT_NOT_VALID_STATE\n"));
24494e1bc9a0SAchim Leubner /* remove device from LL device list */
24504e1bc9a0SAchim Leubner siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
24514e1bc9a0SAchim Leubner
24524e1bc9a0SAchim Leubner /* call ossaDeviceRegistrationCB_t */
24534e1bc9a0SAchim Leubner (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
24544e1bc9a0SAchim Leubner agContext,
24554e1bc9a0SAchim Leubner OSSA_FAILURE_PORT_NOT_VALID_STATE,
24564e1bc9a0SAchim Leubner &pDevice->targetDevHandle,
24574e1bc9a0SAchim Leubner deviceId
24584e1bc9a0SAchim Leubner );
24594e1bc9a0SAchim Leubner break;
24604e1bc9a0SAchim Leubner case OSSA_FAILURE_DEVICE_TYPE_NOT_VALID:
24614e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: OSSA_FAILURE_DEVICE_TYPE_NOT_VALID\n"));
24624e1bc9a0SAchim Leubner /* remove device from LL device list */
24634e1bc9a0SAchim Leubner siPortDeviceRemove(agRoot, pDevice->pPort, pDevice, agFALSE);
24644e1bc9a0SAchim Leubner /* call ossaDeviceRegistrationCB_t */
24654e1bc9a0SAchim Leubner (*(ossaDeviceRegistrationCB_t)(saRoot->DeviceRegistrationCB))(agRoot,
24664e1bc9a0SAchim Leubner agContext,
24674e1bc9a0SAchim Leubner OSSA_FAILURE_DEVICE_TYPE_NOT_VALID,
24684e1bc9a0SAchim Leubner &pDevice->targetDevHandle,
24694e1bc9a0SAchim Leubner deviceId
24704e1bc9a0SAchim Leubner );
24714e1bc9a0SAchim Leubner break;
24724e1bc9a0SAchim Leubner default:
24734e1bc9a0SAchim Leubner SA_DBG3(("mpiDeviceRegRsp, unknown status in response %d\n", status));
24744e1bc9a0SAchim Leubner break;
24754e1bc9a0SAchim Leubner }
24764e1bc9a0SAchim Leubner
24774e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
24784e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
24794e1bc9a0SAchim Leubner /* return the request to free pool */
24804e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
24814e1bc9a0SAchim Leubner {
24824e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceRegRsp: saving pRequest (%p) for later use\n", pRequest));
24834e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
24844e1bc9a0SAchim Leubner }
24854e1bc9a0SAchim Leubner else
24864e1bc9a0SAchim Leubner {
24874e1bc9a0SAchim Leubner /* return the request to free pool */
24884e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
24894e1bc9a0SAchim Leubner }
24904e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
24914e1bc9a0SAchim Leubner
24924e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "2p");
24934e1bc9a0SAchim Leubner return ret;
24944e1bc9a0SAchim Leubner }
24954e1bc9a0SAchim Leubner
24964e1bc9a0SAchim Leubner /******************************************************************************/
24974e1bc9a0SAchim Leubner /*! \brief SPC MPI Deregister Device Command Response
24984e1bc9a0SAchim Leubner *
24994e1bc9a0SAchim Leubner * This function handles the response of Deregister Command.
25004e1bc9a0SAchim Leubner *
25014e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA hardware
25024e1bc9a0SAchim Leubner * \param pIomb pointer of Message
25034e1bc9a0SAchim Leubner *
25044e1bc9a0SAchim Leubner * \return The read value
25054e1bc9a0SAchim Leubner *
25064e1bc9a0SAchim Leubner */
25074e1bc9a0SAchim Leubner /*******************************************************************************/
mpiDeregDevHandleRsp(agsaRoot_t * agRoot,agsaDeregDevHandleRsp_t * pIomb)25084e1bc9a0SAchim Leubner GLOBAL bit32 mpiDeregDevHandleRsp(
25094e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
25104e1bc9a0SAchim Leubner agsaDeregDevHandleRsp_t *pIomb
25114e1bc9a0SAchim Leubner )
25124e1bc9a0SAchim Leubner {
25134e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
25144e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
25154e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
25164e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle;
25174e1bc9a0SAchim Leubner agsaContext_t *agContext;
25184e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
25194e1bc9a0SAchim Leubner bit32 deviceIdx, status, tag;
25204e1bc9a0SAchim Leubner
25214e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2r");
25224e1bc9a0SAchim Leubner SA_ASSERT((NULL != saRoot->DeviceDeregistrationCB), "DeviceDeregistrationCB can not be NULL");
25234e1bc9a0SAchim Leubner
25244e1bc9a0SAchim Leubner SA_DBG3(("mpiDeregDevHandleRsp: start, HTAG=0x%x\n", pIomb->tag));
25254e1bc9a0SAchim Leubner
25264e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDeregDevHandleRsp_t, tag)) ;
25274e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDeregDevHandleRsp_t, status)) ;
25284e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceIdx, pIomb, OSSA_OFFSET_OF(agsaDeregDevHandleRsp_t, deviceId)) ;
25294e1bc9a0SAchim Leubner /* get request from IOMap */
25304e1bc9a0SAchim Leubner
25314e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
25324e1bc9a0SAchim Leubner if (agNULL == pRequest)
25334e1bc9a0SAchim Leubner {
25344e1bc9a0SAchim Leubner SA_DBG1(("mpiDeregDevHandleRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x deviceIdx 0x%x\n", tag, status,deviceIdx));
25354e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2r");
25364e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
25374e1bc9a0SAchim Leubner }
25384e1bc9a0SAchim Leubner
25394e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
25404e1bc9a0SAchim Leubner /* remove the request from IOMap */
25414e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
25424e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
25434e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
25444e1bc9a0SAchim Leubner
25454e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
25464e1bc9a0SAchim Leubner
25474e1bc9a0SAchim Leubner pDevice = pRequest->pDevice;
25484e1bc9a0SAchim Leubner if (pDevice != agNULL)
25494e1bc9a0SAchim Leubner {
25504e1bc9a0SAchim Leubner if (pDevice->targetDevHandle.sdkData)
25514e1bc9a0SAchim Leubner {
25524e1bc9a0SAchim Leubner agDevHandle = &(pDevice->targetDevHandle);
25534e1bc9a0SAchim Leubner }
25544e1bc9a0SAchim Leubner else
25554e1bc9a0SAchim Leubner {
25564e1bc9a0SAchim Leubner agDevHandle = &(pDevice->initiatorDevHandle);
25574e1bc9a0SAchim Leubner }
25584e1bc9a0SAchim Leubner }
25594e1bc9a0SAchim Leubner else
25604e1bc9a0SAchim Leubner {
25614e1bc9a0SAchim Leubner SA_DBG1(("mpiDeregDevHandleRsp: pDevice is NULL"));
25624e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2r");
25634e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
25644e1bc9a0SAchim Leubner }
25654e1bc9a0SAchim Leubner
25664e1bc9a0SAchim Leubner if (agNULL == agDevHandle)
25674e1bc9a0SAchim Leubner {
25684e1bc9a0SAchim Leubner SA_DBG1(("mpiDeregDevHandleRsp: warning!!! no deviceHandle is found"));
25694e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2r");
25704e1bc9a0SAchim Leubner
25714e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
25724e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
25734e1bc9a0SAchim Leubner /* return the request to free pool */
25744e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
25754e1bc9a0SAchim Leubner {
25764e1bc9a0SAchim Leubner SA_DBG1(("mpiDeregDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
25774e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
25784e1bc9a0SAchim Leubner }
25794e1bc9a0SAchim Leubner else
25804e1bc9a0SAchim Leubner {
25814e1bc9a0SAchim Leubner /* return the request to free pool */
25824e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
25834e1bc9a0SAchim Leubner }
25844e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
25854e1bc9a0SAchim Leubner
25864e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
25874e1bc9a0SAchim Leubner }
25884e1bc9a0SAchim Leubner
25894e1bc9a0SAchim Leubner SA_DBG1(("mpiDeregDevHandleRsp: deviceID 0x%x Device Context %p\n", pDevice->DeviceMapIndex, pDevice));
25904e1bc9a0SAchim Leubner
25914e1bc9a0SAchim Leubner if (agNULL == saRoot->DeviceDeregistrationCB)
25924e1bc9a0SAchim Leubner {
25934e1bc9a0SAchim Leubner SA_DBG1(("mpiDeregDevHandleRsp: warning!!! no DeviceDeregistrationCB is found"));
25944e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2r");
25954e1bc9a0SAchim Leubner
25964e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
25974e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
25984e1bc9a0SAchim Leubner /* return the request to free pool */
25994e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
26004e1bc9a0SAchim Leubner {
26014e1bc9a0SAchim Leubner SA_DBG1(("mpiDeregDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
26024e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
26034e1bc9a0SAchim Leubner }
26044e1bc9a0SAchim Leubner else
26054e1bc9a0SAchim Leubner {
26064e1bc9a0SAchim Leubner /* return the request to free pool */
26074e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
26084e1bc9a0SAchim Leubner }
26094e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
26104e1bc9a0SAchim Leubner
26114e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
26124e1bc9a0SAchim Leubner }
26134e1bc9a0SAchim Leubner
26144e1bc9a0SAchim Leubner switch (status)
26154e1bc9a0SAchim Leubner {
26164e1bc9a0SAchim Leubner case OSSA_SUCCESS:
26174e1bc9a0SAchim Leubner (*(ossaDeregisterDeviceHandleCB_t)(saRoot->DeviceDeregistrationCB))(agRoot,
26184e1bc9a0SAchim Leubner agContext,
26194e1bc9a0SAchim Leubner agDevHandle,
26204e1bc9a0SAchim Leubner OSSA_SUCCESS
26214e1bc9a0SAchim Leubner );
26224e1bc9a0SAchim Leubner siRemoveDevHandle(agRoot, agDevHandle);
26234e1bc9a0SAchim Leubner break;
26244e1bc9a0SAchim Leubner case OSSA_ERR_DEVICE_HANDLE_INVALID:
26254e1bc9a0SAchim Leubner case OSSA_INVALID_HANDLE:
26264e1bc9a0SAchim Leubner (*(ossaDeregisterDeviceHandleCB_t)(saRoot->DeviceDeregistrationCB))(agRoot,
26274e1bc9a0SAchim Leubner agContext,
26284e1bc9a0SAchim Leubner agDevHandle,
26294e1bc9a0SAchim Leubner status
26304e1bc9a0SAchim Leubner );
26314e1bc9a0SAchim Leubner // already removed and no device to remove
26324e1bc9a0SAchim Leubner // siRemoveDevHandle(agRoot, agDevHandle);
26334e1bc9a0SAchim Leubner SA_DBG1(("mpiDeregDevRegRsp, OSSA_INVALID_HANDLE status in response %d\n", status));
26344e1bc9a0SAchim Leubner break;
26354e1bc9a0SAchim Leubner case OSSA_ERR_DEVICE_BUSY:
26364e1bc9a0SAchim Leubner (*(ossaDeregisterDeviceHandleCB_t)(saRoot->DeviceDeregistrationCB))(agRoot,
26374e1bc9a0SAchim Leubner agContext,
26384e1bc9a0SAchim Leubner agDevHandle,
26394e1bc9a0SAchim Leubner status
26404e1bc9a0SAchim Leubner );
26414e1bc9a0SAchim Leubner SA_DBG1(("mpiDeregDevRegRsp, OSSA_ERR_DEVICE_BUSY status in response %d\n", status));
26424e1bc9a0SAchim Leubner ret = AGSA_RC_BUSY;
26434e1bc9a0SAchim Leubner break;
26444e1bc9a0SAchim Leubner default:
26454e1bc9a0SAchim Leubner SA_DBG1(("mpiDeregDevRegRsp, unknown status in response 0x%X\n", status));
26464e1bc9a0SAchim Leubner break;
26474e1bc9a0SAchim Leubner }
26484e1bc9a0SAchim Leubner
26494e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
26504e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
26514e1bc9a0SAchim Leubner /* return the request to free pool */
26524e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
26534e1bc9a0SAchim Leubner {
26544e1bc9a0SAchim Leubner SA_DBG1(("mpiDeregDevHandleRsp: saving pRequest (%p) for later use\n", pRequest));
26554e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
26564e1bc9a0SAchim Leubner }
26574e1bc9a0SAchim Leubner else
26584e1bc9a0SAchim Leubner {
26594e1bc9a0SAchim Leubner /* return the request to free pool */
26604e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
26614e1bc9a0SAchim Leubner }
26624e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
26634e1bc9a0SAchim Leubner
26644e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2r");
26654e1bc9a0SAchim Leubner return ret;
26664e1bc9a0SAchim Leubner }
26674e1bc9a0SAchim Leubner
26684e1bc9a0SAchim Leubner
26694e1bc9a0SAchim Leubner /******************************************************************************/
26704e1bc9a0SAchim Leubner /*! \brief Get Phy Profile Response SPCv
26714e1bc9a0SAchim Leubner *
26724e1bc9a0SAchim Leubner * This routine handles the response of Get Phy Profile Command Response
26734e1bc9a0SAchim Leubner *
26744e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
26754e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Message
26764e1bc9a0SAchim Leubner *
26774e1bc9a0SAchim Leubner * \return sucess or fail
26784e1bc9a0SAchim Leubner * SPC only
26794e1bc9a0SAchim Leubner */
26804e1bc9a0SAchim Leubner /*******************************************************************************/
26814e1bc9a0SAchim Leubner
mpiGetPhyProfileRsp(agsaRoot_t * agRoot,agsaGetPhyProfileRspV_t * pIomb)26824e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetPhyProfileRsp(
26834e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
26844e1bc9a0SAchim Leubner agsaGetPhyProfileRspV_t *pIomb
26854e1bc9a0SAchim Leubner )
26864e1bc9a0SAchim Leubner {
26874e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
26884e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
26894e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
26904e1bc9a0SAchim Leubner agsaContext_t *agContext;
26914e1bc9a0SAchim Leubner bit32 status, tag;
26924e1bc9a0SAchim Leubner
26934e1bc9a0SAchim Leubner bit32 Reserved_SOP_PHYID;
26944e1bc9a0SAchim Leubner bit32 PhyId;
26954e1bc9a0SAchim Leubner bit32 SOP;
26964e1bc9a0SAchim Leubner
26974e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2J");
26984e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &status, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t, status));
26994e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t, tag));
27004e1bc9a0SAchim Leubner /* get TAG */
27014e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: HTag=0x%x\n", tag));
27024e1bc9a0SAchim Leubner
27034e1bc9a0SAchim Leubner /* get request from IOMap */
27044e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
27054e1bc9a0SAchim Leubner if (agNULL == pRequest)
27064e1bc9a0SAchim Leubner {
27074e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
27084e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2J");
27094e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
27104e1bc9a0SAchim Leubner }
27114e1bc9a0SAchim Leubner
27124e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
27134e1bc9a0SAchim Leubner
27144e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Reserved_SOP_PHYID, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,Reserved_Ppc_SOP_PHYID ));
27154e1bc9a0SAchim Leubner
27164e1bc9a0SAchim Leubner /* remove the request from IOMap */
27174e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
27184e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
27194e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
27204e1bc9a0SAchim Leubner
27214e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
27224e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: %p\n",pIomb));
27234e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: completionCB %p\n",pRequest->completionCB ));
27244e1bc9a0SAchim Leubner
27254e1bc9a0SAchim Leubner SOP = (Reserved_SOP_PHYID & 0xFF00) >> SHIFT8;
27264e1bc9a0SAchim Leubner PhyId = Reserved_SOP_PHYID & 0xFF;
27274e1bc9a0SAchim Leubner
27284e1bc9a0SAchim Leubner /* check status success or failure */
27294e1bc9a0SAchim Leubner if (status)
27304e1bc9a0SAchim Leubner {
27314e1bc9a0SAchim Leubner /* status is FAILED */
27324e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp:AGSA_RC_FAILURE 0x%08X\n", status));
27334e1bc9a0SAchim Leubner switch(SOP)
27344e1bc9a0SAchim Leubner {
27354e1bc9a0SAchim Leubner case AGSA_SAS_PHY_ERR_COUNTERS_PAGE:
27364e1bc9a0SAchim Leubner {
27374e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ERR_COUNTERS_PAGE SOP 0x%x\n", SOP));
27384e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
27394e1bc9a0SAchim Leubner break;
27404e1bc9a0SAchim Leubner }
27414e1bc9a0SAchim Leubner case AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE:
27424e1bc9a0SAchim Leubner {
27434e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE SOP 0x%x\n", SOP));
27444e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
27454e1bc9a0SAchim Leubner break;
27464e1bc9a0SAchim Leubner }
27474e1bc9a0SAchim Leubner case AGSA_SAS_PHY_BW_COUNTERS_PAGE:
27484e1bc9a0SAchim Leubner {
27494e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: GET_SAS_PHY_BW_COUNTERS SOP 0x%x\n", SOP));
27504e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
27514e1bc9a0SAchim Leubner break;
27524e1bc9a0SAchim Leubner }
27534e1bc9a0SAchim Leubner case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
27544e1bc9a0SAchim Leubner {
27554e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE SOP 0x%x\n", SOP));
27564e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
27574e1bc9a0SAchim Leubner break;
27584e1bc9a0SAchim Leubner }
27594e1bc9a0SAchim Leubner case AGSA_SAS_PHY_GENERAL_STATUS_PAGE:
27604e1bc9a0SAchim Leubner {
27614e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_GENERAL_STATUS_PAGE SOP 0x%x\n", SOP));
27624e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
27634e1bc9a0SAchim Leubner break;
27644e1bc9a0SAchim Leubner }
27654e1bc9a0SAchim Leubner case AGSA_PHY_SNW3_PAGE:
27664e1bc9a0SAchim Leubner {
27674e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_SNW3_PAGE SOP 0x%x\n", SOP));
27684e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
27694e1bc9a0SAchim Leubner break;
27704e1bc9a0SAchim Leubner }
27714e1bc9a0SAchim Leubner case AGSA_PHY_RATE_CONTROL_PAGE:
27724e1bc9a0SAchim Leubner {
27734e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_RATE_CONTROL_PAGE SOP 0x%x\n", SOP));
27744e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
27754e1bc9a0SAchim Leubner break;
27764e1bc9a0SAchim Leubner }
27774e1bc9a0SAchim Leubner case AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE:
27784e1bc9a0SAchim Leubner {
27794e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE SOP 0x%x\n", SOP));
27804e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL );
27814e1bc9a0SAchim Leubner break;
27824e1bc9a0SAchim Leubner }
27834e1bc9a0SAchim Leubner default:
27844e1bc9a0SAchim Leubner {
27854e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: undefined SOP 0x%x\n", SOP));
27864e1bc9a0SAchim Leubner break;
27874e1bc9a0SAchim Leubner }
27884e1bc9a0SAchim Leubner }
27894e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2J");
27904e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
27914e1bc9a0SAchim Leubner }
27924e1bc9a0SAchim Leubner else
27934e1bc9a0SAchim Leubner {
27944e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: SUCCESS type 0x%X\n",SOP ));
27954e1bc9a0SAchim Leubner switch(SOP)
27964e1bc9a0SAchim Leubner {
27974e1bc9a0SAchim Leubner case AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE:
27984e1bc9a0SAchim Leubner /* call back with the status */
27994e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE PhyId %d\n",PhyId));
28004e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , agNULL);
28014e1bc9a0SAchim Leubner break;
28024e1bc9a0SAchim Leubner case AGSA_SAS_PHY_ERR_COUNTERS_PAGE:
28034e1bc9a0SAchim Leubner {
28044e1bc9a0SAchim Leubner
28054e1bc9a0SAchim Leubner agsaPhyErrCountersPage_t Errors;
28064e1bc9a0SAchim Leubner
28074e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Errors.invalidDword, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
28084e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Errors.runningDisparityError, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
28094e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Errors.codeViolation, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
28104e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Errors.lossOfDwordSynch, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[3] ));
28114e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Errors.phyResetProblem, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[4] ));
28124e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Errors.inboundCRCError, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[5] ));
28134e1bc9a0SAchim Leubner
28144e1bc9a0SAchim Leubner /* call back with the status */
28154e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &Errors);
28164e1bc9a0SAchim Leubner /* status is SUCCESS */
28174e1bc9a0SAchim Leubner
28184e1bc9a0SAchim Leubner SA_DBG3(("mpiGetPhyProfileRsp: pIomb %p\n",pIomb));
28194e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: Reserved_SOP_PHYID 0x%08X\n",Reserved_SOP_PHYID));
28204e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: invalidDword 0x%08X\n",Errors.invalidDword ));
28214e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: runningDisparityError 0x%08X\n",Errors.runningDisparityError ));
28224e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: codeViolation 0x%08X\n",Errors.codeViolation ));
28234e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: lossOfDwordSynch 0x%08X\n",Errors.lossOfDwordSynch ));
28244e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: phyResetProblem 0x%08X\n",Errors.phyResetProblem ));
28254e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: inboundCRCError 0x%08X\n",Errors.inboundCRCError ));
28264e1bc9a0SAchim Leubner break;
28274e1bc9a0SAchim Leubner
28284e1bc9a0SAchim Leubner }
28294e1bc9a0SAchim Leubner case AGSA_SAS_PHY_BW_COUNTERS_PAGE:
28304e1bc9a0SAchim Leubner {
28314e1bc9a0SAchim Leubner
28324e1bc9a0SAchim Leubner agsaPhyBWCountersPage_t bw_counts;
28334e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &bw_counts.TXBWCounter, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
28344e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &bw_counts.RXBWCounter, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
28354e1bc9a0SAchim Leubner
28364e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: GET_SAS_PHY_BW_COUNTERS TX 0x%08X RX 0x%08X\n",bw_counts.TXBWCounter,bw_counts.RXBWCounter));
28374e1bc9a0SAchim Leubner /* call back with the status */
28384e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, &bw_counts);
28394e1bc9a0SAchim Leubner break;
28404e1bc9a0SAchim Leubner }
28414e1bc9a0SAchim Leubner case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
28424e1bc9a0SAchim Leubner {
28434e1bc9a0SAchim Leubner agsaPhyAnalogSettingsPage_t analog;
28444e1bc9a0SAchim Leubner
28454e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE 0x%X\n",SOP));
28464e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &analog.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
28474e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &analog.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
28484e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &analog.Dword2, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
28494e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &analog.Dword3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[3] ));
28504e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &analog.Dword4, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[4] ));
28514e1bc9a0SAchim Leubner /* call back with the status */
28524e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, &analog);
28534e1bc9a0SAchim Leubner break;
28544e1bc9a0SAchim Leubner }
28554e1bc9a0SAchim Leubner
28564e1bc9a0SAchim Leubner case AGSA_SAS_PHY_GENERAL_STATUS_PAGE:
28574e1bc9a0SAchim Leubner {
28584e1bc9a0SAchim Leubner agsaSASPhyGeneralStatusPage_t GenStatus;
28594e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &GenStatus.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
28604e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &GenStatus.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
28614e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_GENERAL_STATUS_PAGE SOP 0x%x 0x%x 0x%x\n", SOP,GenStatus.Dword0,GenStatus.Dword1));
28624e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &GenStatus );
28634e1bc9a0SAchim Leubner break;
28644e1bc9a0SAchim Leubner }
28654e1bc9a0SAchim Leubner case AGSA_PHY_SNW3_PAGE:
28664e1bc9a0SAchim Leubner {
28674e1bc9a0SAchim Leubner agsaPhySNW3Page_t Snw3;
28684e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Snw3.LSNW3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
28694e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Snw3.RSNW3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
28704e1bc9a0SAchim Leubner
28714e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_SNW3_PAGE SOP 0x%x\n", SOP));
28724e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &Snw3 );
28734e1bc9a0SAchim Leubner break;
28744e1bc9a0SAchim Leubner }
28754e1bc9a0SAchim Leubner case AGSA_PHY_RATE_CONTROL_PAGE:
28764e1bc9a0SAchim Leubner {
28774e1bc9a0SAchim Leubner agsaPhyRateControlPage_t RateControl;
28784e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &RateControl.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
28794e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &RateControl.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
28804e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &RateControl.Dword2, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
28814e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: AGSA_PHY_RATE_CONTROL_PAGE SOP 0x%x\n", SOP));
28824e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &RateControl );
28834e1bc9a0SAchim Leubner break;
28844e1bc9a0SAchim Leubner }
28854e1bc9a0SAchim Leubner case AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE:
28864e1bc9a0SAchim Leubner {
28874e1bc9a0SAchim Leubner agsaSASPhyOpenRejectRetryBackOffThresholdPage_t Backoff;
28884e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Backoff.Dword0, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[0] ));
28894e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Backoff.Dword1, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[1] ));
28904e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Backoff.Dword2, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[2] ));
28914e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Backoff.Dword3, pIomb, OSSA_OFFSET_OF(agsaGetPhyProfileRspV_t,PageSpecificArea[3] ));
28924e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE SOP 0x%x\n", SOP));
28934e1bc9a0SAchim Leubner ossaGetPhyProfileCB(agRoot, agContext, status, SOP, PhyId , &Backoff );
28944e1bc9a0SAchim Leubner break;
28954e1bc9a0SAchim Leubner }
28964e1bc9a0SAchim Leubner default:
28974e1bc9a0SAchim Leubner {
28984e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: undefined successful SOP 0x%x\n", SOP));
28994e1bc9a0SAchim Leubner break;
29004e1bc9a0SAchim Leubner }
29014e1bc9a0SAchim Leubner
29024e1bc9a0SAchim Leubner }
29034e1bc9a0SAchim Leubner }
29044e1bc9a0SAchim Leubner
29054e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
29064e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
29074e1bc9a0SAchim Leubner /* return the request to free pool */
29084e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
29094e1bc9a0SAchim Leubner {
29104e1bc9a0SAchim Leubner SA_DBG1(("mpiGetPhyProfileRsp: saving pRequest (%p) for later use\n", pRequest));
29114e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
29124e1bc9a0SAchim Leubner }
29134e1bc9a0SAchim Leubner else
29144e1bc9a0SAchim Leubner {
29154e1bc9a0SAchim Leubner /* return the request to free pool */
29164e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
29174e1bc9a0SAchim Leubner }
29184e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
29194e1bc9a0SAchim Leubner
29204e1bc9a0SAchim Leubner /* return value */
29214e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2J");
29224e1bc9a0SAchim Leubner return ret;
29234e1bc9a0SAchim Leubner }
29244e1bc9a0SAchim Leubner
29254e1bc9a0SAchim Leubner
mpiSetPhyProfileRsp(agsaRoot_t * agRoot,agsaSetPhyProfileRspV_t * pIomb)29264e1bc9a0SAchim Leubner GLOBAL bit32 mpiSetPhyProfileRsp(
29274e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
29284e1bc9a0SAchim Leubner agsaSetPhyProfileRspV_t *pIomb
29294e1bc9a0SAchim Leubner )
29304e1bc9a0SAchim Leubner {
29314e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
29324e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
29334e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
29344e1bc9a0SAchim Leubner agsaContext_t *agContext;
29354e1bc9a0SAchim Leubner bit32 status, tag;
29364e1bc9a0SAchim Leubner
29374e1bc9a0SAchim Leubner bit32 Reserved_Ppc_PHYID;
29384e1bc9a0SAchim Leubner bit32 PhyId;
29394e1bc9a0SAchim Leubner bit16 SOP;
29404e1bc9a0SAchim Leubner
29414e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2Q");
29424e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &status, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t, status));
29434e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t, tag));
29444e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &Reserved_Ppc_PHYID, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t, Reserved_Ppc_PHYID));
29454e1bc9a0SAchim Leubner /* get TAG */
29464e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: HTag=0x%x\n", tag));
29474e1bc9a0SAchim Leubner
29484e1bc9a0SAchim Leubner /* get request from IOMap */
29494e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
29504e1bc9a0SAchim Leubner if (agNULL == pRequest)
29514e1bc9a0SAchim Leubner {
29524e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
29534e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2Q");
29544e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
29554e1bc9a0SAchim Leubner }
29564e1bc9a0SAchim Leubner
29574e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
29584e1bc9a0SAchim Leubner
29594e1bc9a0SAchim Leubner /* remove the request from IOMap */
29604e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
29614e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
29624e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
29634e1bc9a0SAchim Leubner
29644e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: %p\n",pIomb));
29654e1bc9a0SAchim Leubner
29664e1bc9a0SAchim Leubner SOP = pRequest->SOP;
29674e1bc9a0SAchim Leubner PhyId = Reserved_Ppc_PHYID & 0xFF;
29684e1bc9a0SAchim Leubner
29694e1bc9a0SAchim Leubner /* check status success or failure */
29704e1bc9a0SAchim Leubner if (status)
29714e1bc9a0SAchim Leubner {
29724e1bc9a0SAchim Leubner /* status is FAILED */
29734e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp:AGSA_RC_FAILURE 0x%08X\n", status));
29744e1bc9a0SAchim Leubner switch(SOP)
29754e1bc9a0SAchim Leubner {
29764e1bc9a0SAchim Leubner case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
29774e1bc9a0SAchim Leubner {
29784e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE SOP 0x%x\n", SOP));
29794e1bc9a0SAchim Leubner ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
29804e1bc9a0SAchim Leubner break;
29814e1bc9a0SAchim Leubner }
29824e1bc9a0SAchim Leubner case AGSA_PHY_SNW3_PAGE:
29834e1bc9a0SAchim Leubner {
29844e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: AGSA_PHY_SNW3_PAGE SOP 0x%x\n", SOP));
29854e1bc9a0SAchim Leubner ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
29864e1bc9a0SAchim Leubner break;
29874e1bc9a0SAchim Leubner }
29884e1bc9a0SAchim Leubner
29894e1bc9a0SAchim Leubner case AGSA_PHY_RATE_CONTROL_PAGE:
29904e1bc9a0SAchim Leubner {
29914e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: AGSA_PHY_RATE_CONTROL_PAGE SOP 0x%x\n", SOP));
29924e1bc9a0SAchim Leubner ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
29934e1bc9a0SAchim Leubner break;
29944e1bc9a0SAchim Leubner }
29954e1bc9a0SAchim Leubner case AGSA_SAS_PHY_MISC_PAGE:
29964e1bc9a0SAchim Leubner {
29974e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: AGSA_SAS_PHY_MISC_PAGE SOP 0x%x\n", SOP));
29984e1bc9a0SAchim Leubner ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
29994e1bc9a0SAchim Leubner break;
30004e1bc9a0SAchim Leubner }
30014e1bc9a0SAchim Leubner
30024e1bc9a0SAchim Leubner default:
30034e1bc9a0SAchim Leubner {
30044e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: undefined SOP 0x%x\n", SOP));
30054e1bc9a0SAchim Leubner break;
30064e1bc9a0SAchim Leubner }
30074e1bc9a0SAchim Leubner }
30084e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2Q");
30094e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
30104e1bc9a0SAchim Leubner }
30114e1bc9a0SAchim Leubner else
30124e1bc9a0SAchim Leubner {
30134e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: SUCCESS type 0x%X\n",SOP ));
30144e1bc9a0SAchim Leubner switch(SOP)
30154e1bc9a0SAchim Leubner {
30164e1bc9a0SAchim Leubner case AGSA_PHY_SNW3_PAGE:
30174e1bc9a0SAchim Leubner case AGSA_PHY_RATE_CONTROL_PAGE:
30184e1bc9a0SAchim Leubner {
30194e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: Status 0x%x SOP 0x%x PhyId %d\n",status, SOP, PhyId));
30204e1bc9a0SAchim Leubner ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, agNULL );
30214e1bc9a0SAchim Leubner break;
30224e1bc9a0SAchim Leubner
30234e1bc9a0SAchim Leubner }
30244e1bc9a0SAchim Leubner case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
30254e1bc9a0SAchim Leubner {
30264e1bc9a0SAchim Leubner agsaPhyAnalogSettingsPage_t analog;
30274e1bc9a0SAchim Leubner
30284e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE 0x%X\n",SOP));
30294e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &analog.Dword0, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[0] ));
30304e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &analog.Dword1, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[1] ));
30314e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &analog.Dword2, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[2] ));
30324e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &analog.Dword3, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[3] ));
30334e1bc9a0SAchim Leubner OSSA_READ_LE_32(agRoot, &analog.Dword4, pIomb, OSSA_OFFSET_OF(agsaSetPhyProfileRspV_t,PageSpecificArea[4] ));
30344e1bc9a0SAchim Leubner /* call back with the status */
30354e1bc9a0SAchim Leubner ossaSetPhyProfileCB(agRoot, agContext, status, SOP, PhyId, &analog );
30364e1bc9a0SAchim Leubner break;
30374e1bc9a0SAchim Leubner }
30384e1bc9a0SAchim Leubner default:
30394e1bc9a0SAchim Leubner {
30404e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: undefined successful SOP 0x%x\n", SOP));
30414e1bc9a0SAchim Leubner break;
30424e1bc9a0SAchim Leubner }
30434e1bc9a0SAchim Leubner
30444e1bc9a0SAchim Leubner }
30454e1bc9a0SAchim Leubner }
30464e1bc9a0SAchim Leubner
30474e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
30484e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
30494e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: completionCB %p\n",pRequest->completionCB ));
30504e1bc9a0SAchim Leubner
30514e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
30524e1bc9a0SAchim Leubner /* return the request to free pool */
30534e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
30544e1bc9a0SAchim Leubner {
30554e1bc9a0SAchim Leubner SA_DBG1(("mpiSetPhyProfileRsp: saving pRequest (%p) for later use\n", pRequest));
30564e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
30574e1bc9a0SAchim Leubner }
30584e1bc9a0SAchim Leubner else
30594e1bc9a0SAchim Leubner {
30604e1bc9a0SAchim Leubner /* return the request to free pool */
30614e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
30624e1bc9a0SAchim Leubner }
30634e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
30644e1bc9a0SAchim Leubner
30654e1bc9a0SAchim Leubner /* return value */
30664e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2Q");
30674e1bc9a0SAchim Leubner return ret;
30684e1bc9a0SAchim Leubner }
30694e1bc9a0SAchim Leubner
30704e1bc9a0SAchim Leubner
30714e1bc9a0SAchim Leubner
30724e1bc9a0SAchim Leubner /******************************************************************************/
30734e1bc9a0SAchim Leubner /*! \brief Get Device Information Response
30744e1bc9a0SAchim Leubner *
30754e1bc9a0SAchim Leubner * This routine handles the response of Get Device Info Command Response
30764e1bc9a0SAchim Leubner *
30774e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
30784e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Message
30794e1bc9a0SAchim Leubner *
30804e1bc9a0SAchim Leubner * \return sucess or fail
30814e1bc9a0SAchim Leubner *
30824e1bc9a0SAchim Leubner */
30834e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetDevInfoRsp(agsaRoot_t * agRoot,agsaGetDevInfoRspV_t * pIomb)30844e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetDevInfoRsp(
30854e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
30864e1bc9a0SAchim Leubner agsaGetDevInfoRspV_t *pIomb
30874e1bc9a0SAchim Leubner )
30884e1bc9a0SAchim Leubner {
30894e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
30904e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
30914e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
30924e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle;
30934e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
30944e1bc9a0SAchim Leubner agsaContext_t *agContext;
30954e1bc9a0SAchim Leubner agsaDeviceInfo_t commonDevInfo;
30964e1bc9a0SAchim Leubner bit32 ARSrateSMPTimeOutPortID, IRMcnITNexusTimeOut, status, tag;
30974e1bc9a0SAchim Leubner bit32 deviceid;
30984e1bc9a0SAchim Leubner bit32 sasAddrHi;
30994e1bc9a0SAchim Leubner bit32 sasAddrLow;
31004e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
31014e1bc9a0SAchim Leubner bit32 option;
31024e1bc9a0SAchim Leubner #endif /* SALLSDK_DEBUG */
31034e1bc9a0SAchim Leubner
31044e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2M");
31054e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, status));
31064e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, tag));
31074e1bc9a0SAchim Leubner /* get TAG */
31084e1bc9a0SAchim Leubner SA_DBG3(("mpiGetDevInfoRsp: HTag=0x%x\n", tag));
31094e1bc9a0SAchim Leubner
31104e1bc9a0SAchim Leubner /* get request from IOMap */
31114e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
31124e1bc9a0SAchim Leubner if (agNULL == pRequest)
31134e1bc9a0SAchim Leubner {
31144e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevInfoRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
31154e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2M");
31164e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
31174e1bc9a0SAchim Leubner }
31184e1bc9a0SAchim Leubner
31194e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
31204e1bc9a0SAchim Leubner
31214e1bc9a0SAchim Leubner /* remove the request from IOMap */
31224e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
31234e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
31244e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
31254e1bc9a0SAchim Leubner
31264e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
31274e1bc9a0SAchim Leubner
31284e1bc9a0SAchim Leubner /* check status success or failure */
31294e1bc9a0SAchim Leubner if (status)
31304e1bc9a0SAchim Leubner {
31314e1bc9a0SAchim Leubner /* status is FAILED */
31324e1bc9a0SAchim Leubner ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
31334e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2M");
31344e1bc9a0SAchim Leubner
31354e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
31364e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
31374e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
31384e1bc9a0SAchim Leubner option = (bit32)pRequest->DeviceInfoCmdOption;
31394e1bc9a0SAchim Leubner #endif /* SALLSDK_DEBUG */
31404e1bc9a0SAchim Leubner /* return the request to free pool */
31414e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
31424e1bc9a0SAchim Leubner {
31434e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevInfoRsp: saving pRequest (%p) for later use\n", pRequest));
31444e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
31454e1bc9a0SAchim Leubner }
31464e1bc9a0SAchim Leubner else
31474e1bc9a0SAchim Leubner {
31484e1bc9a0SAchim Leubner /* return the request to free pool */
31494e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
31504e1bc9a0SAchim Leubner }
31514e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
31524e1bc9a0SAchim Leubner
31534e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
31544e1bc9a0SAchim Leubner }
31554e1bc9a0SAchim Leubner
31564e1bc9a0SAchim Leubner /* status is SUCCESS */
31574e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, deviceId));
31584e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &ARSrateSMPTimeOutPortID, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, ARSrateSMPTimeOutPortID));
31594e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &IRMcnITNexusTimeOut, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t, IRMcnITNexusTimeOut));
31604e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &sasAddrHi, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t,sasAddrHi[0] ));
31614e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &sasAddrLow, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRspV_t,sasAddrLow[0] ));
31624e1bc9a0SAchim Leubner
31634e1bc9a0SAchim Leubner /* find device handle from device index */
31644e1bc9a0SAchim Leubner pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
31654e1bc9a0SAchim Leubner if (pDevice != agNULL)
31664e1bc9a0SAchim Leubner {
31674e1bc9a0SAchim Leubner if (pDevice->targetDevHandle.sdkData)
31684e1bc9a0SAchim Leubner {
31694e1bc9a0SAchim Leubner agDevHandle = &(pDevice->targetDevHandle);
31704e1bc9a0SAchim Leubner }
31714e1bc9a0SAchim Leubner else
31724e1bc9a0SAchim Leubner {
31734e1bc9a0SAchim Leubner agDevHandle = &(pDevice->initiatorDevHandle);
31744e1bc9a0SAchim Leubner }
31754e1bc9a0SAchim Leubner }
31764e1bc9a0SAchim Leubner else
31774e1bc9a0SAchim Leubner {
31784e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevInfoRsp: pDevice is NULL"));
31794e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2M");
31804e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
31814e1bc9a0SAchim Leubner }
31824e1bc9a0SAchim Leubner
31834e1bc9a0SAchim Leubner if (agDevHandle == agNULL)
31844e1bc9a0SAchim Leubner {
31854e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevInfoRsp: warning!!! no deviceHandle is found"));
31864e1bc9a0SAchim Leubner ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
31874e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2M");
31884e1bc9a0SAchim Leubner
31894e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
31904e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
31914e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
31924e1bc9a0SAchim Leubner option = (bit32)pRequest->DeviceInfoCmdOption;
31934e1bc9a0SAchim Leubner #endif /* SALLSDK_DEBUG */
31944e1bc9a0SAchim Leubner /* return the request to free pool */
31954e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
31964e1bc9a0SAchim Leubner {
31974e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevInfoRsp: saving pRequest (%p) for later use\n", pRequest));
31984e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
31994e1bc9a0SAchim Leubner }
32004e1bc9a0SAchim Leubner else
32014e1bc9a0SAchim Leubner {
32024e1bc9a0SAchim Leubner /* return the request to free pool */
32034e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
32044e1bc9a0SAchim Leubner }
32054e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
32064e1bc9a0SAchim Leubner
32074e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
32084e1bc9a0SAchim Leubner }
32094e1bc9a0SAchim Leubner
32104e1bc9a0SAchim Leubner /* setup common device information */
32114e1bc9a0SAchim Leubner si_memset(&commonDevInfo, 0, sizeof(agsaDeviceInfo_t));
32124e1bc9a0SAchim Leubner commonDevInfo.smpTimeout = (bit16)((ARSrateSMPTimeOutPortID >> SHIFT8 ) & SMPTO_VBITS);
32134e1bc9a0SAchim Leubner commonDevInfo.it_NexusTimeout = (bit16)(IRMcnITNexusTimeOut & NEXUSTO_VBITS);
32144e1bc9a0SAchim Leubner commonDevInfo.firstBurstSize = (bit16)((IRMcnITNexusTimeOut >> SHIFT16) & FIRST_BURST_MCN);
32154e1bc9a0SAchim Leubner commonDevInfo.devType_S_Rate = (bit8)((ARSrateSMPTimeOutPortID >> SHIFT24) & 0x3f);
32164e1bc9a0SAchim Leubner commonDevInfo.flag = (bit32)((ARSrateSMPTimeOutPortID >> SHIFT30 ) & FLAG_VBITS);
32174e1bc9a0SAchim Leubner commonDevInfo.flag |= IRMcnITNexusTimeOut & 0xf0000;
32184e1bc9a0SAchim Leubner if (IRMcnITNexusTimeOut & 0x1000000)
32194e1bc9a0SAchim Leubner {
32204e1bc9a0SAchim Leubner commonDevInfo.flag |= 0x100000;
32214e1bc9a0SAchim Leubner }
32224e1bc9a0SAchim Leubner
32234e1bc9a0SAchim Leubner /* check SAS device then copy SAS Address */
32244e1bc9a0SAchim Leubner if ( ((ARSrateSMPTimeOutPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x00) ||
32254e1bc9a0SAchim Leubner ((ARSrateSMPTimeOutPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x01))
32264e1bc9a0SAchim Leubner {
32274e1bc9a0SAchim Leubner /* copy the sasAddressHi byte-by-byte : no endianness */
32284e1bc9a0SAchim Leubner commonDevInfo.sasAddressHi[0] = pIomb->sasAddrHi[0];
32294e1bc9a0SAchim Leubner commonDevInfo.sasAddressHi[1] = pIomb->sasAddrHi[1];
32304e1bc9a0SAchim Leubner commonDevInfo.sasAddressHi[2] = pIomb->sasAddrHi[2];
32314e1bc9a0SAchim Leubner commonDevInfo.sasAddressHi[3] = pIomb->sasAddrHi[3];
32324e1bc9a0SAchim Leubner
32334e1bc9a0SAchim Leubner /* copy the sasAddressLow byte-by-byte : no endianness */
32344e1bc9a0SAchim Leubner commonDevInfo.sasAddressLo[0] = pIomb->sasAddrLow[0];
32354e1bc9a0SAchim Leubner commonDevInfo.sasAddressLo[1] = pIomb->sasAddrLow[1];
32364e1bc9a0SAchim Leubner commonDevInfo.sasAddressLo[2] = pIomb->sasAddrLow[2];
32374e1bc9a0SAchim Leubner commonDevInfo.sasAddressLo[3] = pIomb->sasAddrLow[3];
32384e1bc9a0SAchim Leubner }
32394e1bc9a0SAchim Leubner
32404e1bc9a0SAchim Leubner /* copy common device information to SAS and SATA device common header*/
32414e1bc9a0SAchim Leubner si_memcpy(&pDevice->devInfo.sasDeviceInfo.commonDevInfo, &commonDevInfo, sizeof(agsaDeviceInfo_t));
32424e1bc9a0SAchim Leubner si_memcpy(&pDevice->devInfo.sataDeviceInfo.commonDevInfo, &commonDevInfo, sizeof(agsaDeviceInfo_t));
32434e1bc9a0SAchim Leubner
32444e1bc9a0SAchim Leubner /* setup device firstBurstSize infomation */
32454e1bc9a0SAchim Leubner pDevice->devInfo.sataDeviceInfo.commonDevInfo.firstBurstSize =
32464e1bc9a0SAchim Leubner (bit16)((IRMcnITNexusTimeOut >> SHIFT16) & FIRST_BURST);
32474e1bc9a0SAchim Leubner
32484e1bc9a0SAchim Leubner /* Display Device Information */
32494e1bc9a0SAchim Leubner SA_DBG3(("mpiGetDevInfoRsp: smpTimeout=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.smpTimeout));
32504e1bc9a0SAchim Leubner SA_DBG3(("mpiGetDevInfoRsp: it_NexusTimeout=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.it_NexusTimeout));
32514e1bc9a0SAchim Leubner SA_DBG3(("mpiGetDevInfoRsp: firstBurstSize=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.firstBurstSize));
32524e1bc9a0SAchim Leubner SA_DBG3(("mpiGetDevInfoRsp: devType_S_Rate=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate));
32534e1bc9a0SAchim Leubner
32544e1bc9a0SAchim Leubner /*
32554e1bc9a0SAchim Leubner D518 P2I[15-12]: Disk HP DG0146FAMWL , HPDE, WWID=5000c500:17459a31, 6.0G
32564e1bc9a0SAchim Leubner */
32574e1bc9a0SAchim Leubner
32584e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevInfoRsp: Device 0x%08X flag 0x%08X %s WWID= %02x%02x%02x%02x:%02x%02x%02x%02x, %s\n",
32594e1bc9a0SAchim Leubner deviceid,
32604e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag,
32614e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x20 ? "SATA DA" :
32624e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x10 ? "SSP/SMP" :
32634e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x0 ? " STP " : "Unknown",
32644e1bc9a0SAchim Leubner
32654e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3],
32664e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2],
32674e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1],
32684e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0],
32694e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3],
32704e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2],
32714e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1],
32724e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0],
32734e1bc9a0SAchim Leubner
32744e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 8 ? " 1.5G" :
32754e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 9 ? " 3.0G" :
32764e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 10 ? " 6.0G" :
32774e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 11 ? "12.0G" : "????" ));
32784e1bc9a0SAchim Leubner
32794e1bc9a0SAchim Leubner ossaGetDeviceInfoCB(agRoot, agContext, agDevHandle, OSSA_DEV_INFO_NO_EXTENDED_INFO, &commonDevInfo);
32804e1bc9a0SAchim Leubner
32814e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
32824e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
32834e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
32844e1bc9a0SAchim Leubner option = (bit32)pRequest->DeviceInfoCmdOption;
32854e1bc9a0SAchim Leubner #endif /* SALLSDK_DEBUG */
32864e1bc9a0SAchim Leubner /* return the request to free pool */
32874e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
32884e1bc9a0SAchim Leubner {
32894e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevInfoRsp: saving pRequest (%p) for later use\n", pRequest));
32904e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
32914e1bc9a0SAchim Leubner }
32924e1bc9a0SAchim Leubner else
32934e1bc9a0SAchim Leubner {
32944e1bc9a0SAchim Leubner /* return the request to free pool */
32954e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
32964e1bc9a0SAchim Leubner }
32974e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
32984e1bc9a0SAchim Leubner
32994e1bc9a0SAchim Leubner /* return value */
33004e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2M");
33014e1bc9a0SAchim Leubner return ret;
33024e1bc9a0SAchim Leubner }
33034e1bc9a0SAchim Leubner
33044e1bc9a0SAchim Leubner /******************************************************************************/
33054e1bc9a0SAchim Leubner /*! \brief Get Device Information Response
33064e1bc9a0SAchim Leubner *
33074e1bc9a0SAchim Leubner * This routine handles the response of Get Device Info Command Response
33084e1bc9a0SAchim Leubner *
33094e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
33104e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Message
33114e1bc9a0SAchim Leubner *
33124e1bc9a0SAchim Leubner * \return sucess or fail
33134e1bc9a0SAchim Leubner *
33144e1bc9a0SAchim Leubner */
33154e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetDevInfoRspSpc(agsaRoot_t * agRoot,agsaGetDevInfoRsp_t * pIomb)33164e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetDevInfoRspSpc(
33174e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
33184e1bc9a0SAchim Leubner agsaGetDevInfoRsp_t *pIomb
33194e1bc9a0SAchim Leubner )
33204e1bc9a0SAchim Leubner {
33214e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
33224e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
33234e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
33244e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle;
33254e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
33264e1bc9a0SAchim Leubner agsaContext_t *agContext;
33274e1bc9a0SAchim Leubner bit32 dTypeSrateSMPTOPortID, FirstBurstSizeITNexusTimeOut, status, tag;
33284e1bc9a0SAchim Leubner bit32 deviceid;
33294e1bc9a0SAchim Leubner bit32 sasAddrHi;
33304e1bc9a0SAchim Leubner bit32 sasAddrLow;
33314e1bc9a0SAchim Leubner bit32 Info_avail = 0;
33324e1bc9a0SAchim Leubner
33334e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2t");
33344e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, status));
33354e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, tag));
33364e1bc9a0SAchim Leubner /* get TAG */
33374e1bc9a0SAchim Leubner SA_DBG3(("mpiGetDevInfoRspSpc: HTag=0x%x\n", tag));
33384e1bc9a0SAchim Leubner
33394e1bc9a0SAchim Leubner /* get request from IOMap */
33404e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
33414e1bc9a0SAchim Leubner if (agNULL == pRequest)
33424e1bc9a0SAchim Leubner {
33434e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevInfoRspSpc: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
33444e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2t");
33454e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
33464e1bc9a0SAchim Leubner }
33474e1bc9a0SAchim Leubner
33484e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
33494e1bc9a0SAchim Leubner
33504e1bc9a0SAchim Leubner /* remove the request from IOMap */
33514e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
33524e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
33534e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
33544e1bc9a0SAchim Leubner
33554e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
33564e1bc9a0SAchim Leubner
33574e1bc9a0SAchim Leubner /* check status success or failure */
33584e1bc9a0SAchim Leubner if (status)
33594e1bc9a0SAchim Leubner {
33604e1bc9a0SAchim Leubner /* status is FAILED */
33614e1bc9a0SAchim Leubner ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
33624e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2t");
33634e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
33644e1bc9a0SAchim Leubner }
33654e1bc9a0SAchim Leubner
33664e1bc9a0SAchim Leubner /* status is SUCCESS */
33674e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, deviceId));
33684e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &dTypeSrateSMPTOPortID, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, dTypeSrateSMPTOArPortID));
33694e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &FirstBurstSizeITNexusTimeOut, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, FirstBurstSizeITNexusTimeOut));
33704e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &sasAddrHi, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, sasAddrHi[0]));
33714e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &sasAddrLow, pIomb, OSSA_OFFSET_OF(agsaGetDevInfoRsp_t, sasAddrLow[0]));
33724e1bc9a0SAchim Leubner
33734e1bc9a0SAchim Leubner
33744e1bc9a0SAchim Leubner SA_DBG2(("mpiGetDevInfoRspSpc:deviceid 0x%08X\n",deviceid));
33754e1bc9a0SAchim Leubner SA_DBG2(("mpiGetDevInfoRspSpc:dTypeSrateSMPTOPortID 0x%08X\n",dTypeSrateSMPTOPortID));
33764e1bc9a0SAchim Leubner SA_DBG2(("mpiGetDevInfoRspSpc:FirstBurstSizeITNexusTimeOut 0x%08X\n",FirstBurstSizeITNexusTimeOut));
33774e1bc9a0SAchim Leubner SA_DBG2(("mpiGetDevInfoRspSpc:sasAddrHi 0x%08X\n",sasAddrHi));
33784e1bc9a0SAchim Leubner SA_DBG2(("mpiGetDevInfoRspSpc:sasAddrLow 0x%08X\n",sasAddrLow));
33794e1bc9a0SAchim Leubner
33804e1bc9a0SAchim Leubner
33814e1bc9a0SAchim Leubner /* find device handle from device index */
33824e1bc9a0SAchim Leubner pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
33834e1bc9a0SAchim Leubner if (pDevice != agNULL)
33844e1bc9a0SAchim Leubner {
33854e1bc9a0SAchim Leubner if (pDevice->targetDevHandle.sdkData)
33864e1bc9a0SAchim Leubner {
33874e1bc9a0SAchim Leubner agDevHandle = &(pDevice->targetDevHandle);
33884e1bc9a0SAchim Leubner }
33894e1bc9a0SAchim Leubner else
33904e1bc9a0SAchim Leubner {
33914e1bc9a0SAchim Leubner agDevHandle = &(pDevice->initiatorDevHandle);
33924e1bc9a0SAchim Leubner }
33934e1bc9a0SAchim Leubner }
33944e1bc9a0SAchim Leubner else
33954e1bc9a0SAchim Leubner {
33964e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevInfoRspSpc: pDevice is NULL"));
33974e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2t");
33984e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
33994e1bc9a0SAchim Leubner }
34004e1bc9a0SAchim Leubner
34014e1bc9a0SAchim Leubner if (agDevHandle == agNULL)
34024e1bc9a0SAchim Leubner {
34034e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevInfoRspSpc: warning!!! no deviceHandle is found"));
34044e1bc9a0SAchim Leubner ossaGetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_DEV_INFO_INVALID_HANDLE, agNULL);
34054e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2t");
34064e1bc9a0SAchim Leubner
34074e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
34084e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
34094e1bc9a0SAchim Leubner /* return the request to free pool */
34104e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
34114e1bc9a0SAchim Leubner {
34124e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevInfoRspSpc: saving pRequest (%p) for later use\n", pRequest));
34134e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
34144e1bc9a0SAchim Leubner }
34154e1bc9a0SAchim Leubner else
34164e1bc9a0SAchim Leubner {
34174e1bc9a0SAchim Leubner /* return the request to free pool */
34184e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
34194e1bc9a0SAchim Leubner }
34204e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
34214e1bc9a0SAchim Leubner
34224e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
34234e1bc9a0SAchim Leubner }
34244e1bc9a0SAchim Leubner
34254e1bc9a0SAchim Leubner Info_avail = OSSA_DEV_INFO_NO_EXTENDED_INFO;
34264e1bc9a0SAchim Leubner
34274e1bc9a0SAchim Leubner /* setup device common infomation */
34284e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.smpTimeout =
34294e1bc9a0SAchim Leubner (bit16)((dTypeSrateSMPTOPortID >> SHIFT8 ) & SMPTO_BITS);
34304e1bc9a0SAchim Leubner
34314e1bc9a0SAchim Leubner pDevice->devInfo.sataDeviceInfo.commonDevInfo.smpTimeout =
34324e1bc9a0SAchim Leubner (bit16)((dTypeSrateSMPTOPortID >> SHIFT8 ) & SMPTO_BITS);
34334e1bc9a0SAchim Leubner
34344e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.it_NexusTimeout =
34354e1bc9a0SAchim Leubner (bit16)(FirstBurstSizeITNexusTimeOut & NEXUSTO_BITS);
34364e1bc9a0SAchim Leubner
34374e1bc9a0SAchim Leubner pDevice->devInfo.sataDeviceInfo.commonDevInfo.it_NexusTimeout =
34384e1bc9a0SAchim Leubner (bit16)(FirstBurstSizeITNexusTimeOut & NEXUSTO_BITS);
34394e1bc9a0SAchim Leubner
34404e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.firstBurstSize =
34414e1bc9a0SAchim Leubner (bit16)((FirstBurstSizeITNexusTimeOut >> SHIFT16) & FIRST_BURST);
34424e1bc9a0SAchim Leubner
34434e1bc9a0SAchim Leubner pDevice->devInfo.sataDeviceInfo.commonDevInfo.firstBurstSize =
34444e1bc9a0SAchim Leubner (bit16)((FirstBurstSizeITNexusTimeOut >> SHIFT16) & FIRST_BURST);
34454e1bc9a0SAchim Leubner
34464e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag = (bit32)((dTypeSrateSMPTOPortID >> SHIFT4 ) & FLAG_BITS);
34474e1bc9a0SAchim Leubner
34484e1bc9a0SAchim Leubner pDevice->devInfo.sataDeviceInfo.commonDevInfo.flag = (bit32)((dTypeSrateSMPTOPortID >> SHIFT4 ) & FLAG_BITS);
34494e1bc9a0SAchim Leubner
34504e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate =
34514e1bc9a0SAchim Leubner (bit8)((dTypeSrateSMPTOPortID >> SHIFT24) & LINK_RATE_BITS);
34524e1bc9a0SAchim Leubner
34534e1bc9a0SAchim Leubner pDevice->devInfo.sataDeviceInfo.commonDevInfo.devType_S_Rate =
34544e1bc9a0SAchim Leubner (bit8)((dTypeSrateSMPTOPortID >> SHIFT24) & LINK_RATE_BITS);
34554e1bc9a0SAchim Leubner
34564e1bc9a0SAchim Leubner /* check SAS device then copy SAS Address */
34574e1bc9a0SAchim Leubner if ( ((dTypeSrateSMPTOPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x00) ||
34584e1bc9a0SAchim Leubner ((dTypeSrateSMPTOPortID & DEV_TYPE_BITS) >> SHIFT28 == 0x01))
34594e1bc9a0SAchim Leubner {
34604e1bc9a0SAchim Leubner /* copy the sasAddressHi byte-by-byte : no endianness */
34614e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0] = pIomb->sasAddrHi[0];
34624e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1] = pIomb->sasAddrHi[1];
34634e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2] = pIomb->sasAddrHi[2];
34644e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3] = pIomb->sasAddrHi[3];
34654e1bc9a0SAchim Leubner
34664e1bc9a0SAchim Leubner /* copy the sasAddressLow byte-by-byte : no endianness */
34674e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0] = pIomb->sasAddrLow[0];
34684e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1] = pIomb->sasAddrLow[1];
34694e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2] = pIomb->sasAddrLow[2];
34704e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3] = pIomb->sasAddrLow[3];
34714e1bc9a0SAchim Leubner }
34724e1bc9a0SAchim Leubner
34734e1bc9a0SAchim Leubner /* Display Device Information */
34744e1bc9a0SAchim Leubner SA_DBG3(("mpiGetDevInfoRspSpc: smpTimeout= 0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.smpTimeout));
34754e1bc9a0SAchim Leubner SA_DBG3(("mpiGetDevInfoRspSpc: it_NexusTimeout=0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.it_NexusTimeout));
34764e1bc9a0SAchim Leubner SA_DBG3(("mpiGetDevInfoRspSpc: firstBurstSize= 0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.firstBurstSize));
34774e1bc9a0SAchim Leubner SA_DBG3(("mpiGetDevInfoRspSpc: devType_S_Rate= 0x%x\n", pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate));
34784e1bc9a0SAchim Leubner
34794e1bc9a0SAchim Leubner
34804e1bc9a0SAchim Leubner SA_DBG1(("Device SPC deviceid 0x%08X flag 0x%08X %s WWID= %02x%02x%02x%02x:%02x%02x%02x%02x, %s\n",
34814e1bc9a0SAchim Leubner deviceid,
34824e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag,
34834e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x20 ? "SATA DA" :
34844e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x10 ? "SSP/SMP" :
34854e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x0 ? " STP " : "Unknown",
34864e1bc9a0SAchim Leubner
34874e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3],
34884e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2],
34894e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1],
34904e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0],
34914e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3],
34924e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2],
34934e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1],
34944e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0],
34954e1bc9a0SAchim Leubner
34964e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 8 ? " 1.5G" :
34974e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 9 ? " 3.0G" :
34984e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 10 ? " 6.0G" :
34994e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 11 ? "12.0G" : "????" ));
35004e1bc9a0SAchim Leubner
35014e1bc9a0SAchim Leubner ossaGetDeviceInfoCB(agRoot, agContext, agDevHandle, Info_avail, &pDevice->devInfo.sasDeviceInfo.commonDevInfo);
35024e1bc9a0SAchim Leubner
35034e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
35044e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
35054e1bc9a0SAchim Leubner /* return the request to free pool */
35064e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
35074e1bc9a0SAchim Leubner {
35084e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDevInfoRspSpc: saving pRequest (%p) for later use\n", pRequest));
35094e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
35104e1bc9a0SAchim Leubner }
35114e1bc9a0SAchim Leubner else
35124e1bc9a0SAchim Leubner {
35134e1bc9a0SAchim Leubner /* return the request to free pool */
35144e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
35154e1bc9a0SAchim Leubner }
35164e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
35174e1bc9a0SAchim Leubner
35184e1bc9a0SAchim Leubner /* return value */
35194e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2t");
35204e1bc9a0SAchim Leubner return ret;
35214e1bc9a0SAchim Leubner }
35224e1bc9a0SAchim Leubner
35234e1bc9a0SAchim Leubner /******************************************************************************/
35244e1bc9a0SAchim Leubner /*! \brief Set Device Information Response
35254e1bc9a0SAchim Leubner *
35264e1bc9a0SAchim Leubner * This routine handles the response of Set Device Info Command Response
35274e1bc9a0SAchim Leubner *
35284e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
35294e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Message
35304e1bc9a0SAchim Leubner *
35314e1bc9a0SAchim Leubner * \return sucess or fail
35324e1bc9a0SAchim Leubner *
35334e1bc9a0SAchim Leubner */
35344e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSetDevInfoRsp(agsaRoot_t * agRoot,agsaSetDeviceInfoRsp_t * pIomb)35354e1bc9a0SAchim Leubner GLOBAL bit32 mpiSetDevInfoRsp(
35364e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
35374e1bc9a0SAchim Leubner agsaSetDeviceInfoRsp_t *pIomb
35384e1bc9a0SAchim Leubner )
35394e1bc9a0SAchim Leubner {
35404e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
35414e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
35424e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
35434e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle;
35444e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
35454e1bc9a0SAchim Leubner agsaContext_t *agContext;
35464e1bc9a0SAchim Leubner bit32 tag, status, deviceid, option, param;
35474e1bc9a0SAchim Leubner
35484e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2v");
35494e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, status));
35504e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, tag));
35514e1bc9a0SAchim Leubner /* get TAG */
35524e1bc9a0SAchim Leubner SA_DBG3(("mpiSetDevInfoRsp: HTag=0x%x\n", tag));
35534e1bc9a0SAchim Leubner
35544e1bc9a0SAchim Leubner /* get request from IOMap */
35554e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
35564e1bc9a0SAchim Leubner if (agNULL == pRequest)
35574e1bc9a0SAchim Leubner {
35584e1bc9a0SAchim Leubner SA_DBG1(("mpiSetDevInfoRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
35594e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2v");
35604e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
35614e1bc9a0SAchim Leubner }
35624e1bc9a0SAchim Leubner
35634e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
35644e1bc9a0SAchim Leubner
35654e1bc9a0SAchim Leubner /* remove the request from IOMap */
35664e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
35674e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
35684e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
35694e1bc9a0SAchim Leubner
35704e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
35714e1bc9a0SAchim Leubner /* check status success or failure */
35724e1bc9a0SAchim Leubner if (status)
35734e1bc9a0SAchim Leubner {
35744e1bc9a0SAchim Leubner /* status is FAILED */
35754e1bc9a0SAchim Leubner if (pRequest->completionCB == agNULL)
35764e1bc9a0SAchim Leubner {
35774e1bc9a0SAchim Leubner SA_DBG1(("mpiSetDevInfoRsp: status is FAILED pRequest->completionCB == agNULL\n" ));
35784e1bc9a0SAchim Leubner ossaSetDeviceInfoCB(agRoot, agContext, agNULL, status, 0, 0);
35794e1bc9a0SAchim Leubner }
35804e1bc9a0SAchim Leubner else
35814e1bc9a0SAchim Leubner {
35824e1bc9a0SAchim Leubner SA_DBG1(("mpiSetDevInfoRsp: status is FAILED use CB\n" ));
35834e1bc9a0SAchim Leubner (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agNULL, status, 0, 0);
35844e1bc9a0SAchim Leubner }
35854e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2v");
35864e1bc9a0SAchim Leubner
35874e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
35884e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
35894e1bc9a0SAchim Leubner /* return the request to free pool */
35904e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
35914e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
35924e1bc9a0SAchim Leubner
35934e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
35944e1bc9a0SAchim Leubner }
35954e1bc9a0SAchim Leubner
35964e1bc9a0SAchim Leubner /* status is SUCCESS */
35974e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceid, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, deviceId));
35984e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &option, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, SA_SR_SI));
35994e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, ¶m, pIomb, OSSA_OFFSET_OF(agsaSetDeviceInfoRsp_t, A_R_ITNT));
36004e1bc9a0SAchim Leubner
36014e1bc9a0SAchim Leubner /* find device handle from device index */
36024e1bc9a0SAchim Leubner pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
36034e1bc9a0SAchim Leubner if (pDevice != agNULL)
36044e1bc9a0SAchim Leubner {
36054e1bc9a0SAchim Leubner if (pDevice->targetDevHandle.sdkData)
36064e1bc9a0SAchim Leubner {
36074e1bc9a0SAchim Leubner agDevHandle = &(pDevice->targetDevHandle);
36084e1bc9a0SAchim Leubner }
36094e1bc9a0SAchim Leubner else
36104e1bc9a0SAchim Leubner {
36114e1bc9a0SAchim Leubner agDevHandle = &(pDevice->initiatorDevHandle);
36124e1bc9a0SAchim Leubner }
36134e1bc9a0SAchim Leubner }
36144e1bc9a0SAchim Leubner else
36154e1bc9a0SAchim Leubner {
36164e1bc9a0SAchim Leubner SA_DBG1(("mpiSetDevInfoRsp: pDevice is NULL"));
36174e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
36184e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
36194e1bc9a0SAchim Leubner /* return the request to free pool */
36204e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
36214e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
36224e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2v");
36234e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
36244e1bc9a0SAchim Leubner }
36254e1bc9a0SAchim Leubner
36264e1bc9a0SAchim Leubner if (agDevHandle == agNULL)
36274e1bc9a0SAchim Leubner {
36284e1bc9a0SAchim Leubner SA_DBG1(("mpiSetDevInfoRsp: warning!!! no deviceHandle is found"));
36294e1bc9a0SAchim Leubner if (pRequest->completionCB == agNULL)
36304e1bc9a0SAchim Leubner {
36314e1bc9a0SAchim Leubner ossaSetDeviceInfoCB(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0, 0);
36324e1bc9a0SAchim Leubner }
36334e1bc9a0SAchim Leubner else
36344e1bc9a0SAchim Leubner {
36354e1bc9a0SAchim Leubner (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0, 0);
36364e1bc9a0SAchim Leubner }
36374e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2v");
36384e1bc9a0SAchim Leubner
36394e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
36404e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
36414e1bc9a0SAchim Leubner /* return the request to free pool */
36424e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
36434e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
36444e1bc9a0SAchim Leubner
36454e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
36464e1bc9a0SAchim Leubner }
36474e1bc9a0SAchim Leubner
36484e1bc9a0SAchim Leubner SA_DBG2(("mpiSetDevInfoRsp:, option 0x%X param 0x%X\n", option, param));
36494e1bc9a0SAchim Leubner
36504e1bc9a0SAchim Leubner if(smIS_SPCV(agRoot))
36514e1bc9a0SAchim Leubner {
36524e1bc9a0SAchim Leubner SA_DBG2(("mpiSetDevInfoRsp:was option 0x%X param 0x%X\n", option, param));
36534e1bc9a0SAchim Leubner SA_DBG2(("mpiSetDevInfoRsp:pDevice->option 0x%X pDevice->param 0x%X\n", pDevice->option, pDevice->param));
36544e1bc9a0SAchim Leubner option |= pDevice->option;
36554e1bc9a0SAchim Leubner param |= pDevice->param;
36564e1bc9a0SAchim Leubner SA_DBG2(("mpiSetDevInfoRsp:now option 0x%X param 0x%X\n", option, param));
36574e1bc9a0SAchim Leubner if (pRequest->completionCB == agNULL)
36584e1bc9a0SAchim Leubner {
36594e1bc9a0SAchim Leubner ossaSetDeviceInfoCB(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
36604e1bc9a0SAchim Leubner }
36614e1bc9a0SAchim Leubner else
36624e1bc9a0SAchim Leubner {
36634e1bc9a0SAchim Leubner (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
36644e1bc9a0SAchim Leubner }
36654e1bc9a0SAchim Leubner }
36664e1bc9a0SAchim Leubner else
36674e1bc9a0SAchim Leubner {
36684e1bc9a0SAchim Leubner SA_DBG2(("mpiSetDevInfoRsp:, option 0x%X param 0x%X\n", option, param));
36694e1bc9a0SAchim Leubner if (pRequest->completionCB == agNULL)
36704e1bc9a0SAchim Leubner {
36714e1bc9a0SAchim Leubner ossaSetDeviceInfoCB(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
36724e1bc9a0SAchim Leubner }
36734e1bc9a0SAchim Leubner else
36744e1bc9a0SAchim Leubner {
36754e1bc9a0SAchim Leubner (*(ossaSetDeviceInfoCB_t)(pRequest->completionCB))(agRoot, agContext, agDevHandle, OSSA_SUCCESS, option, param);
36764e1bc9a0SAchim Leubner }
36774e1bc9a0SAchim Leubner }
36784e1bc9a0SAchim Leubner
36794e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
36804e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
36814e1bc9a0SAchim Leubner /* return the request to free pool */
36824e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
36834e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
36844e1bc9a0SAchim Leubner
36854e1bc9a0SAchim Leubner /* return value */
36864e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2v");
36874e1bc9a0SAchim Leubner return ret;
36884e1bc9a0SAchim Leubner }
36894e1bc9a0SAchim Leubner
36904e1bc9a0SAchim Leubner /******************************************************************************/
36914e1bc9a0SAchim Leubner /*! \brief SPC MPI SSP Event
36924e1bc9a0SAchim Leubner *
36934e1bc9a0SAchim Leubner * This function handles the SAS Event.
36944e1bc9a0SAchim Leubner *
36954e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
36964e1bc9a0SAchim Leubner * \param pIomb pointer of Message
36974e1bc9a0SAchim Leubner *
36984e1bc9a0SAchim Leubner * \return The read value
36994e1bc9a0SAchim Leubner *
37004e1bc9a0SAchim Leubner */
37014e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSSPEvent(agsaRoot_t * agRoot,agsaSSPEventRsp_t * pIomb)37024e1bc9a0SAchim Leubner GLOBAL bit32 mpiSSPEvent(
37034e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
37044e1bc9a0SAchim Leubner agsaSSPEventRsp_t *pIomb
37054e1bc9a0SAchim Leubner )
37064e1bc9a0SAchim Leubner {
37074e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
37084e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
37094e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
37104e1bc9a0SAchim Leubner agsaPortContext_t *agPortContext;
37114e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle;
37124e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
37134e1bc9a0SAchim Leubner bit32 event,deviceId;
37144e1bc9a0SAchim Leubner bit32 deviceIdx, tag, portId_tmp;
37154e1bc9a0SAchim Leubner bit32 SSPTag;
37164e1bc9a0SAchim Leubner bit16 sspTag;
37174e1bc9a0SAchim Leubner bit8 portId;
37184e1bc9a0SAchim Leubner
37194e1bc9a0SAchim Leubner agsaDifDetails_t Dif_details;
37204e1bc9a0SAchim Leubner
37214e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2u");
37224e1bc9a0SAchim Leubner
37234e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &event, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, event));
37244e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, deviceId));
37254e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &portId_tmp, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, portId));
37264e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, tag));
37274e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &SSPTag, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, SSPTag));
37284e1bc9a0SAchim Leubner
37294e1bc9a0SAchim Leubner
37304e1bc9a0SAchim Leubner sspTag = (bit16)(SSPTag & SSPTAG_BITS);
37314e1bc9a0SAchim Leubner
37324e1bc9a0SAchim Leubner /* get IORequest from IOMap */
37334e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
37344e1bc9a0SAchim Leubner
37354e1bc9a0SAchim Leubner SA_ASSERT((pRequest), "pRequest");
37364e1bc9a0SAchim Leubner
37374e1bc9a0SAchim Leubner if(agNULL == pRequest)
37384e1bc9a0SAchim Leubner {
37394e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: agNULL == pRequest event 0x%X\n", event));
37404e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2u");
37414e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
37424e1bc9a0SAchim Leubner }
37434e1bc9a0SAchim Leubner
37444e1bc9a0SAchim Leubner /* get port context */
37454e1bc9a0SAchim Leubner portId = (bit8)(portId_tmp & PORTID_MASK);
37464e1bc9a0SAchim Leubner 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));
37474e1bc9a0SAchim Leubner agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
37484e1bc9a0SAchim Leubner /* get device Id */
37494e1bc9a0SAchim Leubner deviceIdx = deviceId & DEVICE_ID_BITS;
37504e1bc9a0SAchim Leubner OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
37514e1bc9a0SAchim Leubner /* find device handle from device index */
37524e1bc9a0SAchim Leubner pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
37534e1bc9a0SAchim Leubner
37544e1bc9a0SAchim Leubner if( agNULL == pDevice )
37554e1bc9a0SAchim Leubner {
37564e1bc9a0SAchim Leubner OS_ASSERT(pDevice, "pDevice");
37574e1bc9a0SAchim Leubner agDevHandle = agNULL;
37584e1bc9a0SAchim Leubner }
37594e1bc9a0SAchim Leubner else
37604e1bc9a0SAchim Leubner {
37614e1bc9a0SAchim Leubner if (pDevice->targetDevHandle.sdkData)
37624e1bc9a0SAchim Leubner {
37634e1bc9a0SAchim Leubner agDevHandle = &(pDevice->targetDevHandle);
37644e1bc9a0SAchim Leubner }
37654e1bc9a0SAchim Leubner else
37664e1bc9a0SAchim Leubner {
37674e1bc9a0SAchim Leubner agDevHandle = &(pDevice->initiatorDevHandle);
37684e1bc9a0SAchim Leubner }
37694e1bc9a0SAchim Leubner }
37704e1bc9a0SAchim Leubner
37714e1bc9a0SAchim Leubner switch (event)
37724e1bc9a0SAchim Leubner {
37734e1bc9a0SAchim Leubner case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
37744e1bc9a0SAchim Leubner case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
37754e1bc9a0SAchim Leubner case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
37764e1bc9a0SAchim Leubner case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
37774e1bc9a0SAchim Leubner {
37784e1bc9a0SAchim Leubner
37794e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: DIF Event 0x%x HTAG = 0x%x\n", event, tag));
37804e1bc9a0SAchim Leubner
37814e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Dif_details.UpperLBA, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, EVT_PARAM0_or_LBAH));
37824e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Dif_details.LowerLBA, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, EVT_PARAM1_or_LBAL));
37834e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Dif_details.sasAddressHi, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, SAS_ADDRH));
37844e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Dif_details.sasAddressLo, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, SAS_ADDRL));
37854e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Dif_details.ExpectedCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT1_E_UDT0_E_CRC_E));
37864e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Dif_details.ExpectedUDT2345, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT5_E_UDT4_E_UDT3_E_UDT2_E));
37874e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Dif_details.ActualCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT1_A_UDT0_A_CRC_A));
37884e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Dif_details.ActualUDT2345, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, UDT5_A_UDT4_A_UDT3_A_UDT2_A));
37894e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Dif_details.DIFErrDevID, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, HW_DEVID_Reserved_DIF_ERR));
37904e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Dif_details.ErrBoffsetEDataLen, pIomb, OSSA_OFFSET_OF(agsaSSPEventRsp_t, EDATA_LEN_ERR_BOFF));
37914e1bc9a0SAchim Leubner
37924e1bc9a0SAchim Leubner SA_DBG2(("mpiSSPEvent: UpperLBA. 0x%08X LowerLBA. 0x%08X\n",Dif_details.UpperLBA, Dif_details.LowerLBA));
37934e1bc9a0SAchim Leubner SA_DBG2(("mpiSSPEvent: sasAddressHi. 0x%02X%02X%02X%02X sasAddressLo. 0x%02X%02X%02X%02X\n",
37944e1bc9a0SAchim Leubner Dif_details.sasAddressHi[0],Dif_details.sasAddressHi[1],Dif_details.sasAddressHi[2],Dif_details.sasAddressHi[3],
37954e1bc9a0SAchim Leubner Dif_details.sasAddressLo[0],Dif_details.sasAddressLo[1],Dif_details.sasAddressLo[2],Dif_details.sasAddressLo[3]));
37964e1bc9a0SAchim Leubner SA_DBG2(("mpiSSPEvent: ExpectedCRCUDT01. 0x%08X ExpectedUDT2345. 0x%08X\n",Dif_details.ExpectedCRCUDT01, Dif_details.ExpectedUDT2345));
37974e1bc9a0SAchim Leubner SA_DBG2(("mpiSSPEvent: ActualCRCUDT01. 0x%08X ActualUDT2345. 0x%08X\n",Dif_details.ActualCRCUDT01, Dif_details.ActualUDT2345));
37984e1bc9a0SAchim Leubner SA_DBG2(("mpiSSPEvent: DIFErrDevID. 0x%08X ErrBoffsetEDataLen. 0x%08X\n",Dif_details.DIFErrDevID, Dif_details.ErrBoffsetEDataLen));
37994e1bc9a0SAchim Leubner }
38004e1bc9a0SAchim Leubner
38014e1bc9a0SAchim Leubner default:
38024e1bc9a0SAchim Leubner {
38034e1bc9a0SAchim Leubner SA_DBG3(("mpiSSPEvent: Non DIF event"));
38044e1bc9a0SAchim Leubner break;
38054e1bc9a0SAchim Leubner }
38064e1bc9a0SAchim Leubner }
38074e1bc9a0SAchim Leubner
38084e1bc9a0SAchim Leubner
38094e1bc9a0SAchim Leubner /* get event */
38104e1bc9a0SAchim Leubner switch (event)
38114e1bc9a0SAchim Leubner {
38124e1bc9a0SAchim Leubner case OSSA_IO_OVERFLOW:
38134e1bc9a0SAchim Leubner {
38144e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_OVERFLOW tag 0x%x ssptag 0x%x\n", tag, sspTag));
38154e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OVERFLOW++;
38164e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
38174e1bc9a0SAchim Leubner break;
38184e1bc9a0SAchim Leubner }
38194e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_BREAK:
38204e1bc9a0SAchim Leubner {
38214e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_BREAK tag 0x%x ssptag 0x%x\n", tag, sspTag));
38224e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_BREAK++;
38234e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
38244e1bc9a0SAchim Leubner break;
38254e1bc9a0SAchim Leubner }
38264e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
38274e1bc9a0SAchim Leubner {
38284e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_PHY_NOT_READY tag 0x%x ssptag 0x%x\n", tag, sspTag));
38294e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
38304e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
38314e1bc9a0SAchim Leubner break;
38324e1bc9a0SAchim Leubner }
38334e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
38344e1bc9a0SAchim Leubner {
38354e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED tag 0x%x ssptag 0x%x\n", tag, sspTag));
38364e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
38374e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
38384e1bc9a0SAchim Leubner break;
38394e1bc9a0SAchim Leubner }
38404e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
38414e1bc9a0SAchim Leubner {
38424e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION tag 0x%x ssptag 0x%x\n", tag, sspTag));
38434e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
38444e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
38454e1bc9a0SAchim Leubner break;
38464e1bc9a0SAchim Leubner }
38474e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_BREAK:
38484e1bc9a0SAchim Leubner {
38494e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_BREAK tag 0x%x ssptag 0x%x\n", tag, sspTag));
38504e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
38514e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
38524e1bc9a0SAchim Leubner break;
38534e1bc9a0SAchim Leubner }
38544e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
38554e1bc9a0SAchim Leubner {
38564e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS tag 0x%x ssptag 0x%x\n", tag, sspTag));
38574e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
38584e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
38594e1bc9a0SAchim Leubner break;
38604e1bc9a0SAchim Leubner }
38614e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
38624e1bc9a0SAchim Leubner {
38634e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION tag 0x%x ssptag 0x%x\n", tag, sspTag));
38644e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
38654e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
38664e1bc9a0SAchim Leubner break;
38674e1bc9a0SAchim Leubner }
38684e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
38694e1bc9a0SAchim Leubner {
38704e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED tag 0x%x ssptag 0x%x\n", tag, sspTag));
38714e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
38724e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
38734e1bc9a0SAchim Leubner break;
38744e1bc9a0SAchim Leubner }
38754e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
38764e1bc9a0SAchim Leubner {
38774e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION tag 0x%x ssptag 0x%x\n", tag, sspTag));
38784e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
38794e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
38804e1bc9a0SAchim Leubner break;
38814e1bc9a0SAchim Leubner }
38824e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
38834e1bc9a0SAchim Leubner {
38844e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_NAK_RECEIVED tag 0x%x ssptag 0x%x\n", tag, sspTag));
38854e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_NAK_RECEIVED++;
38864e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
38874e1bc9a0SAchim Leubner break;
38884e1bc9a0SAchim Leubner }
38894e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT:
38904e1bc9a0SAchim Leubner {
38914e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT tag 0x%x ssptag 0x%x\n", tag, sspTag));
38924e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT++;
38934e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
38944e1bc9a0SAchim Leubner break;
38954e1bc9a0SAchim Leubner }
38964e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH:
38974e1bc9a0SAchim Leubner {
38984e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
38994e1bc9a0SAchim Leubner #ifdef SA_ENABLE_PCI_TRIGGER
39004e1bc9a0SAchim Leubner if( saRoot->swConfig.PCI_trigger & PCI_TRIGGER_OFFSET_MISMATCH )
39014e1bc9a0SAchim Leubner {
39024e1bc9a0SAchim Leubner siPCITriger(agRoot);
39034e1bc9a0SAchim Leubner }
39044e1bc9a0SAchim Leubner #endif /* SA_ENABLE_PCI_TRIGGER */
39054e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_OFFSET_MISMATCH++;
39064e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39074e1bc9a0SAchim Leubner break;
39084e1bc9a0SAchim Leubner }
39094e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN:
39104e1bc9a0SAchim Leubner {
39114e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN tag 0x%x ssptag 0x%x\n", tag, sspTag));
39124e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN++;
39134e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39144e1bc9a0SAchim Leubner break;
39154e1bc9a0SAchim Leubner }
39164e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT:
39174e1bc9a0SAchim Leubner {
39184e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT tag 0x%x ssptag 0x%x\n", tag, sspTag));
39194e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT++;
39204e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39214e1bc9a0SAchim Leubner break;
39224e1bc9a0SAchim Leubner }
39234e1bc9a0SAchim Leubner case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
39244e1bc9a0SAchim Leubner {
39254e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT tag 0x%x ssptag 0x%x\n", tag, sspTag));
39264e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
39274e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39284e1bc9a0SAchim Leubner break;
39294e1bc9a0SAchim Leubner }
39304e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN:
39314e1bc9a0SAchim Leubner {
39324e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN tag 0x%x ssptag 0x%x\n", tag, sspTag));
39334e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN++;
39344e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39354e1bc9a0SAchim Leubner break;
39364e1bc9a0SAchim Leubner }
39374e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED:
39384e1bc9a0SAchim Leubner {
39394e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED tag 0x%x ssptag 0x%x\n", tag, sspTag));
39404e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED++;
39414e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39424e1bc9a0SAchim Leubner break;
39434e1bc9a0SAchim Leubner }
39444e1bc9a0SAchim Leubner case OSSA_IO_XFER_CMD_FRAME_ISSUED:
39454e1bc9a0SAchim Leubner {
39464e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED tag 0x%x ssptag 0x%x\n", tag, sspTag));
39474e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_CMD_FRAME_ISSUED++;
39484e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39494e1bc9a0SAchim Leubner break;
39504e1bc9a0SAchim Leubner }
39514e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE:
39524e1bc9a0SAchim Leubner {
39534e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE tag 0x%x ssptag 0x%x\n", tag, sspTag));
39544e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_UNEXPECTED_PHASE++;
39554e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39564e1bc9a0SAchim Leubner break;
39574e1bc9a0SAchim Leubner }
39584e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
39594e1bc9a0SAchim Leubner {
39604e1bc9a0SAchim Leubner 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));
39614e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
39624e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39634e1bc9a0SAchim Leubner break;
39644e1bc9a0SAchim Leubner }
39654e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
39664e1bc9a0SAchim Leubner {
39674e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO tag 0x%x ssptag 0x%x\n", tag, sspTag));
39684e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO++;
39694e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39704e1bc9a0SAchim Leubner break;
39714e1bc9a0SAchim Leubner }
39724e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
39734e1bc9a0SAchim Leubner {
39744e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST tag 0x%x ssptag 0x%x\n", tag, sspTag));
39754e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
39764e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39774e1bc9a0SAchim Leubner break;
39784e1bc9a0SAchim Leubner }
39794e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
39804e1bc9a0SAchim Leubner {
39814e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE tag 0x%x ssptag 0x%x\n", tag, sspTag));
39824e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE++;
39834e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39844e1bc9a0SAchim Leubner break;
39854e1bc9a0SAchim Leubner }
39864e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
39874e1bc9a0SAchim Leubner {
39884e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED tag 0x%x ssptag 0x%x\n", tag, sspTag));
39894e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
39904e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39914e1bc9a0SAchim Leubner break;
39924e1bc9a0SAchim Leubner }
39934e1bc9a0SAchim Leubner case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
39944e1bc9a0SAchim Leubner {
39954e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS tag 0x%x ssptag 0x%x\n", tag, sspTag));
39964e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS++;
39974e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
39984e1bc9a0SAchim Leubner break;
39994e1bc9a0SAchim Leubner }
40004e1bc9a0SAchim Leubner case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
40014e1bc9a0SAchim Leubner {
40024e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
40034e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH++;
40044e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
40054e1bc9a0SAchim Leubner break;
40064e1bc9a0SAchim Leubner }
40074e1bc9a0SAchim Leubner case OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR:
40084e1bc9a0SAchim Leubner {
40094e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR HTAG = 0x%x\n", tag));
40104e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR++;
40114e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
40124e1bc9a0SAchim Leubner break;
40134e1bc9a0SAchim Leubner }
40144e1bc9a0SAchim Leubner case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
40154e1bc9a0SAchim Leubner {
40164e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
40174e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH++;
40184e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
40194e1bc9a0SAchim Leubner break;
40204e1bc9a0SAchim Leubner }
40214e1bc9a0SAchim Leubner case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
40224e1bc9a0SAchim Leubner {
40234e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
40244e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH++;
40254e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
40264e1bc9a0SAchim Leubner break;
40274e1bc9a0SAchim Leubner }
40284e1bc9a0SAchim Leubner case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
40294e1bc9a0SAchim Leubner {
40304e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
40314e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH++;
40324e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
40334e1bc9a0SAchim Leubner break;
40344e1bc9a0SAchim Leubner }
40354e1bc9a0SAchim Leubner case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
40364e1bc9a0SAchim Leubner {
40374e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFR_ERROR_DIF_MISMATCH tag 0x%x ssptag 0x%x\n", tag, sspTag));
40384e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_MISMATCH++;
40394e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag,sizeof(agsaDifDetails_t),&Dif_details);
40404e1bc9a0SAchim Leubner break;
40414e1bc9a0SAchim Leubner }
40424e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
40434e1bc9a0SAchim Leubner {
40444e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN tag 0x%x ssptag 0x%x\n", tag, sspTag));
40454e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERR_EOB_DATA_OVERRUN++;
40464e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0, agNULL);
40474e1bc9a0SAchim Leubner break;
40484e1bc9a0SAchim Leubner }
40494e1bc9a0SAchim Leubner case OSSA_IO_XFER_READ_COMPL_ERR:
40504e1bc9a0SAchim Leubner {
40514e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: OSSA_IO_XFER_READ_COMPL_ERR tag 0x%x ssptag 0x%x\n", tag, sspTag));
40524e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_READ_COMPL_ERR++;
40534e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0, agNULL);
40544e1bc9a0SAchim Leubner break;
40554e1bc9a0SAchim Leubner }
40564e1bc9a0SAchim Leubner default:
40574e1bc9a0SAchim Leubner {
40584e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPEvent: Unknown Event 0x%x tag 0x%x ssptag 0x%x\n", event, tag, sspTag));
40594e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_UNKNOWN_ERROR++;
40604e1bc9a0SAchim Leubner ossaSSPEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, sspTag, 0,agNULL);
40614e1bc9a0SAchim Leubner break;
40624e1bc9a0SAchim Leubner }
40634e1bc9a0SAchim Leubner }
40644e1bc9a0SAchim Leubner
40654e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2u");
40664e1bc9a0SAchim Leubner /* return value */
40674e1bc9a0SAchim Leubner return ret;
40684e1bc9a0SAchim Leubner }
40694e1bc9a0SAchim Leubner
40704e1bc9a0SAchim Leubner /******************************************************************************/
40714e1bc9a0SAchim Leubner /*! \brief SPC MPI SATA Event
40724e1bc9a0SAchim Leubner *
40734e1bc9a0SAchim Leubner * This function handles the SATA Event.
40744e1bc9a0SAchim Leubner *
40754e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
40764e1bc9a0SAchim Leubner * \param pIomb pointer of Message
40774e1bc9a0SAchim Leubner *
40784e1bc9a0SAchim Leubner * \return The read value
40794e1bc9a0SAchim Leubner *
40804e1bc9a0SAchim Leubner */
40814e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSATAEvent(agsaRoot_t * agRoot,agsaSATAEventRsp_t * pIomb)40824e1bc9a0SAchim Leubner GLOBAL bit32 mpiSATAEvent(
40834e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
40844e1bc9a0SAchim Leubner agsaSATAEventRsp_t *pIomb
40854e1bc9a0SAchim Leubner )
40864e1bc9a0SAchim Leubner {
40874e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
40884e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
40894e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest = agNULL;
40904e1bc9a0SAchim Leubner agsaPortContext_t *agPortContext;
40914e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle;
40924e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
40934e1bc9a0SAchim Leubner bit32 deviceIdx, portId_tmp, event, tag, deviceId;
40944e1bc9a0SAchim Leubner bit8 portId;
40954e1bc9a0SAchim Leubner
40964e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2w");
40974e1bc9a0SAchim Leubner
40984e1bc9a0SAchim Leubner /* get port context */
40994e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &portId_tmp, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, portId));
41004e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, deviceId));
41014e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &event, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, event));
41024e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSATAEventRsp_t, tag));
41034e1bc9a0SAchim Leubner
41044e1bc9a0SAchim Leubner if (OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE != event)
41054e1bc9a0SAchim Leubner {
41064e1bc9a0SAchim Leubner /* get IORequest from IOMap */
41074e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
41084e1bc9a0SAchim Leubner }
41094e1bc9a0SAchim Leubner /* get port context - only for OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE */
41104e1bc9a0SAchim Leubner portId = (bit8)(portId_tmp & PORTID_MASK);
41114e1bc9a0SAchim Leubner 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));
41124e1bc9a0SAchim Leubner agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
41134e1bc9a0SAchim Leubner /* get device Id - only for OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE*/
41144e1bc9a0SAchim Leubner deviceIdx = deviceId & DEVICE_ID_BITS;
41154e1bc9a0SAchim Leubner OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
41164e1bc9a0SAchim Leubner /* find device handle from device index */
41174e1bc9a0SAchim Leubner pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceIdx].DeviceHandle;
41184e1bc9a0SAchim Leubner agDevHandle = &(pDevice->targetDevHandle);
41194e1bc9a0SAchim Leubner
41204e1bc9a0SAchim Leubner /* get event */
41214e1bc9a0SAchim Leubner switch (event)
41224e1bc9a0SAchim Leubner {
41234e1bc9a0SAchim Leubner case OSSA_IO_OVERFLOW:
41244e1bc9a0SAchim Leubner {
41254e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_OVERFLOW HTAG = 0x%x\n", tag));
41264e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OVERFLOW++;
41274e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
41284e1bc9a0SAchim Leubner break;
41294e1bc9a0SAchim Leubner }
41304e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_BREAK:
41314e1bc9a0SAchim Leubner {
41324e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_BREAK HTAG = 0x%x\n", tag));
41334e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_BREAK++;
41344e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
41354e1bc9a0SAchim Leubner break;
41364e1bc9a0SAchim Leubner }
41374e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
41384e1bc9a0SAchim Leubner {
41394e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_PHY_NOT_READY HTAG = 0x%x\n", tag));
41404e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
41414e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
41424e1bc9a0SAchim Leubner break;
41434e1bc9a0SAchim Leubner }
41444e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
41454e1bc9a0SAchim Leubner {
41464e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED HTAG = 0x%x\n", tag));
41474e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
41484e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
41494e1bc9a0SAchim Leubner break;
41504e1bc9a0SAchim Leubner }
41514e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
41524e1bc9a0SAchim Leubner {
41534e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION HTAG = 0x%x\n", tag));
41544e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
41554e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
41564e1bc9a0SAchim Leubner break;
41574e1bc9a0SAchim Leubner }
41584e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_BREAK:
41594e1bc9a0SAchim Leubner {
41604e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_BREAK HTAG = 0x%x\n", tag));
41614e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
41624e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
41634e1bc9a0SAchim Leubner break;
41644e1bc9a0SAchim Leubner }
41654e1bc9a0SAchim Leubner
41664e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
41674e1bc9a0SAchim Leubner {
41684e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST HTAG = 0x%x\n", tag));
41694e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
41704e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
41714e1bc9a0SAchim Leubner break;
41724e1bc9a0SAchim Leubner }
41734e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
41744e1bc9a0SAchim Leubner {
41754e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: HTAG = 0x%x\n", tag));
41764e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE++;
41774e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
41784e1bc9a0SAchim Leubner break;
41794e1bc9a0SAchim Leubner }
41804e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
41814e1bc9a0SAchim Leubner {
41824e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent:OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED HTAG = 0x%x\n", tag));
41834e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
41844e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
41854e1bc9a0SAchim Leubner break;
41864e1bc9a0SAchim Leubner }
41874e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
41884e1bc9a0SAchim Leubner {
41894e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS HTAG = 0x%x\n", tag));
41904e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
41914e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
41924e1bc9a0SAchim Leubner break;
41934e1bc9a0SAchim Leubner }
41944e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
41954e1bc9a0SAchim Leubner {
41964e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION HTAG = 0x%x\n", tag));
41974e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
41984e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
41994e1bc9a0SAchim Leubner break;
42004e1bc9a0SAchim Leubner }
42014e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
42024e1bc9a0SAchim Leubner {
42034e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED HTAG = 0x%x\n", tag));
42044e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
42054e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
42064e1bc9a0SAchim Leubner break;
42074e1bc9a0SAchim Leubner }
42084e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
42094e1bc9a0SAchim Leubner {
42104e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION HTAG = 0x%x\n", tag));
42114e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
42124e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
42134e1bc9a0SAchim Leubner break;
42144e1bc9a0SAchim Leubner }
42154e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
42164e1bc9a0SAchim Leubner {
42174e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_NAK_RECEIVED HTAG = 0x%x\n", tag));
42184e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_NAK_RECEIVED++;
42194e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
42204e1bc9a0SAchim Leubner break;
42214e1bc9a0SAchim Leubner }
42224e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE:
42234e1bc9a0SAchim Leubner {
42244e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE HTAG = 0x%x\n", tag));
42254e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE++;
42264e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, agNULL, agPortContext, agDevHandle, event, 0, agNULL);
42274e1bc9a0SAchim Leubner break;
42284e1bc9a0SAchim Leubner }
42294e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH:
42304e1bc9a0SAchim Leubner {
42314e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH HTAG = 0x%x\n", tag));
42324e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_OFFSET_MISMATCH++;
42334e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
42344e1bc9a0SAchim Leubner break;
42354e1bc9a0SAchim Leubner }
42364e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN:
42374e1bc9a0SAchim Leubner {
42384e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN HTAG = 0x%x\n", tag));
42394e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN++;
42404e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
42414e1bc9a0SAchim Leubner break;
42424e1bc9a0SAchim Leubner }
42434e1bc9a0SAchim Leubner case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
42444e1bc9a0SAchim Leubner {
42454e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT HTAG = 0x%x\n", tag));
42464e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
42474e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
42484e1bc9a0SAchim Leubner break;
42494e1bc9a0SAchim Leubner }
42504e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_PEER_ABORTED:
42514e1bc9a0SAchim Leubner {
42524e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_PEER_ABORTED HTAG = 0x%x\n", tag));
42534e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_PEER_ABORTED++;
42544e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
42554e1bc9a0SAchim Leubner break;
42564e1bc9a0SAchim Leubner }
42574e1bc9a0SAchim Leubner case OSSA_IO_XFER_CMD_FRAME_ISSUED:
42584e1bc9a0SAchim Leubner {
42594e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED HTAG = 0x%x\n", tag));
42604e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_CMD_FRAME_ISSUED++;
42614e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
42624e1bc9a0SAchim Leubner break;
42634e1bc9a0SAchim Leubner }
42644e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
42654e1bc9a0SAchim Leubner {
42664e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent, OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY HTAG = 0x%x\n", tag));
42674e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY++;
42684e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
42694e1bc9a0SAchim Leubner break;
42704e1bc9a0SAchim Leubner }
42714e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE:
42724e1bc9a0SAchim Leubner {
42734e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent, OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE HTAG = 0x%x\n", tag));
42744e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_UNEXPECTED_PHASE++;
42754e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
42764e1bc9a0SAchim Leubner break;
42774e1bc9a0SAchim Leubner }
42784e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN:
42794e1bc9a0SAchim Leubner {
42804e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent, OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN HTAG = 0x%x\n", tag));
42814e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN++;
42824e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
42834e1bc9a0SAchim Leubner break;
42844e1bc9a0SAchim Leubner }
42854e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED:
42864e1bc9a0SAchim Leubner {
42874e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent, OSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED HTAG = 0x%x\n", tag));
42884e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED++;
42894e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
42904e1bc9a0SAchim Leubner break;
42914e1bc9a0SAchim Leubner }
42924e1bc9a0SAchim Leubner case OSSA_IO_XFER_PIO_SETUP_ERROR:
42934e1bc9a0SAchim Leubner {
42944e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_PIO_SETUP_ERROR HTAG = 0x%x\n", tag));
42954e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_PIO_SETUP_ERROR++;
42964e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
42974e1bc9a0SAchim Leubner break;
42984e1bc9a0SAchim Leubner }
42994e1bc9a0SAchim Leubner case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
43004e1bc9a0SAchim Leubner {
43014e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFR_ERROR_DIF_MISMATCH HTAG = 0x%x\n", tag));
43024e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_DIF_MISMATCH++;
43034e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
43044e1bc9a0SAchim Leubner break;
43054e1bc9a0SAchim Leubner }
43064e1bc9a0SAchim Leubner case OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR:
43074e1bc9a0SAchim Leubner {
43084e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR HTAG = 0x%x\n", tag));
43094e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR++;
43104e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
43114e1bc9a0SAchim Leubner break;
43124e1bc9a0SAchim Leubner }
43134e1bc9a0SAchim Leubner case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
43144e1bc9a0SAchim Leubner {
43154e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x\n", tag));
43164e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
43174e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
43184e1bc9a0SAchim Leubner break;
43194e1bc9a0SAchim Leubner }
43204e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
43214e1bc9a0SAchim Leubner {
43224e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN HTAG = 0x%x\n", tag));
43234e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERR_EOB_DATA_OVERRUN++;
43244e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
43254e1bc9a0SAchim Leubner break;
43264e1bc9a0SAchim Leubner }
43274e1bc9a0SAchim Leubner case OSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT:
43284e1bc9a0SAchim Leubner {
43294e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: OSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT HTAG = 0x%x\n", tag));
43304e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT++;
43314e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
43324e1bc9a0SAchim Leubner break;
43334e1bc9a0SAchim Leubner }
43344e1bc9a0SAchim Leubner default:
43354e1bc9a0SAchim Leubner {
43364e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAEvent: Unknown Event 0x%x HTAG = 0x%x\n", event, tag));
43374e1bc9a0SAchim Leubner saRoot->IoEventCount.agOSSA_IO_UNKNOWN_ERROR++;
43384e1bc9a0SAchim Leubner ossaSATAEvent(agRoot, pRequest->pIORequestContext, agPortContext, agDevHandle, event, 0, agNULL);
43394e1bc9a0SAchim Leubner break;
43404e1bc9a0SAchim Leubner }
43414e1bc9a0SAchim Leubner }
43424e1bc9a0SAchim Leubner
43434e1bc9a0SAchim Leubner /* return value */
43444e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2w");
43454e1bc9a0SAchim Leubner return ret;
43464e1bc9a0SAchim Leubner }
43474e1bc9a0SAchim Leubner
43484e1bc9a0SAchim Leubner /******************************************************************************/
43494e1bc9a0SAchim Leubner /*! \brief Set NVM Data Response
43504e1bc9a0SAchim Leubner *
43514e1bc9a0SAchim Leubner * This routine handles the response of SET NVM Data Response
43524e1bc9a0SAchim Leubner *
43534e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
43544e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
43554e1bc9a0SAchim Leubner *
43564e1bc9a0SAchim Leubner * \return sucess or fail
43574e1bc9a0SAchim Leubner *
43584e1bc9a0SAchim Leubner */
43594e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSetNVMDataRsp(agsaRoot_t * agRoot,agsaSetNVMDataRsp_t * pIomb)43604e1bc9a0SAchim Leubner GLOBAL bit32 mpiSetNVMDataRsp(
43614e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
43624e1bc9a0SAchim Leubner agsaSetNVMDataRsp_t *pIomb
43634e1bc9a0SAchim Leubner )
43644e1bc9a0SAchim Leubner {
43654e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
43664e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
43674e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
43684e1bc9a0SAchim Leubner agsaContext_t *agContext;
43694e1bc9a0SAchim Leubner bit32 tag, status, iPTdaBnDpsAsNvm;
43704e1bc9a0SAchim Leubner
43714e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2x");
43724e1bc9a0SAchim Leubner
43734e1bc9a0SAchim Leubner SA_DBG1(("mpiSetNVMDataRsp: HTag=0x%x\n", pIomb->tag));
43744e1bc9a0SAchim Leubner
43754e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetNVMDataRsp_t, tag));
43764e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &iPTdaBnDpsAsNvm, pIomb, OSSA_OFFSET_OF(agsaSetNVMDataRsp_t, iPTdaBnDpsAsNvm));
43774e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetNVMDataRsp_t, status));
43784e1bc9a0SAchim Leubner
43794e1bc9a0SAchim Leubner /* get request from IOMap */
43804e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
43814e1bc9a0SAchim Leubner if (agNULL == pRequest)
43824e1bc9a0SAchim Leubner {
43834e1bc9a0SAchim Leubner SA_DBG1(("mpiSetNVMDataRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
43844e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2x");
43854e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
43864e1bc9a0SAchim Leubner }
43874e1bc9a0SAchim Leubner
43884e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
43894e1bc9a0SAchim Leubner /* remove the request from IOMap */
43904e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
43914e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
43924e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
43934e1bc9a0SAchim Leubner
43944e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
43954e1bc9a0SAchim Leubner
43964e1bc9a0SAchim Leubner if (((iPTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_CONFIG_SEEPROM) ||
43974e1bc9a0SAchim Leubner ((iPTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_VPD_FLASH) ||
43984e1bc9a0SAchim Leubner ((iPTdaBnDpsAsNvm & NVMD_TYPE) == AGSA_NVMD_TWI_DEVICES))
43994e1bc9a0SAchim Leubner {
44004e1bc9a0SAchim Leubner /* CB for VPD for SEEPROM-0, VPD_FLASH and TWI */
44014e1bc9a0SAchim Leubner ossaSetNVMDResponseCB(agRoot, agContext, (status & NVMD_STAT));
44024e1bc9a0SAchim Leubner }
44034e1bc9a0SAchim Leubner else
44044e1bc9a0SAchim Leubner {
44054e1bc9a0SAchim Leubner /* should not happend */
44064e1bc9a0SAchim Leubner SA_DBG1(("mpiSetNVMDataRsp: NVMD is wrong. TAG=0x%x STATUS=0x%x\n", tag, (iPTdaBnDpsAsNvm & NVMD_TYPE)));
44074e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
44084e1bc9a0SAchim Leubner }
44094e1bc9a0SAchim Leubner
44104e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
44114e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
44124e1bc9a0SAchim Leubner /* return the request to free pool */
44134e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
44144e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
44154e1bc9a0SAchim Leubner
44164e1bc9a0SAchim Leubner /* return value */
44174e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2x");
44184e1bc9a0SAchim Leubner return ret;
44194e1bc9a0SAchim Leubner }
44204e1bc9a0SAchim Leubner
44214e1bc9a0SAchim Leubner /******************************************************************************/
44224e1bc9a0SAchim Leubner /*! \brief SPC MPI SSP ABORT Response
44234e1bc9a0SAchim Leubner *
44244e1bc9a0SAchim Leubner * This function handles the SSP Abort Response.
44254e1bc9a0SAchim Leubner *
44264e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
44274e1bc9a0SAchim Leubner * \param pIomb pointer of Message
44284e1bc9a0SAchim Leubner *
44294e1bc9a0SAchim Leubner * \return The read value
44304e1bc9a0SAchim Leubner *
44314e1bc9a0SAchim Leubner */
44324e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSSPAbortRsp(agsaRoot_t * agRoot,agsaSSPAbortRsp_t * pIomb)44334e1bc9a0SAchim Leubner GLOBAL bit32 mpiSSPAbortRsp(
44344e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
44354e1bc9a0SAchim Leubner agsaSSPAbortRsp_t *pIomb
44364e1bc9a0SAchim Leubner )
44374e1bc9a0SAchim Leubner {
44384e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
44394e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
44404e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
44414e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
44424e1bc9a0SAchim Leubner bit32 tag, status, scope;
44434e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2y");
44444e1bc9a0SAchim Leubner
44454e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSSPAbortRsp_t, tag));
44464e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSSPAbortRsp_t, status));
44474e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &scope, pIomb, OSSA_OFFSET_OF(agsaSSPAbortRsp_t, scp));
44484e1bc9a0SAchim Leubner scope &= 3;
44494e1bc9a0SAchim Leubner /* get IORequest from IOMap */
44504e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
44514e1bc9a0SAchim Leubner
44524e1bc9a0SAchim Leubner if (agNULL == pRequest)
44534e1bc9a0SAchim Leubner {
44544e1bc9a0SAchim Leubner /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
44554e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
44564e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
44574e1bc9a0SAchim Leubner SA_ASSERT((pRequest), "pRequest");
44584e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPAbortRsp: the request is NULL. Tag=%x\n", tag));
44594e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2y");
44604e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
44614e1bc9a0SAchim Leubner }
44624e1bc9a0SAchim Leubner
44634e1bc9a0SAchim Leubner
44644e1bc9a0SAchim Leubner if ( agTRUE == pRequest->valid )
44654e1bc9a0SAchim Leubner {
44664e1bc9a0SAchim Leubner pDevice = pRequest->pDevice;
44674e1bc9a0SAchim Leubner SA_ASSERT((pRequest->pDevice), "pRequest->pDevice");
44684e1bc9a0SAchim Leubner
44694e1bc9a0SAchim Leubner SA_DBG3(("mpiSSPAbortRsp: request abort is valid Htag 0x%x\n", tag));
44704e1bc9a0SAchim Leubner /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
44714e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
44724e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
44734e1bc9a0SAchim Leubner
44744e1bc9a0SAchim Leubner if( pRequest->completionCB == agNULL )
44754e1bc9a0SAchim Leubner {
44764e1bc9a0SAchim Leubner ossaSSPAbortCB(agRoot, pRequest->pIORequestContext, scope, status);
44774e1bc9a0SAchim Leubner }
44784e1bc9a0SAchim Leubner else
44794e1bc9a0SAchim Leubner {
44804e1bc9a0SAchim Leubner (*(ossaGenericAbortCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, scope, status);
44814e1bc9a0SAchim Leubner }
44824e1bc9a0SAchim Leubner
44834e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
44844e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
44854e1bc9a0SAchim Leubner /* Delete the request from the pendingIORequests */
44864e1bc9a0SAchim Leubner saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
44874e1bc9a0SAchim Leubner
44884e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
44894e1bc9a0SAchim Leubner {
44904e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPAbortRsp: saving pRequest (%p) for later use\n", pRequest));
44914e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
44924e1bc9a0SAchim Leubner }
44934e1bc9a0SAchim Leubner else
44944e1bc9a0SAchim Leubner {
44954e1bc9a0SAchim Leubner /* return the request to free pool */
44964e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
44974e1bc9a0SAchim Leubner }
44984e1bc9a0SAchim Leubner
44994e1bc9a0SAchim Leubner if(scope)
45004e1bc9a0SAchim Leubner {
45014e1bc9a0SAchim Leubner siCountActiveIORequestsOnDevice( agRoot, pDevice->DeviceMapIndex );
45024e1bc9a0SAchim Leubner }
45034e1bc9a0SAchim Leubner
45044e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
45054e1bc9a0SAchim Leubner
45064e1bc9a0SAchim Leubner }
45074e1bc9a0SAchim Leubner else
45084e1bc9a0SAchim Leubner {
45094e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
45104e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPAbortRsp: the request is not valid any more. Tag=%x\n", pRequest->HTag));
45114e1bc9a0SAchim Leubner }
45124e1bc9a0SAchim Leubner
45134e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2y");
45144e1bc9a0SAchim Leubner return ret;
45154e1bc9a0SAchim Leubner }
45164e1bc9a0SAchim Leubner
45174e1bc9a0SAchim Leubner /******************************************************************************/
45184e1bc9a0SAchim Leubner /*! \brief SPC MPI SATA ABORT Response
45194e1bc9a0SAchim Leubner *
45204e1bc9a0SAchim Leubner * This function handles the SATA Event.
45214e1bc9a0SAchim Leubner *
45224e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
45234e1bc9a0SAchim Leubner * \param pIomb pointer of Message
45244e1bc9a0SAchim Leubner *
45254e1bc9a0SAchim Leubner * \return The read value
45264e1bc9a0SAchim Leubner *
45274e1bc9a0SAchim Leubner */
45284e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSATAAbortRsp(agsaRoot_t * agRoot,agsaSATAAbortRsp_t * pIomb)45294e1bc9a0SAchim Leubner GLOBAL bit32 mpiSATAAbortRsp(
45304e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
45314e1bc9a0SAchim Leubner agsaSATAAbortRsp_t *pIomb
45324e1bc9a0SAchim Leubner )
45334e1bc9a0SAchim Leubner {
45344e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
45354e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
45364e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
45374e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
45384e1bc9a0SAchim Leubner bit32 tag, status, scope;
45394e1bc9a0SAchim Leubner
45404e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3B");
45414e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSATAAbortRsp_t, tag));
45424e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSATAAbortRsp_t, status));
45434e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &scope, pIomb, OSSA_OFFSET_OF(agsaSATAAbortRsp_t, scp));
45444e1bc9a0SAchim Leubner
45454e1bc9a0SAchim Leubner /* get IORequest from IOMap */
45464e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
45474e1bc9a0SAchim Leubner
45484e1bc9a0SAchim Leubner if (agNULL == pRequest)
45494e1bc9a0SAchim Leubner {
45504e1bc9a0SAchim Leubner /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
45514e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
45524e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
45534e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAAbortRsp: the request is NULL. Tag=%x\n", tag));
45544e1bc9a0SAchim Leubner SA_ASSERT((pRequest), "pRequest");
45554e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3B");
45564e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
45574e1bc9a0SAchim Leubner }
45584e1bc9a0SAchim Leubner
45594e1bc9a0SAchim Leubner if ( agTRUE == pRequest->valid )
45604e1bc9a0SAchim Leubner {
45614e1bc9a0SAchim Leubner pDevice = pRequest->pDevice;
45624e1bc9a0SAchim Leubner SA_ASSERT((pRequest->pDevice), "pRequest->pDevice");
45634e1bc9a0SAchim Leubner
45644e1bc9a0SAchim Leubner SA_DBG3(("mpiSATAAbortRsp: request abort is valid Htag 0x%x\n", tag));
45654e1bc9a0SAchim Leubner
45664e1bc9a0SAchim Leubner if( pRequest->completionCB == agNULL )
45674e1bc9a0SAchim Leubner {
45684e1bc9a0SAchim Leubner ossaSATAAbortCB(agRoot, pRequest->pIORequestContext, scope, status);
45694e1bc9a0SAchim Leubner }
45704e1bc9a0SAchim Leubner else
45714e1bc9a0SAchim Leubner {
45724e1bc9a0SAchim Leubner (*(ossaGenericAbortCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, scope, status);
45734e1bc9a0SAchim Leubner }
45744e1bc9a0SAchim Leubner /* remove the SATA_ABORT request from IOMap */
45754e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
45764e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
45774e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
45784e1bc9a0SAchim Leubner
45794e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
45804e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
45814e1bc9a0SAchim Leubner /* Delete the request from the pendingIORequests */
45824e1bc9a0SAchim Leubner saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
45834e1bc9a0SAchim Leubner /* return the request to free pool */
45844e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
45854e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
45864e1bc9a0SAchim Leubner
45874e1bc9a0SAchim Leubner }
45884e1bc9a0SAchim Leubner else
45894e1bc9a0SAchim Leubner {
45904e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
45914e1bc9a0SAchim Leubner SA_DBG1(("mpiSATAAbortRsp: the request is not valid any more. Tag=%x\n", pRequest->HTag));
45924e1bc9a0SAchim Leubner }
45934e1bc9a0SAchim Leubner
45944e1bc9a0SAchim Leubner
45954e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3B");
45964e1bc9a0SAchim Leubner return ret;
45974e1bc9a0SAchim Leubner }
45984e1bc9a0SAchim Leubner
45994e1bc9a0SAchim Leubner /******************************************************************************/
46004e1bc9a0SAchim Leubner /*! \brief Set GPIO Response
46014e1bc9a0SAchim Leubner *
46024e1bc9a0SAchim Leubner * This routine handles the response of GPIO Command
46034e1bc9a0SAchim Leubner *
46044e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
46054e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
46064e1bc9a0SAchim Leubner *
46074e1bc9a0SAchim Leubner * \return sucess or fail
46084e1bc9a0SAchim Leubner *
46094e1bc9a0SAchim Leubner */
46104e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGPIORsp(agsaRoot_t * agRoot,agsaGPIORsp_t * pIomb)46114e1bc9a0SAchim Leubner GLOBAL bit32 mpiGPIORsp(
46124e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
46134e1bc9a0SAchim Leubner agsaGPIORsp_t *pIomb
46144e1bc9a0SAchim Leubner )
46154e1bc9a0SAchim Leubner {
46164e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
46174e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
46184e1bc9a0SAchim Leubner agsaContext_t *agContext;
46194e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
46204e1bc9a0SAchim Leubner agsaGpioPinSetupInfo_t pinSetupInfo;
46214e1bc9a0SAchim Leubner agsaGpioEventSetupInfo_t eventSetupInfo;
46224e1bc9a0SAchim Leubner bit32 GpioIe, OT11_0, OT19_12, GPIEVChange, GPIEVFall, GPIEVRise, GpioRdVal, tag;
46234e1bc9a0SAchim Leubner
46244e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"5C");
46254e1bc9a0SAchim Leubner
46264e1bc9a0SAchim Leubner SA_DBG3(("mpiGPIORsp: HTag=0x%x\n", pIomb->tag));
46274e1bc9a0SAchim Leubner
46284e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, tag));
46294e1bc9a0SAchim Leubner
46304e1bc9a0SAchim Leubner /* get request from IOMap */
46314e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
46324e1bc9a0SAchim Leubner if (agNULL == pRequest)
46334e1bc9a0SAchim Leubner {
46344e1bc9a0SAchim Leubner SA_DBG1(("mpiGPIORsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x\n", tag));
46354e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5C");
46364e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
46374e1bc9a0SAchim Leubner }
46384e1bc9a0SAchim Leubner
46394e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
46404e1bc9a0SAchim Leubner /* remove the request from IOMap */
46414e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
46424e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
46434e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
46444e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
46454e1bc9a0SAchim Leubner
46464e1bc9a0SAchim Leubner /* set payload to zeros */
46474e1bc9a0SAchim Leubner si_memset(&pinSetupInfo, 0, sizeof(agsaGpioPinSetupInfo_t));
46484e1bc9a0SAchim Leubner si_memset(&eventSetupInfo, 0, sizeof(agsaGpioEventSetupInfo_t));
46494e1bc9a0SAchim Leubner
46504e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &GpioIe, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GpioIe));
46514e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &OT11_0, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, OT11_0));
46524e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &OT19_12, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, OT19_12));
46534e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &GPIEVChange, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GPIEVChange));
46544e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &GPIEVFall, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GPIEVFall));
46554e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &GPIEVRise, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GPIEVRise));
46564e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &GpioRdVal, pIomb, OSSA_OFFSET_OF(agsaGPIORsp_t, GpioRdVal));
46574e1bc9a0SAchim Leubner pinSetupInfo.gpioInputEnabled = GpioIe;
46584e1bc9a0SAchim Leubner pinSetupInfo.gpioTypePart1 = OT11_0;
46594e1bc9a0SAchim Leubner pinSetupInfo.gpioTypePart2 = OT19_12;
46604e1bc9a0SAchim Leubner eventSetupInfo.gpioEventLevel = GPIEVChange;
46614e1bc9a0SAchim Leubner eventSetupInfo.gpioEventFallingEdge = GPIEVFall;
46624e1bc9a0SAchim Leubner eventSetupInfo.gpioEventRisingEdge = GPIEVRise;
46634e1bc9a0SAchim Leubner
46644e1bc9a0SAchim Leubner ossaGpioResponseCB(agRoot, agContext, OSSA_IO_SUCCESS, GpioRdVal,
46654e1bc9a0SAchim Leubner &pinSetupInfo,
46664e1bc9a0SAchim Leubner &eventSetupInfo);
46674e1bc9a0SAchim Leubner
46684e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
46694e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
46704e1bc9a0SAchim Leubner /* return the request to free pool */
46714e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
46724e1bc9a0SAchim Leubner {
46734e1bc9a0SAchim Leubner SA_DBG1(("mpiGPIORsp: saving pRequest (%p) for later use\n", pRequest));
46744e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
46754e1bc9a0SAchim Leubner }
46764e1bc9a0SAchim Leubner else
46774e1bc9a0SAchim Leubner {
46784e1bc9a0SAchim Leubner /* return the request to free pool */
46794e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
46804e1bc9a0SAchim Leubner }
46814e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
46824e1bc9a0SAchim Leubner
46834e1bc9a0SAchim Leubner /* return value */
46844e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5C");
46854e1bc9a0SAchim Leubner return ret;
46864e1bc9a0SAchim Leubner }
46874e1bc9a0SAchim Leubner
46884e1bc9a0SAchim Leubner /******************************************************************************/
46894e1bc9a0SAchim Leubner /*! \brief Set GPIO Event Response
46904e1bc9a0SAchim Leubner *
46914e1bc9a0SAchim Leubner * This routine handles the response of GPIO Event
46924e1bc9a0SAchim Leubner *
46934e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
46944e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
46954e1bc9a0SAchim Leubner *
46964e1bc9a0SAchim Leubner * \return sucess or fail
46974e1bc9a0SAchim Leubner *
46984e1bc9a0SAchim Leubner */
46994e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGPIOEventRsp(agsaRoot_t * agRoot,agsaGPIOEvent_t * pIomb)47004e1bc9a0SAchim Leubner GLOBAL bit32 mpiGPIOEventRsp(
47014e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
47024e1bc9a0SAchim Leubner agsaGPIOEvent_t *pIomb
47034e1bc9a0SAchim Leubner )
47044e1bc9a0SAchim Leubner {
47054e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
47064e1bc9a0SAchim Leubner bit32 GpioEvent;
47074e1bc9a0SAchim Leubner
47084e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3D");
47094e1bc9a0SAchim Leubner
47104e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &GpioEvent, pIomb, OSSA_OFFSET_OF(agsaGPIOEvent_t, GpioEvent));
47114e1bc9a0SAchim Leubner
47124e1bc9a0SAchim Leubner ossaGpioEvent(agRoot, GpioEvent);
47134e1bc9a0SAchim Leubner
47144e1bc9a0SAchim Leubner /* return value */
47154e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3D");
47164e1bc9a0SAchim Leubner return ret;
47174e1bc9a0SAchim Leubner }
47184e1bc9a0SAchim Leubner
47194e1bc9a0SAchim Leubner /******************************************************************************/
47204e1bc9a0SAchim Leubner /*! \brief SAS Diagnostic Start/End Response
47214e1bc9a0SAchim Leubner *
47224e1bc9a0SAchim Leubner * This routine handles the response of SAS Diagnostic Start/End Command
47234e1bc9a0SAchim Leubner *
47244e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
47254e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
47264e1bc9a0SAchim Leubner *
47274e1bc9a0SAchim Leubner * \return sucess or fail
47284e1bc9a0SAchim Leubner *
47294e1bc9a0SAchim Leubner */
47304e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSASDiagStartEndRsp(agsaRoot_t * agRoot,agsaSASDiagStartEndRsp_t * pIomb)47314e1bc9a0SAchim Leubner GLOBAL bit32 mpiSASDiagStartEndRsp(
47324e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
47334e1bc9a0SAchim Leubner agsaSASDiagStartEndRsp_t *pIomb
47344e1bc9a0SAchim Leubner )
47354e1bc9a0SAchim Leubner {
47364e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
47374e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
47384e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
47394e1bc9a0SAchim Leubner agsaContext_t *agContext;
47404e1bc9a0SAchim Leubner bit32 tag, Status;
47414e1bc9a0SAchim Leubner
47424e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2F");
47434e1bc9a0SAchim Leubner
47444e1bc9a0SAchim Leubner SA_DBG3(("mpiSASDiagStartEndRsp: HTAG=0x%x\n", pIomb->tag));
47454e1bc9a0SAchim Leubner
47464e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSASDiagStartEndRsp_t, tag));
47474e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Status, pIomb, OSSA_OFFSET_OF(agsaSASDiagStartEndRsp_t, Status));
47484e1bc9a0SAchim Leubner
47494e1bc9a0SAchim Leubner /* get request from IOMap */
47504e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
47514e1bc9a0SAchim Leubner if (agNULL == pRequest)
47524e1bc9a0SAchim Leubner {
47534e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagStartEndRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, Status));
47544e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2F");
47554e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
47564e1bc9a0SAchim Leubner }
47574e1bc9a0SAchim Leubner
47584e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
47594e1bc9a0SAchim Leubner /* remove the request from IOMap */
47604e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
47614e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
47624e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
47634e1bc9a0SAchim Leubner
47644e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
47654e1bc9a0SAchim Leubner
47664e1bc9a0SAchim Leubner switch(Status)
47674e1bc9a0SAchim Leubner {
47684e1bc9a0SAchim Leubner
47694e1bc9a0SAchim Leubner case OSSA_DIAG_SE_SUCCESS:
47704e1bc9a0SAchim Leubner SA_DBG3(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_SE_SUCCESS 0x%X \n", Status));
47714e1bc9a0SAchim Leubner break;
47724e1bc9a0SAchim Leubner case OSSA_DIAG_SE_INVALID_PHY_ID:
47734e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_SE_INVALID_PHY_ID 0x%X \n", Status));
47744e1bc9a0SAchim Leubner break;
47754e1bc9a0SAchim Leubner case OSSA_DIAG_PHY_NOT_DISABLED:
47764e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_PHY_NOT_DISABLED Status 0x%X \n", Status));
47774e1bc9a0SAchim Leubner break;
47784e1bc9a0SAchim Leubner case OSSA_DIAG_OTHER_FAILURE:
47794e1bc9a0SAchim Leubner if(smIS_SPCV(agRoot))
47804e1bc9a0SAchim Leubner {
47814e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_OTHER_FAILURE Status 0x%X \n", Status));
47824e1bc9a0SAchim Leubner }
47834e1bc9a0SAchim Leubner else
47844e1bc9a0SAchim Leubner {
47854e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagStartEndRsp: Status OSSA_DIAG_OPCODE_INVALID Status 0x%X \n", Status));
47864e1bc9a0SAchim Leubner }
47874e1bc9a0SAchim Leubner break;
47884e1bc9a0SAchim Leubner default:
47894e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagStartEndRsp:Status UNKNOWN 0x%X \n", Status));
47904e1bc9a0SAchim Leubner break;
47914e1bc9a0SAchim Leubner }
47924e1bc9a0SAchim Leubner
47934e1bc9a0SAchim Leubner ossaSASDiagStartEndCB(agRoot, agContext, Status);
47944e1bc9a0SAchim Leubner
47954e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
47964e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
47974e1bc9a0SAchim Leubner /* return the request to free pool */
47984e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
47994e1bc9a0SAchim Leubner {
48004e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagStartEndRsp: saving pRequest (%p) for later use\n", pRequest));
48014e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
48024e1bc9a0SAchim Leubner }
48034e1bc9a0SAchim Leubner else
48044e1bc9a0SAchim Leubner {
48054e1bc9a0SAchim Leubner /* return the request to free pool */
48064e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
48074e1bc9a0SAchim Leubner }
48084e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
48094e1bc9a0SAchim Leubner
48104e1bc9a0SAchim Leubner /* return value */
48114e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2F");
48124e1bc9a0SAchim Leubner return ret;
48134e1bc9a0SAchim Leubner }
48144e1bc9a0SAchim Leubner
48154e1bc9a0SAchim Leubner /******************************************************************************/
48164e1bc9a0SAchim Leubner /*! \brief SAS Diagnostic Execute Response
48174e1bc9a0SAchim Leubner *
48184e1bc9a0SAchim Leubner * This routine handles the response of SAS Diagnostic Execute Command
48194e1bc9a0SAchim Leubner *
48204e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
48214e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
48224e1bc9a0SAchim Leubner *
48234e1bc9a0SAchim Leubner * \return sucess or fail
48244e1bc9a0SAchim Leubner *
48254e1bc9a0SAchim Leubner */
48264e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSASDiagExecuteRsp(agsaRoot_t * agRoot,agsaSASDiagExecuteRsp_t * pIomb)48274e1bc9a0SAchim Leubner GLOBAL bit32 mpiSASDiagExecuteRsp(
48284e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
48294e1bc9a0SAchim Leubner agsaSASDiagExecuteRsp_t *pIomb
48304e1bc9a0SAchim Leubner )
48314e1bc9a0SAchim Leubner {
48324e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
48334e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
48344e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
48354e1bc9a0SAchim Leubner agsaContext_t *agContext;
48364e1bc9a0SAchim Leubner bit32 tag, Status, CmdTypeDescPhyId, ReportData;
48374e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3G");
48384e1bc9a0SAchim Leubner
48394e1bc9a0SAchim Leubner SA_DBG3(("mpiSASDiagExecuteRsp: HTAG=0x%x\n", pIomb->tag));
48404e1bc9a0SAchim Leubner
48414e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, tag));
48424e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Status, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, Status));
48434e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &CmdTypeDescPhyId, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, CmdTypeDescPhyId));
48444e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &ReportData, pIomb, OSSA_OFFSET_OF(agsaSASDiagExecuteRsp_t, ReportData));
48454e1bc9a0SAchim Leubner /* get request from IOMap */
48464e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
48474e1bc9a0SAchim Leubner if (agNULL == pRequest)
48484e1bc9a0SAchim Leubner {
48494e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagExecuteRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, Status));
48504e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3G");
48514e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
48524e1bc9a0SAchim Leubner }
48534e1bc9a0SAchim Leubner
48544e1bc9a0SAchim Leubner switch(Status)
48554e1bc9a0SAchim Leubner {
48564e1bc9a0SAchim Leubner
48574e1bc9a0SAchim Leubner case OSSA_DIAG_SUCCESS:
48584e1bc9a0SAchim Leubner SA_DBG3(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_SUCCESS 0x%X \n", Status));
48594e1bc9a0SAchim Leubner break;
48604e1bc9a0SAchim Leubner case OSSA_DIAG_INVALID_COMMAND:
48614e1bc9a0SAchim Leubner if(smIS_SPCV(agRoot))
48624e1bc9a0SAchim Leubner {
48634e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_INVALID_COMMAND Status 0x%X \n", Status));
48644e1bc9a0SAchim Leubner }
48654e1bc9a0SAchim Leubner else
48664e1bc9a0SAchim Leubner {
48674e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_FAIL Status 0x%X \n", Status));
48684e1bc9a0SAchim Leubner }
48694e1bc9a0SAchim Leubner break;
48704e1bc9a0SAchim Leubner case OSSA_REGISTER_ACCESS_TIMEOUT:
48714e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_REGISTER_ACCESS_TIMEOUT Status 0x%X \n", Status));
48724e1bc9a0SAchim Leubner break;
48734e1bc9a0SAchim Leubner case OSSA_DIAG_NOT_IN_DIAGNOSTIC_MODE:
48744e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_NOT_IN_DIAGNOSTIC_MODE Status 0x%X \n", Status));
48754e1bc9a0SAchim Leubner break;
48764e1bc9a0SAchim Leubner case OSSA_DIAG_INVALID_PHY:
48774e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagExecuteRsp: Status OSSA_DIAG_INVALID_PHY Status 0x%X \n", Status));
48784e1bc9a0SAchim Leubner break;
48794e1bc9a0SAchim Leubner case OSSA_MEMORY_ALLOC_FAILURE:
48804e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagExecuteRsp: Status Status 0x%X \n", Status));
48814e1bc9a0SAchim Leubner break;
48824e1bc9a0SAchim Leubner
48834e1bc9a0SAchim Leubner default:
48844e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagExecuteRsp:Status UNKNOWN 0x%X \n", Status));
48854e1bc9a0SAchim Leubner break;
48864e1bc9a0SAchim Leubner }
48874e1bc9a0SAchim Leubner
48884e1bc9a0SAchim Leubner
48894e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
48904e1bc9a0SAchim Leubner /* remove the request from IOMap */
48914e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
48924e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
48934e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
48944e1bc9a0SAchim Leubner
48954e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
48964e1bc9a0SAchim Leubner
48974e1bc9a0SAchim Leubner ossaSASDiagExecuteCB(agRoot, agContext, Status, CmdTypeDescPhyId, ReportData);
48984e1bc9a0SAchim Leubner
48994e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
49004e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
49014e1bc9a0SAchim Leubner /* return the request to free pool */
49024e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
49034e1bc9a0SAchim Leubner {
49044e1bc9a0SAchim Leubner SA_DBG1(("mpiSASDiagExecuteRsp: saving pRequest (%p) for later use\n", pRequest));
49054e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
49064e1bc9a0SAchim Leubner }
49074e1bc9a0SAchim Leubner else
49084e1bc9a0SAchim Leubner {
49094e1bc9a0SAchim Leubner /* return the request to free pool */
49104e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
49114e1bc9a0SAchim Leubner }
49124e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
49134e1bc9a0SAchim Leubner
49144e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3G");
49154e1bc9a0SAchim Leubner
49164e1bc9a0SAchim Leubner /* return value */
49174e1bc9a0SAchim Leubner return ret;
49184e1bc9a0SAchim Leubner }
49194e1bc9a0SAchim Leubner
49204e1bc9a0SAchim Leubner /******************************************************************************/
49214e1bc9a0SAchim Leubner /*! \brief SAS General Event Notification Response
49224e1bc9a0SAchim Leubner *
49234e1bc9a0SAchim Leubner * This routine handles the response of Inbound IOMB Command with error case
49244e1bc9a0SAchim Leubner *
49254e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
49264e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
49274e1bc9a0SAchim Leubner *
49284e1bc9a0SAchim Leubner * \return sucess or fail
49294e1bc9a0SAchim Leubner *
49304e1bc9a0SAchim Leubner */
49314e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGeneralEventRsp(agsaRoot_t * agRoot,agsaGeneralEventRsp_t * pIomb)49324e1bc9a0SAchim Leubner GLOBAL bit32 mpiGeneralEventRsp(
49334e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
49344e1bc9a0SAchim Leubner agsaGeneralEventRsp_t *pIomb
49354e1bc9a0SAchim Leubner )
49364e1bc9a0SAchim Leubner {
49374e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
49384e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
49394e1bc9a0SAchim Leubner bit32 i;
49404e1bc9a0SAchim Leubner bit32 status;
49414e1bc9a0SAchim Leubner bit32 tag;
49424e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
49434e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
49444e1bc9a0SAchim Leubner agsaContext_t *agContext = NULL;
49454e1bc9a0SAchim Leubner agsaGeneralEventRsp_t GenEventData;
49464e1bc9a0SAchim Leubner agsaHWEventEncrypt_t agEvent;
49474e1bc9a0SAchim Leubner bit16 OpCode = 0;
49484e1bc9a0SAchim Leubner
49494e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3H");
49504e1bc9a0SAchim Leubner
49514e1bc9a0SAchim Leubner si_memset(&GenEventData,0,sizeof(agsaGeneralEventRsp_t));
49524e1bc9a0SAchim Leubner
49534e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGeneralEventRsp_t, status));
49544e1bc9a0SAchim Leubner
49554e1bc9a0SAchim Leubner SA_DBG3(("mpiGeneralEventRsp: %p\n", pIomb));
49564e1bc9a0SAchim Leubner
49574e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: OpCode 0x%X status 0x%x\n",pIomb->inbIOMBpayload[0] & OPCODE_BITS, status));
49584e1bc9a0SAchim Leubner
49594e1bc9a0SAchim Leubner for (i = 0; i < GENERAL_EVENT_PAYLOAD; i++)
49604e1bc9a0SAchim Leubner {
49614e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &GenEventData.inbIOMBpayload[i], pIomb, OSSA_OFFSET_OF(agsaGeneralEventRsp_t,inbIOMBpayload[i] ));
49624e1bc9a0SAchim Leubner }
49634e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: inbIOMBpayload 0x%08x 0x%08x 0x%08x 0x%08x\n",
49644e1bc9a0SAchim Leubner GenEventData.inbIOMBpayload[0],GenEventData.inbIOMBpayload[1],
49654e1bc9a0SAchim Leubner GenEventData.inbIOMBpayload[2],GenEventData.inbIOMBpayload[3] ));
49664e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: inbIOMBpayload 0x%08x 0x%08x 0x%08x 0x%08x\n",
49674e1bc9a0SAchim Leubner GenEventData.inbIOMBpayload[4],GenEventData.inbIOMBpayload[8],
49684e1bc9a0SAchim Leubner GenEventData.inbIOMBpayload[6],GenEventData.inbIOMBpayload[7] ));
49694e1bc9a0SAchim Leubner
49704e1bc9a0SAchim Leubner switch (status) /*status */
49714e1bc9a0SAchim Leubner {
49724e1bc9a0SAchim Leubner
49734e1bc9a0SAchim Leubner case GEN_EVENT_IOMB_V_BIT_NOT_SET:
49744e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_IOMB_V_BIT_NOT_SET\n" ));
49754e1bc9a0SAchim Leubner break;
49764e1bc9a0SAchim Leubner case GEN_EVENT_INBOUND_IOMB_OPC_NOT_SUPPORTED:
49774e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_INBOUND_IOMB_OPC_NOT_SUPPORTED\n" ));
49784e1bc9a0SAchim Leubner break;
49794e1bc9a0SAchim Leubner case GEN_EVENT_IOMB_INVALID_OBID:
49804e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_IOMB_INVALID_OBID\n" ));
49814e1bc9a0SAchim Leubner break;
49824e1bc9a0SAchim Leubner case GEN_EVENT_DS_IN_NON_OPERATIONAL:
49834e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_DS_IN_NON_OPERATIONAL\n" ));
49844e1bc9a0SAchim Leubner break;
49854e1bc9a0SAchim Leubner case GEN_EVENT_DS_IN_RECOVERY:
49864e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_DS_IN_RECOVERY\n" ));
49874e1bc9a0SAchim Leubner break;
49884e1bc9a0SAchim Leubner case GEN_EVENT_DS_INVALID:
49894e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_DS_INVALID\n" ));
49904e1bc9a0SAchim Leubner break;
49914e1bc9a0SAchim Leubner case GEN_EVENT_IO_XFER_READ_COMPL_ERR:
49924e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: GEN_EVENT_IO_XFER_READ_COMPL_ERR 0x%x 0x%x 0x%x\n",
49934e1bc9a0SAchim Leubner GenEventData.inbIOMBpayload[0],
49944e1bc9a0SAchim Leubner GenEventData.inbIOMBpayload[1],
49954e1bc9a0SAchim Leubner GenEventData.inbIOMBpayload[1] ));
49964e1bc9a0SAchim Leubner ossaGeneralEvent(agRoot, status, agContext, GenEventData.inbIOMBpayload);
49974e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3H");
49984e1bc9a0SAchim Leubner return(ret);
49994e1bc9a0SAchim Leubner default:
50004e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: Unknown General Event status!!! 0x%x\n", status));
50014e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3H");
50024e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
50034e1bc9a0SAchim Leubner }
50044e1bc9a0SAchim Leubner
50054e1bc9a0SAchim Leubner OpCode = (bit16)(GenEventData.inbIOMBpayload[0] & OPCODE_BITS);
50064e1bc9a0SAchim Leubner tag = GenEventData.inbIOMBpayload[1];
50074e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp:OpCode 0x%X [0] 0x%08x\n" ,OpCode,(bit16)(GenEventData.inbIOMBpayload[0] & OPCODE_BITS)));
50084e1bc9a0SAchim Leubner
50094e1bc9a0SAchim Leubner switch (OpCode) /* OpCode */
50104e1bc9a0SAchim Leubner {
50114e1bc9a0SAchim Leubner case OPC_INB_DEV_HANDLE_ACCEPT:
50124e1bc9a0SAchim Leubner case OPC_INB_ECHO:
50134e1bc9a0SAchim Leubner case OPC_INB_FW_FLASH_UPDATE:
50144e1bc9a0SAchim Leubner case OPC_INB_GET_NVMD_DATA:
50154e1bc9a0SAchim Leubner case OPC_INB_SET_NVMD_DATA:
50164e1bc9a0SAchim Leubner case OPC_INB_DEREG_DEV_HANDLE:
50174e1bc9a0SAchim Leubner case OPC_INB_SPC_GET_DEV_INFO:
50184e1bc9a0SAchim Leubner case OPC_INB_GET_DEV_HANDLE:
50194e1bc9a0SAchim Leubner case OPC_INB_SPC_REG_DEV:
50204e1bc9a0SAchim Leubner case OPC_INB_SAS_DIAG_EXECUTE:
50214e1bc9a0SAchim Leubner case OPC_INB_SAS_DIAG_MODE_START_END:
50224e1bc9a0SAchim Leubner case OPC_INB_PHYSTART:
50234e1bc9a0SAchim Leubner case OPC_INB_PHYSTOP:
50244e1bc9a0SAchim Leubner case OPC_INB_LOCAL_PHY_CONTROL:
50254e1bc9a0SAchim Leubner case OPC_INB_GPIO:
50264e1bc9a0SAchim Leubner case OPC_INB_GET_TIME_STAMP:
50274e1bc9a0SAchim Leubner case OPC_INB_PORT_CONTROL:
50284e1bc9a0SAchim Leubner case OPC_INB_SET_DEVICE_STATE:
50294e1bc9a0SAchim Leubner case OPC_INB_GET_DEVICE_STATE:
50304e1bc9a0SAchim Leubner case OPC_INB_SET_DEV_INFO:
50314e1bc9a0SAchim Leubner // case OPC_INB_PCIE_DIAG_EXECUTE:
50324e1bc9a0SAchim Leubner case OPC_INB_SAS_HW_EVENT_ACK:
50334e1bc9a0SAchim Leubner case OPC_INB_SAS_RE_INITIALIZE:
50344e1bc9a0SAchim Leubner case OPC_INB_KEK_MANAGEMENT:
50354e1bc9a0SAchim Leubner case OPC_INB_SET_OPERATOR:
50364e1bc9a0SAchim Leubner case OPC_INB_GET_OPERATOR:
50374e1bc9a0SAchim Leubner // case OPC_INB_SGPIO:
50384e1bc9a0SAchim Leubner
50394e1bc9a0SAchim Leubner #ifdef SPC_ENABLE_PROFILE
50404e1bc9a0SAchim Leubner case OPC_INB_FW_PROFILE:
50414e1bc9a0SAchim Leubner #endif
50424e1bc9a0SAchim Leubner /* Uses the tag table, so we have to free it up */
50434e1bc9a0SAchim Leubner
50444e1bc9a0SAchim Leubner SA_ASSERT((tag < AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs),
50454e1bc9a0SAchim Leubner "OPC_OUB_GENERAL_EVENT tag out of range");
50464e1bc9a0SAchim Leubner SA_ASSERT((saRoot->IOMap[ tag < (AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs) ? tag : 0 ].Tag != MARK_OFF),
50474e1bc9a0SAchim Leubner "OPC_OUB_GENERAL_EVENT tag not in use 1");
50484e1bc9a0SAchim Leubner
50494e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
50504e1bc9a0SAchim Leubner if (tag > AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs)
50514e1bc9a0SAchim Leubner {
50524e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3H");
50534e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
50544e1bc9a0SAchim Leubner }
50554e1bc9a0SAchim Leubner #endif /* SALLSDK_DEBUG */
50564e1bc9a0SAchim Leubner
50574e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp:OpCode found 0x%x htag 0x%x\n",OpCode, tag));
50584e1bc9a0SAchim Leubner /* get agContext */
50594e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
50604e1bc9a0SAchim Leubner /* get request from IOMap */
50614e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
50624e1bc9a0SAchim Leubner if(pRequest)
50634e1bc9a0SAchim Leubner {
50644e1bc9a0SAchim Leubner /* remove the request from IOMap */
50654e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
50664e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
50674e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
50684e1bc9a0SAchim Leubner
50694e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
50704e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
50714e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
50724e1bc9a0SAchim Leubner /* return the request to free pool */
50734e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
50744e1bc9a0SAchim Leubner {
50754e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: saving pRequest (%p) for later use\n", pRequest));
50764e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
50774e1bc9a0SAchim Leubner }
50784e1bc9a0SAchim Leubner else
50794e1bc9a0SAchim Leubner {
50804e1bc9a0SAchim Leubner /* return the request to free pool */
50814e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
50824e1bc9a0SAchim Leubner }
50834e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
50844e1bc9a0SAchim Leubner }
50854e1bc9a0SAchim Leubner else
50864e1bc9a0SAchim Leubner {
50874e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp:pRequest (%p) NULL\n", pRequest));
50884e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
50894e1bc9a0SAchim Leubner }
50904e1bc9a0SAchim Leubner break;
50914e1bc9a0SAchim Leubner /* ???? */
50924e1bc9a0SAchim Leubner case OPC_INB_SATA_HOST_OPSTART:
50934e1bc9a0SAchim Leubner case OPC_INB_SATA_ABORT:
50944e1bc9a0SAchim Leubner case OPC_INB_SSPINIIOSTART:
50954e1bc9a0SAchim Leubner case OPC_INB_SSPINITMSTART:
50964e1bc9a0SAchim Leubner case OPC_INB_SSPINIEXTIOSTART:
50974e1bc9a0SAchim Leubner case OPC_INB_SSPTGTIOSTART:
50984e1bc9a0SAchim Leubner case OPC_INB_SSPTGTRSPSTART:
50994e1bc9a0SAchim Leubner case OPC_INB_SSP_DIF_ENC_OPSTART:
51004e1bc9a0SAchim Leubner case OPC_INB_SATA_DIF_ENC_OPSTART:
51014e1bc9a0SAchim Leubner
51024e1bc9a0SAchim Leubner case OPC_INB_SSP_ABORT:
51034e1bc9a0SAchim Leubner case OPC_INB_SMP_REQUEST:
51044e1bc9a0SAchim Leubner case OPC_INB_SMP_ABORT:
51054e1bc9a0SAchim Leubner {
51064e1bc9a0SAchim Leubner /* Uses the tag table, so we have to free it up */
51074e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp:OpCode found 0x%x htag 0x%x\n",OpCode, tag));
51084e1bc9a0SAchim Leubner
51094e1bc9a0SAchim Leubner tag = GenEventData.inbIOMBpayload[1];
51104e1bc9a0SAchim Leubner
51114e1bc9a0SAchim Leubner SA_ASSERT((tag < AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs),
51124e1bc9a0SAchim Leubner "OPC_OUB_GENERAL_EVENT tag out of range");
51134e1bc9a0SAchim Leubner SA_ASSERT((saRoot->IOMap[ tag < (AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs) ? tag : 0 ].Tag != MARK_OFF),
51144e1bc9a0SAchim Leubner "OPC_OUB_GENERAL_EVENT tag not in use 2");
51154e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
51164e1bc9a0SAchim Leubner if (tag > AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs)
51174e1bc9a0SAchim Leubner {
51184e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3H");
51194e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
51204e1bc9a0SAchim Leubner }
51214e1bc9a0SAchim Leubner #endif
51224e1bc9a0SAchim Leubner /* get request from IOMap */
51234e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
51244e1bc9a0SAchim Leubner if(pRequest)
51254e1bc9a0SAchim Leubner {
51264e1bc9a0SAchim Leubner pDevice = pRequest->pDevice;
51274e1bc9a0SAchim Leubner /* return the request to free pool */
51284e1bc9a0SAchim Leubner /* get IORequestContext */
51294e1bc9a0SAchim Leubner agContext = (agsaContext_t *)pRequest->pIORequestContext;
51304e1bc9a0SAchim Leubner /* remove the request from IOMap */
51314e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
51324e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
51334e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
51344e1bc9a0SAchim Leubner
51354e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
51364e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
51374e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
51384e1bc9a0SAchim Leubner saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
51394e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
51404e1bc9a0SAchim Leubner {
51414e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: saving pRequest (%p) for later use\n", pRequest));
51424e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
51434e1bc9a0SAchim Leubner }
51444e1bc9a0SAchim Leubner else
51454e1bc9a0SAchim Leubner {
51464e1bc9a0SAchim Leubner /* return the request to free pool */
51474e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
51484e1bc9a0SAchim Leubner }
51494e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
51504e1bc9a0SAchim Leubner break;
51514e1bc9a0SAchim Leubner }
51524e1bc9a0SAchim Leubner else
51534e1bc9a0SAchim Leubner {
51544e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp:pRequest (%p) NULL\n", pRequest));
51554e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
51564e1bc9a0SAchim Leubner }
51574e1bc9a0SAchim Leubner }
51584e1bc9a0SAchim Leubner default:
51594e1bc9a0SAchim Leubner {
51604e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp:OpCode Not found 0x%x htag 0x%x\n",OpCode, tag));
51614e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
51624e1bc9a0SAchim Leubner
51634e1bc9a0SAchim Leubner /* Uses the tag table, so we have to free it up */
51644e1bc9a0SAchim Leubner tag = GenEventData.inbIOMBpayload[1];
51654e1bc9a0SAchim Leubner
51664e1bc9a0SAchim Leubner SA_ASSERT((tag < AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs),
51674e1bc9a0SAchim Leubner "OPC_OUB_GENERAL_EVENT tag out of range");
51684e1bc9a0SAchim Leubner SA_ASSERT((saRoot->IOMap[ tag < (AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs) ? tag : 0 ].Tag != MARK_OFF),
51694e1bc9a0SAchim Leubner "OPC_OUB_GENERAL_EVENT tag not in use 3");
51704e1bc9a0SAchim Leubner
51714e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
51724e1bc9a0SAchim Leubner if (tag > AGSA_MAX_VALID_PORTS * saRoot->swConfig.maxActiveIOs)
51734e1bc9a0SAchim Leubner {
51744e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "3H");
51754e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
51764e1bc9a0SAchim Leubner }
51774e1bc9a0SAchim Leubner #endif
51784e1bc9a0SAchim Leubner /* get agContext */
51794e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
51804e1bc9a0SAchim Leubner /* get request from IOMap */
51814e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
51824e1bc9a0SAchim Leubner if (pRequest == agNULL)
51834e1bc9a0SAchim Leubner {
51844e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "3H");
51854e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
51864e1bc9a0SAchim Leubner }
51874e1bc9a0SAchim Leubner
51884e1bc9a0SAchim Leubner /* remove the request from IOMap */
51894e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
51904e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
51914e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
51924e1bc9a0SAchim Leubner
51934e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
51944e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
51954e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
51964e1bc9a0SAchim Leubner /* return the request to free pool */
51974e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
51984e1bc9a0SAchim Leubner {
51994e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: saving pRequest (%p) for later use\n", pRequest));
52004e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
52014e1bc9a0SAchim Leubner }
52024e1bc9a0SAchim Leubner else
52034e1bc9a0SAchim Leubner {
52044e1bc9a0SAchim Leubner /* return the request to free pool */
52054e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
52064e1bc9a0SAchim Leubner }
52074e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
52084e1bc9a0SAchim Leubner break;
52094e1bc9a0SAchim Leubner }
52104e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
52114e1bc9a0SAchim Leubner
52124e1bc9a0SAchim Leubner }
52134e1bc9a0SAchim Leubner
52144e1bc9a0SAchim Leubner switch (OpCode) /* OpCode */
52154e1bc9a0SAchim Leubner {
52164e1bc9a0SAchim Leubner
52174e1bc9a0SAchim Leubner case OPC_INB_KEK_MANAGEMENT:
52184e1bc9a0SAchim Leubner {
52194e1bc9a0SAchim Leubner bit32 flags = GenEventData.inbIOMBpayload[2];
52204e1bc9a0SAchim Leubner
52214e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: OPC_INB_KEK_MANAGEMENT 0x%x htag 0x%x flags 0x%x\n",OpCode, tag, flags));
52224e1bc9a0SAchim Leubner if (flags & 0xFF00) /* update and store*/
52234e1bc9a0SAchim Leubner {
52244e1bc9a0SAchim Leubner agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE;
52254e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE\n"));
52264e1bc9a0SAchim Leubner }
52274e1bc9a0SAchim Leubner else /* update */
52284e1bc9a0SAchim Leubner {
52294e1bc9a0SAchim Leubner agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE;
52304e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_KEK_UPDATE\n"));
52314e1bc9a0SAchim Leubner }
52324e1bc9a0SAchim Leubner agEvent.status = OSSA_INVALID_ENCRYPTION_SECURITY_MODE;
52334e1bc9a0SAchim Leubner si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
52344e1bc9a0SAchim Leubner agEvent.status = status;
52354e1bc9a0SAchim Leubner
52364e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: ossaHwCB OSSA_HW_EVENT_ENCRYPTION\n" ));
52374e1bc9a0SAchim Leubner ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void*)&agEvent, agContext);
52384e1bc9a0SAchim Leubner break;
52394e1bc9a0SAchim Leubner }
52404e1bc9a0SAchim Leubner case OPC_INB_OPR_MGMT:
52414e1bc9a0SAchim Leubner si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
52424e1bc9a0SAchim Leubner agEvent.status = status;
52434e1bc9a0SAchim Leubner agEvent.encryptOperation = OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT;
52444e1bc9a0SAchim Leubner
52454e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT\n" ));
52464e1bc9a0SAchim Leubner ossaOperatorManagementCB(agRoot, agContext, status, 0);
52474e1bc9a0SAchim Leubner break;
52484e1bc9a0SAchim Leubner case OPC_INB_SET_OPERATOR:
52494e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_SET_OPERATOR\n" ));
52504e1bc9a0SAchim Leubner ossaSetOperatorCB(agRoot,agContext,0xFF,0xFF );
52514e1bc9a0SAchim Leubner break;
52524e1bc9a0SAchim Leubner case OPC_INB_GET_OPERATOR:
52534e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_GET_OPERATOR\n" ));
52544e1bc9a0SAchim Leubner ossaGetOperatorCB(agRoot,agContext,0xFF,0xFF,0xFF,0xFF,agNULL );
52554e1bc9a0SAchim Leubner break;
52564e1bc9a0SAchim Leubner case OPC_INB_ENC_TEST_EXECUTE:
52574e1bc9a0SAchim Leubner si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
52584e1bc9a0SAchim Leubner agEvent.status = status;
52594e1bc9a0SAchim Leubner agEvent.encryptOperation = OSSA_HW_ENCRYPT_TEST_EXECUTE;
52604e1bc9a0SAchim Leubner
52614e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: OSSA_HW_ENCRYPT_TEST_EXECUTE\n" ));
52624e1bc9a0SAchim Leubner ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void*)&agEvent, agContext);
52634e1bc9a0SAchim Leubner break;
52644e1bc9a0SAchim Leubner default:
52654e1bc9a0SAchim Leubner SA_DBG1(("mpiGeneralEventRsp: MGMNT OpCode Not found 0x%x\n",OpCode ));
52664e1bc9a0SAchim Leubner ossaGeneralEvent(agRoot, status, agContext, GenEventData.inbIOMBpayload);
52674e1bc9a0SAchim Leubner break;
52684e1bc9a0SAchim Leubner }
52694e1bc9a0SAchim Leubner
52704e1bc9a0SAchim Leubner /* return value */
52714e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "3H");
52724e1bc9a0SAchim Leubner return ret;
52734e1bc9a0SAchim Leubner }
52744e1bc9a0SAchim Leubner
52754e1bc9a0SAchim Leubner /******************************************************************************/
52764e1bc9a0SAchim Leubner /*! \brief SPC MPI SSP Request Received Event (target mode)
52774e1bc9a0SAchim Leubner *
52784e1bc9a0SAchim Leubner * This function handles the SSP Request Received Event.
52794e1bc9a0SAchim Leubner *
52804e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
52814e1bc9a0SAchim Leubner * \param pMsg1 pointer of Message
52824e1bc9a0SAchim Leubner *
52834e1bc9a0SAchim Leubner * \return The read value
52844e1bc9a0SAchim Leubner *
52854e1bc9a0SAchim Leubner */
52864e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSSPReqReceivedNotify(agsaRoot_t * agRoot,agsaSSPReqReceivedNotify_t * pMsg1)52874e1bc9a0SAchim Leubner GLOBAL bit32 mpiSSPReqReceivedNotify(
52884e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
52894e1bc9a0SAchim Leubner agsaSSPReqReceivedNotify_t *pMsg1)
52904e1bc9a0SAchim Leubner {
52914e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
52924e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
52934e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
52944e1bc9a0SAchim Leubner bit32 deviceid, iniTagSSPIul, frameTypeHssa, TlrHdsa;
52954e1bc9a0SAchim Leubner
52964e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3J");
52974e1bc9a0SAchim Leubner /* convert endiness if necassary */
52984e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceid, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, deviceId));
52994e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &iniTagSSPIul, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, iniTagSSPIul));
53004e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &frameTypeHssa, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, frameTypeHssa));
53014e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &TlrHdsa, pMsg1, OSSA_OFFSET_OF(agsaSSPReqReceivedNotify_t, TlrHdsa));
53024e1bc9a0SAchim Leubner /* deviceId -> agDeviceHandle */
53034e1bc9a0SAchim Leubner pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
53044e1bc9a0SAchim Leubner
53054e1bc9a0SAchim Leubner if (agNULL == pDevice)
53064e1bc9a0SAchim Leubner {
53074e1bc9a0SAchim Leubner SA_DBG1(("mpiSSPReqReceivedNotify: warning!!! no deviceHandle is found"));
53084e1bc9a0SAchim Leubner }
53094e1bc9a0SAchim Leubner else
53104e1bc9a0SAchim Leubner {
53114e1bc9a0SAchim Leubner /* type punning only safe through char *. See gcc -fstrict_aliasing. */
53124e1bc9a0SAchim Leubner char * safe_type_pun = (char *)&(pMsg1->SSPIu[0]);
53134e1bc9a0SAchim Leubner if( pDevice->initiatorDevHandle.sdkData != agNULL)
53144e1bc9a0SAchim Leubner {
53154e1bc9a0SAchim Leubner ossaSSPReqReceived(agRoot, &(pDevice->initiatorDevHandle),
53164e1bc9a0SAchim Leubner (agsaFrameHandle_t *)safe_type_pun,
53174e1bc9a0SAchim Leubner (bit16)((iniTagSSPIul >> SHIFT16) & INITTAG_BITS),
53184e1bc9a0SAchim Leubner ((frameTypeHssa >> SHIFT24) & FRAME_TYPE) |
53194e1bc9a0SAchim Leubner ((TlrHdsa >> SHIFT16) & TLR_BITS),
53204e1bc9a0SAchim Leubner (iniTagSSPIul & SSPIUL_BITS));
53214e1bc9a0SAchim Leubner }else if( pDevice->targetDevHandle.sdkData != agNULL)
53224e1bc9a0SAchim Leubner {
53234e1bc9a0SAchim Leubner ossaSSPReqReceived(agRoot, &(pDevice->targetDevHandle),
53244e1bc9a0SAchim Leubner (agsaFrameHandle_t *)safe_type_pun,
53254e1bc9a0SAchim Leubner (bit16)((iniTagSSPIul >> SHIFT16) & INITTAG_BITS),
53264e1bc9a0SAchim Leubner ((frameTypeHssa >> SHIFT24) & FRAME_TYPE) |
53274e1bc9a0SAchim Leubner ((TlrHdsa >> SHIFT16) & TLR_BITS),
53284e1bc9a0SAchim Leubner (iniTagSSPIul & SSPIUL_BITS));
53294e1bc9a0SAchim Leubner }else
53304e1bc9a0SAchim Leubner {
53314e1bc9a0SAchim Leubner SA_ASSERT(0, "Device handle sdkData not set");
53324e1bc9a0SAchim Leubner }
53334e1bc9a0SAchim Leubner }
53344e1bc9a0SAchim Leubner
53354e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3J");
53364e1bc9a0SAchim Leubner return ret;
53374e1bc9a0SAchim Leubner }
53384e1bc9a0SAchim Leubner
53394e1bc9a0SAchim Leubner /******************************************************************************/
53404e1bc9a0SAchim Leubner /*! \brief SPC MPI Device Handle Arrived Event (target mode)
53414e1bc9a0SAchim Leubner *
53424e1bc9a0SAchim Leubner * This function handles the Device Handle Arrived Event.
53434e1bc9a0SAchim Leubner *
53444e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
53454e1bc9a0SAchim Leubner * \param pMsg1 pointer of Message
53464e1bc9a0SAchim Leubner *
53474e1bc9a0SAchim Leubner * \return The read value
53484e1bc9a0SAchim Leubner *
53494e1bc9a0SAchim Leubner */
53504e1bc9a0SAchim Leubner /*******************************************************************************/
mpiDeviceHandleArrived(agsaRoot_t * agRoot,agsaDeviceHandleArrivedNotify_t * pMsg1)53514e1bc9a0SAchim Leubner GLOBAL bit32 mpiDeviceHandleArrived(
53524e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
53534e1bc9a0SAchim Leubner agsaDeviceHandleArrivedNotify_t *pMsg1)
53544e1bc9a0SAchim Leubner {
53554e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
53564e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
53574e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
53584e1bc9a0SAchim Leubner agsaPort_t *pPort;
53594e1bc9a0SAchim Leubner agsaSASDeviceInfo_t pDeviceInfo;
53604e1bc9a0SAchim Leubner agsaPortContext_t *agPortContext;
53614e1bc9a0SAchim Leubner agsaSASIdentify_t remoteIdentify;
53624e1bc9a0SAchim Leubner bit32 CTag;
53634e1bc9a0SAchim Leubner bit32 FwdDeviceId;
53644e1bc9a0SAchim Leubner bit32 ProtConrPortId;
53654e1bc9a0SAchim Leubner bit32 portId;
53664e1bc9a0SAchim Leubner bit32 conRate;
53674e1bc9a0SAchim Leubner bit8 i, protocol, dTypeSRate;
53684e1bc9a0SAchim Leubner bit32 HostAssignedId;
53694e1bc9a0SAchim Leubner
53704e1bc9a0SAchim Leubner if(saRoot == agNULL)
53714e1bc9a0SAchim Leubner {
53724e1bc9a0SAchim Leubner SA_ASSERT((saRoot != agNULL), "saRoot");
53734e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
53744e1bc9a0SAchim Leubner }
53754e1bc9a0SAchim Leubner
53764e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3L");
53774e1bc9a0SAchim Leubner /* convert endiness if necassary */
53784e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &CTag, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleArrivedNotify_t, CTag));
53794e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &FwdDeviceId, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleArrivedNotify_t, HostAssignedIdFwdDeviceId));
53804e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &ProtConrPortId, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleArrivedNotify_t, ProtConrPortId));
53814e1bc9a0SAchim Leubner
53824e1bc9a0SAchim Leubner
53834e1bc9a0SAchim Leubner if(smIS_SPCV(agRoot))
53844e1bc9a0SAchim Leubner {
53854e1bc9a0SAchim Leubner portId = ProtConrPortId & PortId_V_MASK;
53864e1bc9a0SAchim Leubner conRate = (ProtConrPortId & Conrate_V_MASK ) >> Conrate_V_SHIFT;
53874e1bc9a0SAchim Leubner
53884e1bc9a0SAchim Leubner HostAssignedId = (FwdDeviceId & 0xFFFF0000) >> SHIFT16;
53894e1bc9a0SAchim Leubner if(HostAssignedId)
53904e1bc9a0SAchim Leubner {
53914e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceHandleArrived: HostAssignedId 0x%X\n",HostAssignedId));
53924e1bc9a0SAchim Leubner }
53934e1bc9a0SAchim Leubner }
53944e1bc9a0SAchim Leubner else
53954e1bc9a0SAchim Leubner {
53964e1bc9a0SAchim Leubner portId = ProtConrPortId & PortId_SPC_MASK;
53974e1bc9a0SAchim Leubner conRate = (ProtConrPortId & Conrate_SPC_MASK ) >> Conrate_SPC_SHIFT;
53984e1bc9a0SAchim Leubner }
53994e1bc9a0SAchim Leubner protocol =(bit8)((ProtConrPortId & PROTOCOL_BITS ) >> PROTOCOL_SHIFT);
54004e1bc9a0SAchim Leubner
54014e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceHandleArrived: New Port portID %d deviceid 0x%X conRate 0x%X protocol 0x%X\n",portId, FwdDeviceId,conRate,protocol));
54024e1bc9a0SAchim Leubner
54034e1bc9a0SAchim Leubner /* Port Map */
54044e1bc9a0SAchim Leubner agPortContext = saRoot->PortMap[portId].PortContext;
54054e1bc9a0SAchim Leubner if (agNULL == agPortContext)
54064e1bc9a0SAchim Leubner {
54074e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_PORT_LOCK);
54084e1bc9a0SAchim Leubner /* new port */
54094e1bc9a0SAchim Leubner /* Acquire port list lock */
54104e1bc9a0SAchim Leubner /* Allocate a free port */
54114e1bc9a0SAchim Leubner pPort = (agsaPort_t *) saLlistGetHead(&(saRoot->freePorts));
54124e1bc9a0SAchim Leubner if (agNULL != pPort)
54134e1bc9a0SAchim Leubner {
54144e1bc9a0SAchim Leubner saLlistRemove(&(saRoot->freePorts), &(pPort->linkNode));
54154e1bc9a0SAchim Leubner
54164e1bc9a0SAchim Leubner /* setup the port data structure */
54174e1bc9a0SAchim Leubner pPort->portContext.osData = agNULL;
54184e1bc9a0SAchim Leubner pPort->portContext.sdkData = pPort;
54194e1bc9a0SAchim Leubner pPort->tobedeleted = agFALSE;
54204e1bc9a0SAchim Leubner /* Add to valid port list */
54214e1bc9a0SAchim Leubner saLlistAdd(&(saRoot->validPorts), &(pPort->linkNode));
54224e1bc9a0SAchim Leubner /* Release port list lock */
54234e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
54244e1bc9a0SAchim Leubner
54254e1bc9a0SAchim Leubner /* Setup portMap based on portId */
54264e1bc9a0SAchim Leubner saRoot->PortMap[portId].PortID = portId;
54274e1bc9a0SAchim Leubner saRoot->PortMap[portId].PortContext = &(pPort->portContext);
54284e1bc9a0SAchim Leubner saRoot->PortMap[portId].PortStatus &= ~PORT_INVALIDATING;
54294e1bc9a0SAchim Leubner pPort->portId = portId;
54304e1bc9a0SAchim Leubner
54314e1bc9a0SAchim Leubner pPort->status &= ~PORT_INVALIDATING;
54324e1bc9a0SAchim Leubner SA_DBG3(("mpiDeviceHandleArrived: ~PORT_INVALIDATING New Port portID %d PortContext %p\n",saRoot->PortMap[pPort->portId].PortID , &pPort->portContext));
54334e1bc9a0SAchim Leubner }
54344e1bc9a0SAchim Leubner else
54354e1bc9a0SAchim Leubner {
54364e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
54374e1bc9a0SAchim Leubner SA_DBG2(("mpiDeviceHandleArrived:Port NULL\n"));
54384e1bc9a0SAchim Leubner /* pPort is agNULL*/
54394e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3L");
54404e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
54414e1bc9a0SAchim Leubner }
54424e1bc9a0SAchim Leubner }
54434e1bc9a0SAchim Leubner else
54444e1bc9a0SAchim Leubner {
54454e1bc9a0SAchim Leubner /* exist port */
54464e1bc9a0SAchim Leubner pPort = (agsaPort_t *) (agPortContext->sdkData);
54474e1bc9a0SAchim Leubner pPort->status &= ~PORT_INVALIDATING;
54484e1bc9a0SAchim Leubner pPort->portId =portId;
54494e1bc9a0SAchim Leubner saRoot->PortMap[pPort->portId].PortStatus &= ~PORT_INVALIDATING;
54504e1bc9a0SAchim Leubner
54514e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceHandleArrived: ~PORT_INVALIDATING Old port portID %d PortContext %p\n", portId, &pPort->portContext));
54524e1bc9a0SAchim Leubner
54534e1bc9a0SAchim Leubner }
54544e1bc9a0SAchim Leubner /* build Device Information structure */
54554e1bc9a0SAchim Leubner si_memset(&pDeviceInfo, 0, sizeof(agsaSASDeviceInfo_t));
54564e1bc9a0SAchim Leubner if (ProtConrPortId & PROTOCOL_BITS)
54574e1bc9a0SAchim Leubner {
54584e1bc9a0SAchim Leubner protocol = SA_IDFRM_SSP_BIT; /* SSP */
54594e1bc9a0SAchim Leubner pDeviceInfo.commonDevInfo.devType_S_Rate = (bit8)(conRate | 0x10);
54604e1bc9a0SAchim Leubner
54614e1bc9a0SAchim Leubner }
54624e1bc9a0SAchim Leubner else
54634e1bc9a0SAchim Leubner {
54644e1bc9a0SAchim Leubner protocol = SA_IDFRM_SMP_BIT; /* SMP */
54654e1bc9a0SAchim Leubner pDeviceInfo.commonDevInfo.devType_S_Rate = (bit8)conRate;
54664e1bc9a0SAchim Leubner }
54674e1bc9a0SAchim Leubner pDeviceInfo.initiator_ssp_stp_smp = protocol;
54684e1bc9a0SAchim Leubner pDeviceInfo.numOfPhys = 1;
54694e1bc9a0SAchim Leubner pDeviceInfo.commonDevInfo.sasAddressHi[0] = pMsg1->sasAddrHi[0];
54704e1bc9a0SAchim Leubner pDeviceInfo.commonDevInfo.sasAddressHi[1] = pMsg1->sasAddrHi[1];
54714e1bc9a0SAchim Leubner pDeviceInfo.commonDevInfo.sasAddressHi[2] = pMsg1->sasAddrHi[2];
54724e1bc9a0SAchim Leubner pDeviceInfo.commonDevInfo.sasAddressHi[3] = pMsg1->sasAddrHi[3];
54734e1bc9a0SAchim Leubner pDeviceInfo.commonDevInfo.sasAddressLo[0] = pMsg1->sasAddrLow[0];
54744e1bc9a0SAchim Leubner pDeviceInfo.commonDevInfo.sasAddressLo[1] = pMsg1->sasAddrLow[1];
54754e1bc9a0SAchim Leubner pDeviceInfo.commonDevInfo.sasAddressLo[2] = pMsg1->sasAddrLow[2];
54764e1bc9a0SAchim Leubner pDeviceInfo.commonDevInfo.sasAddressLo[3] = pMsg1->sasAddrLow[3];
54774e1bc9a0SAchim Leubner pDeviceInfo.commonDevInfo.flag = 0;
54784e1bc9a0SAchim Leubner pDeviceInfo.commonDevInfo.it_NexusTimeout = ITL_TO_DEFAULT;
54794e1bc9a0SAchim Leubner
54804e1bc9a0SAchim Leubner /* deviceId -> agDeviceHandle */
54814e1bc9a0SAchim Leubner pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceHandle;
54824e1bc9a0SAchim Leubner
54834e1bc9a0SAchim Leubner if (agNULL == pDevice)
54844e1bc9a0SAchim Leubner {
54854e1bc9a0SAchim Leubner /* new device */
54864e1bc9a0SAchim Leubner si_memset(&remoteIdentify, 0, sizeof(agsaSASIdentify_t));
54874e1bc9a0SAchim Leubner for (i=0;i<4;i++)
54884e1bc9a0SAchim Leubner {
54894e1bc9a0SAchim Leubner remoteIdentify.sasAddressHi[i] = pMsg1->sasAddrHi[i];
54904e1bc9a0SAchim Leubner remoteIdentify.sasAddressLo[i] = pMsg1->sasAddrLow[i];
54914e1bc9a0SAchim Leubner }
54924e1bc9a0SAchim Leubner remoteIdentify.deviceType_addressFrameType = (bit8)(pDeviceInfo.commonDevInfo.devType_S_Rate & 0xC0);
54934e1bc9a0SAchim Leubner dTypeSRate = pDeviceInfo.commonDevInfo.devType_S_Rate;
54944e1bc9a0SAchim Leubner /* get Device from free Device List */
54954e1bc9a0SAchim Leubner pDevice = siPortSASDeviceAdd(agRoot, pPort, remoteIdentify, agTRUE, SMP_TO_DEFAULT, ITL_TO_DEFAULT, 0, dTypeSRate, 0);
54964e1bc9a0SAchim Leubner if (agNULL == pDevice)
54974e1bc9a0SAchim Leubner {
54984e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceHandleArrived: Device Handle is NULL, Out of Resources Error.\n"));
54994e1bc9a0SAchim Leubner }
55004e1bc9a0SAchim Leubner else
55014e1bc9a0SAchim Leubner {
55024e1bc9a0SAchim Leubner bit32 AccStatus = 0;
55034e1bc9a0SAchim Leubner bit32 SaveId = FwdDeviceId & 0xFFFF;
55044e1bc9a0SAchim Leubner /* mapping the device handle and device id */
55054e1bc9a0SAchim Leubner saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceIdFromFW = FwdDeviceId;
55064e1bc9a0SAchim Leubner saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceHandle = (void *)pDevice;
55074e1bc9a0SAchim Leubner pDevice->DeviceMapIndex = FwdDeviceId;
55084e1bc9a0SAchim Leubner SA_DBG2(("mpiDeviceHandleArrived: New deviceID 0x%x Device Context %p DeviceTypeSRate 0x%x\n", FwdDeviceId, pDevice, dTypeSRate));
55094e1bc9a0SAchim Leubner
55104e1bc9a0SAchim Leubner /* Call Back */
55114e1bc9a0SAchim Leubner AccStatus = ossaDeviceHandleAccept(agRoot, &(pDevice->initiatorDevHandle), &pDeviceInfo, agPortContext,&FwdDeviceId );
55124e1bc9a0SAchim Leubner
55134e1bc9a0SAchim Leubner HostAssignedId = (FwdDeviceId & 0xFFFF0000) >> SHIFT16;
55144e1bc9a0SAchim Leubner if(HostAssignedId)
55154e1bc9a0SAchim Leubner {
55164e1bc9a0SAchim Leubner if( SaveId == (FwdDeviceId & 0xFFFF) )
55174e1bc9a0SAchim Leubner {
55184e1bc9a0SAchim Leubner
55194e1bc9a0SAchim Leubner saRoot->DeviceMap[FwdDeviceId & DEVICE_ID_BITS].DeviceIdFromFW = FwdDeviceId;
55204e1bc9a0SAchim Leubner pDevice->DeviceMapIndex = FwdDeviceId;
55214e1bc9a0SAchim Leubner
55224e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceHandleArrived:FwdDeviceId 0x%x HostAssignedId 0x%x\n",FwdDeviceId,HostAssignedId));
55234e1bc9a0SAchim Leubner }
55244e1bc9a0SAchim Leubner else
55254e1bc9a0SAchim Leubner {
55264e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceHandleArrived:Id mangled expect 0x%x Got 0x%x\n",SaveId, (FwdDeviceId & 0xFFFF)));
55274e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
55284e1bc9a0SAchim Leubner }
55294e1bc9a0SAchim Leubner }
55304e1bc9a0SAchim Leubner
55314e1bc9a0SAchim Leubner /* get AWT flag and ITLN_TMO value */
55324e1bc9a0SAchim Leubner
55334e1bc9a0SAchim Leubner if(AccStatus == OSSA_RC_ACCEPT )
55344e1bc9a0SAchim Leubner {
55354e1bc9a0SAchim Leubner /* build DEVICE_HANDLE_ACCEPT IOMB and send to SPC with action=accept */
55364e1bc9a0SAchim Leubner mpiDevHandleAcceptCmd(agRoot, agNULL, CTag, FwdDeviceId, 0, pDeviceInfo.commonDevInfo.flag, pDeviceInfo.commonDevInfo.it_NexusTimeout, 0);
55374e1bc9a0SAchim Leubner }
55384e1bc9a0SAchim Leubner else
55394e1bc9a0SAchim Leubner {
55404e1bc9a0SAchim Leubner mpiDevHandleAcceptCmd(agRoot, agNULL, CTag, FwdDeviceId, 1, pDeviceInfo.commonDevInfo.flag, pDeviceInfo.commonDevInfo.it_NexusTimeout, 0);
55414e1bc9a0SAchim Leubner }
55424e1bc9a0SAchim Leubner }
55434e1bc9a0SAchim Leubner }
55444e1bc9a0SAchim Leubner
55454e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceHandleArrived Device 0x%08X flag 0x%08X %s WWID= %02x%02x%02x%02x:%02x%02x%02x%02x, %s\n",
55464e1bc9a0SAchim Leubner FwdDeviceId,
55474e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag,
55484e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x20 ? "SATA DA" :
55494e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x10 ? "SSP/SMP" :
55504e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF0) == 0x0 ? " STP " : "Unknown",
55514e1bc9a0SAchim Leubner
55524e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[3],
55534e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[2],
55544e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[1],
55554e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[0],
55564e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[3],
55574e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[2],
55584e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[1],
55594e1bc9a0SAchim Leubner pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[0],
55604e1bc9a0SAchim Leubner
55614e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 8 ? " 1.5G" :
55624e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 9 ? " 3.0G" :
55634e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 10 ? " 6.0G" :
55644e1bc9a0SAchim Leubner (pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate & 0xF) == 11 ? "12.0G" : "????" ));
55654e1bc9a0SAchim Leubner
55664e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3L");
55674e1bc9a0SAchim Leubner return ret;
55684e1bc9a0SAchim Leubner }
55694e1bc9a0SAchim Leubner
55704e1bc9a0SAchim Leubner /******************************************************************************/
55714e1bc9a0SAchim Leubner /*! \brief Get Time Stamp Response
55724e1bc9a0SAchim Leubner *
55734e1bc9a0SAchim Leubner * This routine handles the response of Get Time Stamp Command
55744e1bc9a0SAchim Leubner *
55754e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
55764e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
55774e1bc9a0SAchim Leubner *
55784e1bc9a0SAchim Leubner * \return sucess or fail
55794e1bc9a0SAchim Leubner *
55804e1bc9a0SAchim Leubner */
55814e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetTimeStampRsp(agsaRoot_t * agRoot,agsaGetTimeStampRsp_t * pIomb)55824e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetTimeStampRsp(
55834e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
55844e1bc9a0SAchim Leubner agsaGetTimeStampRsp_t *pIomb
55854e1bc9a0SAchim Leubner )
55864e1bc9a0SAchim Leubner {
55874e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
55884e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
55894e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
55904e1bc9a0SAchim Leubner agsaContext_t *agContext;
55914e1bc9a0SAchim Leubner bit32 tag, timeStampLower, timeStampUpper;
55924e1bc9a0SAchim Leubner
55934e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3M");
55944e1bc9a0SAchim Leubner
55954e1bc9a0SAchim Leubner SA_DBG3(("mpiGetTimeStampRsp: HTAG=0x%x\n", pIomb->tag));
55964e1bc9a0SAchim Leubner
55974e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetTimeStampRsp_t, tag));
55984e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &timeStampLower, pIomb, OSSA_OFFSET_OF(agsaGetTimeStampRsp_t, timeStampLower));
55994e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &timeStampUpper, pIomb, OSSA_OFFSET_OF(agsaGetTimeStampRsp_t, timeStampUpper));
56004e1bc9a0SAchim Leubner /* get request from IOMap */
56014e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
56024e1bc9a0SAchim Leubner if (agNULL == pRequest)
56034e1bc9a0SAchim Leubner {
56044e1bc9a0SAchim Leubner SA_DBG1(("mpiGetTimeStampRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x\n", tag));
56054e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3M");
56064e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
56074e1bc9a0SAchim Leubner }
56084e1bc9a0SAchim Leubner
56094e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
56104e1bc9a0SAchim Leubner /* remove the request from IOMap */
56114e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
56124e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
56134e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
56144e1bc9a0SAchim Leubner
56154e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
56164e1bc9a0SAchim Leubner
56174e1bc9a0SAchim Leubner SA_DBG3(("mpiGetTimeStampRsp: timeStampLower 0x%x timeStampUpper 0x%x\n", timeStampLower, timeStampUpper));
56184e1bc9a0SAchim Leubner
56194e1bc9a0SAchim Leubner ossaGetTimeStampCB(agRoot, agContext, timeStampLower, timeStampUpper);
56204e1bc9a0SAchim Leubner
56214e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
56224e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
56234e1bc9a0SAchim Leubner /* return the request to free pool */
56244e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
56254e1bc9a0SAchim Leubner {
56264e1bc9a0SAchim Leubner SA_DBG1(("mpiGetTimeStampRsp: saving pRequest (%p) for later use\n", pRequest));
56274e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
56284e1bc9a0SAchim Leubner }
56294e1bc9a0SAchim Leubner else
56304e1bc9a0SAchim Leubner {
56314e1bc9a0SAchim Leubner /* return the request to free pool */
56324e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
56334e1bc9a0SAchim Leubner }
56344e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
56354e1bc9a0SAchim Leubner
56364e1bc9a0SAchim Leubner /* return value */
56374e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3M");
56384e1bc9a0SAchim Leubner return ret;
56394e1bc9a0SAchim Leubner }
56404e1bc9a0SAchim Leubner
56414e1bc9a0SAchim Leubner /******************************************************************************/
56424e1bc9a0SAchim Leubner /*! \brief SAS HW Event Ack Response
56434e1bc9a0SAchim Leubner *
56444e1bc9a0SAchim Leubner * This routine handles the response of SAS HW Event Ack Command
56454e1bc9a0SAchim Leubner *
56464e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
56474e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
56484e1bc9a0SAchim Leubner *
56494e1bc9a0SAchim Leubner * \return sucess or fail
56504e1bc9a0SAchim Leubner *
56514e1bc9a0SAchim Leubner */
56524e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSASHwEventAckRsp(agsaRoot_t * agRoot,agsaSASHwEventAckRsp_t * pIomb)56534e1bc9a0SAchim Leubner GLOBAL bit32 mpiSASHwEventAckRsp(
56544e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
56554e1bc9a0SAchim Leubner agsaSASHwEventAckRsp_t *pIomb
56564e1bc9a0SAchim Leubner )
56574e1bc9a0SAchim Leubner {
56584e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
56594e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
56604e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
56614e1bc9a0SAchim Leubner agsaContext_t *agContext;
56624e1bc9a0SAchim Leubner agsaPort_t *pPort;
56634e1bc9a0SAchim Leubner bit32 tag, status;
56644e1bc9a0SAchim Leubner
56654e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2N");
56664e1bc9a0SAchim Leubner
56674e1bc9a0SAchim Leubner SA_DBG2(("mpiSASHwEventAckRsp: Htag=0x%x %p\n", pIomb->tag,pIomb));
56684e1bc9a0SAchim Leubner
56694e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSASHwEventAckRsp_t, tag));
56704e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSASHwEventAckRsp_t, status));
56714e1bc9a0SAchim Leubner /* get request from IOMap */
56724e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
56734e1bc9a0SAchim Leubner if (agNULL == pRequest)
56744e1bc9a0SAchim Leubner {
56754e1bc9a0SAchim Leubner SA_DBG1(("mpiSASHwEventAckRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x Status=0x%x\n", tag, status));
56764e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2N");
56774e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
56784e1bc9a0SAchim Leubner }
56794e1bc9a0SAchim Leubner
56804e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
56814e1bc9a0SAchim Leubner /* remove the request from IOMap */
56824e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
56834e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
56844e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
56854e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
56864e1bc9a0SAchim Leubner
56874e1bc9a0SAchim Leubner SA_DBG1(("mpiSASHwEventAckRsp: status 0x%x Htag=0x%x HwAckType=0x%x\n",status,pIomb->tag,pRequest->HwAckType ));
56884e1bc9a0SAchim Leubner
56894e1bc9a0SAchim Leubner ossaHwEventAckCB(agRoot, agContext, status);
56904e1bc9a0SAchim Leubner
56914e1bc9a0SAchim Leubner pPort = pRequest->pPort;
56924e1bc9a0SAchim Leubner if (agNULL != pPort)
56934e1bc9a0SAchim Leubner {
56944e1bc9a0SAchim Leubner SA_DBG1(("mpiSASHwEventAckRsp: pPort %p tobedeleted %d\n", pPort, pPort->tobedeleted));
56954e1bc9a0SAchim Leubner if (pPort->status & PORT_INVALIDATING && pPort->tobedeleted )
56964e1bc9a0SAchim Leubner {
56974e1bc9a0SAchim Leubner SA_DBG1(("mpiSASHwEventAckRsp: PORT_INVALIDATING portInvalid portID %d pPort %p, nulling out PortContext\n", pPort->portId, pPort));
56984e1bc9a0SAchim Leubner /* invalid the port */
56994e1bc9a0SAchim Leubner siPortInvalid(agRoot, pPort);
57004e1bc9a0SAchim Leubner /* map out the portmap */
57014e1bc9a0SAchim Leubner saRoot->PortMap[pPort->portId].PortContext = agNULL;
57024e1bc9a0SAchim Leubner saRoot->PortMap[pPort->portId].PortID = PORT_MARK_OFF;
57034e1bc9a0SAchim Leubner saRoot->PortMap[pPort->portId].PortStatus |= PORT_INVALIDATING;
57044e1bc9a0SAchim Leubner }
57054e1bc9a0SAchim Leubner else
57064e1bc9a0SAchim Leubner {
57074e1bc9a0SAchim Leubner SA_DBG1(("mpiSASHwEventAckRsp:pPort->status 0x%x Htag=0x%x %p\n",pPort->status, pIomb->tag,pIomb));
57084e1bc9a0SAchim Leubner }
57094e1bc9a0SAchim Leubner }
57104e1bc9a0SAchim Leubner else
57114e1bc9a0SAchim Leubner {
57124e1bc9a0SAchim Leubner SA_DBG1(("mpiSASHwEventAckRsp: pPort is NULL, no portId, HTag=0x%x\n", tag));
57134e1bc9a0SAchim Leubner }
57144e1bc9a0SAchim Leubner
57154e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
57164e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
57174e1bc9a0SAchim Leubner /* return the request to free pool */
57184e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
57194e1bc9a0SAchim Leubner {
57204e1bc9a0SAchim Leubner SA_DBG1(("mpiSASHwEventAckRsp: saving pRequest (%p) for later use\n", pRequest));
57214e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
57224e1bc9a0SAchim Leubner }
57234e1bc9a0SAchim Leubner else
57244e1bc9a0SAchim Leubner {
57254e1bc9a0SAchim Leubner /* return the request to free pool */
57264e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
57274e1bc9a0SAchim Leubner }
57284e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
57294e1bc9a0SAchim Leubner
57304e1bc9a0SAchim Leubner /* return value */
57314e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2N");
57324e1bc9a0SAchim Leubner return ret;
57334e1bc9a0SAchim Leubner }
57344e1bc9a0SAchim Leubner
57354e1bc9a0SAchim Leubner /******************************************************************************/
57364e1bc9a0SAchim Leubner /*! \brief Port Control Response
57374e1bc9a0SAchim Leubner *
57384e1bc9a0SAchim Leubner * This routine handles the response of SAS HW Event Ack Command
57394e1bc9a0SAchim Leubner *
57404e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
57414e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
57424e1bc9a0SAchim Leubner *
57434e1bc9a0SAchim Leubner * \return sucess or fail
57444e1bc9a0SAchim Leubner *
57454e1bc9a0SAchim Leubner */
57464e1bc9a0SAchim Leubner /*******************************************************************************/
mpiPortControlRsp(agsaRoot_t * agRoot,agsaPortControlRsp_t * pIomb)57474e1bc9a0SAchim Leubner GLOBAL bit32 mpiPortControlRsp(
57484e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
57494e1bc9a0SAchim Leubner agsaPortControlRsp_t *pIomb
57504e1bc9a0SAchim Leubner )
57514e1bc9a0SAchim Leubner {
57524e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
57534e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
57544e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest = agNULL;
57554e1bc9a0SAchim Leubner agsaContext_t *agContext = agNULL;
57564e1bc9a0SAchim Leubner agsaPortContext_t *agPortContext = agNULL;
57574e1bc9a0SAchim Leubner bit32 tag;
57584e1bc9a0SAchim Leubner bit32 port =0;
57594e1bc9a0SAchim Leubner bit32 operation =0;
57604e1bc9a0SAchim Leubner bit32 status =0;
57614e1bc9a0SAchim Leubner bit32 portState =0;
57624e1bc9a0SAchim Leubner bit32 portOperation =0;
57634e1bc9a0SAchim Leubner
57644e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3O");
57654e1bc9a0SAchim Leubner
57664e1bc9a0SAchim Leubner SA_DBG2(("mpiPortControlRsp: HTag=0x%x\n", pIomb->tag));
57674e1bc9a0SAchim Leubner
57684e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t, tag));
57694e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &operation, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t, portOPPortId));
57704e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t, status));
57714e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &portState, pIomb, OSSA_OFFSET_OF(agsaPortControlRsp_t,rsvdPortState ));
57724e1bc9a0SAchim Leubner
57734e1bc9a0SAchim Leubner /* get request from IOMap */
57744e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
57754e1bc9a0SAchim Leubner if (agNULL == pRequest)
57764e1bc9a0SAchim Leubner {
57774e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x Status=0x%x\n", tag, status));
57784e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3O");
57794e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
57804e1bc9a0SAchim Leubner }
57814e1bc9a0SAchim Leubner
57824e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
57834e1bc9a0SAchim Leubner /* remove the request from IOMap */
57844e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
57854e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
57864e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
57874e1bc9a0SAchim Leubner
57884e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
57894e1bc9a0SAchim Leubner
57904e1bc9a0SAchim Leubner if(!pRequest->valid)
57914e1bc9a0SAchim Leubner {
57924e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: pRequest->valid %d not set\n", pRequest->valid));
57934e1bc9a0SAchim Leubner }
57944e1bc9a0SAchim Leubner
57954e1bc9a0SAchim Leubner SA_DBG2(("mpiPortControlRsp: pRequest->completionCB %p\n", pRequest->completionCB));
57964e1bc9a0SAchim Leubner
57974e1bc9a0SAchim Leubner port = operation & PORTID_MASK;
57984e1bc9a0SAchim Leubner
57994e1bc9a0SAchim Leubner if(port < AGSA_MAX_VALID_PORTS )
58004e1bc9a0SAchim Leubner {
58014e1bc9a0SAchim Leubner SA_DBG2(("mpiPortControlRsp: PortID 0x%x PortStatus 0x%x PortContext %p\n",
58024e1bc9a0SAchim Leubner saRoot->PortMap[port].PortID,
58034e1bc9a0SAchim Leubner saRoot->PortMap[port].PortStatus,
58044e1bc9a0SAchim Leubner saRoot->PortMap[port].PortContext));
58054e1bc9a0SAchim Leubner
58064e1bc9a0SAchim Leubner agPortContext = (agsaPortContext_t *)saRoot->PortMap[port].PortContext;
58074e1bc9a0SAchim Leubner }
58084e1bc9a0SAchim Leubner 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));
58094e1bc9a0SAchim Leubner agPortContext = (agsaPortContext_t *)saRoot->PortMap[operation & PORTID_MASK].PortContext;
58104e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: agPortContext %p\n",agPortContext ));
58114e1bc9a0SAchim Leubner
58124e1bc9a0SAchim Leubner
58134e1bc9a0SAchim Leubner SA_DBG2(("mpiPortControlRsp: portID 0x%x status 0x%x\n", (operation & PORTID_MASK), status));
58144e1bc9a0SAchim Leubner
58154e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: portID 0x%x status 0x%x agPortContext %p\n",port, status,agPortContext));
58164e1bc9a0SAchim Leubner
58174e1bc9a0SAchim Leubner portOperation = (((operation & LOCAL_PHY_OP_BITS) >> SHIFT8) | (portState << SHIFT28) );
58184e1bc9a0SAchim Leubner
58194e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: portState 0x%x operation 0x%x portOperation 0x%x\n",portState, operation,portOperation ));
58204e1bc9a0SAchim Leubner
58214e1bc9a0SAchim Leubner switch(portOperation)
58224e1bc9a0SAchim Leubner {
58234e1bc9a0SAchim Leubner case AGSA_PORT_SET_SMP_PHY_WIDTH:
58244e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: AGSA_PORT_SET_SMP_PHY_WIDTH operation 0x%x\n",operation ));
58254e1bc9a0SAchim Leubner break;
58264e1bc9a0SAchim Leubner case AGSA_PORT_SET_PORT_RECOVERY_TIME:
58274e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: AGSA_PORT_SET_PORT_RECOVERY_TIME operation 0x%x\n",operation ));
58284e1bc9a0SAchim Leubner break;
58294e1bc9a0SAchim Leubner case AGSA_PORT_IO_ABORT:
58304e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: AGSA_PORT_IO_ABORT operation 0x%x\n",operation ));
58314e1bc9a0SAchim Leubner break;
58324e1bc9a0SAchim Leubner case AGSA_PORT_SET_PORT_RESET_TIME:
58334e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: AGSA_PORT_SET_PORT_RESET_TIME operation 0x%x\n",operation ));
58344e1bc9a0SAchim Leubner break;
58354e1bc9a0SAchim Leubner case AGSA_PORT_HARD_RESET:
58364e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: AGSA_PORT_HARD_RESET operation 0x%x\n",operation ));
58374e1bc9a0SAchim Leubner break;
58384e1bc9a0SAchim Leubner case AGSA_PORT_CLEAN_UP:
58394e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: AGSA_PORT_CLEAN_UP operation 0x%x\n",operation ));
58404e1bc9a0SAchim Leubner break;
58414e1bc9a0SAchim Leubner case AGSA_STOP_PORT_RECOVERY_TIMER:
58424e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: AGSA_STOP_PORT_RECOVERY_TIMER operation 0x%x\n",operation ));
58434e1bc9a0SAchim Leubner break;
58444e1bc9a0SAchim Leubner default:
58454e1bc9a0SAchim Leubner {
58464e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: Unknown operation 0x%x\n",operation ));
58474e1bc9a0SAchim Leubner }
58484e1bc9a0SAchim Leubner }
58494e1bc9a0SAchim Leubner
58504e1bc9a0SAchim Leubner ossaPortControlCB(agRoot, agContext, agPortContext, portOperation, status);
58514e1bc9a0SAchim Leubner
58524e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
58534e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
58544e1bc9a0SAchim Leubner /* return the request to free pool */
58554e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
58564e1bc9a0SAchim Leubner {
58574e1bc9a0SAchim Leubner SA_DBG1(("mpiPortControlRsp: saving pRequest (%p) for later use\n", pRequest));
58584e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
58594e1bc9a0SAchim Leubner }
58604e1bc9a0SAchim Leubner else
58614e1bc9a0SAchim Leubner {
58624e1bc9a0SAchim Leubner /* return the request to free pool */
58634e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
58644e1bc9a0SAchim Leubner }
58654e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
58664e1bc9a0SAchim Leubner
58674e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3O");
58684e1bc9a0SAchim Leubner /* return value */
58694e1bc9a0SAchim Leubner return ret;
58704e1bc9a0SAchim Leubner }
58714e1bc9a0SAchim Leubner
58724e1bc9a0SAchim Leubner /******************************************************************************/
58734e1bc9a0SAchim Leubner /*! \brief SPC MPI SMP ABORT Response
58744e1bc9a0SAchim Leubner *
58754e1bc9a0SAchim Leubner * This function handles the SMP Abort Response.
58764e1bc9a0SAchim Leubner *
58774e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
58784e1bc9a0SAchim Leubner * \param pIomb pointer of Message
58794e1bc9a0SAchim Leubner *
58804e1bc9a0SAchim Leubner * \return The read value
58814e1bc9a0SAchim Leubner *
58824e1bc9a0SAchim Leubner */
58834e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSMPAbortRsp(agsaRoot_t * agRoot,agsaSMPAbortRsp_t * pIomb)58844e1bc9a0SAchim Leubner GLOBAL bit32 mpiSMPAbortRsp(
58854e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
58864e1bc9a0SAchim Leubner agsaSMPAbortRsp_t *pIomb
58874e1bc9a0SAchim Leubner )
58884e1bc9a0SAchim Leubner {
58894e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
58904e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
58914e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
58924e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
58934e1bc9a0SAchim Leubner bit32 tag, scp, status;
58944e1bc9a0SAchim Leubner
58954e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3P");
58964e1bc9a0SAchim Leubner
58974e1bc9a0SAchim Leubner SA_DBG3(("mpiSMPAbortRsp: HTag=0x%x Status=0x%x\n", pIomb->tag, pIomb->status));
58984e1bc9a0SAchim Leubner
58994e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSMPAbortRsp_t, tag));
59004e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSMPAbortRsp_t, status));
59014e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &scp, pIomb, OSSA_OFFSET_OF(agsaSMPAbortRsp_t, scp));
59024e1bc9a0SAchim Leubner
59034e1bc9a0SAchim Leubner /* get IORequest from IOMap */
59044e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
59054e1bc9a0SAchim Leubner
59064e1bc9a0SAchim Leubner if (agNULL == pRequest)
59074e1bc9a0SAchim Leubner {
59084e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPAbortRsp: pRequest is NULL, HTag=0x%x Status=0x%x\n", pIomb->tag, pIomb->status));
59094e1bc9a0SAchim Leubner SA_ASSERT((pRequest), "pRequest");
59104e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3P");
59114e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
59124e1bc9a0SAchim Leubner }
59134e1bc9a0SAchim Leubner
59144e1bc9a0SAchim Leubner if ( agTRUE == pRequest->valid )
59154e1bc9a0SAchim Leubner {
59164e1bc9a0SAchim Leubner pDevice = pRequest->pDevice;
59174e1bc9a0SAchim Leubner SA_ASSERT((pRequest->pDevice), "pRequest->pDevice");
59184e1bc9a0SAchim Leubner
59194e1bc9a0SAchim Leubner SA_DBG3(("mpiSMPAbortRsp: request abort is valid Htag 0x%x\n", tag));
59204e1bc9a0SAchim Leubner
59214e1bc9a0SAchim Leubner /* remove the SSP_ABORT or SATA_ABORT request from IOMap */
59224e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
59234e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
59244e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
59254e1bc9a0SAchim Leubner
59264e1bc9a0SAchim Leubner if( pRequest->completionCB == agNULL )
59274e1bc9a0SAchim Leubner {
59284e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPAbortRsp: ************************************************* Valid for Expander only tag 0x%x\n", tag));
59294e1bc9a0SAchim Leubner ossaSMPAbortCB(agRoot, pRequest->pIORequestContext, scp, status);
59304e1bc9a0SAchim Leubner }
59314e1bc9a0SAchim Leubner else
59324e1bc9a0SAchim Leubner {
59334e1bc9a0SAchim Leubner (*(ossaGenericAbortCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, scp, status);
59344e1bc9a0SAchim Leubner }
59354e1bc9a0SAchim Leubner
59364e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
59374e1bc9a0SAchim Leubner
59384e1bc9a0SAchim Leubner /* Delete the request from the pendingIORequests */
59394e1bc9a0SAchim Leubner saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
59404e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
59414e1bc9a0SAchim Leubner /* return the request to free pool */
59424e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
59434e1bc9a0SAchim Leubner {
59444e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPAbortRsp: saving pRequest (%p) for later use\n", pRequest));
59454e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
59464e1bc9a0SAchim Leubner }
59474e1bc9a0SAchim Leubner else
59484e1bc9a0SAchim Leubner {
59494e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
59504e1bc9a0SAchim Leubner }
59514e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
59524e1bc9a0SAchim Leubner
59534e1bc9a0SAchim Leubner }
59544e1bc9a0SAchim Leubner else
59554e1bc9a0SAchim Leubner {
59564e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
59574e1bc9a0SAchim Leubner SA_DBG1(("mpiSMPAbortRsp: the request is not valid any more. Tag=%x\n", pRequest->HTag));
59584e1bc9a0SAchim Leubner }
59594e1bc9a0SAchim Leubner
59604e1bc9a0SAchim Leubner
59614e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3P");
59624e1bc9a0SAchim Leubner
59634e1bc9a0SAchim Leubner return ret;
59644e1bc9a0SAchim Leubner }
59654e1bc9a0SAchim Leubner
59664e1bc9a0SAchim Leubner /******************************************************************************/
59674e1bc9a0SAchim Leubner /*! \brief SPC MPI Device Handle Arrived Event (target mode)
59684e1bc9a0SAchim Leubner *
59694e1bc9a0SAchim Leubner * This function handles the Device Handle Arrived Event.
59704e1bc9a0SAchim Leubner *
59714e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
59724e1bc9a0SAchim Leubner * \param pMsg1 pointer of Message
59734e1bc9a0SAchim Leubner *
59744e1bc9a0SAchim Leubner * \return The read value
59754e1bc9a0SAchim Leubner *
59764e1bc9a0SAchim Leubner */
59774e1bc9a0SAchim Leubner /*******************************************************************************/
mpiDeviceHandleRemoval(agsaRoot_t * agRoot,agsaDeviceHandleRemoval_t * pMsg1)59784e1bc9a0SAchim Leubner GLOBAL bit32 mpiDeviceHandleRemoval(
59794e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
59804e1bc9a0SAchim Leubner agsaDeviceHandleRemoval_t *pMsg1)
59814e1bc9a0SAchim Leubner {
59824e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
59834e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
59844e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
59854e1bc9a0SAchim Leubner agsaPortContext_t *agPortContext;
59864e1bc9a0SAchim Leubner bit32 portId;
59874e1bc9a0SAchim Leubner bit32 deviceid, deviceIdx;
59884e1bc9a0SAchim Leubner
59894e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3R");
59904e1bc9a0SAchim Leubner
59914e1bc9a0SAchim Leubner /* convert endiness if necassary */
59924e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &portId, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleRemoval_t, portId));
59934e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceid, pMsg1, OSSA_OFFSET_OF(agsaDeviceHandleRemoval_t, deviceId));
59944e1bc9a0SAchim Leubner
59954e1bc9a0SAchim Leubner SA_DBG3(("mpiDeviceHandleRemoval: portId=0x%x deviceId=0x%x\n", portId, deviceid));
59964e1bc9a0SAchim Leubner
59974e1bc9a0SAchim Leubner pDevice = saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle;
59984e1bc9a0SAchim Leubner SA_DBG2(("mpiDeviceHandleRemoval:PortID 0x%x PortStatus 0x%x PortContext %p\n",
59994e1bc9a0SAchim Leubner saRoot->PortMap[portId & PORTID_MASK].PortID,
60004e1bc9a0SAchim Leubner saRoot->PortMap[portId & PORTID_MASK].PortStatus,
60014e1bc9a0SAchim Leubner saRoot->PortMap[portId & PORTID_MASK].PortContext));
60024e1bc9a0SAchim Leubner agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId & PORTID_MASK].PortContext;
60034e1bc9a0SAchim Leubner
60044e1bc9a0SAchim Leubner /* Call Back */
60054e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceHandleRemoval: portId=0x%x deviceId=0x%x autoDeregDeviceflag=0x%x\n", portId, deviceid,saRoot->autoDeregDeviceflag[portId & PORTID_MASK]));
60064e1bc9a0SAchim Leubner if (pDevice->targetDevHandle.sdkData)
60074e1bc9a0SAchim Leubner {
60084e1bc9a0SAchim Leubner ossaDeviceHandleRemovedEvent(agRoot, &(pDevice->targetDevHandle), agPortContext);
60094e1bc9a0SAchim Leubner
60104e1bc9a0SAchim Leubner if (saRoot->autoDeregDeviceflag[portId & PORTID_MASK])
60114e1bc9a0SAchim Leubner {
60124e1bc9a0SAchim Leubner /* remove the DeviceMap and MapIndex */
60134e1bc9a0SAchim Leubner deviceIdx = pDevice->DeviceMapIndex & DEVICE_ID_BITS;
60144e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceHandleRemoval: A Freed portId=0x%x deviceId=0x%x\n", portId, deviceid));
60154e1bc9a0SAchim Leubner OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
60164e1bc9a0SAchim Leubner
60174e1bc9a0SAchim Leubner saRoot->DeviceMap[deviceIdx].DeviceIdFromFW = 0;
60184e1bc9a0SAchim Leubner saRoot->DeviceMap[deviceIdx].DeviceHandle = agNULL;
60194e1bc9a0SAchim Leubner pDevice->DeviceMapIndex = 0;
60204e1bc9a0SAchim Leubner
60214e1bc9a0SAchim Leubner /* Reset the device data structure */
60224e1bc9a0SAchim Leubner pDevice->pPort = agNULL;
60234e1bc9a0SAchim Leubner pDevice->targetDevHandle.sdkData = agNULL;
60244e1bc9a0SAchim Leubner pDevice->targetDevHandle.osData = agNULL;
60254e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
60264e1bc9a0SAchim Leubner saLlistAdd(&(saRoot->freeDevicesList), &(pDevice->linkNode));
60274e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceHandleRemoval: portId=0x%x deviceId=0x%x\n", portId, deviceid));
60284e1bc9a0SAchim Leubner
60294e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
60304e1bc9a0SAchim Leubner }
60314e1bc9a0SAchim Leubner }
60324e1bc9a0SAchim Leubner else
60334e1bc9a0SAchim Leubner {
60344e1bc9a0SAchim Leubner if (pDevice->initiatorDevHandle.sdkData)
60354e1bc9a0SAchim Leubner {
60364e1bc9a0SAchim Leubner ossaDeviceHandleRemovedEvent(agRoot, &(pDevice->initiatorDevHandle), agPortContext);
60374e1bc9a0SAchim Leubner
60384e1bc9a0SAchim Leubner if (saRoot->autoDeregDeviceflag[portId & PORTID_MASK])
60394e1bc9a0SAchim Leubner {
60404e1bc9a0SAchim Leubner /* remove the DeviceMap and MapIndex */
60414e1bc9a0SAchim Leubner deviceIdx = pDevice->DeviceMapIndex & DEVICE_ID_BITS;
60424e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceHandleRemoval: A Freed portId=0x%x deviceId=0x%x\n", portId, deviceid));
60434e1bc9a0SAchim Leubner OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
60444e1bc9a0SAchim Leubner saRoot->DeviceMap[deviceIdx].DeviceIdFromFW = 0;
60454e1bc9a0SAchim Leubner saRoot->DeviceMap[deviceIdx].DeviceHandle = agNULL;
60464e1bc9a0SAchim Leubner pDevice->DeviceMapIndex = 0;
60474e1bc9a0SAchim Leubner
60484e1bc9a0SAchim Leubner /* Reset the device data structure */
60494e1bc9a0SAchim Leubner pDevice->pPort = agNULL;
60504e1bc9a0SAchim Leubner pDevice->initiatorDevHandle.sdkData = agNULL;
60514e1bc9a0SAchim Leubner pDevice->initiatorDevHandle.osData = agNULL;
60524e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
60534e1bc9a0SAchim Leubner saLlistAdd(&(saRoot->freeDevicesList), &(pDevice->linkNode));
60544e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
60554e1bc9a0SAchim Leubner }
60564e1bc9a0SAchim Leubner }
60574e1bc9a0SAchim Leubner else
60584e1bc9a0SAchim Leubner {
60594e1bc9a0SAchim Leubner /* no callback because bad device_id */
60604e1bc9a0SAchim Leubner SA_DBG1(("mpiDeviceHandleRemoval: Bad Device Handle, deviceId=0x%x\n", deviceid));
60614e1bc9a0SAchim Leubner }
60624e1bc9a0SAchim Leubner }
60634e1bc9a0SAchim Leubner
60644e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3R");
60654e1bc9a0SAchim Leubner return ret;
60664e1bc9a0SAchim Leubner }
60674e1bc9a0SAchim Leubner
60684e1bc9a0SAchim Leubner /******************************************************************************/
60694e1bc9a0SAchim Leubner /*! \brief Set Device State Response
60704e1bc9a0SAchim Leubner *
60714e1bc9a0SAchim Leubner * This routine handles the response of SET Device State Response
60724e1bc9a0SAchim Leubner *
60734e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
60744e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
60754e1bc9a0SAchim Leubner *
60764e1bc9a0SAchim Leubner * \return sucess or fail
60774e1bc9a0SAchim Leubner *
60784e1bc9a0SAchim Leubner */
60794e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSetDeviceStateRsp(agsaRoot_t * agRoot,agsaSetDeviceStateRsp_t * pIomb)60804e1bc9a0SAchim Leubner GLOBAL bit32 mpiSetDeviceStateRsp(
60814e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
60824e1bc9a0SAchim Leubner agsaSetDeviceStateRsp_t *pIomb
60834e1bc9a0SAchim Leubner )
60844e1bc9a0SAchim Leubner {
60854e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
60864e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
60874e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
60884e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle;
60894e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
60904e1bc9a0SAchim Leubner agsaContext_t *agContext;
60914e1bc9a0SAchim Leubner bit32 tag, status, deviceState, deviceId;
60924e1bc9a0SAchim Leubner
60934e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3Q");
60944e1bc9a0SAchim Leubner
60954e1bc9a0SAchim Leubner SA_DBG1(("mpiSetDeviceStateRsp: HTag=0x%x, deviceId=0x%x\n", pIomb->tag, pIomb->deviceId));
60964e1bc9a0SAchim Leubner
60974e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, tag));
60984e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, deviceId));
60994e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, status));
61004e1bc9a0SAchim Leubner
61014e1bc9a0SAchim Leubner /* get request from IOMap */
61024e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
61034e1bc9a0SAchim Leubner if (agNULL == pRequest)
61044e1bc9a0SAchim Leubner {
61054e1bc9a0SAchim Leubner SA_DBG1(("mpiSetDeviceStateRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
61064e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3Q");
61074e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
61084e1bc9a0SAchim Leubner }
61094e1bc9a0SAchim Leubner
61104e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
61114e1bc9a0SAchim Leubner /* remove the request from IOMap */
61124e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
61134e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
61144e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
61154e1bc9a0SAchim Leubner
61164e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
61174e1bc9a0SAchim Leubner
61184e1bc9a0SAchim Leubner /* status is SUCCESS */
61194e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceState, pIomb, OSSA_OFFSET_OF(agsaSetDeviceStateRsp_t, pds_nds));
61204e1bc9a0SAchim Leubner
61214e1bc9a0SAchim Leubner /* find device handle from device index */
61224e1bc9a0SAchim Leubner pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceId & DEVICE_ID_BITS].DeviceHandle;
61234e1bc9a0SAchim Leubner if (agNULL == pDevice)
61244e1bc9a0SAchim Leubner {
61254e1bc9a0SAchim Leubner SA_DBG1(("mpiSetDeviceStateRsp: DeviceHandle is NULL!!! deviceId=0x%x TAG=0x%x STATUS=0x%x \n", deviceId, tag, status));
61264e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3Q");
61274e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
61284e1bc9a0SAchim Leubner }
61294e1bc9a0SAchim Leubner
61304e1bc9a0SAchim Leubner if (pDevice->targetDevHandle.sdkData)
61314e1bc9a0SAchim Leubner {
61324e1bc9a0SAchim Leubner agDevHandle = &(pDevice->targetDevHandle);
61334e1bc9a0SAchim Leubner }
61344e1bc9a0SAchim Leubner else
61354e1bc9a0SAchim Leubner {
61364e1bc9a0SAchim Leubner agDevHandle = &(pDevice->initiatorDevHandle);
61374e1bc9a0SAchim Leubner }
61384e1bc9a0SAchim Leubner
61394e1bc9a0SAchim Leubner if (agDevHandle == agNULL)
61404e1bc9a0SAchim Leubner {
61414e1bc9a0SAchim Leubner SA_DBG1(("mpiSetDeviceStateRsp: warning!!! no deviceHandle is found"));
61424e1bc9a0SAchim Leubner ossaSetDeviceStateCB(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0, 0);
61434e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3Q");
61444e1bc9a0SAchim Leubner
61454e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
61464e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
61474e1bc9a0SAchim Leubner /* return the request to free pool */
61484e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
61494e1bc9a0SAchim Leubner {
61504e1bc9a0SAchim Leubner SA_DBG1(("mpiSetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
61514e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
61524e1bc9a0SAchim Leubner }
61534e1bc9a0SAchim Leubner else
61544e1bc9a0SAchim Leubner {
61554e1bc9a0SAchim Leubner /* return the request to free pool */
61564e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
61574e1bc9a0SAchim Leubner }
61584e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
61594e1bc9a0SAchim Leubner
61604e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
61614e1bc9a0SAchim Leubner }
61624e1bc9a0SAchim Leubner
61634e1bc9a0SAchim Leubner ossaSetDeviceStateCB(agRoot, agContext, agDevHandle, status, (deviceState & NDS_BITS),
61644e1bc9a0SAchim Leubner (deviceState & PDS_BITS) >> SHIFT4);
61654e1bc9a0SAchim Leubner
61664e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
61674e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
61684e1bc9a0SAchim Leubner /* return the request to free pool */
61694e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
61704e1bc9a0SAchim Leubner {
61714e1bc9a0SAchim Leubner SA_DBG1(("mpiSetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
61724e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
61734e1bc9a0SAchim Leubner }
61744e1bc9a0SAchim Leubner else
61754e1bc9a0SAchim Leubner {
61764e1bc9a0SAchim Leubner /* return the request to free pool */
61774e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
61784e1bc9a0SAchim Leubner }
61794e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
61804e1bc9a0SAchim Leubner
61814e1bc9a0SAchim Leubner /* return value */
61824e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3Q");
61834e1bc9a0SAchim Leubner return ret;
61844e1bc9a0SAchim Leubner }
61854e1bc9a0SAchim Leubner
61864e1bc9a0SAchim Leubner /******************************************************************************/
61874e1bc9a0SAchim Leubner /*! \brief Get Device State Response
61884e1bc9a0SAchim Leubner *
61894e1bc9a0SAchim Leubner * This routine handles the response of GET Device State Response
61904e1bc9a0SAchim Leubner *
61914e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
61924e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
61934e1bc9a0SAchim Leubner *
61944e1bc9a0SAchim Leubner * \return sucess or fail
61954e1bc9a0SAchim Leubner *
61964e1bc9a0SAchim Leubner */
61974e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetDeviceStateRsp(agsaRoot_t * agRoot,agsaGetDeviceStateRsp_t * pIomb)61984e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetDeviceStateRsp(
61994e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
62004e1bc9a0SAchim Leubner agsaGetDeviceStateRsp_t *pIomb
62014e1bc9a0SAchim Leubner )
62024e1bc9a0SAchim Leubner {
62034e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
62044e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
62054e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
62064e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle;
62074e1bc9a0SAchim Leubner agsaDeviceDesc_t *pDevice;
62084e1bc9a0SAchim Leubner agsaContext_t *agContext;
62094e1bc9a0SAchim Leubner bit32 tag, status, deviceId, deviceState;
62104e1bc9a0SAchim Leubner
62114e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3W");
62124e1bc9a0SAchim Leubner
62134e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDeviceStateRsp: HTag=0x%x, deviceId=0x%x\n", pIomb->tag, pIomb->deviceId));
62144e1bc9a0SAchim Leubner
62154e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, tag));
62164e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceId, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, deviceId));
62174e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, status));
62184e1bc9a0SAchim Leubner
62194e1bc9a0SAchim Leubner /* get request from IOMap */
62204e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
62214e1bc9a0SAchim Leubner if (agNULL == pRequest)
62224e1bc9a0SAchim Leubner {
62234e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDeviceStateRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
62244e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3W");
62254e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
62264e1bc9a0SAchim Leubner }
62274e1bc9a0SAchim Leubner
62284e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
62294e1bc9a0SAchim Leubner /* remove the request from IOMap */
62304e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
62314e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
62324e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
62334e1bc9a0SAchim Leubner
62344e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
62354e1bc9a0SAchim Leubner
62364e1bc9a0SAchim Leubner /* status is SUCCESS */
62374e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &deviceState, pIomb, OSSA_OFFSET_OF(agsaGetDeviceStateRsp_t, ds));
62384e1bc9a0SAchim Leubner
62394e1bc9a0SAchim Leubner /* find device handle from device index */
62404e1bc9a0SAchim Leubner pDevice = (agsaDeviceDesc_t *)saRoot->DeviceMap[deviceId & DEVICE_ID_BITS].DeviceHandle;
62414e1bc9a0SAchim Leubner if (pDevice != agNULL)
62424e1bc9a0SAchim Leubner {
62434e1bc9a0SAchim Leubner if (pDevice->targetDevHandle.sdkData)
62444e1bc9a0SAchim Leubner {
62454e1bc9a0SAchim Leubner agDevHandle = &(pDevice->targetDevHandle);
62464e1bc9a0SAchim Leubner }
62474e1bc9a0SAchim Leubner else
62484e1bc9a0SAchim Leubner {
62494e1bc9a0SAchim Leubner agDevHandle = &(pDevice->initiatorDevHandle);
62504e1bc9a0SAchim Leubner }
62514e1bc9a0SAchim Leubner }
62524e1bc9a0SAchim Leubner else
62534e1bc9a0SAchim Leubner {
62544e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDeviceStateRsp: pDevice is NULL"));
62554e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3W");
62564e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
62574e1bc9a0SAchim Leubner }
62584e1bc9a0SAchim Leubner
62594e1bc9a0SAchim Leubner if (agDevHandle == agNULL)
62604e1bc9a0SAchim Leubner {
62614e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDeviceStateRsp: warning!!! no deviceHandle is found"));
62624e1bc9a0SAchim Leubner ossaGetDeviceStateCB(agRoot, agContext, agNULL, OSSA_IO_NO_DEVICE, 0);
62634e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3W");
62644e1bc9a0SAchim Leubner
62654e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
62664e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
62674e1bc9a0SAchim Leubner /* return the request to free pool */
62684e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
62694e1bc9a0SAchim Leubner {
62704e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
62714e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
62724e1bc9a0SAchim Leubner }
62734e1bc9a0SAchim Leubner else
62744e1bc9a0SAchim Leubner {
62754e1bc9a0SAchim Leubner /* return the request to free pool */
62764e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
62774e1bc9a0SAchim Leubner }
62784e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
62794e1bc9a0SAchim Leubner
62804e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
62814e1bc9a0SAchim Leubner }
62824e1bc9a0SAchim Leubner
62834e1bc9a0SAchim Leubner ossaGetDeviceStateCB(agRoot, agContext, agDevHandle, status, deviceState);
62844e1bc9a0SAchim Leubner
62854e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
62864e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
62874e1bc9a0SAchim Leubner /* return the request to free pool */
62884e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
62894e1bc9a0SAchim Leubner {
62904e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDeviceStateRsp: saving pRequest (%p) for later use\n", pRequest));
62914e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
62924e1bc9a0SAchim Leubner }
62934e1bc9a0SAchim Leubner else
62944e1bc9a0SAchim Leubner {
62954e1bc9a0SAchim Leubner /* return the request to free pool */
62964e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
62974e1bc9a0SAchim Leubner }
62984e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
62994e1bc9a0SAchim Leubner
63004e1bc9a0SAchim Leubner /* return value */
63014e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3W");
63024e1bc9a0SAchim Leubner return ret;
63034e1bc9a0SAchim Leubner }
63044e1bc9a0SAchim Leubner
63054e1bc9a0SAchim Leubner /******************************************************************************/
63064e1bc9a0SAchim Leubner /*! \brief SAS ReInitialize Response
63074e1bc9a0SAchim Leubner *
63084e1bc9a0SAchim Leubner * This routine handles the response of SAS Reinitialize Response
63094e1bc9a0SAchim Leubner *
63104e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
63114e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
63124e1bc9a0SAchim Leubner *
63134e1bc9a0SAchim Leubner * \return sucess or fail
63144e1bc9a0SAchim Leubner *
63154e1bc9a0SAchim Leubner */
63164e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSasReInitializeRsp(agsaRoot_t * agRoot,agsaSasReInitializeRsp_t * pIomb)63174e1bc9a0SAchim Leubner GLOBAL bit32 mpiSasReInitializeRsp(
63184e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
63194e1bc9a0SAchim Leubner agsaSasReInitializeRsp_t *pIomb
63204e1bc9a0SAchim Leubner )
63214e1bc9a0SAchim Leubner {
63224e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
63234e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
63244e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
63254e1bc9a0SAchim Leubner agsaContext_t *agContext;
63264e1bc9a0SAchim Leubner agsaSASReconfig_t SASReconfig;
63274e1bc9a0SAchim Leubner bit32 tag, status, setFlags, MaxPorts;
63284e1bc9a0SAchim Leubner bit32 openRejReCmdData, sataHOLTMO;
63294e1bc9a0SAchim Leubner
63304e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3X");
63314e1bc9a0SAchim Leubner
63324e1bc9a0SAchim Leubner SA_DBG1(("mpiSasReInitializeRsp: HTag=0x%x, status=0x%x\n", pIomb->tag, pIomb->status));
63334e1bc9a0SAchim Leubner
63344e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, tag));
63354e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, status));
63364e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &setFlags, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, setFlags));
63374e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &MaxPorts, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, MaxPorts));
63384e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &openRejReCmdData, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, openRejReCmdData));
63394e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &sataHOLTMO, pIomb, OSSA_OFFSET_OF(agsaSasReInitializeRsp_t, sataHOLTMO));
63404e1bc9a0SAchim Leubner
63414e1bc9a0SAchim Leubner /* get request from IOMap */
63424e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
63434e1bc9a0SAchim Leubner if (agNULL == pRequest)
63444e1bc9a0SAchim Leubner {
63454e1bc9a0SAchim Leubner SA_DBG1(("mpiSasReInitializeRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
63464e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3X");
63474e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
63484e1bc9a0SAchim Leubner }
63494e1bc9a0SAchim Leubner
63504e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
63514e1bc9a0SAchim Leubner /* remove the request from IOMap */
63524e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
63534e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
63544e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
63554e1bc9a0SAchim Leubner
63564e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
63574e1bc9a0SAchim Leubner
63584e1bc9a0SAchim Leubner SASReconfig.flags = setFlags;
63594e1bc9a0SAchim Leubner SASReconfig.maxPorts = (bit8)(MaxPorts & 0xFF);
63604e1bc9a0SAchim Leubner SASReconfig.openRejectRetriesCmd = (bit16)((openRejReCmdData & 0xFFFF0000) >> SHIFT16);
63614e1bc9a0SAchim Leubner SASReconfig.openRejectRetriesData = (bit16)(openRejReCmdData & 0x0000FFFF);
63624e1bc9a0SAchim Leubner SASReconfig.sataHolTmo = (bit16)(sataHOLTMO & 0xFFFF);
63634e1bc9a0SAchim Leubner ossaReconfigSASParamsCB(agRoot, agContext, status, &SASReconfig);
63644e1bc9a0SAchim Leubner
63654e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
63664e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
63674e1bc9a0SAchim Leubner /* return the request to free pool */
63684e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
63694e1bc9a0SAchim Leubner {
63704e1bc9a0SAchim Leubner SA_DBG1(("mpiSasReInitializeRsp: saving pRequest (%p) for later use\n", pRequest));
63714e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
63724e1bc9a0SAchim Leubner }
63734e1bc9a0SAchim Leubner else
63744e1bc9a0SAchim Leubner {
63754e1bc9a0SAchim Leubner /* return the request to free pool */
63764e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
63774e1bc9a0SAchim Leubner }
63784e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
63794e1bc9a0SAchim Leubner
63804e1bc9a0SAchim Leubner /* return value */
63814e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3X");
63824e1bc9a0SAchim Leubner
63834e1bc9a0SAchim Leubner return ret;
63844e1bc9a0SAchim Leubner }
63854e1bc9a0SAchim Leubner
63864e1bc9a0SAchim Leubner /******************************************************************************/
63874e1bc9a0SAchim Leubner /*! \brief serial GPIO Response
63884e1bc9a0SAchim Leubner *
63894e1bc9a0SAchim Leubner * This routine handles the response of serial GPIO Response
63904e1bc9a0SAchim Leubner *
63914e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
63924e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
63934e1bc9a0SAchim Leubner *
63944e1bc9a0SAchim Leubner * \return sucess or fail
63954e1bc9a0SAchim Leubner *
63964e1bc9a0SAchim Leubner */
63974e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSGpioRsp(agsaRoot_t * agRoot,agsaSGpioRsp_t * pInIomb)63984e1bc9a0SAchim Leubner GLOBAL bit32 mpiSGpioRsp(
63994e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
64004e1bc9a0SAchim Leubner agsaSGpioRsp_t *pInIomb
64014e1bc9a0SAchim Leubner )
64024e1bc9a0SAchim Leubner {
64034e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
64044e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
64054e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest = NULL;
64064e1bc9a0SAchim Leubner agsaContext_t *agContext = NULL;
64074e1bc9a0SAchim Leubner bit32 i, tag, resultFunctionFrameType;
64084e1bc9a0SAchim Leubner agsaSGpioReqResponse_t SgpioResponse = {0};
64094e1bc9a0SAchim Leubner
64104e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3Y");
64114e1bc9a0SAchim Leubner
64124e1bc9a0SAchim Leubner SA_DBG3(("mpiSGpioRsp: HTAG=0x%x\n", pInIomb->tag));
64134e1bc9a0SAchim Leubner
64144e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pInIomb, OSSA_OFFSET_OF(agsaSGpioRsp_t, tag));
64154e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &resultFunctionFrameType, pInIomb, OSSA_OFFSET_OF(agsaSGpioRsp_t, resultFunctionFrameType));
64164e1bc9a0SAchim Leubner
64174e1bc9a0SAchim Leubner SgpioResponse.smpFrameType = resultFunctionFrameType & 0xFF;
64184e1bc9a0SAchim Leubner SgpioResponse.function = (resultFunctionFrameType & 0xFF00) >> 8;
64194e1bc9a0SAchim Leubner SgpioResponse.functionResult = (resultFunctionFrameType & 0xFF0000) >> 16;
64204e1bc9a0SAchim Leubner
64214e1bc9a0SAchim Leubner if (SA_SAS_SMP_READ_GPIO_REGISTER == SgpioResponse.function)
64224e1bc9a0SAchim Leubner {
64234e1bc9a0SAchim Leubner for (i = 0; i < OSSA_SGPIO_MAX_READ_DATA_COUNT; i++)
64244e1bc9a0SAchim Leubner {
64254e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &SgpioResponse.readWriteData[i], pInIomb, OSSA_OFFSET_OF(agsaSGpioRsp_t, readData) + (i * 4));
64264e1bc9a0SAchim Leubner }
64274e1bc9a0SAchim Leubner }
64284e1bc9a0SAchim Leubner
64294e1bc9a0SAchim Leubner /* Get the request from IOMap */
64304e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
64314e1bc9a0SAchim Leubner if (agNULL == pRequest)
64324e1bc9a0SAchim Leubner {
64334e1bc9a0SAchim Leubner SA_DBG1(("mpiSGpioRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, SgpioResponse.functionResult));
64344e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3Y");
64354e1bc9a0SAchim Leubner ret = AGSA_RC_FAILURE;
64364e1bc9a0SAchim Leubner }
64374e1bc9a0SAchim Leubner else
64384e1bc9a0SAchim Leubner {
64394e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
64404e1bc9a0SAchim Leubner ossaSGpioCB(agRoot, agContext, &SgpioResponse);
64414e1bc9a0SAchim Leubner
64424e1bc9a0SAchim Leubner /* Return the request to free pool */
64434e1bc9a0SAchim Leubner saReturnRequestToFreePool(agRoot, pRequest);
64444e1bc9a0SAchim Leubner
64454e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3Y");
64464e1bc9a0SAchim Leubner }
64474e1bc9a0SAchim Leubner
64484e1bc9a0SAchim Leubner return ret;
64494e1bc9a0SAchim Leubner }
64504e1bc9a0SAchim Leubner
64514e1bc9a0SAchim Leubner /******************************************************************************/
64524e1bc9a0SAchim Leubner /*! \brief PCIE Diagnostics Response
64534e1bc9a0SAchim Leubner *
64544e1bc9a0SAchim Leubner * This routine handles the response of PCIE Diagnostics Response
64554e1bc9a0SAchim Leubner *
64564e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
64574e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
64584e1bc9a0SAchim Leubner *
64594e1bc9a0SAchim Leubner * \return sucess or fail
64604e1bc9a0SAchim Leubner *
64614e1bc9a0SAchim Leubner */
64624e1bc9a0SAchim Leubner /*******************************************************************************/
mpiPCIeDiagExecuteRsp(agsaRoot_t * agRoot,void * pInIomb)64634e1bc9a0SAchim Leubner GLOBAL bit32 mpiPCIeDiagExecuteRsp(
64644e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
64654e1bc9a0SAchim Leubner void *pInIomb
64664e1bc9a0SAchim Leubner )
64674e1bc9a0SAchim Leubner {
64684e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
64694e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = agNULL;
64704e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
64714e1bc9a0SAchim Leubner agsaContext_t *agContext;
64724e1bc9a0SAchim Leubner bit32 tag, Status, Command;
64734e1bc9a0SAchim Leubner agsaPCIeDiagResponse_t pciediadrsp;
64744e1bc9a0SAchim Leubner bit32 *pIomb = (bit32 *)pInIomb;
64754e1bc9a0SAchim Leubner
64764e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3Z");
64774e1bc9a0SAchim Leubner
64784e1bc9a0SAchim Leubner /* sanity check */
64794e1bc9a0SAchim Leubner SA_ASSERT((agNULL != agRoot), "");
64804e1bc9a0SAchim Leubner saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
64814e1bc9a0SAchim Leubner SA_ASSERT((agNULL != saRoot), "");
64824e1bc9a0SAchim Leubner
64834e1bc9a0SAchim Leubner si_memset(&pciediadrsp, 0, sizeof(agsaPCIeDiagResponse_t));
64844e1bc9a0SAchim Leubner
64854e1bc9a0SAchim Leubner if(smIS_SPCV(agRoot))
64864e1bc9a0SAchim Leubner {
64874e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,tag));
64884e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Command, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,CmdTypeDesc));
64894e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Status, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,Status));
64904e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &pciediadrsp.ERR_BLKH, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,ERR_BLKH ));
64914e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &pciediadrsp.ERR_BLKL, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,ERR_BLKL ));
64924e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord8, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord8 ));
64934e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord9, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord9 ));
64944e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord10, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord10 ));
64954e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &pciediadrsp.DWord11, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DWord11 ));
64964e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &pciediadrsp.DIF_ERR, pIomb, OSSA_OFFSET_OF(agsaPCIeDiagExecuteRsp_t,DIF_ERR ));
64974e1bc9a0SAchim Leubner SA_DBG3(("mpiPCIeDiagExecuteRsp: HTAG=0x%x\n",tag));
64984e1bc9a0SAchim Leubner }
64994e1bc9a0SAchim Leubner else
65004e1bc9a0SAchim Leubner {
65014e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsa_SPC_PCIeDiagExecuteRsp_t,tag));
65024e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Command, pIomb, OSSA_OFFSET_OF(agsa_SPC_PCIeDiagExecuteRsp_t,CmdTypeDesc));
65034e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Status, pIomb, OSSA_OFFSET_OF(agsa_SPC_PCIeDiagExecuteRsp_t,Status));
65044e1bc9a0SAchim Leubner SA_DBG3(("mpiPCIeDiagExecuteRsp: SPC HTAG=0x%x\n",tag));
65054e1bc9a0SAchim Leubner }
65064e1bc9a0SAchim Leubner
65074e1bc9a0SAchim Leubner switch(Status)
65084e1bc9a0SAchim Leubner {
65094e1bc9a0SAchim Leubner case OSSA_PCIE_DIAG_SUCCESS:
65104e1bc9a0SAchim Leubner SA_DBG3(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_SUCCESS TAG=0x%x STATUS=0x%x\n", tag, Status));
65114e1bc9a0SAchim Leubner break;
65124e1bc9a0SAchim Leubner case OSSA_IO_INVALID_LENGTH:
65134e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_IO_INVALID_LENGTH TAG=0x%x STATUS=0x%x\n", tag, Status));
65144e1bc9a0SAchim Leubner break;
65154e1bc9a0SAchim Leubner case OSSA_PCIE_DIAG_INVALID_COMMAND:
65164e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_COMMAND TAG=0x%x STATUS=0x%x\n", tag, Status));
65174e1bc9a0SAchim Leubner break;
65184e1bc9a0SAchim Leubner case OSSA_PCIE_DIAG_INTERNAL_FAILURE:
65194e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INTERNAL_FAILURE TAG=0x%x STATUS=0x%x\n", tag, Status));
65204e1bc9a0SAchim Leubner break;
65214e1bc9a0SAchim Leubner case OSSA_PCIE_DIAG_INVALID_CMD_TYPE:
65224e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_CMD_TYPE TAG=0x%x STATUS=0x%x\n", tag, Status));
65234e1bc9a0SAchim Leubner break;
65244e1bc9a0SAchim Leubner case OSSA_PCIE_DIAG_INVALID_CMD_DESC:
65254e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_CMD_DESC TAG=0x%x STATUS=0x%x\n", tag, Status));
65264e1bc9a0SAchim Leubner break;
65274e1bc9a0SAchim Leubner case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
65284e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
65294e1bc9a0SAchim Leubner break;
65304e1bc9a0SAchim Leubner case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_CRC_MISMATCH:
65314e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_CRC_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
65324e1bc9a0SAchim Leubner break;
65334e1bc9a0SAchim Leubner case OSSA_PCIE_DIAG_INVALID_PCIE_ADDR:
65344e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_PCIE_ADDR TAG=0x%x STATUS=0x%x\n", tag, Status));
65354e1bc9a0SAchim Leubner break;
65364e1bc9a0SAchim Leubner case OSSA_PCIE_DIAG_INVALID_BLOCK_SIZE:
65374e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_INVALID_BLOCK_SIZE TAG=0x%x STATUS=0x%x\n", tag, Status));
65384e1bc9a0SAchim Leubner break;
65394e1bc9a0SAchim Leubner case OSSA_PCIE_DIAG_LENGTH_NOT_BLOCK_SIZE_ALIGNED:
65404e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_LENGTH_NOT_BLOCK_SIZE_ALIGNED TAG=0x%x STATUS=0x%x\n", tag, Status));
65414e1bc9a0SAchim Leubner break;
65424e1bc9a0SAchim Leubner case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_MISMATCH:
65434e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
65444e1bc9a0SAchim Leubner break;
65454e1bc9a0SAchim Leubner case OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
65464e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: OSSA_PCIE_DIAG_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH TAG=0x%x STATUS=0x%x\n", tag, Status));
65474e1bc9a0SAchim Leubner break;
65484e1bc9a0SAchim Leubner default:
65494e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: UNKNOWN status TAG=0x%x STATUS=0x%x\n", tag, Status));
65504e1bc9a0SAchim Leubner break;
65514e1bc9a0SAchim Leubner }
65524e1bc9a0SAchim Leubner /* get request from IOMap */
65534e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
65544e1bc9a0SAchim Leubner if (agNULL == pRequest)
65554e1bc9a0SAchim Leubner {
65564e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, Status));
65574e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3Z");
65584e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
65594e1bc9a0SAchim Leubner }
65604e1bc9a0SAchim Leubner
65614e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
65624e1bc9a0SAchim Leubner /* remove the request from IOMap */
65634e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
65644e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
65654e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
65664e1bc9a0SAchim Leubner
65674e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
65684e1bc9a0SAchim Leubner
65694e1bc9a0SAchim Leubner ossaPCIeDiagExecuteCB(agRoot, agContext, Status, Command,&pciediadrsp);
65704e1bc9a0SAchim Leubner
65714e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
65724e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
65734e1bc9a0SAchim Leubner /* return the request to free pool */
65744e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
65754e1bc9a0SAchim Leubner {
65764e1bc9a0SAchim Leubner SA_DBG1(("mpiPCIeDiagExecuteRsp: saving pRequest (%p) for later use\n", pRequest));
65774e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
65784e1bc9a0SAchim Leubner }
65794e1bc9a0SAchim Leubner else
65804e1bc9a0SAchim Leubner {
65814e1bc9a0SAchim Leubner /* return the request to free pool */
65824e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
65834e1bc9a0SAchim Leubner }
65844e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
65854e1bc9a0SAchim Leubner
65864e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3Z");
65874e1bc9a0SAchim Leubner
65884e1bc9a0SAchim Leubner /* return value */
65894e1bc9a0SAchim Leubner return ret;
65904e1bc9a0SAchim Leubner }
65914e1bc9a0SAchim Leubner /******************************************************************************/
65924e1bc9a0SAchim Leubner /*! \brief Get DFE Data command Response
65934e1bc9a0SAchim Leubner *
65944e1bc9a0SAchim Leubner * This routine handles the response of Get DFE Data command Response
65954e1bc9a0SAchim Leubner *
65964e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
65974e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
65984e1bc9a0SAchim Leubner *
65994e1bc9a0SAchim Leubner * \return sucess or fail
66004e1bc9a0SAchim Leubner *
66014e1bc9a0SAchim Leubner */
66024e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetDFEDataRsp(agsaRoot_t * agRoot,void * pIomb)66034e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetDFEDataRsp(
66044e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
66054e1bc9a0SAchim Leubner void *pIomb
66064e1bc9a0SAchim Leubner )
66074e1bc9a0SAchim Leubner {
66084e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
66094e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = agNULL;
66104e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
66114e1bc9a0SAchim Leubner agsaContext_t *agContext;
66124e1bc9a0SAchim Leubner bit32 tag = 0, status = 0, In_Ln = 0, MCNT = 0, NBT = 0;
66134e1bc9a0SAchim Leubner
66144e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2Y");
66154e1bc9a0SAchim Leubner
66164e1bc9a0SAchim Leubner /* sanity check */
66174e1bc9a0SAchim Leubner SA_ASSERT((agNULL != agRoot), "");
66184e1bc9a0SAchim Leubner saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
66194e1bc9a0SAchim Leubner SA_ASSERT((agNULL != saRoot), "");
66204e1bc9a0SAchim Leubner
66214e1bc9a0SAchim Leubner if(smIS_SPCV(agRoot))
66224e1bc9a0SAchim Leubner {
66234e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,tag));
66244e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,status));
66254e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &In_Ln, pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,reserved_In_Ln));
66264e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &MCNT, pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,MCNT));
66274e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &NBT, pIomb, OSSA_OFFSET_OF(agsaGetDDEFDataRsp_t,NBT));
66284e1bc9a0SAchim Leubner }
66294e1bc9a0SAchim Leubner else
66304e1bc9a0SAchim Leubner {
66314e1bc9a0SAchim Leubner /* SPC does not support this command */
66324e1bc9a0SAchim Leubner }
66334e1bc9a0SAchim Leubner
66344e1bc9a0SAchim Leubner switch(status)
66354e1bc9a0SAchim Leubner {
66364e1bc9a0SAchim Leubner case OSSA_DFE_MPI_IO_SUCCESS:
66374e1bc9a0SAchim Leubner SA_DBG3(("mpiGetDFEDataRsp: OSSA_DFE_MPI_IO_SUCCESS TAG=0x%x STATUS=0x%x\n", tag, status));
66384e1bc9a0SAchim Leubner break;
66394e1bc9a0SAchim Leubner case OSSA_DFE_DATA_OVERFLOW:
66404e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_DATA_OVERFLOW TAG=0x%x STATUS=0x%x\n", tag, status));
66414e1bc9a0SAchim Leubner break;
66424e1bc9a0SAchim Leubner case OSSA_DFE_MPI_ERR_RESOURCE_UNAVAILABLE:
66434e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_MPI_ERR_RESOURCE_UNAVAILABLE TAG=0x%x STATUS=0x%x\n", tag, status));
66444e1bc9a0SAchim Leubner break;
66454e1bc9a0SAchim Leubner case OSSA_DFE_CHANNEL_DOWN:
66464e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_CHANNEL_DOWN TAG=0x%x STATUS=0x%x\n", tag, status));
66474e1bc9a0SAchim Leubner break;
66484e1bc9a0SAchim Leubner case OSSA_DFE_MEASUREMENT_IN_PROGRESS:
66494e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_MEASUREMENT_IN_PROGRESS TAG=0x%x STATUS=0x%x\n", tag, status));
66504e1bc9a0SAchim Leubner break;
66514e1bc9a0SAchim Leubner case OSSA_DFE_CHANNEL_INVALID:
66524e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_CHANNEL_INVALID TAG=0x%x STATUS=0x%x\n", tag, status));
66534e1bc9a0SAchim Leubner break;
66544e1bc9a0SAchim Leubner case OSSA_DFE_DMA_FAILURE:
66554e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDFEDataRsp: OSSA_DFE_DMA_FAILURE TAG=0x%x STATUS=0x%x\n", tag, status));
66564e1bc9a0SAchim Leubner break;
66574e1bc9a0SAchim Leubner default:
66584e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDFEDataRsp: UNKNOWN status TAG=0x%x STATUS=0x%x\n", tag, status));
66594e1bc9a0SAchim Leubner break;
66604e1bc9a0SAchim Leubner }
66614e1bc9a0SAchim Leubner
66624e1bc9a0SAchim Leubner /* get request from IOMap */
66634e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
66644e1bc9a0SAchim Leubner if (agNULL == pRequest)
66654e1bc9a0SAchim Leubner {
66664e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDFEDataRsp: Bad Response IOMB!!! pRequest is NULL.TAG=0x%x STATUS=0x%x\n", tag, status));
66674e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2Y");
66684e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
66694e1bc9a0SAchim Leubner }
66704e1bc9a0SAchim Leubner
66714e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
66724e1bc9a0SAchim Leubner /* remove the request from IOMap */
66734e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
66744e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
66754e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
66764e1bc9a0SAchim Leubner
66774e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
66784e1bc9a0SAchim Leubner
66794e1bc9a0SAchim Leubner ossaGetDFEDataCB(agRoot, agContext, status, NBT);
66804e1bc9a0SAchim Leubner
66814e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
66824e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
66834e1bc9a0SAchim Leubner /* return the request to free pool */
66844e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
66854e1bc9a0SAchim Leubner {
66864e1bc9a0SAchim Leubner SA_DBG1(("mpiGetDFEDataRsp: saving pRequest (%p) for later use\n", pRequest));
66874e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
66884e1bc9a0SAchim Leubner }
66894e1bc9a0SAchim Leubner else
66904e1bc9a0SAchim Leubner {
66914e1bc9a0SAchim Leubner /* return the request to free pool */
66924e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
66934e1bc9a0SAchim Leubner }
66944e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
66954e1bc9a0SAchim Leubner
66964e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2Y");
66974e1bc9a0SAchim Leubner
66984e1bc9a0SAchim Leubner return ret;
66994e1bc9a0SAchim Leubner }
67004e1bc9a0SAchim Leubner
67014e1bc9a0SAchim Leubner
67024e1bc9a0SAchim Leubner /******************************************************************************/
67034e1bc9a0SAchim Leubner /*! \brief SAS Set Controller Config Response
67044e1bc9a0SAchim Leubner *
67054e1bc9a0SAchim Leubner * This routine handles the response of Set Controller Config Command
67064e1bc9a0SAchim Leubner *
67074e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
67084e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
67094e1bc9a0SAchim Leubner *
67104e1bc9a0SAchim Leubner * \return sucess or fail
67114e1bc9a0SAchim Leubner *
67124e1bc9a0SAchim Leubner */
67134e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSetControllerConfigRsp(agsaRoot_t * agRoot,agsaSetControllerConfigRsp_t * pIomb)67144e1bc9a0SAchim Leubner GLOBAL bit32 mpiSetControllerConfigRsp(
67154e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
67164e1bc9a0SAchim Leubner agsaSetControllerConfigRsp_t *pIomb
67174e1bc9a0SAchim Leubner )
67184e1bc9a0SAchim Leubner {
67194e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
67204e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
67214e1bc9a0SAchim Leubner agsaHWEventMode_t agMode;
67224e1bc9a0SAchim Leubner bit32 status, errorQualifierPage, tag;
67234e1bc9a0SAchim Leubner bit32 errorQualifier;
67244e1bc9a0SAchim Leubner bit32 pagetype;
67254e1bc9a0SAchim Leubner
67264e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3a");
67274e1bc9a0SAchim Leubner
67284e1bc9a0SAchim Leubner SA_DBG1(("mpiSetControllerConfigRsp: HTag=0x%x\n", pIomb->tag));
67294e1bc9a0SAchim Leubner
67304e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetControllerConfigRsp_t, tag));
67314e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetControllerConfigRsp_t, status));
67324e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &errorQualifierPage, pIomb, OSSA_OFFSET_OF(agsaSetControllerConfigRsp_t, errorQualifierPage));
67334e1bc9a0SAchim Leubner
67344e1bc9a0SAchim Leubner /* get request from IOMap */
67354e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
67364e1bc9a0SAchim Leubner if (agNULL == pRequest)
67374e1bc9a0SAchim Leubner {
67384e1bc9a0SAchim Leubner SA_DBG1(("mpiSetControllerConfigRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
67394e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3a");
67404e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
67414e1bc9a0SAchim Leubner }
67424e1bc9a0SAchim Leubner
67434e1bc9a0SAchim Leubner si_memset(&agMode, 0, sizeof(agsaHWEventMode_t));
67444e1bc9a0SAchim Leubner agMode.modePageOperation = agsaModePageSet;
67454e1bc9a0SAchim Leubner agMode.status = status;
67464e1bc9a0SAchim Leubner agMode.context = saRoot->IOMap[tag].agContext;
67474e1bc9a0SAchim Leubner errorQualifier = (errorQualifierPage & 0xFFFF0000) >> SHIFT16;
67484e1bc9a0SAchim Leubner pagetype = (errorQualifierPage & 0xFF);
67494e1bc9a0SAchim Leubner
67504e1bc9a0SAchim Leubner if(status )
67514e1bc9a0SAchim Leubner {
67524e1bc9a0SAchim Leubner SA_DBG1(("mpiSetControllerConfigRsp: Error detected tag 0x%x pagetype 0x%x status 0x%x errorQualifier 0x%x\n",
67534e1bc9a0SAchim Leubner tag, pagetype,status, errorQualifier));
67544e1bc9a0SAchim Leubner }
67554e1bc9a0SAchim Leubner else
67564e1bc9a0SAchim Leubner {
67574e1bc9a0SAchim Leubner SA_DBG1(("mpiSetControllerConfigRsp: tag 0x%x pagetype 0x%x status 0x%x\n", tag, pagetype,status ));
67584e1bc9a0SAchim Leubner }
67594e1bc9a0SAchim Leubner
67604e1bc9a0SAchim Leubner
67614e1bc9a0SAchim Leubner switch( pagetype)
67624e1bc9a0SAchim Leubner {
67634e1bc9a0SAchim Leubner case AGSA_ENCRYPTION_DEK_CONFIG_PAGE:
67644e1bc9a0SAchim Leubner case AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE:
67654e1bc9a0SAchim Leubner case AGSA_INTERRUPT_CONFIGURATION_PAGE:
67664e1bc9a0SAchim Leubner case AGSA_ENCRYPTION_HMAC_CONFIG_PAGE:
67674e1bc9a0SAchim Leubner case AGSA_IO_GENERAL_CONFIG_PAGE:
67684e1bc9a0SAchim Leubner /*case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:*/
67694e1bc9a0SAchim Leubner /* Report the event before freeing the IOMB */
67704e1bc9a0SAchim Leubner SA_DBG1(("mpiSetControllerConfigRsp:OSSA_HW_EVENT_MODE\n"));
67714e1bc9a0SAchim Leubner ossaHwCB(agRoot,agMode.context, OSSA_HW_EVENT_MODE, errorQualifierPage, (void *) &agMode, 0);
67724e1bc9a0SAchim Leubner
67734e1bc9a0SAchim Leubner
67744e1bc9a0SAchim Leubner break;
67754e1bc9a0SAchim Leubner
67764e1bc9a0SAchim Leubner case AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE:
67774e1bc9a0SAchim Leubner SA_DBG1(("mpiSetControllerConfigRsp:warning!!!! GENERAL_CONFIG_PAGE is read only, cannot be set\n"));
67784e1bc9a0SAchim Leubner break;
67794e1bc9a0SAchim Leubner
67804e1bc9a0SAchim Leubner /* why we need to read the scrach pad register when handling ENCRYPTION_SECURITY_PARM_PAGE??? */
67814e1bc9a0SAchim Leubner case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:
67824e1bc9a0SAchim Leubner {
67834e1bc9a0SAchim Leubner bit32 ScratchPad1 = 0;
67844e1bc9a0SAchim Leubner bit32 ScratchPad3 = 0;
67854e1bc9a0SAchim Leubner agsaEncryptInfo_t encrypt;
67864e1bc9a0SAchim Leubner agsaEncryptInfo_t *encryptInfo = &encrypt;
67874e1bc9a0SAchim Leubner SA_DBG1(("mpiSetControllerConfigRsp: AGSA_ENCRYPTION_CONTROL_PARM_PAGE\n" ));
67884e1bc9a0SAchim Leubner
67894e1bc9a0SAchim Leubner if( pRequest->modePageContext)
67904e1bc9a0SAchim Leubner {
67914e1bc9a0SAchim Leubner pRequest->modePageContext = agFALSE;
67924e1bc9a0SAchim Leubner }
67934e1bc9a0SAchim Leubner
67944e1bc9a0SAchim Leubner si_memset(&encrypt, 0, sizeof(agsaEncryptInfo_t));
67954e1bc9a0SAchim Leubner encryptInfo->status = 0;
67964e1bc9a0SAchim Leubner encryptInfo->encryptionCipherMode = 0;
67974e1bc9a0SAchim Leubner encryptInfo->encryptionSecurityMode = 0;
67984e1bc9a0SAchim Leubner
67994e1bc9a0SAchim Leubner ScratchPad1 = ossaHwRegRead(agRoot,V_Scratchpad_1_Register);
68004e1bc9a0SAchim Leubner ScratchPad3 = ossaHwRegRead(agRoot,V_Scratchpad_3_Register);
68014e1bc9a0SAchim Leubner if( ScratchPad3 & SCRATCH_PAD3_V_XTS_ENABLED)
68024e1bc9a0SAchim Leubner {
68034e1bc9a0SAchim Leubner encryptInfo->encryptionCipherMode = agsaEncryptCipherModeXTS;
68044e1bc9a0SAchim Leubner }
68054e1bc9a0SAchim Leubner if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMF_ENABLED )
68064e1bc9a0SAchim Leubner {
68074e1bc9a0SAchim Leubner encryptInfo->encryptionSecurityMode = agsaEncryptSMF;
68084e1bc9a0SAchim Leubner }
68094e1bc9a0SAchim Leubner if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMA_ENABLED)
68104e1bc9a0SAchim Leubner {
68114e1bc9a0SAchim Leubner encryptInfo->encryptionSecurityMode = agsaEncryptSMA;
68124e1bc9a0SAchim Leubner }
68134e1bc9a0SAchim Leubner if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMB_ENABLED )
68144e1bc9a0SAchim Leubner {
68154e1bc9a0SAchim Leubner encryptInfo->encryptionSecurityMode = agsaEncryptSMB;
68164e1bc9a0SAchim Leubner }
68174e1bc9a0SAchim Leubner if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) == SCRATCH_PAD1_V_RAAE_MASK)
68184e1bc9a0SAchim Leubner {
68194e1bc9a0SAchim Leubner if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK) == SCRATCH_PAD3_V_ENC_READY ) /* 3 */
68204e1bc9a0SAchim Leubner {
68214e1bc9a0SAchim Leubner encryptInfo->status = AGSA_RC_SUCCESS;
68224e1bc9a0SAchim Leubner }
68234e1bc9a0SAchim Leubner else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_READY) == SCRATCH_PAD3_V_ENC_DISABLED) /* 0 */
68244e1bc9a0SAchim Leubner {
68254e1bc9a0SAchim Leubner encryptInfo->status = 0xFFFF;
68264e1bc9a0SAchim Leubner encryptInfo->encryptionCipherMode = 0;
68274e1bc9a0SAchim Leubner encryptInfo->encryptionSecurityMode = 0;
68284e1bc9a0SAchim Leubner }
68294e1bc9a0SAchim Leubner else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_DIS_ERR) /* 1 */
68304e1bc9a0SAchim Leubner {
68314e1bc9a0SAchim Leubner encryptInfo->status = (ScratchPad3 & SCRATCH_PAD3_V_ERR_CODE ) >> SHIFT16;
68324e1bc9a0SAchim Leubner }
68334e1bc9a0SAchim Leubner else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_ENA_ERR) /* 2 */
68344e1bc9a0SAchim Leubner {
68354e1bc9a0SAchim Leubner encryptInfo->status = (ScratchPad3 & SCRATCH_PAD3_V_ERR_CODE ) >> SHIFT16;
68364e1bc9a0SAchim Leubner }
68374e1bc9a0SAchim Leubner }
68384e1bc9a0SAchim Leubner else if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) == SCRATCH_PAD1_V_RAAE_ERR)
68394e1bc9a0SAchim Leubner {
68404e1bc9a0SAchim Leubner SA_DBG1(("mpiSetControllerConfigRsp, RAAE not ready SPC AGSA_RC_FAILURE\n"));
68414e1bc9a0SAchim Leubner encryptInfo->status = 0xFFFF;
68424e1bc9a0SAchim Leubner encryptInfo->encryptionCipherMode = 0;
68434e1bc9a0SAchim Leubner encryptInfo->encryptionSecurityMode = 0;
68444e1bc9a0SAchim Leubner }
68454e1bc9a0SAchim Leubner else if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) == 0x0 )
68464e1bc9a0SAchim Leubner {
68474e1bc9a0SAchim Leubner SA_DBG2(("mpiSetControllerConfigRsp, RAAE not ready AGSA_RC_BUSY\n"));
68484e1bc9a0SAchim Leubner }
68494e1bc9a0SAchim Leubner
68504e1bc9a0SAchim Leubner SA_DBG2(("mpiSetControllerConfigRsp, encryptionCipherMode 0x%x encryptionSecurityMode 0x%x status 0x%x\n",
68514e1bc9a0SAchim Leubner encryptInfo->encryptionCipherMode,
68524e1bc9a0SAchim Leubner encryptInfo->encryptionSecurityMode,
68534e1bc9a0SAchim Leubner encryptInfo->status));
68544e1bc9a0SAchim Leubner SA_DBG2(("mpiSetControllerConfigRsp, ScratchPad3 0x%x\n",ScratchPad3));
68554e1bc9a0SAchim Leubner SA_DBG1(("mpiSetControllerConfigRsp:AGSA_ENCRYPTION_CONTROL_PARM_PAGE 0x%X\n", agMode.modePageOperation));
68564e1bc9a0SAchim Leubner ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_SECURITY_MODE, errorQualifier, (void *)encryptInfo, agMode.context);
68574e1bc9a0SAchim Leubner break;
68584e1bc9a0SAchim Leubner }
68594e1bc9a0SAchim Leubner
68604e1bc9a0SAchim Leubner default:
68614e1bc9a0SAchim Leubner SA_DBG1(("mpiSetControllerConfigRsp: Unknown page code 0x%X\n", pagetype));
68624e1bc9a0SAchim Leubner break;
68634e1bc9a0SAchim Leubner }
68644e1bc9a0SAchim Leubner
68654e1bc9a0SAchim Leubner /* remove the request from IOMap */
68664e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
68674e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
68684e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
68694e1bc9a0SAchim Leubner
68704e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
68714e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
68724e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
68734e1bc9a0SAchim Leubner /* return the request to free pool */
68744e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
68754e1bc9a0SAchim Leubner {
68764e1bc9a0SAchim Leubner SA_DBG1(("mpiSetControllerRsp: saving pRequest (%p) for later use\n", pRequest));
68774e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
68784e1bc9a0SAchim Leubner }
68794e1bc9a0SAchim Leubner else
68804e1bc9a0SAchim Leubner {
68814e1bc9a0SAchim Leubner /* return the request to free pool */
68824e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
68834e1bc9a0SAchim Leubner }
68844e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
68854e1bc9a0SAchim Leubner
68864e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3a");
68874e1bc9a0SAchim Leubner return AGSA_RC_SUCCESS;
68884e1bc9a0SAchim Leubner
68894e1bc9a0SAchim Leubner }
68904e1bc9a0SAchim Leubner
68914e1bc9a0SAchim Leubner /******************************************************************************/
68924e1bc9a0SAchim Leubner /*! \brief SAS Get Controller Config Response
68934e1bc9a0SAchim Leubner *
68944e1bc9a0SAchim Leubner * This routine handles the response of Get Controller Config Command
68954e1bc9a0SAchim Leubner *
68964e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
68974e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
68984e1bc9a0SAchim Leubner *
68994e1bc9a0SAchim Leubner * \return sucess or fail
69004e1bc9a0SAchim Leubner *
69014e1bc9a0SAchim Leubner */
69024e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetControllerConfigRsp(agsaRoot_t * agRoot,agsaGetControllerConfigRsp_t * pIomb)69034e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetControllerConfigRsp(
69044e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
69054e1bc9a0SAchim Leubner agsaGetControllerConfigRsp_t *pIomb
69064e1bc9a0SAchim Leubner )
69074e1bc9a0SAchim Leubner {
69084e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
69094e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
69104e1bc9a0SAchim Leubner agsaHWEventMode_t agMode;
69114e1bc9a0SAchim Leubner bit32 status, errorQualifier, tag;
69124e1bc9a0SAchim Leubner bit32 configPage[12];
69134e1bc9a0SAchim Leubner
69144e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3b");
69154e1bc9a0SAchim Leubner
69164e1bc9a0SAchim Leubner si_memset(&agMode, 0, sizeof(agsaHWEventMode_t));
69174e1bc9a0SAchim Leubner si_memset(configPage, 0, sizeof(configPage));
69184e1bc9a0SAchim Leubner
69194e1bc9a0SAchim Leubner
69204e1bc9a0SAchim Leubner SA_DBG2(("mpiGetControllerConfigRsp: HTag=0x%x\n", pIomb->tag));
69214e1bc9a0SAchim Leubner
69224e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t, tag));
69234e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t, status));
69244e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t, errorQualifier));
69254e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &configPage[0], pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[0] ));
69264e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &configPage[1], pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[1] ));
69274e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &configPage[2], pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[2] ));
69284e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &configPage[3], pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[3] ));
69294e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &configPage[4], pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[4] ));
69304e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &configPage[5], pIomb, OSSA_OFFSET_OF(agsaGetControllerConfigRsp_t,configPage[5] ));
69314e1bc9a0SAchim Leubner
69324e1bc9a0SAchim Leubner /* get request from IOMap */
69334e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
69344e1bc9a0SAchim Leubner if (agNULL == pRequest)
69354e1bc9a0SAchim Leubner {
69364e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
69374e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3b");
69384e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
69394e1bc9a0SAchim Leubner }
69404e1bc9a0SAchim Leubner
69414e1bc9a0SAchim Leubner si_memset(&agMode, 0, sizeof(agsaHWEventMode_t));
69424e1bc9a0SAchim Leubner agMode.modePageOperation = agsaModePageGet;
69434e1bc9a0SAchim Leubner agMode.status = status;
69444e1bc9a0SAchim Leubner
69454e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: page 0x%x status 0x%x errorQualifier 0x%x \n", (pIomb->configPage[0] & 0xFF),status, errorQualifier));
69464e1bc9a0SAchim Leubner
69474e1bc9a0SAchim Leubner switch (pIomb->configPage[0] & 0xFF)
69484e1bc9a0SAchim Leubner {
69494e1bc9a0SAchim Leubner case AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE:
69504e1bc9a0SAchim Leubner agMode.modePageLen = sizeof(agsaSASProtocolTimerConfigurationPage_t);
69514e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
69524e1bc9a0SAchim Leubner break;
69534e1bc9a0SAchim Leubner case AGSA_INTERRUPT_CONFIGURATION_PAGE:
69544e1bc9a0SAchim Leubner agMode.modePageLen = sizeof(agsaInterruptConfigPage_t);
69554e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: AGSA_INTERRUPT_CONFIGURATION_PAGE page len 0x%x \n",agMode.modePageLen));
69564e1bc9a0SAchim Leubner break;
69574e1bc9a0SAchim Leubner case AGSA_IO_GENERAL_CONFIG_PAGE:
69584e1bc9a0SAchim Leubner agMode.modePageLen = sizeof(agsaIoGeneralPage_t);
69594e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: AGSA_IO_GENERAL_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
69604e1bc9a0SAchim Leubner break;
69614e1bc9a0SAchim Leubner case AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE:
69624e1bc9a0SAchim Leubner agMode.modePageLen = sizeof(agsaEncryptGeneralPage_t);
69634e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
69644e1bc9a0SAchim Leubner #ifdef HIALEAH_ENCRYPTION
69654e1bc9a0SAchim Leubner saRoot->EncGenPage.numberOfKeksPageCode = configPage[0];
69664e1bc9a0SAchim Leubner saRoot->EncGenPage.KeyCardIdKekIndex = configPage[1];
69674e1bc9a0SAchim Leubner saRoot->EncGenPage.KeyCardId3_0 = configPage[2];
69684e1bc9a0SAchim Leubner saRoot->EncGenPage.KeyCardId7_4 = configPage[3];
69694e1bc9a0SAchim Leubner saRoot->EncGenPage.KeyCardId11_8 = configPage[4];
69704e1bc9a0SAchim Leubner
69714e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: numberOfKeksPageCode 0x%x\n",saRoot->EncGenPage.numberOfKeksPageCode));
69724e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: KeyCardIdKekIndex 0x%x\n",saRoot->EncGenPage.KeyCardIdKekIndex));
69734e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: KeyCardId3_0 0x%x\n",saRoot->EncGenPage.KeyCardId3_0));
69744e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: KeyCardId7_4 0x%x\n",saRoot->EncGenPage.KeyCardId7_4));
69754e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: KeyCardId11_8 0x%x\n",saRoot->EncGenPage.KeyCardId11_8));
69764e1bc9a0SAchim Leubner #endif /* HIALEAH_ENCRYPTION */
69774e1bc9a0SAchim Leubner
69784e1bc9a0SAchim Leubner break;
69794e1bc9a0SAchim Leubner case AGSA_ENCRYPTION_DEK_CONFIG_PAGE:
69804e1bc9a0SAchim Leubner agMode.modePageLen = sizeof(agsaEncryptDekConfigPage_t);
69814e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_DEK_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
69824e1bc9a0SAchim Leubner break;
69834e1bc9a0SAchim Leubner case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:
69844e1bc9a0SAchim Leubner agMode.modePageLen = sizeof(agsaEncryptControlParamPage_t);
69854e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_CONTROL_PARM_PAGE page len 0x%x \n",agMode.modePageLen));
69864e1bc9a0SAchim Leubner break;
69874e1bc9a0SAchim Leubner case AGSA_ENCRYPTION_HMAC_CONFIG_PAGE:
69884e1bc9a0SAchim Leubner agMode.modePageLen = sizeof(agsaEncryptHMACConfigPage_t);
69894e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: AGSA_ENCRYPTION_HMAC_CONFIG_PAGE page len 0x%x \n",agMode.modePageLen));
69904e1bc9a0SAchim Leubner break;
69914e1bc9a0SAchim Leubner default:
69924e1bc9a0SAchim Leubner agMode.modePageLen = 0;
69934e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerConfigRsp: Unknown !!! page len 0x%x \n",agMode.modePageLen));
69944e1bc9a0SAchim Leubner break;
69954e1bc9a0SAchim Leubner }
69964e1bc9a0SAchim Leubner
69974e1bc9a0SAchim Leubner agMode.modePage = (void *) &pIomb->configPage[0];
69984e1bc9a0SAchim Leubner agMode.context = saRoot->IOMap[tag].agContext;
69994e1bc9a0SAchim Leubner
70004e1bc9a0SAchim Leubner /* Report the event before freeing the IOMB */
70014e1bc9a0SAchim Leubner ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_MODE, errorQualifier, (void *) &agMode, 0);
70024e1bc9a0SAchim Leubner
70034e1bc9a0SAchim Leubner /* remove the request from IOMap */
70044e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
70054e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
70064e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
70074e1bc9a0SAchim Leubner
70084e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
70094e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
70104e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
70114e1bc9a0SAchim Leubner /* return the request to free pool */
70124e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
70134e1bc9a0SAchim Leubner {
70144e1bc9a0SAchim Leubner SA_DBG1(("mpiGetControllerRsp: saving pRequest (%p) for later use\n", pRequest));
70154e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
70164e1bc9a0SAchim Leubner }
70174e1bc9a0SAchim Leubner else
70184e1bc9a0SAchim Leubner {
70194e1bc9a0SAchim Leubner /* return the request to free pool */
70204e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
70214e1bc9a0SAchim Leubner }
70224e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
70234e1bc9a0SAchim Leubner
70244e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3b");
70254e1bc9a0SAchim Leubner return AGSA_RC_SUCCESS;
70264e1bc9a0SAchim Leubner }
70274e1bc9a0SAchim Leubner
70284e1bc9a0SAchim Leubner /******************************************************************************/
70294e1bc9a0SAchim Leubner /*! \brief KEK Management Response
70304e1bc9a0SAchim Leubner *
70314e1bc9a0SAchim Leubner * This routine handles the response of the KEK management message
70324e1bc9a0SAchim Leubner *
70334e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
70344e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
70354e1bc9a0SAchim Leubner *
70364e1bc9a0SAchim Leubner * \return sucess or fail
70374e1bc9a0SAchim Leubner *
70384e1bc9a0SAchim Leubner */
70394e1bc9a0SAchim Leubner /*******************************************************************************/
mpiKekManagementRsp(agsaRoot_t * agRoot,agsaKekManagementRsp_t * pIomb)70404e1bc9a0SAchim Leubner GLOBAL bit32 mpiKekManagementRsp(
70414e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
70424e1bc9a0SAchim Leubner agsaKekManagementRsp_t *pIomb
70434e1bc9a0SAchim Leubner )
70444e1bc9a0SAchim Leubner {
70454e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
70464e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
70474e1bc9a0SAchim Leubner agsaContext_t *agContext;
70484e1bc9a0SAchim Leubner agsaHWEventEncrypt_t agEvent;
70494e1bc9a0SAchim Leubner bit32 status, errorQualifier, tag, flags;
70504e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2A");
70514e1bc9a0SAchim Leubner
70524e1bc9a0SAchim Leubner SA_DBG1(("mpiKekManagementRsp: HTag=0x%x\n", pIomb->tag));
70534e1bc9a0SAchim Leubner
70544e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, tag));
70554e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, status));
70564e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &flags, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, flags));
70574e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaKekManagementRsp_t, errorQualifier));
70584e1bc9a0SAchim Leubner
70594e1bc9a0SAchim Leubner
70604e1bc9a0SAchim Leubner SA_DBG1(("mpiKekManagementRsp:status 0x%x flags 0x%x errorQualifier 0x%x\n", status, flags, errorQualifier));
70614e1bc9a0SAchim Leubner
70624e1bc9a0SAchim Leubner si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
70634e1bc9a0SAchim Leubner if ((flags & 0xFF) == KEK_MGMT_SUBOP_UPDATE)
70644e1bc9a0SAchim Leubner {
70654e1bc9a0SAchim Leubner SA_DBG1(("mpiKekManagementRsp:KEK_MGMT_SUBOP_UPDATE 0x%x \n", status));
70664e1bc9a0SAchim Leubner if (flags & 0xFF00) /* update and store*/
70674e1bc9a0SAchim Leubner {
70684e1bc9a0SAchim Leubner agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE;
70694e1bc9a0SAchim Leubner }
70704e1bc9a0SAchim Leubner else /* update */
70714e1bc9a0SAchim Leubner {
70724e1bc9a0SAchim Leubner agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE;
70734e1bc9a0SAchim Leubner }
70744e1bc9a0SAchim Leubner agEvent.status = status;
70754e1bc9a0SAchim Leubner if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
70764e1bc9a0SAchim Leubner {
70774e1bc9a0SAchim Leubner agEvent.eq = errorQualifier;
70784e1bc9a0SAchim Leubner }
70794e1bc9a0SAchim Leubner agEvent.info = 0;
70804e1bc9a0SAchim Leubner /* Store the new KEK index in agEvent.handle */
70814e1bc9a0SAchim Leubner agEvent.handle = (void *) ((bitptr) (flags >> 24));
70824e1bc9a0SAchim Leubner /* Store the current KEK index in agEvent.param */
70834e1bc9a0SAchim Leubner agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
70844e1bc9a0SAchim Leubner
70854e1bc9a0SAchim Leubner }
70864e1bc9a0SAchim Leubner
70874e1bc9a0SAchim Leubner else if ((flags & 0xFF) == KEK_MGMT_SUBOP_INVALIDATE)
70884e1bc9a0SAchim Leubner {
70894e1bc9a0SAchim Leubner agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_INVALIDTE;
70904e1bc9a0SAchim Leubner agEvent.status = status;
70914e1bc9a0SAchim Leubner if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
70924e1bc9a0SAchim Leubner {
70934e1bc9a0SAchim Leubner agEvent.eq = errorQualifier;
70944e1bc9a0SAchim Leubner }
70954e1bc9a0SAchim Leubner agEvent.info = 0;
70964e1bc9a0SAchim Leubner /* Store the new KEK index in agEvent.handle */
70974e1bc9a0SAchim Leubner agEvent.handle = (void *) ((bitptr) (flags >> 24));
70984e1bc9a0SAchim Leubner /* Store the current KEK index in agEvent.param */
70994e1bc9a0SAchim Leubner agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
71004e1bc9a0SAchim Leubner }
71014e1bc9a0SAchim Leubner
71024e1bc9a0SAchim Leubner else if ((flags & 0xFF) == KEK_MGMT_SUBOP_KEYCARDINVALIDATE)
71034e1bc9a0SAchim Leubner {
71044e1bc9a0SAchim Leubner agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE;
71054e1bc9a0SAchim Leubner agEvent.status = status;
71064e1bc9a0SAchim Leubner if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
71074e1bc9a0SAchim Leubner {
71084e1bc9a0SAchim Leubner agEvent.eq = errorQualifier;
71094e1bc9a0SAchim Leubner }
71104e1bc9a0SAchim Leubner agEvent.info = 0;
71114e1bc9a0SAchim Leubner /* Store the new KEK index in agEvent.handle */
71124e1bc9a0SAchim Leubner agEvent.handle = (void *) ((bitptr) (flags >> 24));
71134e1bc9a0SAchim Leubner /* Store the current KEK index in agEvent.param */
71144e1bc9a0SAchim Leubner agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
71154e1bc9a0SAchim Leubner
71164e1bc9a0SAchim Leubner }
71174e1bc9a0SAchim Leubner
71184e1bc9a0SAchim Leubner else if ((flags & 0xFF) == KEK_MGMT_SUBOP_KEYCARDUPDATE)
71194e1bc9a0SAchim Leubner {
71204e1bc9a0SAchim Leubner agEvent.encryptOperation = OSSA_HW_ENCRYPT_KEK_UPDATE;
71214e1bc9a0SAchim Leubner agEvent.status = status;
71224e1bc9a0SAchim Leubner if (status == OSSA_MPI_ENC_ERR_ILLEGAL_KEK_PARAM)
71234e1bc9a0SAchim Leubner {
71244e1bc9a0SAchim Leubner agEvent.eq = errorQualifier;
71254e1bc9a0SAchim Leubner }
71264e1bc9a0SAchim Leubner agEvent.info = 0;
71274e1bc9a0SAchim Leubner /* Store the new KEK index in agEvent.handle */
71284e1bc9a0SAchim Leubner agEvent.handle = (void *) ((bitptr) (flags >> 24));
71294e1bc9a0SAchim Leubner /* Store the current KEK index in agEvent.param */
71304e1bc9a0SAchim Leubner agEvent.param = (void *) ((bitptr) (flags >> 16) & 0xFF);
71314e1bc9a0SAchim Leubner
71324e1bc9a0SAchim Leubner }
71334e1bc9a0SAchim Leubner /* get request from IOMap */
71344e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
71354e1bc9a0SAchim Leubner if (agNULL == pRequest)
71364e1bc9a0SAchim Leubner {
71374e1bc9a0SAchim Leubner SA_DBG1(("mpiKekManagementRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
71384e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2A");
71394e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
71404e1bc9a0SAchim Leubner }
71414e1bc9a0SAchim Leubner
71424e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
71434e1bc9a0SAchim Leubner /* remove the request from IOMap */
71444e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
71454e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
71464e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
71474e1bc9a0SAchim Leubner
71484e1bc9a0SAchim Leubner ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void *) &agEvent, agContext);
71494e1bc9a0SAchim Leubner
71504e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
71514e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
71524e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
71534e1bc9a0SAchim Leubner /* return the request to free pool */
71544e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
71554e1bc9a0SAchim Leubner {
71564e1bc9a0SAchim Leubner SA_DBG1(("mpiKekManagementRsp: saving pRequest (%p) for later use\n", pRequest));
71574e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
71584e1bc9a0SAchim Leubner }
71594e1bc9a0SAchim Leubner else
71604e1bc9a0SAchim Leubner {
71614e1bc9a0SAchim Leubner /* return the request to free pool */
71624e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
71634e1bc9a0SAchim Leubner }
71644e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
71654e1bc9a0SAchim Leubner
71664e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2A");
71674e1bc9a0SAchim Leubner
71684e1bc9a0SAchim Leubner return AGSA_RC_SUCCESS;
71694e1bc9a0SAchim Leubner }
71704e1bc9a0SAchim Leubner
71714e1bc9a0SAchim Leubner /******************************************************************************/
71724e1bc9a0SAchim Leubner /*! \brief DEK Management Response
71734e1bc9a0SAchim Leubner *
71744e1bc9a0SAchim Leubner * This routine handles the response of the DEK management message
71754e1bc9a0SAchim Leubner *
71764e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
71774e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
71784e1bc9a0SAchim Leubner *
71794e1bc9a0SAchim Leubner * \return sucess or fail
71804e1bc9a0SAchim Leubner *
71814e1bc9a0SAchim Leubner */
71824e1bc9a0SAchim Leubner /*******************************************************************************/
mpiDekManagementRsp(agsaRoot_t * agRoot,agsaDekManagementRsp_t * pIomb)71834e1bc9a0SAchim Leubner GLOBAL bit32 mpiDekManagementRsp(
71844e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
71854e1bc9a0SAchim Leubner agsaDekManagementRsp_t *pIomb
71864e1bc9a0SAchim Leubner )
71874e1bc9a0SAchim Leubner {
71884e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
71894e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
71904e1bc9a0SAchim Leubner agsaContext_t *agContext;
71914e1bc9a0SAchim Leubner agsaHWEventEncrypt_t agEvent;
71924e1bc9a0SAchim Leubner bit32 flags, status, errorQualifier, tag, dekIndex;
71934e1bc9a0SAchim Leubner
71944e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"2B");
71954e1bc9a0SAchim Leubner
71964e1bc9a0SAchim Leubner SA_DBG1(("mpiDekManagementRsp: HTag=0x%x\n", pIomb->tag));
71974e1bc9a0SAchim Leubner
71984e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, tag));
71994e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, status));
72004e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &flags, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, flags));
72014e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, errorQualifier));
72024e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &dekIndex, pIomb, OSSA_OFFSET_OF(agsaDekManagementRsp_t, dekIndex));
72034e1bc9a0SAchim Leubner
72044e1bc9a0SAchim Leubner SA_DBG2(("mpiDekManagementRsp:tag =0x%x\n",tag ));
72054e1bc9a0SAchim Leubner SA_DBG2(("mpiDekManagementRsp:status =0x%x\n", status));
72064e1bc9a0SAchim Leubner SA_DBG2(("mpiDekManagementRsp:flags =0x%x\n",flags ));
72074e1bc9a0SAchim Leubner SA_DBG2(("mpiDekManagementRsp:errorQualifier =0x%x\n", errorQualifier));
72084e1bc9a0SAchim Leubner SA_DBG2(("mpiDekManagementRsp:dekIndex =0x%x\n",dekIndex ));
72094e1bc9a0SAchim Leubner
72104e1bc9a0SAchim Leubner si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
72114e1bc9a0SAchim Leubner if ((flags & 0xFF) == DEK_MGMT_SUBOP_UPDATE)
72124e1bc9a0SAchim Leubner {
72134e1bc9a0SAchim Leubner agEvent.encryptOperation = OSSA_HW_ENCRYPT_DEK_UPDATE;
72144e1bc9a0SAchim Leubner }
72154e1bc9a0SAchim Leubner else
72164e1bc9a0SAchim Leubner {
72174e1bc9a0SAchim Leubner agEvent.encryptOperation = OSSA_HW_ENCRYPT_DEK_INVALIDTE;
72184e1bc9a0SAchim Leubner }
72194e1bc9a0SAchim Leubner agEvent.status = status;
7220*ead758a6SSvyatoslav if (status == OSSA_MPI_ENC_ERR_ILLEGAL_DEK_PARAM || status == OSSA_MPI_ERR_DEK_MANAGEMENT_DEK_UNWRAP_FAIL)
72214e1bc9a0SAchim Leubner {
72224e1bc9a0SAchim Leubner agEvent.eq = errorQualifier;
72234e1bc9a0SAchim Leubner }
72244e1bc9a0SAchim Leubner /* Store the DEK in agEvent.info */
72254e1bc9a0SAchim Leubner agEvent.info = (flags >> 8) & 0xF;
72264e1bc9a0SAchim Leubner /* Store the KEK index in agEvent.handle */
72274e1bc9a0SAchim Leubner agEvent.handle = (void *) ((bitptr) (flags >> 24));
72284e1bc9a0SAchim Leubner /* Store the DEK index in agEvent.param */
72294e1bc9a0SAchim Leubner agEvent.param = (void *) (bitptr) dekIndex;
72304e1bc9a0SAchim Leubner
72314e1bc9a0SAchim Leubner /* get request from IOMap */
72324e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
72334e1bc9a0SAchim Leubner if (agNULL == pRequest)
72344e1bc9a0SAchim Leubner {
72354e1bc9a0SAchim Leubner SA_DBG1(("mpiDekManagementRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
72364e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2B");
72374e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
72384e1bc9a0SAchim Leubner }
72394e1bc9a0SAchim Leubner
72404e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
72414e1bc9a0SAchim Leubner /* remove the request from IOMap */
72424e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
72434e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
72444e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
72454e1bc9a0SAchim Leubner
72464e1bc9a0SAchim Leubner ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void *) &agEvent,agContext );
72474e1bc9a0SAchim Leubner
72484e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
72494e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
72504e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
72514e1bc9a0SAchim Leubner /* return the request to free pool */
72524e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
72534e1bc9a0SAchim Leubner {
72544e1bc9a0SAchim Leubner SA_DBG1(("mpiDekManagementRsp: saving pRequest (%p) for later use\n", pRequest));
72554e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
72564e1bc9a0SAchim Leubner }
72574e1bc9a0SAchim Leubner else
72584e1bc9a0SAchim Leubner {
72594e1bc9a0SAchim Leubner /* return the request to free pool */
72604e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
72614e1bc9a0SAchim Leubner }
72624e1bc9a0SAchim Leubner
72634e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
72644e1bc9a0SAchim Leubner
72654e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2B");
72664e1bc9a0SAchim Leubner
72674e1bc9a0SAchim Leubner return AGSA_RC_SUCCESS;
72684e1bc9a0SAchim Leubner }
72694e1bc9a0SAchim Leubner
72704e1bc9a0SAchim Leubner /******************************************************************************/
72714e1bc9a0SAchim Leubner /*! \brief Operator Management Response
72724e1bc9a0SAchim Leubner *
72734e1bc9a0SAchim Leubner * This routine handles the response of the Operator management message
72744e1bc9a0SAchim Leubner *
72754e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
72764e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
72774e1bc9a0SAchim Leubner *
72784e1bc9a0SAchim Leubner * \return sucess or fail
72794e1bc9a0SAchim Leubner *
72804e1bc9a0SAchim Leubner */
72814e1bc9a0SAchim Leubner /*******************************************************************************/
mpiOperatorManagementRsp(agsaRoot_t * agRoot,agsaOperatorMangmenRsp_t * pIomb)72824e1bc9a0SAchim Leubner GLOBAL bit32 mpiOperatorManagementRsp(
72834e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
72844e1bc9a0SAchim Leubner agsaOperatorMangmenRsp_t *pIomb
72854e1bc9a0SAchim Leubner )
72864e1bc9a0SAchim Leubner {
72874e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
72884e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
72894e1bc9a0SAchim Leubner agsaContext_t *agContext;
72904e1bc9a0SAchim Leubner agsaHWEventEncrypt_t agEvent;
72914e1bc9a0SAchim Leubner bit32 OPRIDX_AUTIDX_R_OMO,status, errorQualifier, tag;
72924e1bc9a0SAchim Leubner
72934e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"36");
72944e1bc9a0SAchim Leubner
72954e1bc9a0SAchim Leubner SA_DBG1(("mpiOperatorManagementRsp: HTag=0x%x\n", pIomb->tag));
72964e1bc9a0SAchim Leubner
72974e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, tag));
72984e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, status));
72994e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &OPRIDX_AUTIDX_R_OMO, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, OPRIDX_AUTIDX_R_OMO));
73004e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &errorQualifier, pIomb, OSSA_OFFSET_OF(agsaOperatorMangmenRsp_t, errorQualifier));
73014e1bc9a0SAchim Leubner
73024e1bc9a0SAchim Leubner SA_DBG2(("mpiOperatorManagementRsp:tag =0x%x\n",tag ));
73034e1bc9a0SAchim Leubner SA_DBG2(("mpiOperatorManagementRsp:status =0x%x\n", status));
73044e1bc9a0SAchim Leubner SA_DBG2(("mpiOperatorManagementRsp:OPRIDX_AUTIDX_R_OMO =0x%x\n",OPRIDX_AUTIDX_R_OMO ));
73054e1bc9a0SAchim Leubner SA_DBG2(("mpiOperatorManagementRsp:errorQualifier =0x%x\n", errorQualifier));
73064e1bc9a0SAchim Leubner
73074e1bc9a0SAchim Leubner /* get request from IOMap */
73084e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
73094e1bc9a0SAchim Leubner if (agNULL == pRequest)
73104e1bc9a0SAchim Leubner {
73114e1bc9a0SAchim Leubner SA_DBG1(("mpiOperatorManagementRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
73124e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "36");
73134e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
73144e1bc9a0SAchim Leubner }
73154e1bc9a0SAchim Leubner
73164e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
73174e1bc9a0SAchim Leubner /* remove the request from IOMap */
73184e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
73194e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
73204e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
73214e1bc9a0SAchim Leubner
73224e1bc9a0SAchim Leubner si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
73234e1bc9a0SAchim Leubner agEvent.status = status;
73244e1bc9a0SAchim Leubner agEvent.info = OPRIDX_AUTIDX_R_OMO;
73254e1bc9a0SAchim Leubner agEvent.encryptOperation = OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT;
73264e1bc9a0SAchim Leubner if (status == OPR_MGMT_MPI_ENC_ERR_OPR_PARAM_ILLEGAL)
73274e1bc9a0SAchim Leubner {
73284e1bc9a0SAchim Leubner agEvent.eq = errorQualifier;
73294e1bc9a0SAchim Leubner }
73304e1bc9a0SAchim Leubner
73314e1bc9a0SAchim Leubner ossaOperatorManagementCB(agRoot, agContext, status, errorQualifier);
73324e1bc9a0SAchim Leubner
73334e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
73344e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
73354e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
73364e1bc9a0SAchim Leubner /* return the request to free pool */
73374e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
73384e1bc9a0SAchim Leubner {
73394e1bc9a0SAchim Leubner SA_DBG1(("mpiOperatorManagementRsp: saving pRequest (%p) for later use\n", pRequest));
73404e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
73414e1bc9a0SAchim Leubner }
73424e1bc9a0SAchim Leubner else
73434e1bc9a0SAchim Leubner {
73444e1bc9a0SAchim Leubner /* return the request to free pool */
73454e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
73464e1bc9a0SAchim Leubner }
73474e1bc9a0SAchim Leubner
73484e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
73494e1bc9a0SAchim Leubner
73504e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "36");
73514e1bc9a0SAchim Leubner
73524e1bc9a0SAchim Leubner return AGSA_RC_SUCCESS;
73534e1bc9a0SAchim Leubner }
73544e1bc9a0SAchim Leubner
mpiBistRsp(agsaRoot_t * agRoot,agsaEncryptBistRsp_t * pIomb)73554e1bc9a0SAchim Leubner GLOBAL bit32 mpiBistRsp(
73564e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
73574e1bc9a0SAchim Leubner agsaEncryptBistRsp_t *pIomb
73584e1bc9a0SAchim Leubner )
73594e1bc9a0SAchim Leubner {
73604e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
73614e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
73624e1bc9a0SAchim Leubner agsaContext_t *agContext;
73634e1bc9a0SAchim Leubner agsaHWEventEncrypt_t agEvent;
73644e1bc9a0SAchim Leubner bit32 status;
73654e1bc9a0SAchim Leubner bit32 results[11];
73664e1bc9a0SAchim Leubner bit32 length;
73674e1bc9a0SAchim Leubner bit32 subop;
73684e1bc9a0SAchim Leubner bit32 tag;
73694e1bc9a0SAchim Leubner
73704e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"37");
73714e1bc9a0SAchim Leubner
73724e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, tag));
73734e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, status));
73744e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &subop, pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, subop));
73754e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &results[0], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[0]));
73764e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &results[1], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[1]));
73774e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &results[2], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[2]));
73784e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &results[3], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[3]));
73794e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &results[4], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[4]));
73804e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &results[5], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[5]));
73814e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &results[6], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[6]));
73824e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &results[7], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[7]));
73834e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &results[8], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[8]));
73844e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &results[9], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[9]));
73854e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &results[10], pIomb, OSSA_OFFSET_OF(agsaEncryptBistRsp_t, testResults[10]));
73864e1bc9a0SAchim Leubner
73874e1bc9a0SAchim Leubner subop &= 0xFF;
73884e1bc9a0SAchim Leubner SA_DBG1(("mpiBistRsp: HTag=0x%x subops =0x%x status =0x%x\n",pIomb->tag, subop, status));
73894e1bc9a0SAchim Leubner
73904e1bc9a0SAchim Leubner switch(subop)
73914e1bc9a0SAchim Leubner {
73924e1bc9a0SAchim Leubner case AGSA_BIST_TEST:
73934e1bc9a0SAchim Leubner length = sizeof(agsaEncryptSelfTestStatusBitMap_t);
73944e1bc9a0SAchim Leubner break;
73954e1bc9a0SAchim Leubner case AGSA_SHA_TEST:
73964e1bc9a0SAchim Leubner length = sizeof(agsaEncryptSHATestResult_t);
73974e1bc9a0SAchim Leubner break;
73984e1bc9a0SAchim Leubner case AGSA_HMAC_TEST:
73994e1bc9a0SAchim Leubner length = sizeof(agsaEncryptHMACTestResult_t);
74004e1bc9a0SAchim Leubner break;
74014e1bc9a0SAchim Leubner default:
74024e1bc9a0SAchim Leubner length = 0;
74034e1bc9a0SAchim Leubner break;
74044e1bc9a0SAchim Leubner }
74054e1bc9a0SAchim Leubner
74064e1bc9a0SAchim Leubner si_memset(&agEvent, 0, sizeof(agsaHWEventEncrypt_t));
74074e1bc9a0SAchim Leubner agEvent.status = status;
74084e1bc9a0SAchim Leubner agEvent.encryptOperation = OSSA_HW_ENCRYPT_TEST_EXECUTE;
74094e1bc9a0SAchim Leubner agEvent.info = length;
74104e1bc9a0SAchim Leubner agEvent.eq = subop;
74114e1bc9a0SAchim Leubner agEvent.handle = agNULL;
74124e1bc9a0SAchim Leubner agEvent.param = &results;
74134e1bc9a0SAchim Leubner
74144e1bc9a0SAchim Leubner /* get request from IOMap */
74154e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
74164e1bc9a0SAchim Leubner if (agNULL == pRequest)
74174e1bc9a0SAchim Leubner {
74184e1bc9a0SAchim Leubner SA_DBG1(("mpiBistRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
74194e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "37");
74204e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
74214e1bc9a0SAchim Leubner }
74224e1bc9a0SAchim Leubner
74234e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
74244e1bc9a0SAchim Leubner
74254e1bc9a0SAchim Leubner ossaHwCB(agRoot, NULL, OSSA_HW_EVENT_ENCRYPTION, 0, (void*)&agEvent, agContext);
74264e1bc9a0SAchim Leubner
74274e1bc9a0SAchim Leubner /* remove the request from IOMap */
74284e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
74294e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
74304e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
74314e1bc9a0SAchim Leubner
74324e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
74334e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
74344e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
74354e1bc9a0SAchim Leubner /* return the request to free pool */
74364e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
74374e1bc9a0SAchim Leubner {
74384e1bc9a0SAchim Leubner SA_DBG1(("mpiBistRsp: saving pRequest (%p) for later use\n", pRequest));
74394e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
74404e1bc9a0SAchim Leubner }
74414e1bc9a0SAchim Leubner else
74424e1bc9a0SAchim Leubner {
74434e1bc9a0SAchim Leubner /* return the request to free pool */
74444e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
74454e1bc9a0SAchim Leubner }
74464e1bc9a0SAchim Leubner
74474e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
74484e1bc9a0SAchim Leubner
74494e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "37");
74504e1bc9a0SAchim Leubner
74514e1bc9a0SAchim Leubner return AGSA_RC_SUCCESS;
74524e1bc9a0SAchim Leubner }
74534e1bc9a0SAchim Leubner
74544e1bc9a0SAchim Leubner /******************************************************************************/
74554e1bc9a0SAchim Leubner /*! \brief Set Operator Response
74564e1bc9a0SAchim Leubner *
74574e1bc9a0SAchim Leubner * This routine handles the response of the Operator management message
74584e1bc9a0SAchim Leubner *
74594e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
74604e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
74614e1bc9a0SAchim Leubner *
74624e1bc9a0SAchim Leubner * \return sucess or fail
74634e1bc9a0SAchim Leubner *
74644e1bc9a0SAchim Leubner */
74654e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSetOperatorRsp(agsaRoot_t * agRoot,agsaSetOperatorRsp_t * pIomb)74664e1bc9a0SAchim Leubner GLOBAL bit32 mpiSetOperatorRsp(
74674e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
74684e1bc9a0SAchim Leubner agsaSetOperatorRsp_t *pIomb
74694e1bc9a0SAchim Leubner )
74704e1bc9a0SAchim Leubner {
74714e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
74724e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest = agNULL;
74734e1bc9a0SAchim Leubner agsaContext_t *agContext = agNULL;
74744e1bc9a0SAchim Leubner bit32 ERR_QLFR_OPRIDX_PIN_ACS, OPRIDX_PIN_ACS, status, errorQualifier, tag = 0;
74754e1bc9a0SAchim Leubner
74764e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"38");
74774e1bc9a0SAchim Leubner
74784e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaSetOperatorRsp_t, tag));
74794e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaSetOperatorRsp_t, status));
74804e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &ERR_QLFR_OPRIDX_PIN_ACS, pIomb, OSSA_OFFSET_OF(agsaSetOperatorRsp_t, ERR_QLFR_OPRIDX_PIN_ACS));
74814e1bc9a0SAchim Leubner
74824e1bc9a0SAchim Leubner errorQualifier = ERR_QLFR_OPRIDX_PIN_ACS >> 16;
74834e1bc9a0SAchim Leubner OPRIDX_PIN_ACS = ERR_QLFR_OPRIDX_PIN_ACS & 0xFFFF;
74844e1bc9a0SAchim Leubner
74854e1bc9a0SAchim Leubner SA_DBG1(("mpiSetOperatorRsp: HTag=0x%x ERR_QLFR=0x%x OPRIDX_PIN_ACS=0x%x \n",tag, errorQualifier, OPRIDX_PIN_ACS));
74864e1bc9a0SAchim Leubner
74874e1bc9a0SAchim Leubner /* get request from IOMap */
74884e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
74894e1bc9a0SAchim Leubner if (agNULL == pRequest)
74904e1bc9a0SAchim Leubner {
74914e1bc9a0SAchim Leubner SA_DBG1(("mpiSetOperatorRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
74924e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "38");
74934e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
74944e1bc9a0SAchim Leubner }
74954e1bc9a0SAchim Leubner
74964e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
74974e1bc9a0SAchim Leubner /* remove the request from IOMap */
74984e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
74994e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
75004e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
75014e1bc9a0SAchim Leubner
75024e1bc9a0SAchim Leubner
75034e1bc9a0SAchim Leubner ossaSetOperatorCB(agRoot,agContext,status,errorQualifier );
75044e1bc9a0SAchim Leubner
75054e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
75064e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
75074e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
75084e1bc9a0SAchim Leubner /* return the request to free pool */
75094e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
75104e1bc9a0SAchim Leubner {
75114e1bc9a0SAchim Leubner SA_DBG1(("mpiSetOperatorRsp: saving pRequest (%p) for later use\n", pRequest));
75124e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
75134e1bc9a0SAchim Leubner }
75144e1bc9a0SAchim Leubner else
75154e1bc9a0SAchim Leubner {
75164e1bc9a0SAchim Leubner /* return the request to free pool */
75174e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
75184e1bc9a0SAchim Leubner }
75194e1bc9a0SAchim Leubner
75204e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
75214e1bc9a0SAchim Leubner
75224e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "38");
75234e1bc9a0SAchim Leubner
75244e1bc9a0SAchim Leubner return AGSA_RC_SUCCESS;
75254e1bc9a0SAchim Leubner }
75264e1bc9a0SAchim Leubner
75274e1bc9a0SAchim Leubner /******************************************************************************/
75284e1bc9a0SAchim Leubner /*! \brief Get Operator Response
75294e1bc9a0SAchim Leubner *
75304e1bc9a0SAchim Leubner * This routine handles the response of the Operator management message
75314e1bc9a0SAchim Leubner *
75324e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
75334e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
75344e1bc9a0SAchim Leubner *
75354e1bc9a0SAchim Leubner * \return sucess or fail
75364e1bc9a0SAchim Leubner *
75374e1bc9a0SAchim Leubner */
75384e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetOperatorRsp(agsaRoot_t * agRoot,agsaGetOperatorRsp_t * pIomb)75394e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetOperatorRsp(
75404e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
75414e1bc9a0SAchim Leubner agsaGetOperatorRsp_t *pIomb
75424e1bc9a0SAchim Leubner )
75434e1bc9a0SAchim Leubner {
75444e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
75454e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
75464e1bc9a0SAchim Leubner agsaContext_t *agContext;
75474e1bc9a0SAchim Leubner bit32 Num_Option, NumOperators ,status, tag;
75484e1bc9a0SAchim Leubner bit8 option, Role = 0;
75494e1bc9a0SAchim Leubner bit32 IDstr[8];
75504e1bc9a0SAchim Leubner bit8 *tmpIDstr = agNULL;
75514e1bc9a0SAchim Leubner agsaID_t *IDString = agNULL;
75524e1bc9a0SAchim Leubner
75534e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3f");
75544e1bc9a0SAchim Leubner
75554e1bc9a0SAchim Leubner si_memset(&IDstr, 0, sizeof(IDstr));
75564e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, tag));
75574e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, status));
75584e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &Num_Option, pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, Num_Option));
75594e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &IDstr[0], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[0]));
75604e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &IDstr[1], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[1]));
75614e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &IDstr[2], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[2]));
75624e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &IDstr[3], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[3]));
75634e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &IDstr[4], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[4]));
75644e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &IDstr[5], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[5]));
75654e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &IDstr[6], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[6]));
75664e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &IDstr[7], pIomb, OSSA_OFFSET_OF(agsaGetOperatorRsp_t, IDString[7]));
75674e1bc9a0SAchim Leubner
75684e1bc9a0SAchim Leubner SA_DBG1(("mpiGetOperatorRsp:tag=0x%x status=0x%x Num_Option=0x%x IDString_Role=0x%x\n",
75694e1bc9a0SAchim Leubner tag, status, Num_Option, IDstr[0]));
75704e1bc9a0SAchim Leubner
75714e1bc9a0SAchim Leubner /* get request from IOMap */
75724e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
75734e1bc9a0SAchim Leubner if (agNULL == pRequest)
75744e1bc9a0SAchim Leubner {
75754e1bc9a0SAchim Leubner SA_DBG1(("mpiGetOperatorRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
75764e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3f");
75774e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
75784e1bc9a0SAchim Leubner }
75794e1bc9a0SAchim Leubner
75804e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
75814e1bc9a0SAchim Leubner /* remove the request from IOMap */
75824e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
75834e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
75844e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
75854e1bc9a0SAchim Leubner option = Num_Option & 0xFF;
75864e1bc9a0SAchim Leubner NumOperators = (Num_Option >> SHIFT8) & 0xFF;
75874e1bc9a0SAchim Leubner /* current operator's Role/ID, valid only if option == 1 */
75884e1bc9a0SAchim Leubner if ( option == 1)
75894e1bc9a0SAchim Leubner {
75904e1bc9a0SAchim Leubner /* extra the role value as parameter */
75914e1bc9a0SAchim Leubner Role = IDstr[0] & 0xFF;
75924e1bc9a0SAchim Leubner tmpIDstr = (bit8*)&IDstr[0];
75934e1bc9a0SAchim Leubner tmpIDstr++; /* skip role byte */
75944e1bc9a0SAchim Leubner IDString = (agsaID_t *)tmpIDstr;
75954e1bc9a0SAchim Leubner SA_DBG1(("mpiGetOperatorRsp: OSSA_IO_SUCCESS\n"));
75964e1bc9a0SAchim Leubner SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[0], IDString->ID[1], IDString->ID[2], IDString->ID[3]));
75974e1bc9a0SAchim Leubner SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[4], IDString->ID[5], IDString->ID[6], IDString->ID[7]));
75984e1bc9a0SAchim Leubner SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[8], IDString->ID[9], IDString->ID[10],IDString->ID[11]));
75994e1bc9a0SAchim Leubner SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[12],IDString->ID[13],IDString->ID[14],IDString->ID[15]));
76004e1bc9a0SAchim Leubner SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[16],IDString->ID[17],IDString->ID[18],IDString->ID[19]));
76014e1bc9a0SAchim Leubner SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[20],IDString->ID[21],IDString->ID[22],IDString->ID[23]));
76024e1bc9a0SAchim Leubner SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x 0x%02x\n",IDString->ID[24],IDString->ID[25],IDString->ID[26],IDString->ID[27]));
76034e1bc9a0SAchim Leubner SA_DBG2(("mpiGetOperatorRsp: 0x%02x 0x%02x 0x%02x\n", IDString->ID[28],IDString->ID[29],IDString->ID[30]));
76044e1bc9a0SAchim Leubner }
76054e1bc9a0SAchim Leubner
76064e1bc9a0SAchim Leubner SA_DBG1(("mpiGetOperatorRsp:status 0x%x option 0x%x Role 0x%x\n",status,option,Role ));
76074e1bc9a0SAchim Leubner
76084e1bc9a0SAchim Leubner ossaGetOperatorCB(agRoot,agContext,status,option,NumOperators ,Role,IDString );
76094e1bc9a0SAchim Leubner
76104e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
76114e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
76124e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
76134e1bc9a0SAchim Leubner /* return the request to free pool */
76144e1bc9a0SAchim Leubner if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
76154e1bc9a0SAchim Leubner {
76164e1bc9a0SAchim Leubner SA_DBG1(("mpiGetOperatorRsp: saving pRequest (%p) for later use\n", pRequest));
76174e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
76184e1bc9a0SAchim Leubner }
76194e1bc9a0SAchim Leubner else
76204e1bc9a0SAchim Leubner {
76214e1bc9a0SAchim Leubner /* return the request to free pool */
76224e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
76234e1bc9a0SAchim Leubner }
76244e1bc9a0SAchim Leubner
76254e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
76264e1bc9a0SAchim Leubner
76274e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3f");
76284e1bc9a0SAchim Leubner
76294e1bc9a0SAchim Leubner return AGSA_RC_SUCCESS;
76304e1bc9a0SAchim Leubner }
76314e1bc9a0SAchim Leubner
76324e1bc9a0SAchim Leubner
mpiGetVHistRsp(agsaRoot_t * agRoot,agsaGetVHistCapRsp_t * pIomb)76334e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetVHistRsp(
76344e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
76354e1bc9a0SAchim Leubner agsaGetVHistCapRsp_t *pIomb
76364e1bc9a0SAchim Leubner )
76374e1bc9a0SAchim Leubner {
76384e1bc9a0SAchim Leubner
76394e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
76404e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = agNULL;
76414e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
76424e1bc9a0SAchim Leubner agsaContext_t *agContext;
76434e1bc9a0SAchim Leubner
76444e1bc9a0SAchim Leubner bit32 tag = 0; /* 1 */
76454e1bc9a0SAchim Leubner bit32 status = 0; /* 2 */
76464e1bc9a0SAchim Leubner bit32 channel; /* 3 */
76474e1bc9a0SAchim Leubner bit32 BistLo; /* 4 */
76484e1bc9a0SAchim Leubner bit32 BistHi; /* 5 */
76494e1bc9a0SAchim Leubner bit32 BytesXfered = 0; /* 6 */
76504e1bc9a0SAchim Leubner bit32 PciLo; /* 7 */
76514e1bc9a0SAchim Leubner bit32 PciHi; /* 8 */
76524e1bc9a0SAchim Leubner bit32 PciBytecount = 0; /* 9 */
76534e1bc9a0SAchim Leubner
76544e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3K");
76554e1bc9a0SAchim Leubner
76564e1bc9a0SAchim Leubner /* sanity check */
76574e1bc9a0SAchim Leubner SA_ASSERT((agNULL != agRoot), "");
76584e1bc9a0SAchim Leubner saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
76594e1bc9a0SAchim Leubner SA_ASSERT((agNULL != saRoot), "");
76604e1bc9a0SAchim Leubner
76614e1bc9a0SAchim Leubner if(smIS_SPC12V(agRoot))
76624e1bc9a0SAchim Leubner {
76634e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,tag));
76644e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,status));
76654e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &channel, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,channel));
76664e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &BistLo, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,BistLo));
76674e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &BistHi, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,BistHi));
76684e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &BytesXfered, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,BytesXfered));
76694e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &PciLo, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,PciLo));
76704e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &PciHi, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,PciHi));
76714e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &PciBytecount, pIomb, OSSA_OFFSET_OF(agsaGetVHistCapRsp_t,PciBytecount));
76724e1bc9a0SAchim Leubner }
76734e1bc9a0SAchim Leubner else
76744e1bc9a0SAchim Leubner {
76754e1bc9a0SAchim Leubner /* SPC does not support this command */
76764e1bc9a0SAchim Leubner SA_DBG1(("mpiGetVHistRsp: smIS_SPC12V only\n"));
76774e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3K");
76784e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
76794e1bc9a0SAchim Leubner }
76804e1bc9a0SAchim Leubner
76814e1bc9a0SAchim Leubner SA_DBG3(("mpiGetVHistRsp: HTag=0x%x\n", tag));
76824e1bc9a0SAchim Leubner
76834e1bc9a0SAchim Leubner /* get request from IOMap */
76844e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
76854e1bc9a0SAchim Leubner if (agNULL == pRequest)
76864e1bc9a0SAchim Leubner {
76874e1bc9a0SAchim Leubner SA_DBG1(("mpiGetVHistRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
76884e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3K");
76894e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
76904e1bc9a0SAchim Leubner }
76914e1bc9a0SAchim Leubner
76924e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
76934e1bc9a0SAchim Leubner
76944e1bc9a0SAchim Leubner /* remove the request from IOMap */
76954e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
76964e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
76974e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
76984e1bc9a0SAchim Leubner
76994e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
77004e1bc9a0SAchim Leubner
77014e1bc9a0SAchim Leubner /* check status success or failure */
77024e1bc9a0SAchim Leubner if (status)
77034e1bc9a0SAchim Leubner {
77044e1bc9a0SAchim Leubner SA_DBG1(("mpiGetVHistRsp: status is FAILED, status = %x\n", status ));
77054e1bc9a0SAchim Leubner
77064e1bc9a0SAchim Leubner if (pRequest->completionCB == agNULL)
77074e1bc9a0SAchim Leubner {
77084e1bc9a0SAchim Leubner ossaVhistCaptureCB(agRoot, agContext, status, BytesXfered);
77094e1bc9a0SAchim Leubner }
77104e1bc9a0SAchim Leubner else
77114e1bc9a0SAchim Leubner {
77124e1bc9a0SAchim Leubner (*(ossaVhistCaptureCB_t)(pRequest->completionCB))(agRoot, agContext, status, BytesXfered);
77134e1bc9a0SAchim Leubner }
77144e1bc9a0SAchim Leubner
77154e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
77164e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
77174e1bc9a0SAchim Leubner /* return the request to free pool */
77184e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
77194e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
77204e1bc9a0SAchim Leubner
77214e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3K");
77224e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
77234e1bc9a0SAchim Leubner }
77244e1bc9a0SAchim Leubner
77254e1bc9a0SAchim Leubner /* status is SUCCESS */
77264e1bc9a0SAchim Leubner SA_DBG1(("mpiGetVHistRsp: status is SUCCESS\n" ));
77274e1bc9a0SAchim Leubner
77284e1bc9a0SAchim Leubner if (pRequest->completionCB == agNULL)
77294e1bc9a0SAchim Leubner {
77304e1bc9a0SAchim Leubner ossaVhistCaptureCB(agRoot, agContext, status, BytesXfered);
77314e1bc9a0SAchim Leubner }
77324e1bc9a0SAchim Leubner else
77334e1bc9a0SAchim Leubner {
77344e1bc9a0SAchim Leubner (*(ossaVhistCaptureCB_t)(pRequest->completionCB))(agRoot, agContext, status, BytesXfered);
77354e1bc9a0SAchim Leubner }
77364e1bc9a0SAchim Leubner
77374e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
77384e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
77394e1bc9a0SAchim Leubner /* return the request to free pool */
77404e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
77414e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
77424e1bc9a0SAchim Leubner
77434e1bc9a0SAchim Leubner /* return value */
77444e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3K");
77454e1bc9a0SAchim Leubner
77464e1bc9a0SAchim Leubner return ret;
77474e1bc9a0SAchim Leubner }
77484e1bc9a0SAchim Leubner
77494e1bc9a0SAchim Leubner
77504e1bc9a0SAchim Leubner
77514e1bc9a0SAchim Leubner /******************************************************************************/
77524e1bc9a0SAchim Leubner /*! \brief DifEncOffload Response
77534e1bc9a0SAchim Leubner *
77544e1bc9a0SAchim Leubner * This routine handles the response of the DifEncOffload Response
77554e1bc9a0SAchim Leubner *
77564e1bc9a0SAchim Leubner * \param agRoot Handles for this instance of SAS/SATA LLL
77574e1bc9a0SAchim Leubner * \param pIomb Pointer of IOMB Mesage
77584e1bc9a0SAchim Leubner *
77594e1bc9a0SAchim Leubner * \return sucess or fail
77604e1bc9a0SAchim Leubner *
77614e1bc9a0SAchim Leubner */
77624e1bc9a0SAchim Leubner /*******************************************************************************/
mpiDifEncOffloadRsp(agsaRoot_t * agRoot,agsaDifEncOffloadRspV_t * pIomb)77634e1bc9a0SAchim Leubner GLOBAL bit32 mpiDifEncOffloadRsp(
77644e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
77654e1bc9a0SAchim Leubner agsaDifEncOffloadRspV_t *pIomb
77664e1bc9a0SAchim Leubner )
77674e1bc9a0SAchim Leubner {
77684e1bc9a0SAchim Leubner
77694e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
77704e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
77714e1bc9a0SAchim Leubner agsaIORequestDesc_t *pRequest;
77724e1bc9a0SAchim Leubner agsaContext_t *agContext;
77734e1bc9a0SAchim Leubner bit32 tag, status;
77744e1bc9a0SAchim Leubner agsaOffloadDifDetails_t details;
77754e1bc9a0SAchim Leubner
77764e1bc9a0SAchim Leubner smTraceFuncEnter(hpDBG_VERY_LOUD,"3F");
77774e1bc9a0SAchim Leubner
77784e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &tag, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, tag));
77794e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &status, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, status));
77804e1bc9a0SAchim Leubner /* get TAG */
77814e1bc9a0SAchim Leubner SA_DBG3(("mpiDifEncOffloadRsp: HTag=0x%x\n", tag));
77824e1bc9a0SAchim Leubner
77834e1bc9a0SAchim Leubner /* get request from IOMap */
77844e1bc9a0SAchim Leubner pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
77854e1bc9a0SAchim Leubner if (agNULL == pRequest)
77864e1bc9a0SAchim Leubner {
77874e1bc9a0SAchim Leubner SA_DBG1(("mpiDifEncOffloadRsp: Bad Response IOMB!!! pRequest is NULL. TAG=0x%x STATUS=0x%x\n", tag, status));
77884e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3F");
77894e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
77904e1bc9a0SAchim Leubner }
77914e1bc9a0SAchim Leubner
77924e1bc9a0SAchim Leubner agContext = saRoot->IOMap[tag].agContext;
77934e1bc9a0SAchim Leubner
77944e1bc9a0SAchim Leubner /* remove the request from IOMap */
77954e1bc9a0SAchim Leubner saRoot->IOMap[tag].Tag = MARK_OFF;
77964e1bc9a0SAchim Leubner saRoot->IOMap[tag].IORequest = agNULL;
77974e1bc9a0SAchim Leubner saRoot->IOMap[tag].agContext = agNULL;
77984e1bc9a0SAchim Leubner
77994e1bc9a0SAchim Leubner SA_ASSERT((pRequest->valid), "pRequest->valid");
78004e1bc9a0SAchim Leubner
78014e1bc9a0SAchim Leubner /* check status success or failure */
78024e1bc9a0SAchim Leubner if (status)
78034e1bc9a0SAchim Leubner {
78044e1bc9a0SAchim Leubner SA_DBG1(("mpiDifEncOffloadRsp: status is FAILED, status = %x\n", status ));
78054e1bc9a0SAchim Leubner
78064e1bc9a0SAchim Leubner if (status == OSSA_IO_XFR_ERROR_DIF_MISMATCH || status == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH ||
78074e1bc9a0SAchim Leubner status == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH || status == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH)
78084e1bc9a0SAchim Leubner {
78094e1bc9a0SAchim Leubner si_memset(&details, 0, sizeof(agsaOffloadDifDetails_t));
78104e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &details.ExpectedCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ExpectedCRCUDT01));
78114e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &details.ExpectedUDT2345, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ExpectedUDT2345));
78124e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &details.ActualCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ActualCRCUDT01));
78134e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &details.ActualUDT2345, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ActualUDT2345));
78144e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &details.DIFErr, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, DIFErr));
78154e1bc9a0SAchim Leubner OSSA_READ_LE_32(AGROOT, &details.ErrBoffset, pIomb, OSSA_OFFSET_OF(agsaDifEncOffloadRspV_t, ErrBoffset));
78164e1bc9a0SAchim Leubner
78174e1bc9a0SAchim Leubner if (pRequest->completionCB == agNULL)
78184e1bc9a0SAchim Leubner {
78194e1bc9a0SAchim Leubner ossaDIFEncryptionOffloadStartCB(agRoot, agContext, status, &details);
78204e1bc9a0SAchim Leubner }
78214e1bc9a0SAchim Leubner else
78224e1bc9a0SAchim Leubner {
78234e1bc9a0SAchim Leubner (*(ossaDIFEncryptionOffloadStartCB_t)(pRequest->completionCB))(agRoot, agContext, status, &details);
78244e1bc9a0SAchim Leubner }
78254e1bc9a0SAchim Leubner }
78264e1bc9a0SAchim Leubner else
78274e1bc9a0SAchim Leubner {
78284e1bc9a0SAchim Leubner if (pRequest->completionCB == agNULL)
78294e1bc9a0SAchim Leubner {
78304e1bc9a0SAchim Leubner ossaDIFEncryptionOffloadStartCB(agRoot, agContext, status, agNULL);
78314e1bc9a0SAchim Leubner }
78324e1bc9a0SAchim Leubner else
78334e1bc9a0SAchim Leubner {
78344e1bc9a0SAchim Leubner (*(ossaDIFEncryptionOffloadStartCB_t)(pRequest->completionCB))(agRoot, agContext, status, agNULL);
78354e1bc9a0SAchim Leubner }
78364e1bc9a0SAchim Leubner }
78374e1bc9a0SAchim Leubner
78384e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3F");
78394e1bc9a0SAchim Leubner
78404e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
78414e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
78424e1bc9a0SAchim Leubner /* return the request to free pool */
78434e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
78444e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
78454e1bc9a0SAchim Leubner
78464e1bc9a0SAchim Leubner return AGSA_RC_FAILURE;
78474e1bc9a0SAchim Leubner }
78484e1bc9a0SAchim Leubner
78494e1bc9a0SAchim Leubner /* status is SUCCESS */
78504e1bc9a0SAchim Leubner SA_DBG1(("mpiDifEncOffloadRsp: status is SUCCESS\n" ));
78514e1bc9a0SAchim Leubner
78524e1bc9a0SAchim Leubner if (pRequest->completionCB == agNULL)
78534e1bc9a0SAchim Leubner {
78544e1bc9a0SAchim Leubner ossaDIFEncryptionOffloadStartCB(agRoot, agContext, status, agNULL);
78554e1bc9a0SAchim Leubner }
78564e1bc9a0SAchim Leubner else
78574e1bc9a0SAchim Leubner {
78584e1bc9a0SAchim Leubner (*(ossaDIFEncryptionOffloadStartCB_t)(pRequest->completionCB))(agRoot, agContext, status, agNULL);
78594e1bc9a0SAchim Leubner }
78604e1bc9a0SAchim Leubner
78614e1bc9a0SAchim Leubner ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
78624e1bc9a0SAchim Leubner pRequest->valid = agFALSE;
78634e1bc9a0SAchim Leubner /* return the request to free pool */
78644e1bc9a0SAchim Leubner saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
78654e1bc9a0SAchim Leubner ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
78664e1bc9a0SAchim Leubner
78674e1bc9a0SAchim Leubner /* return value */
78684e1bc9a0SAchim Leubner smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3F");
78694e1bc9a0SAchim Leubner
78704e1bc9a0SAchim Leubner return ret;
78714e1bc9a0SAchim Leubner }
78724e1bc9a0SAchim Leubner
7873