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