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 saint.c 24 * \brief The file implements the functions to handle/enable/disable interrupt 25 * 26 */ 27 /*******************************************************************************/ 28 #include <sys/cdefs.h> 29 __FBSDID("$FreeBSD$"); 30 #include <dev/pms/config.h> 31 32 #include <dev/pms/RefTisa/sallsdk/spc/saglobal.h> 33 #define SA_CLEAR_ODCR_IN_INTERRUPT 34 35 //#define SA_TEST_FW_SPURIOUS_INT 36 37 #ifdef SA_TEST_FW_SPURIOUS_INT 38 bit32 gOurIntCount = 0; 39 bit32 gSpuriousIntCount = 0; 40 bit32 gSpuriousInt[64]= 41 { 42 0,0,0,0,0,0,0,0, 43 0,0,0,0,0,0,0,0, 44 0,0,0,0,0,0,0,0, 45 0,0,0,0,0,0,0,0, 46 0,0,0,0,0,0,0,0, 47 0,0,0,0,0,0,0,0, 48 0,0,0,0,0,0,0,0, 49 0,0,0,0,0,0,0,0 50 }; 51 bit32 gSpuriousInt1[64]= 52 { 53 0,0,0,0,0,0,0,0, 54 0,0,0,0,0,0,0,0, 55 0,0,0,0,0,0,0,0, 56 0,0,0,0,0,0,0,0, 57 0,0,0,0,0,0,0,0, 58 0,0,0,0,0,0,0,0, 59 0,0,0,0,0,0,0,0, 60 0,0,0,0,0,0,0,0 61 }; 62 #endif /* SA_TEST_FW_SPURIOUS_INT */ 63 64 #ifdef SA_ENABLE_TRACE_FUNCTIONS 65 #ifdef siTraceFileID 66 #undef siTraceFileID 67 #endif /* siTraceFileID */ 68 #define siTraceFileID 'G' 69 #endif /* SA_ENABLE_TRACE_FUNCTIONS */ 70 71 LOCAL FORCEINLINE bit32 siProcessOBMsg( 72 agsaRoot_t *agRoot, 73 bit32 count, 74 bit32 queueNum 75 ); 76 77 LOCAL bit32 siFatalInterruptHandler( 78 agsaRoot_t *agRoot, 79 bit32 interruptVectorIndex 80 ) 81 { 82 agsaLLRoot_t *saRoot = agNULL; 83 agsaFatalErrorInfo_t fatal_error; 84 bit32 value; 85 bit32 ret = AGSA_RC_FAILURE; 86 bit32 Sendfatal = agTRUE; 87 88 SA_ASSERT((agNULL != agRoot), ""); 89 if (agRoot == agNULL) 90 { 91 SA_DBG1(("siFatalInterruptHandler: agRoot == agNULL\n")); 92 return AGSA_RC_FAILURE; 93 } 94 saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 95 SA_ASSERT((agNULL != saRoot), ""); 96 if (saRoot == agNULL) 97 { 98 SA_DBG1(("siFatalInterruptHandler: saRoot == agNULL\n")); 99 return AGSA_RC_FAILURE; 100 } 101 102 value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1, MSGU_SCRATCH_PAD_1); 103 if (saRoot->ResetFailed) 104 { 105 SA_DBG1(("siFatalInterruptHandler: ResetFailed\n")); 106 ossaDisableInterrupts(agRoot, interruptVectorIndex); 107 return AGSA_RC_FAILURE; 108 } 109 110 if(SCRATCH_PAD1_V_ERROR_STATE( value ) ) 111 { 112 si_memset(&fatal_error, 0, sizeof(agsaFatalErrorInfo_t)); 113 /* read detail fatal errors */ 114 value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0, MSGU_SCRATCH_PAD_0); 115 fatal_error.errorInfo0 = value; 116 SA_DBG1(("siFatalInterruptHandler: ScratchPad0 AAP error 0x%x code 0x%x\n",SCRATCH_PAD1_V_ERROR_STATE( value ), value)); 117 118 value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1, MSGU_SCRATCH_PAD_1); 119 fatal_error.errorInfo1 = value; 120 /* AAP error state */ 121 SA_DBG1(("siFatalInterruptHandler: AAP error state and error code 0x%x\n", value)); 122 value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2, MSGU_SCRATCH_PAD_2); 123 fatal_error.errorInfo2 = value; 124 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2 0x%08x\n", fatal_error.errorInfo2 )); 125 126 #if defined(SALLSDK_DEBUG) 127 if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_ILA_ERR) 128 { 129 SA_DBG1(("siFatalInterruptHandler:SCRATCH_PAD1_V_ERROR_STATE SCRATCH_PAD2_FW_ILA_ERR 0x%08x\n", SCRATCH_PAD2_FW_ILA_ERR)); 130 } 131 if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_FLM_ERR) 132 { 133 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_FLM_ERR 0x%08x\n", SCRATCH_PAD2_FW_FLM_ERR)); 134 } 135 if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_FW_ASRT_ERR) 136 { 137 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_FW_ASRT_ERR 0x%08x\n", SCRATCH_PAD2_FW_FW_ASRT_ERR)); 138 } 139 if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_WDG_ERR) 140 { 141 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_HW_WDG_ERR 0x%08x\n", SCRATCH_PAD2_FW_HW_WDG_ERR)); 142 } 143 if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_GEN_EXCEPTION_ERR) 144 { 145 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_GEN_EXCEPTION_ERR 0x%08x\n", SCRATCH_PAD2_FW_GEN_EXCEPTION_ERR)); 146 } 147 if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_UNDTMN_ERR) 148 { 149 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_UNDTMN_ERR 0x%08x\n",SCRATCH_PAD2_FW_UNDTMN_ERR )); 150 } 151 if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_FATAL_ERR) 152 { 153 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_HW_FATAL_ERR 0x%08x\n", SCRATCH_PAD2_FW_HW_FATAL_ERR)); 154 } 155 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_PCS_ERR ) 156 { 157 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_PCS_ERR 0x%08x\n", value)); 158 } 159 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_GSM_ERR ) 160 { 161 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_GSM_ERR 0x%08x\n", value)); 162 } 163 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP0_ERR ) 164 { 165 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP0_ERR 0x%08x\n", value)); 166 } 167 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) ==SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP1_ERR ) 168 { 169 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP1_ERR 0x%08x\n", value)); 170 } 171 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP2_ERR ) 172 { 173 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP2_ERR 0x%08x\n", value)); 174 } 175 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_ERAAE_ERR ) 176 { 177 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_ERAAE_ERR 0x%08x\n", value)); 178 } 179 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_SDS_ERR ) 180 { 181 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_SDS_ERR 0x%08x\n", value)); 182 } 183 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_PCIE_CORE_ERR ) 184 { 185 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_PCIE_CORE_ERR 0x%08x\n", value)); 186 } 187 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_PCIE_AL_ERR ) 188 { 189 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_PCIE_AL_ERR 0x%08x\n", value)); 190 } 191 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_MSGU_ERR ) 192 { 193 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_MSGU_ERR 0x%08x\n", value)); 194 } 195 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_SPBC_ERR ) 196 { 197 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_SPBC_ERR 0x%08x\n", value)); 198 } 199 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_BDMA_ERR ) 200 { 201 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_BDMA_ERR 0x%08x\n", value)); 202 } 203 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_MCPSL2B_ERR) 204 { 205 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_MCPSL2B_ERR 0x%08x\n", value)); 206 } 207 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_MCPSDC_ERR ) 208 { 209 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_MCPSDC_ERR 0x%08x\n", value)); 210 } 211 if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_UNDETERMINED_ERROR_OCCURRED ) 212 { 213 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_UNDETERMINED_ERROR_OCCURRED 0x%08x\n", value)); 214 } 215 #endif /* SALLSDK_DEBUG */ 216 217 if( fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_NON_FATAL_ERR && 218 !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_ILA_ERR) && 219 !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_FLM_ERR) && 220 !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_FW_ASRT_ERR) && 221 !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_WDG_ERR) && 222 !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_GEN_EXCEPTION_ERR) && 223 !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_UNDTMN_ERR) && 224 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_PCS_ERR) && 225 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_GSM_ERR) && 226 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP0_ERR) && 227 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP2_ERR) && 228 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_ERAAE_ERR) && 229 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_SDS_ERR) && 230 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_PCIE_CORE_ERR) && 231 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_PCIE_AL_ERR) && 232 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_MSGU_ERR) && 233 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_SPBC_ERR) && 234 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_BDMA_ERR) && 235 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_MCPSL2B_ERR) && 236 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_MCPSDC_ERR) && 237 !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_UNDETERMINED_ERROR_OCCURRED) && 238 !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_FATAL_ERR) ) 239 { 240 SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_HW_NON_FATAL_ERR 0x%08x\n", value)); 241 Sendfatal = agFALSE; 242 } 243 244 value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3, MSGU_SCRATCH_PAD_3); 245 SA_DBG1(("siFatalInterruptHandler: ScratchPad3 IOP error code 0x%08x\n", value)); 246 fatal_error.errorInfo3 = value; 247 248 if (agNULL != saRoot) 249 { 250 fatal_error.regDumpBusBaseNum0 = saRoot->mainConfigTable.regDumpPCIBAR; 251 fatal_error.regDumpOffset0 = saRoot->mainConfigTable.FatalErrorDumpOffset0; 252 fatal_error.regDumpLen0 = saRoot->mainConfigTable.FatalErrorDumpLength0; 253 fatal_error.regDumpBusBaseNum1 = saRoot->mainConfigTable.regDumpPCIBAR; 254 fatal_error.regDumpOffset1 = saRoot->mainConfigTable.FatalErrorDumpOffset1; 255 fatal_error.regDumpLen1 = saRoot->mainConfigTable.FatalErrorDumpLength1; 256 } 257 else 258 { 259 fatal_error.regDumpBusBaseNum0 = 0; 260 fatal_error.regDumpOffset0 = 0; 261 fatal_error.regDumpLen0 = 0; 262 fatal_error.regDumpBusBaseNum1 = 0; 263 fatal_error.regDumpOffset1 = 0; 264 fatal_error.regDumpLen1 = 0; 265 } 266 /* Call Back with error */ 267 SA_DBG1(("siFatalInterruptHandler: Sendfatal %x HostR0 0x%x\n",Sendfatal ,ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_Rsvd_0_Register ) )); 268 SA_DBG1(("siFatalInterruptHandler: ScratchPad2 0x%x ScratchPad3 0x%x\n", 269 ossaHwRegReadExt(agRoot, PCIBAR0,V_Host_Scratchpad_2_Register), 270 ossaHwRegReadExt(agRoot, PCIBAR0,V_Host_Scratchpad_3_Register) )); 271 272 ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_MALFUNCTION, Sendfatal, (void *)&fatal_error, agNULL); 273 ret = AGSA_RC_SUCCESS; 274 } 275 else 276 { 277 bit32 host_reg0; 278 host_reg0 = ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_Rsvd_0_Register ); 279 if( host_reg0 == 0x2) 280 { 281 Sendfatal = agFALSE; 282 283 SA_DBG1(("siFatalInterruptHandler: Non fatal ScratchPad1 0x%x HostR0 0x%x\n", value,host_reg0)); 284 SA_DBG1(("siFatalInterruptHandler: ScratchPad0 0x%x ScratchPad1 0x%x\n", 285 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_0_Register), 286 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_1_Register) )); 287 SA_DBG1(("siFatalInterruptHandler: ScratchPad2 0x%x ScratchPad3 0x%x\n", 288 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_2_Register), 289 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_3_Register) )); 290 291 ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_MALFUNCTION, Sendfatal, (void *)&fatal_error, agNULL); 292 ret = AGSA_RC_SUCCESS; 293 } 294 else if( host_reg0 == HDA_AES_DIF_FUNC) 295 { 296 SA_DBG1(("siFatalInterruptHandler: HDA_AES_DIF_FUNC 0x%x\n", 297 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_Rsvd_0_Register))); 298 Sendfatal = agFALSE; 299 ret = AGSA_RC_SUCCESS; 300 } 301 else 302 { 303 SA_DBG1(("siFatalInterruptHandler: No error detected ScratchPad1 0x%x HostR0 0x%x\n", value,host_reg0)); 304 SA_DBG1(("siFatalInterruptHandler: ScratchPad0 0x%x ScratchPad1 0x%x\n", 305 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_0_Register), 306 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_1_Register) )); 307 SA_DBG1(("siFatalInterruptHandler: ScratchPad2 0x%x ScratchPad3 0x%x\n", 308 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_2_Register), 309 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_3_Register) )); 310 311 SA_DBG1(("siFatalInterruptHandler: Doorbell_Set %08X U %08X\n", 312 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register), 313 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU))); 314 SA_DBG1(("siFatalInterruptHandler: Doorbell_Mask %08X U %08X\n", 315 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ), 316 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU ))); 317 318 ret = AGSA_RC_FAILURE; 319 } 320 } 321 return ret; 322 323 } 324 325 GLOBAL bit32 saFatalInterruptHandler( 326 agsaRoot_t *agRoot, 327 bit32 interruptVectorIndex 328 ) 329 { 330 agsaLLRoot_t *saRoot = agNULL; 331 bit32 ret = AGSA_RC_FAILURE; 332 333 /* sanity check */ 334 SA_ASSERT((agNULL != agRoot), ""); 335 saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 336 SA_ASSERT((agNULL != saRoot), ""); 337 338 if (saRoot->ResetFailed) 339 { 340 SA_DBG1(("saFatalInterruptHandler: ResetFailed\n")); 341 ossaDisableInterrupts(agRoot, interruptVectorIndex); 342 return AGSA_RC_FAILURE; 343 } 344 if (saRoot->swConfig.fatalErrorInterruptEnable != 1) 345 { 346 SA_DBG1(("saFatalInterruptHandler: fatalErrorInterrtupt is NOT enabled\n")); 347 ossaDisableInterrupts(agRoot, interruptVectorIndex); 348 return AGSA_RC_FAILURE; 349 } 350 351 if (saRoot->swConfig.fatalErrorInterruptVector != interruptVectorIndex) 352 { 353 SA_DBG1(("saFatalInterruptHandler: interruptVectorIndex does not match 0x%x 0x%x\n", 354 saRoot->swConfig.fatalErrorInterruptVector, interruptVectorIndex)); 355 SA_DBG1(("saFatalInterruptHandler: ScratchPad0 0x%x ScratchPad1 0x%x\n", 356 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_0_Register), 357 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_1_Register) )); 358 SA_DBG1(("saFatalInterruptHandler: ScratchPad2 0x%x ScratchPad3 0x%x\n", 359 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_2_Register), 360 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_3_Register) )); 361 ossaDisableInterrupts(agRoot, interruptVectorIndex); 362 return AGSA_RC_FAILURE; 363 } 364 365 ret = siFatalInterruptHandler(agRoot,interruptVectorIndex); 366 367 368 ossaDisableInterrupts(agRoot, interruptVectorIndex); 369 370 return ret; 371 } 372 /******************************************************************************/ 373 /*! \brief Function to process the interrupts 374 * 375 * The saInterruptHandler() function is called after an interrupts has 376 * been received 377 * This function disables interrupts 378 * 379 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 380 * instance of SAS/SATA hardware 381 * \param interruptVectorIndex message that caused MSI message 382 * 383 * \return TRUE if we caused interrupt 384 * 385 */ 386 /*******************************************************************************/ 387 FORCEINLINE bit32 388 saInterruptHandler( 389 agsaRoot_t *agRoot, 390 bit32 interruptVectorIndex 391 ) 392 { 393 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 394 bit32 ToBeProcessedCount = 0; 395 bit32 our_int = 0; 396 #ifdef SA_TEST_FW_SPURIOUS_INT 397 bit8 i; 398 #endif/* SA_TEST_FW_SPURIOUS_INT */ 399 400 if( agNULL == saRoot ) 401 { 402 /* Can be called before initialize is completed in a shared 403 interrupt environment like windows 2003 404 */ 405 return(ToBeProcessedCount); 406 } 407 408 if( (our_int = saRoot->OurInterrupt(agRoot,interruptVectorIndex)) == FALSE ) 409 { 410 #ifdef SA_TEST_FW_SPURIOUS_INT 411 gSpuriousIntCount++; 412 smTrace(hpDBG_REGISTERS,"S1",gSpuriousIntCount); 413 /* TP:S1 gSpuriousIntCount */ 414 #endif /* SA_TEST_FW_SPURIOUS_INT */ 415 return(ToBeProcessedCount); 416 } 417 418 smTraceFuncEnter(hpDBG_TICK_INT, "5q"); 419 420 smTrace(hpDBG_TICK_INT,"VI",interruptVectorIndex); 421 /* TP:Vi interrupt VectorIndex */ 422 423 if ( agFALSE == saRoot->sysIntsActive ) 424 { 425 // SA_ASSERT(0, "saInterruptHandler sysIntsActive not set"); 426 427 #ifdef SA_PRINTOUT_IN_WINDBG 428 #ifndef DBG 429 DbgPrint("saInterruptHandler: sysIntsActive not set Doorbell_Mask_Set %08X U %08X\n", 430 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register), 431 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU) ); 432 #endif /* DBG */ 433 #endif /* SA_PRINTOUT_IN_WINDBG */ 434 435 436 SA_DBG1(("saInterruptHandler: Doorbell_Mask_Set %08X U %08X\n", 437 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register), 438 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU))); 439 ossaDisableInterrupts(agRoot, interruptVectorIndex); 440 return(ToBeProcessedCount); 441 442 } 443 444 /* Allow replacement of disable interrupt */ 445 ossaDisableInterrupts(agRoot, interruptVectorIndex); 446 447 448 #ifdef SA_TEST_FW_SPURIOUS_INT 449 450 /* count for my interrupt */ 451 gOurIntCount++; 452 453 smTrace(hpDBG_REGISTERS,"S4",gOurIntCount); 454 /* TP:S4 gOurIntCount */ 455 #endif /* SA_TEST_FW_SPURIOUS_INT */ 456 457 smTraceFuncExit(hpDBG_TICK_INT, 'a', "5q"); 458 return(TRUE); 459 460 } 461 462 /******************************************************************************/ 463 /*! \brief Function to disable MSIX interrupts 464 * 465 * siDisableMSIXInterrupts disables interrupts 466 * called thru macro ossaDisableInterrupts 467 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 468 * instance of SAS/SATA hardware 469 * \param interruptVectorIndex - vector index for message 470 * 471 */ 472 /*******************************************************************************/ 473 GLOBAL void siDisableMSIXInterrupts( 474 agsaRoot_t *agRoot, 475 bit32 interruptVectorIndex 476 ) 477 { 478 bit32 msi_index; 479 #ifndef SA_CLEAR_ODCR_IN_INTERRUPT 480 bit32 value; 481 #endif /* SA_CLEAR_ODCR_IN_INTERRUPT */ 482 msi_index = interruptVectorIndex * MSIX_TABLE_ELEMENT_SIZE; 483 msi_index += MSIX_TABLE_BASE; 484 ossaHwRegWrite(agRoot,msi_index , MSIX_INTERRUPT_DISABLE); 485 ossaHwRegRead(agRoot, msi_index); /* Dummy read */ 486 #ifndef SA_CLEAR_ODCR_IN_INTERRUPT 487 value = (1 << interruptVectorIndex); 488 ossaHwRegWrite(agRoot, MSGU_ODCR, value); 489 #endif /* SA_CLEAR_ODCR_IN_INTERRUPT */ 490 } 491 492 /******************************************************************************/ 493 /*! \brief Function to disable MSIX V interrupts 494 * 495 * siDisableMSIXInterrupts disables interrupts 496 * called thru macro ossaDisableInterrupts 497 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 498 * instance of SAS/SATA hardware 499 * \param interruptVectorIndex - vector index for message 500 * 501 */ 502 /*******************************************************************************/ 503 void siDisableMSIX_V_Interrupts( 504 agsaRoot_t *agRoot, 505 bit32 interruptVectorIndex 506 ) 507 { 508 bit64 mask; 509 agsabit32bit64 u64; 510 mask =( (bit64)1 << interruptVectorIndex); 511 u64.B64 = mask; 512 if(smIS64bInt(agRoot)) 513 { 514 SA_DBG4(("siDisableMSIX_V_Interrupts: VI %d U 0x%08X L 0x%08X\n",interruptVectorIndex,u64.S32[1],u64.S32[0])); 515 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_RegisterU,u64.S32[1]); 516 } 517 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_Register, u64.S32[0]); 518 519 } 520 /******************************************************************************/ 521 /*! \brief Function to disable MSI interrupts 522 * 523 * siDisableMSIInterrupts disables interrupts 524 * called thru macro ossaDisableInterrupts 525 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 526 * instance of SAS/SATA hardware 527 * \param interruptVectorIndex - vector index for message 528 * 529 */ 530 /*******************************************************************************/ 531 GLOBAL void siDisableMSIInterrupts( 532 agsaRoot_t *agRoot, 533 bit32 interruptVectorIndex 534 ) 535 { 536 bit32 ODMRValue; 537 bit32 mask; 538 mask = 1 << interruptVectorIndex; 539 540 /*Must be protected for interuption */ 541 ODMRValue = ossaHwRegRead(agRoot, MSGU_ODMR); 542 ODMRValue |= mask; 543 544 ossaHwRegWrite(agRoot, MSGU_ODMR, ODMRValue); 545 ossaHwRegWrite(agRoot, MSGU_ODCR, mask); 546 } 547 548 /******************************************************************************/ 549 /*! \brief Function to disable MSI V interrupts 550 * 551 * siDisableMSIInterrupts disables interrupts 552 * called thru macro ossaDisableInterrupts 553 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 554 * instance of SAS/SATA hardware 555 * \param interruptVectorIndex - vector index for message 556 * 557 */ 558 /*******************************************************************************/ 559 GLOBAL void siDisableMSI_V_Interrupts( 560 agsaRoot_t *agRoot, 561 bit32 interruptVectorIndex 562 ) 563 { 564 SA_ASSERT(0, "Should not be called"); 565 SA_DBG4(("siDisableMSI_V_Interrupts:\n")); 566 } 567 568 /******************************************************************************/ 569 /*! \brief Function to process Legacy interrupts 570 * 571 * siDisableLegacyInterrupts disables interrupts 572 * called thru macro ossaDisableInterrupts 573 * 574 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 575 * instance of SAS/SATA hardware 576 * \param interruptVectorIndex not used in legacy case 577 * 578 */ 579 /*******************************************************************************/ 580 GLOBAL void siDisableLegacyInterrupts( 581 agsaRoot_t *agRoot, 582 bit32 interruptVectorIndex 583 ) 584 { 585 ossaHwRegWrite(agRoot, MSGU_ODMR, ODMR_MASK_ALL); 586 #ifndef SA_CLEAR_ODCR_IN_INTERRUPT 587 ossaHwRegWrite(agRoot, MSGU_ODCR, ODCR_CLEAR_ALL); 588 #endif /* SA_CLEAR_ODCR_IN_INTERRUPT */ 589 } 590 591 /******************************************************************************/ 592 /*! \brief Function to process Legacy V interrupts 593 * 594 * siDisableLegacyInterrupts disables interrupts 595 * called thru macro ossaDisableInterrupts 596 * 597 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 598 * instance of SAS/SATA hardware 599 * \param interruptVectorIndex not used in legacy case 600 * 601 */ 602 /*******************************************************************************/ 603 GLOBAL void siDisableLegacy_V_Interrupts( 604 agsaRoot_t *agRoot, 605 bit32 interruptVectorIndex 606 ) 607 { 608 609 bit64 mask; 610 agsabit32bit64 u64; 611 mask =( (bit64)1 << interruptVectorIndex); 612 u64.B64 = mask; 613 614 SA_DBG4(("siDisableLegacy_V_Interrupts:IN MSGU_READ_ODR %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODR, V_Outbound_Doorbell_Set_Register))); 615 SA_DBG4(("siDisableLegacy_V_Interrupts:IN MSGU_READ_ODMR %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODMR, V_Outbound_Doorbell_Mask_Set_Register ))); 616 if(smIS64bInt(agRoot)) 617 { 618 SA_DBG4(("siDisableLegacy_V_Interrupts: VI %d U 0x%08X L 0x%08X\n",interruptVectorIndex,u64.S32[1],u64.S32[0])); 619 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_Register,u64.S32[1] ); 620 } 621 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_RegisterU,u64.S32[0]); 622 623 } 624 /******************************************************************************/ 625 /*! \brief Function to process MSIX interrupts 626 * 627 * siOurMSIXInterrupt checks if we generated interrupt 628 * called thru function pointer saRoot->OurInterrupt 629 * 630 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 631 * instance of SAS/SATA hardware 632 * \return always true 633 */ 634 /*******************************************************************************/ 635 GLOBAL bit32 siOurMSIXInterrupt( 636 agsaRoot_t *agRoot, 637 bit32 interruptVectorIndex 638 ) 639 { 640 return(TRUE); 641 } 642 643 /******************************************************************************/ 644 /*! \brief Function to process MSIX V interrupts 645 * 646 * siOurMSIXInterrupt checks if we generated interrupt 647 * called thru function pointer saRoot->OurInterrupt 648 * 649 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 650 * instance of SAS/SATA hardware 651 * \return always true 652 */ 653 /*******************************************************************************/ 654 GLOBAL bit32 siOurMSIX_V_Interrupt( 655 agsaRoot_t *agRoot, 656 bit32 interruptVectorIndex 657 ) 658 { 659 return(TRUE); 660 } 661 /******************************************************************************/ 662 /*! \brief Function to process MSI interrupts 663 * 664 * siOurMSIInterrupt checks if we generated interrupt 665 * called thru function pointer saRoot->OurInterrupt 666 * 667 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 668 * instance of SAS/SATA hardware 669 * \return always true 670 */ 671 /*******************************************************************************/ 672 bit32 siOurMSIInterrupt( 673 agsaRoot_t *agRoot, 674 bit32 interruptVectorIndex 675 ) 676 { 677 return(TRUE); 678 } 679 680 /******************************************************************************/ 681 /*! \brief Function to process MSI V interrupts 682 * 683 * siOurMSIInterrupt checks if we generated interrupt 684 * called thru function pointer saRoot->OurInterrupt 685 * 686 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 687 * instance of SAS/SATA hardware 688 * \return always true 689 */ 690 /*******************************************************************************/ 691 bit32 siOurMSI_V_Interrupt( 692 agsaRoot_t *agRoot, 693 bit32 interruptVectorIndex 694 ) 695 { 696 SA_DBG4((":siOurMSI_V_Interrupt\n")); 697 return(TRUE); 698 } 699 700 /******************************************************************************/ 701 /*! \brief Function to process Legacy interrupts 702 * 703 * siOurLegacyInterrupt checks if we generated interrupt 704 * called thru function pointer saRoot->OurInterrupt 705 * 706 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 707 * instance of SAS/SATA hardware 708 * \return true if we claim interrupt 709 */ 710 /*******************************************************************************/ 711 bit32 siOurLegacyInterrupt( 712 agsaRoot_t *agRoot, 713 bit32 interruptVectorIndex 714 ) 715 { 716 bit32 Int_masked; 717 bit32 Int_active; 718 Int_masked = MSGU_READ_ODMR; 719 Int_active = MSGU_READ_ODR; 720 721 if(Int_masked & 1 ) 722 { 723 return(FALSE); 724 } 725 if(Int_active & 1 ) 726 { 727 728 return(TRUE); 729 } 730 return(FALSE); 731 } 732 733 /******************************************************************************/ 734 /*! \brief Function to process Legacy V interrupts 735 * 736 * siOurLegacyInterrupt checks if we generated interrupt 737 * called thru function pointer saRoot->OurInterrupt 738 * 739 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 740 * instance of SAS/SATA hardware 741 * \return true if we claim interrupt 742 */ 743 /*******************************************************************************/ 744 bit32 siOurLegacy_V_Interrupt( 745 agsaRoot_t *agRoot, 746 bit32 interruptVectorIndex 747 ) 748 { 749 bit32 Int_active; 750 Int_active = siHalRegReadExt(agRoot, GEN_MSGU_ODR, V_Outbound_Doorbell_Set_Register ); 751 752 return(Int_active ? TRUE : FALSE); 753 } 754 755 756 /******************************************************************************/ 757 /*! \brief Function to process the cause of interrupt 758 * 759 * The saDelayedInterruptHandler() function is called after an interrupt messages has 760 * been received it may be called by a deferred procedure call 761 * 762 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 763 * instance of SAS/SATA hardware 764 * \param interruptVectorIndex - vector index for message 765 * \param count Number of completion queue entries to consume 766 * 767 * \return number of messages processed 768 * 769 */ 770 /*******************************************************************************/ 771 FORCEINLINE bit32 772 saDelayedInterruptHandler( 773 agsaRoot_t *agRoot, 774 bit32 interruptVectorIndex, 775 bit32 count 776 ) 777 { 778 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 779 bit32 processedMsgCount = 0; 780 bit32 pad1 = 0; 781 bit32 host_reg0 = 0; 782 #if defined(SALLSDK_DEBUG) 783 bit32 host_reg1 = 0; 784 #endif 785 bit8 i = 0; 786 787 OSSA_OUT_ENTER(agRoot); 788 789 smTraceFuncEnter(hpDBG_VERY_LOUD,"5p"); 790 791 smTrace(hpDBG_VERY_LOUD,"Vd",interruptVectorIndex); 792 /* TP:Vd delayed VectorIndex */ 793 smTrace(hpDBG_VERY_LOUD,"Vc",count); 794 /* TP:Vc IOMB count*/ 795 796 if( saRoot->swConfig.fatalErrorInterruptEnable && 797 saRoot->swConfig.fatalErrorInterruptVector == interruptVectorIndex ) 798 { 799 pad1 = siHalRegReadExt(agRoot,GEN_MSGU_SCRATCH_PAD_1, MSGU_SCRATCH_PAD_1); 800 host_reg0 = ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_Rsvd_0_Register ); 801 802 803 if(saRoot->swConfig.hostDirectAccessMode & 2 ) 804 { 805 if( host_reg0 == HDA_AES_DIF_FUNC) 806 { 807 host_reg0 = 0; 808 } 809 } 810 811 812 #if defined(SALLSDK_DEBUG) 813 host_reg1 = ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_Rsvd_1_Register ); 814 #endif 815 if( (SCRATCH_PAD1_V_ERROR_STATE( pad1 ) != 0 ) && host_reg0 ) 816 { 817 818 SA_DBG1(("saDelayedInterruptHandler: vi %d Error %08X\n",interruptVectorIndex, SCRATCH_PAD1_V_ERROR_STATE( pad1 ))); 819 SA_DBG1(("saDelayedInterruptHandler: Sp 1 %08X Hr0 %08X Hr1 %08X\n",pad1,host_reg0,host_reg1 )); 820 SA_DBG1(("saDelayedInterruptHandler: SCRATCH_PAD1_V_ERROR_STATE %08X\n", SCRATCH_PAD1_V_ERROR_STATE( pad1 ))); 821 SA_DBG1(("saDelayedInterruptHandler: SCRATCH_PAD1_V_ILA_ERROR_STATE %08X\n", SCRATCH_PAD1_V_ILA_ERROR_STATE( pad1 ))); 822 SA_DBG1(("saDelayedInterruptHandler: SCRATCH_PAD1_V_RAAE_ERROR_STATE %08X\n", SCRATCH_PAD1_V_RAAE_ERROR_STATE( pad1 ))); 823 SA_DBG1(("saDelayedInterruptHandler: SCRATCH_PAD1_V_IOP0_ERROR_STATE %08X\n", SCRATCH_PAD1_V_IOP0_ERROR_STATE( pad1 ))); 824 SA_DBG1(("saDelayedInterruptHandler: SCRATCH_PAD1_V_IOP1_ERROR_STATE %08X\n", SCRATCH_PAD1_V_IOP1_ERROR_STATE( pad1 ))); 825 826 siFatalInterruptHandler( agRoot, interruptVectorIndex ); 827 ossaDisableInterrupts(agRoot, interruptVectorIndex); 828 829 } 830 else 831 { 832 SA_DBG2(("saDelayedInterruptHandler: Fatal Check VI %d SCRATCH_PAD1 %08X host_reg0 %08X host_reg1 %08X\n",interruptVectorIndex, pad1,host_reg0,host_reg1)); 833 SA_DBG2(("saDelayedInterruptHandler: ScratchPad0 0x%x ScratchPad1 0x%x\n", 834 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_0_Register), 835 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_1_Register) )); 836 SA_DBG2(("saDelayedInterruptHandler: ScratchPad2 0x%x ScratchPad3 0x%x\n", 837 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_2_Register), 838 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_3_Register) )); 839 840 SA_DBG2(("saDelayedInterruptHandler: Doorbell_Set %08X U %08X\n", 841 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register), 842 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU))); 843 SA_DBG2(("saDelayedInterruptHandler: Doorbell_Mask %08X U %08X\n", 844 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ), 845 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU ))); 846 } 847 848 } 849 850 851 #ifdef SA_LNX_PERF_MODE 852 return siProcessOBMsg(agRoot, count, interruptVectorIndex); 853 #endif 854 855 /* check all the configuration outbound queues within a vector bitmap */ 856 SA_ASSERT((saRoot->QueueConfig.numOutboundQueues < 65), "numOutboundQueue"); 857 858 for ( i = 0; i < saRoot->QueueConfig.numOutboundQueues; i++ ) 859 { 860 /* process IOMB in the outbound queue 0 to 31 if bit set in the vector bitmap */ 861 if (i < OQ_NUM_32) 862 { 863 if (saRoot->interruptVecIndexBitMap[interruptVectorIndex] & (1 << i)) 864 { 865 processedMsgCount += siProcessOBMsg(agRoot, count, i); 866 } 867 else if (saRoot->QueueConfig.outboundQueues[i].interruptEnable == 0) 868 { 869 /* polling mode - interruptVectorIndex = 0 only and no bit set */ 870 processedMsgCount += siProcessOBMsg(agRoot, count, i); 871 } 872 #ifdef SA_FW_TEST_INTERRUPT_REASSERT 873 else if (saRoot->CheckAll) 874 { 875 /* polling mode - interruptVectorIndex = 0 only and no bit set */ 876 processedMsgCount += siProcessOBMsg(agRoot, count, i); 877 } 878 #endif /* SA_FW_TEST_INTERRUPT_REASSERT */ 879 880 } 881 else 882 { 883 /* process IOMB in the outbound queue 32 to 63 if bit set in the vector bitmap */ 884 if (saRoot->interruptVecIndexBitMap1[interruptVectorIndex] & (1 << (i - OQ_NUM_32))) 885 { 886 processedMsgCount += siProcessOBMsg(agRoot, count, i); 887 } 888 /* check interruptEnable bit for polling mode of OQ */ 889 /* the following code can be removed, we do not care about the bit */ 890 else if (saRoot->QueueConfig.outboundQueues[i].interruptEnable == 0) 891 { 892 /* polling mode - interruptVectorIndex = 0 only and no bit set */ 893 processedMsgCount += siProcessOBMsg(agRoot, count, i); 894 } 895 #ifdef SA_FW_TEST_INTERRUPT_REASSERT 896 else if (saRoot->CheckAll) 897 { 898 /* polling mode - interruptVectorIndex = 0 only and no bit set */ 899 processedMsgCount += siProcessOBMsg(agRoot, count, i); 900 } 901 #endif /* SA_FW_TEST_INTERRUPT_REASSERT */ 902 } 903 } 904 905 #ifdef SA_FW_TEST_INTERRUPT_REASSERT 906 saRoot->CheckAll = 0; 907 #endif /* SA_FW_TEST_INTERRUPT_REASSERT */ 908 909 #ifndef SA_RENABLE_IN_OSLAYER 910 if ( agTRUE == saRoot->sysIntsActive ) 911 { 912 /* Allow replacement of enable interrupt */ 913 ossaReenableInterrupts(agRoot, interruptVectorIndex); 914 } 915 #endif /* SA_RENABLE_IN_OSLAYER */ 916 917 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5p"); 918 919 OSSA_OUT_LEAVE(agRoot); 920 return processedMsgCount; 921 } 922 923 /******************************************************************************/ 924 /*! \brief Function to reenable MSIX interrupts 925 * 926 * siReenableMSIXInterrupts reenableinterrupts 927 * called thru macro ossaReenableInterrupts 928 * 929 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 930 * instance of SAS/SATA hardware 931 * \param interruptVectorIndex - vector index for message 932 * 933 */ 934 /*******************************************************************************/ 935 void siReenableMSIXInterrupts( 936 agsaRoot_t *agRoot, 937 bit32 interruptVectorIndex 938 ) 939 { 940 bit32 msi_index; 941 #ifdef SA_CLEAR_ODCR_IN_INTERRUPT 942 bit32 value; 943 #endif /* SA_CLEAR_ODCR_IN_INTERRUPT */ 944 msi_index = interruptVectorIndex * MSIX_TABLE_ELEMENT_SIZE; 945 msi_index += MSIX_TABLE_BASE; 946 ossaHwRegWriteExt(agRoot, PCIBAR0,msi_index, MSIX_INTERRUPT_ENABLE); 947 948 SA_DBG4(("siReenableMSIXInterrupts:interruptVectorIndex %d\n",interruptVectorIndex)); 949 950 #ifdef SA_CLEAR_ODCR_IN_INTERRUPT 951 value = (1 << interruptVectorIndex); 952 siHalRegWriteExt(agRoot, GEN_MSGU_ODCR, MSGU_ODCR, value); 953 #endif /* SA_CLEAR_ODCR_IN_INTERRUPT */ 954 } 955 /******************************************************************************/ 956 /*! \brief Function to reenable MSIX interrupts 957 * 958 * siReenableMSIXInterrupts reenableinterrupts 959 * called thru macro ossaReenableInterrupts 960 * 961 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 962 * instance of SAS/SATA hardware 963 * \param interruptVectorIndex - vector index for message 964 * 965 */ 966 /*******************************************************************************/ 967 void siReenableMSIX_V_Interrupts( 968 agsaRoot_t *agRoot, 969 bit32 interruptVectorIndex 970 ) 971 { 972 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 973 bit64 mask; 974 agsabit32bit64 u64; 975 mask =( (bit64)1 << interruptVectorIndex); 976 u64.B64 = mask; 977 978 SA_DBG4(("siReenableMSIX_V_Interrupts:\n")); 979 980 if(saRoot->sysIntsActive) 981 { 982 if(smIS64bInt(agRoot)) 983 { 984 SA_DBG4(("siReenableMSIX_V_Interrupts: VI %d U 0x%08X L 0x%08X\n",interruptVectorIndex,u64.S32[1],u64.S32[0])); 985 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Clear_RegisterU,u64.S32[1] ); 986 } 987 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Clear_Register,u64.S32[0]); 988 } 989 else 990 { 991 SA_DBG1(("siReenableMSIX_V_Interrupts: VI %d sysIntsActive off\n",interruptVectorIndex)); 992 } 993 994 } 995 996 /******************************************************************************/ 997 /*! \brief Function to reenable MSI interrupts 998 * 999 * siReenableMSIXInterrupts reenableinterrupts 1000 * called thru macro ossaReenableInterrupts 1001 * 1002 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 1003 * instance of SAS/SATA hardware 1004 * \param interruptVectorIndex - vector index for message 1005 * 1006 */ 1007 /*******************************************************************************/ 1008 GLOBAL void siReenableMSIInterrupts( 1009 agsaRoot_t *agRoot, 1010 bit32 interruptVectorIndex 1011 ) 1012 { 1013 bit32 ODMRValue; 1014 1015 ODMRValue = siHalRegReadExt(agRoot, GEN_MSGU_ODMR, MSGU_ODMR); 1016 ODMRValue &= ~(1 << interruptVectorIndex); 1017 1018 siHalRegWriteExt(agRoot, GEN_MSGU_ODMR, MSGU_ODMR, ODMRValue); 1019 } 1020 1021 /******************************************************************************/ 1022 /*! \brief Function to reenable MSI V interrupts 1023 * 1024 * siReenableMSIXInterrupts reenableinterrupts 1025 * called thru macro ossaReenableInterrupts 1026 * 1027 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 1028 * instance of SAS/SATA hardware 1029 * \param interruptVectorIndex - vector index for message 1030 * 1031 */ 1032 /*******************************************************************************/ 1033 GLOBAL void siReenableMSI_V_Interrupts( 1034 agsaRoot_t *agRoot, 1035 bit32 interruptVectorIndex 1036 ) 1037 { 1038 SA_ASSERT(0, "Should not be called"); 1039 1040 SA_DBG4(("siReenableMSI_V_Interrupts:\n")); 1041 1042 } 1043 /******************************************************************************/ 1044 /*! \brief Function to reenable Legacy interrupts 1045 * 1046 * siReenableLegacyInterrupts reenableinterrupts 1047 * called thru macro ossaReenableInterrupts 1048 * 1049 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 1050 * instance of SAS/SATA hardware 1051 * \param interruptVectorIndex always zero 1052 * 1053 */ 1054 /*******************************************************************************/ 1055 GLOBAL void siReenableLegacyInterrupts( 1056 agsaRoot_t *agRoot, 1057 bit32 interruptVectorIndex 1058 ) 1059 { 1060 siHalRegWriteExt(agRoot, GEN_MSGU_ODMR, MSGU_ODMR, ODMR_CLEAR_ALL); 1061 1062 #ifdef SA_CLEAR_ODCR_IN_INTERRUPT 1063 siHalRegWriteExt(agRoot, GEN_MSGU_ODCR, MSGU_ODCR, ODCR_CLEAR_ALL); 1064 #endif /* SA_CLEAR_ODCR_IN_INTERRUPT */ 1065 } 1066 1067 /******************************************************************************/ 1068 /*! \brief Function to reenable Legacy V interrupts 1069 * 1070 * siReenableLegacyInterrupts reenableinterrupts 1071 * called thru macro ossaReenableInterrupts 1072 * 1073 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 1074 * instance of SAS/SATA hardware 1075 * \param interruptVectorIndex always zero 1076 * 1077 */ 1078 /*******************************************************************************/ 1079 GLOBAL void siReenableLegacy_V_Interrupts( 1080 agsaRoot_t *agRoot, 1081 bit32 interruptVectorIndex 1082 ) 1083 { 1084 1085 bit32 mask; 1086 mask = 1 << interruptVectorIndex; 1087 1088 SA_DBG5(("siReenableLegacy_V_Interrupts:IN MSGU_READ_ODR %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODR, V_Outbound_Doorbell_Set_Register))); 1089 SA_DBG5(("siReenableLegacy_V_Interrupts:IN MSGU_READ_ODMR %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODMR, V_Outbound_Doorbell_Mask_Set_Register ))); 1090 1091 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Clear_Register, mask); 1092 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Clear_Register, mask ); 1093 1094 1095 SA_DBG5(("siReenableLegacy_V_Interrupts:OUT MSGU_READ_ODMR %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODMR, V_Outbound_Doorbell_Mask_Set_Register ))); 1096 1097 } 1098 1099 /******************************************************************************/ 1100 /*! \brief Function to enable a single interrupt vector 1101 * 1102 * 1103 * 1104 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 1105 * instance of SAS/SATA hardware 1106 * \param interruptVectorIndex Interrupt vector to enable 1107 * 1108 */ 1109 /*******************************************************************************/ 1110 /******************************************************************************/ 1111 /*! \brief saSystemInterruptsEnable 1112 * Function to enable a single interrupt vector 1113 * 1114 * \param agRoot OS Layer-specific and LL Layer-specific context handles for this 1115 * instance of SAS/SATA hardware 1116 * \param interruptVectorIndex Interrupt vector to enable 1117 * 1118 */ 1119 /*******************************************************************************/ 1120 GLOBAL FORCEINLINE 1121 void saSystemInterruptsEnable( 1122 agsaRoot_t *agRoot, 1123 bit32 interruptVectorIndex 1124 ) 1125 { 1126 ossaReenableInterrupts(agRoot, interruptVectorIndex); 1127 } 1128 /******************************************************************************/ 1129 /*! \brief Routine to handle Outbound Message 1130 * 1131 * The handle for outbound message 1132 * 1133 * \param agRoot handles for this instance of SAS/SATA hardware 1134 * \param count interrupt message count 1135 * \param queueNum outbound queue 1136 * 1137 * \return 1138 */ 1139 /*******************************************************************************/ 1140 LOCAL FORCEINLINE bit32 1141 siProcessOBMsg( 1142 agsaRoot_t *agRoot, 1143 bit32 count, 1144 bit32 queueNum 1145 ) 1146 { 1147 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 1148 mpiOCQueue_t *circularQ = agNULL; 1149 void *pMsg1 = agNULL; 1150 bit32 ret, processedMsgCount = 0; 1151 bit32 ParseOBIombStatus = 0; 1152 #ifdef SA_ENABLE_TRACE_FUNCTIONS 1153 bit32 i = 0; 1154 #endif 1155 bit16 opcode = 0; 1156 mpiMsgCategory_t category; 1157 bit8 bc = 0; 1158 1159 smTraceFuncEnter(hpDBG_VERY_LOUD,"5r"); 1160 1161 1162 SA_DBG3(("siProcessOBMsg: queueNum 0x%x\n", queueNum)); 1163 1164 ossaSingleThreadedEnter(agRoot, LL_IOREQ_OBQ_LOCK + queueNum); 1165 1166 circularQ = &saRoot->outboundQueue[queueNum]; 1167 OSSA_READ_LE_32(circularQ->agRoot, &circularQ->producerIdx, circularQ->piPointer, 0); 1168 1169 if (circularQ->producerIdx == circularQ->consumerIdx) 1170 { 1171 ossaSingleThreadedLeave(agRoot, LL_IOREQ_OBQ_LOCK + queueNum); 1172 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5r"); 1173 return processedMsgCount; 1174 } 1175 1176 ossaSingleThreadedLeave(agRoot, LL_IOREQ_OBQ_LOCK + queueNum); 1177 1178 do 1179 { 1180 /* ossaSingleThreadedEnter(agRoot, LL_IOREQ_OBQ_LOCK + queueNum); */ 1181 ret = mpiMsgConsume(circularQ, &pMsg1, &category, &opcode, &bc); 1182 /* ossaSingleThreadedLeave(agRoot, LL_IOREQ_OBQ_LOCK + queueNum); */ 1183 1184 if (AGSA_RC_SUCCESS == ret) 1185 { 1186 smTrace(hpDBG_IOMB,"M0",queueNum); 1187 /* TP:M0 queueNum */ 1188 smTrace(hpDBG_VERY_LOUD,"MA",opcode); 1189 /* TP:MA opcode */ 1190 smTrace(hpDBG_IOMB,"MB",category); 1191 /* TP:MB category */ 1192 1193 #ifdef SA_ENABLE_TRACE_FUNCTIONS 1194 for (i=0; i<((bit32)bc*(circularQ->elementSize/4)); i++) 1195 { 1196 /* The -sizeof(mpiMsgHeader_t) is to account for mpiMsgConsume incrementing the pointer past the header*/ 1197 smTrace(hpDBG_IOMB,"MC",*( ((bit32*)((bit8 *)pMsg1 - sizeof(mpiMsgHeader_t))) + i)); 1198 /* TP:MC Outbound IOMB Dword */ 1199 } 1200 #endif 1201 1202 MPI_DEBUG_TRACE( circularQ->qNumber,((circularQ->producerIdx << 16 ) | circularQ->consumerIdx),MPI_DEBUG_TRACE_OBQ, (void *)(((bit8*)pMsg1) - sizeof(mpiMsgHeader_t)), circularQ->elementSize); 1203 1204 ossaLogIomb(circularQ->agRoot, 1205 circularQ->qNumber, 1206 FALSE, 1207 (void *)(((bit8*)pMsg1) - sizeof(mpiMsgHeader_t)), 1208 bc*circularQ->elementSize); 1209 1210 ossaQueueProcessed(agRoot, queueNum, circularQ->producerIdx, circularQ->consumerIdx); 1211 /* process the outbound message */ 1212 ParseOBIombStatus = mpiParseOBIomb(agRoot, (bit32 *)pMsg1, category, opcode); 1213 if (ParseOBIombStatus == AGSA_RC_FAILURE) 1214 { 1215 SA_DBG1(("siProcessOBMsg, Failed Q %2d PI 0x%03x CI 0x%03x\n", queueNum, circularQ->producerIdx, circularQ->consumerIdx)); 1216 #if defined(SALLSDK_DEBUG) 1217 /* free the message for debug: this is a hang! */ 1218 1219 mpiMsgFreeSet(circularQ, pMsg1, bc); 1220 processedMsgCount ++; 1221 #endif /**/ 1222 break; 1223 } 1224 1225 /* free the message from the outbound circular buffer */ 1226 mpiMsgFreeSet(circularQ, pMsg1, bc); 1227 processedMsgCount ++; 1228 } 1229 else 1230 //if (AGSA_RC_BUSY == ret) // always (circularQ->producerIdx == circularQ->consumerIdx) 1231 // || (AGSA_RC_FAILURE == ret) 1232 { 1233 break; 1234 } 1235 } 1236 /* end of message processing if hit the count */ 1237 while(count > processedMsgCount); 1238 1239 /* #define SALLSDK_FATAL_ERROR_DETECT 1 */ 1240 /* 1241 this comments are to be removed 1242 fill in 0x1D 0x1e 0x1f 0x20 in MPI table for 1243 bit32 regDumpBusBaseNum0; 1244 bit32 regDumpOffset0; 1245 bit32 regDumpLen0; 1246 bit32 regDumpBusBaseNum1; 1247 bit32 regDumpOffset1; 1248 bit32 regDumpLen1; 1249 in agsaFatalErrorInfo_t 1250 1251 ??? regDumpBusBaseNum0 and regDumpBusBaseNum1 1252 saRoot->mainConfigTable.regDumpPCIBAR = pcibar; 1253 saRoot->mainConfigTable.FatalErrorDumpOffset0 = config->FatalErrorDumpOffset0; 1254 saRoot->mainConfigTable.FatalErrorDumpLength0 = config->FatalErrorDumpLength0; 1255 saRoot->mainConfigTable.FatalErrorDumpOffset1 = config->FatalErrorDumpOffset1; 1256 saRoot->mainConfigTable.FatalErrorDumpLength1 = config->FatalErrorDumpLength1; 1257 1258 1259 1260 */ 1261 #if defined(SALLSDK_FATAL_ERROR_DETECT) 1262 1263 if( smIS_SPC(agRoot) ) /* SPC only */ 1264 { 1265 1266 /* any fatal error happened */ 1267 /* executing this code impacts performance by 1% when no error is detected */ 1268 { 1269 agsaFatalErrorInfo_t fatal_error; 1270 bit32 value; 1271 bit32 value1; 1272 1273 value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1, MSGU_SCRATCH_PAD_1); 1274 value1 = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2, MSGU_SCRATCH_PAD_2); 1275 1276 if( (value & SA_FATAL_ERROR_SP1_AAP1_ERR_MASK) == SA_FATAL_ERROR_FATAL_ERROR || 1277 (value1 & SA_FATAL_ERROR_SP2_IOP_ERR_MASK) == SA_FATAL_ERROR_FATAL_ERROR ) 1278 { 1279 si_memset(&fatal_error, 0, sizeof(agsaFatalErrorInfo_t)); 1280 /* read detail fatal errors */ 1281 value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0, MSGU_SCRATCH_PAD_0); 1282 fatal_error.errorInfo0 = value; 1283 SA_DBG1(("siProcessOBMsg: ScratchPad0 AAP error code 0x%x\n", value)); 1284 1285 value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1, MSGU_SCRATCH_PAD_1); 1286 fatal_error.errorInfo1 = value; 1287 /* AAP error state */ 1288 SA_DBG1(("siProcessOBMsg: AAP error state and error code 0x%x\n", value)); 1289 value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2, MSGU_SCRATCH_PAD_2); 1290 fatal_error.errorInfo2 = value; 1291 /* IOP error state */ 1292 SA_DBG1(("siProcessOBMsg: IOP error state and error code 0x%x\n", value)); 1293 value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3, MSGU_SCRATCH_PAD_3); 1294 SA_DBG1(("siProcessOBMsg: ScratchPad3 IOP error code 0x%x\n", value)); 1295 fatal_error.errorInfo3 = value; 1296 1297 if (agNULL != saRoot) 1298 { 1299 fatal_error.regDumpBusBaseNum0 = saRoot->mainConfigTable.regDumpPCIBAR; 1300 fatal_error.regDumpOffset0 = saRoot->mainConfigTable.FatalErrorDumpOffset0; 1301 fatal_error.regDumpLen0 = saRoot->mainConfigTable.FatalErrorDumpLength0; 1302 fatal_error.regDumpBusBaseNum1 = saRoot->mainConfigTable.regDumpPCIBAR; 1303 fatal_error.regDumpOffset1 = saRoot->mainConfigTable.FatalErrorDumpOffset1; 1304 fatal_error.regDumpLen1 = saRoot->mainConfigTable.FatalErrorDumpLength1; 1305 } 1306 else 1307 { 1308 fatal_error.regDumpBusBaseNum0 = 0; 1309 fatal_error.regDumpOffset0 = 0; 1310 fatal_error.regDumpLen0 = 0; 1311 fatal_error.regDumpBusBaseNum1 = 0; 1312 fatal_error.regDumpOffset1 = 0; 1313 fatal_error.regDumpLen1 = 0; 1314 } 1315 /* Call Back with error */ 1316 SA_DBG1(("siProcessOBMsg: SALLSDK_FATAL_ERROR_DETECT \n")); 1317 ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_MALFUNCTION, 0, (void *)&fatal_error, agNULL); 1318 } 1319 } 1320 } 1321 #endif /* SALLSDK_FATAL_ERROR_DETECT */ 1322 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5r"); 1323 return processedMsgCount; 1324 } 1325 1326 /******************************************************************************/ 1327 /*! \brief Function to enable/disable interrupts 1328 * 1329 * The saSystemInterruptsActive() function is called to indicate to the LL Layer 1330 * whether interrupts are available. The parameter sysIntsActive indicates whether 1331 * interrupts are available at this time. 1332 * 1333 * \param agRoot handles for this instance of SAS/SATA hardware 1334 * \param sysIntsActive flag for enable/disable interrupt 1335 * 1336 * \return -void- 1337 * 1338 */ 1339 /*******************************************************************************/ 1340 GLOBAL void saSystemInterruptsActive( 1341 agsaRoot_t *agRoot, 1342 agBOOLEAN sysIntsActive 1343 ) 1344 { 1345 bit32 x; 1346 agsaLLRoot_t *saRoot; 1347 1348 SA_ASSERT((agNULL != agRoot), ""); 1349 if (agRoot == agNULL) 1350 { 1351 SA_DBG1(("saSystemInterruptsActive: agRoot == agNULL\n")); 1352 return; 1353 } 1354 saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 1355 SA_ASSERT((agNULL != saRoot), ""); 1356 if (saRoot == agNULL) 1357 { 1358 SA_DBG1(("saSystemInterruptsActive: saRoot == agNULL\n")); 1359 return; 1360 } 1361 1362 smTraceFuncEnter(hpDBG_TICK_INT,"5s"); 1363 SA_DBG1(("saSystemInterruptsActive: now 0x%X new 0x%x\n",saRoot->sysIntsActive,sysIntsActive)); 1364 SA_DBG3(("saSystemInterruptsActive: Doorbell_Set %08X U %08X\n", 1365 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register), 1366 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU))); 1367 SA_DBG3(("saSystemInterruptsActive: Doorbell_Mask %08X U %08X\n", 1368 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ), 1369 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU ))); 1370 1371 if( saRoot->sysIntsActive && sysIntsActive ) 1372 { 1373 SA_DBG1(("saSystemInterruptsActive: Already active 0x%X new 0x%x\n",saRoot->sysIntsActive,sysIntsActive)); 1374 smTraceFuncExit(hpDBG_TICK_INT, 'a', "5s"); 1375 return; 1376 } 1377 1378 if( !saRoot->sysIntsActive && !sysIntsActive ) 1379 { 1380 if(smIS_SPC(agRoot)) 1381 { 1382 siHalRegWriteExt(agRoot, GEN_MSGU_ODMR, MSGU_ODMR,AGSA_INTERRUPT_HANDLE_ALL_CHANNELS ); 1383 } 1384 else 1385 { 1386 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_Register, AGSA_INTERRUPT_HANDLE_ALL_CHANNELS); 1387 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_RegisterU, AGSA_INTERRUPT_HANDLE_ALL_CHANNELS); 1388 } 1389 SA_DBG1(("saSystemInterruptsActive: Already disabled 0x%X new 0x%x\n",saRoot->sysIntsActive,sysIntsActive)); 1390 smTraceFuncExit(hpDBG_TICK_INT, 'b', "5s"); 1391 return; 1392 } 1393 1394 /* Set the flag is sdkData */ 1395 saRoot->sysIntsActive = (bit8)sysIntsActive; 1396 1397 1398 smTrace(hpDBG_TICK_INT,"Vq",sysIntsActive); 1399 /* TP:Vq sysIntsActive */ 1400 /* If sysIntsActive is true */ 1401 if ( agTRUE == sysIntsActive ) 1402 { 1403 1404 SA_DBG1(("saSystemInterruptsActive: Doorbell_Set %08X U %08X\n", 1405 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register), 1406 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU))); 1407 SA_DBG1(("saSystemInterruptsActive: Doorbell_Mask_Set %08X U %08X\n", 1408 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register), 1409 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU))); 1410 if(smIS_SPCV(agRoot)) 1411 { 1412 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Clear_Register, 0xFFFFFFFF); 1413 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Clear_RegisterU, 0xFFFFFFFF); 1414 } 1415 /* enable interrupt */ 1416 for(x=0; x < saRoot->numInterruptVectors; x++) 1417 { 1418 ossaReenableInterrupts(agRoot,x ); 1419 } 1420 1421 if(saRoot->swConfig.fatalErrorInterruptEnable) 1422 { 1423 ossaReenableInterrupts(agRoot,saRoot->swConfig.fatalErrorInterruptVector ); 1424 } 1425 1426 siHalRegWriteExt(agRoot, GEN_MSGU_ODMR, MSGU_ODMR, 0); 1427 } 1428 /* If sysIntsActive is false */ 1429 else 1430 { 1431 /* disable interrupt */ 1432 if(smIS_SPC(agRoot)) 1433 { 1434 siHalRegWriteExt(agRoot, GEN_MSGU_ODMR, MSGU_ODMR,AGSA_INTERRUPT_HANDLE_ALL_CHANNELS ); 1435 } 1436 else 1437 { 1438 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_Register, AGSA_INTERRUPT_HANDLE_ALL_CHANNELS); 1439 ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_RegisterU, AGSA_INTERRUPT_HANDLE_ALL_CHANNELS); 1440 } 1441 } 1442 1443 SA_DBG3(("saSystemInterruptsActive: Doorbell_Set %08X U %08X\n", 1444 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register), 1445 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU))); 1446 SA_DBG3(("saSystemInterruptsActive: Doorbell_Mask %08X U %08X\n", 1447 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ), 1448 ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU ))); 1449 1450 1451 smTraceFuncExit(hpDBG_TICK_INT, 'c', "5s"); 1452 } 1453 1454 /******************************************************************************/ 1455 /*! \brief Routine to handle for received SAS with data payload event 1456 * 1457 * The handle for received SAS with data payload event 1458 * 1459 * \param agRoot handles for this instance of SAS/SATA hardware 1460 * \param pRequest handles for the IOrequest 1461 * \param pRespIU the pointer to the Response IU 1462 * \param param Payload Length 1463 * 1464 * \return -void- 1465 */ 1466 /*******************************************************************************/ 1467 GLOBAL void siEventSSPResponseWtDataRcvd( 1468 agsaRoot_t *agRoot, 1469 agsaIORequestDesc_t *pRequest, 1470 agsaSSPResponseInfoUnit_t *pRespIU, 1471 bit32 param, 1472 bit32 sspTag 1473 ) 1474 { 1475 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 1476 agsaDeviceDesc_t *pDevice; 1477 bit32 count = 0; 1478 bit32 padCount; 1479 1480 smTraceFuncEnter(hpDBG_VERY_LOUD,"5g"); 1481 1482 /* get frame handle */ 1483 1484 /* If the request is still valid */ 1485 if ( agTRUE == pRequest->valid ) 1486 { 1487 /* get device */ 1488 pDevice = pRequest->pDevice; 1489 1490 /* Delete the request from the pendingIORequests */ 1491 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1492 saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode)); 1493 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1494 1495 if (sspTag & SSP_RESCV_BIT) 1496 { 1497 /* get the pad count, bit 17 and 18 of sspTag */ 1498 padCount = (sspTag >> SSP_RESCV_PAD_SHIFT) & 0x3; 1499 /* get Residual Count */ 1500 count = *(bit32 *)((bit8 *)pRespIU + param + padCount); 1501 } 1502 1503 (*(ossaSSPCompletedCB_t)(pRequest->completionCB))(agRoot, 1504 pRequest->pIORequestContext, 1505 OSSA_IO_SUCCESS, 1506 param, 1507 (void *)pRespIU, 1508 (bit16)(sspTag & SSPTAG_BITS), 1509 count); 1510 1511 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1512 pRequest->valid = agFALSE; 1513 /* return the request to free pool */ 1514 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT) 1515 { 1516 SA_DBG1(("siEventSSPResponseWtDataRcvd: saving pRequest (%p) for later use\n", pRequest)); 1517 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode)); 1518 } 1519 else 1520 { 1521 /* return the request to free pool */ 1522 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode)); 1523 } 1524 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1525 1526 } 1527 else 1528 { 1529 SA_DBG1(("siEventSSPResponseWtDataRcvd: pRequest->Valid not TRUE\n")); 1530 } 1531 1532 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5g"); 1533 1534 return; 1535 } 1536 1537 /******************************************************************************/ 1538 /*! \brief Routine to handle successfully completed IO event 1539 * 1540 * Handle successfully completed IO 1541 * 1542 * \param agRoot handles for this instance of SAS/SATA hardware 1543 * \param pRequest Pointer of IO request of the IO 1544 * \param status status of the IO 1545 * 1546 * \return -void- 1547 */ 1548 /*******************************************************************************/ 1549 GLOBAL FORCEINLINE void siIODone( 1550 agsaRoot_t *agRoot, 1551 agsaIORequestDesc_t *pRequest, 1552 bit32 status, 1553 bit32 sspTag 1554 ) 1555 { 1556 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 1557 agsaDeviceDesc_t *pDevice = agNULL; 1558 1559 smTraceFuncEnter(hpDBG_VERY_LOUD,"5h"); 1560 1561 SA_ASSERT(NULL != pRequest, "pRequest cannot be null"); 1562 1563 /* If the request is still valid */ 1564 if ( agTRUE == pRequest->valid ) 1565 { 1566 /* get device */ 1567 pDevice = pRequest->pDevice; 1568 1569 /* process different request type */ 1570 switch (pRequest->requestType & AGSA_REQTYPE_MASK) 1571 { 1572 case AGSA_SSP_REQTYPE: 1573 { 1574 SA_ASSERT(pRequest->valid, "pRequest not valid"); 1575 pRequest->completionCB(agRoot, 1576 pRequest->pIORequestContext, 1577 OSSA_IO_SUCCESS, 1578 0, 1579 agNULL, 1580 (bit16)(sspTag & SSPTAG_BITS), 1581 0); 1582 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1583 /* Delete the request from the pendingIORequests */ 1584 saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode)); 1585 /* return the request to free pool */ 1586 pRequest->valid = agFALSE; 1587 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode)); 1588 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1589 1590 1591 break; 1592 } 1593 case AGSA_SATA_REQTYPE: 1594 { 1595 SA_DBG5(("siIODone: SATA complete\n")); 1596 1597 if ( agNULL != pRequest->pIORequestContext ) 1598 { 1599 SA_DBG5(("siIODone: Complete Request\n")); 1600 1601 (*(ossaSATACompletedCB_t)(pRequest->completionCB))(agRoot, 1602 pRequest->pIORequestContext, 1603 OSSA_IO_SUCCESS, 1604 agNULL, 1605 0, 1606 agNULL); 1607 } 1608 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1609 /* Delete the request from the pendingIORequests */ 1610 saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode)); 1611 /* return the request to free pool */ 1612 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode)); 1613 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1614 1615 pRequest->valid = agFALSE; 1616 1617 break; 1618 } 1619 case AGSA_SMP_REQTYPE: 1620 { 1621 if ( agNULL != pRequest->pIORequestContext ) 1622 { 1623 (*(ossaSMPCompletedCB_t)(pRequest->completionCB))(agRoot, 1624 pRequest->pIORequestContext, 1625 OSSA_IO_SUCCESS, 1626 0, 1627 agNULL); 1628 } 1629 1630 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1631 /* Delete the request from the pendingSMPRequests */ 1632 saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode)); 1633 /* return the request to free pool */ 1634 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT) 1635 { 1636 SA_DBG1(("siIODone: saving pRequest (%p) for later use\n", pRequest)); 1637 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode)); 1638 } 1639 else 1640 { 1641 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode)); 1642 } 1643 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1644 1645 pRequest->valid = agFALSE; 1646 1647 break; 1648 } 1649 default: 1650 { 1651 SA_DBG1(("siIODone: unknown request type (%x) is completed. HTag=0x%x\n", pRequest->requestType, pRequest->HTag)); 1652 break; 1653 } 1654 } 1655 } 1656 else 1657 { 1658 SA_DBG1(("siIODone: The request is not valid any more. HTag=0x%x requestType=0x%x\n", pRequest->HTag, pRequest->requestType)); 1659 } 1660 1661 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5h"); 1662 1663 } 1664 1665 /******************************************************************************/ 1666 /*! \brief Routine to handle abnormal completed IO/SMP event 1667 * 1668 * Handle abnormal completed IO/SMP 1669 * 1670 * \param agRoot handles for this instance of SAS/SATA hardware 1671 * \param pRequest Pointer of IO request of the IO 1672 * \param status status of the IO 1673 * \param param Length 1674 * 1675 * \return -void- 1676 */ 1677 /*******************************************************************************/ 1678 GLOBAL void siAbnormal( 1679 agsaRoot_t *agRoot, 1680 agsaIORequestDesc_t *pRequest, 1681 bit32 status, 1682 bit32 param, 1683 bit32 sspTag 1684 ) 1685 { 1686 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 1687 agsaDeviceDesc_t *pDevice; 1688 1689 smTraceFuncEnter(hpDBG_VERY_LOUD,"5i"); 1690 1691 if (agNULL == pRequest) 1692 { 1693 SA_DBG1(("siAbnormal: pRequest is NULL.\n")); 1694 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5i"); 1695 return; 1696 } 1697 1698 /* If the request is still valid */ 1699 if ( agTRUE == pRequest->valid ) 1700 { 1701 /* get device */ 1702 1703 SA_ASSERT((pRequest->pIORequestContext->osData != pRequest->pIORequestContext->sdkData), "pIORequestContext"); 1704 1705 pDevice = pRequest->pDevice; 1706 1707 /* remove the IO request from IOMap */ 1708 saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF; 1709 saRoot->IOMap[pRequest->HTag].IORequest = agNULL; 1710 saRoot->IOMap[pRequest->HTag].agContext = agNULL; 1711 1712 smTrace(hpDBG_VERY_LOUD,"P6",status ); 1713 /* TP:P6 siAbnormal status */ 1714 smTrace(hpDBG_VERY_LOUD,"P7",param ); 1715 /* TP:P7 siAbnormal param */ 1716 /* process different request type */ 1717 switch (pRequest->requestType & AGSA_REQTYPE_MASK) 1718 { 1719 case AGSA_SSP_REQTYPE: 1720 { 1721 (*(ossaSSPCompletedCB_t)(pRequest->completionCB))(agRoot, 1722 pRequest->pIORequestContext, 1723 status, 1724 param, 1725 agNULL, 1726 (bit16)(sspTag & SSPTAG_BITS), 1727 ((sspTag & SSP_AGR_S_BIT)? (1 << 0) : 0)); 1728 1729 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1730 /* Delete the request from the pendingIORequests */ 1731 saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode)); 1732 pRequest->valid = agFALSE; 1733 /* return the request to free pool */ 1734 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT) 1735 { 1736 SA_DBG1(("siAbnormal: saving pRequest (%p) for later use\n", pRequest)); 1737 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode)); 1738 } 1739 else 1740 { 1741 /* return the request to free pool */ 1742 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode)); 1743 } 1744 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1745 1746 break; 1747 } 1748 case AGSA_SATA_REQTYPE: 1749 { 1750 SA_DBG5(("siAbnormal: SATA \n")); 1751 1752 if ( agNULL != pRequest->pIORequestContext ) 1753 { 1754 SA_DBG5(("siAbnormal: Calling SATACompletedCB\n")); 1755 1756 (*(ossaSATACompletedCB_t)(pRequest->completionCB))(agRoot, 1757 pRequest->pIORequestContext, 1758 status, 1759 agNULL, 1760 param, 1761 agNULL); 1762 } 1763 1764 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1765 /* Delete the request from the pendingIORequests */ 1766 saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode)); 1767 /* return the request to free pool */ 1768 pRequest->valid = agFALSE; 1769 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT) 1770 { 1771 SA_DBG1(("siAbnormal: saving pRequest (%p) for later use\n", pRequest)); 1772 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode)); 1773 } 1774 else 1775 { 1776 /* return the request to free pool */ 1777 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode)); 1778 } 1779 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1780 1781 break; 1782 } 1783 case AGSA_SMP_REQTYPE: 1784 { 1785 if ( agNULL != pRequest->pIORequestContext ) 1786 { 1787 (*(ossaSMPCompletedCB_t)(pRequest->completionCB))(agRoot, 1788 pRequest->pIORequestContext, 1789 status, 1790 param, 1791 agNULL); 1792 } 1793 1794 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1795 /* Delete the request from the pendingSMPRequests */ 1796 saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode)); 1797 /* return the request to free pool */ 1798 pRequest->valid = agFALSE; 1799 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT) 1800 { 1801 SA_DBG1(("siAbnormal: saving pRequest (%p) for later use\n", pRequest)); 1802 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode)); 1803 } 1804 else 1805 { 1806 /* return the request to free pool */ 1807 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode)); 1808 } 1809 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1810 1811 break; 1812 } 1813 default: 1814 { 1815 SA_DBG1(("siAbnormal: unknown request type (%x) is completed. Tag=0x%x\n", pRequest->requestType, pRequest->HTag)); 1816 break; 1817 } 1818 } 1819 1820 } 1821 else 1822 { 1823 SA_DBG1(("siAbnormal: The request is not valid any more. Tag=0x%x\n", pRequest->HTag)); 1824 } 1825 1826 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5i"); 1827 1828 return; 1829 } 1830 1831 1832 /******************************************************************************/ 1833 /*! \brief Routine to handle abnormal DIF completed IO/SMP event 1834 * 1835 * Handle abnormal completed IO/SMP 1836 * 1837 * \param agRoot handles for this instance of SAS/SATA hardware 1838 * \param pRequest Pointer of IO request of the IO 1839 * \param status status of the IO 1840 * \param param Length 1841 * 1842 * \return -void- 1843 */ 1844 /*******************************************************************************/ 1845 GLOBAL void siDifAbnormal( 1846 agsaRoot_t *agRoot, 1847 agsaIORequestDesc_t *pRequest, 1848 bit32 status, 1849 bit32 param, 1850 bit32 sspTag, 1851 bit32 *pMsg1 1852 ) 1853 { 1854 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 1855 agsaDeviceDesc_t *pDevice; 1856 1857 smTraceFuncEnter(hpDBG_VERY_LOUD,"2S"); 1858 1859 if (agNULL == pRequest) 1860 { 1861 SA_DBG1(("siDifAbnormal: pRequest is NULL.\n")); 1862 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2S"); 1863 return; 1864 } 1865 1866 /* If the request is still valid */ 1867 if ( agTRUE == pRequest->valid ) 1868 { 1869 /* get device */ 1870 pDevice = pRequest->pDevice; 1871 1872 /* remove the IO request from IOMap */ 1873 saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF; 1874 saRoot->IOMap[pRequest->HTag].IORequest = agNULL; 1875 saRoot->IOMap[pRequest->HTag].agContext = agNULL; 1876 1877 smTrace(hpDBG_VERY_LOUD,"P6",status ); 1878 /* TP:P6 siDifAbnormal status */ 1879 /* process different request type */ 1880 switch (pRequest->requestType & AGSA_REQTYPE_MASK) 1881 { 1882 case AGSA_SSP_REQTYPE: 1883 { 1884 agsaDifDetails_t agDifDetails; 1885 agsaSSPCompletionDifRsp_t *pIomb; 1886 pIomb = (agsaSSPCompletionDifRsp_t *)pMsg1; 1887 si_memset(&agDifDetails, 0, sizeof(agDifDetails)); 1888 1889 OSSA_READ_LE_32(agRoot, &agDifDetails.UpperLBA, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,UpperLBA )); 1890 OSSA_READ_LE_32(agRoot, &agDifDetails.LowerLBA, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,LowerLBA )); 1891 OSSA_READ_LE_32(agRoot, &agDifDetails.sasAddressHi, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,sasAddressHi )); 1892 OSSA_READ_LE_32(agRoot, &agDifDetails.sasAddressLo, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,sasAddressLo)); 1893 OSSA_READ_LE_32(agRoot, &agDifDetails.ExpectedCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,ExpectedCRCUDT01 )); 1894 OSSA_READ_LE_32(agRoot, &agDifDetails.ExpectedUDT2345, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,ExpectedUDT2345)); 1895 OSSA_READ_LE_32(agRoot, &agDifDetails.ActualCRCUDT01, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,ActualCRCUDT01 )); 1896 OSSA_READ_LE_32(agRoot, &agDifDetails.ActualUDT2345, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,ActualUDT2345)); 1897 OSSA_READ_LE_32(agRoot, &agDifDetails.DIFErrDevID, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,DIFErrDevID )); 1898 OSSA_READ_LE_32(agRoot, &agDifDetails.ErrBoffsetEDataLen, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,ErrBoffsetEDataLen )); 1899 agDifDetails.frame = (void *)(bit8*)(pIomb+ OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t, EDATA_FRM)); 1900 1901 (*(ossaSSPCompletedCB_t)(pRequest->completionCB))(agRoot, 1902 pRequest->pIORequestContext, 1903 status, 1904 param, 1905 &agDifDetails, 1906 (bit16)(sspTag & SSPTAG_BITS), 1907 ((sspTag & SSP_AGR_S_BIT)? (1 << 0) : 0)); 1908 1909 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1910 pRequest->valid = agFALSE; 1911 /* Delete the request from the pendingIORequests */ 1912 saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode)); 1913 1914 /* return the request to free pool */ 1915 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT) 1916 { 1917 SA_DBG1(("siDifAbnormal: saving pRequest (%p) for later use\n", pRequest)); 1918 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode)); 1919 } 1920 else 1921 { 1922 /* return the request to free pool */ 1923 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode)); 1924 } 1925 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK); 1926 1927 break; 1928 } 1929 default: 1930 { 1931 SA_DBG1(("siDifAbnormal: unknown request type (%x) is completed. Tag=0x%x\n", pRequest->requestType, pRequest->HTag)); 1932 break; 1933 } 1934 } 1935 1936 } 1937 else 1938 { 1939 SA_DBG1(("siDifAbnormal: The request is not valid any more. Tag=0x%x\n", pRequest->HTag)); 1940 } 1941 1942 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2S"); 1943 1944 return; 1945 } 1946 1947 1948 /******************************************************************************/ 1949 /*! \brief Routine to handle for received SMP response event 1950 * 1951 * The handle for received SMP response event 1952 * 1953 * \param agRoot handles for this instance of SAS/SATA hardware 1954 * \param pIomb Pointer of payload of IOMB 1955 * \param payloadSize size of the payload 1956 * \param tag the tag of the request SMP 1957 * 1958 * \return -void- 1959 */ 1960 /*******************************************************************************/ 1961 GLOBAL void siSMPRespRcvd( 1962 agsaRoot_t *agRoot, 1963 agsaSMPCompletionRsp_t *pIomb, 1964 bit32 payloadSize, 1965 bit32 tag 1966 ) 1967 { 1968 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 1969 agsaFrameHandle_t frameHandle; 1970 agsaIORequestDesc_t *pRequest; 1971 agsaDeviceDesc_t *pDevice; 1972 agsaPort_t *pPort; 1973 1974 smTraceFuncEnter(hpDBG_VERY_LOUD,"5j"); 1975 1976 /* get the request */ 1977 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest; 1978 SA_ASSERT(pRequest, "pRequest"); 1979 1980 /* get the port */ 1981 pPort = pRequest->pPort; 1982 SA_ASSERT(pPort, "pPort"); 1983 1984 if (pRequest->IRmode == 0) 1985 { 1986 /* get frame handle - direct response mode */ 1987 frameHandle = (agsaFrameHandle_t)(&(pIomb->SMPrsp[0])); 1988 #if defined(SALLSDK_DEBUG) 1989 SA_DBG3(("saSMPRespRcvd(direct): smpRspPtr=0x%p - len=0x%x\n", 1990 frameHandle, 1991 payloadSize 1992 )); 1993 #endif /* SALLSDK_DEBUG */ 1994 } 1995 else 1996 { 1997 /* indirect response mode */ 1998 frameHandle = agNULL; 1999 } 2000 2001 /* If the request is still valid */ 2002 if ( agTRUE == pRequest->valid ) 2003 { 2004 /* get device */ 2005 pDevice = pRequest->pDevice; 2006 SA_ASSERT(pDevice, "pDevice"); 2007 2008 /* Delete the request from the pendingSMPRequests */ 2009 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK); 2010 saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode)); 2011 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK); 2012 2013 /* If the request is from OS layer */ 2014 if ( agNULL != pRequest->pIORequestContext ) 2015 { 2016 if (agNULL == frameHandle) 2017 { 2018 /* indirect mode */ 2019 /* call back with success */ 2020 (*(ossaSMPCompletedCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, OSSA_IO_SUCCESS, payloadSize, frameHandle); 2021 } 2022 else 2023 { 2024 /* direct mode */ 2025 /* call back with success */ 2026 (*(ossaSMPCompletedCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, OSSA_IO_SUCCESS, payloadSize, frameHandle); 2027 } 2028 } 2029 2030 /* remove the IO request from IOMap */ 2031 saRoot->IOMap[tag].Tag = MARK_OFF; 2032 saRoot->IOMap[tag].IORequest = agNULL; 2033 saRoot->IOMap[tag].agContext = agNULL; 2034 ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK); 2035 pRequest->valid = agFALSE; 2036 if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT) 2037 { 2038 SA_DBG1(("siSMPRespRcvd: saving pRequest (%p) for later use\n", pRequest)); 2039 saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode)); 2040 } 2041 else 2042 { 2043 /* return the request to free pool */ 2044 saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode)); 2045 } 2046 ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK); 2047 } 2048 2049 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5j"); 2050 2051 return; 2052 } 2053 2054 /******************************************************************************/ 2055 /*! \brief Routine to handle for received Phy Up event 2056 * 2057 * The handle for received Phy Up event 2058 * 2059 * \param agRoot handles for this instance of SAS/SATA hardware 2060 * \param phyId for the Phy Up event happened 2061 * \param agSASIdentify is the remote phy Identify 2062 * \param portId is the port context index of the phy up event 2063 * \param deviceId is the device context index 2064 * \param linkRate link up rate from SPC 2065 * 2066 * \return -void- 2067 */ 2068 /*******************************************************************************/ 2069 GLOBAL void siEventPhyUpRcvd( 2070 agsaRoot_t *agRoot, 2071 bit32 phyId, 2072 agsaSASIdentify_t *agSASIdentify, 2073 bit32 portId, 2074 bit32 npipps, 2075 bit8 linkRate 2076 ) 2077 { 2078 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 2079 agsaPhy_t *pPhy = &(saRoot->phys[phyId]); 2080 agsaPort_t *pPort; 2081 agsaSASIdentify_t remoteIdentify; 2082 agsaPortContext_t *agPortContext; 2083 2084 smTraceFuncEnter(hpDBG_VERY_LOUD,"5k"); 2085 2086 /* Read remote SAS Identify from response message and save it */ 2087 remoteIdentify = *agSASIdentify; 2088 2089 /* get port context from portMap */ 2090 SA_DBG2(("siEventPhyUpRcvd: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)); 2091 agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext; 2092 2093 SA_DBG2(("siEventPhyUpRcvd: portID %d PortContext %p linkRate 0x%X\n", portId, agPortContext,linkRate)); 2094 if (smIS_SPCV8006(agRoot)) 2095 { 2096 SA_DBG1(("siEventPhyUpRcvd: SAS_PHY_UP received for SATA Controller\n")); 2097 return; 2098 } 2099 2100 if (agNULL != agPortContext) 2101 { 2102 /* existing port */ 2103 pPort = (agsaPort_t *) (agPortContext->sdkData); 2104 pPort->portId = portId; 2105 2106 /* include the phy to the port */ 2107 pPort->phyMap[phyId] = agTRUE; 2108 /* Set the port for the phy */ 2109 saRoot->phys[phyId].pPort = pPort; 2110 2111 /* Update port state */ 2112 if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK)) 2113 { 2114 pPort->status &= ~PORT_INVALIDATING; 2115 saRoot->PortMap[portId].PortStatus &= ~PORT_INVALIDATING; 2116 SA_DBG1(("siEventPhyUpRcvd: portID %d PortContext %p, hitting workaround\n", portId, agPortContext)); 2117 } 2118 } 2119 else 2120 { 2121 ossaSingleThreadedEnter(agRoot, LL_PORT_LOCK); 2122 /* new port */ 2123 /* Allocate a free port */ 2124 pPort = (agsaPort_t *) saLlistGetHead(&(saRoot->freePorts)); 2125 if (agNULL != pPort) 2126 { 2127 /* Acquire port list lock */ 2128 saLlistRemove(&(saRoot->freePorts), &(pPort->linkNode)); 2129 2130 /* setup the port data structure */ 2131 pPort->portContext.osData = agNULL; 2132 pPort->portContext.sdkData = pPort; 2133 2134 /* Add to valid port list */ 2135 saLlistAdd(&(saRoot->validPorts), &(pPort->linkNode)); 2136 /* Release port list lock */ 2137 ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK); 2138 2139 /* include the phy to the port */ 2140 pPort->phyMap[phyId] = agTRUE; 2141 /* Set the port for the phy */ 2142 saRoot->phys[phyId].pPort = pPort; 2143 2144 /* Setup portMap based on portId */ 2145 saRoot->PortMap[portId].PortID = portId; 2146 saRoot->PortMap[portId].PortContext = &(pPort->portContext); 2147 pPort->portId = portId; 2148 2149 SA_DBG3(("siEventPhyUpRcvd: NewPort portID %d PortContext %p\n", portId, saRoot->PortMap[portId].PortContext)); 2150 } 2151 else 2152 { 2153 ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK); 2154 /* pPort is agNULL*/ 2155 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5k"); 2156 return; 2157 } 2158 2159 if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK)) 2160 { 2161 pPort->status &= ~PORT_INVALIDATING; 2162 saRoot->PortMap[portId].PortStatus &= ~PORT_INVALIDATING; 2163 } 2164 else 2165 { 2166 SA_DBG1(("siEventPhyUpRcvd: PortInvalid portID %d PortContext %p\n", portId, saRoot->PortMap[portId].PortContext)); 2167 } 2168 } 2169 2170 /* adjust the bit fields before callback */ 2171 phyId = (linkRate << SHIFT8) | phyId; 2172 /* report PhyId, NPIP, PortState */ 2173 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16); 2174 ossaHwCB(agRoot, &(pPort->portContext), OSSA_HW_EVENT_SAS_PHY_UP, phyId, agNULL, &remoteIdentify); 2175 2176 /* set PHY_UP status */ 2177 PHY_STATUS_SET(pPhy, PHY_UP); 2178 2179 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5k"); 2180 2181 /* return */ 2182 return; 2183 } 2184 2185 /******************************************************************************/ 2186 /*! \brief Routine to handle for received SATA signature event 2187 * 2188 * The handle for received SATA signature event 2189 * 2190 * \param agRoot handles for this instance of SAS/SATA hardware 2191 * \param phyId the phy id of the phy received the frame 2192 * \param pMsg the pointer to the message payload 2193 * \param portId the port context index of the phy up event 2194 * \param deviceId the device context index 2195 * \param linkRate link up rate from SPC 2196 * 2197 * \return -void- 2198 */ 2199 /*******************************************************************************/ 2200 GLOBAL void siEventSATASignatureRcvd( 2201 agsaRoot_t *agRoot, 2202 bit32 phyId, 2203 void *pMsg, 2204 bit32 portId, 2205 bit32 npipps, 2206 bit8 linkRate 2207 ) 2208 { 2209 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 2210 agsaPhy_t *pPhy = &(saRoot->phys[phyId]); 2211 agsaPort_t *pPort = agNULL; 2212 agsaPortContext_t *agPortContext; 2213 #if defined(SALLSDK_DEBUG) 2214 agsaFisRegDeviceToHost_t *fisD2H; 2215 /* Read the D2H FIS */ 2216 fisD2H = (agsaFisRegDeviceToHost_t *)pMsg; 2217 #endif /* SALLSDK_DEBUG */ 2218 2219 smTraceFuncEnter(hpDBG_VERY_LOUD,"5m"); 2220 2221 SA_DBG5(("siEventSATASignatureRcvd: About to read the signatureFIS data\n")); 2222 2223 2224 SA_DBG5(("agsaFisRegDeviceToHost_t:\n")); 2225 SA_DBG5((" fisType = %x\n", fisD2H->h.fisType)); 2226 SA_DBG5((" i_pmPort = %x\n", fisD2H->h.i_pmPort)); 2227 SA_DBG5((" status = %x\n", fisD2H->h.status)); 2228 SA_DBG5((" error = %x\n", fisD2H->h.error)); 2229 2230 SA_DBG5((" lbaLow = %x\n", fisD2H->d.lbaLow)); 2231 SA_DBG5((" lbaMid = %x\n", fisD2H->d.lbaMid)); 2232 SA_DBG5((" lbaHigh = %x\n", fisD2H->d.lbaHigh)); 2233 SA_DBG5((" device = %x\n", fisD2H->d.device)); 2234 2235 SA_DBG5((" lbaLowExp = %x\n", fisD2H->d.lbaLowExp)); 2236 SA_DBG5((" lbaMidExp = %x\n", fisD2H->d.lbaMidExp)); 2237 SA_DBG5((" lbaHighExp = %x\n", fisD2H->d.lbaHighExp)); 2238 SA_DBG5((" reserved4 = %x\n", fisD2H->d.reserved4)); 2239 2240 SA_DBG5((" sectorCount = %x\n", fisD2H->d.sectorCount)); 2241 SA_DBG5((" sectorCountExp = %x\n", fisD2H->d.sectorCountExp)); 2242 SA_DBG5((" reserved5 = %x\n", fisD2H->d.reserved5)); 2243 SA_DBG5((" reserved6 = %x\n", fisD2H->d.reserved6)); 2244 2245 SA_DBG5((" reserved7 (32) = %08X\n", fisD2H->d.reserved7)); 2246 2247 SA_DBG5(("siEventSATASignatureRcvd: GOOD signatureFIS data\n")); 2248 2249 #if defined(SALLSDK_DEBUG) 2250 /* read signature */ 2251 pPhy->remoteSignature[0] = (bit8) fisD2H->d.sectorCount; 2252 pPhy->remoteSignature[1] = (bit8) fisD2H->d.lbaLow; 2253 pPhy->remoteSignature[2] = (bit8) fisD2H->d.lbaMid; 2254 pPhy->remoteSignature[3] = (bit8) fisD2H->d.lbaHigh; 2255 pPhy->remoteSignature[4] = (bit8) fisD2H->d.device; 2256 #endif 2257 2258 /* get port context from portMap */ 2259 SA_DBG2(("siEventSATASignatureRcvd: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)); 2260 agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext; 2261 2262 SA_DBG2(("siEventSATASignatureRcvd: portID %d PortContext %p\n", portId, agPortContext)); 2263 2264 if (agNULL != agPortContext) 2265 { 2266 /* exist port */ 2267 pPort = (agsaPort_t *) (agPortContext->sdkData); 2268 pPort->portId = portId; 2269 2270 /* include the phy to the port */ 2271 pPort->phyMap[phyId] = agTRUE; 2272 /* Set the port for the phy */ 2273 saRoot->phys[phyId].pPort = pPort; 2274 } 2275 else 2276 { 2277 ossaSingleThreadedEnter(agRoot, LL_PORT_LOCK); 2278 /* new port */ 2279 /* Allocate a free port */ 2280 pPort = (agsaPort_t *) saLlistGetHead(&(saRoot->freePorts)); 2281 if (agNULL != pPort) 2282 { 2283 /* Acquire port list lock */ 2284 saLlistRemove(&(saRoot->freePorts), &(pPort->linkNode)); 2285 2286 /* setup the port data structure */ 2287 pPort->portContext.osData = agNULL; 2288 pPort->portContext.sdkData = pPort; 2289 2290 /* Add to valid port list */ 2291 saLlistAdd(&(saRoot->validPorts), &(pPort->linkNode)); 2292 /* Release port list lock */ 2293 ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK); 2294 2295 /* include the phy to the port */ 2296 pPort->phyMap[phyId] = agTRUE; 2297 /* Set the port for the phy */ 2298 saRoot->phys[phyId].pPort = pPort; 2299 2300 /* Setup portMap based on portId */ 2301 saRoot->PortMap[portId].PortID = portId; 2302 saRoot->PortMap[portId].PortContext = &(pPort->portContext); 2303 pPort->portId = portId; 2304 SA_DBG3(("siEventSATASignatureRcvd: NewPort portID %d portContect %p\n", portId, saRoot->PortMap[portId].PortContext)); 2305 } 2306 else 2307 { 2308 ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK); 2309 /* pPort is agNULL*/ 2310 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5m"); 2311 return; 2312 } 2313 2314 if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK)) 2315 { 2316 pPort->status &= ~PORT_INVALIDATING; 2317 saRoot->PortMap[portId].PortStatus &= ~PORT_INVALIDATING; 2318 } 2319 else 2320 { 2321 SA_DBG1(("siEventSATASignatureRcvd: PortInvalid portID %d PortContext %p\n", portId, saRoot->PortMap[portId].PortContext)); 2322 } 2323 } 2324 2325 /* adjust the bit fields before callback */ 2326 phyId = (linkRate << SHIFT8) | phyId; 2327 /* report PhyId, NPIP, PortState */ 2328 phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16); 2329 ossaHwCB(agRoot, &(pPort->portContext), OSSA_HW_EVENT_SATA_PHY_UP, phyId, agNULL, pMsg); 2330 2331 /* set PHY_UP status */ 2332 PHY_STATUS_SET(pPhy, PHY_UP); 2333 2334 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5m"); 2335 2336 /* return */ 2337 return; 2338 } 2339 2340 2341 /******************************************************************************/ 2342 /*! \brief Process Outbound IOMB Message 2343 * 2344 * Process Outbound IOMB from SPC 2345 * 2346 * \param agRoot Handles for this instance of SAS/SATA LL Layer 2347 * \param pMsg1 Pointer of Response IOMB message 1 2348 * \param category category of outbpond IOMB header 2349 * \param opcode Opcode of Outbound IOMB header 2350 * \param bc buffer count of IOMB header 2351 * 2352 * \return success or fail 2353 * 2354 */ 2355 /*******************************************************************************/ 2356 GLOBAL bit32 mpiParseOBIomb( 2357 agsaRoot_t *agRoot, 2358 bit32 *pMsg1, 2359 mpiMsgCategory_t category, 2360 bit16 opcode 2361 ) 2362 { 2363 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 2364 bit32 ret = AGSA_RC_SUCCESS; 2365 bit32 parserStatus = AGSA_RC_SUCCESS; 2366 2367 smTraceFuncEnter(hpDBG_VERY_LOUD, "2f"); 2368 2369 switch (opcode) 2370 { 2371 case OPC_OUB_COMBINED_SSP_COMP: 2372 { 2373 agsaSSPCoalescedCompletionRsp_t *pIomb = (agsaSSPCoalescedCompletionRsp_t *)pMsg1; 2374 agsaIORequestDesc_t *pRequest = agNULL; 2375 bit32 tag = 0; 2376 bit32 sspTag = 0; 2377 bit32 count = 0; 2378 2379 #ifdef SALL_API_TEST 2380 saRoot->LLCounters.IOCounter.numSSPCompleted++; 2381 SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p %d\n", 2382 pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted)); 2383 #else 2384 SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SSP_COMP Response received IOMB=%p\n", pMsg1)); 2385 #endif 2386 /* get Tag */ 2387 for (count = 0; count < pIomb->coalescedCount; count++) 2388 { 2389 tag = pIomb->sspComplCxt[count].tag; 2390 sspTag = pIomb->sspComplCxt[count].SSPTag; 2391 pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest; 2392 SA_ASSERT((pRequest), "pRequest"); 2393 2394 if(pRequest == agNULL) 2395 { 2396 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)); 2397 #ifdef SA_ENABLE_PCI_TRIGGER 2398 if( saRoot->swConfig.PCI_trigger & PCI_TRIGGER_COAL_IOMB_ERROR ) 2399 { 2400 siPCITriger(agRoot); 2401 } 2402 #endif /* SA_ENABLE_PCI_TRIGGER */ 2403 return(AGSA_RC_FAILURE); 2404 } 2405 SA_ASSERT((pRequest->valid), "pRequest->valid"); 2406 2407 #ifdef SA_ENABLE_PCI_TRIGGER 2408 if(!pRequest->valid) 2409 { 2410 if( saRoot->swConfig.PCI_trigger & PCI_TRIGGER_COAL_INVALID ) 2411 { 2412 siPCITriger(agRoot); 2413 } 2414 } 2415 #endif /* SA_ENABLE_PCI_TRIGGER */ 2416 2417 2418 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)); 2419 2420 /* Completion of SSP without Response Data */ 2421 siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, sspTag); 2422 } 2423 } 2424 break; 2425 2426 case OPC_OUB_SSP_COMP: 2427 { 2428 #ifdef SALL_API_TEST 2429 saRoot->LLCounters.IOCounter.numSSPCompleted++; 2430 SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p %d\n", 2431 pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted)); 2432 #else 2433 SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p\n", pMsg1)); 2434 #endif 2435 /* process the SSP IO Completed response message */ 2436 mpiSSPCompletion(agRoot, pMsg1); 2437 break; 2438 } 2439 case OPC_OUB_COMBINED_SATA_COMP: 2440 { 2441 agsaSATACoalescedCompletionRsp_t *pIomb; 2442 agsaIORequestDesc_t *pRequest; 2443 bit32 tag; 2444 bit32 count; 2445 2446 #ifdef SALL_API_TEST 2447 saRoot->LLCounters.IOCounter.numSSPCompleted++; 2448 SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP Response received IOMB=%p %d\n", 2449 pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted)); 2450 #else 2451 SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP Response received IOMB=%p\n", pMsg1)); 2452 #endif 2453 2454 pIomb = (agsaSATACoalescedCompletionRsp_t *)pMsg1; 2455 /* get Tag */ 2456 for (count = 0; count < pIomb->coalescedCount; count++) 2457 { 2458 tag = pIomb->stpComplCxt[count].tag; 2459 pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest; 2460 SA_ASSERT((pRequest), "pRequest"); 2461 2462 if(pRequest == agNULL) 2463 { 2464 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)); 2465 return(AGSA_RC_FAILURE); 2466 } 2467 SA_ASSERT((pRequest->valid), "pRequest->valid"); 2468 2469 SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP IOMB tag=0x%x, status=0x%x, param=0x%x\n", tag, OSSA_IO_SUCCESS, 0)); 2470 2471 /* Completion of SATA without Response Data */ 2472 siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, 0); 2473 } 2474 break; 2475 } 2476 case OPC_OUB_SATA_COMP: 2477 { 2478 #ifdef SALL_API_TEST 2479 saRoot->LLCounters.IOCounter.numSataCompleted++; 2480 SA_DBG3(("mpiParseOBIomb, SATA_COMP Response received IOMB=%p %d\n", 2481 pMsg1, saRoot->LLCounters.IOCounter.numSataCompleted)); 2482 #else 2483 SA_DBG3(("mpiParseOBIomb, SATA_COMP Response received IOMB=%p\n", pMsg1)); 2484 #endif 2485 /* process the response message */ 2486 mpiSATACompletion(agRoot, pMsg1); 2487 break; 2488 } 2489 case OPC_OUB_SSP_ABORT_RSP: 2490 { 2491 #ifdef SALL_API_TEST 2492 saRoot->LLCounters.IOCounter.numSSPAbortedCB++; 2493 #else 2494 SA_DBG3(("mpiParseOBIomb, SSP_ABORT Response received IOMB=%p\n", pMsg1)); 2495 #endif 2496 /* process the response message */ 2497 parserStatus = mpiSSPAbortRsp(agRoot, (agsaSSPAbortRsp_t *)pMsg1); 2498 if(parserStatus != AGSA_RC_SUCCESS) 2499 { 2500 SA_DBG3(("mpiParseOBIomb, mpiSSPAbortRsp FAIL IOMB=%p\n", pMsg1)); 2501 } 2502 2503 break; 2504 } 2505 case OPC_OUB_SATA_ABORT_RSP: 2506 { 2507 #ifdef SALL_API_TEST 2508 saRoot->LLCounters.IOCounter.numSataAbortedCB++; 2509 #else 2510 SA_DBG3(("mpiParseOBIomb, SATA_ABORT Response received IOMB=%p\n", pMsg1)); 2511 #endif 2512 /* process the response message */ 2513 mpiSATAAbortRsp(agRoot, (agsaSATAAbortRsp_t *)pMsg1); 2514 break; 2515 } 2516 case OPC_OUB_SATA_EVENT: 2517 { 2518 SA_DBG3(("mpiParseOBIomb, SATA_EVENT Response received IOMB=%p\n", pMsg1)); 2519 /* process the response message */ 2520 mpiSATAEvent(agRoot, (agsaSATAEventRsp_t *)pMsg1); 2521 break; 2522 } 2523 case OPC_OUB_SSP_EVENT: 2524 { 2525 SA_DBG3(("mpiParseOBIomb, SSP_EVENT Response received IOMB=%p\n", pMsg1)); 2526 /* process the response message */ 2527 mpiSSPEvent(agRoot, (agsaSSPEventRsp_t *)pMsg1); 2528 break; 2529 } 2530 case OPC_OUB_SMP_COMP: 2531 { 2532 #ifdef SALL_API_TEST 2533 saRoot->LLCounters.IOCounter.numSMPCompleted++; 2534 SA_DBG3(("mpiParseOBIomb, SMP_COMP Response received IOMB=%p, %d\n", 2535 pMsg1, saRoot->LLCounters.IOCounter.numSMPCompleted)); 2536 #else 2537 SA_DBG3(("mpiParseOBIomb, SMP_COMP Response received IOMB=%p\n", pMsg1)); 2538 #endif 2539 /* process the response message */ 2540 mpiSMPCompletion(agRoot, (agsaSMPCompletionRsp_t *)pMsg1); 2541 break; 2542 } 2543 case OPC_OUB_ECHO: 2544 { 2545 #ifdef SALL_API_TEST 2546 saRoot->LLCounters.IOCounter.numEchoCB++; 2547 SA_DBG3(("mpiParseOBIomb, ECHO Response received %d\n", saRoot->LLCounters.IOCounter.numEchoCB)); 2548 #else 2549 SA_DBG3(("mpiParseOBIomb, ECHO Response received\n")); 2550 #endif 2551 /* process the response message */ 2552 mpiEchoRsp(agRoot, (agsaEchoRsp_t *)pMsg1); 2553 break; 2554 } 2555 case OPC_OUB_GET_NVMD_DATA: 2556 { 2557 SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_NVMD_DATA received IOMB=%p\n", pMsg1)); 2558 /* process the response message */ 2559 mpiGetNVMDataRsp(agRoot, (agsaGetNVMDataRsp_t *)pMsg1); 2560 break; 2561 } 2562 case OPC_OUB_SPC_HW_EVENT: 2563 { 2564 SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC"); 2565 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SPC_HW_EVENT Response received IOMB=%p\n", pMsg1)); 2566 /* process the response message */ 2567 mpiHWevent(agRoot, (agsaHWEvent_SPC_OUB_t *)pMsg1); 2568 break; 2569 } 2570 case OPC_OUB_HW_EVENT: 2571 { 2572 SA_DBG3(("mpiParseOBIomb, HW_EVENT Response received IOMB=%p\n", pMsg1)); 2573 /* process the response message */ 2574 mpiHWevent(agRoot, (agsaHWEvent_SPC_OUB_t *)pMsg1); 2575 break; 2576 } 2577 case OPC_OUB_PHY_START_RESPONSE: 2578 { 2579 SA_DBG1(("mpiParseOBIomb, OPC_OUB_PHY_START_RESPONSE Response received IOMB=%p\n", pMsg1)); 2580 /* process the response message */ 2581 mpiPhyStartEvent( agRoot, (agsaHWEvent_Phy_OUB_t *)pMsg1 ); 2582 2583 break; 2584 } 2585 case OPC_OUB_PHY_STOP_RESPONSE: 2586 { 2587 SA_DBG1(("mpiParseOBIomb, OPC_OUB_PHY_STOP_RESPONSE Response received IOMB=%p\n", pMsg1)); 2588 /* process the response message */ 2589 mpiPhyStopEvent( agRoot, (agsaHWEvent_Phy_OUB_t *)pMsg1 ); 2590 break; 2591 } 2592 2593 case OPC_OUB_LOCAL_PHY_CNTRL: 2594 { 2595 SA_DBG3(("mpiParseOBIomb, PHY CONTROL Response received IOMB=%p\n", pMsg1)); 2596 /* process the response message */ 2597 mpiPhyCntrlRsp(agRoot, (agsaLocalPhyCntrlRsp_t *)pMsg1); 2598 break; 2599 } 2600 case OPC_OUB_SPC_DEV_REGIST: 2601 { 2602 SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC"); 2603 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SPC_DEV_REGIST Response received IOMB=%p\n", pMsg1)); 2604 /* process the response message */ 2605 mpiDeviceRegRsp(agRoot, (agsaDeviceRegistrationRsp_t *)pMsg1); 2606 break; 2607 } 2608 case OPC_OUB_DEV_REGIST: 2609 { 2610 SA_DBG2(("mpiParseOBIomb, DEV_REGISTRATION Response received IOMB=%p\n", pMsg1)); 2611 /* process the response message */ 2612 mpiDeviceRegRsp(agRoot, (agsaDeviceRegistrationRsp_t *)pMsg1); 2613 break; 2614 } 2615 case OPC_OUB_DEREG_DEV: 2616 { 2617 SA_DBG3(("mpiParseOBIomb, DEREGISTRATION DEVICE Response received IOMB=%p\n", pMsg1)); 2618 /* process the response message */ 2619 mpiDeregDevHandleRsp(agRoot, (agsaDeregDevHandleRsp_t *)pMsg1); 2620 break; 2621 } 2622 case OPC_OUB_GET_DEV_HANDLE: 2623 { 2624 SA_DBG3(("mpiParseOBIomb, GET_DEV_HANDLE Response received IOMB=%p\n", pMsg1)); 2625 /* process the response message */ 2626 mpiGetDevHandleRsp(agRoot, (agsaGetDevHandleRsp_t *)pMsg1); 2627 break; 2628 } 2629 case OPC_OUB_SPC_DEV_HANDLE_ARRIV: 2630 { 2631 SA_DBG3(("mpiParseOBIomb, SPC_DEV_HANDLE_ARRIV Response received IOMB=%p\n", pMsg1)); 2632 /* process the response message */ 2633 mpiDeviceHandleArrived(agRoot, (agsaDeviceHandleArrivedNotify_t *)pMsg1); 2634 break; 2635 } 2636 case OPC_OUB_DEV_HANDLE_ARRIV: 2637 { 2638 SA_DBG3(("mpiParseOBIomb, DEV_HANDLE_ARRIV Response received IOMB=%p\n", pMsg1)); 2639 /* process the response message */ 2640 mpiDeviceHandleArrived(agRoot, (agsaDeviceHandleArrivedNotify_t *)pMsg1); 2641 break; 2642 } 2643 case OPC_OUB_SSP_RECV_EVENT: 2644 { 2645 SA_DBG3(("mpiParseOBIomb, SSP_RECV_EVENT Response received IOMB=%p\n", pMsg1)); 2646 /* process the response message */ 2647 mpiSSPReqReceivedNotify(agRoot, (agsaSSPReqReceivedNotify_t *)pMsg1); 2648 break; 2649 } 2650 case OPC_OUB_DEV_INFO: 2651 { 2652 SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV"); 2653 SA_DBG3(("mpiParseOBIomb, DEV_INFO Response received IOMB=%p\n", pMsg1)); 2654 /* process the response message */ 2655 mpiGetDevInfoRsp(agRoot, (agsaGetDevInfoRspV_t *)pMsg1); 2656 break; 2657 } 2658 case OPC_OUB_GET_PHY_PROFILE_RSP: 2659 { 2660 SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV"); 2661 SA_DBG2(("mpiParseOBIomb, OPC_OUB_GET_PHY_PROFILE_RSP Response received IOMB=%p\n", pMsg1)); 2662 /* process the response message */ 2663 mpiGetPhyProfileRsp(agRoot, (agsaGetPhyProfileRspV_t *)pMsg1); 2664 break; 2665 } 2666 case OPC_OUB_SET_PHY_PROFILE_RSP: 2667 { 2668 SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV"); 2669 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_PHY_PROFILE_RSP Response received IOMB=%p\n", pMsg1)); 2670 /* process the response message */ 2671 mpiSetPhyProfileRsp(agRoot, (agsaSetPhyProfileRspV_t *)pMsg1); 2672 break; 2673 } 2674 case OPC_OUB_SPC_DEV_INFO: 2675 { 2676 SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC"); 2677 SA_DBG3(("mpiParseOBIomb, DEV_INFO Response received IOMB=%p\n", pMsg1)); 2678 /* process the response message */ 2679 mpiGetDevInfoRspSpc(agRoot, (agsaGetDevInfoRsp_t *)pMsg1); 2680 break; 2681 } 2682 case OPC_OUB_FW_FLASH_UPDATE: 2683 { 2684 SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_FLASH_UPDATE Response received IOMB=%p\n", pMsg1)); 2685 /* process the response message */ 2686 mpiFwFlashUpdateRsp(agRoot, (agsaFwFlashUpdateRsp_t *)pMsg1); 2687 break; 2688 } 2689 case OPC_OUB_FLASH_OP_EXT_RSP: 2690 { 2691 SA_DBG3(("mpiParseOBIomb, OPC_OUB_FLASH_OP_EXT_RSP Response received IOMB=%p\n", pMsg1)); 2692 /* process the response message */ 2693 mpiFwExtFlashUpdateRsp(agRoot, (agsaFwFlashOpExtRsp_t *)pMsg1); 2694 break; 2695 } 2696 #ifdef SPC_ENABLE_PROFILE 2697 case OPC_OUB_FW_PROFILE: 2698 { 2699 SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_PROFILE Response received IOMB=%p\n", pMsg1)); 2700 /* process the response message */ 2701 mpiFwProfileRsp(agRoot, (agsaFwProfileRsp_t *)pMsg1); 2702 break; 2703 } 2704 #endif 2705 case OPC_OUB_SET_NVMD_DATA: 2706 { 2707 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_NVMD_DATA received IOMB=%p\n", pMsg1)); 2708 /* process the response message */ 2709 mpiSetNVMDataRsp(agRoot, (agsaSetNVMDataRsp_t *)pMsg1); 2710 break; 2711 } 2712 case OPC_OUB_GPIO_RESPONSE: 2713 { 2714 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GPIO_RESPONSE Response received IOMB=%p\n", pMsg1)); 2715 /* process the response message */ 2716 mpiGPIORsp(agRoot, (agsaGPIORsp_t *)pMsg1); 2717 break; 2718 } 2719 case OPC_OUB_GPIO_EVENT: 2720 { 2721 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GPIO_RESPONSE Response received IOMB=%p\n", pMsg1)); 2722 /* process the response message */ 2723 mpiGPIOEventRsp(agRoot, (agsaGPIOEvent_t *)pMsg1); 2724 break; 2725 } 2726 case OPC_OUB_GENERAL_EVENT: 2727 { 2728 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GENERAL_EVENT Response received IOMB=%p\n", pMsg1)); 2729 /* process the response message */ 2730 mpiGeneralEventRsp(agRoot, (agsaGeneralEventRsp_t *)pMsg1); 2731 break; 2732 } 2733 case OPC_OUB_SAS_DIAG_MODE_START_END: 2734 { 2735 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_DIAG_MODE_START_END Response received IOMB=%p\n", pMsg1)); 2736 /* process the response message */ 2737 mpiSASDiagStartEndRsp(agRoot, (agsaSASDiagStartEndRsp_t *)pMsg1); 2738 break; 2739 } 2740 case OPC_OUB_SAS_DIAG_EXECUTE: 2741 { 2742 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_DIAG_EXECUTE_RSP Response received IOMB=%p\n", pMsg1)); 2743 /* process the response message */ 2744 mpiSASDiagExecuteRsp(agRoot, (agsaSASDiagExecuteRsp_t *)pMsg1); 2745 break; 2746 } 2747 case OPC_OUB_GET_TIME_STAMP: 2748 { 2749 SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_TIME_STAMP Response received IOMB=%p\n", pMsg1)); 2750 /* process the response message */ 2751 mpiGetTimeStampRsp(agRoot, (agsaGetTimeStampRsp_t *)pMsg1); 2752 break; 2753 } 2754 2755 case OPC_OUB_SPC_SAS_HW_EVENT_ACK: 2756 { 2757 SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC"); 2758 SA_DBG3(("mpiParseOBIomb,OPC_OUB_SPC_SAS_HW_EVENT_ACK Response received IOMB=%p\n", pMsg1)); 2759 /* process the response message */ 2760 mpiSASHwEventAckRsp(agRoot, (agsaSASHwEventAckRsp_t *)pMsg1); 2761 break; 2762 } 2763 2764 case OPC_OUB_SAS_HW_EVENT_ACK: 2765 { 2766 SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV"); 2767 SA_DBG1(("mpiParseOBIomb, OPC_OUB_SAS_HW_EVENT_ACK Response received IOMB=%p\n", pMsg1)); 2768 /* process the response message */ 2769 mpiSASHwEventAckRsp(agRoot, (agsaSASHwEventAckRsp_t *)pMsg1); 2770 break; 2771 } 2772 case OPC_OUB_PORT_CONTROL: 2773 { 2774 SA_DBG1(("mpiParseOBIomb, OPC_OUB_PORT_CONTROL Response received IOMB=%p\n", pMsg1)); 2775 /* process the response message */ 2776 mpiPortControlRsp(agRoot, (agsaPortControlRsp_t *)pMsg1); 2777 break; 2778 } 2779 case OPC_OUB_SMP_ABORT_RSP: 2780 { 2781 #ifdef SALL_API_TEST 2782 saRoot->LLCounters.IOCounter.numSMPAbortedCB++; 2783 SA_DBG3(("mpiParseOBIomb, SMP_ABORT Response received IOMB=%p, %d\n", 2784 pMsg1, saRoot->LLCounters.IOCounter.numSMPAbortedCB)); 2785 #else 2786 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SMP_ABORT_RSP Response received IOMB=%p\n", pMsg1)); 2787 #endif 2788 /* process the response message */ 2789 mpiSMPAbortRsp(agRoot, (agsaSMPAbortRsp_t *)pMsg1); 2790 break; 2791 } 2792 case OPC_OUB_DEVICE_HANDLE_REMOVAL: 2793 { 2794 SA_DBG3(("mpiParseOBIomb, OPC_OUB_DEVICE_HANDLE_REMOVAL received IOMB=%p\n", pMsg1)); 2795 /* process the response message */ 2796 mpiDeviceHandleRemoval(agRoot, (agsaDeviceHandleRemoval_t *)pMsg1); 2797 break; 2798 } 2799 case OPC_OUB_SET_DEVICE_STATE: 2800 { 2801 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_DEVICE_STATE received IOMB=%p\n", pMsg1)); 2802 /* process the response message */ 2803 mpiSetDeviceStateRsp(agRoot, (agsaSetDeviceStateRsp_t *)pMsg1); 2804 break; 2805 } 2806 case OPC_OUB_GET_DEVICE_STATE: 2807 { 2808 SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_DEVICE_STATE received IOMB=%p\n", pMsg1)); 2809 /* process the response message */ 2810 mpiGetDeviceStateRsp(agRoot, (agsaGetDeviceStateRsp_t *)pMsg1); 2811 break; 2812 } 2813 case OPC_OUB_SET_DEV_INFO: 2814 { 2815 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_DEV_INFO received IOMB=%p\n", pMsg1)); 2816 /* process the response message */ 2817 mpiSetDevInfoRsp(agRoot, (agsaSetDeviceInfoRsp_t *)pMsg1); 2818 break; 2819 } 2820 case OPC_OUB_SAS_RE_INITIALIZE: 2821 { 2822 SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC"); 2823 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_RE_INITIALIZE received IOMB=%p\n", pMsg1)); 2824 /* process the response message */ 2825 mpiSasReInitializeRsp(agRoot, (agsaSasReInitializeRsp_t *)pMsg1); 2826 break; 2827 } 2828 2829 case OPC_OUB_SGPIO_RESPONSE: 2830 { 2831 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SGPIO_RESPONSE Response received IOMB=%p\n", pMsg1)); 2832 /* process the response message */ 2833 mpiSGpioRsp(agRoot, (agsaSGpioRsp_t *)pMsg1); 2834 break; 2835 } 2836 2837 case OPC_OUB_PCIE_DIAG_EXECUTE: 2838 { 2839 SA_DBG3(("mpiParseOBIomb, OPC_OUB_PCIE_DIAG_EXECUTE Response received IOMB=%p\n", pMsg1)); 2840 /* process the response message */ 2841 mpiPCIeDiagExecuteRsp(agRoot, (agsaPCIeDiagExecuteRsp_t *)pMsg1); 2842 break; 2843 } 2844 2845 case OPC_OUB_GET_VIST_CAP_RSP: 2846 { 2847 SA_DBG3(("mpiParseOBIomb, OPC_INB_GET_VIST_CAP Response received IOMB=%p\n", pMsg1)); 2848 /* process the response message */ 2849 mpiGetVHistRsp(agRoot, (agsaGetVHistCapRsp_t *)pMsg1); 2850 break; 2851 } 2852 case 2104: 2853 { 2854 if(smIS_SPC6V(agRoot)) 2855 { 2856 SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_DFE_DATA_RSP Response received IOMB=%p\n", pMsg1)); 2857 /* process the response message */ 2858 mpiGetDFEDataRsp(agRoot, (agsaGetDDEFDataRsp_t *)pMsg1); 2859 } 2860 if(smIS_SPC12V(agRoot)) 2861 { 2862 SA_DBG3(("mpiParseOBIomb, OPC_INB_GET_VIST_CAP Response received IOMB=%p\n", pMsg1)); 2863 /* process the response message */ 2864 mpiGetVHistRsp(agRoot, (agsaGetVHistCapRsp_t *)pMsg1); 2865 } 2866 else 2867 { 2868 SA_DBG1(("mpiParseOBIomb, 2104 Response received IOMB=%p\n", pMsg1)); 2869 /* process the response message */ 2870 } 2871 break; 2872 } 2873 case OPC_OUB_SET_CONTROLLER_CONFIG: 2874 { 2875 SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_CONTROLLER_CONFIG Response received IOMB=%p\n", pMsg1)); 2876 mpiSetControllerConfigRsp(agRoot, (agsaSetControllerConfigRsp_t *)pMsg1); 2877 break; 2878 } 2879 case OPC_OUB_GET_CONTROLLER_CONFIG: 2880 { 2881 SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_CONTROLLER_CONFIG Response received IOMB=%p\n", pMsg1)); 2882 mpiGetControllerConfigRsp(agRoot, (agsaGetControllerConfigRsp_t *)pMsg1); 2883 break; 2884 } 2885 case OPC_OUB_KEK_MANAGEMENT: 2886 { 2887 SA_DBG3(("mpiParseOBIomb, OPC_OUB_KEK_MANAGEMENT Response received IOMB=%p\n", pMsg1)); 2888 mpiKekManagementRsp(agRoot, (agsaKekManagementRsp_t *)pMsg1); 2889 break; 2890 } 2891 case OPC_OUB_DEK_MANAGEMENT: 2892 { 2893 SA_DBG3(("mpiParseOBIomb, OPC_OUB_DEK_MANAGEMENT Response received IOMB=%p\n", pMsg1)); 2894 mpiDekManagementRsp(agRoot, (agsaDekManagementRsp_t *)pMsg1); 2895 break; 2896 } 2897 case OPC_OUB_OPR_MGMT: 2898 { 2899 SA_DBG1(("mpiParseOBIomb, OPC_OUB_OPR_MGMT Response received IOMB=%p\n", pMsg1)); 2900 mpiOperatorManagementRsp(agRoot, (agsaOperatorMangmenRsp_t *)pMsg1); 2901 break; 2902 } 2903 case OPC_OUB_ENC_TEST_EXECUTE: 2904 { 2905 SA_DBG1(("mpiParseOBIomb, OPC_OUB_ENC_TEST_EXECUTE Response received IOMB=%p\n", pMsg1)); 2906 mpiBistRsp(agRoot, (agsaEncryptBistRsp_t *)pMsg1); 2907 break; 2908 } 2909 case OPC_OUB_SET_OPERATOR: 2910 { 2911 SA_DBG1(("mpiParseOBIomb, OPC_OUB_SET_OPERATOR Response received IOMB=%p\n", pMsg1)); 2912 mpiSetOperatorRsp(agRoot, (agsaSetOperatorRsp_t *)pMsg1); 2913 break; 2914 } 2915 case OPC_OUB_GET_OPERATOR: 2916 { 2917 SA_DBG1(("mpiParseOBIomb, OPC_OUB_GET_OPERATOR Response received IOMB=%p\n", pMsg1)); 2918 mpiGetOperatorRsp(agRoot, (agsaGetOperatorRsp_t *)pMsg1); 2919 break; 2920 } 2921 case OPC_OUB_DIF_ENC_OFFLOAD_RSP: 2922 { 2923 SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV"); 2924 SA_DBG1(("mpiParseOBIomb, OPC_OUB_DIF_ENC_OFFLOAD_RSP Response received IOMB=%p\n", pMsg1)); 2925 /* process the response message */ 2926 mpiDifEncOffloadRsp(agRoot, (agsaDifEncOffloadRspV_t *)pMsg1); 2927 break; 2928 } 2929 default: 2930 { 2931 #ifdef SALL_API_TEST 2932 saRoot->LLCounters.IOCounter.numUNKNWRespIOMB++; 2933 SA_DBG1(("mpiParseOBIomb, UnKnown Response received IOMB=%p, %d\n", 2934 pMsg1, saRoot->LLCounters.IOCounter.numUNKNWRespIOMB)); 2935 #else 2936 SA_DBG1(("mpiParseOBIomb, Unknown IOMB Response received opcode 0x%X IOMB=%p\n",opcode, pMsg1)); 2937 #endif 2938 break; 2939 } 2940 } /* switch */ 2941 2942 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2f"); 2943 2944 return ret; 2945 2946 } 2947 2948 2949 /******************************************************************************/ 2950 /*! \brief SPC MPI SATA Completion 2951 * 2952 * This function handles the SATA completion. 2953 * 2954 * \param agRoot Handles for this instance of SAS/SATA LLL 2955 * \param pIomb1 Pointer of Message1 2956 * \param bc buffer count 2957 * 2958 * \return The read value 2959 * 2960 */ 2961 /*******************************************************************************/ 2962 GLOBAL FORCEINLINE 2963 bit32 mpiSATACompletion( 2964 agsaRoot_t *agRoot, 2965 bit32 *pIomb1 2966 ) 2967 { 2968 bit32 ret = AGSA_RC_SUCCESS; 2969 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 2970 bit32 status; 2971 bit32 tag; 2972 bit32 param; 2973 agsaIORequestDesc_t *pRequest; 2974 bit32 *agFirstDword; 2975 bit32 *pResp; 2976 2977 smTraceFuncEnter(hpDBG_VERY_LOUD,"2s"); 2978 2979 OSSA_READ_LE_32(AGROOT, &tag, pIomb1, OSSA_OFFSET_OF(agsaSATACompletionRsp_t, tag)) ; 2980 OSSA_READ_LE_32(AGROOT, &status, pIomb1, OSSA_OFFSET_OF(agsaSATACompletionRsp_t, status)) ; 2981 OSSA_READ_LE_32(AGROOT, ¶m, pIomb1, OSSA_OFFSET_OF(agsaSATACompletionRsp_t, param)) ; 2982 2983 SA_DBG3(("mpiSATACompletion: start, HTAG=0x%x\n", tag)); 2984 2985 /* get IOrequest from IOMap */ 2986 pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest; 2987 SA_ASSERT((pRequest), "pRequest"); 2988 2989 if(agNULL == pRequest) 2990 { 2991 SA_DBG1(("mpiSATACompletion: agNULL == pRequest tag 0x%X status 0x%X\n",tag, status )); 2992 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2s"); 2993 return AGSA_RC_FAILURE; 2994 } 2995 2996 SA_ASSERT((pRequest->valid), "pRequest->valid"); 2997 if(!pRequest->valid) 2998 { 2999 SA_DBG1(("mpiSATACompletion: not valid IOMB tag=0x%x status=0x%x param=0x%x Device =0x%x\n", tag, status, param, 3000 pRequest->pDevice ? pRequest->pDevice->DeviceMapIndex : -1)); 3001 } 3002 3003 switch (status) 3004 { 3005 case OSSA_IO_SUCCESS: 3006 { 3007 SA_DBG3(("mpiSATACompletion: OSSA_IO_SUCCESS, param=0x%x\n", param)); 3008 if (!param) 3009 { 3010 /* SATA request completion */ 3011 siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, 0); 3012 } 3013 else 3014 { 3015 /* param number bytes of SATA Rsp */ 3016 agFirstDword = &pIomb1[3]; 3017 pResp = &pIomb1[4]; 3018 3019 /* CB function to the up layer */ 3020 /* Response Length not include firstDW */ 3021 saRoot->IoErrorCount.agOSSA_IO_COMPLETED_ERROR_SCSI_STATUS++; 3022 SA_DBG2(("mpiSATACompletion: param 0x%x agFirstDwordResp 0x%x Resp 0x%x tag 0x%x\n",param,*agFirstDword,*pResp ,tag)); 3023 siEventSATAResponseWtDataRcvd(agRoot, pRequest, agFirstDword, pResp, (param - 4)); 3024 } 3025 3026 break; 3027 } 3028 case OSSA_IO_ABORTED: 3029 { 3030 SA_DBG2(("mpiSATACompletion: OSSA_IO_ABORTED tag 0x%X\n", tag)); 3031 saRoot->IoErrorCount.agOSSA_IO_ABORTED++; 3032 siAbnormal(agRoot, pRequest, status, param, 0); 3033 break; 3034 } 3035 case OSSA_IO_UNDERFLOW: 3036 { 3037 /* SATA Completion with error */ 3038 SA_DBG1(("mpiSATACompletion, OSSA_IO_UNDERFLOW tag 0x%X\n", tag)); 3039 /*underflow means underrun, treat it as success*/ 3040 saRoot->IoErrorCount.agOSSA_IO_UNDERFLOW++; 3041 siAbnormal(agRoot, pRequest, status, param, 0); 3042 break; 3043 } 3044 case OSSA_IO_NO_DEVICE: 3045 { 3046 SA_DBG1(("mpiSATACompletion, OSSA_IO_NO_DEVICE tag 0x%X\n", tag)); 3047 saRoot->IoErrorCount.agOSSA_IO_NO_DEVICE++; 3048 siAbnormal(agRoot, pRequest, status, 0, 0); 3049 break; 3050 } 3051 case OSSA_IO_XFER_ERROR_BREAK: 3052 { 3053 SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_ERROR_BREAK SPC tag 0x%X\n", tag)); 3054 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_BREAK++; 3055 siAbnormal(agRoot, pRequest, status, 0, 0); 3056 break; 3057 } 3058 case OSSA_IO_XFER_ERROR_PHY_NOT_READY: 3059 { 3060 SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_ERROR_PHY_NOT_READY tag 0x%X\n", tag)); 3061 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++; 3062 siAbnormal(agRoot, pRequest, status, 0, 0); 3063 break; 3064 } 3065 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: 3066 { 3067 SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED tag 0x%X\n", tag)); 3068 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++; 3069 siAbnormal(agRoot, pRequest, status, 0, 0); 3070 break; 3071 } 3072 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: 3073 { 3074 SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION tag 0x%X\n", tag)); 3075 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++; 3076 siAbnormal(agRoot, pRequest, status, 0, 0); 3077 break; 3078 } 3079 case OSSA_IO_OPEN_CNX_ERROR_BREAK: 3080 { 3081 SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_BREAK SPC tag 0x%X\n", tag)); 3082 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++; 3083 siAbnormal(agRoot, pRequest, status, 0, 0); 3084 break; 3085 } 3086 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: 3087 { 3088 SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS tag 0x%X\n", tag)); 3089 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++; 3090 siAbnormal(agRoot, pRequest, status, 0, 0); 3091 break; 3092 } 3093 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: 3094 { 3095 SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION tag 0x%X\n", tag)); 3096 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++; 3097 siAbnormal(agRoot, pRequest, status, 0, 0); 3098 break; 3099 } 3100 case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: 3101 { 3102 SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED tag 0x%X\n", tag)); 3103 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++; 3104 siAbnormal(agRoot, pRequest, status, 0, 0); 3105 break; 3106 } 3107 case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY: 3108 { 3109 SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY tag 0x%X\n", tag)); 3110 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY++; 3111 siAbnormal(agRoot, pRequest, status, 0, 0); 3112 break; 3113 } 3114 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: 3115 { 3116 SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION tag 0x%X\n", tag)); 3117 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++; 3118 siAbnormal(agRoot, pRequest, status, 0, 0); 3119 break; 3120 } 3121 case OSSA_IO_XFER_ERROR_NAK_RECEIVED: 3122 { 3123 SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_ERROR_NAK_RECEIVED tag 0x%X\n", tag)); 3124 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_NAK_RECEIVED++; 3125 siAbnormal(agRoot, pRequest, status, 0, 0); 3126 break; 3127 } 3128 case OSSA_IO_XFER_ERROR_DMA: 3129 { 3130 SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_ERROR_DMA tag 0x%X\n", tag)); 3131 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_DMA++; 3132 siAbnormal(agRoot, pRequest, status, 0, 0); 3133 break; 3134 } 3135 case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: 3136 { 3137 SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT tag 0x%X\n", tag)); 3138 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT++; 3139 siAbnormal(agRoot, pRequest, status, 0, 0); 3140 break; 3141 } 3142 case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: 3143 { 3144 SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE tag 0x%X\n", tag)); 3145 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE++; 3146 siAbnormal(agRoot, pRequest, status, 0, 0); 3147 break; 3148 } 3149 case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT: 3150 { 3151 SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_OPEN_RETRY_TIMEOUT tag 0x%X\n", tag)); 3152 saRoot->IoErrorCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++; 3153 siAbnormal(agRoot, pRequest, status, 0, 0); 3154 break; 3155 } 3156 case OSSA_IO_PORT_IN_RESET: 3157 { 3158 SA_DBG1(("mpiSATACompletion: OSSA_IO_PORT_IN_RESET tag 0x%X\n", tag)); 3159 saRoot->IoErrorCount.agOSSA_IO_PORT_IN_RESET++; 3160 siAbnormal(agRoot, pRequest, status, 0, 0); 3161 break; 3162 } 3163 case OSSA_IO_DS_NON_OPERATIONAL: 3164 { 3165 SA_DBG1(("mpiSATACompletion: OSSA_IO_DS_NON_OPERATIONAL tag 0x%X\n", tag)); 3166 saRoot->IoErrorCount.agOSSA_IO_DS_NON_OPERATIONAL++; 3167 siAbnormal(agRoot, pRequest, status, 0, 0); 3168 break; 3169 } 3170 case OSSA_IO_DS_IN_RECOVERY: 3171 { 3172 SA_DBG1(("mpiSATACompletion: OSSA_IO_DS_IN_RECOVERY tag 0x%X\n", tag)); 3173 saRoot->IoErrorCount.agOSSA_IO_DS_IN_RECOVERY++; 3174 siAbnormal(agRoot, pRequest, status, 0, 0); 3175 break; 3176 } 3177 case OSSA_IO_DS_IN_ERROR: 3178 { 3179 SA_DBG1(("mpiSATACompletion: OSSA_IO_DS_IN_ERROR tag 0x%X\n", tag)); 3180 saRoot->IoErrorCount.agOSSA_IO_DS_IN_ERROR++; 3181 siAbnormal(agRoot, pRequest, status, 0, 0); 3182 break; 3183 } 3184 3185 case OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY: 3186 { 3187 SA_DBG1(("mpiSATACompletion: OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY tag 0x%X\n", tag)); 3188 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY++; 3189 siAbnormal(agRoot, pRequest, status, 0, 0); 3190 break; 3191 } 3192 case OSSA_IO_ABORT_IN_PROGRESS: 3193 { 3194 SA_DBG1(("mpiSATACompletion: OSSA_IO_ABORT_IN_PROGRESS tag 0x%X\n", tag)); 3195 saRoot->IoErrorCount.agOSSA_IO_ABORT_IN_PROGRESS++; 3196 siAbnormal(agRoot, pRequest, status, 0, 0); 3197 break; 3198 } 3199 case OSSA_IO_ABORT_DELAYED: 3200 { 3201 SA_DBG1(("mpiSATACompletion: OSSA_IO_ABORT_DELAYED tag 0x%X\n", tag)); 3202 saRoot->IoErrorCount.agOSSA_IO_ABORT_DELAYED++; 3203 siAbnormal(agRoot, pRequest, status, 0, 0); 3204 break; 3205 } 3206 case OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY_ALT: 3207 { 3208 SA_DBG1(("mpiSATACompletion: OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY_ALT tag 0x%X\n", tag)); 3209 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY_ALT++; 3210 siAbnormal(agRoot, pRequest, status, 0, 0); 3211 break; 3212 } 3213 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED: 3214 { 3215 SA_DBG1(("mpiSATACompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x\n", tag)); 3216 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++; 3217 siAbnormal(agRoot, pRequest, status, 0, 0); 3218 break; 3219 } 3220 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO: 3221 { 3222 SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO tag 0x%x\n", tag)); 3223 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO++; 3224 siAbnormal(agRoot, pRequest, status, 0, 0 ); 3225 break; 3226 } 3227 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST: 3228 { 3229 SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST tag 0x%x\n", tag)); 3230 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++; 3231 siAbnormal(agRoot, pRequest, status, 0, 0 ); 3232 break; 3233 } 3234 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE: 3235 { 3236 SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE tag 0x%x\n", tag)); 3237 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE++; 3238 siAbnormal(agRoot, pRequest, status, 0, 0 ); 3239 break; 3240 } 3241 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED: 3242 { 3243 SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED tag 0x%x\n", tag)); 3244 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++; 3245 siAbnormal(agRoot, pRequest, status, 0, 0 ); 3246 break; 3247 } 3248 case OSSA_IO_DS_INVALID: 3249 { 3250 SA_DBG1(("mpiSATACompletion: OSSA_IO_DS_INVALID tag 0x%X\n", tag)); 3251 saRoot->IoErrorCount.agOSSA_IO_DS_INVALID++; 3252 siAbnormal(agRoot, pRequest, status, 0, 0); 3253 break; 3254 } 3255 case OSSA_IO_XFER_ERR_LAST_PIO_DATAIN_CRC_ERR: 3256 { 3257 SA_DBG1(("mpiSATACompletion: OSSA_IO_XFER_ERR_LAST_PIO_DATAIN_CRC_ERR tag 0x%X\n", tag)); 3258 saRoot->IoErrorCount.agOSSA_IO_XFER_ERR_LAST_PIO_DATAIN_CRC_ERR++; 3259 siAbnormal(agRoot, pRequest, status, 0, 0); 3260 break; 3261 } 3262 case OSSA_MPI_IO_RQE_BUSY_FULL: 3263 { 3264 SA_DBG1(("mpiSATACompletion: OSSA_MPI_IO_RQE_BUSY_FULL tag 0x%X\n", tag)); 3265 saRoot->IoErrorCount.agOSSA_MPI_IO_RQE_BUSY_FULL++; 3266 siAbnormal(agRoot, pRequest, status, 0, 0); 3267 break; 3268 } 3269 #ifdef REMOVED 3270 case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN: 3271 { 3272 SA_DBG1(("mpiSATACompletion: OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN tag 0x%x\n", tag)); 3273 saRoot->IoErrorCount.agOSSA_IO_XFER_ERR_EOB_DATA_OVERRUN++; 3274 siAbnormal(agRoot, pRequest, status, 0, 0); 3275 break; 3276 } 3277 #endif 3278 case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE: 3279 { 3280 SA_DBG1(("mpiSATACompletion: OPC_OUB_SATA_COMP:OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE \n")); 3281 saRoot->IoErrorCount.agOSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE++; 3282 siAbnormal(agRoot, pRequest, status, 0, 0); 3283 break; 3284 } 3285 case OSSA_MPI_ERR_ATAPI_DEVICE_BUSY: 3286 { 3287 SA_DBG1(("mpiSATACompletion: OSSA_MPI_ERR_ATAPI_DEVICE_BUSY tag 0x%X\n", tag)); 3288 saRoot->IoErrorCount.agOSSA_MPI_ERR_ATAPI_DEVICE_BUSY++; 3289 siAbnormal(agRoot, pRequest, status, param, 0 ); 3290 break; 3291 } 3292 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: 3293 { 3294 SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS tag 0x%X\n", tag)); 3295 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS++; 3296 siAbnormal(agRoot, pRequest, status, 0, 0); 3297 break; 3298 } 3299 case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID: 3300 { 3301 SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID tag 0x%X\n", tag)); 3302 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS++; 3303 siAbnormal(agRoot, pRequest, status, 0, 0); 3304 break; 3305 } 3306 case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH: 3307 { 3308 SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH tag 0x%X\n", tag)); 3309 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_IV_MISMATCH++; 3310 siAbnormal(agRoot, pRequest, status, 0, 0); 3311 break; 3312 } 3313 case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR: 3314 { 3315 SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR tag 0x%X\n", tag)); 3316 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR++; 3317 siAbnormal(agRoot, pRequest, status, 0, 0); 3318 break; 3319 } 3320 case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED: 3321 { 3322 SA_DBG1(("mpiSATACompletion: OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED tag 0x%X\n", tag)); 3323 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED++; 3324 siAbnormal(agRoot, pRequest, status, 0, 0); 3325 break; 3326 } 3327 3328 case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH: 3329 { 3330 SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH tag 0x%X\n", tag)); 3331 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH++; 3332 siAbnormal(agRoot, pRequest, status, 0, 0); 3333 break; 3334 } 3335 case OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS: 3336 { 3337 SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS tag 0x%X\n", tag)); 3338 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS++; 3339 siAbnormal(agRoot, pRequest, status, 0, 0); 3340 break; 3341 } 3342 case OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE: 3343 { 3344 SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE tag 0x%X\n", tag)); 3345 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS++; 3346 siAbnormal(agRoot, pRequest, status, 0, 0); 3347 break; 3348 } 3349 3350 default: 3351 { 3352 SA_DBG1(("mpiSATACompletion: Unknown status 0x%x tag 0x%x\n", status, tag)); 3353 saRoot->IoErrorCount.agOSSA_IO_UNKNOWN_ERROR++; 3354 siAbnormal(agRoot, pRequest, status, param, 0); 3355 break; 3356 } 3357 } 3358 3359 /* The HTag should equal to the IOMB tag */ 3360 if (pRequest->HTag != tag) 3361 { 3362 SA_DBG1(("mpiSATACompletion: Error Htag %d not equal IOMBtag %d\n", pRequest->HTag, tag)); 3363 } 3364 3365 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2s"); 3366 return ret; 3367 } 3368 3369 /******************************************************************************/ 3370 /*! \brief SPC MPI SSP Completion 3371 * 3372 * This function handles the SSP completion. 3373 * 3374 * \param agRoot Handles for this instance of SAS/SATA LLL 3375 * \param pIomb1 Pointer of Message1 3376 * \param bc buffer count 3377 * 3378 * \return The read value 3379 * 3380 */ 3381 /*******************************************************************************/ 3382 GLOBAL FORCEINLINE 3383 bit32 mpiSSPCompletion( 3384 agsaRoot_t *agRoot, 3385 bit32 *pIomb1 3386 ) 3387 { 3388 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 3389 agsaSSPCompletionRsp_t *pIomb = (agsaSSPCompletionRsp_t *)pIomb1; 3390 agsaIORequestDesc_t *pRequest = agNULL; 3391 agsaSSPResponseInfoUnit_t *pRespIU = agNULL; 3392 bit32 tag = 0; 3393 bit32 sspTag = 0; 3394 bit32 status, param = 0; 3395 bit32 ret = AGSA_RC_SUCCESS; 3396 3397 smTraceFuncEnter(hpDBG_VERY_LOUD, "5A"); 3398 3399 /* get Tag */ 3400 OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionRsp_t, tag)); 3401 OSSA_READ_LE_32(agRoot, &status, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionRsp_t, status)); 3402 OSSA_READ_LE_32(agRoot, ¶m, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionRsp_t, param)); 3403 OSSA_READ_LE_32(agRoot, &sspTag, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionRsp_t, SSPTag)); 3404 /* get SSP_START IOrequest from IOMap */ 3405 pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest; 3406 SA_ASSERT((pRequest), "pRequest"); 3407 3408 if(pRequest == agNULL) 3409 { 3410 SA_DBG1(("mpiSSPCompletion,AGSA_RC_FAILURE SSP Resp IOMB tag=0x%x, status=0x%x, param=0x%x, SSPTag=0x%x\n", tag, status, param, sspTag)); 3411 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5A"); 3412 return(AGSA_RC_FAILURE); 3413 } 3414 SA_ASSERT((pRequest->valid), "pRequest->valid"); 3415 3416 if(!pRequest->valid) 3417 { 3418 SA_DBG1(("mpiSSPCompletion, SSP Resp IOMB tag=0x%x, status=0x%x, param=0x%x, SSPTag=0x%x Device =0x%x\n", tag, status, param, sspTag, 3419 pRequest->pDevice ? pRequest->pDevice->DeviceMapIndex : -1)); 3420 } 3421 3422 switch (status) 3423 { 3424 case OSSA_IO_SUCCESS: 3425 { 3426 if (!param) 3427 { 3428 /* Completion of SSP without Response Data */ 3429 siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, sspTag); 3430 } 3431 else 3432 { 3433 /* Get SSP Response with Response Data */ 3434 pRespIU = (agsaSSPResponseInfoUnit_t *)&(pIomb->SSPrsp); 3435 if (pRespIU->status == 0x02 || pRespIU->status == 0x18 || 3436 pRespIU->status == 0x30 || pRespIU->status == 0x40 ) 3437 { 3438 /* SCSI status is CHECK_CONDITION, RESV_CONFLICT, ACA_ACTIVE, TASK_ABORTED */ 3439 saRoot->IoErrorCount.agOSSA_IO_COMPLETED_ERROR_SCSI_STATUS++; 3440 SA_DBG2(("mpiSSPCompletion: pRespIU->status 0x%x tag 0x%x\n", pRespIU->status,tag)); 3441 } 3442 siEventSSPResponseWtDataRcvd(agRoot, pRequest, pRespIU, param, sspTag); 3443 } 3444 3445 break; 3446 } 3447 3448 case OSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME: 3449 { 3450 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3451 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME++; 3452 /* Get SSP Response with Response Data */ 3453 pRespIU = (agsaSSPResponseInfoUnit_t *)&(pIomb->SSPrsp); 3454 if (pRespIU->status == 0x02 || pRespIU->status == 0x18 || 3455 pRespIU->status == 0x30 || pRespIU->status == 0x40 ) 3456 { 3457 /* SCSI status is CHECK_CONDITION, RESV_CONFLICT, ACA_ACTIVE, TASK_ABORTED */ 3458 saRoot->IoErrorCount.agOSSA_IO_COMPLETED_ERROR_SCSI_STATUS++; 3459 SA_DBG2(("mpiSSPCompletion: pRespIU->status 0x%x tag 0x%x\n", pRespIU->status,tag)); 3460 } 3461 siEventSSPResponseWtDataRcvd(agRoot, pRequest, pRespIU, param, sspTag); 3462 3463 break; 3464 } 3465 3466 case OSSA_IO_ABORTED: 3467 { 3468 #ifdef SALL_API_TEST 3469 saRoot->LLCounters.IOCounter.numSSPAborted++; 3470 SA_DBG3(("mpiSSPCompletion, OSSA_IO_ABORTED Response received IOMB=%p %d\n", 3471 pIomb1, saRoot->LLCounters.IOCounter.numSSPAborted)); 3472 #endif 3473 SA_DBG2(("mpiSSPCompletion, OSSA_IO_ABORTED IOMB tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3474 saRoot->IoErrorCount.agOSSA_IO_ABORTED++; 3475 /* SSP Abort CB */ 3476 siAbnormal(agRoot, pRequest, status, param, sspTag); 3477 break; 3478 } 3479 case OSSA_IO_UNDERFLOW: 3480 { 3481 /* SSP Completion with error */ 3482 SA_DBG2(("mpiSSPCompletion, OSSA_IO_UNDERFLOW tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3483 /*saRoot->IoErrorCount.agOSSA_IO_UNDERFLOW++;*/ 3484 siAbnormal(agRoot, pRequest, status, param, sspTag); 3485 break; 3486 } 3487 case OSSA_IO_NO_DEVICE: 3488 { 3489 SA_DBG1(("mpiSSPCompletion: OSSA_IO_NO_DEVICE tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3490 saRoot->IoErrorCount.agOSSA_IO_NO_DEVICE++; 3491 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3492 break; 3493 } 3494 case OSSA_IO_XFER_ERROR_BREAK: 3495 { 3496 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_BREAK tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3497 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_BREAK++; 3498 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3499 break; 3500 } 3501 case OSSA_IO_XFER_ERROR_PHY_NOT_READY: 3502 { 3503 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_PHY_NOT_READY tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3504 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++; 3505 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3506 break; 3507 } 3508 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: 3509 { 3510 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3511 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++; 3512 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3513 break; 3514 } 3515 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: 3516 { 3517 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++; 3518 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3519 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3520 break; 3521 } 3522 case OSSA_IO_OPEN_CNX_ERROR_BREAK: 3523 { 3524 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_BREAK tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3525 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++; 3526 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3527 break; 3528 } 3529 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: 3530 { 3531 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3532 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++; 3533 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3534 break; 3535 } 3536 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: 3537 { 3538 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3539 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++; 3540 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3541 break; 3542 } 3543 case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: 3544 { 3545 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3546 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++; 3547 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3548 break; 3549 } 3550 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: 3551 { 3552 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3553 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++; 3554 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3555 break; 3556 } 3557 case OSSA_IO_XFER_ERROR_NAK_RECEIVED: 3558 { 3559 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_NAK_RECEIVED tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3560 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_NAK_RECEIVED++; 3561 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3562 break; 3563 } 3564 case OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT: 3565 { 3566 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3567 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT++; 3568 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3569 break; 3570 } 3571 case OSSA_IO_XFER_ERROR_DMA: 3572 { 3573 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_DMA tag 0x%x ssptag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3574 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_DMA++; 3575 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3576 break; 3577 } 3578 case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT: 3579 { 3580 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3581 saRoot->IoErrorCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++; 3582 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3583 break; 3584 } 3585 case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE: 3586 { 3587 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3588 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_UNEXPECTED_PHASE++; 3589 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3590 break; 3591 } 3592 case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH: 3593 { 3594 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3595 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_OFFSET_MISMATCH++; 3596 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3597 break; 3598 } 3599 case OSSA_IO_PORT_IN_RESET: 3600 { 3601 SA_DBG1(("mpiSSPCompletion: OSSA_IO_PORT_IN_RESET tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3602 saRoot->IoErrorCount.agOSSA_IO_PORT_IN_RESET++; 3603 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3604 break; 3605 } 3606 case OSSA_IO_DS_NON_OPERATIONAL: 3607 { 3608 SA_DBG1(("mpiSSPCompletion: OSSA_IO_DS_NON_OPERATIONAL tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3609 saRoot->IoErrorCount.agOSSA_IO_DS_NON_OPERATIONAL++; 3610 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3611 break; 3612 } 3613 case OSSA_IO_DS_IN_RECOVERY: 3614 { 3615 SA_DBG1(("mpiSSPCompletion: OSSA_IO_DS_IN_RECOVERY tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3616 saRoot->IoErrorCount.agOSSA_IO_DS_IN_RECOVERY++; 3617 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3618 break; 3619 } 3620 case OSSA_IO_TM_TAG_NOT_FOUND: 3621 { 3622 SA_DBG1(("mpiSSPCompletion: OSSA_IO_TM_TAG_NOT_FOUND tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3623 saRoot->IoErrorCount.agOSSA_IO_TM_TAG_NOT_FOUND++; 3624 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3625 break; 3626 } 3627 case OSSA_IO_XFER_PIO_SETUP_ERROR: 3628 { 3629 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_PIO_SETUP_ERROR tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3630 saRoot->IoErrorCount.agOSSA_IO_XFER_PIO_SETUP_ERROR++; 3631 /* not allowed case. Therefore, return failed status */ 3632 siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag); 3633 break; 3634 } 3635 case OSSA_IO_SSP_EXT_IU_ZERO_LEN_ERROR: 3636 { 3637 SA_DBG1(("mpiSSPCompletion: OSSA_IO_SSP_IU_ZERO_LEN_ERROR tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3638 saRoot->IoErrorCount.agOSSA_IO_SSP_EXT_IU_ZERO_LEN_ERROR++; 3639 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3640 break; 3641 } 3642 case OSSA_IO_DS_IN_ERROR: 3643 { 3644 SA_DBG1(("mpiSSPCompletion: OSSA_IO_DS_IN_ERROR tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3645 saRoot->IoErrorCount.agOSSA_IO_DS_IN_ERROR++; 3646 /* not allowed case. Therefore, return failed status */ 3647 siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag); 3648 break; 3649 } 3650 case OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY: 3651 { 3652 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3653 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY++; 3654 /* not allowed case. Therefore, return failed status */ 3655 siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag); 3656 break; 3657 } 3658 case OSSA_IO_ABORT_IN_PROGRESS: 3659 { 3660 SA_DBG1(("mpiSSPCompletion: OSSA_IO_ABORT_IN_PROGRESS tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3661 saRoot->IoErrorCount.agOSSA_IO_ABORT_IN_PROGRESS++; 3662 /* not allowed case. Therefore, return failed status */ 3663 siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag); 3664 break; 3665 } 3666 case OSSA_IO_ABORT_DELAYED: 3667 { 3668 SA_DBG1(("mpiSSPCompletion: OSSA_IO_ABORT_DELAYED tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3669 saRoot->IoErrorCount.agOSSA_IO_ABORT_DELAYED++; 3670 /* not allowed case. Therefore, return failed status */ 3671 siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag); 3672 break; 3673 } 3674 case OSSA_IO_INVALID_LENGTH: 3675 { 3676 SA_DBG1(("mpiSSPCompletion: OSSA_IO_INVALID_LENGTH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3677 saRoot->IoErrorCount.agOSSA_IO_INVALID_LENGTH++; 3678 /* not allowed case. Therefore, return failed status */ 3679 siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag); 3680 break; 3681 } 3682 case OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY_ALT: 3683 { 3684 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY_ALT tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3685 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY_ALT++; 3686 /* not allowed case. Therefore, return failed status */ 3687 siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag); 3688 break; 3689 } 3690 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED: 3691 { 3692 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x ssptag = 0x%x\n", tag, sspTag)); 3693 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++; 3694 siAbnormal(agRoot, pRequest, status, 0, sspTag); 3695 break; 3696 } 3697 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO: 3698 { 3699 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3700 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO++; 3701 siAbnormal(agRoot, pRequest, status, param, sspTag); 3702 break; 3703 } 3704 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST: 3705 { 3706 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3707 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++; 3708 siAbnormal(agRoot, pRequest, status, param, sspTag); 3709 break; 3710 } 3711 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE: 3712 { 3713 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3714 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE++; 3715 siAbnormal(agRoot, pRequest, status, param, sspTag); 3716 break; 3717 } 3718 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED: 3719 { 3720 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3721 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++; 3722 siAbnormal(agRoot, pRequest, status, param, sspTag); 3723 break; 3724 } 3725 case OSSA_IO_DS_INVALID: 3726 { 3727 SA_DBG1(("mpiSSPCompletion: OSSA_IO_DS_INVALID tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3728 saRoot->IoErrorCount.agOSSA_IO_DS_INVALID++; 3729 siAbnormal(agRoot, pRequest, status, param, sspTag); 3730 break; 3731 } 3732 case OSSA_MPI_IO_RQE_BUSY_FULL: 3733 { 3734 SA_DBG1(("mpiSSPCompletion: OSSA_MPI_IO_RQE_BUSY_FULL tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3735 saRoot->IoErrorCount.agOSSA_MPI_IO_RQE_BUSY_FULL++; 3736 siAbnormal(agRoot, pRequest, status, param, sspTag); 3737 break; 3738 } 3739 case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE: 3740 { 3741 SA_DBG1(("mpiSSPCompletion: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3742 saRoot->IoErrorCount.agOSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE++; 3743 siAbnormal(agRoot, pRequest, status, param, sspTag); 3744 break; 3745 } 3746 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: 3747 { 3748 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3749 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS++; 3750 siAbnormal(agRoot, pRequest, status, param, sspTag); 3751 break; 3752 } 3753 case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH: 3754 { 3755 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3756 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH++; 3757 siAbnormal(agRoot, pRequest, status, param, sspTag); 3758 break; 3759 } 3760 case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID: 3761 { 3762 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3763 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID++; 3764 siAbnormal(agRoot, pRequest, status, param, sspTag); 3765 break; 3766 } 3767 case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH: 3768 { 3769 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3770 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_IV_MISMATCH++; 3771 siAbnormal(agRoot, pRequest, status, param, sspTag); 3772 break; 3773 } 3774 case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR: 3775 { 3776 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3777 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR++; 3778 siAbnormal(agRoot, pRequest, status, param, sspTag); 3779 break; 3780 } 3781 case OSSA_IO_XFR_ERROR_INTERNAL_RAM: 3782 { 3783 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_INTERNAL_RAM tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3784 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_INTERNAL_RAM++; 3785 siAbnormal(agRoot, pRequest, status, param, sspTag); 3786 break; 3787 } 3788 case OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS: 3789 { 3790 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3791 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS++; 3792 siAbnormal(agRoot, pRequest, status, param, sspTag); 3793 break; 3794 } 3795 case OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE: 3796 { 3797 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3798 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE++; 3799 siAbnormal(agRoot, pRequest, status, param, sspTag); 3800 break; 3801 } 3802 #ifdef SA_TESTBASE_EXTRA 3803 /* TestBase */ 3804 case OSSA_IO_HOST_BST_INVALID: 3805 { 3806 SA_DBG1(("mpiParseOBIomb, OPC_OUB_SSP_COMP: OSSA_IO_HOST_BST_INVALID 0x%x\n", status)); 3807 siAbnormal(agRoot, pRequest, status, param, sspTag); 3808 break; 3809 } 3810 #endif /* SA_TESTBASE_EXTRA */ 3811 case OSSA_IO_XFR_ERROR_DIF_MISMATCH: 3812 { 3813 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DIF_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3814 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DIF_MISMATCH++; 3815 siDifAbnormal(agRoot, pRequest, status, param, sspTag, pIomb1); 3816 break; 3817 } 3818 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: 3819 { 3820 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3821 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH++; 3822 siDifAbnormal(agRoot, pRequest, status, param, sspTag, pIomb1); 3823 break; 3824 } 3825 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: 3826 { 3827 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3828 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH++; 3829 siDifAbnormal(agRoot, pRequest, status, param, sspTag, pIomb1); 3830 break; 3831 } 3832 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH: 3833 { 3834 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3835 saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH++; 3836 siDifAbnormal(agRoot, pRequest, status, param, sspTag, pIomb1); 3837 break; 3838 } 3839 case OSSA_IO_XFER_ERROR_DIF_INTERNAL_ERROR: 3840 { 3841 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_DIF_INTERNAL_ERROR tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3842 saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_DIF_INTERNAL_ERROR++; 3843 siDifAbnormal(agRoot, pRequest, status, param, sspTag, pIomb1); 3844 break; 3845 } 3846 case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN: 3847 { 3848 SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3849 saRoot->IoErrorCount.agOSSA_IO_XFER_ERR_EOB_DATA_OVERRUN++; 3850 siAbnormal(agRoot, pRequest, status, param, sspTag); 3851 break; 3852 } 3853 case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED: 3854 { 3855 SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3856 saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED++; 3857 siAbnormal(agRoot, pRequest, status, param, sspTag); 3858 break; 3859 } 3860 default: 3861 { 3862 SA_DBG1(("mpiSSPCompletion: Unknown tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param)); 3863 /* not allowed case. Therefore, return failed status */ 3864 saRoot->IoErrorCount.agOSSA_IO_UNKNOWN_ERROR++; 3865 siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag); 3866 break; 3867 } 3868 } 3869 3870 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5A"); 3871 return ret; 3872 } 3873