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
24 *
25 *
26 *
27 * This file contains CB functions used by lower layer in SAS/SATA TD layer
28 *
29 */
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
32 #include <dev/pms/config.h>
33
34 #include <dev/pms/freebsd/driver/common/osenv.h>
35 #include <dev/pms/freebsd/driver/common/ostypes.h>
36 #include <dev/pms/freebsd/driver/common/osdebug.h>
37
38 #include <dev/pms/RefTisa/sallsdk/api/sa.h>
39 #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
40 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
41
42 #include <dev/pms/RefTisa/tisa/api/titypes.h>
43 #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
44 #include <dev/pms/RefTisa/tisa/api/tiapi.h>
45 #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
46
47 #ifdef FDS_SM
48 #include <dev/pms/RefTisa/sat/api/sm.h>
49 #include <dev/pms/RefTisa/sat/api/smapi.h>
50 #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
51 #endif
52
53 #ifdef FDS_DM
54 #include <dev/pms/RefTisa/discovery/api/dm.h>
55 #include <dev/pms/RefTisa/discovery/api/dmapi.h>
56 #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
57 #endif
58
59 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
60 #include <dev/pms/freebsd/driver/common/osstring.h>
61 #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
62
63 #ifdef INITIATOR_DRIVER
64 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
65 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
66 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
67 #endif
68
69 #ifdef TARGET_DRIVER
70 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
71 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
72 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
73 #endif
74
75 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
76 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
77
78 #ifdef ECHO_TESTING
79 /* temporary to test saEchoCommand() */
80 extern bit8 gEcho;
81 #endif
82
83 #if defined(SALLSDK_DEBUG)
84 extern bit32 gLLDebugLevel;
85 #endif
86
87
88 #include <dev/pms/RefTisa/sallsdk/spc/mpidebug.h>
89
90 #ifdef SA_ENABLE_TRACE_FUNCTIONS
91
92 #ifdef siTraceFileID
93 #undef siTraceFileID
94 #endif
95 #define siTraceFileID 'R'
96 #endif
97 /*
98 functions that are common to SAS and SATA
99 */
100
101 FORCEINLINE
102 void ossaCacheInvalidate(
103 agsaRoot_t *agRoot,
104 void *osMemHandle,
105 void *virtPtr,
106 bit32 length
107 )
108 {
109 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
110 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
111
112 TI_DBG6(("ossaCacheInvalidate: start\n"));
113 ostiCacheInvalidate(tiRoot, osMemHandle, virtPtr, length);
114 return;
115 }
116
117 FORCEINLINE
118 void ossaCacheFlush(
119 agsaRoot_t *agRoot,
120 void *osMemHandle,
121 void *virtPtr,
122 bit32 length
123 )
124 {
125 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
126 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
127
128 TI_DBG6(("ossaCacheFlush: start\n"));
129 ostiCacheFlush(tiRoot, osMemHandle, virtPtr, length);
130 return;
131 }
132
133 FORCEINLINE
134 void ossaCachePreFlush(
135 agsaRoot_t *agRoot,
136 void *osMemHandle,
137 void *virtPtr,
138 bit32 length
139 )
140
141 {
142 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
143 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
144
145 TI_DBG6(("ossaCachePreFlush: start\n"));
146 ostiCachePreFlush(tiRoot, osMemHandle, virtPtr, length);
147 return;
148 }
149
150 /*****************************************************************************
151 *! \brief ossaDeviceHandleAccept
152 *
153 * Purpose: This function is called by lower layer to inform TD layer of
154 * a new SAS device arrival. Used only at the target
155 *
156 *
157 * \param agRoot Pointer to chip/driver Instance.
158 * \param agDevHandle Pointer to the device handle of the device
159 * \param agDevInfo Pointer to the device info structure
160 * \param agPortContext Pointer to a port context
161 *
162 * \return:
163 * OSSA_RC_REJECT A device is accpeted
164 * OSSA_RC_ACCEPT A device is rejected
165 *
166 * \note - For details, refer to SAS/SATA Low-Level API Specification
167 *
168 *****************************************************************************/
169 osGLOBAL bit32 ossaDeviceHandleAccept(
170 agsaRoot_t *agRoot,
171 agsaDevHandle_t *agDevHandle,
172 agsaSASDeviceInfo_t *agDevInfo,
173 agsaPortContext_t *agPortContext,
174 bit32 *hostAssignedDeviceId
175 )
176 {
177 #ifdef TARGET_DRIVER
178 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
179 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
180 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
181 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
182
183 tdsaPortContext_t *onePortContext = agNULL;
184 tiPortalContext_t *tiPortalContext = agNULL;
185 tdsaDeviceData_t *oneDeviceData = agNULL;
186 tiDeviceHandle_t *tiDeviceHandle = agNULL;
187 tdsaSASSubID_t agSASSubID;
188 bit32 option;
189 bit32 param;
190 /*
191 at target only
192 by default TD layer accpets all devices
193 */
194 /*
195 at this point,
196 by LINK_UP event tdsaPortContext should have been created
197 */
198 smTraceFuncEnter(hpDBG_VERY_LOUD, "Y0");
199 TI_DBG1(("ossaDeviceHandleAccept: start hostAssignedDeviceId 0x%X\n",*hostAssignedDeviceId));
200
201
202 if (agPortContext == agNULL)
203 {
204 TI_DBG1(("ossaDeviceHandleAccept: NULL agsaPortContext; wrong\n"));
205 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y0");
206 return OSSA_RC_REJECT;
207 }
208
209
210 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
211
212 if (onePortContext == agNULL)
213 {
214 TI_DBG1(("ossaDeviceHandleAccept: NULL oneportcontext; wrong\n"));
215 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y0");
216 return OSSA_RC_REJECT;
217 }
218
219 tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext;
220
221 if (tiPortalContext == agNULL)
222 {
223 TI_DBG1(("ossaDeviceHandleAccept: NULL tiPortalContext; wrong\n"));
224 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y0");
225 return OSSA_RC_REJECT;
226 }
227
228 /*
229 add the device to device list
230 cf) OSSA_DISCOVER_FOUND_DEVICE
231 */
232 TI_DBG4(("ossaDeviceHandleAccept: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(&agDevInfo->commonDevInfo)));
233 TI_DBG4(("ossaDeviceHandleAccept: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(&agDevInfo->commonDevInfo)));
234 TI_DBG4(("ossaDeviceHandleAccept: device type 0x%x\n", DEVINFO_GET_DEVICETTYPE(&agDevInfo->commonDevInfo)));
235 TI_DBG4(("ossaDeviceHandleAccept: phys %d\n", agDevInfo->numOfPhys));
236 TI_DBG4(("ossaDeviceHandleAccept: pid %d\n", onePortContext->id));
237
238 if (DEVINFO_GET_DEVICETTYPE(&agDevInfo->commonDevInfo) == SAS_END_DEVICE)
239 {
240 TI_DBG4(("ossaDeviceHandleAccept: SAS_END_DEVICE\n"));
241 }
242 else if (DEVINFO_GET_DEVICETTYPE(&agDevInfo->commonDevInfo) == SAS_EDGE_EXPANDER_DEVICE)
243 {
244 TI_DBG4(("ossaDeviceHandleAccept: SAS_EDGE_EXPANDER_DEVICE\n"));
245 }
246 else /* SAS_FANOUT_EXPANDER_DEVICE */
247 {
248 TI_DBG4(("ossaDeviceHandleAccept: SAS_FANOUT_EXPANDER_DEVICE\n"));
249 }
250 agSASSubID.sasAddressHi = SA_DEVINFO_GET_SAS_ADDRESSHI(&agDevInfo->commonDevInfo);
251 agSASSubID.sasAddressLo = SA_DEVINFO_GET_SAS_ADDRESSLO(&agDevInfo->commonDevInfo);
252 agSASSubID.initiator_ssp_stp_smp = agDevInfo->initiator_ssp_stp_smp;
253 agSASSubID.target_ssp_stp_smp = agDevInfo->target_ssp_stp_smp;
254
255
256 tdssAddSASToSharedcontext(
257 onePortContext,
258 agRoot,
259 agDevHandle,
260 &agSASSubID,
261 agTRUE,
262 0xFF,
263 TD_OPERATION_TARGET
264 );
265
266 /* at this point devicedata for new device exists */
267 oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
268
269 if (oneDeviceData == agNULL)
270 {
271 TI_DBG1(("ossaDeviceHandleAccept: NULL oneDeviceData; wrong\n"));
272 return OSSA_RC_REJECT;
273 }
274
275 oneDeviceData->registered = agTRUE;
276
277 tiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
278
279 if (tiDeviceHandle == agNULL)
280 {
281 TI_DBG1(("ossaDeviceHandleAccept: NULL tiDeviceHandle; wrong\n"));
282 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y0");
283 return OSSA_RC_REJECT;
284 }
285
286 /* setting MCN in agsaDeviceInfo_t*/
287 agDevInfo->commonDevInfo.flag = agDevInfo->commonDevInfo.flag | (tdsaAllShared->MCN << 16);
288 /* increment RegisteredDevNums */
289 onePortContext->RegisteredDevNums++;
290
291 *hostAssignedDeviceId |= 0xBEEF0000;
292
293 TI_DBG1(("ossaDeviceHandleAccept: Now hostAssignedDeviceId 0x%X\n", *hostAssignedDeviceId));
294
295
296 /* no login in SAS */
297 /*
298 osGLOBAL bit32 ostiTargetEvent (
299 tiRoot_t *tiRoot,
300 tiPortalContext_t *portalContext,
301 tiDeviceHandle_t *tiDeviceHandle,
302 tiTgtEventType_t eventType,
303 bit32 eventStatus,
304 void *parm
305 );
306 */
307
308 ostiTargetEvent(
309 tiRoot,
310 tiPortalContext,
311 tiDeviceHandle,
312 tiTgtEventTypeDeviceChange,
313 tiDeviceArrival,
314 agNULL
315 );
316 /* set MCN and initiator role bit using saSetDeviceInfo */
317 option = 24; /* setting MCN and initiator role 1 1000b*/
318 param = (1 << 18) | (tdsaAllShared->MCN << 24);
319 TI_DBG1(("ossaDeviceHandleAccept: option 0x%x param 0x%x MCN 0x%x\n", option, param, tdsaAllShared->MCN));
320 saSetDeviceInfo(agRoot, agNULL, 0, agDevHandle, option, param, ossaSetDeviceInfoCB);
321 smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "Y0");
322 return OSSA_RC_ACCEPT;
323 #endif
324
325 #ifdef INITIATOR_DRIVER
326 /* this function is not used in case of Initiator */
327 return OSSA_RC_ACCEPT;
328 #endif
329 }
330
331 #ifdef INITIATOR_DRIVER
332 /*****************************************************************************
333 *! \brief ossaDiscoverSasCB
334 *
335 * Purpose: This function is called by lower layer to inform TD layer of
336 * SAS discovery results
337 *
338 *
339 * \param agRoot Pointer to chip/driver Instance.
340 * \param agPortContext Pointer to the port context of TD and Lower layer
341 * \param event event type
342 * \param pParm1 Pointer to data associated with event
343 * \param pParm2 Pointer to data associated with event
344 *
345 * \return: none
346 *
347 * \note - For details, refer to SAS/SATA Low-Level API Specification
348 *
349 *****************************************************************************/
350 osGLOBAL void ossaDiscoverSasCB(agsaRoot_t *agRoot,
351 agsaPortContext_t *agPortContext,
352 bit32 event,
353 void *pParm1,
354 void *pParm2
355 )
356 {
357 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
358 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
359 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)osData->tdsaAllShared;
360
361 tdsaPortContext_t *onePortContext = agNULL;
362 tdsaDeviceData_t *oneDeviceData = agNULL;
363
364 agsaDevHandle_t *agDevHandle = agNULL;
365 agsaSASDeviceInfo_t *agDeviceInfo = agNULL;
366 tiPortalContext_t *tiPortalContext = agNULL;
367 tdList_t *DeviceListList;
368 tdsaSASSubID_t agSASSubID;
369
370 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y1");
371 TI_DBG2(("ossaDiscoverSasCB: start\n"));
372
373 if (agPortContext == agNULL)
374 {
375 TI_DBG1(("ossaDiscoverSasCB: NULL agsaPortContext; wrong\n"));
376 return;
377 }
378
379 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
380 tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext;
381
382 switch ( event )
383 {
384 case OSSA_DISCOVER_STARTED:
385 {
386 TI_DBG3(("ossaDiscoverSasCB: STARTED pid %d\n", onePortContext->id));
387 /*
388 invalidate all devices in current device list
389 */
390 DeviceListList = tdsaAllShared->MainDeviceList.flink;
391 while (DeviceListList != &(tdsaAllShared->MainDeviceList))
392 {
393 oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
394 TI_DBG3(("ossaDiscoverSasCB: loop did %d\n", oneDeviceData->id));
395 TI_DBG3(("ossaDiscoverSasCB: loop sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
396 TI_DBG6(("ossaDiscoverSasCB: loop sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
397 if (oneDeviceData->tdPortContext == onePortContext)
398 {
399 TI_DBG3(("ossaDiscoverSasCB: did %d is invalidated \n", oneDeviceData->id));
400 /* temporary solution: only for sata direct attached */
401 }
402 DeviceListList = DeviceListList->flink;
403 }
404 onePortContext->DiscoveryState = ITD_DSTATE_STARTED;
405 break;
406 }
407
408 case OSSA_DISCOVER_FOUND_DEVICE:
409 {
410 TI_DBG4(("ossaDiscoverSasCB: $$$$$ FOUND_DEVICE pid %d\n", onePortContext->id));
411 agDevHandle = (agsaDevHandle_t *)pParm1;
412 agDeviceInfo = (agsaSASDeviceInfo_t *)pParm2;
413 TI_DBG5(("ossaDiscoverSasCB: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(&agDeviceInfo->commonDevInfo)));
414 TI_DBG5(("ossaDiscoverSasCB: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(&agDeviceInfo->commonDevInfo)));
415 TI_DBG5(("ossaDiscoverSasCB: device type 0x%x\n", DEVINFO_GET_DEVICETTYPE(&agDeviceInfo->commonDevInfo)));
416
417 TI_DBG6(("ossaDiscoverSasCB: phys %d\n", agDeviceInfo->numOfPhys));
418 TI_DBG4(("ossaDiscoverSasCB: pid %d\n", onePortContext->id));
419
420
421 /* Add only target devices; do not add expander device */
422 if (DEVINFO_GET_DEVICETTYPE(&agDeviceInfo->commonDevInfo) == SAS_END_DEVICE)
423 {
424 agSASSubID.sasAddressHi = SA_DEVINFO_GET_SAS_ADDRESSHI(&agDeviceInfo->commonDevInfo);
425 agSASSubID.sasAddressLo = SA_DEVINFO_GET_SAS_ADDRESSLO(&agDeviceInfo->commonDevInfo);
426 agSASSubID.initiator_ssp_stp_smp = agDeviceInfo->initiator_ssp_stp_smp;
427 agSASSubID.target_ssp_stp_smp = agDeviceInfo->target_ssp_stp_smp;
428
429 TI_DBG2(("ossaDiscoverSasCB: adding ....\n"));
430
431 tdssAddSASToSharedcontext(
432 onePortContext,
433 agRoot,
434 agDevHandle,
435 &agSASSubID,
436 agTRUE,
437 agDeviceInfo->phyIdentifier,
438 TD_OPERATION_INITIATOR
439 );
440 ostiInitiatorEvent(
441 tiRoot,
442 tiPortalContext,
443 agNULL,
444 tiIntrEventTypeDeviceChange,
445 tiDeviceArrival,
446 agNULL
447 );
448 }
449 else
450 {
451 TI_DBG5(("ossaDiscoverSasCB: $$$$$ not end device. not adding....\n"));
452 }
453
454
455 break;
456 }
457
458 case OSSA_DISCOVER_REMOVED_DEVICE:
459 {
460 TI_DBG3(("ossaDiscoverSasCB: REMOVED_DEVICE\n"));
461 agDevHandle = (agsaDevHandle_t *)pParm1;
462 agDeviceInfo = (agsaSASDeviceInfo_t *)pParm2;
463 oneDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
464
465 TI_DBG6(("ossaDiscoverSasCB: sasAddressHi 0x%08x\n",
466 SA_DEVINFO_GET_SAS_ADDRESSHI(&agDeviceInfo->commonDevInfo)));
467 TI_DBG6(("ossaDiscoverSasCB: sasAddressLo 0x%08x\n",
468 SA_DEVINFO_GET_SAS_ADDRESSLO(&agDeviceInfo->commonDevInfo)));
469 TI_DBG6(("ossaDiscoverSasCB: phys %d\n", agDeviceInfo->numOfPhys));
470 TI_DBG6(("ossaDiscoverSasCB: onePortContext->id %d\n", onePortContext->id));
471
472 if (oneDeviceData == agNULL)
473 {
474 TI_DBG1(("ossaDiscoverSasCB: Wrong. DevHandle->osData is NULL but is being removed\n"));
475 }
476 else
477 {
478 tdssRemoveSASFromSharedcontext(onePortContext,
479 oneDeviceData,
480 agRoot);
481 agDevHandle->osData = agNULL;
482 ostiInitiatorEvent(
483 tiRoot,
484 tiPortalContext,
485 agNULL,
486 tiIntrEventTypeDeviceChange,
487 tiDeviceRemoval,
488 agNULL
489 );
490 }
491
492 break;
493 }
494 case OSSA_DISCOVER_COMPLETE:
495 {
496 TI_DBG2(("ossaDiscoverSasCB: SAS COMPLETE pid %d\n", onePortContext->id));
497 /*
498 note:
499 SAS discovery must be called before SATA discovery
500 "onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED" is
501 in ossaDiscoverSataCB not in ossaDiscoverSasCB when SATA_ENABLE
502 */
503 #ifndef SATA_ENABLE
504 onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED;
505 TI_DBG6(("ossaDiscoverSasCB: COMPLETE pid %d\n", onePortContext->id));
506 #endif
507
508 #ifdef SATA_ENABLE
509 TI_DBG2(("ossaDiscoverSasCB: calling SATA discovery\n"));
510
511 /* Continue with SATA discovery */
512 saDiscover(agRoot, agPortContext, AG_SA_DISCOVERY_TYPE_SATA,
513 onePortContext->discoveryOptions);
514
515 #else /* SATA not enable */
516
517 #ifdef TD_INTERNAL_DEBUG /* for debugging */
518 /* dump device list */
519 DeviceListList = tdsaAllShared->MainPortContextList.flink;
520
521 while (DeviceListList != &(tdsaAllShared->MainPortContextList))
522 {
523 oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
524 TI_DBG2(("ossaDiscoverSasCB: did %d valid %d\n", oneDeviceData->id, oneDeviceData->valid));
525 TI_DBG2(("ossaDiscoverSasCB: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
526 TI_DBG2(("ossaDiscoverSasCB: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
527 DeviceListList = DeviceListList->flink;
528 }
529 #endif
530
531 /* letting OS layer know discovery has been successfully complete */
532 ostiInitiatorEvent(
533 tiRoot,
534 tiPortalContext,
535 agNULL,
536 tiIntrEventTypeDiscovery,
537 tiDiscOK,
538 agNULL
539 );
540 #endif /* SATA_ENABLE */
541
542 break;
543 }
544 case OSSA_DISCOVER_ABORT:
545 {
546 TI_DBG3(("ossaDiscoverSasCB: ABORT\n"));
547 /* letting OS layer know discovery has not been successfully complete */
548 ostiInitiatorEvent(
549 tiRoot,
550 tiPortalContext,
551 agNULL,
552 tiIntrEventTypeDiscovery,
553 tiDiscFailed,
554 agNULL
555 );
556 break;
557 }
558 case OSSA_DISCOVER_ABORT_ERROR_1:
559 {
560 TI_DBG3(("ossaDiscoverSasCB: ERROR 1\n"));
561 /* letting OS layer know discovery has not been successfully complete */
562 ostiInitiatorEvent(
563 tiRoot,
564 tiPortalContext,
565 agNULL,
566 tiIntrEventTypeDiscovery,
567 tiDiscFailed,
568 agNULL
569 );
570 break;
571 }
572
573 case OSSA_DISCOVER_ABORT_ERROR_2:
574 {
575 TI_DBG3(("ossaDiscoverSasCB: ERROR 2\n"));
576 /* letting OS layer know discovery has not been successfully complete */
577 ostiInitiatorEvent(
578 tiRoot,
579 tiPortalContext,
580 agNULL,
581 tiIntrEventTypeDiscovery,
582 tiDiscFailed,
583 agNULL
584 );
585 break;
586 }
587
588 case OSSA_DISCOVER_ABORT_ERROR_3:
589 {
590 TI_DBG3(("ossaDiscoverSasCB: ERROR 3\n"));
591 /* letting OS layer know discovery has not been successfully complete */
592 ostiInitiatorEvent(
593 tiRoot,
594 tiPortalContext,
595 agNULL,
596 tiIntrEventTypeDiscovery,
597 tiDiscFailed,
598 agNULL
599 );
600 break;
601 }
602 case OSSA_DISCOVER_ABORT_ERROR_4:
603 {
604 TI_DBG3(("ossaDiscoverSasCB: ERROR 4\n"));
605 /* letting OS layer know discovery has not been successfully complete */
606 ostiInitiatorEvent(
607 tiRoot,
608 tiPortalContext,
609 agNULL,
610 tiIntrEventTypeDiscovery,
611 tiDiscFailed,
612 agNULL
613 );
614 break;
615 }
616 case OSSA_DISCOVER_ABORT_ERROR_5:
617 {
618 TI_DBG3(("ossaDiscoverSasCB: ERROR 5\n"));
619 /* letting OS layer know discovery has not been successfully complete */
620 ostiInitiatorEvent(
621 tiRoot,
622 tiPortalContext,
623 agNULL,
624 tiIntrEventTypeDiscovery,
625 tiDiscFailed,
626 agNULL
627 );
628 break;
629 }
630 case OSSA_DISCOVER_ABORT_ERROR_6:
631 {
632 TI_DBG3(("ossaDiscoverSasCB: ERROR 6\n"));
633 /* letting OS layer know discovery has not been successfully complete */
634 ostiInitiatorEvent(
635 tiRoot,
636 tiPortalContext,
637 agNULL,
638 tiIntrEventTypeDiscovery,
639 tiDiscFailed,
640 agNULL
641 );
642 break;
643 }
644 case OSSA_DISCOVER_ABORT_ERROR_7:
645 {
646 TI_DBG3(("ossaDiscoverSasCB: ERROR 7\n"));
647 /* letting OS layer know discovery has not been successfully complete */
648 ostiInitiatorEvent(
649 tiRoot,
650 tiPortalContext,
651 agNULL,
652 tiIntrEventTypeDiscovery,
653 tiDiscFailed,
654 agNULL
655 );
656 break;
657 }
658 case OSSA_DISCOVER_ABORT_ERROR_8:
659 {
660 TI_DBG3(("ossaDiscoverSasCB: ERROR 8\n"));
661 /* letting OS layer know discovery has not been successfully complete */
662 ostiInitiatorEvent(
663 tiRoot,
664 tiPortalContext,
665 agNULL,
666 tiIntrEventTypeDiscovery,
667 tiDiscFailed,
668 agNULL
669 );
670 break;
671 }
672 case OSSA_DISCOVER_ABORT_ERROR_9:
673 {
674 TI_DBG3(("ossaDiscoverSasCB: ERROR 9\n"));
675 /* letting OS layer know discovery has not been successfully complete */
676 ostiInitiatorEvent(
677 tiRoot,
678 tiPortalContext,
679 agNULL,
680 tiIntrEventTypeDiscovery,
681 tiDiscFailed,
682 agNULL
683 );
684 break;
685 }
686 default:
687 TI_DBG3(("ossaDiscoverSasCB: ERROR default event 0x%x\n", event));
688 /* letting OS layer know discovery has not been successfully complete */
689 ostiInitiatorEvent(
690 tiRoot,
691 tiPortalContext,
692 agNULL,
693 tiIntrEventTypeDiscovery,
694 tiDiscFailed,
695 agNULL
696 );
697 break;
698 } /* end of switch */
699 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y1");
700 return;
701 }
702 #endif // #ifdef INITIATOR_DRIVER
703
704 osGLOBAL void ossaLogTrace0(
705 agsaRoot_t *agRoot,
706 bit32 traceCode
707 )
708 {
709 return;
710 }
711
712 osGLOBAL void ossaLogTrace1(
713 agsaRoot_t *agRoot,
714 bit32 traceCode,
715 bit32 value1
716 )
717 {
718 return;
719 }
720
721 osGLOBAL void ossaLogTrace2(
722 agsaRoot_t *agRoot,
723 bit32 traceCode,
724 bit32 value1,
725 bit32 value2
726 )
727 {
728 return;
729 }
730
731 osGLOBAL void ossaLogTrace3(
732 agsaRoot_t *agRoot,
733 bit32 traceCode,
734 bit32 value1,
735 bit32 value2,
736 bit32 value3
737 )
738 {
739 return;
740 }
741
742
743 osGLOBAL void
744 ossaLogTrace4(
745 agsaRoot_t *agRoot,
746 bit32 traceCode,
747 bit32 value1,
748 bit32 value2,
749 bit32 value3,
750 bit32 value4
751 )
752 {
753 return;
754 }
755
756
757 /*****************************************************************************
758 *! \brief ossaHwCB
759 *
760 * Purpose: This function is called by lower layer to inform TD layer of
761 * HW related results
762 *
763 * \param agRoot Pointer to chip/driver Instance.
764 * \param agPortContext Pointer to the port context of TD and Lower layer
765 * \param event event type
766 * \param eventParm1 event-specific parameter
767 * \param eventParm2 event-specific parameter
768 * \param eventParm3 event-specific parameter of pointer type
769 *
770 * \return: none
771 *
772 * \note - For details, refer to SAS/SATA Low-Level API Specification
773 *
774 *****************************************************************************/
775 osGLOBAL void ossaHwCB(
776 agsaRoot_t *agRoot,
777 agsaPortContext_t *agPortContext,
778 bit32 event,
779 bit32 eventParm1,
780 void *eventParm2,
781 void *eventParm3
782 )
783 {
784 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
785 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
786 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)osData->tdsaAllShared;
787 tdList_t *PortContextList = agNULL;
788 tdsaPortContext_t *onePortContext = agNULL;
789 agsaDevHandle_t *agDevHandle = agNULL;
790 agsaSASIdentify_t *IDframe = agNULL;
791 int i = 0;
792 #ifdef INITIATOR_DRIVER
793 tdsaSASSubID_t agSASSubID;
794 #endif
795 bit32 PhyID;
796 bit32 PhyStatus;
797 bit32 LinkRate;
798 bit32 PortState;
799 bit32 HwAckSatus = AGSA_RC_SUCCESS;
800
801 // #ifdef INITIATOR_DRIVER
802 #ifdef INITIATOR_DRIVER
803 agsaFisRegDeviceToHost_t *RegD2H = agNULL;
804 tdsaDeviceData_t *oneDeviceData = agNULL;
805 tdList_t *DeviceListList;
806 #endif
807 #ifdef REMOVED
808 bit32 found = agFALSE;
809 #endif
810 agsaHWEventEncrypt_t *pEncryptCBData;
811 agsaEncryptInfo_t *pEncryptInfo;
812 agsaHWEventMode_t *pModeEvent;
813 tiEncryptPort_t encryptEventData;
814 tiEncryptInfo_t encryptInfo;
815 bit32 *pModePage;
816 bit32 securityMode;
817 bit32 cipherMode;
818 bit32 encryptStatus;
819 bit32 securitySetModeStatus;
820 bit32 securityModeStatus;
821
822 // #endif /* INITIATOR_DRIVER */
823 agsaPhyErrCountersPage_t *agPhyErrCountersPage;
824 agsaEventSource_t eventSource;
825
826 #ifdef FDS_DM
827 dmRoot_t *dmRoot = &(tdsaAllShared->dmRoot);
828 dmPortContext_t *dmPortContext = agNULL;
829 bit32 status = DM_RC_FAILURE;
830 dmPortInfo_t dmPortInfo;
831 // bit32 discStatus = dmDiscInProgress;
832 #endif
833
834 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y2");
835
836 TI_DBG2(("ossaHwCB: agPortContext %p event 0x%x eventParm1 0x%x eventParm2 %p eventParm3 %p\n",
837 agPortContext,event,eventParm1,eventParm2,eventParm3 ));
838
839 switch ( event )
840 {
841 case OSSA_HW_EVENT_SAS_PHY_UP:
842 {
843 PhyID = TD_GET_PHY_ID(eventParm1);
844 LinkRate = TD_GET_LINK_RATE(eventParm1);
845 PortState = TD_GET_PORT_STATE(eventParm1);
846 agDevHandle = agNULL;
847 IDframe = (agsaSASIdentify_t *)eventParm3;
848
849
850 TI_DBG2(("ossaHwCB: Phy%d SAS link Up\n", PhyID));
851
852 if (agPortContext == agNULL)
853 {
854 TI_DBG1(("ossaHwCB: agPortContext null, wrong\n"));
855 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y2");
856 return;
857 }
858 if (agDevHandle == agNULL)
859 {
860 TI_DBG3(("ossaHwCB: agDevHandle null by design change\n"));
861 }
862
863 if (IDframe == agNULL)
864 {
865 TI_DBG1(("ossaHwCB: IDframe null, wrong\n"));
866 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y2");
867 return;
868 }
869 /* debugging only */
870 if (LinkRate == 0x01)
871 {
872 TI_DBG1(("ossaHwCB: SAS Link Rate is 1.5 Gbps PhyID %d\n",PhyID));
873 }
874 if (LinkRate == 0x02)
875 {
876 TI_DBG1(("ossaHwCB: SAS Link Rate is 3.0 Gbps PhyID %d\n",PhyID));
877 }
878 if (LinkRate == 0x04)
879 {
880 TI_DBG1(("ossaHwCB: SAS Link Rate is 6.0 Gbps PhyID %d\n",PhyID));
881 }
882 if (LinkRate == 0x08)
883 {
884 TI_DBG1(("ossaHwCB: SAS Link Rate is 12.0 Gbps PhyID %d\n",PhyID));
885 }
886
887 if (PortState == OSSA_PORT_INVALID)
888 {
889 TI_DBG1(("ossaHwCB: Wrong port state with SAS link up\n"));
890 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y2");
891 return;
892 }
893
894 if ( agPortContext->osData == agNULL)
895 {/* if */
896 TI_DBG6 (("ossaHwCB: PhyID %d tdsaAllShared %p\n", PhyID, tdsaAllShared));
897 if (tdsaAllShared->Ports[PhyID].tiPortalContext == agNULL)
898 {
899 TI_DBG6(("ossaHwCB: NULL portalcontext\n"));
900 }
901 else
902 {
903 TI_DBG6(("ossaHwCB: NOT NULL portalcontext\n"));
904 }
905
906 if (IDframe == agNULL)
907 {
908 TI_DBG1(("ossaHwCB: IDFrame is NULL; SATA !!!!\n"));
909 }
910 else
911 {
912 TI_DBG3(("ossaHwCB: IDframe->sasAddressHi 0x%08x \n",
913 SA_IDFRM_GET_SAS_ADDRESSHI(IDframe)));
914 TI_DBG3(("ossaHwCB: IDframe->sasAddressLo 0x%08x \n",
915 SA_IDFRM_GET_SAS_ADDRESSLO(IDframe)));
916
917 }
918 /*
919 setting tdsaPortContext fields
920 take the head from the FreeLink of tdsaPortContext_t
921 then modify it
922 then put it in MainLink of tdsaPortContext_t
923 */
924 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
925 if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
926 {
927 TDLIST_DEQUEUE_FROM_HEAD(&PortContextList, &(tdsaAllShared->FreePortContextList));
928 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
929 onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, PortContextList);
930 TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
931 TI_DBG6(("ossaHwCB: onePortContext %p\n", onePortContext));
932 if (onePortContext == agNULL)
933 {
934 TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
935 return;
936 }
937
938 /* sets fields of tdsaportcontext */
939 #ifdef INITIATOR_DRIVER
940 onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
941 onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
942 #endif
943 onePortContext->PhyIDList[PhyID] = agTRUE;
944 if (IDframe == agNULL)
945 {
946 onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
947 onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
948 onePortContext->directAttatchedSAS = agTRUE;
949 }
950 else
951 {
952 onePortContext->sasRemoteAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(IDframe);
953 onePortContext->sasRemoteAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(IDframe);
954 /* Create ID frame and storing ID frame */
955 osti_memcpy(&onePortContext->sasIDframe, IDframe, sizeof(agsaSASIdentify_t));
956 tdhexdump("ossaHWCB: sasIDframe", (bit8 *)(&onePortContext->sasIDframe), sizeof(agsaSASIdentify_t));
957 if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE)
958 {
959 onePortContext->directAttatchedSAS = agTRUE;
960 }
961 #ifdef FDS_DM
962 if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_EDGE_EXPANDER_DEVICE ||
963 SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_FANOUT_EXPANDER_DEVICE
964 )
965 {
966 onePortContext->UseDM = agTRUE;
967 }
968 #endif
969 }
970
971 onePortContext->sasLocalAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&tdsaAllShared->Ports[PhyID].SASID);
972 onePortContext->sasLocalAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&tdsaAllShared->Ports[PhyID].SASID);
973 onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
974 onePortContext->agRoot = agRoot;
975 onePortContext->agPortContext = agPortContext;
976 tdsaAllShared->Ports[PhyID].portContext = onePortContext;
977 agPortContext->osData = onePortContext;
978 onePortContext->valid = agTRUE;
979 if (LinkRate == 0x01)
980 {
981 onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
982 }
983 else if (LinkRate == 0x02)
984 {
985 onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
986 }
987 else if (LinkRate == 0x04)
988 {
989 onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
990 }
991 else /* (LinkRate == 0x08) */
992 {
993 onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
994 }
995
996 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
997 TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
998 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
999 #ifdef FDS_DM
1000 dmPortContext = &(onePortContext->dmPortContext);
1001 dmPortContext->tdData = onePortContext;
1002 /* set up dmPortInfo_t */
1003 PORTINFO_PUT_SAS_REMOTE_ADDRESSLO(&dmPortInfo, onePortContext->sasRemoteAddressLo);
1004 PORTINFO_PUT_SAS_REMOTE_ADDRESSHI(&dmPortInfo, onePortContext->sasRemoteAddressHi);
1005 PORTINFO_PUT_SAS_LOCAL_ADDRESSLO(&dmPortInfo, onePortContext->sasLocalAddressLo);
1006 PORTINFO_PUT_SAS_LOCAL_ADDRESSHI(&dmPortInfo, onePortContext->sasLocalAddressHi);
1007
1008 TI_DBG2(("ossaHwCB: phy %d hi 0x%x lo 0x%x\n", PhyID,
1009 SA_IDFRM_GET_SAS_ADDRESSHI(&(tdsaAllShared->Ports[PhyID].SASID)),
1010 SA_IDFRM_GET_SAS_ADDRESSLO(&(tdsaAllShared->Ports[PhyID].SASID))));
1011 TI_DBG2(("ossaHwCB: LocalAddrHi 0x%08x LocaAddrLo 0x%08x\n", onePortContext->sasLocalAddressHi, onePortContext->sasLocalAddressLo));
1012
1013 dmPortInfo.flag = onePortContext->LinkRate;
1014
1015 if (onePortContext->UseDM == agTRUE)
1016 {
1017 TI_DBG1(("ossaHwCB: calling dmCreatePort\n"));
1018 status = dmCreatePort(dmRoot, dmPortContext, &dmPortInfo);
1019 if (status != DM_RC_SUCCESS)
1020 {
1021 TI_DBG1(("ossaHwCB: dmCreatePort failed!!! 0x%x\n", status));
1022 }
1023 }
1024 #endif
1025
1026 }
1027 else
1028 {
1029 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1030 TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
1031 }
1032 #ifdef TD_INTERNAL_DEBUG /* for debugging only */
1033
1034 print_tdlist_flink(&(tdsaPortContext->FreeLink), 1, 1);
1035 print_tdlist_flink(&(tdsaPortContext->MainLink), 1, 2);
1036 print_tdlist_flink(&(tdsaDeviceData->FreeLink), 2, 1);
1037 print_tdlist_flink(&(tdsaDeviceData->MainLink), 2, 2);
1038 #endif
1039
1040 #ifdef TD_INTERNAL_DEBUG /* for debugging */
1041 PortContextList = tdsaPortContext->MainLink.flink;
1042 while (PortContextList != &(tdsaPortContext->MainLink))
1043 {
1044 twoPortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList);
1045 TI_DBG6(("ossaHwCB: in while portContext ID %d\n", twoPortContext->id));
1046 TI_DBG6(("ossaHwCB: in while PortContext %p\n", twoPortContext));
1047 PortContextList = PortContextList->flink;
1048 }
1049 #endif
1050 /* add agDevHandle */
1051 if (SA_IDFRM_GET_DEVICETTYPE(IDframe) != SAS_NO_DEVICE)
1052 {
1053 #ifdef INITIATOR_DRIVER
1054 agSASSubID.sasAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(IDframe);
1055 agSASSubID.sasAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(IDframe);
1056 agSASSubID.initiator_ssp_stp_smp = IDframe->initiator_ssp_stp_smp;
1057 agSASSubID.target_ssp_stp_smp = IDframe->target_ssp_stp_smp;
1058 #endif
1059
1060 TI_DBG2(("ossaHwCB: adding ....\n"));
1061 /* uses only SASIDframe not agsaSASDeviceInfo_t */
1062 #ifdef INITIATOR_DRIVER
1063 tdssAddSASToSharedcontext(
1064 onePortContext,
1065 agRoot,
1066 agDevHandle, /* agNULL */
1067 &agSASSubID,
1068 agTRUE,
1069 (bit8)PhyID,
1070 TD_OPERATION_INITIATOR
1071 );
1072 #endif
1073
1074 #ifdef FDS_DM
1075 if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE &&
1076 SA_IDFRM_IS_SSP_TARGET(IDframe) )
1077 {
1078 TI_DBG2(("ossaHwCB: NOTIFY_ENABLE_SPINUP PhyID %d \n", PhyID));
1079
1080 for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
1081 {
1082 saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
1083 }
1084 }
1085
1086 /* update MCN */
1087 tdsaUpdateMCN(dmRoot, onePortContext);
1088 #endif
1089
1090 #ifdef TARGET_DRIVER
1091 TI_DBG1(("ossaHwCB: target, link up PhyID 0x%x\n",PhyID));
1092
1093 /* notifying link up */
1094 ostiPortEvent (
1095 tiRoot,
1096 tiPortLinkUp,
1097 tiSuccess,
1098 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
1099 );
1100 #endif
1101 }
1102 else
1103 {
1104 TI_DBG5(("ossaHwCB: $$$$$ not end device. not adding....\n"));
1105 }
1106
1107 saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RECOVERY_TIME */
1108 agNULL,
1109 0,
1110 agPortContext,
1111 AGSA_PORT_SET_PORT_RECOVERY_TIME,
1112 tdsaAllShared->portTMO, //PORT_RECOVERY_TIMEOUT
1113 0
1114 );
1115 /* setting SAS PORT RESET TMO and SATA PORT RESET TMO*/
1116 if (tIsSPCV12G(agRoot))
1117 {
1118 saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RESET_TIME */
1119 agNULL,
1120 0,
1121 agPortContext,
1122 AGSA_PORT_SET_PORT_RESET_TIME,
1123 SAS_12G_PORT_RESET_TMO, // 800 ms
1124 0
1125 );
1126 }
1127 else
1128 {
1129 saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RESET_TIME */
1130 agNULL,
1131 0,
1132 agPortContext,
1133 AGSA_PORT_SET_PORT_RESET_TIME,
1134 SAS_PORT_RESET_TMO, // 300 ms
1135 0
1136 );
1137 }
1138 }
1139 else
1140 {
1141 /*
1142 an existing portcontext
1143 to be tested
1144 */
1145
1146 TI_DBG2(("ossaHwCB: SAS existing portcontext returned\n"));
1147
1148 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
1149 if (onePortContext == agNULL)
1150 {
1151 TI_DBG1(("ossaHwCB: onePortContext is NULL, wrong!\n"));
1152 return;
1153 }
1154 if (onePortContext->valid == agFALSE)
1155 {
1156 /* port has been invalidated; needs to be allocated */
1157 TI_DBG2(("ossaHwCB: SAS allocating port context\n"));
1158
1159 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1160 if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
1161 {
1162 TDLIST_DEQUEUE_FROM_HEAD(&PortContextList, &(tdsaAllShared->FreePortContextList));
1163 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1164 onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, PortContextList);
1165 TI_DBG2(("ossaHwCB: allocating pid %d\n", onePortContext->id));
1166 TI_DBG6(("ossaHwCB: allocating onePortContext %p\n", onePortContext));
1167 if (onePortContext == agNULL)
1168 {
1169 TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
1170 return;
1171 }
1172 /* sets fields of tdsaportcontext */
1173 #ifdef INITIATOR_DRIVER
1174 onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
1175 onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
1176 #endif
1177 onePortContext->PhyIDList[PhyID] = agTRUE;
1178 if (IDframe == agNULL)
1179 {
1180 onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
1181 onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
1182 onePortContext->directAttatchedSAS = agTRUE;
1183 }
1184 else
1185 {
1186 onePortContext->sasRemoteAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(IDframe);
1187 onePortContext->sasRemoteAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(IDframe);
1188 /* Create ID frame and storing ID frame */
1189 osti_memcpy(&onePortContext->sasIDframe, IDframe, sizeof(agsaSASIdentify_t));
1190 tdhexdump("ossaHWCB: sasIDframe", (bit8 *)(&onePortContext->sasIDframe), sizeof(agsaSASIdentify_t));
1191 if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE)
1192 {
1193 onePortContext->directAttatchedSAS = agTRUE;
1194 }
1195 }
1196
1197 onePortContext->sasLocalAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&tdsaAllShared->Ports[PhyID].SASID);
1198 onePortContext->sasLocalAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&tdsaAllShared->Ports[PhyID].SASID);
1199 onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
1200 onePortContext->agRoot = agRoot;
1201 onePortContext->agPortContext = agPortContext;
1202 tdsaAllShared->Ports[PhyID].portContext = onePortContext;
1203 agPortContext->osData = onePortContext;
1204 onePortContext->valid = agTRUE;
1205 if (LinkRate == 0x01)
1206 {
1207 onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
1208 }
1209 else if (LinkRate == 0x02)
1210 {
1211 onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
1212 }
1213 else if (LinkRate == 0x04)
1214 {
1215 onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
1216 }
1217 else /* (LinkRate == 0x08) */
1218 {
1219 onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
1220 }
1221 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1222 TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
1223 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1224 }
1225 else
1226 {
1227 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1228 TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
1229 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y2");
1230 return;
1231 }
1232 } /* invalidated port */
1233 else
1234 {
1235 /* already alloacated */
1236 TI_DBG2(("ossaHwCB: SAS already allocated port context\n"));
1237 if (TDLIST_EMPTY(&(tdsaAllShared->MainPortContextList)))
1238 {
1239 TI_DBG1(("ossaHwCB: wrong!!! null tdsaPortContext list\n"));
1240 smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "Y2");
1241 return;
1242 }
1243 if (onePortContext == agNULL)
1244 {
1245 TI_DBG1(("ossaHwCB: wrong !!! No corressponding tdsaPortContext\n"));
1246 smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "Y2");
1247 return;
1248 }
1249
1250 TI_DBG2(("ossaHwCB: existing pid %d\n", onePortContext->id));
1251 if (tdsaAllShared->Ports[PhyID].portContext == agNULL)
1252 {
1253 TI_DBG1(("ossaHwCB: existing allshared pid is NULL\n"));
1254 }
1255 else
1256 {
1257 TI_DBG2(("ossaHwCB: existing allshared pid %d\n", tdsaAllShared->Ports[PhyID].portContext->id));
1258 }
1259 /* updates PhyID belong to a port */
1260 onePortContext->PhyIDList[PhyID] = agTRUE;
1261 #ifdef FDS_DM
1262 if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE &&
1263 SA_IDFRM_IS_SSP_TARGET(IDframe) )
1264 {
1265 TI_DBG2(("ossaHwCB: NOTIFY_ENABLE_SPINUP PhyID %d \n", PhyID));
1266
1267 for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
1268 {
1269 saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
1270 }
1271 }
1272
1273 /* update MCN */
1274 tdsaUpdateMCN(dmRoot, onePortContext);
1275 #endif
1276 }
1277 onePortContext->SeenLinkUp = agTRUE;
1278 } /* else, old portcontext */
1279
1280 break;
1281 }
1282 #ifdef INITIATOR_DRIVER
1283 case OSSA_HW_EVENT_SATA_PHY_UP:
1284 {
1285 PhyID = TD_GET_PHY_ID(eventParm1);
1286 LinkRate = TD_GET_LINK_RATE(eventParm1);
1287 PortState = TD_GET_PORT_STATE(eventParm1);
1288 agDevHandle = agNULL;
1289 RegD2H = ( agsaFisRegDeviceToHost_t *)eventParm3;
1290
1291 TI_DBG2(("ossaHwCB: Phy%d SATA link Up\n", PhyID));
1292
1293 if (agDevHandle == agNULL)
1294 {
1295 TI_DBG3(("ossaHwCB: agDevHandle null by design change\n"));
1296 }
1297
1298 if (RegD2H == agNULL)
1299 {
1300 TI_DBG1(("ossaHwCB: RegD2H null, wrong\n"));
1301 smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "Y2");
1302 return;
1303 }
1304
1305
1306 TI_DBG2(("ossaHwCB: agDevHandle %p\n", agDevHandle));
1307 tdhexdump("ossaHWCB RegD2H", (bit8 *)RegD2H, sizeof(agsaFisRegDeviceToHost_t));
1308 TI_DBG2(("ossaHwCB: Sector Count %d\n", RegD2H->d.sectorCount));
1309 TI_DBG2(("ossaHwCB: LBA LOW %d\n", RegD2H->d.lbaLow));
1310 TI_DBG2(("ossaHwCB: LBA MID %d\n", RegD2H->d.lbaMid));
1311 TI_DBG2(("ossaHwCB: LBA HIGH %d\n", RegD2H->d.lbaHigh));
1312 TI_DBG2(("ossaHwCB: DEVICE %d\n", RegD2H->d.device));
1313
1314 /* debugging only */
1315 if (LinkRate == 0x01)
1316 {
1317 TI_DBG1(("ossaHwCB: SATA Link Rate is 1.5 Gbps PhyID %d\n",PhyID));
1318 }
1319 if (LinkRate == 0x02)
1320 {
1321 TI_DBG1(("ossaHwCB: SATA Link Rate is 3.0 Gbps PhyID %d\n",PhyID));
1322 }
1323 if (LinkRate == 0x04)
1324 {
1325 TI_DBG1(("ossaHwCB: SATA Link Rate is 6.0 Gbps PhyID %d\n",PhyID));
1326 }
1327 if (LinkRate == 0x08)
1328 {
1329 TI_DBG1(("ossaHwCB: SATA Link Rate is 12.0 Gbps PhyID %d\n",PhyID));
1330 }
1331
1332 if (PortState == OSSA_PORT_INVALID)
1333 {
1334 TI_DBG1(("ossaHwCB: Wrong port state with SATA link up\n"));
1335 smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "Y2");
1336 return;
1337 }
1338
1339 if ( agPortContext->osData == agNULL)
1340 {/* if */
1341 TI_DBG6 (("ossaHwCB: PhyID %d tdsaAllShared %p\n", PhyID, tdsaAllShared));
1342 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1343 if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
1344 {
1345 TDLIST_DEQUEUE_FROM_HEAD(&PortContextList, &(tdsaAllShared->FreePortContextList));
1346 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1347 onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, PortContextList);
1348 TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
1349 TI_DBG6(("ossaHwCB: onePortContext %p\n", onePortContext));
1350 if (onePortContext == agNULL)
1351 {
1352 TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
1353 return;
1354 }
1355
1356 /* sets fields of tdsaportcontext */
1357 onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
1358 onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
1359 onePortContext->PhyIDList[PhyID] = agTRUE;
1360 /* NO sas address for SATA */
1361 onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
1362 onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
1363 /* copying the signature */
1364 onePortContext->remoteSignature[0] = RegD2H->d.sectorCount;
1365 onePortContext->remoteSignature[1] = RegD2H->d.lbaLow;
1366 onePortContext->remoteSignature[2] = RegD2H->d.lbaMid;
1367 onePortContext->remoteSignature[3] = RegD2H->d.lbaHigh;
1368 onePortContext->remoteSignature[4] = RegD2H->d.device;
1369
1370 onePortContext->sasLocalAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&tdsaAllShared->Ports[PhyID].SASID);
1371 onePortContext->sasLocalAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&tdsaAllShared->Ports[PhyID].SASID);
1372 onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
1373 onePortContext->agRoot = agRoot;
1374 onePortContext->agPortContext = agPortContext;
1375 tdsaAllShared->Ports[PhyID].portContext = onePortContext;
1376 agPortContext->osData = onePortContext;
1377 onePortContext->nativeSATAMode = agTRUE;
1378 onePortContext->valid = agTRUE;
1379 if (LinkRate == 0x01)
1380 {
1381 onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
1382 }
1383 else if (LinkRate == 0x02)
1384 {
1385 onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
1386 }
1387 else if (LinkRate == 0x04)
1388 {
1389 onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
1390 }
1391 else /* (LinkRate == 0x08) */
1392 {
1393 onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
1394 }
1395
1396 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1397 TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
1398 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1399 }
1400 else
1401 {
1402 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1403 TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
1404 smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "Y2");
1405 return;
1406 }
1407 #ifdef SATA_ENABLE
1408 /* tdssAddSATAToSharedcontext() sends identify device data to find out the uniqueness of
1409 target. In identify device data CB fn (satAddSATAIDDevCB()),
1410 tiPortLinkUp and tiPortDiscoveryReady happen
1411 */
1412 tdssAddSATAToSharedcontext(
1413 onePortContext,
1414 agRoot,
1415 agDevHandle, /* agNULL */
1416 agNULL,
1417 agTRUE,
1418 (bit8)PhyID
1419 );
1420 #endif
1421 /* setting SAS PORT RESET TMO and SATA PORT RESET TMO*/
1422 saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RESET_TIME */
1423 agNULL,
1424 0,
1425 agPortContext,
1426 AGSA_PORT_SET_PORT_RESET_TIME,
1427 0,
1428 SATA_PORT_RESET_TMO // 8000 ms
1429 );
1430
1431 }
1432 else
1433 {
1434 /*
1435 an existing portcontext
1436 to be tested
1437 */
1438
1439 TI_DBG1(("ossaHwCB: SATA existing portcontext returned. need testing\n"));
1440 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
1441 /* for debugging only */
1442 if (onePortContext->valid == agFALSE)
1443 {
1444 /* port has been invalidated; needs to be allocated */
1445 TI_DBG2(("ossaHwCB: SATA allocating port context\n"));
1446 }
1447 else
1448 {
1449 /* already alloacated */
1450 TI_DBG1(("ossaHwCB: Wrong!!! SATA already allocated port context\n"));
1451 smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "Y2");
1452 return;
1453 }
1454
1455 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1456 if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
1457 {
1458 TDLIST_DEQUEUE_FROM_HEAD(&PortContextList, &(tdsaAllShared->FreePortContextList));
1459 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1460 onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, PortContextList);
1461 TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
1462 TI_DBG6(("ossaHwCB: onePortContext %p\n", onePortContext));
1463 if (onePortContext == agNULL)
1464 {
1465 TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
1466 return;
1467 }
1468
1469 /* sets fields of tdsaportcontext */
1470 onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
1471 onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
1472 onePortContext->PhyIDList[PhyID] = agTRUE;
1473 /* NO sas address for SATA */
1474 onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
1475 onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
1476 /* copying the signature */
1477 onePortContext->remoteSignature[0] = RegD2H->d.sectorCount;
1478 onePortContext->remoteSignature[1] = RegD2H->d.lbaLow;
1479 onePortContext->remoteSignature[2] = RegD2H->d.lbaMid;
1480 onePortContext->remoteSignature[3] = RegD2H->d.lbaHigh;
1481 onePortContext->remoteSignature[4] = RegD2H->d.device;
1482
1483 onePortContext->sasLocalAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&tdsaAllShared->Ports[PhyID].SASID);
1484 onePortContext->sasLocalAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&tdsaAllShared->Ports[PhyID].SASID);
1485 onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
1486 onePortContext->agRoot = agRoot;
1487 onePortContext->agPortContext = agPortContext;
1488 tdsaAllShared->Ports[PhyID].portContext = onePortContext;
1489 agPortContext->osData = onePortContext;
1490 onePortContext->nativeSATAMode = agTRUE;
1491 onePortContext->valid = agTRUE;
1492 if (LinkRate == 0x01)
1493 {
1494 onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
1495 }
1496 else if (LinkRate == 0x02)
1497 {
1498 onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
1499 }
1500 else if (LinkRate == 0x04)
1501 {
1502 onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
1503 }
1504 else /* (LinkRate == 0x08) */
1505 {
1506 onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
1507 }
1508
1509 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1510 TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
1511 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1512 }
1513 else
1514 {
1515 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1516 TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
1517 smTraceFuncExit(hpDBG_VERY_LOUD, 'k', "Y2");
1518 return;
1519 }
1520
1521
1522 /*hotplug */
1523 #ifdef SATA_ENABLE
1524 tdssAddSATAToSharedcontext(
1525 onePortContext,
1526 agRoot,
1527 agDevHandle, /* agNULL */
1528 agNULL,
1529 agTRUE,
1530 (bit8)PhyID
1531 );
1532 #endif
1533 /* end hotplug */
1534 }
1535
1536 break;
1537 }
1538 #endif
1539 case OSSA_HW_EVENT_SATA_SPINUP_HOLD:
1540 {
1541 PhyID = TD_GET_PHY_ID(eventParm1);
1542
1543 TI_DBG2(("ossaHwCB: spinup hold PhyID %d\n", PhyID));
1544 break;
1545 }
1546
1547 case OSSA_HW_EVENT_PHY_DOWN:
1548 {
1549 bit32 AllPhyDown = agTRUE;
1550
1551 /* 4/15/08 spec */
1552 PhyID = TD_GET_PHY_ID(eventParm1);
1553 LinkRate = TD_GET_LINK_RATE(eventParm1);
1554 PortState = TD_GET_PORT_STATE(eventParm1);
1555
1556
1557 TI_DBG2(("ossaHwCB: Phy%d link Down\n", PhyID));
1558
1559 if (agPortContext == agNULL)
1560 {
1561 TI_DBG1(("ossaHwCB: agPortContext null, wrong\n"));
1562 smTraceFuncExit(hpDBG_VERY_LOUD, 'l', "Y2");
1563 return;
1564 }
1565
1566 if ( agPortContext->osData == agNULL)
1567 { /* if */
1568 /* PortContext must exit at this point */
1569 TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
1570 }
1571 else
1572 {
1573 TI_DBG3(("ossaHwCB: NOT NULL portalcontext\n"));
1574 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
1575 if (onePortContext == agNULL)
1576 {
1577 TI_DBG1(("ossaHwCB: wrong !!! No corressponding tdsaPortContext\n"));
1578 smTraceFuncExit(hpDBG_VERY_LOUD, 'm', "Y2");
1579 return;
1580 }
1581 onePortContext->PhyIDList[PhyID] = agFALSE;
1582 for(i=0;i<TD_MAX_NUM_PHYS;i++)
1583 {
1584 if (onePortContext->PhyIDList[i] == agTRUE)
1585 {
1586 TI_DBG3(("ossaHwCB: Phy %d is still up\n", i));
1587 AllPhyDown = agFALSE;
1588 break;
1589 }
1590 }
1591
1592 /* last phy belong to the portcontext */
1593 if (AllPhyDown == agTRUE)
1594 {
1595 #ifdef NOT_YET
1596 TI_DBG1(("ossaHwCB: calling tiPortLinkDown\n"));
1597 ostiPortEvent (
1598 tiRoot,
1599 tiPortLinkDown,
1600 tiSuccess,
1601 (void *)onePortContext->tiPortalContext
1602 );
1603 #endif
1604 }
1605
1606 if (PortState == OSSA_PORT_VALID)
1607 {
1608 /* do nothing */
1609 /* no ack for every phy down */
1610 #ifdef FDS_DM
1611 /* update MCN for all devices belong to this port */
1612 tdsaUpdateMCN(dmRoot, onePortContext);
1613 #endif
1614 }
1615 else if (PortState == OSSA_PORT_LOSTCOMM)
1616 {
1617 /*
1618 1. Mark the port as invalid and stop the io for that port and its device
1619 No ack here. Otherwise, port will be released by FW.
1620 */
1621 TI_DBG2(("ossaHwCB: phy Down and OSSA_PORT_LOSTCOMM\n"));
1622 /* save eventSource related information in tdsaAllShared */
1623 tdsaAllShared->eventSource[PhyID].EventValid = agTRUE;
1624 tdsaAllShared->eventSource[PhyID].Source.agPortContext = agPortContext;
1625 tdsaAllShared->eventSource[PhyID].Source.event = OSSA_HW_EVENT_PHY_DOWN;
1626 /* phy ID */
1627 tdsaAllShared->eventSource[PhyID].Source.param = PhyID;
1628 /* phy ID */
1629 onePortContext->eventPhyID = PhyID;
1630 /* to stop IO's */
1631 onePortContext->valid = agFALSE;
1632 break;
1633 }
1634 else if (PortState == OSSA_PORT_IN_RESET)
1635 {
1636 TI_DBG2(("ossaHwCB: phy Down and OSSA_PORT_IN_RESET\n"));
1637 /* save eventSource related information in tdsaAllShared */
1638 tdsaAllShared->eventSource[PhyID].EventValid = agTRUE;
1639 tdsaAllShared->eventSource[PhyID].Source.agPortContext = agPortContext;
1640 tdsaAllShared->eventSource[PhyID].Source.event = OSSA_HW_EVENT_PHY_DOWN;
1641 /* phy ID */
1642 tdsaAllShared->eventSource[PhyID].Source.param = PhyID;
1643 /* phy ID */
1644 onePortContext->eventPhyID = PhyID;
1645 /* to stop IO's */
1646 onePortContext->valid = agFALSE;
1647 break;
1648 }
1649 else if (PortState == OSSA_PORT_INVALID)
1650 {
1651 TI_DBG1(("ossaHwCB: Last phy Down and port invalid OSSA_PORT_INVALID\n"));
1652 /*
1653 invalidate port
1654 then, saHwEventAck() in ossaDeregisterDeviceHandleCB()
1655 */
1656
1657 /* save eventSource related information in tdsaAllShared */
1658 tdsaAllShared->eventSource[PhyID].EventValid = agTRUE;
1659 tdsaAllShared->eventSource[PhyID].Source.agPortContext = agPortContext;
1660 tdsaAllShared->eventSource[PhyID].Source.event = OSSA_HW_EVENT_PHY_DOWN;
1661 /* phy ID */
1662 tdsaAllShared->eventSource[PhyID].Source.param = PhyID;
1663 /* phy ID */
1664 onePortContext->eventPhyID = PhyID;
1665
1666 onePortContext->valid = agFALSE;
1667
1668 TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
1669 #ifdef INITIATOR_DRIVER
1670 /* notifying link down (all links belonging to a port are down) */
1671 ostiPortEvent(
1672 tiRoot,
1673 tiPortStopped,
1674 tiSuccess,
1675 (void *)onePortContext->tiPortalContext
1676 );
1677 #endif
1678
1679 #ifdef TARGET_DRIVER
1680 ostiPortEvent(
1681 tiRoot,
1682 tiPortLinkDown,
1683 tiSuccess,
1684 (void *)onePortContext->tiPortalContext
1685 );
1686
1687 #endif
1688
1689 #ifdef INITIATOR_DRIVER
1690 tdssReportRemovals(agRoot,
1691 onePortContext,
1692 agFALSE
1693 );
1694 #endif
1695 #ifdef TARGET_DRIVER
1696 ttdssReportRemovals(agRoot,
1697 onePortContext,
1698 agFALSE
1699 );
1700
1701 #endif
1702
1703 /* find a PhyID and reset for portContext in tdssSASShared */
1704 for(i=0;i<TD_MAX_NUM_PHYS;i++)
1705 {
1706 if (onePortContext->PhyIDList[i] == agTRUE)
1707 {
1708 tdsaAllShared->Ports[i].portContext = agNULL;
1709 }
1710 }
1711 /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
1712 ossaDeregisterDeviceHandleCB
1713 */
1714 }/* OSSA_PORT_INVALID */
1715 else
1716 {
1717 /* other newly defined port state */
1718 /* do nothing */
1719 TI_DBG2(("ossaHwCB: portstate 0x%x\n", PortState));
1720 }
1721 } /* big else */
1722 break;
1723 }
1724 case OSSA_HW_EVENT_PHY_START_STATUS:
1725 {
1726 PhyID = TD_GET_PHY_ID(eventParm1);
1727 PhyStatus = TD_GET_PHY_STATUS(eventParm1);
1728
1729 TI_DBG6(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS\n"));
1730 if (PhyStatus == 0x00)
1731 {
1732 TI_DBG6(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, SUCCESS\n"));
1733 }
1734 else if (PhyStatus == 0x01)
1735 {
1736 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, INVALID_PHY\n"));
1737 }
1738 else if (PhyStatus == 0x02)
1739 {
1740 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, PHY_NOT_DISABLED\n"));
1741 }
1742 else
1743 {
1744 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, OTHER_FAILURE %d\n", PhyStatus));
1745 }
1746 break;
1747 }
1748 case OSSA_HW_EVENT_PHY_STOP_STATUS:
1749 {
1750 agsaContext_t *agContext;
1751 PhyID = TD_GET_PHY_ID(eventParm1);
1752 PhyStatus = TD_GET_PHY_STATUS(eventParm1);
1753 PortState = TD_GET_PORT_STATE(eventParm1);
1754
1755 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS\n"));
1756 if (PhyStatus == 0x00)
1757 {
1758 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, SUCCESS\n"));
1759 agContext = (agsaContext_t *)eventParm2;
1760 onePortContext = (tdsaPortContext_t *)agContext->osData;
1761 if (onePortContext == agNULL)
1762 {
1763 TI_DBG1(("ossaHwCB: onePortContext is null, wrong!!!\n"));
1764 return;
1765 }
1766 onePortContext->PhyIDList[PhyID] = agFALSE;
1767 if (PortState == OSSA_PORT_INVALID) /* invalid port */
1768 {
1769 TI_DBG1(("ossaHwCB: OSSA_PORT_INVALID\n"));
1770 tdsaAllShared->eventSource[PhyID].EventValid = NO_ACK;
1771 onePortContext->eventPhyID = PhyID;
1772 onePortContext->valid = agFALSE;
1773
1774 TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
1775 #ifdef INITIATOR_DRIVER
1776 /* notifying link down (all links belonging to a port are down) */
1777 ostiPortEvent(
1778 tiRoot,
1779 tiPortStopped,
1780 tiSuccess,
1781 (void *)onePortContext->tiPortalContext
1782 );
1783 #endif
1784
1785 #ifdef TARGET_DRIVER
1786 ostiPortEvent(
1787 tiRoot,
1788 tiPortLinkDown,
1789 tiSuccess,
1790 (void *)onePortContext->tiPortalContext
1791 );
1792
1793 #endif
1794
1795 #ifdef INITIATOR_DRIVER
1796 tdssReportRemovals(agRoot,
1797 onePortContext,
1798 agFALSE
1799 );
1800 #endif
1801 #ifdef TARGET_DRIVER
1802 ttdssReportRemovals(agRoot,
1803 onePortContext,
1804 agFALSE
1805 );
1806
1807 #endif
1808
1809 /* find a PhyID and reset for portContext in tdssSASShared */
1810 for(i=0;i<TD_MAX_NUM_PHYS;i++)
1811 {
1812 if (onePortContext->PhyIDList[i] == agTRUE)
1813 {
1814 tdsaAllShared->Ports[i].portContext = agNULL;
1815 }
1816 }
1817 /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
1818 ossaDeregisterDeviceHandleCB
1819 */
1820 } /* invalid port */
1821 }
1822 else if (PhyStatus == 0x01)
1823 {
1824 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, INVALID_PHY\n"));
1825 }
1826 else if (PhyStatus == 0x02)
1827 {
1828 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, DEVICES_ATTACHED\n"));
1829 }
1830 else if (PhyStatus == 0x03)
1831 {
1832 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, OTHER_FAILURE\n"));
1833 }
1834 else if (PhyStatus == 0x04)
1835 {
1836 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, PHY_NOT_DISABLED\n"));
1837 }
1838 else
1839 {
1840 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, Unknown %d\n", PhyStatus));
1841 }
1842 break;
1843 }
1844
1845 case OSSA_HW_EVENT_RESET_START:
1846 {
1847 bit32 new_status = TD_GET_RESET_STATUS(eventParm1);
1848 TI_DBG2(("ossaHwCB: RESET_START, status %d\n", new_status));
1849 if (new_status == OSSA_SUCCESS)
1850 {
1851 tdsaAllShared->flags.resetInProgress = agTRUE;
1852 TI_DBG2(("ossaHwCB: RESET_START, SUCCESS\n"));
1853 }
1854 else if (new_status == OSSA_FAILURE)
1855 {
1856 TI_DBG1(("ossaHwCB: RESET_START, FAILURE\n"));
1857 }
1858 else
1859 {
1860 TI_DBG1(("ossaHwCB: RESET_START, PENDING\n"));
1861 }
1862 break;
1863 }
1864
1865 case OSSA_HW_EVENT_RESET_COMPLETE:
1866 {
1867 bit32 new_status = TD_GET_RESET_STATUS(eventParm1);
1868 #ifdef SOFT_RESET_TEST
1869 DbgPrint("Reset Complete\n");
1870 #endif
1871 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_RESET_COMPLETE, status %d\n", new_status));
1872 if (new_status == OSSA_SUCCESS)
1873 {
1874 /* remove all portcontext and devices */
1875 #ifdef INITIATOR_DRIVER
1876 tdssRemoveSASSATAFromSharedcontextByReset(agRoot);
1877 #endif
1878 tdsaAllShared->flags.resetInProgress = agFALSE;
1879 /*
1880 a callback notifying reset completion
1881 */
1882 ostiPortEvent(
1883 tiRoot,
1884 tiPortResetComplete,
1885 tiSuccess,
1886 agNULL
1887 );
1888 }
1889 else
1890 {
1891 /*
1892 a callback notifying reset completion
1893 */
1894 tdsaAllShared->flags.resetInProgress = agFALSE;
1895 ostiPortEvent(
1896 tiRoot,
1897 tiPortResetComplete,
1898 tiError,
1899 agNULL
1900 );
1901
1902 }
1903 break;
1904 }
1905
1906 case OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC:
1907 {
1908 PhyID = TD_GET_PHY_ID(eventParm1);
1909 PortState = TD_GET_PORT_STATE(eventParm1);
1910 agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
1911
1912 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC from PhyID %d; to be tested\n", PhyID));
1913
1914 if (PortState == OSSA_PORT_INVALID)
1915 {
1916 TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC\n"));
1917 smTraceFuncExit(hpDBG_VERY_LOUD, 'n', "Y2");
1918 return;
1919 }
1920
1921 if (agPhyErrCountersPage != agNULL)
1922 {
1923 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC from PhyID %d\n", PhyID));
1924 TI_DBG1(("ossaHwCB: iDw %d rDE %d cV %d lS %d rP %d iCRC %d\n",
1925 agPhyErrCountersPage->invalidDword,
1926 agPhyErrCountersPage->runningDisparityError,
1927 agPhyErrCountersPage->codeViolation,
1928 agPhyErrCountersPage->lossOfDwordSynch,
1929 agPhyErrCountersPage->phyResetProblem,
1930 agPhyErrCountersPage->inboundCRCError ));
1931 }
1932 else
1933 {
1934 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC: Error!!! eventParm2 is NULL\n"));
1935 }
1936
1937 /* saHwEventAck() */
1938 eventSource.agPortContext = agPortContext;
1939 eventSource.event = OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC;
1940 /* phy ID */
1941 eventSource.param = PhyID;
1942 HwAckSatus = saHwEventAck(
1943 agRoot,
1944 agNULL, /* agContext */
1945 0,
1946 &eventSource, /* agsaEventSource_t */
1947 0,
1948 0
1949 );
1950 if ( HwAckSatus != AGSA_RC_SUCCESS)
1951 {
1952 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
1953 smTraceFuncExit(hpDBG_VERY_LOUD, 'o', "Y2");
1954 return;
1955 }
1956 break;
1957 }
1958 #ifdef REMOVED
1959 case OSSA_HW_EVENT_PORT_INVALID:
1960 {
1961 TI_DBG1(("ossaHwCB: PORT_INVALID\n"));
1962
1963 if ( agPortContext == agNULL)
1964 {
1965 TI_DBG1(("ossaHwCB: agPortContext is NULL, wrong.\n"));
1966 smTraceFuncExit(hpDBG_VERY_LOUD, 'p', "Y2");
1967 return;
1968 }
1969 if ( agPortContext->osData != agNULL)
1970 {
1971 TI_DBG1(("ossaHwCB: NOT NULL osDATA\n"));
1972 /*
1973 put the old portcontext back to free list
1974 */
1975 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
1976 TI_DBG1(("ossaHwCB: pid %d\n", onePortContext->id));
1977
1978 #ifdef INITIATOR_DRIVER
1979 /* notifying link down (all links belonging to a port are down) */
1980 ostiPortEvent (
1981 tiRoot,
1982 tiPortStopped,
1983 tiSuccess,
1984 (void *)onePortContext->tiPortalContext
1985
1986 );
1987 #endif /* INITIATOR_DRIVER */
1988 #ifdef TARGET_DRIVER
1989 ostiPortEvent(
1990 tiRoot,
1991 tiPortLinkDown,
1992 tiSuccess,
1993 (void *)onePortContext->tiPortalContext
1994 );
1995
1996 #endif /*TARGET_DRIVER */
1997
1998 /* find the device belonging to the port and remove it from the device list */
1999 //tdssRemoveSASSATAFromSharedcontext(agRoot, tdsaDeviceData, onePortContext);
2000
2001
2002 #ifdef INITIATOR_DRIVER
2003 /* reset the fields of portcontext */
2004 onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
2005 tdssReportRemovals(agRoot,
2006 onePortContext,
2007 agFALSE
2008 );
2009
2010 onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
2011 onePortContext->DiscoveryRdyGiven = agFALSE;
2012 onePortContext->SeenLinkUp = agFALSE;
2013
2014 #endif /* INITIATOR_DRIVER */
2015
2016
2017
2018 /* for hotplug */
2019
2020 /* find a PhyID and reset for portContext in tdssSASShared */
2021 for(i=0;i<TD_MAX_NUM_PHYS;i++)
2022 {
2023 if (onePortContext->PhyIDList[i] == agTRUE)
2024 {
2025 tdsaAllShared->Ports[i].portContext = agNULL;
2026 }
2027 }
2028
2029 /* reset PhyIDList in portcontext */
2030 for(i=0;i<TD_MAX_NUM_PHYS;i++)
2031 {
2032 onePortContext->PhyIDList[i] = agFALSE;
2033 }
2034
2035 // onePortContext->tiPortalContext = agNULL;
2036 // onePortContext->agRoot = agNULL;
2037 onePortContext->agPortContext = agNULL;
2038 onePortContext->valid = agFALSE;
2039
2040 TI_DBG4(("ossaHwCB: pid %d count %d\n", onePortContext->id, onePortContext->Count));
2041
2042 /* resets the number of devices in onePortContext */
2043 onePortContext->Count = 0;
2044 onePortContext->discovery.pendingSMP = 0;
2045 onePortContext->discovery.SeenBC = agFALSE;
2046
2047
2048 /*
2049 put all devices belonging to the onePortContext
2050 back to the free link
2051 */
2052
2053 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
2054 TDLIST_DEQUEUE_THIS(&(onePortContext->MainLink));
2055 TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->FreeLink), &(tdsaPortContext->FreeLink));
2056 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
2057 }
2058 else
2059 {
2060 TI_DBG1(("ossaHwCB: NULL osDATA: wrong\n"));
2061 }
2062 TI_DBG6(("ossaHwCB: PORT_INVALID end\n"));
2063 break;
2064 }
2065 #endif /* REMOVED */
2066
2067 case OSSA_HW_EVENT_BROADCAST_CHANGE:
2068 {
2069 PhyID = TD_GET_PHY_ID(eventParm1);
2070 PortState = TD_GET_PORT_STATE(eventParm1);
2071 TI_DBG1(("ossaHwCB: BROADCAST_CHANGE from PhyID %d\n", PhyID));
2072
2073 if (PortState == OSSA_PORT_INVALID)
2074 {
2075 TI_DBG1(("ossaHwCB: Wrong port state with BROADCAST_CHANGE\n"));
2076 smTraceFuncExit(hpDBG_VERY_LOUD, 'q', "Y2");
2077 return;
2078 }
2079 /* saHwEventAck() */
2080 eventSource.agPortContext = agPortContext;
2081 eventSource.event = OSSA_HW_EVENT_BROADCAST_CHANGE;
2082 /* phy ID */
2083 eventSource.param = PhyID;
2084 HwAckSatus = saHwEventAck(
2085 agRoot,
2086 agNULL, /* agContext */
2087 0,
2088 &eventSource, /* agsaEventSource_t */
2089 0,
2090 0
2091 );
2092 TI_DBG4(("ossaHwCB: calling saHwEventAck\n"));
2093
2094 if ( HwAckSatus != AGSA_RC_SUCCESS)
2095 {
2096 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
2097 smTraceFuncExit(hpDBG_VERY_LOUD, 'r', "Y2");
2098 return;
2099 }
2100 if (tIsSPC12SATA(agRoot))
2101 {
2102 TI_DBG1(("ossaHwCB: BROADCAST_CHANGE received for SATA Controller\n"));
2103 break;
2104 }
2105 /*
2106 * incremental discovery is to be tested and debugged further
2107 */
2108
2109 /* just for testing discovery abort */
2110 #ifdef FDS_DM_NO
2111 if (agPortContext == agNULL)
2112 {
2113 /* this case happens when broadcase is received first before the link up */
2114 TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
2115 }
2116 else if ( agPortContext->osData != agNULL)
2117 {
2118 dmRoot = &(tdsaAllShared->dmRoot);
2119 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2120 dmPortContext = &(onePortContext->dmPortContext);
2121
2122 dmQueryDiscovery(dmRoot, dmPortContext);
2123 // dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_ABORT);
2124
2125 #if 1
2126 if (onePortContext->DMDiscoveryState == dmDiscInProgress)
2127 {
2128 dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_ABORT);
2129 }
2130 #endif /* 1 */
2131
2132 TI_DBG2(("ossaHwCB: portcontext pid %d\n", onePortContext->id));
2133 if (onePortContext->DMDiscoveryState == dmDiscCompleted ||
2134 onePortContext->DMDiscoveryState == dmDiscAborted ||
2135 onePortContext->DMDiscoveryState == dmDiscAbortInvalid )
2136 {
2137 TI_DBG1(("ossaHwCB: BROADCAST_CHANGE; calling dmNotifyBC and does incremental discovery\n"));
2138 dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2139 dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_INCREMENTAL_START);
2140
2141 }
2142 else
2143 {
2144 TI_DBG2(("ossaHwCB: pid %d BROADCAST_CHANGE; updating SeenBC. calling dmNotifyBC\n", onePortContext->id));
2145 dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2146 }
2147 }
2148 else
2149 {
2150 TI_DBG1(("ossaHwCB: BROADCAST_CHANGE NULL osDATA wrong !!! \n"));
2151 }
2152
2153
2154 #endif /* FDS_DM_NO */
2155
2156 #ifdef FDS_DM
2157 if (agPortContext == agNULL)
2158 {
2159 /* this case happens when broadcase is received first before the link up */
2160 TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
2161 }
2162 else if ( agPortContext->osData != agNULL)
2163 {
2164 dmRoot = &(tdsaAllShared->dmRoot);
2165 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2166 dmPortContext = &(onePortContext->dmPortContext);
2167
2168 dmQueryDiscovery(dmRoot, dmPortContext);
2169
2170 TI_DBG2(("ossaHwCB: portcontext pid %d\n", onePortContext->id));
2171 if (onePortContext->DMDiscoveryState == dmDiscCompleted ||
2172 onePortContext->DMDiscoveryState == dmDiscAborted ||
2173 onePortContext->DMDiscoveryState == dmDiscAbortInvalid )
2174 {
2175 TI_DBG1(("ossaHwCB: BROADCAST_CHANGE; calling dmNotifyBC and does incremental discovery, pid %d\n", onePortContext->id));
2176 onePortContext->DiscoveryState = ITD_DSTATE_STARTED;
2177 dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2178 dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_INCREMENTAL_START);
2179
2180 }
2181 else if (onePortContext->DMDiscoveryState == dmDiscFailed )
2182 {
2183 TI_DBG1(("ossaHwCB: dmDiscFailed; pid %d BROADCAST_CHANGE; updating SeenBC. calling dmNotifyBC\n", onePortContext->id));
2184 onePortContext->DiscFailNSeenBC = agTRUE;
2185 dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2186 }
2187 else
2188 {
2189 TI_DBG2(("ossaHwCB: pid %d BROADCAST_CHANGE; updating SeenBC. calling dmNotifyBC\n", onePortContext->id));
2190 dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2191 }
2192 }
2193 else
2194 {
2195 TI_DBG1(("ossaHwCB: BROADCAST_CHANGE NULL osDATA wrong !!! \n"));
2196 }
2197 #endif /* FDS_DM */
2198
2199 #ifdef FDS_DM_WORKED
2200 if (agPortContext == agNULL)
2201 {
2202 /* this case happens when broadcase is received first before the link up */
2203 TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
2204 }
2205 else if ( agPortContext->osData != agNULL)
2206 {
2207 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2208 TI_DBG2(("ossaHwCB: calling dmNotifyBC\n"));
2209 dmRoot = &(tdsaAllShared->dmRoot);
2210 dmPortContext = &(onePortContext->dmPortContext);
2211 dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2212 }
2213 #endif /* FDS_DM_WORKED */
2214
2215 #ifndef FDS_DM
2216 #ifdef INITIATOR_DRIVER
2217 if (agPortContext == agNULL)
2218 {
2219 /* this case happens when broadcase is received first before the link up */
2220 TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
2221 }
2222 else if ( agPortContext->osData != agNULL)
2223 {
2224 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2225 TI_DBG2(("ossaHwCB: portcontext pid %d\n", onePortContext->id));
2226 if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
2227 {
2228 TI_DBG1(("ossaHwCB: BROADCAST_CHANGE; does incremental discovery\n"));
2229 onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
2230 onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_INCREMENTAL_START;
2231 /* processed broadcast change */
2232 onePortContext->discovery.SeenBC = agFALSE;
2233 #ifdef TD_DISCOVER
2234 if (tdsaAllShared->ResetInDiscovery != 0 &&
2235 onePortContext->discovery.ResetTriggerred == agTRUE)
2236 {
2237 TI_DBG2(("ossaHwCB: tdsaBCTimer\n"));
2238 tdsaBCTimer(tiRoot, onePortContext);
2239 }
2240 else
2241 {
2242 tdsaDiscover(
2243 tiRoot,
2244 onePortContext,
2245 TDSA_DISCOVERY_TYPE_SAS,
2246 TDSA_DISCOVERY_OPTION_INCREMENTAL_START
2247 );
2248 }
2249 #else
2250 saDiscover(agRoot,
2251 agPortContext,
2252 AG_SA_DISCOVERY_TYPE_SAS,
2253 onePortContext->discoveryOptions);
2254 #endif
2255 }
2256 else
2257 {
2258 TI_DBG2(("ossaHwCB: pid %d BROADCAST_CHANGE; updating SeenBC. Do nothing.\n", onePortContext->id));
2259 onePortContext->discovery.SeenBC = agTRUE;
2260 }
2261 }
2262 else
2263 {
2264 TI_DBG1(("ossaHwCB: BROADCAST_CHANGE NULL osDATA wrong !!! \n"));
2265 }
2266 #endif
2267 #endif /* ifndef FDS_DM */
2268
2269 break;
2270 }
2271
2272 case OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO:
2273 {
2274 PhyID = TD_GET_PHY_ID(eventParm1);
2275 PortState = TD_GET_PORT_STATE(eventParm1);
2276
2277 /*
2278 1. tear town the portcontext just like link down last phy down
2279 2. ack
2280 port state must be invalid
2281 */
2282
2283 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO\n"));
2284
2285 if (PortState == OSSA_PORT_VALID)
2286 {
2287 TI_DBG1(("ossaHwCB: Wrong port state\n"));
2288 smTraceFuncExit(hpDBG_VERY_LOUD, 's', "Y2");
2289 return;
2290 }
2291
2292 TD_ASSERT(agPortContext, "agPortContext");
2293 if ( agPortContext->osData == agNULL)
2294 { /* if */
2295 /* PortContext must exit at this point */
2296 TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
2297 }
2298 else
2299 {
2300 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2301 onePortContext->valid = agFALSE;
2302
2303 TI_DBG1(("ossaHwCB: tiPortStopped pid %d\n", onePortContext->id));
2304 #ifdef INITIATOR_DRIVER
2305 /* notifying link down (all links belonging to a port are down) */
2306 ostiPortEvent(
2307 tiRoot,
2308 tiPortStopped,
2309 tiSuccess,
2310 (void *)onePortContext->tiPortalContext
2311 );
2312 #endif
2313
2314 #ifdef TARGET_DRIVER
2315 ostiPortEvent(
2316 tiRoot,
2317 tiPortLinkDown,
2318 tiSuccess,
2319 (void *)onePortContext->tiPortalContext
2320 );
2321
2322 #endif
2323
2324 #ifdef INITIATOR_DRIVER
2325 tdssReportRemovals(agRoot,
2326 onePortContext,
2327 agFALSE
2328 );
2329 #endif
2330 #ifdef TARGET_DRIVER
2331 ttdssReportRemovals(agRoot,
2332 onePortContext,
2333 agFALSE
2334 );
2335
2336 #endif
2337 /* find a PhyID and reset for portContext in tdssSASShared */
2338 for(i=0;i<TD_MAX_NUM_PHYS;i++)
2339 {
2340 if (onePortContext->PhyIDList[i] == agTRUE)
2341 {
2342 tdsaAllShared->Ports[i].portContext = agNULL;
2343 }
2344 }
2345 /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
2346 ossaDeregisterDeviceHandleCB
2347 */
2348 }
2349
2350 break;
2351 }
2352
2353 case OSSA_HW_EVENT_PORT_RESET_TIMER_TMO:
2354 {
2355 /*
2356 clean up
2357 */
2358 PhyID = TD_GET_PHY_ID(eventParm1);
2359 PortState = TD_GET_PORT_STATE(eventParm1);
2360
2361 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RESET_TIMER_TMO\n"));
2362
2363 if (PortState == OSSA_PORT_VALID)
2364 {
2365 TI_DBG1(("ossaHwCB: Wrong port state\n"));
2366 smTraceFuncExit(hpDBG_VERY_LOUD, 't', "Y2");
2367 return;
2368 }
2369
2370 if (agPortContext == agNULL)
2371 {
2372 TI_DBG1(("ossaHwCB: agPortContext is NULL, error\n"));
2373 smTraceFuncExit(hpDBG_VERY_LOUD, 'u', "Y2");
2374 return;
2375 }
2376
2377 if ( agPortContext->osData == agNULL)
2378 { /* if */
2379 /* PortContext must exit at this point */
2380 TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
2381 }
2382 else
2383 {
2384 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2385 onePortContext->valid = agFALSE;
2386
2387 TI_DBG1(("ossaHwCB: pid %d tiPortStopped\n", onePortContext->id));
2388
2389 #ifdef INITIATOR_DRIVER
2390 /* notifying link down (all links belonging to a port are down) */
2391 ostiPortEvent(
2392 tiRoot,
2393 tiPortStopped,
2394 tiSuccess,
2395 (void *)onePortContext->tiPortalContext
2396 );
2397 #endif
2398
2399 #ifdef TARGET_DRIVER
2400 ostiPortEvent(
2401 tiRoot,
2402 tiPortLinkDown,
2403 tiSuccess,
2404 (void *)onePortContext->tiPortalContext
2405 );
2406
2407 #endif
2408
2409 #ifdef INITIATOR_DRIVER
2410 tdssReportRemovals(agRoot,
2411 onePortContext,
2412 agFALSE
2413 );
2414 #endif
2415 #ifdef TARGET_DRIVER
2416 ttdssReportRemovals(agRoot,
2417 onePortContext,
2418 agFALSE
2419 );
2420
2421 #endif
2422 /* find a PhyID and reset for portContext in tdssSASShared */
2423 for(i=0;i<TD_MAX_NUM_PHYS;i++)
2424 {
2425 if (onePortContext->PhyIDList[i] == agTRUE)
2426 {
2427 tdsaAllShared->Ports[i].portContext = agNULL;
2428 }
2429 }
2430 /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
2431 ossaDeregisterDeviceHandleCB
2432 */
2433 }
2434
2435 break;
2436 }
2437
2438 case OSSA_HW_EVENT_PORT_RESET_COMPLETE:
2439 {
2440 #ifdef INITIATOR_DRIVER
2441 tiIORequest_t *currentTaskTag = agNULL;
2442 #endif
2443
2444 #ifdef REMOVED
2445 smRoot_t *smRoot = &(tdsaAllShared->smRoot);
2446 #endif
2447
2448 PhyID = TD_GET_PHY_ID(eventParm1);
2449 PortState = TD_GET_PORT_STATE(eventParm1);
2450 IDframe = (agsaSASIdentify_t *)eventParm3;
2451
2452 /* completes for Lun Reset and Target reset for directly attached SATA */
2453 /* completes for Target reset for directly attached SAS */
2454
2455 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PORT_RESET_COMPLETE, phyID %d\n", PhyID));
2456
2457 /* error check */
2458 if (PortState == OSSA_PORT_INVALID)
2459 {
2460 TI_DBG1(("ossaHwCB: Wrong port state\n"));
2461 smTraceFuncExit(hpDBG_VERY_LOUD, 'v', "Y2");
2462 return;
2463 }
2464
2465 if (agPortContext == agNULL)
2466 {
2467 TI_DBG1(("ossaHwCB: agPortContext null, wrong\n"));
2468 smTraceFuncExit(hpDBG_VERY_LOUD, 'w', "Y2");
2469 return;
2470 }
2471 if ( agPortContext->osData == agNULL)
2472 {
2473 TI_DBG1(("ossaHwCB: agPortContext->osData null, wrong\n"));
2474 smTraceFuncExit(hpDBG_VERY_LOUD, 'x', "Y2");
2475 return;
2476 }
2477
2478 /* find a corresponding portcontext */
2479 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2480
2481 if (onePortContext == agNULL)
2482 {
2483 TI_DBG1(("ossaHwCB: oneportContext is NULL; wrong??????\n"));
2484 }
2485 else
2486 {
2487 TI_DBG1(("ossaHwCB: oneportContext %p pid %d\n", onePortContext, onePortContext->id));
2488 onePortContext->valid = agTRUE;
2489 #ifdef INITIATOR_DRIVER
2490 #ifdef REMOVED
2491 if (tdsaAllShared->ResetInDiscovery != 0)
2492 {
2493 DeviceListList = tdsaAllShared->MainDeviceList.flink;
2494 while (DeviceListList != &(tdsaAllShared->MainDeviceList))
2495 {
2496 oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
2497 if (oneDeviceData->tdPortContext != onePortContext)
2498 {
2499 DeviceListList = DeviceListList->flink;
2500 }
2501 else
2502 {
2503 found = agTRUE;
2504 break;
2505 }
2506 } /* while */
2507 if (found == agTRUE)
2508 {
2509 /* applied to only SATA devices */
2510 if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
2511 {
2512 #ifdef FDS_SM
2513 tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
2514 #else
2515 tdssRetrySATAID(tiRoot, oneDeviceData);
2516 #endif
2517 }
2518 }
2519 else
2520 {
2521 TI_DBG1(("ossaHwCB: no onedevicedata found!\n"));
2522 }
2523 }
2524 #endif
2525 /* completed TM */
2526 DeviceListList = tdsaAllShared->MainDeviceList.flink;
2527 while (DeviceListList != &(tdsaAllShared->MainDeviceList))
2528 {
2529 oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
2530 if ( oneDeviceData == agNULL)
2531 {
2532 TI_DBG1(("ossaHwCB: oneDeviceData is NULL!!!\n"));
2533 return;
2534 }
2535
2536 if ( (oneDeviceData->tdPortContext == onePortContext) &&
2537 (oneDeviceData->directlyAttached == agTRUE) &&
2538 (oneDeviceData->phyID == PhyID) )
2539 {
2540 TI_DBG1(("ossaHwCB: found the onePortContext and oneDeviceData!!\n"));
2541
2542 currentTaskTag = (tiIORequest_t *)oneDeviceData->agDeviceResetContext.osData;
2543 if (currentTaskTag != agNULL )
2544 {
2545 /* applied to only SATA devices */
2546 if (DEVICE_IS_SATA_DEVICE(oneDeviceData))
2547 {
2548 tdIORequestBody_t *SMTMtdIORequestBody = agNULL;
2549 SMTMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData;
2550 if (SMTMtdIORequestBody != agNULL)
2551 {
2552 /* free the SMTMtdIORequestBody memory allocated in tiINITaskManagement function */
2553 ostiFreeMemory(
2554 tiRoot,
2555 SMTMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
2556 sizeof(tdIORequestBody_t)
2557 );
2558 }
2559 else
2560 {
2561 TI_DBG1(("ossaHwCB: SATA device but SMTMtdIORequestBody is NULL!!!\n"));
2562 }
2563 }
2564 /* set device state to DS_OPERATIONAL */
2565 saSetDeviceState(agRoot,
2566 agNULL,
2567 tdsaRotateQnumber(tiRoot, oneDeviceData),
2568 oneDeviceData->agDevHandle,
2569 SA_DS_OPERATIONAL
2570 );
2571 /* notify OS layer to complete the TMF IO */
2572 ostiInitiatorEvent(tiRoot,
2573 agNULL,
2574 agNULL,
2575 tiIntrEventTypeTaskManagement,
2576 tiTMOK,
2577 currentTaskTag
2578 );
2579
2580 }
2581 else
2582 {
2583 TI_DBG1(("ossaHwCB: currentTaskTag is NULL!!!\n"));
2584 }
2585
2586 break;
2587 }
2588 else
2589 {
2590 DeviceListList = DeviceListList->flink;
2591 }
2592 }
2593 #endif
2594 }
2595 break;
2596 }
2597 case OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT:
2598 {
2599 PhyID = TD_GET_PHY_ID(eventParm1);
2600 PortState = TD_GET_PORT_STATE(eventParm1);
2601
2602 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT\n"));
2603 if (tIsSPC12SATA(agRoot))
2604 {
2605 TI_DBG1(("ossaHwCB: BROADCAST_ASYNCH_EVENT received for SATA Controller\n"));
2606 break;
2607 }
2608 if (agPortContext == agNULL)
2609 {
2610 TI_DBG1(("ossaHwCB: Error!!! agPortContext is NULL %d\n", PhyID));
2611 smTraceFuncExit(hpDBG_VERY_LOUD, 'y', "Y2");
2612 return;
2613 }
2614 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2615 if (onePortContext == agNULL)
2616 {
2617 TI_DBG1(("ossaHwCB: Error!!! onePortContext is NULL %d\n", PhyID));
2618 smTraceFuncExit(hpDBG_VERY_LOUD, 'z', "Y2");
2619 return;
2620 }
2621
2622 if (onePortContext->tiPortalContext != agNULL)
2623 {
2624 #if 0
2625 ostiInitiatorEvent(
2626 tiRoot,
2627 onePortContext->tiPortalContext,
2628 agNULL,
2629 tiIntrEventTypeDeviceChange,
2630 OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT,
2631 agNULL
2632 );
2633 #endif
2634 }
2635 else
2636 {
2637 TI_DBG1(("ossaHwCB: Error!!! onePortContext->tiPortalContext is NULL\n"));
2638 smTraceFuncExit(hpDBG_VERY_LOUD, 'A', "Y2");
2639 return;
2640 }
2641
2642 break;
2643 }
2644
2645 case OSSA_HW_EVENT_PORT_RECOVER:
2646 {
2647
2648 PhyID = TD_GET_PHY_ID(eventParm1);
2649 if (agPortContext == agNULL)
2650 {
2651 TI_DBG1(("ossaHwCB: Error!!! agPortContext is NULL %d\n", PhyID));
2652 smTraceFuncExit(hpDBG_VERY_LOUD, 'B', "Y2");
2653 return;
2654 }
2655
2656 LinkRate = TD_GET_LINK_RATE(eventParm1);
2657 PortState = TD_GET_PORT_STATE(eventParm1);
2658 agDevHandle = agNULL;
2659 IDframe = (agsaSASIdentify_t *)eventParm3;
2660
2661 /*
2662 1. this is like link up
2663 2. handle the phyID
2664 3. no trigger discovery (broadcast change will do this later)
2665 port state must be valid
2666 */
2667
2668 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVER, phyID %d\n", PhyID));
2669
2670 if (PortState == OSSA_PORT_INVALID)
2671 {
2672 TI_DBG1(("ossaHwCB: Wrong port state\n"));
2673 smTraceFuncExit(hpDBG_VERY_LOUD, 'C', "Y2");
2674 return;
2675 }
2676 if ( agPortContext->osData == agNULL)
2677 { /* if */
2678 /* PortContext must exit at this point */
2679 TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
2680 }
2681 else
2682 {
2683 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2684 TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
2685 onePortContext->PhyIDList[PhyID] = agTRUE;
2686 onePortContext->valid = agTRUE;
2687 tdsaAllShared->Ports[PhyID].portContext = onePortContext;
2688 onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
2689 onePortContext->PortRecoverPhyID = PhyID;
2690 if (LinkRate == 0x01)
2691 {
2692 onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
2693 }
2694 else if (LinkRate == 0x02)
2695 {
2696 onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
2697 }
2698 else if (LinkRate == 0x04)
2699 {
2700 onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
2701 }
2702 else /* (LinkRate == 0x08) */
2703 {
2704 onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
2705 }
2706
2707 if (SA_IDFRM_GET_DEVICETTYPE(&onePortContext->sasIDframe) == SAS_END_DEVICE &&
2708 SA_IDFRM_IS_SSP_TARGET(&onePortContext->sasIDframe) )
2709 {
2710 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVER, sending spinup on phyID %d\n", PhyID));
2711 for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
2712 {
2713 saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
2714 }
2715 }
2716
2717 /* transient period between link up and link down/port recovery */
2718 if (onePortContext->Transient == agTRUE && onePortContext->RegisteredDevNums == 0)
2719 {
2720 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVER transient period"));
2721 if (SA_IDFRM_GET_DEVICETTYPE(IDframe) != SAS_NO_DEVICE)
2722 {
2723 #ifdef INITIATOR_DRIVER
2724 agSASSubID.sasAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(IDframe);
2725 agSASSubID.sasAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(IDframe);
2726 agSASSubID.initiator_ssp_stp_smp = IDframe->initiator_ssp_stp_smp;
2727 agSASSubID.target_ssp_stp_smp = IDframe->target_ssp_stp_smp;
2728 tdssAddSASToSharedcontext(
2729 onePortContext,
2730 agRoot,
2731 agDevHandle, /* agNULL */
2732 &agSASSubID,
2733 agTRUE,
2734 (bit8)PhyID,
2735 TD_OPERATION_INITIATOR
2736 );
2737 #endif
2738 }
2739 onePortContext->Transient = agFALSE;
2740 }
2741
2742
2743
2744
2745 }
2746 break;
2747 }
2748
2749 case OSSA_HW_EVENT_BROADCAST_SES:
2750 {
2751 PhyID = TD_GET_PHY_ID(eventParm1);
2752 PortState = TD_GET_PORT_STATE(eventParm1);
2753
2754 TI_DBG2(("ossaHwCB: BROADCAST_SES from PhyID %d; to be tested\n", PhyID));
2755 if (tIsSPC12SATA(agRoot))
2756 {
2757 TI_DBG1(("ossaHwCB: BROADCAST_SES received for SATA Controller\n"));
2758 break;
2759 }
2760 if (PortState == OSSA_PORT_INVALID)
2761 {
2762 TI_DBG1(("ossaHwCB: Wrong port state with BROADCAST_SES\n"));
2763 smTraceFuncExit(hpDBG_VERY_LOUD, 'D', "Y2");
2764 return;
2765 }
2766
2767 /*
2768 let os layer read payload
2769 */
2770 break;
2771 }
2772 case OSSA_HW_EVENT_BROADCAST_EXP:
2773 {
2774 PhyID = TD_GET_PHY_ID(eventParm1);
2775 PortState = TD_GET_PORT_STATE(eventParm1);
2776
2777 TI_DBG2(("ossaHwCB: BROADCAST_EXP from PhyID %d; to be tested\n", PhyID));
2778 if (tIsSPC12SATA(agRoot))
2779 {
2780 TI_DBG1(("ossaHwCB: BROADCAST_EXP received for SATA Controller\n"));
2781 break;
2782 }
2783
2784 if (PortState == OSSA_PORT_INVALID)
2785 {
2786 TI_DBG1(("ossaHwCB: Wrong port state with BROADCAST_EXP\n"));
2787 smTraceFuncExit(hpDBG_VERY_LOUD, 'E', "Y2");
2788 return;
2789 }
2790 /* to-do:
2791 let os layer read payload
2792 */
2793 break;
2794 }
2795
2796 case OSSA_HW_EVENT_HARD_RESET_RECEIVED:
2797 {
2798 PhyID = TD_GET_PHY_ID(eventParm1);
2799 PortState = TD_GET_PORT_STATE(eventParm1);
2800
2801 TI_DBG2(("ossaHwCB: HARD_RESET_RECEIVED from PhyID %d\n", PhyID));
2802
2803 if (PortState == OSSA_PORT_VALID && tiIS_SPC(agRoot))
2804 {
2805 TI_DBG1(("ossaHwCB: calling saPortControl and OSSA_PORT_VALID\n"));
2806 saPortControl(agRoot, agNULL, 0, agPortContext, AGSA_PORT_HARD_RESET, 0,0);
2807 }
2808 else if (PortState == OSSA_PORT_3RDPARTY_RESET && (tIsSPCV12or6G(agRoot)) )
2809 {
2810 TI_DBG1(("ossaHwCB: calling saPortControl and OSSA_PORT_3RDPARTY_RESET\n"));
2811 saPortControl(agRoot, agNULL, 0, agPortContext, AGSA_PORT_HARD_RESET, 0,0);
2812 }
2813 else /* PortState == OSSA_PORT_INVALID */
2814 {
2815 TI_DBG1(("ossaHwCB: Error. Port state is invalid\n"));
2816 #ifdef REMOVED
2817 TI_DBG1(("ossaHwCB: calling saLocalPhyControl on phyID %d\n", PhyID));
2818 saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_LINK_RESET, agNULL);
2819 #endif
2820 }
2821
2822 break;
2823 }
2824
2825 case OSSA_HW_EVENT_MALFUNCTION:
2826 {
2827 #ifdef TD_DEBUG_ENABLE
2828 agsaFatalErrorInfo_t *FatalError = (agsaFatalErrorInfo_t *)eventParm2;
2829 #endif
2830 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_MALFUNCTION \n"));
2831 TI_DBG1(("ossaHwCB: errorInfo0 %8X errorInfo1 %8X\n", FatalError->errorInfo0, FatalError->errorInfo1));
2832 TI_DBG1(("ossaHwCB: errorInfo2 %8X errorInfo3 %8X\n", FatalError->errorInfo2, FatalError->errorInfo3));
2833 TI_DBG1(("ossaHwCB: regDumpBusBaseNum0 %8X regDumpOffset0 %8X regDumpLen0 %8X\n", FatalError->regDumpBusBaseNum0, FatalError->regDumpOffset0, FatalError->regDumpLen0));
2834 TI_DBG1(("ossaHwCB: regDumpBusBaseNum1 %8X regDumpOffset1 %8X regDumpLen1 %8X\n", FatalError->regDumpBusBaseNum1, FatalError->regDumpOffset1, FatalError->regDumpLen1));
2835
2836
2837 if (eventParm1 == agTRUE)
2838 {
2839 TI_DBG1(("ossaHwCB: fatal error\n"));
2840 /* port panic */
2841 ostiPortEvent (
2842 tiRoot,
2843 tiPortPanic,
2844 0,
2845 agNULL
2846 );
2847 }
2848 else
2849 {
2850 TI_DBG1(("ossaHwCB: non-fatal error \n"));
2851 }
2852 break;
2853 }
2854
2855 case OSSA_HW_EVENT_ID_FRAME_TIMEOUT:
2856 {
2857 PhyID = TD_GET_PHY_ID(eventParm1);
2858 PortState = TD_GET_PORT_STATE(eventParm1);
2859
2860 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_ID_FRAME_TIMEOUT from PhyID %d\n", PhyID));
2861
2862 if (PortState == OSSA_PORT_INVALID)
2863 {
2864 TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_ID_FRAME_TIMEOUT\n"));
2865 smTraceFuncExit(hpDBG_VERY_LOUD, 'F', "Y2");
2866 return;
2867 }
2868 break;
2869 }
2870
2871 case OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD:
2872 {
2873 PhyID = TD_GET_PHY_ID(eventParm1);
2874 PortState = TD_GET_PORT_STATE(eventParm1);
2875 agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
2876 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD\n"));
2877
2878 if (PortState == OSSA_PORT_INVALID)
2879 {
2880 TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD\n"));
2881 smTraceFuncExit(hpDBG_VERY_LOUD, 'G', "Y2");
2882 return;
2883 }
2884
2885 if (agPhyErrCountersPage != agNULL)
2886 {
2887 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD from PhyID %d\n", PhyID));
2888 TI_DBG1(("ossaHwCB: invalidDword %d\n", agPhyErrCountersPage->invalidDword));
2889 }
2890 else
2891 {
2892 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD: Error!!! eventParm2 is NULL\n"));
2893 }
2894
2895 /* saHwEventAck() */
2896 eventSource.agPortContext = agPortContext;
2897 eventSource.event = OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD;
2898 /* phy ID */
2899 eventSource.param = PhyID;
2900 HwAckSatus = saHwEventAck(
2901 agRoot,
2902 agNULL, /* agContext */
2903 0,
2904 &eventSource, /* agsaEventSource_t */
2905 0,
2906 0
2907 );
2908 if ( HwAckSatus != AGSA_RC_SUCCESS)
2909 {
2910 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
2911 smTraceFuncExit(hpDBG_VERY_LOUD, 'H', "Y2");
2912 return;
2913 }
2914
2915 break;
2916 }
2917
2918 case OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR:
2919 {
2920 PhyID = TD_GET_PHY_ID(eventParm1);
2921 PortState = TD_GET_PORT_STATE(eventParm1);
2922 agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
2923 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR\n"));
2924
2925 if (PortState == OSSA_PORT_INVALID)
2926 {
2927 TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR\n"));
2928 smTraceFuncExit(hpDBG_VERY_LOUD, 'I', "Y2");
2929 return;
2930 }
2931
2932 if (agPhyErrCountersPage != agNULL)
2933 {
2934 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR from PhyID %d\n", PhyID));
2935 TI_DBG1(("ossaHwCB: runningDisparityError %d\n", agPhyErrCountersPage->runningDisparityError));
2936 }
2937 else
2938 {
2939 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR: Error!!! eventParm2 is NULL\n"));
2940 }
2941
2942 /* saHwEventAck() */
2943 eventSource.agPortContext = agPortContext;
2944 eventSource.event = OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR;
2945 /* phy ID */
2946 eventSource.param = PhyID;
2947 HwAckSatus = saHwEventAck(
2948 agRoot,
2949 agNULL, /* agContext */
2950 0,
2951 &eventSource, /* agsaEventSource_t */
2952 0,
2953 0
2954 );
2955 if ( HwAckSatus != AGSA_RC_SUCCESS)
2956 {
2957 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
2958 smTraceFuncExit(hpDBG_VERY_LOUD, 'J', "Y2");
2959 return;
2960 }
2961
2962 break;
2963 }
2964
2965 case OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION:
2966 {
2967 PhyID = TD_GET_PHY_ID(eventParm1);
2968 PortState = TD_GET_PORT_STATE(eventParm1);
2969 agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
2970 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION\n"));
2971
2972 if (PortState == OSSA_PORT_INVALID)
2973 {
2974 TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION\n"));
2975 smTraceFuncExit(hpDBG_VERY_LOUD, 'K', "Y2");
2976 return;
2977 }
2978
2979 if (agPhyErrCountersPage != agNULL)
2980 {
2981 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION from PhyID %d\n", PhyID));
2982 TI_DBG1(("ossaHwCB: codeViolation %d\n", agPhyErrCountersPage->codeViolation));
2983 }
2984 else
2985 {
2986 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION: Error!!! eventParm2 is NULL\n"));
2987 }
2988
2989 /* saHwEventAck() */
2990 eventSource.agPortContext = agPortContext;
2991 eventSource.event = OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION;
2992 /* phy ID */
2993 eventSource.param = PhyID;
2994 HwAckSatus = saHwEventAck(
2995 agRoot,
2996 agNULL, /* agContext */
2997 0,
2998 &eventSource, /* agsaEventSource_t */
2999 0,
3000 0
3001 );
3002 if ( HwAckSatus != AGSA_RC_SUCCESS)
3003 {
3004 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
3005 smTraceFuncExit(hpDBG_VERY_LOUD, 'L', "Y2");
3006 return;
3007 }
3008
3009 break;
3010 }
3011
3012 #ifdef REMOVED
3013 case OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION1:
3014 {
3015 PhyID = eventParm1 & 0xFF;
3016 agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
3017
3018 if (agPhyErrCountersPage != agNULL)
3019 {
3020 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION1 from PhyID %d\n", PhyID));
3021 TI_DBG1(("ossaHwCB: invalidDword %d\n", agPhyErrCountersPage->invalidDword));
3022 TI_DBG1(("ossaHwCB: runningDisparityError %d\n", agPhyErrCountersPage->runningDisparityError));
3023 TI_DBG1(("ossaHwCB: codeViolation %d\n", agPhyErrCountersPage->codeViolation));
3024 TI_DBG1(("ossaHwCB: lostOfDwordSynch %d\n", agPhyErrCountersPage->lossOfDwordSynch));
3025 TI_DBG1(("ossaHwCB: phyResetProblem %d\n", agPhyErrCountersPage->phyResetProblem));
3026 TI_DBG1(("ossaHwCB: inboundCRCError %d\n", agPhyErrCountersPage->inboundCRCError));
3027 }
3028 else
3029 {
3030 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION1: Error!!! eventParm2 is NULL\n"));
3031 }
3032 break;
3033 }
3034 #endif /* REMOVED */
3035
3036 case OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH:
3037 {
3038 PhyID = TD_GET_PHY_ID(eventParm1);
3039 PortState = TD_GET_PORT_STATE(eventParm1);
3040 agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
3041 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH\n"));
3042
3043 if (PortState == OSSA_PORT_INVALID)
3044 {
3045 TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH\n"));
3046 smTraceFuncExit(hpDBG_VERY_LOUD, 'M', "Y2");
3047 return;
3048 }
3049
3050 if (agPhyErrCountersPage != agNULL)
3051 {
3052 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH from PhyID %d\n", PhyID));
3053 TI_DBG1(("ossaHwCB: lostOfDwordSynch %d\n", agPhyErrCountersPage->lossOfDwordSynch));
3054 }
3055 else
3056 {
3057 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH: Error!!! eventParm2 is NULL\n"));
3058 }
3059
3060 /* saHwEventAck() */
3061 eventSource.agPortContext = agPortContext;
3062 eventSource.event = OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH;
3063 /* phy ID */
3064 eventSource.param = PhyID;
3065 HwAckSatus = saHwEventAck(
3066 agRoot,
3067 agNULL, /* agContext */
3068 0,
3069 &eventSource, /* agsaEventSource_t */
3070 0,
3071 0
3072 );
3073 if ( HwAckSatus != AGSA_RC_SUCCESS)
3074 {
3075 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
3076 smTraceFuncExit(hpDBG_VERY_LOUD, 'N', "Y2");
3077 return;
3078 }
3079
3080 break;
3081 }
3082
3083 case OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED:
3084 {
3085 PhyID = TD_GET_PHY_ID(eventParm1);
3086 PortState = TD_GET_PORT_STATE(eventParm1);
3087 agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
3088
3089 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED\n"));
3090
3091 if (PortState == OSSA_PORT_INVALID)
3092 {
3093 TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED\n"));
3094 smTraceFuncExit(hpDBG_VERY_LOUD, 'O', "Y2");
3095 return;
3096 }
3097
3098 if (agPhyErrCountersPage != agNULL)
3099 {
3100 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED from PhyID %d\n", PhyID));
3101 TI_DBG1(("ossaHwCB: phyResetProblem %d\n", agPhyErrCountersPage->phyResetProblem));
3102 }
3103 else
3104 {
3105 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED: Error!!! eventParm2 is NULL\n"));
3106 }
3107
3108 /* saHwEventAck() */
3109 eventSource.agPortContext = agPortContext;
3110 eventSource.event = OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED;
3111 /* phy ID */
3112 eventSource.param = PhyID;
3113 HwAckSatus = saHwEventAck(
3114 agRoot,
3115 agNULL, /* agContext */
3116 0,
3117 &eventSource, /* agsaEventSource_t */
3118 0,
3119 0
3120 );
3121 if ( HwAckSatus != AGSA_RC_SUCCESS)
3122 {
3123 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
3124 smTraceFuncExit(hpDBG_VERY_LOUD, 'P', "Y2");
3125 return;
3126 }
3127
3128 break;
3129 }
3130
3131 // #ifdef INITIATOR_DRIVER
3132 case OSSA_HW_EVENT_ENCRYPTION:
3133 {
3134 pEncryptCBData = (agsaHWEventEncrypt_t *) eventParm2;
3135 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_ENCRYPTION: encryptOperation 0x%x\n",pEncryptCBData->encryptOperation));
3136 TI_DBG1(("ossaHwCB: event 0x%x eventParm1 0x%x eventParm2 %p eventParm3 %p\n",event,eventParm1,eventParm2,eventParm3));
3137
3138 /*
3139 * All events and status need to be translated from
3140 * SAS specific values to TISA specific values. This
3141 * is effectively a NOP, but the OS layer won't want to
3142 * look for SAS values.
3143 */
3144 if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE)
3145 {
3146 TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE\n"));
3147 encryptEventData.encryptEvent = tiEncryptKekStore;
3148 }
3149 else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE)
3150 {
3151 TI_DBG1(("ossaHwCB:OSSA_HW_ENCRYPT_KEK_UPDATE \n"));
3152 encryptEventData.encryptEvent = tiEncryptKekAdd;
3153 }
3154 else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_INVALIDTE)
3155 {
3156 TI_DBG1(("ossaHwCB:OSSA_HW_ENCRYPT_KEK_INVALIDTE \n"));
3157 /* none */
3158 }
3159 else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_DEK_UPDATE)
3160 {
3161 TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_DEK_UPDATE\n"));
3162 encryptEventData.encryptEvent = tiEncryptDekAdd;
3163 }
3164 else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_DEK_INVALIDTE)
3165 {
3166 TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_DEK_INVALIDTE\n"));
3167 encryptEventData.encryptEvent = tiEncryptDekInvalidate;
3168 }
3169 else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT)
3170 {
3171 TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT\n"));
3172 encryptEventData.encryptEvent = tiEncryptOperatorManagement;
3173 }
3174 else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_TEST_EXECUTE)
3175 {
3176 TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_TEST_EXECUTE\n"));
3177 encryptEventData.encryptEvent = tiEncryptSelfTest;
3178 encryptEventData.subEvent = pEncryptCBData->eq;
3179 }
3180 else
3181 {
3182 TI_DBG1(("ossaHwCB: unknown encryptOperation 0x%x\n",pEncryptCBData->encryptOperation));
3183 }
3184
3185 if (pEncryptCBData->status != OSSA_SUCCESS)
3186 {
3187 encryptStatus = tiError;
3188
3189 /* prints out status and error qualifier */
3190 TI_DBG1(("ossaHwCB: encrypt response status 0x%x error qualifier 0x%x\n", pEncryptCBData->status, pEncryptCBData->eq));
3191 }
3192 else
3193 {
3194 encryptStatus = tiSuccess;
3195 }
3196
3197 if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE ||
3198 pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE )
3199 {
3200 /* returning new KEK index */
3201 encryptEventData.pData = pEncryptCBData->handle;
3202 }
3203 else
3204 {
3205 /* returning current KEK index or DEK index */
3206 encryptEventData.pData = pEncryptCBData->param;
3207 }
3208
3209 ostiPortEvent(tiRoot,
3210 tiEncryptOperation,
3211 encryptStatus,
3212 &encryptEventData);
3213 break;
3214 }
3215 case OSSA_HW_EVENT_SECURITY_MODE:
3216 {
3217 securitySetModeStatus = eventParm1;
3218 pEncryptInfo = (agsaEncryptInfo_t *) eventParm2;
3219
3220 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_SECURITY_MODE\n"));
3221 if (securitySetModeStatus == OSSA_SUCCESS)
3222 {
3223 securityModeStatus = tiSuccess;
3224 }
3225 else
3226 {
3227 securityModeStatus = tiError;
3228 }
3229
3230 encryptEventData.encryptEvent = tiEncryptSetMode;
3231 /* process status to fill in subevent */
3232 /* See PM 4.26.12.6 */
3233 TI_DBG1(("ossaHwCB: pEncryptInfo->status 0x%x\n", pEncryptInfo->status));
3234 if ( pEncryptInfo->status == OSSA_SUCCESS)
3235 {
3236 encryptEventData.subEvent = tiNVRAMSuccess;
3237 }
3238 else if (pEncryptInfo->status == 0x24)
3239 {
3240 encryptEventData.subEvent = tiNVRAMNotFound;
3241 }
3242 else if (pEncryptInfo->status == 0x05 || pEncryptInfo->status == 0x20 || pEncryptInfo->status == 0x21)
3243 {
3244 encryptEventData.subEvent = tiNVRAMAccessTimeout;
3245 }
3246 else
3247 {
3248 encryptEventData.subEvent = tiNVRAMWriteFail;
3249 }
3250
3251 encryptEventData.pData = agNULL;
3252 ostiPortEvent(tiRoot,
3253 tiEncryptOperation,
3254 securityModeStatus,
3255 &encryptEventData);
3256
3257 break;
3258 }
3259 case OSSA_HW_EVENT_MODE:
3260 {
3261 pModeEvent = (agsaHWEventMode_t *) eventParm2;
3262 pModePage = (bit32 *) pModeEvent->modePage;
3263
3264 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_MODE modePageOperation 0x%x status 0x%x modePageLen 0x%x\n",
3265 pModeEvent->modePageOperation, pModeEvent->status, pModeEvent->modePageLen));
3266
3267 if (pModeEvent->modePageOperation == agsaModePageSet)
3268 {
3269 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_MODE page code 0x%x error qualifier 0x%x\n", (eventParm1 & 0xFF), (eventParm1 >> 16)));
3270 ostiPortEvent(tiRoot,
3271 tiModePageOperation,
3272 pModeEvent->status,
3273 eventParm2);
3274 }
3275 else if (pModeEvent->modePageOperation == agsaModePageGet)
3276 {
3277 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_MODE error qualifier 0x%x\n", eventParm1));
3278 switch ((*pModePage) & 0xFF)
3279 {
3280 case AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE:
3281 TI_DBG1(("ossaHwCB: AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3282 TI_DBG1(("ossaHwCB:modePageOperation 0x%x status 0x%x modePageLen 0x%x modePage %p context %p\n",
3283 pModeEvent->modePageOperation,
3284 pModeEvent->status,
3285 pModeEvent->modePageLen,
3286 pModeEvent->modePage,
3287 pModeEvent->context));
3288 ostiPortEvent(tiRoot,
3289 tiModePageOperation,
3290 pModeEvent->status,
3291 eventParm2);
3292 break;
3293 case AGSA_ENCRYPTION_DEK_CONFIG_PAGE:
3294 TI_DBG1(("ossaHwCB: AGSA_ENCRYPTION_DEK_CONFIG_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3295 ostiPortEvent(tiRoot,
3296 tiModePageOperation,
3297 pModeEvent->status,
3298 eventParm2);
3299 break;
3300 case AGSA_ENCRYPTION_HMAC_CONFIG_PAGE:
3301 TI_DBG1(("ossaHwCB: AGSA_ENCRYPTION_HMAC_CONFIG_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3302 ostiPortEvent(tiRoot,
3303 tiModePageOperation,
3304 pModeEvent->status,
3305 eventParm2);
3306 break;
3307 case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:
3308 TI_DBG1(("ossaHwCB: AGSA_ENCRYPTION_CONTROL_PARM_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3309 /*
3310 * This page is directly related to tiCOMEncryptGetInfo() and
3311 * will be translated into a tiEncrytOperation for the OS layer.
3312 */
3313
3314 /* Fill out tiEncryptInfo_t */
3315 securityMode = *pModePage & 0x0F00 >> 8;
3316 cipherMode = *pModePage & 0xF000 >> 12;
3317
3318 if (securityMode == agsaEncryptSMA)
3319 {
3320 encryptInfo.securityCipherMode = TI_ENCRYPT_SEC_MODE_A;
3321 }
3322 else if (securityMode == agsaEncryptSMB)
3323 {
3324 encryptInfo.securityCipherMode = TI_ENCRYPT_SEC_MODE_B;
3325 }
3326 else
3327 {
3328 encryptInfo.securityCipherMode = TI_ENCRYPT_SEC_MODE_FACT_INIT;
3329 }
3330
3331 if (cipherMode == agsaEncryptCipherModeECB)
3332 {
3333 encryptInfo.securityCipherMode |= TI_ENCRYPT_ATTRIB_CIPHER_ECB;
3334 }
3335
3336 if (cipherMode == agsaEncryptCipherModeXTS)
3337 {
3338 encryptInfo.securityCipherMode |= TI_ENCRYPT_ATTRIB_CIPHER_XTS;
3339 }
3340
3341 /* How will subEvents be tracked? */
3342 encryptInfo.status = 0;
3343
3344 encryptInfo.sectorSize[0] = 512; /* DIF is allowed on 512 BPS SATA drives */
3345 encryptInfo.sectorSize[1] = 520;
3346 encryptInfo.sectorSize[2] = 528;
3347 encryptInfo.sectorSize[3] = 4104;
3348 encryptInfo.sectorSize[4] = 4168;
3349 encryptInfo.sectorSize[5] = 4232;
3350
3351 encryptEventData.encryptEvent = tiEncryptGetInfo;
3352 encryptEventData.subEvent = 0;
3353 encryptEventData.pData = &encryptInfo;
3354
3355 ostiPortEvent(tiRoot,
3356 tiEncryptOperation,
3357 pModeEvent->status,
3358 &encryptEventData);
3359 break;
3360 case AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE:
3361 TI_DBG1(("ossaHwCB: AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3362
3363 #ifdef IOCTL_INTERRUPT_TIME_CONFIG
3364 ostiPortEvent(tiRoot,
3365 tiModePageOperation,
3366 pModeEvent->status,
3367 eventParm2
3368 );
3369 #endif /* IOCTL_INTERRUPT_TIME_CONFIG */
3370
3371 /*ostiPortEvent(tiRoot,
3372 tiModePageOperation,
3373 pModeEvent->status,
3374 &encryptEventData);*/
3375 break;
3376 case AGSA_INTERRUPT_CONFIGURATION_PAGE:
3377 TI_DBG1(("ossaHwCB: AGSA_INTERRUPT_CONFIGURATION_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3378
3379 #ifdef IOCTL_INTERRUPT_TIME_CONFIG
3380 ostiPortEvent(tiRoot,
3381 tiModePageOperation,
3382 pModeEvent->status,
3383 eventParm2
3384 );
3385 #endif /* IOCTL_INTERRUPT_TIME_CONFIG */
3386
3387 break;
3388 default:
3389 TI_DBG1(("ossaHwCB: Unknown Mode Event %x\n", *pModePage));
3390 break;
3391 }
3392
3393 }
3394 else
3395 {
3396 TI_DBG1(("ossaHwCB: Unknown modePageOperation %x\n", pModeEvent->modePageOperation));
3397 }
3398 break;
3399 }
3400
3401 // #endif /* INITIATOR_DRIVER */
3402
3403 #ifdef REMOVED
3404 case OSSA_HW_EVENT_PHY_UNRECOVERABLE_ERROR:
3405 {
3406 PhyID = TD_GET_PHY_ID(eventParm1);
3407 PortState = TD_GET_PORT_STATE(eventParm1);
3408
3409 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_UNRECOVERABLE_ERROR\n"));
3410
3411 if (PortState == OSSA_PORT_INVALID)
3412 {
3413 TI_DBG1(("ossaHwCB: INVALID port state\n"));
3414 }
3415 else
3416 {
3417 TI_DBG1(("ossaHwCB: VALID port state\n"));
3418 }
3419 break;
3420 }
3421 #endif /* REMOVED */
3422 case OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED:
3423 {
3424 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED\n"));
3425 break;
3426 }
3427
3428 default:
3429 {
3430 TI_DBG1(("ossaHwCB: default error (0x%X)!!!!!\n",event));
3431 break;
3432 }
3433 }
3434
3435 smTraceFuncExit(hpDBG_VERY_LOUD, 'R', "Y2");
3436 return;
3437 }
3438
3439 osGLOBAL void ossaPortControlCB(
3440 agsaRoot_t *agRoot,
3441 agsaContext_t *agContext,
3442 agsaPortContext_t *agPortContext,
3443 bit32 portOperation,
3444 bit32 status)
3445 {
3446 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3447 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3448 tdsaPortContext_t *onePortContext = agNULL;
3449
3450 TI_DBG6(("ossaPortControlCB: start\n"));
3451
3452 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y3");
3453 if (portOperation == AGSA_PORT_SET_SMP_PHY_WIDTH)
3454 {
3455 TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_SET_SMP_PHY_WIDTH\n"));
3456 }
3457 else if (portOperation == AGSA_PORT_SET_PORT_RECOVERY_TIME)
3458 {
3459 TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_SET_PORT_RECOVERY_TIME\n"));
3460 }
3461 else if (portOperation == AGSA_PORT_IO_ABORT)
3462 {
3463 TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_IO_ABORT\n"));
3464 /* code is here because disocvery failed
3465 deregister all targets. Then, later call discovery if broacast is seen in ossaDeregisterDeviceHandleCB.
3466 */
3467 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
3468 if (onePortContext == agNULL)
3469 {
3470 TI_DBG1(("ossaPortControlCB: onePortContext is NULL\n"));
3471 return;
3472 }
3473 /* qqqqq deregister all devices */
3474 tdsaDeregisterDevicesInPort(tiRoot, onePortContext);
3475
3476 }
3477 else if (portOperation == AGSA_PORT_SET_PORT_RESET_TIME)
3478 {
3479 TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_SET_PORT_RESET_TIME\n"));
3480 }
3481 else if (portOperation == AGSA_PORT_HARD_RESET)
3482 {
3483 TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_HARD_RESET\n"));
3484 }
3485 else if (portOperation == AGSA_PORT_CLEAN_UP)
3486 {
3487 TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_CLEAN_UP\n"));
3488 }
3489 else if (portOperation == AGSA_STOP_PORT_RECOVERY_TIMER)
3490 {
3491 TI_DBG1(("ossaPortControlCB: portOperation AGSA_STOP_PORT_RECOVERY_TIMER\n"));
3492 }
3493 else
3494 {
3495 TI_DBG1(("ossaPortControlCB: undefined portOperation %d\n", portOperation));
3496 }
3497
3498 TI_DBG1(("ossaPortControlCB: status %d\n", status));
3499
3500 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y3");
3501 return;
3502 }
3503
3504 /*****************************************************************************
3505 *! \brief ossaHwRegRead
3506 *
3507 * Purpose: This routine is called to read a 32-bit value from the PCI
3508 * registers of the controller
3509 *
3510 * \param agRoot: Pointer to chip/driver Instance.
3511 * \param regOffset: Byte offset to chip register from which to read a 32-bit
3512 * value.
3513 *
3514 * \return: 32-bit value.
3515 *
3516 * \note - The scope is shared target and initiator.
3517 *
3518 *****************************************************************************/
3519 FORCEINLINE
3520 bit32
3521 ossaHwRegRead(agsaRoot_t *agRoot,
3522 bit32 regOffset
3523 )
3524 {
3525 tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3526 bit32 return_value;
3527
3528
3529 return_value = ostiChipReadBit32 (
3530 osData->tiRoot,
3531 regOffset
3532 );
3533 if( agNULL != agRoot->sdkData )
3534 {
3535 smTrace(hpDBG_REGISTERS,"RR",regOffset);
3536 /* TP:RR regOffset */
3537 smTrace(hpDBG_REGISTERS,"RV",return_value);
3538 /* TP:RV value read */
3539 }
3540
3541 return(return_value);
3542
3543 }
3544
3545 /*****************************************************************************
3546 *! \brief ossaHwRegWrite
3547 *
3548 * Purpose: This routine is called to write a 32-bit value to the PCI
3549 * registers of the controller.
3550 *
3551 * \param agRoot: Pointer to chip/driver Instance.
3552 * \param regOffset: Byte offset to chip register to which chipIOValue is
3553 * written.
3554 * \param regValue: 32-bit value to write at chipIOOffset in host byte order.
3555 *
3556 * \return: None.
3557 *
3558 * \note - The scope is shared target and initiator.
3559 *
3560 *****************************************************************************/
3561 FORCEINLINE
3562 void
3563 ossaHwRegWrite(agsaRoot_t *agRoot,
3564 bit32 regOffset,
3565 bit32 regValue
3566 )
3567 {
3568
3569 tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3570 if( agNULL != agRoot->sdkData )
3571 {
3572 smTrace(hpDBG_REGISTERS,"RW",regOffset);
3573 /* TP:RW regOffset */
3574 smTrace(hpDBG_REGISTERS,"VW",regValue);
3575 /* TP:VW value written */
3576 }
3577
3578 ostiChipWriteBit32 (
3579 osData->tiRoot,
3580 regOffset,
3581 regValue
3582 );
3583 return;
3584 }
3585
3586 /*****************************************************************************
3587 *! \brief ossaHwRegReadExt
3588 *
3589 * Purpose: This routine is called to read a 32-bit value from a bus-specific
3590 * mapped registers of the controller
3591 *
3592 * \param agRoot: Pointer to chip/driver Instance.
3593 * \param regOffset: Byte offset to chip register from which to read a 32-bit
3594 * value.
3595 *
3596 * \return: 32-bit value.
3597 *
3598 * \note - The scope is shared target and initiator.
3599 *
3600 *****************************************************************************/
3601 FORCEINLINE
3602 bit32
3603 ossaHwRegReadExt(
3604 agsaRoot_t *agRoot,
3605 bit32 busBaseNumber,
3606 bit32 regOffset
3607 )
3608 {
3609 tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3610
3611 bit32 return_value;
3612
3613 return_value = ostiChipReadBit32Ext(
3614 osData->tiRoot,
3615 busBaseNumber,
3616 regOffset
3617 );
3618
3619 /* TI_DBG4(("#_R: 0x%x:0x%x=0x%x\n",busBaseNumber,regOffset,return_value)); */
3620
3621 if( agNULL != agRoot->sdkData )
3622 {
3623 smTrace(hpDBG_REGISTERS,"EB",busBaseNumber);
3624 /* TP:EB EX read busBaseNumber */
3625 smTrace(hpDBG_REGISTERS,"EO",regOffset);
3626 /* TP:EO regOffset */
3627 smTrace(hpDBG_REGISTERS,"ER",return_value);
3628 /* TP:ER value read */
3629 }
3630 return(return_value);
3631 }
3632
3633 void ossaPCI_TRIGGER(agsaRoot_t *agRoot )
3634 {
3635 tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3636 ostiPCI_TRIGGER(osData->tiRoot);
3637
3638 }
3639
3640
3641
3642 /*****************************************************************************
3643 *! \brief ossaHwRegWriteExt
3644 *
3645 * Purpose: This routine is called to write a 32-bit value to a bus specific
3646 * mapped registers of the controller.
3647 *
3648 * \param agRoot: Pointer to chip/driver Instance.
3649 * \param regOffset: Byte offset to chip register to which chipIOValue is
3650 * written.
3651 * \param regValue: 32-bit value to write at chipIOOffset in host byte order.
3652 *
3653 * \return: None.
3654 *
3655 * \note - The scope is shared target and initiator.
3656 *
3657 *****************************************************************************/
3658 FORCEINLINE
3659 void
3660 ossaHwRegWriteExt(
3661 agsaRoot_t *agRoot,
3662 bit32 busBaseNumber,
3663 bit32 regOffset,
3664 bit32 regValue
3665 )
3666 {
3667 tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3668 ostiChipWriteBit32Ext(
3669 osData->tiRoot,
3670 busBaseNumber,
3671 regOffset,
3672 regValue
3673 );
3674
3675 /* TI_DBG4(("#_W: 0x%x:0x%x=0x%x\n",busBaseNumber,regOffset,regValue)); */
3676
3677 if( agNULL != agRoot->sdkData )
3678 {
3679 smTrace(hpDBG_REGISTERS,"Eb",busBaseNumber);
3680 /* TP:Eb Ex Write busBaseNumber */
3681 smTrace(hpDBG_REGISTERS,"Eo",regOffset);
3682 /* TP:Eo regOffset */
3683 smTrace(hpDBG_REGISTERS,"Ew",regValue);
3684 /* TP:Ew value written regValue*/
3685 }
3686 return;
3687 }
3688
3689
3690 osGLOBAL bit32 ossaHwRegReadConfig32(
3691 agsaRoot_t *agRoot,
3692 bit32 regOffset
3693 )
3694 {
3695 tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3696 bit32 to_ret;
3697 to_ret= ostiChipConfigReadBit32( osData->tiRoot, regOffset);
3698 TI_DBG4(("ossaHwRegReadConfig32: regOffset 0x%x returns 0x%x\n",regOffset,to_ret));
3699 return(to_ret);
3700 }
3701
3702
3703
3704
3705 #ifdef TD_INT_COALESCE
3706 void
3707 ossaIntCoalesceInitCB(
3708 agsaRoot_t *agRoot,
3709 agsaIntCoalesceContext_t *agIntCoContext,
3710 bit32 status
3711 )
3712 {
3713 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3714 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3715 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)osData->tdsaAllShared;
3716 tiIntCoalesceContext_t *tiIntCoalesceCxt;
3717 tdsaIntCoalesceContext_t *tdsaIntCoalCxt;
3718 tdsaIntCoalesceContext_t *tdsaIntCoalCxtHead
3719 = (tdsaIntCoalesceContext_t *)tdsaAllShared->IntCoalesce;
3720 bit32 tiStatus;
3721
3722 TI_DBG2(("ossaIntCoalesceInitCB: start\n"));
3723
3724 tdsaIntCoalCxt = (tdsaIntCoalesceContext_t *)agIntCoContext->osData;
3725 tiIntCoalesceCxt = tdsaIntCoalCxt->tiIntCoalesceCxt;
3726 switch (status)
3727 {
3728 case AGSA_RC_SUCCESS:
3729 tiStatus = tiSuccess;
3730 break;
3731 case AGSA_RC_BUSY:
3732 tiStatus = tiBusy;
3733 break;
3734 case AGSA_RC_FAILURE:
3735 tiStatus = tiError;
3736 break;
3737 default:
3738 TI_DBG1(("ossaIntCoalesceInitCB: unknown status %d\n", status));
3739 tiStatus = tiError;
3740 break;
3741 }
3742
3743 TI_DBG2(("ossaIntCoalesceInitCB: status %d\n", tiStatus));
3744
3745 /* enqueue tdsaIntCoalCxt to freelink */
3746 tdsaIntCoalCxt->tiIntCoalesceCxt = agNULL;
3747 TI_DBG2(("ossaIntCoalesceInitCB: id %d\n", tdsaIntCoalCxt->id));
3748
3749 tdsaSingleThreadedEnter(tiRoot, TD_INTCOAL_LOCK);
3750 TDLIST_DEQUEUE_THIS(&(tdsaIntCoalCxt->MainLink));
3751 TDLIST_ENQUEUE_AT_TAIL(&(tdsaIntCoalCxt->FreeLink), &(tdsaIntCoalCxtHead->FreeLink));
3752 tdsaSingleThreadedLeave(tiRoot, TD_INTCOAL_LOCK);
3753
3754 #ifdef OS_INT_COALESCE
3755 ostiInitiatorIntCoalesceInitCB(tiRoot,
3756 tiIntCoalesceCxt,
3757 tiStatus);
3758 #endif
3759
3760 TI_DBG2(("ossaIntCoalesceInitCB: return end\n"));
3761
3762 return;
3763 }
3764 #endif /* TD_INT_COALESCE */
3765
3766 /*****************************************************************************/
3767 /*! \brief ossaSingleThreadedEnter
3768 *
3769 *
3770 * Purpose: This routine is called to ensure that only a single thread of
3771 * the given port instance executes code in the region protected by
3772 * this function.
3773 *
3774 *
3775 * \param agRoot: Pointer to chip/driver Instance.
3776 * \param syncLockId to be explained.
3777 *
3778 *
3779 * \return None.
3780 *
3781 * \note - The scope is shared target and initiator.
3782 *
3783 */
3784 /*****************************************************************************/
3785 FORCEINLINE
3786 void ossaSingleThreadedEnter(
3787 agsaRoot_t *agRoot,
3788 bit32 syncLockId
3789 )
3790 {
3791 tdsaRootOsData_t *pOsData = agNULL;
3792 tiRoot_t *ptiRoot = agNULL;
3793 tdsaContext_t *tdsaAllShared = agNULL;
3794
3795 TD_ASSERT(agRoot, "agRoot");
3796 pOsData = (tdsaRootOsData_t *) (agRoot->osData);
3797 TD_ASSERT(pOsData, "pOsData");
3798 ptiRoot = pOsData->tiRoot;
3799 TD_ASSERT(ptiRoot, "ptiRoot");
3800
3801 tdsaAllShared = (tdsaContext_t *)pOsData->tdsaAllShared;
3802 TD_ASSERT(tdsaAllShared, "tdsaAllShared");
3803
3804 ostiSingleThreadedEnter(ptiRoot, syncLockId + tdsaAllShared->MaxNumOSLocks);
3805 return;
3806 }
3807
3808 /*****************************************************************************/
3809 /*! \brief ossaSingleThreadedLeave
3810 *
3811 *
3812 * Purpose: This routine is called to leave a critical region of code
3813 * previously protected by a call to osSingleThreadedEnter()
3814 *
3815 *
3816 * \param agRoot: Pointer to chip/driver Instance.
3817 * \param syncLockId to be explained.
3818 *
3819 *
3820 * \return None.
3821 *
3822 * \note - The scope is shared target and initiator.
3823 *
3824 */
3825 /*****************************************************************************/
3826 FORCEINLINE
3827 void ossaSingleThreadedLeave(
3828 agsaRoot_t *agRoot,
3829 bit32 syncLockId
3830 )
3831 {
3832 tdsaRootOsData_t *pOsData = agNULL;
3833 tiRoot_t *ptiRoot = agNULL;
3834 tdsaContext_t *tdsaAllShared = agNULL;
3835
3836 TD_ASSERT(agRoot, "agRoot");
3837 pOsData = (tdsaRootOsData_t *) (agRoot->osData);
3838 TD_ASSERT(pOsData, "pOsData");
3839 ptiRoot = pOsData->tiRoot;
3840 TD_ASSERT(ptiRoot, "ptiRoot");
3841
3842 tdsaAllShared = (tdsaContext_t *)pOsData->tdsaAllShared;
3843 TD_ASSERT(tdsaAllShared, "tdsaAllShared");
3844
3845 ostiSingleThreadedLeave(ptiRoot, syncLockId + tdsaAllShared->MaxNumOSLocks);
3846 return;
3847 }
3848
3849 #ifdef PERF_COUNT
3850 osGLOBAL void ossaEnter(agsaRoot_t *agRoot, int io)
3851 {
3852 ostiEnter(((tdsaRootOsData_t*)(agRoot->osData))->tiRoot, 0, io);
3853 return;
3854 }
3855
3856 osGLOBAL void ossaLeave(agsaRoot_t *agRoot, int io)
3857 {
3858 ostiLeave(((tdsaRootOsData_t*)(agRoot->osData))->tiRoot, 0, io);
3859 return;
3860 }
3861 #endif
3862
3863
3864 osGLOBAL void
3865 ossaSSPIoctlCompleted(
3866 agsaRoot_t *agRoot,
3867 agsaIORequest_t *agIORequest,
3868 bit32 agIOStatus,
3869 bit32 agIOInfoLen,
3870 void *agParam,
3871 bit16 sspTag,
3872 bit32 agOtherInfo
3873 )
3874 {
3875 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3876 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3877 tdIORequestBody_t *tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3878 agsaSASRequestBody_t *agSASRequestBody = agNULL;
3879 agsaSSPInitiatorRequest_t *agSSPFrame = agNULL;
3880 bit8 scsiOpcode = 0;
3881
3882 agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
3883 agSSPFrame = &(agSASRequestBody->sspInitiatorReq);
3884 scsiOpcode = agSSPFrame->sspCmdIU.cdb[0];
3885
3886 TI_DBG2(("ossaSSPIoctlCompleted: start\n"));
3887
3888 if (agIOStatus == OSSA_SUCCESS)
3889 {
3890 TI_DBG2(("ossaSSPIoctlCompleted: Success status\n"));
3891 }
3892 else
3893 {
3894 TI_DBG1(("ossaSSPIoctlCompleted: Status 0x%x\n", agIOStatus));
3895 }
3896 switch(scsiOpcode)
3897 {
3898 case REPORT_LUN_OPCODE:
3899 ostiNumOfLUNIOCTLRsp(tiRoot, agIOStatus);
3900 break;
3901
3902 default:
3903 TI_DBG1(("ossaSSPIoctlCompleted: Unsupported SCSI command Response 0x%x\n",scsiOpcode));
3904 break;
3905 }
3906 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yi");
3907 return;
3908
3909 }
3910
3911 osGLOBAL void
3912 ossaSMPIoctlCompleted(
3913 agsaRoot_t *agRoot,
3914 agsaIORequest_t *agIORequest,
3915 bit32 agIOStatus,
3916 bit32 agIOInfoLen,
3917 agsaFrameHandle_t agFrameHandle
3918 )
3919 {
3920 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3921 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3922 TI_DBG2(("ossaSMPIoctlCompleted: start\n"));
3923
3924 if (agIOStatus == OSSA_SUCCESS)
3925 {
3926 TI_DBG2(("ossaSMPIoctlCompleted: Success status\n"));
3927 }
3928 else
3929 {
3930 TI_DBG1(("ossaSMPIoctlCompleted: Status 0x%x\n", agIOStatus));
3931 }
3932
3933 ostiSendSMPIOCTLRsp(tiRoot, agIOStatus);
3934 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yi");
3935 return;
3936
3937 }
3938
3939
3940 /*****************************************************************************/
3941 /*! \brief ossaSMPCompleted
3942 *
3943 *
3944 * Purpose: This routine is called by lower layer to indicate the completion of
3945 * SMP request
3946 *
3947 * \param agRoot: Pointer to chip/driver Instance.
3948 * \param agIORequest Pointer to SMP request handle
3949 * \param agIOStatus Status
3950 * \param agFrameHeader:Pointer to SMP frame header.
3951 * \param agIOInfoLen IO information length assoicated with the IO
3952 * \param agFrameHandle A Handle used to refer to the response frame
3953 *
3954 *
3955 * \return None.
3956 *
3957 * \note - The scope is shared target and initiator.
3958 * For details, refer to SAS/SATA Low-Level API Specification
3959 */
3960 /*****************************************************************************/
3961 osGLOBAL void ossaSMPCompleted(
3962 agsaRoot_t *agRoot,
3963 agsaIORequest_t *agIORequest,
3964 bit32 agIOStatus,
3965 bit32 agIOInfoLen,
3966 agsaFrameHandle_t agFrameHandle
3967 )
3968 {
3969 #ifdef PASSTHROUGH
3970 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3971 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3972 tdPassthroughCmndBody_t *tdPTCmndBody = (tdPassthroughCmndBody_t *)agIORequest->osData;
3973 bit32 tiStatus = tiPassthroughError;
3974 bit8 SMPframe[agIOInfoLen + sizeof(agsaSMPFrameHeader_t)];
3975 bit8 SMPpayload[agIOInfoLen];
3976
3977 TI_DBG2(("ossaSMPCompleted: start and passthrough\n"));
3978 #else /* not PASSTHROUGH */
3979
3980 tdssSMPRequestBody_t *pSMPRequestBody = (tdssSMPRequestBody_t *) agIORequest->osData;
3981 TI_DBG4(("ossaSMPCompleted: start\n"));
3982 #endif /* end not PASSTHROUGH */
3983
3984 TDSA_OUT_ENTER((tiRoot_t *)((tdsaRootOsData_t *)agRoot->osData)->tiRoot);
3985 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y4");
3986
3987 #ifdef PASSTHROUGH
3988 if (tdPTCmndBody == agNULL)
3989 {
3990 TI_DBG1(("ossaSMPCompleted: tdPTCmndBody is NULL \n"));
3991 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y4");
3992 goto ext;
3993 }
3994
3995 if (tdPTCmndBody->EventCB == agNULL)
3996 {
3997 TI_DBG1(("ossaSMPCompleted: tdPTCmndBody->EventCB is NULL \n"));
3998 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y4");
3999 goto ext;
4000 }
4001
4002 if (agIOStatus == OSSA_IO_SUCCESS)
4003 {
4004 tiStatus = tiPassthroughSuccess;
4005 }
4006 else if (agIOStatus == OSSA_IO_ABORTED)
4007 {
4008 tiStatus = tiPassthroughAborted;
4009 }
4010 else
4011 {
4012 tiStatus = tiPassthroughError;
4013 }
4014
4015 osti_memset(SMPpayload, 0, agIOInfoLen);
4016 osti_memset(SMPframe, 0, agIOInfoLen + sizeof(agsaSMPFrameHeader_t));
4017
4018 /* combine the header and payload */
4019 saFrameReadBlock(agRoot, agFrameHandle, 0, &SMPpayload, agIOInfoLen);
4020 osti_memcpy(SMPframe, agFrameHeader, sizeof(agsaSMPFrameHeader_t));
4021 osti_memcpy(SMPframe+sizeof(agsaSMPFrameHeader_t), SMPpayload, agIOInfoLen);
4022
4023 tdPTCmndBody->EventCB(tiRoot,
4024 tdPTCmndBody->tiPassthroughRequest,
4025 tiStatus,
4026 SMPframe,
4027 agIOInfoLen + sizeof(agsaSMPFrameHeader_t)
4028 );
4029
4030
4031 #else /* not PASSTHROUGH */
4032
4033 /*
4034 At initiator, passing SMP to TD layer, itdssSMPCompleted(), which does nothing.
4035 At target, passing SMP to TD layer, ttdsaSMPCompleted()
4036 */
4037 /*
4038 how to use agFrameHandle, when saFrameReadBlock() is used
4039 */
4040
4041 /* SPC can't be SMP target */
4042
4043 TI_DBG4(("ossaSMPCompleted: start\n"));
4044
4045 if (pSMPRequestBody == agNULL)
4046 {
4047 TI_DBG1(("ossaSMPCompleted: pSMPRequestBody is NULL \n"));
4048 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y4");
4049 goto ext;
4050 }
4051
4052 if (pSMPRequestBody->SMPCompletionFunc == agNULL)
4053 {
4054 TI_DBG1(("ossaSMPCompleted: pSMPRequestBody->SMPCompletionFunc is NULL \n"));
4055 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y4");
4056 goto ext;
4057 }
4058 #ifdef TD_INTERNAL_DEBUG /* debugging */
4059 TI_DBG4(("ossaSMPCompleted: agIOrequest %p\n", agIORequest->osData));
4060 TI_DBG4(("ossaSMPCompleted: sizeof(tdIORequestBody_t) %d 0x%x\n", sizeof(tdIORequestBody_t),
4061 sizeof(tdIORequestBody_t)));
4062 TI_DBG4(("ossaSMPCompleted: SMPRequestbody %p\n", pSMPRequestBody));
4063 TI_DBG4(("ossaSMPCompleted: calling callback fn\n"));
4064 TI_DBG4(("ossaSMPCompleted: callback fn %p\n",pSMPRequestBody->SMPCompletionFunc));
4065 #endif /* TD_INTERNAL_DEBUG */
4066 /*
4067 if initiator, calling itdssSMPCompleted() in itdcb.c
4068 if target, calling ttdsaSMPCompleted() in ttdsmp.c
4069 */
4070 pSMPRequestBody->SMPCompletionFunc(
4071 agRoot,
4072 agIORequest,
4073 agIOStatus,
4074 agIOInfoLen,
4075 agFrameHandle
4076 );
4077
4078 #endif /* Not PASSTHROUGH */
4079
4080 smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "Y4");
4081 ext:
4082 TDSA_OUT_LEAVE((tiRoot_t *)((tdsaRootOsData_t *)agRoot->osData)->tiRoot);
4083 return;
4084 }
4085
4086 osGLOBAL void
4087 ossaSMPReqReceived(
4088 agsaRoot_t *agRoot,
4089 agsaDevHandle_t *agDevHandle,
4090 agsaFrameHandle_t agFrameHandle,
4091 bit32 agIOInfoLen,
4092 bit32 phyId
4093 )
4094 {
4095 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y5");
4096 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y5");
4097 return;
4098 }
4099
4100 /*****************************************************************************/
4101 /*! \brief ossaSMPCAMCompleted
4102 *
4103 *
4104 * Purpose: This routine is called by lower layer to indicate the completion of
4105 * SMP request
4106 *
4107 * \param agRoot: Pointer to chip/driver Instance.
4108 * \param agIORequest Pointer to SMP request handle
4109 * \param agIOStatus Status
4110 * \param agIOInfoLen IO information length assoicated with the IO
4111 * \param agFrameHandle A Handle used to refer to the response frame
4112 *
4113 *
4114 * \return None.
4115 *
4116 * \note - The scope is shared target and initiator.
4117 * For details, refer to SAS/SATA Low-Level API Specification
4118 */
4119 /*****************************************************************************/
4120 osGLOBAL void ossaSMPCAMCompleted(
4121 agsaRoot_t *agRoot,
4122 agsaIORequest_t *agIORequest,
4123 bit32 agIOStatus,
4124 bit32 agIOInfoLen,
4125 agsaFrameHandle_t agFrameHandle
4126 )
4127 {
4128 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4129 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4130 tdIORequestBody_t *tdSMPRequestBody = agNULL;
4131 bit32 context = osData->IntContext;
4132 tiSMPStatus_t status;
4133 bit32 PhysUpper32;
4134 bit32 PhysLower32;
4135 bit32 memAllocStatus;
4136 void *osMemHandle;
4137 bit32 *SMPpayload;
4138 TI_DBG2(("ossaSMPCAMCompleted: start\n"));
4139 TI_DBG2(("ossaSMPCAMCompleted: agIOInfoLen %d\n", agIOInfoLen));
4140 if (!agIORequest->osData)
4141 {
4142 TD_ASSERT((0), "ossaSMPCAMCompleted agIORequest->osData");
4143 goto ext;
4144 }
4145 tdSMPRequestBody = (tdIORequestBody_t *)agIORequest->osData;
4146 if (tdSMPRequestBody->tiIORequest->osData == agNULL)
4147 {
4148 TI_DBG1(("ossaSMPCAMCompleted: tdIORequestBody->tiIORequest->osData is null, wrong\n"));
4149 goto ext;
4150 }
4151 /* allocating agIORequest for SMP Payload itself */
4152 memAllocStatus = ostiAllocMemory(
4153 tiRoot,
4154 &osMemHandle,
4155 (void **)&SMPpayload,
4156 &PhysUpper32,
4157 &PhysLower32,
4158 8,
4159 agIOInfoLen,
4160 agTRUE
4161 );
4162 if (memAllocStatus != tiSuccess)
4163 {
4164 /* let os process IO */
4165 TI_DBG1(("ossaSMPCAMCompleted: ostiAllocMemory failed...\n"));
4166 goto ext;
4167 }
4168 if (SMPpayload == agNULL)
4169 {
4170 TI_DBG1(("ossaSMPCAMCompleted: ostiAllocMemory returned NULL SMPpayload\n"));
4171 goto ext;
4172 }
4173 if (agIOStatus == OSSA_IO_SUCCESS)
4174 {
4175 TI_DBG1(("ossaSMPCAMCompleted: Success status\n"));
4176 osti_memset(SMPpayload, 0, agIOInfoLen);
4177 TI_DBG1(("ossaSMPCAMCompleted: after memset\n"));
4178 saFrameReadBlock(agRoot, agFrameHandle, 0, SMPpayload, agIOInfoLen);
4179 TI_DBG1(("ossaSMPCAMCompleted: after read \n"));
4180 status = tiSMPSuccess;
4181 }
4182 else if (agIOStatus == OSSA_IO_ABORTED)
4183 {
4184 TI_DBG1(("ossaSMPCAMCompleted: SMP Aborted status\n"));
4185 status = tiSMPAborted;
4186 TI_DBG1(("ossaSMPCAMCompleted: failed status=%d\n", status));
4187 //failed to send smp command, we need to free the memory
4188 ostiFreeMemory(
4189 tiRoot,
4190 osMemHandle,
4191 agIOInfoLen
4192 );
4193 }
4194 else
4195 {
4196 TI_DBG1(("ossaSMPCAMCompleted: SMP failed status\n"));
4197 status = tiSMPFailed;
4198 TI_DBG1(("ossaSMPCAMCompleted: failed status=%d\n", status));
4199 //failed to send smp command, we need to free the memory
4200 ostiFreeMemory(
4201 tiRoot,
4202 osMemHandle,
4203 agIOInfoLen
4204 );
4205 }
4206 ostiInitiatorSMPCompleted(tiRoot,
4207 tdSMPRequestBody->tiIORequest,
4208 status,
4209 agIOInfoLen,
4210 SMPpayload,
4211 context
4212 );
4213 ext:
4214 TDSA_OUT_LEAVE((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4215 return;
4216 }
4217 #ifdef REMOVED
4218 #ifdef TARGET_DRIVER
4219 /*****************************************************************************/
4220 /*! \brief ossaSMPReqReceived
4221 *
4222 *
4223 * Purpose: This routine is called by lower layer to indicate the reception of
4224 * SMP request
4225 *
4226 * \param agRoot: Pointer to chip/driver Instance.
4227 * \param agDevHandle Pointer to the device handle of the device
4228 * \param agFrameHandle A Handle used to refer to the response frame
4229 *
4230 *
4231 * \return None.
4232 *
4233 * \note - The scope is target only
4234 * For details, refer to SAS/SATA Low-Level API Specification
4235 */
4236 /*****************************************************************************/
4237 osGLOBAL void ossaSMPReqReceived(
4238 agsaRoot_t *agRoot,
4239 agsaDevHandle_t *agDevHandle,
4240 agsaFrameHandle_t agFrameHandle,
4241 bit32 agFrameLength,
4242 bit32 phyId
4243 )
4244 {
4245 bit8 smpHeader[4];
4246 agsaSMPFrameHeader_t *agFrameHeader;
4247 #ifdef PASSTHROUGH
4248 /* call the registered function(parameter in tiTGTPassthroughCmndRegister() by target */
4249 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4250 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4251 ttdsaTgt_t *Target = (ttdsaTgt_t *)osData->ttdsaTgt;
4252
4253 bit8 SMPframe[agIOInfoLen + sizeof(agsaSMPFrameHeader_t)];
4254 bit8 SMPpayload[agIOInfoLen];
4255
4256 TI_DBG2(("ossaSMPReqReceived: start and passthrough\n"));
4257 osti_memset(SMPpayload, 0, agIOInfoLen);
4258 osti_memset(SMPframe, 0, agIOInfoLen + sizeof(agsaSMPFrameHeader_t));
4259 /* combine smp header and payload */
4260 saFrameReadBlock(agRoot, agFrameHandle, 0, &SMPpayload, agIOInfoLen);
4261 osti_memcpy(SMPframe, agFrameHeader, sizeof(agsaSMPFrameHeader_t));
4262 osti_memcpy(SMPframe+sizeof(agsaSMPFrameHeader_t), SMPpayload, agIOInfoLen);
4263
4264 Target->PasthroughCB(
4265 tiRoot,
4266 tiSASATA,
4267 tiSMP,
4268 tiSMPResponse,
4269 SMPframe,
4270 agIOInfoLen + sizeof(agsaSMPFrameHeader_t),
4271 phyId
4272 );
4273
4274 #else
4275
4276 /*
4277 agDevHandle_t->osData points to tdssDeviceData_t
4278 */
4279 tdsaDeviceData_t *pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
4280
4281 saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4);
4282 agFrameHeader = (agsaSMPFrameHeader_t *)smpHeader;
4283 TI_DBG4(("ossaSMPReqReceived: start\n"));
4284
4285 /* tdtypes.h, calling ttdsaSMPReqReceived in ttdsmp.c */
4286 pDeviceData->pJumpTable->pSMPReqReceived (
4287 agRoot,
4288 agDevHandle,
4289 agFrameHeader,
4290 agFrameHandle,
4291 agFrameLength,
4292 phyId
4293 );
4294 #endif
4295 return;
4296 }
4297 #endif
4298 #endif
4299
4300 /*****************************************************************************/
4301 /*! \brief ossaSSPCompleted
4302 *
4303 *
4304 * Purpose: This routine is called by lower layer to indicate the completion of
4305 * SSP request
4306 *
4307 * \param agRoot: Pointer to chip/driver Instance.
4308 * \param agIORequest Pointer to SMP request handle
4309 * \param agIOStatus Status
4310 * \param agIOInfoLen IO information length assoicated with the IO
4311 * \param agFrameHandle A Handle used to refer to the response frame
4312 *
4313 *
4314 * \return None.
4315 *
4316 * \note - The scope is shared target and initiator.
4317 * For details, refer to SAS/SATA Low-Level API Specification
4318 */
4319 /*****************************************************************************/
4320 FORCEINLINE
4321 void ossaSSPCompleted(
4322 agsaRoot_t *agRoot,
4323 agsaIORequest_t *agIORequest,
4324 bit32 agIOStatus,
4325 bit32 agIOInfoLen,
4326 void *agParam,
4327 bit16 sspTag,
4328 bit32 agOtherInfo
4329 )
4330 {
4331 tdIORequestBody_t *pIORequestBody;
4332 #ifdef TD_DEBUG_ENABLE
4333 tiDeviceHandle_t *tiDeviceHandle = agNULL;
4334 tdsaDeviceData_t *oneDeviceData = agNULL;
4335 #endif
4336
4337 TDSA_OUT_ENTER((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4338 smTraceFuncEnter(hpDBG_VERY_LOUD,"2L");
4339
4340 if(!agIORequest->osData)
4341 {
4342 TD_ASSERT((0), "ossaSSPCompleted agIORequest->osData");
4343 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2L");
4344 goto ext;
4345 }
4346 pIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4347
4348
4349 TI_DBG4(("ossaSSPCompleted: start\n"));
4350
4351 if (pIORequestBody == agNULL)
4352 {
4353 TI_DBG1(("ossaSSPCompleted: pIORequestBody is NULL \n"));
4354 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2L");
4355 goto ext;
4356 }
4357 if (pIORequestBody->IOCompletionFunc == agNULL)
4358 {
4359 #ifdef TD_DEBUG_ENABLE
4360 tiDeviceHandle = pIORequestBody->tiDevHandle;
4361 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
4362 #endif
4363 TI_DBG1(("ossaSSPCompleted: IOCompletionFunc is NULL \n"));
4364 TI_DBG1(("ossaSSPCompleted: did %d \n", oneDeviceData->id));
4365 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2L");
4366 goto ext;
4367 }
4368
4369 /*
4370 if initiator, calling itdssIOCompleted() in itdcb.c
4371 if initiator, calling itdssTaskCompleted in itdcb.c
4372 if target, calling ttdsaIOCompleted() in ttdio.c
4373 */
4374 pIORequestBody->IOCompletionFunc(
4375 agRoot,
4376 agIORequest,
4377 agIOStatus,
4378 agIOInfoLen,
4379 agParam,
4380 agOtherInfo
4381 );
4382 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2L");
4383 ext:
4384 TDSA_OUT_LEAVE((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4385 return;
4386 }
4387
4388 #ifdef FAST_IO_TEST
4389 GLOBAL void ossaFastSSPCompleted(
4390 agsaRoot_t *agRoot,
4391 agsaIORequest_t *cbArg,
4392 bit32 agIOStatus,
4393 bit32 agIOInfoLen,
4394 void *agParam,
4395 bit16 sspTag,
4396 bit32 agOtherInfo
4397 )
4398 {
4399 agsaFastCBBuf_t *safb = (agsaFastCBBuf_t*)cbArg;
4400 tdsaRootOsData_t *osData = (tdsaRootOsData_t*)agRoot->osData;
4401 tiRoot_t *tiRoot = (tiRoot_t*)osData->tiRoot;
4402 bit32 scsi_status;
4403 bit32 data_status;
4404 bit32 respLen;
4405 bit8 respData[128];
4406 bit32 senseLen;
4407 agsaSSPResponseInfoUnit_t agSSPRespIU;
4408
4409 TDSA_OUT_ENTER((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4410 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y6");
4411
4412 TI_DBG4(("ossaSSPCompleted: start\n"));
4413
4414 if (safb->cb == agNULL || safb->cbArg == agNULL)
4415 {
4416 TI_DBG1(("ossaFastSSPCompleted: pIORequestBody is NULL \n"));
4417 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y6");
4418 TD_ASSERT((0), "");
4419 goto ext;
4420 }
4421
4422 switch (agIOStatus)
4423 {
4424 case OSSA_IO_SUCCESS:
4425
4426 /* ~ itdssIOSuccessHandler */
4427 if ((agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t)))
4428 {
4429 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, OSSA_IO_SUCCESS, 0);
4430 break;
4431 }
4432
4433 /* reads agsaSSPResponseInfoUnit_t */
4434 saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU,
4435 sizeof(agsaSSPResponseInfoUnit_t));
4436
4437 data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
4438 scsi_status = agSSPRespIU.status;
4439
4440 TI_DBG1(("itdssIOSuccessHandler: scsi_status %d\n", scsi_status));
4441
4442 /* endianess is invovled here */
4443 senseLen = SA_SSPRESP_GET_SENSEDATALEN(&agSSPRespIU);
4444 respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
4445 TI_DBG2(("itdssIOSuccessHandler: scsi status=0x%x, senselen=0x%x resplen "
4446 "0x%x\n", scsi_status, senseLen, respLen));
4447
4448 if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen)
4449 {
4450 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4451 tiDetailOtherError);
4452 break;
4453 }
4454
4455 /* reads response data */
4456 saFrameReadBlock(agRoot, agParam, sizeof(agsaSSPResponseInfoUnit_t),
4457 respData, respLen);
4458 /* reads sense data */
4459 saFrameReadBlock(agRoot, agParam, sizeof(agsaSSPResponseInfoUnit_t)
4460 + respLen, safb->pSenseData, senseLen);
4461
4462 if (data_status == 0)
4463 {
4464 /* NO_DATA */
4465 TI_DBG2(("ossaFastSSPCompleted: no data\n"));
4466 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOSuccess,
4467 scsi_status);
4468 break;
4469 }
4470
4471 if (data_status == 1)
4472 {
4473 /* RESPONSE_DATA */
4474 TI_DBG1(("ossaFastSSPCompleted: response data \n"));
4475 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOSuccess, 0);
4476 break;
4477 }
4478
4479 if (data_status == 2)
4480 {
4481 tiSenseData_t senseData;
4482
4483 /* SENSE_DATA */
4484 TI_DBG2(("itdssIOSuccessHandler: sense data \n"));
4485
4486 senseData.senseData = safb->pSenseData;
4487 senseData.senseLen = MIN(*(safb->senseLen), senseLen);
4488
4489 /* when ASC = 0x04 - Log Unit Not Ready,
4490 and ASCQ = 0x11 - Enable Spinup Required:
4491 call saLocalPhyControl to notify spinup */
4492 if (((char*)safb->pSenseData)[12] == 0x04 &&
4493 ((char*)safb->pSenseData)[13] == 0x11)
4494 {
4495 int i;
4496
4497 TI_DBG2(("ossaFastSSPCompleted: sending notfify spinup\n"));
4498
4499 if (((tdsaDeviceData_t*)safb->oneDeviceData)->directlyAttached ==
4500 agTRUE)
4501 {
4502 for (i = 0; i < TD_MAX_NUM_NOTIFY_SPINUP; i++)
4503 {
4504 saLocalPhyControl(agRoot, agNULL, 0,
4505 ((tdsaDeviceData_t*)safb->oneDeviceData)->phyID,
4506 AGSA_PHY_NOTIFY_ENABLE_SPINUP,
4507 agNULL);
4508 }
4509 }
4510 }
4511
4512 if (*(safb->senseLen) > senseData.senseLen)
4513 *(safb->senseLen) = senseData.senseLen;
4514 // memcpy((void *)safb->pSenseData, senseData.senseData, safb->senseLen);
4515
4516 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOSuccess,
4517 scsi_status);
4518 break;
4519 }
4520
4521 if (data_status == 3)
4522 {
4523 /* RESERVED */
4524 TI_DBG1(("ossaFastSSPCompleted: reserved wrong!!!\n"));
4525
4526 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4527 scsi_status);
4528 break;
4529 }
4530 break;
4531 #ifdef REMOVED
4532 case OSSA_IO_OVERFLOW:
4533 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOOverRun,
4534 agIOInfoLen);
4535 break;
4536 #endif /* REMOVED */
4537 case OSSA_IO_UNDERFLOW:
4538 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOUnderRun,
4539 agIOInfoLen);
4540 break;
4541
4542 case OSSA_IO_ABORTED:
4543 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4544 tiDetailAborted);
4545 break;
4546 case OSSA_IO_ABORT_RESET:
4547 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4548 tiDetailAbortReset);
4549 break;
4550 case OSSA_IO_NO_DEVICE:
4551 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4552 tiDetailNoLogin);
4553 break;
4554 case OSSA_IO_DS_NON_OPERATIONAL:
4555 {
4556
4557 tdsaDeviceData_t *oneDeviceData;
4558
4559 oneDeviceData = (tdsaDeviceData_t*)safb->oneDeviceData;
4560 if (oneDeviceData->valid == agTRUE &&
4561 oneDeviceData->registered == agTRUE &&
4562 oneDeviceData->tdPortContext != agNULL)
4563 {
4564 saSetDeviceState(oneDeviceData->agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData),
4565 oneDeviceData->agDevHandle, SA_DS_OPERATIONAL);
4566 }
4567 /* fall through */
4568 }
4569
4570 default:
4571 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4572 tiDetailOtherError);
4573 break;
4574 }
4575
4576 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y6");
4577
4578 ext:
4579 TDSA_OUT_LEAVE((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4580 return;
4581 } /* ossaFastSSPCompleted */
4582 #endif
4583
4584 /*****************************************************************************/
4585 /*! \brief ossaSSPReqReceived
4586 *
4587 *
4588 * Purpose: This routine is called by lower layer to indicate the reception of
4589 * SMP request
4590 *
4591 * \param agRoot: Pointer to chip/driver Instance.
4592 * \param agDevHandle Pointer to the device handle of the device
4593 * \param agFrameHandle A Handle used to refer to the response frame
4594 * \param agInitiatorTag the initiator tag
4595 * \param agFrameType SSP frame type
4596 *
4597 * \return none.
4598 *
4599 * \note - The scope is target only
4600 * For details, refer to SAS/SATA Low-Level API Specification
4601 */
4602 /*****************************************************************************/
4603 osGLOBAL void ossaSSPReqReceived(
4604 agsaRoot_t *agRoot,
4605 agsaDevHandle_t *agDevHandle,
4606 agsaFrameHandle_t agFrameHandle,
4607 bit16 agInitiatorTag,
4608 bit32 parameter,
4609 bit32 agFrameLen
4610 )
4611 {
4612 /*
4613 at target only
4614 uses jumptable, not callback
4615 */
4616 /*
4617 agDevHandle_t->osData points to tdssDeviceData_t
4618 */
4619 tdsaDeviceData_t *pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
4620 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y7");
4621
4622 /* tdtypes.h, calling ttdsaSSPReqReceived() in ttdio.c */
4623 pDeviceData->pJumpTable->pSSPReqReceived (
4624 agRoot,
4625 agDevHandle,
4626 agFrameHandle,
4627 agInitiatorTag,
4628 parameter,
4629 agFrameLen
4630 );
4631 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y7");
4632 return;
4633 }
4634 /*****************************************************************************/
4635 /*! \brief ossaStallThread
4636 *
4637 *
4638 * Purpose: This routine is called to stall this thread for a number of
4639 * microseconds.
4640 *
4641 *
4642 * \param agRoot: Pointer to chip/driver Instance.
4643 * \param microseconds: Micro second to stall.
4644 *
4645 *
4646 * \return None.
4647 *
4648 * \note - The scope is shared target and initiator.
4649 *
4650 */
4651 /*****************************************************************************/
4652 osGLOBAL void ossaStallThread(agsaRoot_t *agRoot,
4653 bit32 microseconds
4654 )
4655 {
4656 tdsaRootOsData_t *pOsData = (tdsaRootOsData_t *) (agRoot->osData);
4657
4658 ostiStallThread (
4659 pOsData->tiRoot,
4660 microseconds
4661 );
4662 return;
4663 }
4664
4665
4666 /*****************************************************************************
4667 *! \brief ossaSSPEvent
4668 *
4669 * This routine is called to notify the OS Layer of an event associated with
4670 * SAS port or SAS device
4671 *
4672 * \param agRoot: Handles for this instance of SAS/SATA hardware
4673 * \param agIORequest Pointer to IO request
4674 * \param event: event type
4675 * \param agIOInfoLen: not in use
4676 * \param agFrameHandle: not in use
4677 *
4678 * \return: none
4679 *
4680 *****************************************************************************/
4681 /* in case of CMD ACK_NAK timeout, send query task */
4682 osGLOBAL void ossaSSPEvent(
4683 agsaRoot_t *agRoot,
4684 agsaIORequest_t *agIORequest,
4685 agsaPortContext_t *agPortContext,
4686 agsaDevHandle_t *agDevHandle,
4687 bit32 event,
4688 bit16 sspTag,
4689 bit32 agIOInfoLen,
4690 void *agParam
4691 )
4692 {
4693 #ifdef INITIATOR_DRIVER
4694 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4695 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4696 /* bit32 intContext = osData->IntContext; */
4697 void *osMemHandle;
4698 tdIORequestBody_t *TMtdIORequestBody;
4699 bit32 PhysUpper32;
4700 bit32 PhysLower32;
4701 bit32 memAllocStatus;
4702 bit32 agRequestType;
4703 agsaIORequest_t *agTMIORequest = agNULL; /* task management itself */
4704 agsaSASRequestBody_t *agSASRequestBody = agNULL;
4705 agsaSSPScsiTaskMgntReq_t *agSSPTaskMgntRequest;
4706 bit32 saStatus;
4707 bit32 agIORequestType; /* type of IO recevied */
4708 tiIORequest_t *taskTag; /* being task managed one */
4709 tdIORequestBody_t *tdIORequestBody;
4710 #endif
4711
4712 #ifdef REMOVED
4713 tiDeviceHandle_t *tiDeviceHandle;
4714 tdsaDeviceData_t *oneDeviceData = agNULL;
4715 tdIORequestBody_t *tdAbortIORequestBody;
4716 #endif
4717 agsaDifDetails_t agDifDetails;
4718 bit8 framePayload[256];
4719 #ifdef REMOVED
4720 bit16 frameOffset = 0;
4721 #endif
4722 bit16 frameLen = 0;
4723
4724 TI_DBG6(("ossaSSPEvent: start\n"));
4725 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y9");
4726
4727
4728
4729 if (event == OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT ||
4730 event == OSSA_IO_XFER_ERROR_BREAK ||
4731 event == OSSA_IO_XFER_ERROR_PHY_NOT_READY
4732 )
4733 {
4734
4735 /* IO being task managed(the original IO) depending on event */
4736 #ifdef INITIATOR_DRIVER
4737 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4738 taskTag = tdIORequestBody->tiIORequest;
4739 #endif
4740 #ifdef REMOVED
4741 tiDeviceHandle = tdIORequestBody->tiDevHandle;
4742 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
4743 #endif
4744
4745 #ifdef INITIATOR_DRIVER
4746 agIORequestType = tdIORequestBody->agRequestType;
4747
4748 /* error checking; only command is expected here */
4749 if (agIORequestType == AGSA_REQ_TYPE_UNKNOWN)
4750 {
4751 TI_DBG1(("ossaSSPEvent: incorrect frame 0x%x. Should be command\n", agIORequestType));
4752 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y9");
4753 return;
4754 }
4755
4756 /* Allocate memory for query task management */
4757 memAllocStatus = ostiAllocMemory(
4758 tiRoot,
4759 &osMemHandle,
4760 (void **)&TMtdIORequestBody,
4761 &PhysUpper32,
4762 &PhysLower32,
4763 8,
4764 sizeof(tdIORequestBody_t),
4765 agTRUE
4766 );
4767
4768 if (memAllocStatus != tiSuccess)
4769 {
4770 /* let os process IO */
4771 TI_DBG1(("ossaSSPEvent: ostiAllocMemory failed...\n"));
4772 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y9");
4773 return;
4774 }
4775
4776 if (TMtdIORequestBody == agNULL)
4777 {
4778 /* let os process IO */
4779 TI_DBG1(("ossaSSPEvent: ostiAllocMemory returned NULL TMIORequestBody\n"));
4780 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y9");
4781 return;
4782 }
4783
4784 /* setup task management structure */
4785 TMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
4786 /* TD generates Query Task not OS layer */
4787 TMtdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL;
4788 TMtdIORequestBody->IOType.InitiatorTMIO.TaskTag = taskTag;
4789
4790 /* initialize callback function */
4791 TMtdIORequestBody->IOCompletionFunc = itdssQueryTaskCompleted;
4792
4793 /* initialize tiDevhandle */
4794 TMtdIORequestBody->tiDevHandle = tdIORequestBody->tiDevHandle;
4795
4796
4797 /* initialize agIORequest */
4798 agTMIORequest = &(TMtdIORequestBody->agIORequest);
4799 agTMIORequest->osData = (void *) TMtdIORequestBody;
4800 agTMIORequest->sdkData = agNULL; /* LL takes care of this */
4801
4802 /* request type */
4803 agRequestType = AGSA_SSP_TASK_MGNT_REQ;
4804 TMtdIORequestBody->agRequestType = AGSA_SSP_TASK_MGNT_REQ;
4805
4806 /*
4807 initialize
4808 tdIORequestBody_t tdIORequestBody -> agSASRequestBody
4809 */
4810 agSASRequestBody = &(TMtdIORequestBody->transport.SAS.agSASRequestBody);
4811 agSSPTaskMgntRequest = &(agSASRequestBody->sspTaskMgntReq);
4812
4813 /* fill up LUN field */
4814 osti_memset(agSSPTaskMgntRequest->lun, 0, 8);
4815
4816 /* sets taskMgntFunction field */
4817 agSSPTaskMgntRequest->taskMgntFunction = AGSA_QUERY_TASK;
4818 /* debugging */
4819 if (TMtdIORequestBody->IOCompletionFunc == agNULL)
4820 {
4821 TI_DBG1(("ossaSSPEvent: Error !!! IOCompletionFunc is NULL\n"));
4822 }
4823 /* send query task management */
4824 saStatus = saSSPStart(agRoot,
4825 agTMIORequest,
4826 0,
4827 agDevHandle,
4828 agRequestType,
4829 agSASRequestBody,
4830 agIORequest,
4831 &ossaSSPCompleted);
4832
4833 if (saStatus != AGSA_RC_SUCCESS)
4834 {
4835 /* free up allocated memory */
4836 ostiFreeMemory(
4837 tiRoot,
4838 TMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
4839 sizeof(tdIORequestBody_t)
4840 );
4841 TI_DBG1(("ossaSSPEvent: saSSPStart failed\n"));
4842 return;
4843 }
4844 #endif
4845 }
4846 #ifdef REMOVED
4847 else if (event == OSSA_IO_ABORTED)
4848 {
4849 TI_DBG2(("ossaSSPEvent: OSSA_IO_ABORTED\n"));
4850 /* clean up TD layer's IORequestBody */
4851 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4852 ostiFreeMemory(
4853 tiRoot,
4854 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
4855 sizeof(tdIORequestBody_t)
4856 );
4857
4858 }
4859 else if (event == OSSA_IO_NOT_VALID)
4860 {
4861 TI_DBG1(("ossaSSPEvent: OSSA_IO_NOT_VALID\n"));
4862 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4863 ostiFreeMemory(
4864 tiRoot,
4865 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
4866 sizeof(tdIORequestBody_t)
4867 );
4868
4869
4870 }
4871 #endif
4872 else if (event == OSSA_IO_XFER_CMD_FRAME_ISSUED)
4873 {
4874 TI_DBG2(("ossaSSPEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED\n"));
4875 }
4876 else if (event == OSSA_IO_XFER_ERROR_OFFSET_MISMATCH)
4877 {
4878 TI_DBG1(("ossaSSPEvent: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH\n"));
4879 }
4880 else if (event == OSSA_IO_OVERFLOW)
4881 {
4882 TI_DBG1(("ossaSSPEvent: OSSA_IO_OVERFLOW\n"));
4883 /*
4884 ??? can't call; missing agIOInfoLen
4885 ostiInitiatorIOCompleted (
4886 tiRoot,
4887 tdIORequestBody->tiIORequest,
4888 tiIOOverRun,
4889 agIOInfoLen,
4890 agNULL,
4891 intContext
4892 );
4893
4894 */
4895
4896 }
4897 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED)
4898 {
4899 TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED\n"));
4900 }
4901 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO)
4902 {
4903 TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO\n"));
4904 }
4905 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST)
4906 {
4907 TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST\n"));
4908 }
4909 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE)
4910 {
4911 TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE\n"));
4912 }
4913 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED)
4914 {
4915 TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED\n"));
4916 }
4917 else if (event == OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH)
4918 {
4919 TI_DBG1(("ossaSSPEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH\n"));
4920 }
4921 else if (event == OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN)
4922 {
4923 TI_DBG1(("ossaSSPEvent: OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN\n"));
4924 }
4925 else if (event == OSSA_IO_XFR_ERROR_DIF_MISMATCH ||
4926 event == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH ||
4927 event == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH ||
4928 event == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH )
4929 {
4930 TI_DBG1(("ossaSSPEvent: DIF related, event 0x%x\n", event));
4931 /* process DIF detail information */
4932 TI_DBG2(("ossaSSPEvent: agIOInfoLen %d\n", agIOInfoLen));
4933 if (agParam == agNULL)
4934 {
4935 TI_DBG2(("ossaSSPEvent: agParam is NULL!!!\n"));
4936 return;
4937 }
4938 if (agIOInfoLen < sizeof(agsaDifDetails_t))
4939 {
4940 TI_DBG2(("ossaSSPEvent: wrong agIOInfoLen!!! agIOInfoLen %d sizeof(agsaDifDetails_t) %d\n", agIOInfoLen, (int)sizeof(agsaDifDetails_t)));
4941 return;
4942 }
4943 /* reads agsaDifDetails_t */
4944 saFrameReadBlock(agRoot, agParam, 0, &agDifDetails, sizeof(agsaDifDetails_t));
4945 #ifdef REMOVED
4946 frameOffset = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF);
4947 #endif
4948 frameLen = (bit16)((agDifDetails.ErrBoffsetEDataLen & 0xFFFF0000) >> 16);
4949
4950 TI_DBG2(("ossaSSPEvent: UpperLBA 0x%08x LowerLBA 0x%08x\n", agDifDetails.UpperLBA, agDifDetails.LowerLBA));
4951 TI_DBG2(("ossaSSPEvent: SASAddrHI 0x%08x SASAddrLO 0x%08x\n",
4952 TD_GET_SAS_ADDRESSHI(agDifDetails.sasAddressHi), TD_GET_SAS_ADDRESSLO(agDifDetails.sasAddressLo)));
4953 TI_DBG2(("ossaSSPEvent: DIF error mask 0x%x Device ID 0x%x\n",
4954 (agDifDetails.DIFErrDevID) & 0xFF, (agDifDetails.DIFErrDevID & 0xFFFF0000) >> 16));
4955 if (frameLen != 0 && frameLen <= 256)
4956 {
4957 saFrameReadBlock(agRoot, agParam, sizeof(agsaDifDetails_t), framePayload, frameLen);
4958 tdhexdump("ossaSSPEvent frame", framePayload, frameLen);
4959 }
4960 }
4961 else
4962 {
4963 TI_DBG1(("ossaSSPEvent: other event 0x%x\n", event));
4964 }
4965
4966 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y9");
4967 return;
4968 }
4969
4970 #ifdef FDS_SM
4971 osGLOBAL void ossaSATAIDAbortCB(
4972 agsaRoot_t *agRoot,
4973 agsaIORequest_t *agIORequest,
4974 bit32 flag,
4975 bit32 status)
4976 {
4977 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4978 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4979 tdIORequestBody_t *tdAbortIORequestBody;
4980
4981 TI_DBG1(("ossaSATAIDAbortCB: start flag %d status %d\n", flag, status));
4982
4983 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4984
4985 /*
4986 triggered by tdIDStartTimerCB
4987 */
4988 ostiFreeMemory(
4989 tiRoot,
4990 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
4991 sizeof(tdIORequestBody_t)
4992 );
4993 return;
4994 }
4995 #endif
4996
4997 #ifdef INITIATOR_DRIVER
4998 osGLOBAL void ossaSSPAbortCB(
4999 agsaRoot_t *agRoot,
5000 agsaIORequest_t *agIORequest,
5001 bit32 flag,
5002 bit32 status)
5003 {
5004 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5005 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5006 tdIORequestBody_t *tdAbortIORequestBody = agNULL;
5007 tdsaDeviceData_t *oneDeviceData = agNULL;
5008 tiDeviceHandle_t *tiDeviceHandle = agNULL;
5009 tiIORequest_t *taskTag = agNULL;
5010
5011 TI_DBG2(("ossaSSPAbortCB: start\n"));
5012 smTraceFuncEnter(hpDBG_VERY_LOUD,"Ya");
5013
5014 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5015 if (tdAbortIORequestBody == agNULL)
5016 {
5017 TI_DBG1(("ossaSSPAbortCB: tdAbortIORequestBody is NULL warning!!!!\n"));
5018 return;
5019 }
5020
5021 if (flag == 2)
5022 {
5023 /* abort per port */
5024 TI_DBG1(("ossaSSPAbortCB: abort per port\n"));
5025 }
5026 else if (flag == 1)
5027 {
5028 TI_DBG2(("ossaSSPAbortCB: abort all\n"));
5029
5030 tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
5031 if (tiDeviceHandle == agNULL)
5032 {
5033 TI_DBG1(("ossaSSPAbortCB: tiDeviceHandle is NULL warning!!!!\n"));
5034 ostiFreeMemory(
5035 tiRoot,
5036 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5037 sizeof(tdIORequestBody_t)
5038 );
5039 return;
5040 }
5041
5042 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
5043 if (oneDeviceData == agNULL)
5044 {
5045 TI_DBG1(("ossaSSPAbortCB: oneDeviceData is NULL warning!!!!\n"));
5046 ostiFreeMemory(
5047 tiRoot,
5048 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5049 sizeof(tdIORequestBody_t)
5050 );
5051 return;
5052 }
5053
5054 if (status == OSSA_IO_SUCCESS)
5055 {
5056 TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
5057 /* clean up TD layer's IORequestBody */
5058 if (oneDeviceData->OSAbortAll == agTRUE)
5059 {
5060 oneDeviceData->OSAbortAll = agFALSE;
5061 ostiInitiatorEvent( tiRoot,
5062 agNULL,
5063 tiDeviceHandle,
5064 tiIntrEventTypeLocalAbort,
5065 tiAbortOK,
5066 agNULL);
5067 }
5068 else
5069 {
5070 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5071 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5072 }
5073 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5074 ostiFreeMemory(
5075 tiRoot,
5076 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5077 sizeof(tdIORequestBody_t)
5078 );
5079
5080 }
5081 else if (status == OSSA_IO_NOT_VALID)
5082 {
5083 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
5084 /* clean up TD layer's IORequestBody */
5085 if (oneDeviceData->OSAbortAll == agTRUE)
5086 {
5087 oneDeviceData->OSAbortAll = agFALSE;
5088 ostiInitiatorEvent( tiRoot,
5089 agNULL,
5090 tiDeviceHandle,
5091 tiIntrEventTypeLocalAbort,
5092 tiAbortFailed,
5093 agNULL );
5094 }
5095 else
5096 {
5097 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5098 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5099 }
5100 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5101 ostiFreeMemory(
5102 tiRoot,
5103 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5104 sizeof(tdIORequestBody_t)
5105 );
5106 }
5107 else if (status == OSSA_IO_NO_DEVICE)
5108 {
5109 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
5110 /* clean up TD layer's IORequestBody */
5111 if (oneDeviceData->OSAbortAll == agTRUE)
5112 {
5113 oneDeviceData->OSAbortAll = agFALSE;
5114 ostiInitiatorEvent( tiRoot,
5115 agNULL,
5116 tiDeviceHandle,
5117 tiIntrEventTypeLocalAbort,
5118 tiAbortInProgress,
5119 agNULL );
5120 }
5121 else
5122 {
5123 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5124 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5125 }
5126 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5127 ostiFreeMemory(
5128 tiRoot,
5129 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5130 sizeof(tdIORequestBody_t)
5131 );
5132 }
5133 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
5134 {
5135 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
5136 /* clean up TD layer's IORequestBody */
5137 if (oneDeviceData->OSAbortAll == agTRUE)
5138 {
5139 oneDeviceData->OSAbortAll = agFALSE;
5140 ostiInitiatorEvent( tiRoot,
5141 agNULL,
5142 tiDeviceHandle,
5143 tiIntrEventTypeLocalAbort,
5144 tiAbortInProgress,
5145 agNULL );
5146 }
5147 else
5148 {
5149 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5150 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5151 }
5152 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5153 ostiFreeMemory(
5154 tiRoot,
5155 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5156 sizeof(tdIORequestBody_t)
5157 );
5158 }
5159 #ifdef REMOVED
5160 else if (status == OSSA_IO_ABORT_DELAYED)
5161 {
5162 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
5163 /* clean up TD layer's IORequestBody */
5164 if (oneDeviceData->OSAbortAll == agTRUE)
5165 {
5166 oneDeviceData->OSAbortAll = agFALSE;
5167 ostiInitiatorEvent( tiRoot,
5168 agNULL,
5169 tiDeviceHandle,
5170 tiIntrEventTypeLocalAbort,
5171 tiAbortDelayed,
5172 agNULL );
5173 }
5174 else
5175 {
5176 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5177 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5178 }
5179 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5180 ostiFreeMemory(
5181 tiRoot,
5182 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5183 sizeof(tdIORequestBody_t)
5184 );
5185 }
5186 #endif
5187 else
5188 {
5189 TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
5190 /* clean up TD layer's IORequestBody */
5191 if (oneDeviceData->OSAbortAll == agTRUE)
5192 {
5193 oneDeviceData->OSAbortAll = agFALSE;
5194 ostiInitiatorEvent( tiRoot,
5195 agNULL,
5196 tiDeviceHandle,
5197 tiIntrEventTypeLocalAbort,
5198 tiAbortInProgress,
5199 agNULL );
5200 }
5201 else
5202 {
5203 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5204 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5205 }
5206 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5207 ostiFreeMemory(
5208 tiRoot,
5209 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5210 sizeof(tdIORequestBody_t)
5211 );
5212 }
5213 }
5214 else if (flag == 0)
5215 {
5216 TI_DBG2(("ossaSSPAbortCB: abort one\n"));
5217 taskTag = tdAbortIORequestBody->tiIOToBeAbortedRequest;
5218
5219 if ( taskTag == agNULL)
5220 {
5221 TI_DBG1(("ossaSSPAbortCB: taskTag is NULL; triggered by itdssQueryTaskCompleted\n"));
5222 }
5223 if (status == OSSA_IO_SUCCESS)
5224 {
5225 TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
5226 if (taskTag != agNULL)
5227 {
5228 ostiInitiatorEvent( tiRoot,
5229 agNULL,
5230 agNULL,
5231 tiIntrEventTypeLocalAbort,
5232 tiAbortOK,
5233 taskTag );
5234 }
5235 ostiFreeMemory(
5236 tiRoot,
5237 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5238 sizeof(tdIORequestBody_t)
5239 );
5240
5241 }
5242 else if (status == OSSA_IO_NOT_VALID)
5243 {
5244 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
5245
5246 if (taskTag != agNULL)
5247 {
5248 ostiInitiatorEvent( tiRoot,
5249 agNULL,
5250 agNULL,
5251 tiIntrEventTypeLocalAbort,
5252 tiAbortFailed,
5253 taskTag );
5254 }
5255 ostiFreeMemory(
5256 tiRoot,
5257 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5258 sizeof(tdIORequestBody_t)
5259 );
5260 }
5261 else if (status == OSSA_IO_NO_DEVICE)
5262 {
5263 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
5264
5265 if (taskTag != agNULL)
5266 {
5267 ostiInitiatorEvent( tiRoot,
5268 agNULL,
5269 agNULL,
5270 tiIntrEventTypeLocalAbort,
5271 tiAbortInProgress,
5272 taskTag );
5273 }
5274 ostiFreeMemory(
5275 tiRoot,
5276 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5277 sizeof(tdIORequestBody_t)
5278 );
5279 }
5280 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
5281 {
5282 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
5283
5284 if (taskTag != agNULL)
5285 {
5286 ostiInitiatorEvent( tiRoot,
5287 agNULL,
5288 agNULL,
5289 tiIntrEventTypeLocalAbort,
5290 tiAbortInProgress,
5291 taskTag );
5292 }
5293 ostiFreeMemory(
5294 tiRoot,
5295 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5296 sizeof(tdIORequestBody_t)
5297 );
5298 }
5299 #ifdef REMOVED
5300 else if (status == OSSA_IO_ABORT_DELAYED)
5301 {
5302 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
5303
5304 if (taskTag != agNULL)
5305 {
5306 ostiInitiatorEvent( tiRoot,
5307 agNULL,
5308 agNULL,
5309 tiIntrEventTypeLocalAbort,
5310 tiAbortDelayed,
5311 taskTag );
5312 }
5313 ostiFreeMemory(
5314 tiRoot,
5315 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5316 sizeof(tdIORequestBody_t)
5317 );
5318 }
5319 #endif
5320 else
5321 {
5322 TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
5323
5324 if (taskTag != agNULL)
5325 {
5326 ostiInitiatorEvent( tiRoot,
5327 agNULL,
5328 agNULL,
5329 tiIntrEventTypeLocalAbort,
5330 tiAbortFailed,
5331 taskTag );
5332 }
5333 ostiFreeMemory(
5334 tiRoot,
5335 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5336 sizeof(tdIORequestBody_t)
5337 );
5338 }
5339 }
5340 else
5341 {
5342 TI_DBG1(("ossaSSPAbortCB: wrong flag %d\n", flag));
5343 }
5344 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ya");
5345 return;
5346
5347 }
5348 #endif
5349
5350
5351 #ifdef TARGET_DRIVER
5352 osGLOBAL void ossaSSPAbortCB(
5353 agsaRoot_t *agRoot,
5354 agsaIORequest_t *agIORequest,
5355 bit32 flag,
5356 bit32 status)
5357 {
5358 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5359 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5360 tdIORequestBody_t *tdAbortIORequestBody;
5361 tdsaDeviceData_t *oneDeviceData;
5362 tiDeviceHandle_t *tiDeviceHandle;
5363
5364 TI_DBG3(("ossaSSPAbortCB: start\n"));
5365 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5366
5367 if (flag == 2)
5368 {
5369 /* abort per port */
5370 TI_DBG2(("ossaSSPAbortCB: abort per port\n"));
5371 }
5372 else if (flag == 1)
5373 {
5374 TI_DBG2(("ossaSSPAbortCB: abort all\n"));
5375 tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
5376 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
5377 if (status == OSSA_IO_SUCCESS)
5378 {
5379 TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
5380 /* clean up TD layer's IORequestBody */
5381 TI_DBG3(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5382 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5383 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5384 ostiFreeMemory(
5385 tiRoot,
5386 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5387 sizeof(tdIORequestBody_t)
5388 );
5389
5390 }
5391 else if (status == OSSA_IO_NOT_VALID)
5392 {
5393 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
5394 /* clean up TD layer's IORequestBody */
5395 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5396 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5397 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5398 ostiFreeMemory(
5399 tiRoot,
5400 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5401 sizeof(tdIORequestBody_t)
5402 );
5403 }
5404 else if (status == OSSA_IO_NO_DEVICE)
5405 {
5406 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
5407 /* clean up TD layer's IORequestBody */
5408 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5409 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5410 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5411 ostiFreeMemory(
5412 tiRoot,
5413 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5414 sizeof(tdIORequestBody_t)
5415 );
5416 }
5417 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
5418 {
5419 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
5420 /* clean up TD layer's IORequestBody */
5421 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5422 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5423 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5424 ostiFreeMemory(
5425 tiRoot,
5426 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5427 sizeof(tdIORequestBody_t)
5428 );
5429 }
5430 #ifdef REMOVED
5431 else if (status == OSSA_IO_ABORT_DELAYED)
5432 {
5433 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
5434 /* clean up TD layer's IORequestBody */
5435 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5436 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5437 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5438 ostiFreeMemory(
5439 tiRoot,
5440 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5441 sizeof(tdIORequestBody_t)
5442 );
5443 }
5444 #endif
5445 else
5446 {
5447 TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
5448 /* clean up TD layer's IORequestBody */
5449 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5450 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5451 TI_DBG1(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5452 ostiFreeMemory(
5453 tiRoot,
5454 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5455 sizeof(tdIORequestBody_t)
5456 );
5457 }
5458 }
5459 else if (flag == 0)
5460 {
5461 TI_DBG2(("ossaSSPAbortCB: abort one\n"));
5462 if (status == OSSA_IO_SUCCESS)
5463 {
5464 TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
5465 ostiFreeMemory(
5466 tiRoot,
5467 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5468 sizeof(tdIORequestBody_t)
5469 );
5470
5471 }
5472 else if (status == OSSA_IO_NOT_VALID)
5473 {
5474 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
5475 ostiFreeMemory(
5476 tiRoot,
5477 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5478 sizeof(tdIORequestBody_t)
5479 );
5480 }
5481 else if (status == OSSA_IO_NO_DEVICE)
5482 {
5483 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
5484 ostiFreeMemory(
5485 tiRoot,
5486 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5487 sizeof(tdIORequestBody_t)
5488 );
5489 }
5490 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
5491 {
5492 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
5493 ostiFreeMemory(
5494 tiRoot,
5495 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5496 sizeof(tdIORequestBody_t)
5497 );
5498 }
5499 #ifdef REMOVED
5500 else if (status == OSSA_IO_ABORT_DELAYED)
5501 {
5502 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
5503 ostiFreeMemory(
5504 tiRoot,
5505 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5506 sizeof(tdIORequestBody_t)
5507 );
5508 }
5509 #endif
5510 else
5511 {
5512 TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
5513 ostiFreeMemory(
5514 tiRoot,
5515 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5516 sizeof(tdIORequestBody_t)
5517 );
5518 }
5519 }
5520 else
5521 {
5522 TI_DBG1(("ossaSSPAbortCB: wrong flag %d\n", flag));
5523 }
5524
5525 return;
5526
5527 }
5528 #endif
5529
5530
5531 /*****************************************************************************/
5532 /*! \brief ossaLocalPhyControlCB
5533 *
5534 *
5535 * Purpose: This routine is called by lower layer to indicate the status of
5536 * phy operations
5537 *
5538 * \param agRoot: Pointer to chip/driver Instance.
5539 * \param phyId Phy id
5540 * \param phyOperation Operation to be done on the phy
5541 * \param status Phy operation specific completion status
5542 * \param parm Additional parameter, phy operation and status specific
5543 *
5544 *
5545 * \return None.
5546 *
5547 */
5548 /*****************************************************************************/
5549 osGLOBAL void ossaLocalPhyControlCB(
5550 agsaRoot_t *agRoot,
5551 agsaContext_t *agContext,
5552 bit32 phyId,
5553 bit32 phyOperation,
5554 bit32 status,
5555 void *parm
5556 )
5557 {
5558 #ifdef REMVOED
5559 agsaPhyErrCounters_t *agPhyErrCounters;
5560 #endif
5561 #ifdef INITIATOR_DRIVER
5562 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5563 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5564 tiIORequest_t *currentTaskTag;
5565 tdsaDeviceData_t *TargetDeviceData;
5566 satDeviceData_t *pSatDevData;
5567 agsaDevHandle_t *agDevHandle = agNULL;
5568 agsaContext_t *agContextDevice;
5569 #endif
5570
5571 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yb");
5572 TI_DBG3(("ossaLocalPhyControlCB: start phyID %d\n", phyId));
5573 TI_DBG3(("ossaLocalPhyControlCB: phyOperation %d status 0x%x\n", phyOperation, status));
5574 switch (phyOperation)
5575 {
5576 case AGSA_PHY_LINK_RESET: /* fall through */
5577 case AGSA_PHY_HARD_RESET:
5578 if (phyOperation == AGSA_PHY_LINK_RESET)
5579 {
5580 TI_DBG1(("ossaLocalPhyControlCB: AGSA_PHY_LINK_RESET, status 0x%x\n", status));
5581 }
5582 else
5583 {
5584 TI_DBG1(("ossaLocalPhyControlCB: AGSA_PHY_HARD_RESET, status 0x%x\n", status));
5585 }
5586 #ifdef INITIATOR_DRIVER
5587 if (agContext != agNULL)
5588 {
5589 currentTaskTag = (tiIORequest_t *)agContext->osData;
5590 if (status == OSSA_SUCCESS)
5591 {
5592 if (currentTaskTag != agNULL)
5593 {
5594 TI_DBG2(("ossaLocalPhyControlCB: callback to OS layer with success\n"));
5595 TargetDeviceData = (tdsaDeviceData_t *)currentTaskTag->tdData;
5596 pSatDevData = (satDeviceData_t *)&(TargetDeviceData->satDevData);
5597 agDevHandle = TargetDeviceData->agDevHandle;
5598 TI_DBG2(("ossaLocalPhyControlCB: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
5599 TI_DBG2(("ossaLocalPhyControlCB: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
5600 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
5601
5602 if (TargetDeviceData->TRflag == agTRUE)
5603 {
5604 saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, TargetDeviceData), agDevHandle, SA_DS_OPERATIONAL);
5605 TargetDeviceData->TRflag = agFALSE;
5606 ostiInitiatorEvent(tiRoot,
5607 TargetDeviceData->tdPortContext->tiPortalContext,
5608 &(TargetDeviceData->tiDeviceHandle),
5609 tiIntrEventTypeTransportRecovery,
5610 tiRecOK,
5611 agNULL
5612 );
5613 }
5614 else
5615 {
5616 agDevHandle = TargetDeviceData->agDevHandle;
5617 if (agDevHandle == agNULL)
5618 {
5619 TI_DBG1(("ossaLocalPhyControlCB: wrong, agDevHandle is NULL\n"));
5620 }
5621 /* move this to OSSA_HW_EVENT_PORT_RESET_COMPLETE in ossaHwCB() */
5622 agContextDevice = &(TargetDeviceData->agDeviceResetContext);
5623 agContextDevice->osData = currentTaskTag;
5624
5625 #ifdef REMOVED
5626 ostiInitiatorEvent( tiRoot,
5627 NULL,
5628 NULL,
5629 tiIntrEventTypeTaskManagement,
5630 tiTMOK,
5631 currentTaskTag );
5632 #endif
5633 }
5634 }
5635 }
5636 else
5637 {
5638 if (currentTaskTag != agNULL)
5639 {
5640 TI_DBG1(("ossaLocalPhyControlCB: callback to OS layer with failure\n"));
5641 TargetDeviceData = (tdsaDeviceData_t *)currentTaskTag->tdData;
5642 pSatDevData = (satDeviceData_t *)&(TargetDeviceData->satDevData);
5643 TI_DBG1(("ossaLocalPhyControlCB: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
5644 TI_DBG1(("ossaLocalPhyControlCB: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
5645 if (TargetDeviceData->TRflag == agTRUE)
5646 {
5647 TargetDeviceData->TRflag = agFALSE;
5648 ostiInitiatorEvent(tiRoot,
5649 TargetDeviceData->tdPortContext->tiPortalContext,
5650 &(TargetDeviceData->tiDeviceHandle),
5651 tiIntrEventTypeTransportRecovery,
5652 tiRecFailed ,
5653 agNULL
5654 );
5655 }
5656 else
5657 {
5658 ostiInitiatorEvent( tiRoot,
5659 NULL,
5660 NULL,
5661 tiIntrEventTypeTaskManagement,
5662 tiTMFailed,
5663 currentTaskTag );
5664 }
5665 }
5666 }
5667 }
5668 #endif
5669 break;
5670 #ifdef REMOVED
5671 case AGSA_PHY_GET_ERROR_COUNTS:
5672
5673 TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_GET_ERROR_COUNTS, status 0x%x\n", status));
5674 if(parm !=agNULL )
5675 {
5676 agPhyErrCounters = (agsaPhyErrCounters_t *)parm;
5677 TI_DBG2(("ossaLocalPhyControlCB: invalidDword %d\n", agPhyErrCounters->invalidDword));
5678 TI_DBG2(("ossaLocalPhyControlCB: runningDisparityError %d\n", agPhyErrCounters->runningDisparityError));
5679 TI_DBG2(("ossaLocalPhyControlCB: lostOfDwordSynch %d\n", agPhyErrCounters->lossOfDwordSynch));
5680 TI_DBG2(("ossaLocalPhyControlCB: phyResetProblem %d\n", agPhyErrCounters->phyResetProblem));
5681 TI_DBG2(("ossaLocalPhyControlCB: elasticityBufferOverflow %d\n", agPhyErrCounters->elasticityBufferOverflow));
5682 TI_DBG2(("ossaLocalPhyControlCB: receivedErrorPrimitive %d\n", agPhyErrCounters->receivedErrorPrimitive));
5683 }
5684 break;
5685 case AGSA_PHY_CLEAR_ERROR_COUNTS:
5686 TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_CLEAR_ERROR_COUNTS, status 0x%x\n", status));
5687 break;
5688 #endif
5689 case AGSA_PHY_NOTIFY_ENABLE_SPINUP:
5690 TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_NOTIFY_ENABLE_SPINUP, status 0x%x\n", status));
5691 break;
5692 case AGSA_PHY_BROADCAST_ASYNCH_EVENT:
5693 TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_BROADCAST_ASYNCH_EVENT, status 0x%x\n", status));
5694 if (tIsSPC12SATA(agRoot))
5695 {
5696 TI_DBG1(("ossaLocalPhyControlCB: BROADCAST_ASYNCH_EVENT received for SATA Controller\n"));
5697 break;
5698 }
5699 break;
5700 case AGSA_PHY_COMINIT_OOB :
5701 TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_COMINIT_OOB, status 0x%x\n", status));
5702 break;
5703 default:
5704 TI_DBG1(("ossaLocalPhyControlCB: UNKNOWN default case. phyOperation %d status 0x%x\n", phyOperation, status));
5705 break;
5706 }
5707 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yb");
5708 return;
5709 }
5710
5711 GLOBAL void ossaGetPhyProfileCB(
5712 agsaRoot_t *agRoot,
5713 agsaContext_t *agContext,
5714 bit32 status,
5715 bit32 ppc,
5716 bit32 phyID,
5717 void *parm )
5718 {
5719
5720 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5721 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5722 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
5723 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5724 #ifdef CCFLAGS_PHYCONTROL_COUNTS
5725 agsaPhyAnalogSettingsPage_t *analog;
5726 #endif /* CCFLAGS_PHYCONTROL_COUNTS */
5727 tdPhyCount_t *PhyBlob = agNULL;
5728
5729 agsaPhyBWCountersPage_t *agBWCounters;
5730 agsaPhyErrCountersPage_t *agPhyErrCounters;
5731 TI_DBG1(("ossaGetPhyProfileCB: agContext %p parm %p\n", agContext, parm));
5732 /*
5733 if( tdsaAllShared->tdFWControlEx.inProgress )
5734 {
5735 tdsaAllShared->tdFWControlEx.inProgress = 0;
5736 PhyBlob = (tdPhyCount_t *)tdsaAllShared->tdFWControlEx.usrAddr;
5737 }
5738 */
5739 switch(ppc)
5740 {
5741 case AGSA_SAS_PHY_BW_COUNTERS_PAGE:
5742 TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_BW_COUNTERS_PAGE, status 0x%x phyID %d\n", status, phyID));
5743 if(parm !=agNULL )
5744 {
5745 agBWCounters = (agsaPhyBWCountersPage_t *)parm;
5746 TI_DBG1(("ossaGetPhyProfileCB: RX %d TX %d\n", agBWCounters->RXBWCounter,agBWCounters->TXBWCounter));
5747 if(PhyBlob !=agNULL )
5748 {
5749 PhyBlob->InvalidDword = 0;
5750 PhyBlob->runningDisparityError = 0;
5751 PhyBlob->codeViolation = 0;
5752 PhyBlob->phyResetProblem = 0;
5753 PhyBlob->inboundCRCError = 0;
5754 PhyBlob->BW_rx = agBWCounters->RXBWCounter;
5755 PhyBlob->BW_tx = agBWCounters->TXBWCounter;
5756 }
5757
5758 }
5759 break;
5760 case AGSA_SAS_PHY_ERR_COUNTERS_PAGE:
5761 if( tdsaAllShared->tdFWControlEx.inProgress )
5762 {
5763 tdsaAllShared->tdFWControlEx.inProgress = 0;
5764 PhyBlob = (tdPhyCount_t *)tdsaAllShared->tdFWControlEx.usrAddr;
5765 }
5766 TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_ERR_COUNTERS_PAGE, status 0x%x phyID %d\n", status, phyID));
5767 if(parm !=agNULL )
5768 {
5769 agPhyErrCounters = (agsaPhyErrCountersPage_t *)parm;
5770 if(PhyBlob !=agNULL )
5771 {
5772
5773 PhyBlob->InvalidDword = agPhyErrCounters->invalidDword;
5774 PhyBlob->runningDisparityError = agPhyErrCounters->runningDisparityError;
5775 PhyBlob->LossOfSyncDW = agPhyErrCounters->lossOfDwordSynch;
5776 PhyBlob->codeViolation = agPhyErrCounters->codeViolation;
5777 PhyBlob->phyResetProblem = agPhyErrCounters->phyResetProblem;
5778 PhyBlob->inboundCRCError = agPhyErrCounters->inboundCRCError;
5779 PhyBlob->BW_rx = 0;
5780 PhyBlob->BW_tx = 0;
5781
5782 TI_DBG2(("ossaGetPhyProfileCB: invalidDword %d\n", agPhyErrCounters->invalidDword));
5783 TI_DBG2(("ossaGetPhyProfileCB: runningDisparityError %d\n", agPhyErrCounters->runningDisparityError));
5784 TI_DBG2(("ossaGetPhyProfileCB: lostOfDwordSynch %d\n", agPhyErrCounters->lossOfDwordSynch));
5785 TI_DBG2(("ossaGetPhyProfileCB: phyResetProblem %d\n", agPhyErrCounters->phyResetProblem));
5786 TI_DBG2(("ossaGetPhyProfileCB: inboundCRCError %d\n", agPhyErrCounters->inboundCRCError));
5787 }
5788 }
5789 break;
5790 case AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE:
5791 TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE status 0x%x phyID %d\n", status, phyID));
5792 break;
5793 case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
5794 TI_DBG1(("ossaGetPhyProfileCB:AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE status 0x%x phyID %d\n", status, phyID));
5795 #ifdef CCFLAGS_PHYCONTROL_COUNTS
5796 if(parm !=agNULL )
5797 {
5798 analog = (agsaPhyAnalogSettingsPage_t *)parm;
5799 TI_DBG1(("ossaGetPhyProfileCB: 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
5800 analog->Dword0, analog->Dword1, analog->Dword2, analog->Dword3, analog->Dword4,
5801 analog->Dword5, analog->Dword6, analog->Dword7, analog->Dword8, analog->Dword9));
5802 tdsaAllShared->analog[phyID].spaRegister0 = analog->Dword0;
5803 tdsaAllShared->analog[phyID].spaRegister1 = analog->Dword1;
5804 tdsaAllShared->analog[phyID].spaRegister2 = analog->Dword2;
5805 tdsaAllShared->analog[phyID].spaRegister3 = analog->Dword3;
5806 tdsaAllShared->analog[phyID].spaRegister4 = analog->Dword4;
5807 saSetPhyProfile( agRoot,agContext,tdsaRotateQnumber(tiRoot, agNULL), AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE,sizeof(agsaPhyAnalogSetupRegisters_t),&tdsaAllShared->analog[phyID],phyID);
5808 }
5809 #endif /* CCFLAGS_PHYCONTROL_COUNTS */
5810 break;
5811 case AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE:
5812 {
5813 TI_DBG1(("ossaGetPhyProfileCB:AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE status 0x%x phyID %d\n", status, phyID));
5814 if( parm !=agNULL )
5815 {
5816 #ifdef TD_DEBUG_ENABLE
5817 agsaSASPhyOpenRejectRetryBackOffThresholdPage_t *Backoff =
5818 (agsaSASPhyOpenRejectRetryBackOffThresholdPage_t *)parm;
5819 #endif
5820 TI_DBG2(("ossaGetPhyProfileCB: DW0 0x%X DW1 0x%X DW2 0x%X DW3 0x%X\n",
5821 Backoff->Dword0,Backoff->Dword1,
5822 Backoff->Dword2,Backoff->Dword3));
5823 }
5824 break;
5825 }
5826
5827 case AGSA_SAS_PHY_GENERAL_STATUS_PAGE:
5828 {
5829 agsaSASPhyGeneralStatusPage_t * GenStatus = NULL;
5830
5831 TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_GENERAL_STATUS_PAGE status 0x%x phyID %d\n",
5832 status, phyID));
5833 if( parm !=agNULL )
5834 {
5835 GenStatus=
5836 (agsaSASPhyGeneralStatusPage_t *)parm;
5837 TI_DBG2(("ossaGetPhyProfileCB: "
5838 "AGSA_SAS_PHY_GENERAL_STATUS_PAGE status %d DW0 0x%x DW1 0x%x\n",
5839 status, GenStatus->Dword0, GenStatus->Dword1));
5840 }
5841 ostiGetPhyGeneralStatusRsp(tiRoot, GenStatus, phyID);
5842 // break;
5843 return ;
5844 }
5845
5846 default:
5847 TI_DBG1(("ossaGetPhyProfileCB: UNKNOWN default case. phyOperation %d status 0x%x\n", ppc, status));
5848 break;
5849
5850 }
5851
5852 ostiGetPhyProfileIOCTLRsp(tiRoot, status);
5853
5854 }
5855
5856
5857 GLOBAL void ossaSetPhyProfileCB(
5858 agsaRoot_t *agRoot,
5859 agsaContext_t *agContext,
5860 bit32 status,
5861 bit32 ppc,
5862 bit32 phyID,
5863 void *parm )
5864 {
5865 TI_DBG1(("ossaSetPhyProfileCB:agContext %p status 0x%x ppc %d phyID %d parm %p\n",agContext, status, ppc, phyID,parm));
5866 }
5867
5868
5869 /*****************************************************************************/
5870 /*! \brief ossaGetDeviceHandlesCB
5871 *
5872 *
5873 * Purpose: This routine is called by lower layer to corresponding to
5874 * saGetDeviceHandles()
5875 *
5876 * \param agRoot: Pointer to chip/driver Instance.
5877 * \param agContext: Context of the get device handle request originally passed into
5878 * saGetDeviceHandles().
5879 * \param agPortContext:Pointer to this instance of a port context
5880 * \param agDev: Array containing pointers to the device handles
5881
5882 * \param validDevs Number of valid device handles
5883 *
5884 *
5885 * \return None.
5886 *
5887 * \note - The scope is shared target and initiator.
5888 * For details, refer to SAS/SATA Low-Level API Specification
5889 */
5890 /*****************************************************************************/
5891 osGLOBAL void ossaGetDeviceHandlesCB(
5892 agsaRoot_t *agRoot,
5893 agsaContext_t *agContext,
5894 agsaPortContext_t *agPortContext,
5895 agsaDevHandle_t *agDev[],
5896 bit32 validDevs
5897 )
5898 {
5899 TI_DBG2(("ossaGetDeviceHandlesCB: start\n"));
5900 TI_DBG2(("ossaGetDeviceHandlesCB: validDevs %d\n", validDevs));
5901 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yc");
5902 #ifdef TO_DO
5903 for (i = 0 ; i < validDevs ; i++)
5904 {
5905 agDev[i];
5906 }
5907 #endif
5908 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yc");
5909 return;
5910 }
5911
5912 /*****************************************************************************/
5913 /*! \brief ossaGetDeviceInfoCB
5914 *
5915 *
5916 * Purpose: This routine is called by lower layer to corresponding to
5917 * saGetDeviceInfo()
5918 *
5919 * \param agRoot: Pointer to chip/driver Instance.
5920 * \param agDevHandle: Handle of the device
5921 * \param status: status
5922 * \param agInfo: Pointer to the structure that describes device information
5923 *
5924 *
5925 * \return None.
5926 *
5927 * \note - The scope is shared target and initiator.
5928 * For details, refer to SAS/SATA Low-Level API Specification
5929 */
5930 /*****************************************************************************/
5931 osGLOBAL void ossaGetDeviceInfoCB(
5932 agsaRoot_t *agRoot,
5933 agsaContext_t *agContext,
5934 agsaDevHandle_t *agDevHandle,
5935 bit32 status,
5936 void *agInfo
5937 )
5938 {
5939
5940 #ifdef TD_DEBUG_ENABLE
5941 agsaDeviceInfo_t *agDeviceInfo;
5942 agsaSASDeviceInfo_t *agSASDeviceInfo;
5943 agsaSATADeviceInfo_t *agSATADeviceInfo;
5944 #endif
5945 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yd");
5946
5947 TI_DBG1(("ossaGetDeviceInfoCB: start agContext %p\n",agContext));
5948 switch (status)
5949 {
5950 case OSSA_DEV_INFO_INVALID_HANDLE:
5951 TI_DBG1(("ossaGetDeviceInfoCB: OSSA_DEV_INFO_INVALID_HANDLE\n"));
5952 /*ostiGetDeviceInfoIOCTLRsp(tiRoot, status, agNULL);*/
5953 break;
5954 case OSSA_DEV_INFO_NO_EXTENDED_INFO:
5955 #ifdef TD_DEBUG_ENABLE
5956 agDeviceInfo = (agsaDeviceInfo_t *)agInfo;
5957 #endif
5958 TI_DBG1(("ossaGetDeviceInfoCB: OSSA_DEV_INFO_NO_EXTENDED_INFO\n"));
5959 TI_DBG1(("ossaGetDeviceInfoCB: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(agDeviceInfo)));
5960 TI_DBG1(("ossaGetDeviceInfoCB: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(agDeviceInfo)));
5961 TI_DBG1(("ossaGetDeviceInfoCB: devType_S_Rate 0x%08x\n", agDeviceInfo->devType_S_Rate));
5962 TI_DBG1(("ossaGetDeviceInfoCB: firstBurstSize 0x%08x\n", agDeviceInfo->firstBurstSize));
5963
5964 /*ostiPortEvent (tiRoot, tiGetDevInfo, tiSuccess,(void *)agContext );*/
5965 /*ostiGetDeviceInfoIOCTLRsp(tiRoot, status, agDeviceInfo);*/
5966 break;
5967 case OSSA_DEV_INFO_SAS_EXTENDED_INFO:
5968 #ifdef TD_DEBUG_ENABLE
5969 agSASDeviceInfo = (agsaSASDeviceInfo_t *)agInfo;
5970 #endif
5971 TI_DBG2(("ossaGetDeviceInfoCB: OSSA_DEV_INFO_SAS_EXTENDED_INFO\n"));
5972 TI_DBG2(("ossaGetDeviceInfoCB: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(&agSASDeviceInfo->commonDevInfo)));
5973 TI_DBG2(("ossaGetDeviceInfoCB: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(&agSASDeviceInfo->commonDevInfo)));
5974 TI_DBG2(("ossaGetDeviceInfoCB: initiator_ssp_stp_smp %d\n", agSASDeviceInfo->initiator_ssp_stp_smp));
5975 TI_DBG2(("ossaGetDeviceInfoCB: target_ssp_stp_smp %d\n", agSASDeviceInfo->target_ssp_stp_smp));
5976 TI_DBG2(("ossaGetDeviceInfoCB: numOfPhys %d\n", agSASDeviceInfo->numOfPhys));
5977 TI_DBG2(("ossaGetDeviceInfoCB: phyIdentifier %d\n", agSASDeviceInfo->phyIdentifier));
5978
5979 break;
5980 case OSSA_DEV_INFO_SATA_EXTENDED_INFO:
5981 #ifdef TD_DEBUG_ENABLE
5982 agSATADeviceInfo = (agsaSATADeviceInfo_t *)agInfo;
5983 #endif
5984 TI_DBG2(("ossaGetDeviceInfoCB: OSSA_DEV_INFO_SATA_EXTENDED_INFO\n"));
5985 TI_DBG2(("ossaGetDeviceInfoCB: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(&agSATADeviceInfo->commonDevInfo)));
5986 TI_DBG2(("ossaGetDeviceInfoCB: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(&agSATADeviceInfo->commonDevInfo)));
5987 TI_DBG2(("ossaGetDeviceInfoCB: connection %d\n", agSATADeviceInfo->connection));
5988 TI_DBG2(("ossaGetDeviceInfoCB: portMultiplierField %d\n", agSATADeviceInfo->portMultiplierField));
5989 TI_DBG2(("ossaGetDeviceInfoCB: stpPhyIdentifier %d\n", agSATADeviceInfo->stpPhyIdentifier));
5990 #ifdef TD_DEBUG_ENABLE
5991 tdhexdump("ossaGetDeviceInfoCB: signature", (bit8 *)agSATADeviceInfo->signature, 8);
5992 #endif
5993 break;
5994 default:
5995 TI_DBG2(("ossaGetDeviceInfoCB: error default case, status is %d\n", status));
5996 break;
5997 }
5998 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yd");
5999 return;
6000 }
6001
6002 /*****************************************************************************/
6003 /*! \brief ossaDeviceRegistrationCB
6004 *
6005 *
6006 * Purpose: This routine is called by lower layer to corresponding to
6007 * saRegisterNewDevice()
6008 *
6009 * \param agRoot: Pointer to chip/driver Instance.
6010 * \param agContext: Context of the get device handle request originally
6011 * passed into saRegisterNewDevice().
6012 * \param status: status
6013 * \param agDevHandle: Pointer to the assigned device handle for the
6014 * registered device.
6015 *
6016 *
6017 * \return None.
6018 *
6019 */
6020 /*****************************************************************************/
6021 osGLOBAL void ossaDeviceRegistrationCB(
6022 agsaRoot_t *agRoot,
6023 agsaContext_t *agContext,
6024 bit32 status,
6025 agsaDevHandle_t *agDevHandle,
6026 bit32 deviceID
6027 )
6028 {
6029 #ifdef INITIATOR_DRIVER
6030 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6031 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6032 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
6033 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6034 bit32 Indenom = tdsaAllShared->QueueConfig.numInboundQueues;
6035 bit32 Outdenom = tdsaAllShared->QueueConfig.numOutboundQueues;
6036 tdsaDeviceData_t *oneDeviceData = (tdsaDeviceData_t *)agContext->osData;
6037 tdsaPortContext_t *onePortContext = oneDeviceData->tdPortContext;
6038 tiPortalContext_t *tiPortalContext = onePortContext->tiPortalContext;
6039 #ifdef FDS_DM
6040 dmRoot_t *dmRoot = &(tdsaAllShared->dmRoot);
6041 dmPortContext_t *dmPortContext = &(onePortContext->dmPortContext);
6042 dmDeviceInfo_t dmDeviceInfo;
6043 bit32 DMstatus = DM_RC_FAILURE;
6044 bit16 ext = 0;
6045 bit32 expanderType = 1;
6046 #endif
6047
6048 #if defined(FDS_DM) && !defined(FDS_SM)
6049 bit32 IDstatus;
6050 #endif
6051
6052 #ifdef FDS_SM
6053 smRoot_t *smRoot = &(tdsaAllShared->smRoot);
6054 bit32 SMstatus = SM_RC_FAILURE;
6055 #endif
6056 smTraceFuncEnter(hpDBG_VERY_LOUD,"Ye");
6057 TI_DBG3(("ossaDeviceRegistrationCB: start status 0x%x\n",status));
6058 TI_DBG3(("ossaDeviceRegistrationCB: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
6059 TI_DBG3(("ossaDeviceRegistrationCB: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
6060 TI_DBG3(("ossaDeviceRegistrationCB: did 0x%x\n", oneDeviceData->id));
6061 TI_DBG3(("ossaDeviceRegistrationCB: deviceID 0x%x\n", deviceID));
6062 TI_DBG3(("ossaDeviceRegistrationCB: agDevHandle %p %p %p\n",agDevHandle,agDevHandle->osData,agDevHandle->sdkData ));
6063
6064 /* transient period caused by tdssReportRemovals(), device was in the middle
6065 of registration but port is invalidated
6066 */
6067 if (oneDeviceData->valid == agFALSE && oneDeviceData->valid2 == agFALSE
6068 && oneDeviceData->DeviceType == TD_DEFAULT_DEVICE)
6069 {
6070 if (status == OSSA_SUCCESS)
6071 {
6072 TI_DBG2(("ossaDeviceRegistrationCB: transient, calling saDeregisterDeviceHandle, did %d\n", oneDeviceData->id));
6073 oneDeviceData->agDevHandle = agDevHandle;
6074 agDevHandle->osData = oneDeviceData;
6075 if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6076 {
6077 if (oneDeviceData->satDevData.IDDeviceValid == agFALSE)
6078 {
6079 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, 0);
6080 }
6081 else
6082 {
6083 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
6084 }
6085 }
6086 else
6087 {
6088 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
6089 }
6090 }
6091 else if (status == OSSA_FAILURE_PORT_NOT_VALID_STATE || status == OSSA_ERR_PORT_STATE_NOT_VALID)
6092 {
6093 /* do nothing */
6094 TI_DBG2(("ossaDeviceRegistrationCB: transient, do nothing did %d\n", oneDeviceData->id));
6095 }
6096 return;
6097 }
6098
6099 if (agDevHandle == agNULL)
6100 {
6101 TI_DBG3(("ossaDeviceRegistrationCB: agDevHandle is NULL\n"));
6102 }
6103 else
6104 {
6105 TI_DBG3(("ossaDeviceRegistrationCB: agDevHandle is NOT NULL\n"));
6106 }
6107
6108 switch (status)
6109 {
6110 case OSSA_SUCCESS:
6111 TI_DBG3(("ossaDeviceRegistrationCB: success\n"));
6112 TI_DBG2(("ossaDeviceRegistrationCB: Success did %d FW did 0x%x\n", oneDeviceData->id, deviceID));
6113 TI_DBG2(("ossaDeviceRegistrationCB: Success pid %d\n", onePortContext->id));
6114 if (agDevHandle == agNULL)
6115 {
6116 TI_DBG1(("ossaDeviceRegistrationCB: agDevHandle is NULL, wrong!\n"));
6117 return;
6118 }
6119 oneDeviceData->agDevHandle = agDevHandle;
6120 agDevHandle->osData = oneDeviceData;
6121 oneDeviceData->registered = agTRUE;
6122 oneDeviceData->InQID = oneDeviceData->id % Indenom;
6123 oneDeviceData->OutQID = oneDeviceData->id % Outdenom;
6124 onePortContext->RegisteredDevNums++;
6125
6126 TI_DBG3(("ossaDeviceRegistrationCB: direct %d STP target %d target_ssp_stp_smp %d\n", oneDeviceData->directlyAttached, DEVICE_IS_STP_TARGET(oneDeviceData), oneDeviceData->target_ssp_stp_smp));
6127 TI_DBG3(("ossaDeviceRegistrationCB: pid %d registeredNumDevice %d\n", onePortContext->id, onePortContext->RegisteredDevNums));
6128 TI_DBG3(("ossaDeviceRegistrationCB: pid %d Count %d\n", onePortContext->id, onePortContext->Count));
6129
6130 #ifdef FDS_DM
6131 /* if device is an expander, register it to DM */
6132 if (onePortContext->valid == agTRUE)
6133 {
6134 if (DEVICE_IS_SMP_TARGET(oneDeviceData))
6135 {
6136 TI_DBG1(("ossaDeviceRegistrationCB: calling dmRegisterDevice\n"));
6137 TI_DBG1(("ossaDeviceRegistrationCB: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
6138 TI_DBG1(("ossaDeviceRegistrationCB: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
6139 /* set up dmDeviceInfo */
6140 osti_memset(&dmDeviceInfo, 0, sizeof(dmDeviceInfo_t));
6141 DEVINFO_PUT_SAS_ADDRESSLO(&dmDeviceInfo, oneDeviceData->SASAddressID.sasAddressLo);
6142 DEVINFO_PUT_SAS_ADDRESSHI(&dmDeviceInfo, oneDeviceData->SASAddressID.sasAddressHi);
6143 dmDeviceInfo.initiator_ssp_stp_smp = oneDeviceData->initiator_ssp_stp_smp;
6144 dmDeviceInfo.target_ssp_stp_smp = oneDeviceData->target_ssp_stp_smp;
6145 dmDeviceInfo.devType_S_Rate = oneDeviceData->agDeviceInfo.devType_S_Rate;
6146 if (oneDeviceData->directlyAttached == agTRUE)
6147 {
6148 /* setting SMP bit */
6149 ext = (bit16)(ext | 0x100);
6150 expanderType = SA_IDFRM_GET_DEVICETTYPE(&onePortContext->sasIDframe);
6151 ext = (bit16)( ext | (expanderType << 9));
6152 /* setting MCN field to 0xF */
6153 ext = (bit16)(ext | (bit16)(0xF << 11));
6154 TI_DBG1(("ossaDeviceRegistrationCB: directlyAttached ext 0x%x\n", ext));
6155 dmDeviceInfo.ext = ext;
6156 }
6157 DMstatus = dmRegisterDevice(dmRoot, dmPortContext, &dmDeviceInfo, oneDeviceData->agDevHandle);
6158 if (DMstatus != DM_RC_SUCCESS)
6159 {
6160 TI_DBG1(("ossaDeviceRegistrationCB: dmRegisterDevice failed!!! 0x%x\n", DMstatus));
6161 }
6162 }
6163 }
6164 #endif /* FDS_DM */
6165 #ifdef FDS_SM
6166 /* if device is SATA, register it to SM */
6167 if (onePortContext->valid == agTRUE)
6168 {
6169 if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6170 {
6171 TI_DBG1(("ossaDeviceRegistrationCB: calling smRegisterDevice\n"));
6172 if (oneDeviceData->directlyAttached == agTRUE)
6173 {
6174 SMstatus = smRegisterDevice(smRoot,
6175 agDevHandle,
6176 &(oneDeviceData->smDeviceHandle),
6177 agNULL,
6178 (bit32)oneDeviceData->phyID,
6179 oneDeviceData->satDevData.satDeviceType);
6180 }
6181 else
6182 {
6183 if (oneDeviceData->ExpDevice == agNULL)
6184 {
6185 TI_DBG1(("ossaDeviceRegistrationCB: oneDeviceData->ExpDevice NULL!!!\n"));
6186 return;
6187 }
6188 if (oneDeviceData->ExpDevice->agDevHandle == agNULL)
6189 {
6190 TI_DBG1(("ossaDeviceRegistrationCB: oneDeviceData->ExpDevice->agDevHandle NULL!!!\n"));
6191 }
6192 SMstatus = smRegisterDevice(smRoot,
6193 agDevHandle,
6194 &(oneDeviceData->smDeviceHandle),
6195 oneDeviceData->ExpDevice->agDevHandle,
6196 (bit32)oneDeviceData->phyID,
6197 oneDeviceData->satDevData.satDeviceType);
6198 }
6199 if (SMstatus != SM_RC_SUCCESS)
6200 {
6201 TI_DBG1(("ossaDeviceRegistrationCB: smRegisterDevice failed!!! 0x%x\n", DMstatus));
6202 }
6203 }
6204 }
6205 #endif /* FDS_SM */
6206 /* special case for directly attached targets */
6207 if (oneDeviceData->directlyAttached == agTRUE)
6208 {
6209 TI_DBG3(("ossaDeviceRegistrationCB: directly attached did %d\n", oneDeviceData->id));
6210 if (oneDeviceData->DeviceType == TD_SAS_DEVICE)
6211 {
6212 TI_DBG3(("ossaDeviceRegistrationCB: SAS target\n"));
6213 if (onePortContext->valid == agTRUE)
6214 {
6215 if (onePortContext->PortRecoverPhyID != 0xFF)
6216 {
6217 oneDeviceData->phyID = (bit8)onePortContext->PortRecoverPhyID;
6218 onePortContext->PortRecoverPhyID = 0xFF;
6219 TI_DBG3(("ossaDeviceRegistrationCB: PortRecoverPhyID %d\n", oneDeviceData->phyID));
6220 }
6221 /* link up and discovery ready event */
6222 if (onePortContext->DiscoveryRdyGiven == agFALSE)
6223 {
6224 TI_DBG2(("ossaDeviceRegistrationCB: link up and discovery ready\n"));
6225 TI_DBG3(("ossaDeviceRegistrationCB: phyID %d pid %d\n", oneDeviceData->phyID, onePortContext->id));
6226 TI_DBG3(("ossaDeviceRegistrationCB: tiPortalContext %p\n", tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext));
6227 TI_DBG3(("ossaDeviceRegistrationCB: onePortContext->tiPortalContext %p\n", onePortContext->tiPortalContext));
6228 onePortContext->DiscoveryRdyGiven = agTRUE;
6229 if (onePortContext->DiscoveryState != ITD_DSTATE_NOT_STARTED)
6230 {
6231 TI_DBG1(("ossaDeviceRegistrationCB: wrong discovery state 0x%x\n", onePortContext->DiscoveryState));
6232 }
6233 /* notifying link up */
6234 ostiPortEvent (
6235 tiRoot,
6236 tiPortLinkUp,
6237 tiSuccess,
6238 (void *)onePortContext->tiPortalContext
6239 );
6240 #ifdef INITIATOR_DRIVER
6241 /* triggers discovery */
6242 ostiPortEvent(
6243 tiRoot,
6244 tiPortDiscoveryReady,
6245 tiSuccess,
6246 (void *)onePortContext->tiPortalContext
6247 );
6248 #endif
6249 }
6250 }
6251 else
6252 {
6253 TI_DBG2(("ossaDeviceRegistrationCB: abort call\n"));
6254 /* abort all followed by deregistration of sas target */
6255 tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
6256 }
6257 }
6258 else
6259 {
6260 TI_DBG2(("ossaDeviceRegistrationCB: SATA target\n"));
6261 if (onePortContext->valid == agTRUE)
6262 {
6263 if (oneDeviceData->satDevData.IDDeviceValid == agFALSE)
6264 {
6265 #ifdef FDS_SM
6266 /* send identify device data */
6267 tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
6268
6269 #else
6270 /* send identify device data */
6271 tdssSubAddSATAToSharedcontext(tiRoot, oneDeviceData);
6272 #endif
6273 }
6274 }
6275 else
6276 {
6277 TI_DBG2(("ossaDeviceRegistrationCB: abort call\n"));
6278 /* abort all followed by deregistration of sas target */
6279 tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
6280 }
6281 }
6282 }
6283 else /* behind the expander */
6284 {
6285 #if defined(FDS_DM) && defined(FDS_SM)
6286 /* send ID to SATA targets
6287 needs go allocate tdIORequestBody_t for smIORequest
6288 */
6289
6290 if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6291 &&
6292 oneDeviceData->satDevData.IDDeviceValid == agFALSE)
6293 {
6294 tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
6295 }
6296
6297 #elif defined(FDS_DM) /* worked with DM */
6298 if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6299 &&
6300 oneDeviceData->satDevData.IDDeviceValid == agFALSE)
6301 {
6302 IDstatus = tdsaDiscoveryStartIDDev(tiRoot,
6303 agNULL,
6304 &(oneDeviceData->tiDeviceHandle),
6305 agNULL,
6306 oneDeviceData);
6307
6308 if (IDstatus != tiSuccess)
6309 {
6310 /* identify device data is not valid */
6311 TI_DBG1(("ossaDeviceRegistrationCB: fail or busy %d\n", IDstatus));
6312 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
6313 }
6314 }
6315 #endif
6316
6317
6318 }
6319 /* after discovery is finished */
6320 if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
6321 {
6322 TI_DBG2(("ossaDeviceRegistrationCB: calling new device arrival\n"));
6323 if (DEVICE_IS_SSP_TARGET(oneDeviceData))
6324 {
6325 /* in case registration is finished after discovery is finished */
6326 #ifdef AGTIAPI_CTL
6327 if (tdsaAllShared->SASConnectTimeLimit)
6328 tdsaCTLSet(tiRoot, onePortContext, tiIntrEventTypeDeviceChange,
6329 tiDeviceArrival);
6330 else
6331 #endif
6332 ostiInitiatorEvent(
6333 tiRoot,
6334 tiPortalContext,
6335 agNULL,
6336 tiIntrEventTypeDeviceChange,
6337 tiDeviceArrival,
6338 agNULL
6339 );
6340 }
6341 else if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6342 &&
6343 oneDeviceData->satDevData.IDDeviceValid == agTRUE )
6344 {
6345 /* in case registration is finished after discovery is finished */
6346 ostiInitiatorEvent(
6347 tiRoot,
6348 tiPortalContext,
6349 agNULL,
6350 tiIntrEventTypeDeviceChange,
6351 tiDeviceArrival,
6352 agNULL
6353 );
6354 }
6355 }
6356 break;
6357 case OSSA_FAILURE_OUT_OF_RESOURCE: /* fall through */
6358 case OSSA_ERR_DEVICE_HANDLE_UNAVAILABLE:
6359 TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_OUT_OF_RESOURCE or OSSA_ERR_DEVICE_HANDLE_UNAVAILABLE\n"));
6360 oneDeviceData->registered = agFALSE;
6361 break;
6362 case OSSA_FAILURE_DEVICE_ALREADY_REGISTERED: /* fall through */
6363 case OSSA_ERR_DEVICE_ALREADY_REGISTERED:
6364 /* do nothing */
6365 TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_DEVICE_ALREADY_REGISTERED or OSSA_ERR_DEVICE_ALREADY_REGISTERED\n"));
6366 break;
6367 case OSSA_FAILURE_INVALID_PHY_ID: /* fall through */
6368 case OSSA_ERR_PHY_ID_INVALID:
6369 TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_INVALID_PHY_ID or OSSA_ERR_PHY_ID_INVALID\n"));
6370 oneDeviceData->registered = agFALSE;
6371 break;
6372 case OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED: /* fall through */
6373 case OSSA_ERR_PHY_ID_ALREADY_REGISTERED:
6374 /* do nothing */
6375 TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED or OSSA_ERR_PHY_ID_ALREADY_REGISTERED\n"));
6376 break;
6377 case OSSA_FAILURE_PORT_ID_OUT_OF_RANGE: /* fall through */
6378 case OSSA_ERR_PORT_INVALID:
6379 TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_PORT_ID_OUT_OF_RANGE or OSSA_ERR_PORT_INVALID\n"));
6380 oneDeviceData->registered = agFALSE;
6381 break;
6382 case OSSA_FAILURE_PORT_NOT_VALID_STATE: /* fall through */
6383 case OSSA_ERR_PORT_STATE_NOT_VALID:
6384 TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_PORT_NOT_VALID_STATE or OSSA_ERR_PORT_STATE_NOT_VALID\n"));
6385 TI_DBG2(("ossaDeviceRegistrationCB: did %d pid %d\n", oneDeviceData->id, onePortContext->id));
6386 oneDeviceData->registered = agFALSE;
6387 /* transient period between link up and link down/port recovery */
6388 onePortContext->Transient = agTRUE;
6389 if (onePortContext->valid == agTRUE && (oneDeviceData->valid == agTRUE || oneDeviceData->valid2 == agTRUE))
6390 {
6391 TI_DBG1(("ossaDeviceRegistrationCB: retries regisration\n"));
6392 #ifdef REMOVED
6393 //temp; setting MCN to tdsaAllShared->MCN
6394 oneDeviceData->agDeviceInfo.flag = oneDeviceData->agDeviceInfo.flag | (tdsaAllShared->MCN << 16);
6395 //end temp
6396 #endif
6397 saRegisterNewDevice( /* ossaDeviceRegistrationCB */
6398 agRoot,
6399 &oneDeviceData->agContext,
6400 0,
6401 &oneDeviceData->agDeviceInfo,
6402 onePortContext->agPortContext,
6403 0
6404 );
6405 }
6406 else if (oneDeviceData->directlyAttached == agTRUE && DEVICE_IS_SATA_DEVICE(oneDeviceData))
6407 {
6408 TI_DBG1(("ossaDeviceRegistrationCB: directly attached SATA, put back into free list\n"));
6409 tdsaDeviceDataReInit(tiRoot, oneDeviceData);
6410 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
6411 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
6412 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
6413 }
6414 break;
6415 case OSSA_FAILURE_DEVICE_TYPE_NOT_VALID: /* fall through */
6416 case OSSA_ERR_DEVICE_TYPE_NOT_VALID:
6417 TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_DEVICE_TYPE_NOT_VALID or OSSA_ERR_DEVICE_TYPE_NOT_VALID\n"));
6418 oneDeviceData->registered = agFALSE;
6419 break;
6420 default:
6421 TI_DBG1(("ossaDeviceRegistrationCB: wrong. default status is %d\n", status));
6422 break;
6423
6424
6425 }
6426 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ye");
6427 return;
6428 #endif
6429 }
6430
6431 /*****************************************************************************/
6432 /*! \brief ossaDeregisterDeviceHandleCB
6433 *
6434 *
6435 * Purpose: This routine is called by lower layer to corresponding to
6436 * saDeregisterDeviceHandle()
6437 *
6438 * \param agRoot: Pointer to chip/driver Instance.
6439 * \param agDevHandle: Pointer to the assigned device handle for the
6440 * registered device.
6441 * \param status: status
6442 *
6443 *
6444 * \return None.
6445 *
6446 */
6447 /*****************************************************************************/
6448 osGLOBAL void ossaDeregisterDeviceHandleCB(
6449 agsaRoot_t *agRoot,
6450 agsaContext_t *agContext,
6451 agsaDevHandle_t *agDevHandle,
6452 bit32 status
6453 )
6454 {
6455 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6456 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6457 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
6458 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6459 tdsaDeviceData_t *oneDeviceData = agNULL;
6460 tdsaPortContext_t *onePortContext = agNULL;
6461 agsaEventSource_t *eventSource;
6462 bit32 HwAckSatus;
6463 bit32 PhyID;
6464 #ifdef FDS_DM
6465 dmRoot_t *dmRoot = &(tdsaAllShared->dmRoot);
6466 dmPortContext_t *dmPortContext = agNULL;
6467 dmPortInfo_t dmPortInfo;
6468 bit32 DMstatus = DM_RC_FAILURE;
6469 #endif
6470 #ifdef FDS_SM
6471 smRoot_t *smRoot = &(tdsaAllShared->smRoot);
6472 #endif
6473
6474 TI_DBG3(("ossaDeregisterDeviceHandleCB: start\n"));
6475 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yf");
6476
6477 if (status == OSSA_ERR_DEVICE_HANDLE_INVALID)
6478 {
6479 /* there is no device handle to process */
6480 TI_DBG2(("ossaDeregisterDeviceHandleCB: OSSA_ERR_DEVICE_HANDLE_INVALID\n"));
6481 return;
6482 }
6483
6484 oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
6485 onePortContext = oneDeviceData->tdPortContext;
6486 #ifdef FDS_DM
6487 dmPortContext = &(onePortContext->dmPortContext);
6488 #endif
6489
6490 if (oneDeviceData->valid == agFALSE && oneDeviceData->valid2 == agFALSE &&
6491 oneDeviceData->DeviceType == TD_DEFAULT_DEVICE && onePortContext->valid == agTRUE)
6492 {
6493 TI_DBG2(("ossaDeregisterDeviceHandleCB: transient did %d\n", oneDeviceData->id));
6494 return;
6495 }
6496
6497 if (onePortContext != agNULL)
6498 {
6499 TI_DBG2(("ossaDeregisterDeviceHandleCB: pid %d registeredNumDevice %d\n", onePortContext->id, onePortContext->RegisteredDevNums));
6500 }
6501
6502 switch (status)
6503 {
6504 case OSSA_SUCCESS:
6505 TI_DBG3(("ossaDeregisterDeviceHandleCB: Success\n"));
6506 if (onePortContext == agNULL)
6507 {
6508 TI_DBG1(("ossaDeregisterDeviceHandleCB: onePortContext is NULL, wrong!\n"));
6509 return;
6510 }
6511 /* port is going down */
6512 if (onePortContext->valid == agFALSE)
6513 {
6514 if (!(oneDeviceData->valid == agFALSE && oneDeviceData->valid2 == agFALSE && oneDeviceData->DeviceType == TD_DEFAULT_DEVICE))
6515 {
6516 /* remove oneDevice from MainLink */
6517 TI_DBG2(("ossaDeregisterDeviceHandleCB: delete from MainLink\n"));
6518 #ifdef FDS_SM
6519 if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6520 {
6521 TI_DBG1(("ossaDeregisterDeviceHandleCB: did %d calling smDeregisterDevice\n", oneDeviceData->id));
6522 smDeregisterDevice(smRoot, oneDeviceData->agDevHandle, &(oneDeviceData->smDeviceHandle));
6523 }
6524 #endif
6525 tdsaDeviceDataReInit(tiRoot, oneDeviceData);
6526 osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
6527
6528 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
6529 TDLIST_DEQUEUE_THIS(&(oneDeviceData->MainLink));
6530 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
6531 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
6532 }
6533 /* for portcontext */
6534 PhyID = onePortContext->eventPhyID;
6535 TI_DBG3(("ossaDeregisterDeviceHandleCB: PhyID %d\n", PhyID));
6536 onePortContext->RegisteredDevNums--;
6537 /*
6538 check if valid in tdsaAllShared and the last registered device in a portcontext;
6539 if so, call saHwEventAck()
6540 */
6541 if (tdsaAllShared->eventSource[PhyID].EventValid == agTRUE &&
6542 onePortContext->RegisteredDevNums == 0 &&
6543 PhyID != 0xFF
6544 )
6545 {
6546 TI_DBG2(("ossaDeregisterDeviceHandleCB: calling saHwEventAck\n"));
6547 eventSource = &(tdsaAllShared->eventSource[PhyID].Source);
6548 HwAckSatus = saHwEventAck(
6549 agRoot,
6550 agNULL, /* agContext */
6551 0,
6552 eventSource, /* agsaEventSource_t */
6553 0,
6554 0
6555 );
6556 if ( HwAckSatus != AGSA_RC_SUCCESS)
6557 {
6558 TI_DBG1(("ossaDeregisterDeviceHandleCB: failing in saHwEventAck; status %d\n", HwAckSatus));
6559 }
6560
6561 /* toggle */
6562 tdsaAllShared->eventSource[PhyID].EventValid = agFALSE;
6563
6564 #ifdef FDS_DM
6565 if (onePortContext->UseDM == agTRUE)
6566 {
6567 TI_DBG1(("ossaDeregisterDeviceHandleCB: calling dmDestroyPort\n"));
6568 /* setup dmPortInfo */
6569 PORTINFO_PUT_SAS_REMOTE_ADDRESSLO(&dmPortInfo, onePortContext->sasRemoteAddressLo);
6570 PORTINFO_PUT_SAS_REMOTE_ADDRESSHI(&dmPortInfo, onePortContext->sasRemoteAddressHi);
6571 PORTINFO_PUT_SAS_LOCAL_ADDRESSLO(&dmPortInfo, onePortContext->sasLocalAddressLo);
6572 PORTINFO_PUT_SAS_LOCAL_ADDRESSHI(&dmPortInfo, onePortContext->sasLocalAddressHi);
6573 DMstatus = dmDestroyPort(dmRoot, dmPortContext, &dmPortInfo);
6574 if (DMstatus != DM_RC_SUCCESS)
6575 {
6576 TI_DBG1(("ossaDeregisterDeviceHandleCB: dmDestroyPort failed!!! 0x%x\n", DMstatus));
6577 }
6578 }
6579 #endif
6580 tdsaPortContextReInit(tiRoot, onePortContext);
6581 /*
6582 put all devices belonging to the onePortContext
6583 back to the free link
6584 */
6585
6586 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
6587 TDLIST_DEQUEUE_THIS(&(onePortContext->MainLink));
6588 TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->FreeLink), &(tdsaAllShared->FreePortContextList));
6589 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
6590 }
6591 else if (tdsaAllShared->eventSource[PhyID].EventValid == NO_ACK &&
6592 onePortContext->RegisteredDevNums == 0
6593 )
6594 {
6595 TI_DBG2(("ossaDeregisterDeviceHandleCB: NO ACK case\n"));
6596 #ifdef FDS_DM
6597 if (onePortContext->UseDM == agTRUE)
6598 {
6599 TI_DBG1(("ossaDeregisterDeviceHandleCB: calling dmDestroyPort\n"));
6600 /* setup dmPortInfo */
6601 PORTINFO_PUT_SAS_REMOTE_ADDRESSLO(&dmPortInfo, onePortContext->sasRemoteAddressLo);
6602 PORTINFO_PUT_SAS_REMOTE_ADDRESSHI(&dmPortInfo, onePortContext->sasRemoteAddressHi);
6603 PORTINFO_PUT_SAS_LOCAL_ADDRESSLO(&dmPortInfo, onePortContext->sasLocalAddressLo);
6604 PORTINFO_PUT_SAS_LOCAL_ADDRESSHI(&dmPortInfo, onePortContext->sasLocalAddressHi);
6605 DMstatus = dmDestroyPort(dmRoot, dmPortContext, &dmPortInfo);
6606 if (DMstatus != DM_RC_SUCCESS)
6607 {
6608 TI_DBG1(("ossaDeregisterDeviceHandleCB: dmDestroyPort failed!!! 0x%x\n", DMstatus));
6609 }
6610 }
6611 #endif
6612 tdsaPortContextReInit(tiRoot, onePortContext);
6613 /*
6614 put all devices belonging to the onePortContext
6615 back to the free link
6616 */
6617
6618 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
6619 TDLIST_DEQUEUE_THIS(&(onePortContext->MainLink));
6620 TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->FreeLink), &(tdsaAllShared->FreePortContextList));
6621 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
6622 }
6623 else
6624 {
6625 if (PhyID < TD_MAX_NUM_PHYS)
6626 {
6627 TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d eventvalid %d registeredNumDevice %d\n", onePortContext->id, tdsaAllShared->eventSource[PhyID].EventValid , onePortContext->RegisteredDevNums));
6628 }
6629 else
6630 {
6631 TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d registeredNumDevice %d wrong phyid %d\n", onePortContext->id, onePortContext->RegisteredDevNums, PhyID));
6632 }
6633 }
6634 }
6635 else
6636 {
6637 PhyID = onePortContext->eventPhyID;
6638 TI_DBG3(("ossaDeregisterDeviceHandleCB: PhyID %d\n", PhyID));
6639 onePortContext->RegisteredDevNums--;
6640 #ifdef FDS_SM
6641 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
6642 if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6643 {
6644 smDeregisterDevice(smRoot, oneDeviceData->agDevHandle, &(oneDeviceData->smDeviceHandle));
6645 }
6646 #endif
6647 /*
6648 check if valid in tdsaAllShared and the last registered device in a portcontext;
6649 if so, call saHwEventAck()
6650 */
6651 if (tdsaAllShared->eventSource[PhyID].EventValid == agTRUE &&
6652 onePortContext->RegisteredDevNums == 0 &&
6653 PhyID != 0xFF
6654 )
6655 {
6656 TI_DBG2(("ossaDeregisterDeviceHandleCB: calling saHwEventAck\n"));
6657 eventSource = &(tdsaAllShared->eventSource[PhyID].Source);
6658 HwAckSatus = saHwEventAck(
6659 agRoot,
6660 agNULL, /* agContext */
6661 0,
6662 eventSource, /* agsaEventSource_t */
6663 0,
6664 0
6665 );
6666 if ( HwAckSatus != AGSA_RC_SUCCESS)
6667 {
6668 TI_DBG1(("ossaDeregisterDeviceHandleCB: failing in saHwEventAck; status %d\n", HwAckSatus));
6669 }
6670
6671 /* toggle */
6672 tdsaAllShared->eventSource[PhyID].EventValid = agFALSE;
6673 }
6674 #ifdef INITIATOR_DRIVER
6675 else if (onePortContext->RegisteredDevNums == 1)
6676 {
6677 TI_DBG1(("ossaDeregisterDeviceHandleCB: all devices have been deregistered except directly attached EXP\n"));
6678 /* qqqqq If broadcast has been seen, call incremental discovery*/
6679 if (onePortContext->DiscFailNSeenBC == agTRUE)
6680 {
6681 TI_DBG1(("ossaDeregisterDeviceHandleCB: calling dmDiscover, incremental, pid %d\n", onePortContext->id));
6682 dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_INCREMENTAL_START);
6683 onePortContext->DiscFailNSeenBC = agFALSE;
6684 }
6685 else
6686 {
6687 TI_DBG1(("ossaDeregisterDeviceHandleCB: not calling dmDiscover\n"));
6688 /* qqqqq needs to change discovery state to onePortContext->DMDiscoveryState == dmDiscCompleted
6689 in dmQueryDiscovery
6690 change the discovery state from dmDiscFailed to dmDiscCompleted
6691 */
6692 dmResetFailedDiscovery(dmRoot, dmPortContext);
6693
6694 }
6695 }
6696 #endif
6697 else
6698 {
6699 if (PhyID < TD_MAX_NUM_PHYS)
6700 {
6701 TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d eventvalid %d registeredNumDevice %d\n", onePortContext->id, tdsaAllShared->eventSource[PhyID].EventValid , onePortContext->RegisteredDevNums));
6702 }
6703 else
6704 {
6705 TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d registeredNumDevice %d wrong phyid %d\n", onePortContext->id, onePortContext->RegisteredDevNums, PhyID));
6706 }
6707 }
6708 }
6709 break;
6710 case OSSA_INVALID_HANDLE:
6711 TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_INVALID_HANDLE\n"));
6712 break;
6713 #ifdef REMOVED
6714 case OSSA_FAILURE_DEVICE_DIRECT_ATTACH:
6715 TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_FAILURE_DEVICE_DIRECT_ATTACH\n"));
6716 break;
6717 #endif
6718 case OSSA_ERR_DEVICE_HANDLE_INVALID:
6719 TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_ERR_DEVICE_HANDLE_INVALID\n"));
6720 break;
6721 case OSSA_ERR_DEVICE_BUSY:
6722 TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_ERR_DEVICE_BUSY\n"));
6723 break;
6724 default:
6725 TI_DBG1(("ossaDeregisterDeviceHandleCB: unknown status 0x%x\n", status));
6726 break;
6727 }
6728
6729 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yf");
6730 return;
6731 }
6732
6733 /*****************************************************************************/
6734 /*! \brief ossaDeviceHandleRemovedEvent
6735 *
6736 *
6737 * Purpose: This routine is called by lower layer to notify the device removal
6738 *
6739 *
6740 * \param agRoot: Pointer to chip/driver Instance.
6741 * \param agDevHandle: Pointer to the assigned device handle for the
6742 * registered device.
6743 * \param agPortContext:Pointer to this instance of port context.
6744 *
6745 *
6746 * \return None.
6747 *
6748 */
6749 /*****************************************************************************/
6750 osGLOBAL void ossaDeviceHandleRemovedEvent (
6751 agsaRoot_t *agRoot,
6752 agsaDevHandle_t *agDevHandle,
6753 agsaPortContext_t *agPortContext
6754 )
6755 {
6756 #ifdef NOT_YET
6757 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6758 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6759 #endif
6760 tdsaPortContext_t *onePortContext = agNULL;
6761 tdsaDeviceData_t *oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
6762
6763 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yg");
6764 TI_DBG2(("ossaDeviceHandleRemovedEvent: start\n"));
6765 if (oneDeviceData == agNULL)
6766 {
6767 TI_DBG1(("ossaDeviceHandleRemovedEvent: Wrong! oneDeviceData is NULL\n"));
6768 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yg");
6769 return;
6770 }
6771 TI_DBG2(("ossaDeviceHandleRemovedEvent: did %d\n", oneDeviceData->id));
6772 oneDeviceData->registered = agFALSE;
6773 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
6774 if (onePortContext == agNULL)
6775 {
6776 TI_DBG1(("ossaDeviceHandleRemovedEvent: Wrong! onePortContext is NULL\n"));
6777 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Yg");
6778 return;
6779 }
6780 TI_DBG2(("ossaDeviceHandleRemovedEvent: pid %d\n", onePortContext->id));
6781 onePortContext->RegisteredDevNums--;
6782 #ifdef NOT_YET
6783 ostiInitiatorEvent(
6784 tiRoot,
6785 onePortContext->tiPortalContext,
6786 agNULL,
6787 tiIntrEventTypeDeviceChange,
6788 tiDeviceRemoval,
6789 agNULL
6790 );
6791 #endif
6792
6793 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Yg");
6794 return;
6795 }
6796
6797 #ifdef SPC_ENABLE_PROFILE
6798 /*****************************************************************************/
6799 /*! \brief ossaFwProfileCB
6800 *
6801 *
6802 * Purpose: This routine is called by lower layer to corresponding to
6803 * saFwProfile()
6804 *
6805 * \param agRoot: Pointer to chip/driver Instance.
6806 * \param agContext: Context of the operation originally passed
6807 * into saFwProfile()
6808 * \param status: status
6809 *
6810 *
6811 * \return None.
6812 *
6813 */
6814 /*****************************************************************************/
6815 osGLOBAL void ossaFwProfileCB(
6816 agsaRoot_t *agRoot,
6817 agsaContext_t *agContext,
6818 bit32 status,
6819 bit32 len)
6820 {
6821 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6822 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6823
6824 TI_DBG2(("ossaFwProfileCB: start\n"));
6825
6826 switch (status)
6827 {
6828 case AGSA_RC_SUCCESS:
6829 {
6830 TI_DBG2(("ossaFwProfileCB: SUCCESS\n"));
6831 break;
6832 }
6833 case AGSA_RC_FAILURE:
6834 {
6835 TI_DBG1(("ossaFwProfileCB: FAIL\n"));
6836 break;
6837 }
6838 default:
6839 {
6840 TI_DBG1(("ossaFwProfileCB: !!! default, status %d\n", status));
6841 break;
6842 }
6843 }
6844
6845 ostiFWProfileIOCTLRsp(tiRoot, status, len);
6846 return;
6847 }
6848 #endif
6849 /*****************************************************************************/
6850 /*! \brief ossaFwFlashUpdateCB
6851 *
6852 *
6853 * Purpose: This routine is called by lower layer to corresponding to
6854 * saFwFlashUpdate()
6855 *
6856 * \param agRoot: Pointer to chip/driver Instance.
6857 * \param agContext: Context of the operation originally passed
6858 * into saFwFlashUpdate()
6859 * \param status: status
6860 *
6861 *
6862 * \return None.
6863 *
6864 */
6865 /*****************************************************************************/
6866 osGLOBAL void ossaFwFlashUpdateCB(
6867 agsaRoot_t *agRoot,
6868 agsaContext_t *agContext,
6869 bit32 status
6870 )
6871 {
6872 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6873 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6874
6875 TI_DBG2(("ossaFwFlashUpdateCB: start\n"));
6876
6877 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yh");
6878 switch (status)
6879 {
6880 case OSSA_FLASH_UPDATE_COMPLETE_PENDING_REBOOT:
6881 {
6882 TI_DBG2(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_COMPLETE_PENDING_REBOOT\n"));
6883 break;
6884 }
6885 case OSSA_FLASH_UPDATE_IN_PROGRESS:
6886 {
6887 TI_DBG2(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_IN_PROGRESS\n"));
6888 break;
6889 }
6890 case OSSA_FLASH_UPDATE_HDR_ERR:
6891 {
6892 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_HDR_ERR\n"));
6893 break;
6894 }
6895 case OSSA_FLASH_UPDATE_OFFSET_ERR:
6896 {
6897 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_OFFSET_ERR\n"));
6898 break;
6899 }
6900 case OSSA_FLASH_UPDATE_CRC_ERR:
6901 {
6902 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_CRC_ERR\n"));
6903 break;
6904 }
6905 case OSSA_FLASH_UPDATE_LENGTH_ERR:
6906 {
6907 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_LENGTH_ERR\n"));
6908 break;
6909 }
6910 case OSSA_FLASH_UPDATE_HW_ERR:
6911 {
6912 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_HW_ERR\n"));
6913 break;
6914 }
6915 case OSSA_FLASH_UPDATE_DNLD_NOT_SUPPORTED:
6916 {
6917 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_DNLD_NOT_SUPPORTED\n"));
6918 break;
6919 }
6920 case OSSA_FLASH_UPDATE_DISABLED:
6921 {
6922 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_DISABLED\n"));
6923 break;
6924 }
6925 case OSSA_FLASH_FWDNLD_DEVICE_UNSUPPORT:
6926 {
6927 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_FWDNLD_DEVICE_UNSUPPORT\n"));
6928 break;
6929 }
6930 case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
6931 {
6932 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE\n"));
6933 break;
6934 }
6935 case OSSA_FLASH_UPDATE_HMAC_ERR:
6936 {
6937 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_HMAC_ERR\n"));
6938 break;
6939 }
6940
6941 default:
6942 {
6943 TI_DBG1(("ossaFwFlashUpdateCB: !!! default, status 0x%X\n", status));
6944 break;
6945 }
6946 }
6947
6948 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yh");
6949 ostiCOMMgntIOCTLRsp(tiRoot, status);
6950 return;
6951
6952 }
6953
6954
6955 GLOBAL void ossaFlashExtExecuteCB(
6956 agsaRoot_t *agRoot,
6957 agsaContext_t *agContext,
6958 bit32 status,
6959 bit32 command,
6960 agsaFlashExtResponse_t *agFlashExtRsp)
6961 {
6962 TI_DBG1(("ossaFlashExtExecuteCB: command 0x%X status 0x%X\n",command, status));
6963
6964 }
6965
6966
6967
6968 /*****************************************************************************/
6969 /*! \brief ossaGetNVMDResponseCB
6970 *
6971 *
6972 * Purpose: This routine is called by lower layer to corresponding to
6973 * saGetNVMDCommand()
6974 *
6975 * \param agRoot: Pointer to chip/driver Instance.
6976 * \param agContext: Context of the operation originally passed
6977 * into saGetVPDCommand()
6978 * \param status: status
6979 * \param indirectPayload: The value passed in agsaNVMDData_t when
6980 * calling saGetNVMDCommand()
6981 * \param agInfoLen: the length of VPD information
6982 * \param agFrameHandle: handler of VPD information
6983 *
6984 *
6985 * \return None.
6986 *
6987 */
6988 /*****************************************************************************/
6989 osGLOBAL void ossaGetNVMDResponseCB(
6990 agsaRoot_t *agRoot,
6991 agsaContext_t *agContext,
6992 bit32 status,
6993 bit8 indirectPayload,
6994 bit32 agInfoLen,
6995 agsaFrameHandle_t agFrameHandle
6996 )
6997 {
6998 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6999 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7000 TI_DBG2(("ossaGetNVMDResponseCB: start\n"));
7001 TI_DBG2(("ossaGetNVMDResponseCB: agInfoLen %d\n", agInfoLen));
7002 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yi");
7003
7004 if (status == OSSA_SUCCESS)
7005 {
7006 TI_DBG2(("ossaGetNVMDResponseCB: Success status\n"));
7007 if (indirectPayload == 0 && agInfoLen != 0)
7008 {
7009 TI_DBG2(("ossaGetNVMDResponseCB: direct\n"));
7010 tdhexdump("ossaGetNVMDResponseCB", (bit8 *)agFrameHandle, agInfoLen);
7011 }
7012 }
7013 else
7014 {
7015 TI_DBG1(("ossaGetNVMDResponseCB: Status 0x%x\n", status));
7016 }
7017
7018 if (indirectPayload == 0)
7019 {
7020 TI_DBG2(("ossaGetNVMDResponseCB: direct\n"));
7021 }
7022 else
7023 {
7024 TI_DBG2(("ossaGetNVMDResponseCB: indirect\n"));
7025 }
7026
7027 ostiGetNVMDIOCTLRsp(tiRoot, status);
7028 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yi");
7029 return;
7030 }
7031
7032
7033 /*****************************************************************************/
7034 /*! \brief ossaSetNVMDResponseCB
7035 *
7036 *
7037 * Purpose: This routine is called by lower layer to corresponding to
7038 * saSetNVMDCommand()
7039 *
7040 * \param agRoot: Pointer to chip/driver Instance.
7041 * \param agContext: Context of the operation originally passed
7042 * into saSetVPDCommand()
7043 * \param status: status
7044 *
7045 *
7046 * \return None.
7047 *
7048 */
7049 /*****************************************************************************/
7050 osGLOBAL void ossaSetNVMDResponseCB(
7051 agsaRoot_t *agRoot,
7052 agsaContext_t *agContext,
7053 bit32 status
7054 )
7055 {
7056 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7057 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7058 TI_DBG2(("ossaSetNVMDResponseCB: start\n"));
7059 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yj");
7060 if (status == OSSA_SUCCESS)
7061 {
7062 TI_DBG2(("ossaSetNVMDResponseCB: success\n"));
7063 }
7064 else
7065 {
7066 TI_DBG1(("ossaSetNVMDResponseCB: fail or undefined staus %d\n", status));
7067 }
7068 ostiSetNVMDIOCTLRsp(tiRoot, status);
7069 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yj");
7070 return;
7071 }
7072
7073
7074 #ifdef REMOVED
7075 /*****************************************************************************/
7076 /*! \brief ossaGetVPDResponseCB
7077 *
7078 *
7079 * Purpose: This routine is called by lower layer to corresponding to
7080 * saGetVPDCommand()
7081 *
7082 * \param agRoot: Pointer to chip/driver Instance.
7083 * \param agContext: Context of the operation originally passed
7084 * into saGetVPDCommand()
7085 * \param status: status
7086 * \param agInfoLen: the length of VPD information
7087 * \param agFrameHandle:handler of VPD information
7088 *
7089 *
7090 * \return None.
7091 *
7092 */
7093 /*****************************************************************************/
7094 osGLOBAL void ossaGetVPDResponseCB(
7095 agsaRoot_t *agRoot,
7096 agsaContext_t *agContext,
7097 bit32 status,
7098 bit8 indirectMode,
7099 bit32 agInfoLen,
7100 agsaFrameHandle_t agFrameHandle
7101 )
7102 {
7103 bit8 VPDData[48];
7104
7105 TI_DBG2(("ossaGetVPDResponseCB: start\n"));
7106
7107 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yk");
7108 if (status == OSSA_SUCCESS)
7109 {
7110 TI_DBG2(("ossaGetVPDResponseCB: agInfoLen %d\n", agInfoLen));
7111 osti_memset(VPDData, 0, 48);
7112 /* We can read only in case of Direct */
7113 saFrameReadBlock(agRoot, agFrameHandle, 0, VPDData, agInfoLen);
7114 tdhexdump("ossaGetVPDResponseCB", (bit8 *)VPDData, agInfoLen);
7115 /*
7116 callback osti....
7117 */
7118 }
7119 else
7120 {
7121 TI_DBG1(("ossaGetVPDResponseCB: fail or undefined staus %d\n", status));
7122 }
7123 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yk");
7124 return;
7125 }
7126
7127
7128 /*****************************************************************************/
7129 /*! \brief ossaSetVPDResponseCB
7130 *
7131 *
7132 * Purpose: This routine is called by lower layer to corresponding to
7133 * saSetVPDCommand()
7134 *
7135 * \param agRoot: Pointer to chip/driver Instance.
7136 * \param agContext: Context of the operation originally passed
7137 * into saSetVPDCommand()
7138 * \param status: status
7139 *
7140 *
7141 * \return None.
7142 *
7143 */
7144 /*****************************************************************************/
7145 osGLOBAL void ossaSetVPDResponseCB(
7146 agsaRoot_t *agRoot,
7147 agsaContext_t *agContext,
7148 bit32 status
7149 )
7150 {
7151 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7152 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7153
7154 TI_DBG2(("ossaSetVPDResponseCB: start\n"));
7155 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yl");
7156
7157 if (status == OSSA_SUCCESS)
7158 {
7159 TI_DBG2(("ossaSetVPDResponseCB: success\n"));
7160 ostiCOMMgntVPDSetIOCTLRsp(tiRoot, 0);
7161 /*
7162 callback osti.....
7163 */
7164
7165 #ifdef VPD_TESTING
7166 /* temporary to test saSetVPDCommand() and saGetVPDCommand */
7167 tdsaVPDGet(tiRoot);
7168 #endif
7169
7170 }
7171 else
7172 {
7173 TI_DBG1(("ossaSetVPDResponseCB: fail or undefined staus %d\n", status));
7174 }
7175 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yl");
7176 return;
7177 }
7178 #endif
7179
7180 /*****************************************************************************/
7181 /*! \brief ossaEchoCB
7182 *
7183 *
7184 * Purpose: This routine is called by lower layer to corresponding to
7185 * saEchoCommand()
7186 *
7187 * \param agRoot: Pointer to chip/driver Instance.
7188 * \param agContext: Context of the operation originally passed
7189 * into saEchoCommand()
7190 * \param echoPayload: Pointer to the echo payload
7191 *
7192 *
7193 * \return None.
7194 *
7195 */
7196 /*****************************************************************************/
7197 osGLOBAL void ossaEchoCB(
7198 agsaRoot_t *agRoot,
7199 agsaContext_t *agContext,
7200 void *echoPayload
7201 )
7202 {
7203 #ifdef ECHO_TESTING
7204 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7205 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7206 bit8 payload[56];
7207 #endif
7208
7209 TI_DBG2(("ossaEchoCB: start\n"));
7210 smTraceFuncEnter(hpDBG_VERY_LOUD,"Ym");
7211
7212 /* dumping received echo payload is 56 bytes */
7213 tdhexdump("ossaEchoCB: echoPayload", (bit8 *)(echoPayload), 56);
7214
7215 #ifdef ECHO_TESTING
7216 /* temporary to test saEchoCommand() */
7217
7218 /* new echo payload */
7219 osti_memset(payload,0, sizeof(payload));
7220
7221 payload[0] = gEcho;
7222 payload[55] = gEcho;
7223
7224 TI_DBG2(("ossaEchoCB: gEcho %d\n", gEcho));
7225
7226 saEchoCommand(agRoot, agNULL, tdsaRotateQnumber(tiRoot, agNULL), (void *)&payload);
7227
7228 if (gEcho == 0xFF)
7229 {
7230 gEcho = 0;
7231 }
7232 else
7233 {
7234 gEcho++;
7235 }
7236 #endif
7237
7238 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ym");
7239 return;
7240 }
7241
7242 /*****************************************************************************/
7243 /*! \brief ossaGpioResponseCB
7244 *
7245 *
7246 * Purpose: This routine is called by lower layer to corresponding to
7247 * saGpioEventSetup(), saGpioPinSetup(), saGpioRead(), or
7248 * saGpioWrite()
7249 *
7250 * \param agRoot: Pointer to chip/driver Instance.
7251 * \param agContext: Context of the operation originally passed
7252 * in.
7253 * \param status: GPIO operation completion status
7254 * \param gpioReadValue: a bit map containing the corresponding
7255 * value for each GPIO pin.
7256 * \param gpioPinSetupInfo: Pointer to agsaGpioPinSetupInfo_t structure
7257 * describing the GPIO pin setup
7258 * \param gpioEventSetupInfo Pointer to agsaGpioEventSetupInfo_t structure
7259 * describing the GPIO event setups
7260 *
7261 *
7262 * \return None.
7263 *
7264 */
7265 /*****************************************************************************/
7266 osGLOBAL void ossaGpioResponseCB(
7267 agsaRoot_t *agRoot,
7268 agsaContext_t *agContext,
7269 bit32 status,
7270 bit32 gpioReadValue,
7271 agsaGpioPinSetupInfo_t *gpioPinSetupInfo,
7272 agsaGpioEventSetupInfo_t *gpioEventSetupInfo
7273 )
7274 {
7275 TI_DBG2(("ossaGpioResponseCB: start\n"));
7276 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yn");
7277 if (status == OSSA_SUCCESS)
7278 {
7279 TI_DBG2(("ossaGpioResponseCB: Success\n"));
7280 /* printing gpioReadValue, agsaGpioPinSetupInfo_t and agsaGpioEventSetupInfo_t */
7281 TI_DBG2(("ossaGpioResponseCB: gpioReadValue 0x%x\n", gpioReadValue));
7282 TI_DBG2(("ossaGpioResponseCB: PinSetupInfo gpioInputEnabled 0x%x\n", gpioPinSetupInfo->gpioInputEnabled));
7283 TI_DBG2(("ossaGpioResponseCB: PinSetupInfo gpioTypePart1 0x%x\n", gpioPinSetupInfo->gpioTypePart1));
7284 TI_DBG2(("ossaGpioResponseCB: PinSetupInfo gpioTypePart2 0x%x\n", gpioPinSetupInfo->gpioTypePart2));
7285 TI_DBG2(("ossaGpioResponseCB: EventSetupInfo gpioEventLevel 0x%x\n", gpioEventSetupInfo->gpioEventLevel));
7286 TI_DBG2(("ossaGpioResponseCB: EventSetupInfo gpioEventRisingEdge 0x%x\n", gpioEventSetupInfo->gpioEventRisingEdge));
7287 TI_DBG2(("ossaGpioResponseCB: EventSetupInfo gpioEventFallingEdge 0x%x\n", gpioEventSetupInfo->gpioEventFallingEdge));
7288 }
7289 else
7290 {
7291 TI_DBG1(("ossaGpioResponseCB: Failure\n"));
7292 }
7293 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yn");
7294 return;
7295 }
7296
7297 /*****************************************************************************/
7298 /*! \brief ossaGpioEvent
7299 *
7300 *
7301 * Purpose: This routine is called by lower layer to corresponding to
7302 * saGpioEventSetup(), saGpioPinSetup(), saGpioRead(), or
7303 * saGpioWrite()
7304 *
7305 * \param agRoot: Pointer to chip/driver Instance.
7306 * \param gpioEvent: a bit map that indicates which GPIO
7307 * input pins have generated the event.
7308 *
7309 *
7310 * \return None.
7311 *
7312 */
7313 /*****************************************************************************/
7314 osGLOBAL void ossaGpioEvent(
7315 agsaRoot_t *agRoot,
7316 bit32 gpioEvent
7317 )
7318 {
7319 TI_DBG2(("ossaGpioEvent: start\n"));
7320 TI_DBG2(("ossaGpioEvent: gpioEvent 0x%x\n", gpioEvent));
7321 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yo");
7322 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yo");
7323 return;
7324 }
7325
7326
7327 /*****************************************************************************/
7328 /*! \brief ossaSASDiagExecuteCB
7329 *
7330 *
7331 * Purpose: This routine is called by lower layer to corresponding to
7332 * saSASDiagExecute()
7333 *
7334 * \param agRoot: Pointer to chip/driver Instance.
7335 * \param agContext: Context of the operation originally passed
7336 * in.
7337 * \param status: Diagnostic operation completion status
7338 * \param command: SAS diagnostic command field in agsaSASDiagExecute_t
7339 * structure passed in saSASDiagExecute().
7340 * \param reportData: Report Diagnostic Data
7341 *
7342 *
7343 * \return None.
7344 *
7345 */
7346 /*****************************************************************************/
7347 osGLOBAL void ossaSASDiagExecuteCB(
7348 agsaRoot_t *agRoot,
7349 agsaContext_t *agContext,
7350 bit32 status,
7351 bit32 command,
7352 bit32 reportData)
7353 {
7354 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yq");
7355 TI_DBG2(("ossaSASDiagExecuteCB: start\n"));
7356 TI_DBG2(("ossaSASDiagExecuteCB: status %d\n", status));
7357 TI_DBG2(("ossaSASDiagExecuteCB: command %d\n", command));
7358 TI_DBG2(("ossaSASDiagExecuteCB: reportData %d\n", reportData));
7359
7360 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yq");
7361 return;
7362
7363 }
7364
7365
7366 /*****************************************************************************/
7367 /*! \brief ossaSASDiagStartEndCB
7368 *
7369 *
7370 * Purpose: This routine is called by lower layer to corresponding to
7371 * saSASDiagExecute()
7372 *
7373 * \param agRoot: Pointer to chip/driver Instance.
7374 * \param agContext: Context of the operation originally passed
7375 * in.
7376 * \param status: Diagnostic operation completion status
7377 *
7378 *
7379 * \return None.
7380 *
7381 */
7382 /*****************************************************************************/
7383 osGLOBAL void ossaSASDiagStartEndCB(
7384 agsaRoot_t *agRoot,
7385 agsaContext_t *agContext,
7386 bit32 status)
7387 {
7388 TI_DBG2(("ossaSASDiagStartEndCB: start\n"));
7389 TI_DBG2(("ossaSASDiagStartEndCB: status %d\n", status));
7390 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yr");
7391 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yr");
7392 return;
7393 }
7394
7395 /*****************************************************************************/
7396 /*! \brief ossaReconfigSASParamsCB
7397 *
7398 *
7399 * Purpose: This routine is called by lower layer to corresponding to
7400 * saReconfigSASParams()
7401 *
7402 * \param agRoot: Pointer to chip/driver Instance.
7403 * \param agContext: Context of the operation originally passed
7404 * in saReconfigSASParams().
7405 * \param status: saReconfigSASParams() completion status
7406 * \param agSASConfig: Pointer to the data structure agsaSASReconfig_t
7407 *
7408 *
7409 * \return None.
7410 *
7411 */
7412 /*****************************************************************************/
7413 osGLOBAL void ossaReconfigSASParamsCB(
7414 agsaRoot_t *agRoot,
7415 agsaContext_t *agContext,
7416 bit32 status,
7417 agsaSASReconfig_t *agSASConfig)
7418 {
7419 TI_DBG2(("ossaReconfigSASParamsCB: status %d\n", status));
7420 return;
7421 }
7422
7423 GLOBAL void ossaPCIeDiagExecuteCB(
7424 agsaRoot_t *agRoot,
7425 agsaContext_t *agContext,
7426 bit32 status,
7427 bit32 command,
7428 agsaPCIeDiagResponse_t *resp )
7429 {
7430 TI_DBG2(("ossaPCIeDiagExecuteCB: status %d\n", status));
7431 TI_DBG2(("ossaPCIeDiagExecuteCB: ERR_BLKH 0x%X\n",resp->ERR_BLKH ));
7432 TI_DBG2(("ossaPCIeDiagExecuteCB: ERR_BLKL 0x%X\n",resp->ERR_BLKL ));
7433 TI_DBG2(("ossaPCIeDiagExecuteCB: DWord8 0x%X\n",resp->DWord8 ));
7434 TI_DBG2(("ossaPCIeDiagExecuteCB: DWord9 0x%X\n",resp->DWord9 ));
7435 TI_DBG2(("ossaPCIeDiagExecuteCB: DWord10 0x%X\n",resp->DWord10 ));
7436 TI_DBG2(("ossaPCIeDiagExecuteCB: DWord11 0x%X\n",resp->DWord11 ));
7437 TI_DBG2(("ossaPCIeDiagExecuteCB: DIF_ERR 0x%X\n",resp->DIF_ERR ));
7438
7439 return;
7440 }
7441
7442
7443 #ifndef BIOS
7444 GLOBAL void ossaSGpioCB(
7445 agsaRoot_t *agRoot,
7446 agsaContext_t *agContext,
7447 agsaSGpioReqResponse_t *pSgpioResponse
7448 )
7449 {
7450 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7451 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7452
7453 TI_DBG2(("ossaSGpioCB: smpFrameType: 0x%02x \n", pSgpioResponse->smpFrameType));
7454 // printf("SS:ossaSGpioCB: smpFrameType: 0x%02x \n", pSgpioResponse->smpFrameType);
7455 TI_DBG2(("ossaSGpioCB: function: 0x%02x \n", pSgpioResponse->function));
7456 TI_DBG2(("ossaSGpioCB: functionResult: 0x%02x \n", pSgpioResponse->functionResult));
7457 //printf("SS:ossaSGpioCB: functionResult: 0x%02x \n", pSgpioResponse->functionResult);
7458
7459 tdhexdump("ossaSGpioCB Response", (bit8 *)pSgpioResponse, sizeof(agsaSGpioReqResponse_t));
7460 ostiSgpioIoctlRsp(tiRoot, pSgpioResponse);
7461 }
7462
7463 #endif /* BIOS */
7464
7465 /*****************************************************************************/
7466 /*! \brief ossaLogDebugString
7467 *
7468 *
7469 * Purpose: This routine is called by lower layer to log.
7470 *
7471 * \param agRoot: Pointer to chip/driver Instance.
7472 * \param level: Detail of information desired.
7473 * \param string: Pointer to the character string.
7474 * \param ptr1: First pointer value.
7475 * \param ptr2: Second pointer value.
7476 * \param value1: First 32-bit value related to the specific information.
7477 * \param value2: Second 32-bit value related to the specific information.
7478 *
7479 * \return None.
7480 *
7481 */
7482 /*****************************************************************************/
7483 GLOBAL void ossaLogDebugString(
7484 agsaRoot_t *agRoot,
7485 bit32 level,
7486 char *string,
7487 void *ptr1,
7488 void *ptr2,
7489 bit32 value1,
7490 bit32 value2
7491 )
7492 {
7493 #if defined(SALLSDK_DEBUG)
7494 TIDEBUG_MSG(gLLDebugLevel, level, ("%s %p %p %d %d\n", string, ptr1, ptr2, value1, value2));
7495 #endif
7496 return;
7497 }
7498
7499 /*****************************************************************************/
7500 /*! \brief ossaHwEventAckCB
7501 *
7502 *
7503 * Purpose: This routine is called by lower layer to corresponding to
7504 * saHwEventAck(()
7505 *
7506 * \param agRoot: Pointer to chip/driver Instance.
7507 * \param agContext: Context of the operation originally passed
7508 * in.
7509 * \param status: Status
7510 *
7511 *
7512 * \return None.
7513 *
7514 */
7515 /*****************************************************************************/
7516 GLOBAL void ossaHwEventAckCB(
7517 agsaRoot_t *agRoot,
7518 agsaContext_t *agContext,
7519 bit32 status
7520 )
7521 {
7522 TI_DBG3(("ossaHwEventAckCB: start\n"));
7523 smTraceFuncEnter(hpDBG_VERY_LOUD,"Ys");
7524 if (status == tiSuccess)
7525 {
7526 TI_DBG3(("ossaHwEventAckCB: SUCCESS status\n"));
7527 }
7528 else
7529 {
7530 TI_DBG1(("ossaHwEventAckCB: FAIL status 0x%X\n", status));
7531 TI_DBG1(("ossaHwEventAckCB: invalid event status bit0 %d\n", status & 0x01));
7532 TI_DBG1(("ossaHwEventAckCB: invalid phyid status bit1 %d\n", (status & 0x02) >> 1 ));
7533 TI_DBG1(("ossaHwEventAckCB: invalid portcontext status bit2 %d\n", (status & 0x04) >> 2));
7534 TI_DBG1(("ossaHwEventAckCB: invalid param0 status bit3 %d\n", (status & 0x08) >> 3));
7535 }
7536
7537 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ys");
7538 return;
7539 }
7540
7541 /*****************************************************************************/
7542 /*! \brief ossaGetTimeStampCB
7543 *
7544 *
7545 * Purpose: This routine is called by lower layer to corresponding to
7546 * saGetTimeStamp()
7547 *
7548 * \param agRoot: Pointer to chip/driver Instance.
7549 * \param agContext: Context of the operation originally passed
7550 * in.
7551 * \param timeStampLower: The controller lower 32-bit of internal time
7552 * stamp associated with event log.
7553 * \param timeStampUpper: The controller upper 32-bit of internal time
7554 * stamp associated with event log.
7555 *
7556 *
7557 * \return None.
7558 *
7559 */
7560 /*****************************************************************************/
7561 GLOBAL void ossaGetTimeStampCB(
7562 agsaRoot_t *agRoot,
7563 agsaContext_t *agContext,
7564 bit32 timeStampLower,
7565 bit32 timeStampUpper
7566 )
7567 {
7568 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yt");
7569 TI_DBG4(("ossaGetTimeStampCB: start\n"));
7570 TI_DBG4(("ossaGetTimeStampCB: timeStampUpper 0x%x timeStampLower 0x%x\n", timeStampUpper, timeStampLower));
7571 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yt");
7572 return;
7573 }
7574
7575
7576 /*****************************************************************************/
7577 /*! \brief ossaSMPAbortCB
7578 *
7579 *
7580 * Purpose: This routine is called by lower layer to corresponding to
7581 * saSMPAbort()
7582 *
7583 * \param agRoot: Pointer to chip/driver Instance.
7584 * \param agIORequest: This is the agIORequest parameter passed in
7585 * saSMPAbort()
7586 * \param status: Status of abort
7587 *
7588 * \return None.
7589 *
7590 */
7591 /*****************************************************************************/
7592 GLOBAL void ossaSMPAbortCB(
7593 agsaRoot_t *agRoot,
7594 agsaIORequest_t *agIORequest,
7595 bit32 flag,
7596 bit32 status)
7597 {
7598 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7599 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7600 tdIORequestBody_t *tdAbortIORequestBody = agNULL;
7601 tdsaDeviceData_t *oneDeviceData = agNULL;
7602 tiDeviceHandle_t *tiDeviceHandle = agNULL;
7603
7604 TI_DBG4(("ossaSMPAbortCB: start\n"));
7605 TI_DBG4(("ossaSMPAbortCB: flag %d\n", flag));
7606 TI_DBG4(("ossaSMPAbortCB: status %d\n", status));
7607 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yu");
7608
7609 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
7610 if (tdAbortIORequestBody == agNULL)
7611 {
7612 TI_DBG1(("ossaSMPAbortCB: tdAbortIORequestBody is NULL warning!!!!\n"));
7613 return;
7614 }
7615
7616 if (flag == 2)
7617 {
7618 /* abort per port */
7619 TI_DBG2(("ossaSMPAbortCB: abort per port\n"));
7620 }
7621 else if (flag == 1)
7622 {
7623 TI_DBG2(("ossaSMPAbortCB: abort all\n"));
7624
7625 tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
7626 if (tiDeviceHandle == agNULL)
7627 {
7628 TI_DBG1(("ossaSMPAbortCB: tiDeviceHandle is NULL warning!!!!\n"));
7629 ostiFreeMemory(
7630 tiRoot,
7631 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7632 sizeof(tdIORequestBody_t)
7633 );
7634 return;
7635 }
7636
7637 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
7638 if (oneDeviceData == agNULL)
7639 {
7640 TI_DBG1(("ossaSMPAbortCB: oneDeviceData is NULL warning!!!!\n"));
7641 ostiFreeMemory(
7642 tiRoot,
7643 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7644 sizeof(tdIORequestBody_t)
7645 );
7646 return;
7647 }
7648
7649 if (status == OSSA_IO_SUCCESS)
7650 {
7651 TI_DBG2(("ossaSMPAbortCB: OSSA_IO_SUCCESS\n"));
7652 /* clean up TD layer's IORequestBody */
7653 TI_DBG3(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
7654 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
7655 TI_DBG2(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
7656 ostiFreeMemory(
7657 tiRoot,
7658 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7659 sizeof(tdIORequestBody_t)
7660 );
7661
7662 }
7663 else if (status == OSSA_IO_NOT_VALID)
7664 {
7665 TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NOT_VALID\n"));
7666 /* clean up TD layer's IORequestBody */
7667 TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
7668 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
7669 TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
7670 ostiFreeMemory(
7671 tiRoot,
7672 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7673 sizeof(tdIORequestBody_t)
7674 );
7675 }
7676 else if (status == OSSA_IO_NO_DEVICE)
7677 {
7678 TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NO_DEVICE\n"));
7679 /* clean up TD layer's IORequestBody */
7680 TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
7681 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
7682 TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
7683 ostiFreeMemory(
7684 tiRoot,
7685 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7686 sizeof(tdIORequestBody_t)
7687 );
7688 }
7689 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
7690 {
7691 TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
7692 /* clean up TD layer's IORequestBody */
7693 TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
7694 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
7695 TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
7696 ostiFreeMemory(
7697 tiRoot,
7698 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7699 sizeof(tdIORequestBody_t)
7700 );
7701 }
7702 #ifdef REMOVED
7703 else if (status == OSSA_IO_ABORT_DELAYED)
7704 {
7705 TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
7706 /* clean up TD layer's IORequestBody */
7707 TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
7708 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
7709 TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
7710 ostiFreeMemory(
7711 tiRoot,
7712 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7713 sizeof(tdIORequestBody_t)
7714 );
7715 }
7716 #endif
7717 else
7718 {
7719 TI_DBG1(("ossaSMPAbortCB: other status %d\n", status));
7720 /* clean up TD layer's IORequestBody */
7721 TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
7722 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
7723 TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
7724 ostiFreeMemory(
7725 tiRoot,
7726 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7727 sizeof(tdIORequestBody_t)
7728 );
7729 }
7730 }
7731 else if (flag == 0)
7732 {
7733 TI_DBG2(("ossaSMPAbortCB: abort one\n"));
7734 if (status == OSSA_IO_SUCCESS)
7735 {
7736 TI_DBG2(("ossaSMPAbortCB: OSSA_IO_SUCCESS\n"));
7737 ostiFreeMemory(
7738 tiRoot,
7739 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7740 sizeof(tdIORequestBody_t)
7741 );
7742
7743 }
7744 else if (status == OSSA_IO_NOT_VALID)
7745 {
7746 TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NOT_VALID\n"));
7747 ostiFreeMemory(
7748 tiRoot,
7749 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7750 sizeof(tdIORequestBody_t)
7751 );
7752 }
7753 else if (status == OSSA_IO_NO_DEVICE)
7754 {
7755 TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NO_DEVICE\n"));
7756 ostiFreeMemory(
7757 tiRoot,
7758 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7759 sizeof(tdIORequestBody_t)
7760 );
7761 }
7762 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
7763 {
7764 TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
7765 ostiFreeMemory(
7766 tiRoot,
7767 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7768 sizeof(tdIORequestBody_t)
7769 );
7770 }
7771 #ifdef REMOVED
7772 else if (status == OSSA_IO_ABORT_DELAYED)
7773 {
7774 TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
7775 ostiFreeMemory(
7776 tiRoot,
7777 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7778 sizeof(tdIORequestBody_t)
7779 );
7780 }
7781 #endif
7782 else
7783 {
7784 TI_DBG1(("ossaSMPAbortCB: other status %d\n", status));
7785 ostiFreeMemory(
7786 tiRoot,
7787 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7788 sizeof(tdIORequestBody_t)
7789 );
7790 }
7791 }
7792 else
7793 {
7794 TI_DBG1(("ossaSMPAbortCB: wrong flag %d\n", flag));
7795 }
7796
7797
7798 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yu");
7799 return;
7800 }
7801
7802 /*****************************************************************************/
7803 /*! \brief ossaGeneralEvent
7804 *
7805 *
7806 * Purpose: This is the event notification for debugging purposes sent to
7807 * inform the OS layer of some general error related to a specific
7808 * inbound operation.
7809 *
7810 * \param agRoot: Pointer to chip/driver Instance.
7811 * \param status: Status associated with this event
7812 * \param msg: Pointer to controller specific command
7813 * massage that caused the error
7814 *
7815 * \return None.
7816 *
7817 */
7818 /*****************************************************************************/
7819 GLOBAL void ossaGeneralEvent(
7820 agsaRoot_t *agRoot,
7821 bit32 status,
7822 agsaContext_t *agContext,
7823 bit32 *msg)
7824 {
7825 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7826 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7827
7828 TI_DBG1(("ossaGeneralEvent: start\n"));
7829 TI_DBG1(("ossaGeneralEvent: status %d\n", status));
7830
7831 if(msg)
7832 {
7833 TI_DBG1(("ossaGeneralEvent: *msg %X\n", *msg));
7834 }
7835
7836 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yv");
7837 ostiGenEventIOCTLRsp(tiRoot, status);
7838 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yv");
7839 return;
7840 }
7841
7842 GLOBAL void ossaGetForensicDataCB (
7843 agsaRoot_t *agRoot,
7844 agsaContext_t *agContext,
7845 bit32 status,
7846 agsaForensicData_t *forensicData)
7847 {
7848 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7849 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7850
7851 ostiGetForensicDataIOCTLRsp(tiRoot, status, forensicData);
7852 return;
7853 }
7854
7855
7856 #ifdef INITIATOR_DRIVER
7857
7858 GLOBAL void ossaGetIOErrorStatsCB (
7859 agsaRoot_t *agRoot,
7860 agsaContext_t *agContext,
7861 bit32 status,
7862 agsaIOErrorEventStats_t *stats)
7863
7864 {
7865 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7866 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7867
7868 ostiGetIoErrorStatsIOCTLRsp(tiRoot, status, stats);
7869 }
7870 #else
7871 GLOBAL void ossaGetIOErrorStatsCB (
7872 agsaRoot_t *agRoot,
7873 agsaContext_t *agContext,
7874 bit32 status,
7875 agsaIOErrorEventStats_t *stats)
7876
7877 {
7878
7879 }
7880
7881 #endif
7882
7883 GLOBAL void ossaGetIOEventStatsCB (
7884 agsaRoot_t *agRoot,
7885 agsaContext_t *agContext,
7886 bit32 status,
7887 agsaIOErrorEventStats_t *stats)
7888
7889 {
7890 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7891 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7892
7893 ostiGetIoEventStatsIOCTLRsp(tiRoot, status, stats);
7894 }
7895
7896
7897 /*****************************************************************************/
7898 /*! \brief ossaGetRegisterDumpCB
7899 *
7900 *
7901 * Purpose: ossaGetRegisterDumpCB() is the response callback function
7902 * called by the LL Layer to indicate a response to
7903 * saGetRegisterDump()
7904 *
7905 * \param agRoot: Pointer to chip/driver Instance.
7906 * \param agContext: Context of the operation originally
7907 * passed into saGetRegisterDump()
7908 * \param status: status
7909 *
7910 * \return None.
7911 *
7912 */
7913 /*****************************************************************************/
7914 GLOBAL void ossaGetRegisterDumpCB(
7915 agsaRoot_t *agRoot,
7916 agsaContext_t *agContext,
7917 bit32 status
7918 )
7919 {
7920 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7921 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7922
7923 TI_DBG4(("ossaGetRegisterDumpCB: start\n"));
7924 TI_DBG4(("ossaGetRegisterDumpCB: status %d\n", status));
7925 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yw");
7926
7927 ostiRegDumpIOCTLRsp(tiRoot, status);
7928 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yw");
7929 return;
7930 }
7931
7932 /*****************************************************************************/
7933 /*! \brief ossaSetDeviceStateCB
7934 *
7935 *
7936 * Purpose: ossaSetDeviceStateCB() is the response callback function
7937 * called by the LL Layer to indicate a response to
7938 * saSetDeviceState()
7939 *
7940 * \param agRoot: Pointer to chip/driver Instance.
7941 * \param agContext: Context of the operation originally
7942 * passed into saGetRegisterDump()
7943 * \param agDevHandle Pointer to the device handle of the device
7944 * \param status: status
7945 * \param newDeviceState: newly set device status
7946 * \param previousDeviceState: old device status
7947 *
7948 * \return None.
7949 *
7950 */
7951 /*****************************************************************************/
7952 GLOBAL void ossaSetDeviceStateCB(
7953 agsaRoot_t *agRoot,
7954 agsaContext_t *agContext,
7955 agsaDevHandle_t *agDevHandle,
7956 bit32 status,
7957 bit32 newDeviceState,
7958 bit32 previousDeviceState
7959 )
7960 {
7961 tdsaDeviceData_t *oneDeviceData = agNULL;
7962
7963 TI_DBG2(("ossaSetDeviceStateCB: start\n"));
7964 TI_DBG2(("ossaSetDeviceStateCB: status %d\n", status));
7965 TI_DBG2(("ossaSetDeviceStateCB: newDeviceState %d\n", newDeviceState));
7966 TI_DBG2(("ossaSetDeviceStateCB: previousDeviceState %d\n", previousDeviceState));
7967
7968 if (agDevHandle == agNULL)
7969 {
7970 TI_DBG4(("ossaSetDeviceStateCB: agDevHandle is NULL\n"));
7971 return;
7972 }
7973
7974 oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
7975
7976 if (oneDeviceData == agNULL)
7977 {
7978 TI_DBG1(("ossaSetDeviceStateCB: wrong; oneDeviceData is NULL\n"));
7979 }
7980 else
7981 {
7982 TI_DBG2(("ossaSetDeviceStateCB: did %d\n", oneDeviceData->id));
7983 }
7984
7985 return;
7986 }
7987
7988 /*****************************************************************************/
7989 /*! \brief ossaGetDeviceStateCB
7990 *
7991 *
7992 * Purpose: ossaGetDeviceStateCB() is the response callback function
7993 * called by the LL Layer to indicate a response to
7994 * saGetDeviceState()
7995 *
7996 * \param agRoot: Pointer to chip/driver Instance.
7997 * \param agContext: Context of the operation originally
7998 * passed into saGetRegisterDump()
7999 * \param agDevHandle Pointer to the device handle of the device
8000 * \param status: status
8001 * \param deviceState: device status
8002 *
8003 * \return None.
8004 *
8005 */
8006 /*****************************************************************************/
8007 GLOBAL void ossaGetDeviceStateCB(
8008 agsaRoot_t *agRoot,
8009 agsaContext_t *agContext,
8010 agsaDevHandle_t *agDevHandle,
8011 bit32 status,
8012 bit32 deviceState
8013 )
8014 {
8015 TI_DBG4(("ossaGetDeviceStateCB: start\n"));
8016 TI_DBG4(("ossaGetDeviceStateCB: status %d\n", status));
8017 TI_DBG4(("ossaGetDeviceStateCB: deviceState %d\n", deviceState));
8018
8019 return;
8020 }
8021
8022 #ifdef INITIATOR_DRIVER
8023 /*****************************************************************************/
8024 /*! \brief ossaIniSetDeviceInfoCB
8025 *
8026 *
8027 * Purpose: ossaIniSetDeviceInfoCB() is the response callback function
8028 * called by the LL Layer to indicate a response to
8029 * saSetDeviceInfo()
8030 *
8031 * \param agRoot: Pointer to chip/driver Instance.
8032 * \param agContext: Context of the operation originally
8033 * passed into saSetDeviceInfo()
8034 * \param agDevHandle Pointer to the device handle of the device
8035 * \param status: status
8036 * \param option: option parameter passed in saSetDeviceInfo()
8037 * \param param: param parameter passed in saSetDeviceInfo()
8038 *
8039 * \return None.
8040 *
8041 */
8042 /*****************************************************************************/
8043 osGLOBAL void
8044 ossaIniSetDeviceInfoCB(
8045 agsaRoot_t *agRoot,
8046 agsaContext_t *agContext,
8047 agsaDevHandle_t *agDevHandle,
8048 bit32 status,
8049 bit32 option,
8050 bit32 param
8051 )
8052 {
8053 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8054 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8055 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
8056 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8057 itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
8058 bit32 intContext = osData->IntContext;
8059 tdIORequestBody_t *tdIORequestBody = agNULL;
8060 agsaIORequest_t *agIORequest = agNULL;
8061 bit32 saStatus = AGSA_RC_FAILURE;
8062 bit8 devType_S_Rate;
8063 tdsaDeviceData_t *oneDeviceData = agNULL;
8064
8065 TI_DBG4(("ossaIniSetDeviceInfoCB: start\n"));
8066 TI_DBG4(("ossaIniSetDeviceInfoCB: status 0x%x\n", status));
8067 TI_DBG4(("ossaIniSetDeviceInfoCB: option 0x%x\n", option));
8068 TI_DBG4(("ossaIniSetDeviceInfoCB: param 0x%x\n", param));
8069
8070 if (status != OSSA_SUCCESS)
8071 {
8072 TI_DBG1(("ossaIniSetDeviceInfoCB: status %d\n", status));
8073 TI_DBG1(("ossaIniSetDeviceInfoCB: option 0x%x\n", option));
8074 TI_DBG1(("ossaIniSetDeviceInfoCB: param 0x%x\n", param));
8075 if (option == 32) /* set connection rate */
8076 {
8077 TI_DBG1(("ossaIniSetDeviceInfoCB: IO failure\n"));
8078 agIORequest = (agsaIORequest_t *)agContext->osData;
8079 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
8080 ostiInitiatorIOCompleted(
8081 tiRoot,
8082 tdIORequestBody->tiIORequest,
8083 tiIOFailed,
8084 tiDetailOtherError,
8085 agNULL,
8086 intContext
8087 );
8088 }
8089 }
8090 if (agDevHandle == agNULL)
8091 {
8092 TI_DBG4(("ossaIniSetDeviceInfoCB: agDevHandle is NULL\n"));
8093 return;
8094 }
8095 oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
8096 if (oneDeviceData == agNULL)
8097 {
8098 TI_DBG1(("ossaIniSetDeviceInfoCB: wrong; oneDeviceData is NULL\n"));
8099 return;
8100 }
8101 else
8102 {
8103 TI_DBG4(("ossaIniSetDeviceInfoCB: did %d\n", oneDeviceData->id));
8104 }
8105
8106 /* retry IOs */
8107 if (option == 32) /* set connection rate */
8108 {
8109 TI_DBG1(("ossaIniSetDeviceInfoCB: set connection rate option\n"));
8110 agIORequest = (agsaIORequest_t *)agContext->osData;
8111 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
8112 devType_S_Rate = oneDeviceData->agDeviceInfo.devType_S_Rate;
8113 devType_S_Rate = (devType_S_Rate & 0xF0) | (param >> 28);
8114 oneDeviceData->agDeviceInfo.devType_S_Rate = devType_S_Rate;
8115 TI_DBG1(("ossaIniSetDeviceInfoCB: new rate is 0x%x\n", DEVINFO_GET_LINKRATE(&oneDeviceData->agDeviceInfo)));
8116 if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
8117 oneDeviceData->tdPortContext != agNULL )
8118 {
8119 saStatus = saSSPStart(agRoot,
8120 agIORequest,
8121 tdsaRotateQnumber(tiRoot, oneDeviceData),
8122 agDevHandle,
8123 tdIORequestBody->agRequestType,
8124 &(tdIORequestBody->transport.SAS.agSASRequestBody),
8125 agNULL,
8126 &ossaSSPCompleted);
8127 if (saStatus == AGSA_RC_SUCCESS)
8128 {
8129 TI_DBG1(("ossaIniSetDeviceInfoCB: retried\n"));
8130 Initiator->NumIOsActive++;
8131 tdIORequestBody->ioStarted = agTRUE;
8132 tdIORequestBody->ioCompleted = agFALSE;
8133 return;
8134 }
8135 else
8136 {
8137 TI_DBG1(("ossaIniSetDeviceInfoCB: retry failed\n"));
8138 tdIORequestBody->ioStarted = agFALSE;
8139 tdIORequestBody->ioCompleted = agTRUE;
8140 ostiInitiatorIOCompleted(
8141 tiRoot,
8142 tdIORequestBody->tiIORequest,
8143 tiIOFailed,
8144 tiDetailOtherError,
8145 agNULL,
8146 intContext
8147 );
8148 }
8149 }
8150 }
8151 return;
8152 }
8153 #endif
8154 /*****************************************************************************/
8155 /*! \brief ossaSetDeviceInfoCB
8156 *
8157 *
8158 * Purpose: ossaSetDeviceInfoCB() is the response callback function
8159 * called by the LL Layer to indicate a response to
8160 * saSetDeviceInfo()
8161 *
8162 * \param agRoot: Pointer to chip/driver Instance.
8163 * \param agContext: Context of the operation originally
8164 * passed into saSetDeviceInfo()
8165 * \param agDevHandle Pointer to the device handle of the device
8166 * \param status: status
8167 * \param option: option parameter passed in saSetDeviceInfo()
8168 * \param param: param parameter passed in saSetDeviceInfo()
8169 *
8170 * \return None.
8171 *
8172 */
8173 /*****************************************************************************/
8174 GLOBAL void ossaSetDeviceInfoCB(
8175 agsaRoot_t *agRoot,
8176 agsaContext_t *agContext,
8177 agsaDevHandle_t *agDevHandle,
8178 bit32 status,
8179 bit32 option,
8180 bit32 param
8181 )
8182 {
8183 tdsaDeviceData_t *oneDeviceData = agNULL;
8184
8185 TI_DBG4(("ossaSetDeviceInfoCB: start\n"));
8186 TI_DBG4(("ossaSetDeviceInfoCB: status 0x%x\n", status));
8187 TI_DBG4(("ossaSetDeviceInfoCB: option 0x%x\n", option));
8188 TI_DBG4(("ossaSetDeviceInfoCB: param 0x%x\n", param));
8189
8190 if (status != OSSA_SUCCESS)
8191 {
8192 TI_DBG1(("ossaSetDeviceInfoCB: status %d\n", status));
8193 TI_DBG1(("ossaSetDeviceInfoCB: option 0x%x\n", option));
8194 TI_DBG1(("ossaSetDeviceInfoCB: param 0x%x\n", param));
8195 }
8196
8197 if (agDevHandle == agNULL)
8198 {
8199 TI_DBG4(("ossaSetDeviceInfoCB: agDevHandle is NULL\n"));
8200 return;
8201 }
8202
8203 oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
8204
8205 if (oneDeviceData == agNULL)
8206 {
8207 TI_DBG1(("ossaSetDeviceInfoCB: wrong; oneDeviceData is NULL\n"));
8208 }
8209 else
8210 {
8211 TI_DBG4(("ossaSetDeviceInfoCB: did %d\n", oneDeviceData->id));
8212 }
8213
8214 return;
8215 }
8216
8217 /*****************************************************************************/
8218 /*! \brief ossaGetDFEDataCB
8219 *
8220 *
8221 * Purpose: ossaGetDFEDataCB() is the response callback function
8222 * called by the LL Layer to indicate a response to
8223 * saGetDFEData()
8224 *
8225 * \param agRoot: Pointer to chip/driver Instance.
8226 * \param agContext: Context of the operation originally
8227 * passed into saGetDFEData()
8228 * \param status: status
8229 * \param agInfoLen: length in bytes of DFE data captured and transferred
8230 *
8231 * \return None.
8232 *
8233 */
8234 /*****************************************************************************/
8235 GLOBAL void ossaGetDFEDataCB(
8236 agsaRoot_t *agRoot,
8237 agsaContext_t *agContext,
8238 bit32 status,
8239 bit32 agInfoLen)
8240 {
8241 TI_DBG1(("ossaGetDFEDataCB: start\n"));
8242 TI_DBG1(("ossaGetDFEDataCB: status 0x%x agInfoLen 0x%x\n", status, agInfoLen));
8243 return;
8244 }
8245
8246 /*****************************************************************************/
8247 /*! \brief ossaVhistCaptureCB
8248 *
8249 *
8250 * Purpose: ossaVhistCaptureCB() is the response callback function
8251 * called by the LL Layer to indicate a response to
8252 * saGetDFEData()
8253 *
8254 * \param agRoot: Pointer to chip/driver Instance.
8255 * \param agContext: Context of the operation originally
8256 * passed into ()
8257 * \param status: status
8258 * \param len: length in bytes of Vis data captured and transferred
8259 *
8260 * \return None.
8261 *
8262 */
8263 /*****************************************************************************/
8264
8265 void ossaVhistCaptureCB(
8266 agsaRoot_t *agRoot,
8267 agsaContext_t *agContext,
8268 bit32 status,
8269 bit32 len)
8270 {
8271 TI_DBG1(("ossaVhistCaptureCB: start\n"));
8272 TI_DBG1(("ossaVhistCaptureCB: status 0x%x agInfoLen 0x%x\n", status,len ));
8273 return;
8274 }
8275
8276 GLOBAL void ossaOperatorManagementCB(
8277 agsaRoot_t *agRoot,
8278 agsaContext_t *agContext,
8279 bit32 status,
8280 bit32 eq
8281 )
8282 {
8283 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8284 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8285 tiEncryptPort_t encryptEventData;
8286
8287 TI_DBG1(("ossaOperatorManagementCB: status 0x%x eq 0x%x\n", status, eq));
8288
8289 osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
8290 encryptEventData.encryptEvent = tiEncryptOperatorManagement;
8291 encryptEventData.subEvent = eq;
8292 encryptEventData.pData = agNULL;
8293
8294 ostiPortEvent(tiRoot,
8295 tiEncryptOperation,
8296 status,
8297 &encryptEventData);
8298 }
8299
8300 GLOBAL void ossaEncryptSelftestExecuteCB (
8301 agsaRoot_t *agRoot,
8302 agsaContext_t *agContext,
8303 bit32 status,
8304 bit32 type,
8305 bit32 length,
8306 void *TestResult
8307 )
8308 {
8309 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8310 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8311 tiEncryptPort_t encryptEventData;
8312
8313 TI_DBG1(("ossaEncryptSelftestExecuteCB: status 0x%x type 0x%x length 0x%x\n", status, type, length));
8314
8315 osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
8316 encryptEventData.encryptEvent = tiEncryptSelfTest;
8317 encryptEventData.subEvent = type;
8318 encryptEventData.pData = (void*)TestResult;
8319
8320 ostiPortEvent(tiRoot,
8321 tiEncryptOperation,
8322 status,
8323 &encryptEventData);
8324 }
8325
8326 GLOBAL void ossaGetOperatorCB(
8327 agsaRoot_t *agRoot,
8328 agsaContext_t *agContext,
8329 bit32 status,
8330 bit32 option,
8331 bit32 num,
8332 bit32 role,
8333 agsaID_t *id
8334 )
8335 {
8336
8337 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8338 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8339 tiEncryptPort_t encryptEventData;
8340
8341 TI_DBG1(("ossaGetOperatorCB: status 0x%x option 0x%x num 0x%x role 0x%x\n",
8342 status, option, num, role));
8343 TI_DBG1(("ossaGetOperatorCB: agContext %p id %p\n",agContext,id));
8344 osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
8345 encryptEventData.encryptEvent = tiEncryptGetOperator;
8346 encryptEventData.subEvent = option;
8347 encryptEventData.pData = agNULL;
8348
8349 switch(status)
8350 {
8351 case OSSA_IO_SUCCESS:
8352 TI_DBG1(("ossaGetOperatorCB: OSSA_IO_SUCCESS option 0x%x\n", option));
8353 if(option == 1)
8354 {
8355 TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[0], id->ID[1], id->ID[2], id->ID[3]));
8356 TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[4], id->ID[5], id->ID[6], id->ID[7]));
8357 TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[8], id->ID[9], id->ID[10],id->ID[11]));
8358 TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[12],id->ID[13],id->ID[14],id->ID[15]));
8359 TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[16],id->ID[17],id->ID[18],id->ID[19]));
8360 TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[20],id->ID[21],id->ID[22],id->ID[23]));
8361 TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[24],id->ID[25],id->ID[26],id->ID[27]));
8362 TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x\n", id->ID[28],id->ID[29],id->ID[30]));
8363 }else if(option == 2)
8364 {
8365 TI_DBG1(("ossaGetOperatorCB: number operators 0x%02x\n", num ));
8366 }
8367
8368 encryptEventData.pData = id;
8369 break;
8370 case OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION:
8371 TI_DBG1(("ossaGetOperatorCB: OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION 0x%x\n",option));
8372 break;
8373 case OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE:
8374 TI_DBG1(("ossaGetOperatorCB: OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE 0x%x\n",option));
8375 break;
8376 default:
8377 TI_DBG1(("ossaGetOperatorCB: Unknown status 0x%x\n",status));
8378 }
8379 ostiPortEvent(tiRoot,
8380 tiEncryptOperation,
8381 status,
8382 &encryptEventData);
8383
8384 }
8385
8386 GLOBAL void ossaSetOperatorCB(
8387 agsaRoot_t *agRoot,
8388 agsaContext_t *agContext,
8389 bit32 status,
8390 bit32 eq
8391 )
8392 {
8393 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8394 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8395 tiEncryptPort_t encryptEventData;
8396
8397 TI_DBG1(("ossaSetOperatorCB: agContext %p status 0x%x eq 0x%x\n",agContext, status, eq));
8398
8399 osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
8400 encryptEventData.encryptEvent = tiEncryptSetOperator;
8401 encryptEventData.subEvent = 0;
8402 switch(status)
8403 {
8404 case OSSA_IO_SUCCESS:
8405 TI_DBG1(("ossaSetOperatorCB: OSSA_IO_SUCCESS\n"));
8406 encryptEventData.pData = agNULL;
8407 break;
8408 case OSSA_MPI_ENC_ERR_CONTROLLER_NOT_IDLE:
8409 TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_ERR_CONTROLLER_NOT_IDLE\n"));
8410 break;
8411 case OSSA_MPI_ENC_OPERATOR_AUTH_FAILURE:
8412 TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_OPERATOR_AUTH_FAILURE error qualifier 0x%x\n",eq));
8413 break;
8414 case OSSA_MPI_ENC_OPERATOR_OPERATOR_ALREADY_LOGGED_IN:
8415 TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_OPERATOR_OPERATOR_ALREADY_LOGGED_IN\n"));
8416 break;
8417 case OSSA_MPI_ENC_OPERATOR_ILLEGAL_PARAMETER:
8418 TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_OPERATOR_ILLEGAL_PARAMETER\n"));
8419 break;
8420 case OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION:
8421 TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION\n"));
8422 break;
8423 case OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE:
8424 TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE\n"));
8425 break;
8426 default:
8427 TI_DBG1(("ossaGetOperatorCB: Unknown status 0x%x\n",status));
8428 }
8429 ostiPortEvent(tiRoot,
8430 tiEncryptOperation,
8431 status,
8432 &encryptEventData);
8433 }
8434
8435 GLOBAL void ossaDIFEncryptionOffloadStartCB(
8436 agsaRoot_t *agRoot,
8437 agsaContext_t *agContext,
8438 bit32 status,
8439 agsaOffloadDifDetails_t *agsaOffloadDifDetails)
8440 {
8441 TI_DBG1(("ossaDIFEncryptionOffloadStartCB: start\n"));
8442 TI_DBG1(("ossaDIFEncryptionOffloadStartCB: status 0x%x agsaOffloadDifDetails=%p\n", status, agsaOffloadDifDetails));
8443 return;
8444 }
8445
8446 GLOBAL bit32 ossaTimeStamp( agsaRoot_t *agRoot )
8447 {
8448 tdsaRootOsData_t *osData= agNULL;
8449 tiRoot_t *tiRoot= agNULL;
8450 if(agRoot)
8451 {
8452 osData = (tdsaRootOsData_t *)agRoot->osData;
8453 }
8454 if(osData)
8455 {
8456 tiRoot = (tiRoot_t *)osData->tiRoot;
8457 }
8458 return(ostiTimeStamp(tiRoot));
8459 }
8460
8461 GLOBAL bit64 ossaTimeStamp64( agsaRoot_t *agRoot)
8462 {
8463 tdsaRootOsData_t *osData= agNULL;
8464 tiRoot_t *tiRoot= agNULL;
8465 if(agRoot)
8466 {
8467 osData = (tdsaRootOsData_t *)agRoot->osData;
8468 }
8469 if(osData)
8470 {
8471 tiRoot = (tiRoot_t *)osData->tiRoot;
8472 }
8473 return(ostiTimeStamp64(tiRoot));
8474 }
8475
8476 #ifdef FDS_SM
8477 osGLOBAL void
8478 tdIDStartTimer(tiRoot_t *tiRoot,
8479 smIORequest_t *smIORequest,
8480 tdsaDeviceData_t *oneDeviceData
8481 )
8482 {
8483 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
8484 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8485 itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
8486
8487 TI_DBG1(("tdIDStartTimer: start\n"));
8488
8489 tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
8490 if (oneDeviceData->tdIDTimer.timerRunning == agTRUE)
8491 {
8492 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
8493 tdsaKillTimer(
8494 tiRoot,
8495 &oneDeviceData->tdIDTimer
8496 );
8497 }
8498 else
8499 {
8500 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
8501 }
8502
8503 tdsaSetTimerRequest(
8504 tiRoot,
8505 &oneDeviceData->tdIDTimer,
8506 SATA_ID_DEVICE_DATA_TIMER_VALUE/Initiator->OperatingOption.UsecsPerTick,
8507 tdIDStartTimerCB,
8508 smIORequest,
8509 oneDeviceData,
8510 agNULL
8511 );
8512
8513 tdsaAddTimer(
8514 tiRoot,
8515 &Initiator->timerlist,
8516 &oneDeviceData->tdIDTimer
8517 );
8518 TI_DBG1(("tdIDStartTimer: end\n"));
8519 return;
8520 }
8521
8522 osGLOBAL void
8523 tdIDStartTimerCB(
8524 tiRoot_t * tiRoot,
8525 void * timerData1,
8526 void * timerData2,
8527 void * timerData3
8528 )
8529 {
8530 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
8531 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8532 smIORequest_t *smIORequest;
8533 tdsaDeviceData_t *oneDeviceData;
8534 smRoot_t *smRoot;
8535 tdIORequestBody_t *tdIORequestBody;
8536 smDeviceHandle_t *smDeviceHandle;
8537 tdsaPortContext_t *onePortContext;
8538 #ifdef REMOVED
8539 agsaRoot_t *agRoot;
8540 bit32 IDstatus;
8541 //#endif
8542 //#ifdef REMOVED
8543 agsaIORequest_t *agAbortIORequest = agNULL;
8544 tdIORequestBody_t *tdAbortIORequestBody = agNULL;
8545 bit32 PhysUpper32;
8546 bit32 PhysLower32;
8547 bit32 memAllocStatus;
8548 void *osMemHandle;
8549 #endif // REMOVED
8550 #ifdef TD_DEBUG_ENABLE
8551 bit32 status = AGSA_RC_FAILURE;
8552 #endif
8553
8554 TI_DBG1(("tdIDStartTimerCB start\n"));
8555 smIORequest = (smIORequest_t *)timerData1;
8556 oneDeviceData = (tdsaDeviceData_t *)timerData2;
8557 smRoot = &(tdsaAllShared->smRoot);
8558 #ifdef REMOVED
8559 agRoot = oneDeviceData->agRoot;
8560 #endif // REMOVED
8561
8562 if (smIORequest == agNULL)
8563 {
8564 TI_DBG1(("tdIDStartTimerCB: smIORequest == agNULL !!!!!!\n"));
8565 return;
8566 }
8567
8568 if (oneDeviceData == agNULL)
8569 {
8570 TI_DBG1(("tdIDStartTimerCB: oneDeviceData == agNULL !!!!!!\n"));
8571 return;
8572 }
8573
8574 if (oneDeviceData->satDevData.IDPending == agFALSE || oneDeviceData->satDevData.IDDeviceValid == agTRUE)
8575 {
8576 /*the Identify Device command already normally completed, just return*/
8577 return;
8578 }
8579
8580 tdIORequestBody = (tdIORequestBody_t *)smIORequest->tdData;
8581 smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
8582 onePortContext = oneDeviceData->tdPortContext;
8583 if (tdIORequestBody == agNULL)
8584 {
8585 TI_DBG1(("tdIDStartTimerCB: tdIORequestBody == agNULL !!!!!!\n"));
8586 return;
8587 }
8588
8589 if (smDeviceHandle == agNULL)
8590 {
8591 TI_DBG1(("tdIDStartTimerCB: smDeviceHandle == agNULL !!!!!!\n"));
8592 return;
8593 }
8594
8595 if (onePortContext == agNULL)
8596 {
8597 TI_DBG1(("tdIDStartTimerCB: onePortContext == agNULL !!!!!!\n"));
8598 return;
8599 }
8600
8601 TI_DBG1(("tdIDStartTimerCB: did %d\n", oneDeviceData->id));
8602 /*
8603 1. smIOabort()
8604 2. in tdsmIDCompletedCB(), retry
8605 */
8606 if (oneDeviceData->valid == agFALSE)
8607 {
8608 TI_DBG1(("tdIDStartTimerCB: invalid device\n"));
8609 return;
8610 }
8611 #ifdef TD_DEBUG_ENABLE
8612 status = smIOAbort( smRoot, smIORequest );
8613 #else
8614 smIOAbort( smRoot, smIORequest );
8615 #endif
8616
8617 #ifdef REMOVED
8618 /* allocating agIORequest for abort itself */
8619 memAllocStatus = ostiAllocMemory(
8620 tiRoot,
8621 &osMemHandle,
8622 (void **)&tdAbortIORequestBody,
8623 &PhysUpper32,
8624 &PhysLower32,
8625 8,
8626 sizeof(tdIORequestBody_t),
8627 agTRUE
8628 );
8629 if (memAllocStatus != tiSuccess)
8630 {
8631 /* let os process IO */
8632 TI_DBG1(("tdIDStartTimerCB: ostiAllocMemory failed...; can't retry ID data \n"));
8633 return;
8634 }
8635 if (tdAbortIORequestBody == agNULL)
8636 {
8637 /* let os process IO */
8638 TI_DBG1(("tdIDStartTimerCB: ostiAllocMemory returned NULL tdAbortIORequestBody; can't retry ID data\n"));
8639 return;
8640 }
8641 /* setup task management structure */
8642 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
8643 /* setting callback but not used later */
8644 tdAbortIORequestBody->IOCompletionFunc = agNULL;
8645 //tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler;
8646 tdAbortIORequestBody->tiDevHandle = (tiDeviceHandle_t *)&(oneDeviceData->tiDeviceHandle);
8647 /* initialize agIORequest */
8648 agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
8649 agAbortIORequest->osData = (void *) tdAbortIORequestBody;
8650 agAbortIORequest->sdkData = agNULL; /* LL takes care of this */
8651 //#endif
8652 //#ifdef REMOVED
8653 status = saSATAAbort(agRoot,
8654 agAbortIORequest,
8655 0,
8656 oneDeviceData->agDevHandle,
8657 1, /* abort all */
8658 agNULL,
8659 ossaSATAIDAbortCB
8660 );
8661 status = saSATAAbort(agRoot,
8662 agAbortIORequest,
8663 0,
8664 oneDeviceData->agDevHandle,
8665 0, /* abort one */
8666 agIORequest,
8667 ossaSATAIDAbortCB
8668 );
8669 //#endif
8670 //#ifdef REMOVED
8671 if (status != AGSA_RC_SUCCESS)
8672 {
8673 TI_DBG1(("tdIDStartTimerCB: saSATAAbort failed; can't retry ID data\n"));
8674 }
8675 if (oneDeviceData->satDevData.IDDeviceValid == agTRUE)
8676 {
8677 TI_DBG1(("tdIDStartTimerCB: IDDeviceValid is valid, no need to retry\n"));
8678 return;
8679 }
8680 if (tdIORequestBody->reTries <= SM_RETRIES)
8681 {
8682 tdIORequestBody->tiIORequest = agNULL; /* not in use */
8683 tdIORequestBody->pid = onePortContext->id;
8684 smIORequest->tdData = tdIORequestBody;
8685 smIORequest->smData = &tdIORequestBody->smIORequestBody;
8686 smDeviceHandle->tdData = oneDeviceData;
8687 IDstatus = smIDStart(smRoot, smIORequest, smDeviceHandle );
8688 if (IDstatus == SM_RC_SUCCESS)
8689 {
8690 TI_DBG1(("tdIDStartTimerCB: being retried!!!\n"));
8691 tdIORequestBody->reTries++;
8692 tdIORequestBody->ioCompleted = agFALSE;
8693 tdIORequestBody->ioStarted = agTRUE;
8694 tdIDStartTimer(tiRoot, smIORequest, oneDeviceData);
8695 }
8696 else
8697 {
8698 /* identify device data is not valid */
8699 TI_DBG1(("tdIDStartTimerCB: smIDStart fail or busy %d!!!\n", IDstatus));
8700 tdIORequestBody->reTries = 0;
8701 tdIORequestBody->ioCompleted = agTRUE;
8702 tdIORequestBody->ioStarted = agFALSE;
8703 ostiFreeMemory( tiRoot,
8704 tdIORequestBody->osMemHandle,
8705 sizeof(tdIORequestBody_t)
8706 );
8707 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
8708 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
8709 return;
8710 }
8711 }
8712 else
8713 {
8714 /* give up */
8715 TI_DBG1(("tdIDStartTimerCB: retries are over!!!\n"));
8716 if (oneDeviceData->tdIDTimer.timerRunning == agTRUE)
8717 {
8718 tdsaKillTimer( tiRoot, &oneDeviceData->tdIDTimer );
8719 }
8720 tdIORequestBody->reTries = 0;
8721 tdIORequestBody->ioCompleted = agTRUE;
8722 tdIORequestBody->ioStarted = agFALSE;
8723 ostiFreeMemory(
8724 tiRoot,
8725 tdIORequestBody->osMemHandle,
8726 sizeof(tdIORequestBody_t)
8727 );
8728 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
8729
8730 if (oneDeviceData->SMNumOfID <= 0) /* does SMP HARD RESET only upto one time */
8731 {
8732 TI_DBG1(("tdIDStartTimerCB: fail; sending HARD_RESET\n"));
8733 oneDeviceData->SMNumOfID++;
8734 if (oneDeviceData->directlyAttached == agTRUE)
8735 {
8736 saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_HARD_RESET, agNULL);
8737 }
8738 else
8739 {
8740 tdsaPhyControlSend(tiRoot,
8741 oneDeviceData,
8742 SMP_PHY_CONTROL_HARD_RESET,
8743 agNULL);
8744 }
8745 }
8746 else
8747 {
8748 /* given up after one time of SMP HARD RESET; */
8749 TI_DBG1(("tdIDStartTimerCB: fail; but giving up sending HARD_RESET!!!\n"));
8750 if (oneDeviceData->directlyAttached == agTRUE)
8751 {
8752 smReportRemovalDirect(tiRoot, agRoot, oneDeviceData);
8753 }
8754 else
8755 {
8756 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
8757 }
8758 }
8759 }
8760 #endif // REMOVED
8761
8762 TI_DBG1(("tdIDStartTimerCB: end, smIOAbort status %d\n", status));
8763 return;
8764 }
8765 #endif // FDS_SM
8766
8767
8768 #if defined(FDS_DM) && defined(FDS_SM)
8769 //start here
8770 GLOBAL void
8771 tdIDStart(
8772 tiRoot_t *tiRoot,
8773 agsaRoot_t *agRoot,
8774 smRoot_t *smRoot,
8775 tdsaDeviceData_t *oneDeviceData,
8776 tdsaPortContext_t *onePortContext
8777 )
8778 {
8779 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
8780 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8781 bit32 SMstatus = SM_RC_FAILURE;
8782 tdIORequestBody_t *tdIORequestBody;
8783 smIORequest_t *smIORequest;
8784 smDeviceHandle_t *smDeviceHandle;
8785 bit32 PhysUpper32;
8786 bit32 PhysLower32;
8787 bit32 memAllocStatus;
8788 void *osMemHandle;
8789
8790
8791 TI_DBG1(("tdIDStart: start, did %d\n",oneDeviceData->id));
8792
8793 if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData)|| DEVICE_IS_STP_TARGET(oneDeviceData))
8794 &&
8795 oneDeviceData->satDevData.IDDeviceValid == agFALSE
8796 &&
8797 oneDeviceData->satDevData.IDPending == agFALSE
8798 )
8799 {
8800 TI_DBG2(("tdIDStart: in loop, did %d\n", oneDeviceData->id));
8801 /* allocating tdIORequestBody */
8802 memAllocStatus = ostiAllocMemory(
8803 tiRoot,
8804 &osMemHandle,
8805 (void **)&tdIORequestBody,
8806 &PhysUpper32,
8807 &PhysLower32,
8808 8,
8809 sizeof(tdIORequestBody_t),
8810 agTRUE
8811 );
8812 if (memAllocStatus != tiSuccess || tdIORequestBody == agNULL)
8813 {
8814 /* let os process IO */
8815 TI_DBG1(("tdIDStart: ostiAllocMemory failed... or ostiAllocMemory returned NULL tdIORequestBody!!!\n"));
8816 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
8817 if (oneDeviceData->directlyAttached == agTRUE)
8818 {
8819 /* notifying link up */
8820 ostiPortEvent(
8821 tiRoot,
8822 tiPortLinkUp,
8823 tiSuccess,
8824 (void *)onePortContext->tiPortalContext
8825 );
8826 #ifdef INITIATOR_DRIVER
8827 /* triggers discovery */
8828 ostiPortEvent(
8829 tiRoot,
8830 tiPortDiscoveryReady,
8831 tiSuccess,
8832 (void *) onePortContext->tiPortalContext
8833 );
8834 #endif
8835 }
8836 }
8837 else
8838 {
8839 /* initialize */
8840 osti_memset(tdIORequestBody, 0, sizeof(tdIORequestBody_t));
8841
8842 tdIORequestBody->osMemHandle = osMemHandle;
8843 TI_DBG2(("tdIDStart: tdIORequestBody %p tdIORequestBody->osMemHandle %p\n", tdIORequestBody, tdIORequestBody->osMemHandle));
8844
8845 /* not in use */
8846 tdIORequestBody->IOCompletionFunc = agNULL;
8847 tdIORequestBody->tiDevHandle = agNULL;
8848
8849 tdIORequestBody->tiIORequest = agNULL; /* not in use */
8850 tdIORequestBody->pid = onePortContext->id;
8851 tdIORequestBody->reTries = 0;
8852 smIORequest = (smIORequest_t *)&(tdIORequestBody->smIORequest);
8853 smIORequest->tdData = tdIORequestBody;
8854 smIORequest->smData = &tdIORequestBody->smIORequestBody;
8855
8856 smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
8857 smDeviceHandle->tdData = oneDeviceData;
8858
8859 TI_DBG2(("tdIDStart: smIORequest %p\n", smIORequest));
8860
8861 SMstatus = smIDStart(smRoot,
8862 smIORequest,
8863 &(oneDeviceData->smDeviceHandle)
8864 );
8865
8866 if (SMstatus == SM_RC_SUCCESS)
8867 {
8868 if (oneDeviceData->directlyAttached == agTRUE)
8869 {
8870 TI_DBG2(("tdIDStart: successfully sent identify device data\n"));
8871
8872 /* Add the devicedata to the mainlink */
8873 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
8874 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList));
8875 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
8876 TI_DBG6(("tdIDStart: one case did %d \n", oneDeviceData->id));
8877 }
8878 oneDeviceData->satDevData.IDPending = agTRUE;
8879 /* start a timer */
8880 tdIDStartTimer(tiRoot, smIORequest, oneDeviceData);
8881 }
8882 else
8883 {
8884 /* failed to send */
8885 TI_DBG1(("tdIDStart: smIDStart fail or busy %d\n", SMstatus));
8886
8887 /* free up allocated memory */
8888 ostiFreeMemory(
8889 tiRoot,
8890 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
8891 sizeof(tdIORequestBody_t)
8892 );
8893
8894 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
8895 if (oneDeviceData->directlyAttached == agTRUE)
8896 {
8897 TI_DBG1(("tdIDStart: failed in sending identify device data\n"));
8898 /* put onedevicedata back to free list */
8899 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
8900 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
8901 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
8902 /* notifying link up */
8903 ostiPortEvent(
8904 tiRoot,
8905 tiPortLinkUp,
8906 tiSuccess,
8907 (void *)onePortContext->tiPortalContext
8908 );
8909 #ifdef INITIATOR_DRIVER
8910 /* triggers discovery */
8911 ostiPortEvent(
8912 tiRoot,
8913 tiPortDiscoveryReady,
8914 tiSuccess,
8915 (void *) onePortContext->tiPortalContext
8916 );
8917 #endif
8918 }
8919 else
8920 {
8921 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
8922 }
8923 }
8924 }
8925 }
8926 TI_DBG1(("tdIDStart: exit\n"));
8927 return;
8928 }
8929
8930 #endif
8931
8932 #ifdef SALLSDK_OS_IOMB_LOG_ENABLE
8933 GLOBAL void ossaLogIomb(agsaRoot_t *agRoot,
8934 bit32 queueNum,
8935 agBOOLEAN isInbound,
8936 void *pMsg,
8937 bit32 msgLength)
8938 {
8939 return;
8940 }
8941 #endif /* SALLSDK_OS_IOMB_LOG_ENABLE */
8942
8943 #ifndef SATA_ENABLE
8944 /*
8945 * These callback routines are defined in ossasat.c which are included in the
8946 * compilation if SATA_ENABLED is defined.
8947 */
8948
8949 /*****************************************************************************
8950 *! \brief ossaDiscoverSataCB
8951 *
8952 * Purpose: This function is called by lower layer to inform TD layer of
8953 * STP/SATA discovery results
8954 *
8955 *
8956 * \param agRoot Pointer to chip/driver Instance.
8957 * \param agPortContext Pointer to the port context of TD and Lower layer
8958 * \param event event type
8959 * \param pParm1 Pointer to data associated with event
8960 * \param pParm2 Pointer to data associated with event
8961 *
8962 * \return: none
8963 *
8964 * \note - For details, refer to SAS/SATA Low-Level API Specification
8965 *
8966 *****************************************************************************/
8967
8968 osGLOBAL void ossaDiscoverSataCB( agsaRoot_t *agRoot,
8969 agsaPortContext_t *agPortContext,
8970 bit32 event,
8971 void *pParm1,
8972 void *pParm2
8973 )
8974 {
8975 return;
8976 }
8977
8978
8979 /*****************************************************************************
8980 *! \brief ossaSATACompleted
8981 *
8982 * This routine is called to complete a SATA request previously issued to the
8983 * LL Layer in saSATAStart()
8984 *
8985 * \param agRoot: Handles for this instance of SAS/SATA hardware
8986 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
8987 * \param agIOStatus: Status of completed I/O.
8988 * \param agFirstDword:Pointer to the four bytes of FIS.
8989 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8990 * length.
8991 * \param agParam: Additional info based on status.
8992 *
8993 * \return: none
8994 *
8995 *****************************************************************************/
8996 GLOBAL void ossaSATACompleted(
8997 agsaRoot_t *agRoot,
8998 agsaIORequest_t *agIORequest,
8999 bit32 agIOStatus,
9000 void *agFirstDword,
9001 bit32 agIOInfoLen,
9002 void *agParam
9003 )
9004 {
9005 return;
9006 }
9007
9008
9009 /*****************************************************************************
9010 *! \brief ossaSATAEvent
9011 *
9012 * This routine is called to notify the OS Layer of an event associated with
9013 * SATA port or SATA device
9014 *
9015 * \param agRoot: Handles for this instance of SAS/SATA hardware
9016 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
9017 * \param agPortContext Pointer to the port context of TD and Lower layer
9018 * \param agDevHandle: Pointer to a device handle
9019 * \param event: event type
9020 *
9021 * \return: none
9022 *
9023 *****************************************************************************/
9024 osGLOBAL void ossaSATAEvent(
9025 agsaRoot_t *agRoot,
9026 agsaIORequest_t *agIORequest,
9027 agsaPortContext_t *agPortContext,
9028 agsaDevHandle_t *agDevHandle,
9029 bit32 event,
9030 bit32 agIOInfoLen,
9031 void *agParam
9032 )
9033 {
9034 return;
9035 }
9036
9037
9038 /*****************************************************************************
9039 *! \brief ossaSATADeviceResetCB
9040 *
9041 * This routine is called to complete a SATA device reset request previously
9042 * issued to the LL Layer in saSATADeviceReset().
9043 *
9044 * \param agRoot: Handles for this instance of SAS/SATA hardware
9045 * \param agDevHandle: Pointer to a device handle
9046 * \param resetStatus: Reset status:
9047 * OSSA_SUCCESS: The reset operation completed successfully.
9048 * OSSA_FAILURE: The reset operation failed.
9049 * \param resetparm: Pointer to the Device-To-Host FIS received from the device.
9050 *
9051 * \return: none
9052 *
9053 *****************************************************************************/
9054 osGLOBAL void ossaSATADeviceResetCB(
9055 agsaRoot_t *agRoot,
9056 agsaDevHandle_t *agDevHandle,
9057 bit32 resetStatus,
9058 void *resetparm)
9059 {
9060
9061 return;
9062
9063 }
9064
9065 /*****************************************************************************
9066 *! \brief ossaDiscoverSasCB
9067 *
9068 * Purpose: This function is called by lower layer to inform TD layer of
9069 * SAS discovery results
9070 *
9071 *
9072 * \param agRoot Pointer to chip/driver Instance.
9073 * \param agPortContext Pointer to the port context of TD and Lower layer
9074 * \param event event type
9075 * \param pParm1 Pointer to data associated with event
9076 * \param pParm2 Pointer to data associated with event
9077 *
9078 * \return: none
9079 *
9080 * \note - For details, refer to SAS/SATA Low-Level API Specification
9081 *
9082 *****************************************************************************/
9083 osGLOBAL void ossaDiscoverSasCB(agsaRoot_t *agRoot,
9084 agsaPortContext_t *agPortContext,
9085 bit32 event,
9086 void *pParm1,
9087 void *pParm2
9088 )
9089 {
9090 return;
9091 }
9092 #endif
9093
Cache object: bb6aaf51cc226bd99d15e857b32aefca
|