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