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