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