1 /*******************************************************************************
2 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
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
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.
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
21 ********************************************************************************/
22 /*******************************************************************************/
27 * This file contains CB functions used by lower layer in SAS/SATA TD layer
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
32 #include <dev/pms/config.h>
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>
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>
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>
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>
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>
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>
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>
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>
75 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
76 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
79 /* temporary to test saEchoCommand() */
83 #if defined(SALLSDK_DEBUG)
84 extern bit32 gLLDebugLevel;
88 #include <dev/pms/RefTisa/sallsdk/spc/mpidebug.h>
90 #ifdef SA_ENABLE_TRACE_FUNCTIONS
95 #define siTraceFileID 'R'
98 functions that are common to SAS and SATA
102 void ossaCacheInvalidate(
109 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
110 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
112 TI_DBG6(("ossaCacheInvalidate: start\n"));
113 ostiCacheInvalidate(tiRoot, osMemHandle, virtPtr, length);
125 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
126 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
128 TI_DBG6(("ossaCacheFlush: start\n"));
129 ostiCacheFlush(tiRoot, osMemHandle, virtPtr, length);
134 void ossaCachePreFlush(
142 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
143 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
145 TI_DBG6(("ossaCachePreFlush: start\n"));
146 ostiCachePreFlush(tiRoot, osMemHandle, virtPtr, length);
150 /*****************************************************************************
151 *! \brief ossaDeviceHandleAccept
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
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
163 * OSSA_RC_REJECT A device is accpeted
164 * OSSA_RC_ACCEPT A device is rejected
166 * \note - For details, refer to SAS/SATA Low-Level API Specification
168 *****************************************************************************/
169 osGLOBAL bit32 ossaDeviceHandleAccept(
171 agsaDevHandle_t *agDevHandle,
172 agsaSASDeviceInfo_t *agDevInfo,
173 agsaPortContext_t *agPortContext,
174 bit32 *hostAssignedDeviceId
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;
183 tdsaPortContext_t *onePortContext = agNULL;
184 tiPortalContext_t *tiPortalContext = agNULL;
185 tdsaDeviceData_t *oneDeviceData = agNULL;
186 tiDeviceHandle_t *tiDeviceHandle = agNULL;
187 tdsaSASSubID_t agSASSubID;
192 by default TD layer accpets all devices
196 by LINK_UP event tdsaPortContext should have been created
198 smTraceFuncEnter(hpDBG_VERY_LOUD, "Y0");
199 TI_DBG1(("ossaDeviceHandleAccept: start hostAssignedDeviceId 0x%X\n",*hostAssignedDeviceId));
202 if (agPortContext == agNULL)
204 TI_DBG1(("ossaDeviceHandleAccept: NULL agsaPortContext; wrong\n"));
205 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y0");
206 return OSSA_RC_REJECT;
210 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
212 if (onePortContext == agNULL)
214 TI_DBG1(("ossaDeviceHandleAccept: NULL oneportcontext; wrong\n"));
215 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y0");
216 return OSSA_RC_REJECT;
219 tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext;
221 if (tiPortalContext == agNULL)
223 TI_DBG1(("ossaDeviceHandleAccept: NULL tiPortalContext; wrong\n"));
224 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y0");
225 return OSSA_RC_REJECT;
229 add the device to device list
230 cf) OSSA_DISCOVER_FOUND_DEVICE
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));
238 if (DEVINFO_GET_DEVICETTYPE(&agDevInfo->commonDevInfo) == SAS_END_DEVICE)
240 TI_DBG4(("ossaDeviceHandleAccept: SAS_END_DEVICE\n"));
242 else if (DEVINFO_GET_DEVICETTYPE(&agDevInfo->commonDevInfo) == SAS_EDGE_EXPANDER_DEVICE)
244 TI_DBG4(("ossaDeviceHandleAccept: SAS_EDGE_EXPANDER_DEVICE\n"));
246 else /* SAS_FANOUT_EXPANDER_DEVICE */
248 TI_DBG4(("ossaDeviceHandleAccept: SAS_FANOUT_EXPANDER_DEVICE\n"));
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;
256 tdssAddSASToSharedcontext(
266 /* at this point devicedata for new device exists */
267 oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
269 if (oneDeviceData == agNULL)
271 TI_DBG1(("ossaDeviceHandleAccept: NULL oneDeviceData; wrong\n"));
272 return OSSA_RC_REJECT;
275 oneDeviceData->registered = agTRUE;
277 tiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
279 if (tiDeviceHandle == agNULL)
281 TI_DBG1(("ossaDeviceHandleAccept: NULL tiDeviceHandle; wrong\n"));
282 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y0");
283 return OSSA_RC_REJECT;
286 /* setting MCN in agsaDeviceInfo_t*/
287 agDevInfo->commonDevInfo.flag = agDevInfo->commonDevInfo.flag | (tdsaAllShared->MCN << 16);
288 /* increment RegisteredDevNums */
289 onePortContext->RegisteredDevNums++;
291 *hostAssignedDeviceId |= 0xBEEF0000;
293 TI_DBG1(("ossaDeviceHandleAccept: Now hostAssignedDeviceId 0x%X\n", *hostAssignedDeviceId));
296 /* no login in SAS */
298 osGLOBAL bit32 ostiTargetEvent (
300 tiPortalContext_t *portalContext,
301 tiDeviceHandle_t *tiDeviceHandle,
302 tiTgtEventType_t eventType,
312 tiTgtEventTypeDeviceChange,
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;
325 #ifdef INITIATOR_DRIVER
326 /* this function is not used in case of Initiator */
327 return OSSA_RC_ACCEPT;
331 #ifdef INITIATOR_DRIVER
332 /*****************************************************************************
333 *! \brief ossaDiscoverSasCB
335 * Purpose: This function is called by lower layer to inform TD layer of
336 * SAS discovery results
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
347 * \note - For details, refer to SAS/SATA Low-Level API Specification
349 *****************************************************************************/
350 osGLOBAL void ossaDiscoverSasCB(agsaRoot_t *agRoot,
351 agsaPortContext_t *agPortContext,
357 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
358 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
359 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)osData->tdsaAllShared;
361 tdsaPortContext_t *onePortContext = agNULL;
362 tdsaDeviceData_t *oneDeviceData = agNULL;
364 agsaDevHandle_t *agDevHandle = agNULL;
365 agsaSASDeviceInfo_t *agDeviceInfo = agNULL;
366 tiPortalContext_t *tiPortalContext = agNULL;
367 tdList_t *DeviceListList;
368 tdsaSASSubID_t agSASSubID;
370 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y1");
371 TI_DBG2(("ossaDiscoverSasCB: start\n"));
373 if (agPortContext == agNULL)
375 TI_DBG1(("ossaDiscoverSasCB: NULL agsaPortContext; wrong\n"));
379 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
380 tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext;
384 case OSSA_DISCOVER_STARTED:
386 TI_DBG3(("ossaDiscoverSasCB: STARTED pid %d\n", onePortContext->id));
388 invalidate all devices in current device list
390 DeviceListList = tdsaAllShared->MainDeviceList.flink;
391 while (DeviceListList != &(tdsaAllShared->MainDeviceList))
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)
399 TI_DBG3(("ossaDiscoverSasCB: did %d is invalidated \n", oneDeviceData->id));
400 /* temporary solution: only for sata direct attached */
402 DeviceListList = DeviceListList->flink;
404 onePortContext->DiscoveryState = ITD_DSTATE_STARTED;
408 case OSSA_DISCOVER_FOUND_DEVICE:
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)));
417 TI_DBG6(("ossaDiscoverSasCB: phys %d\n", agDeviceInfo->numOfPhys));
418 TI_DBG4(("ossaDiscoverSasCB: pid %d\n", onePortContext->id));
421 /* Add only target devices; do not add expander device */
422 if (DEVINFO_GET_DEVICETTYPE(&agDeviceInfo->commonDevInfo) == SAS_END_DEVICE)
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;
429 TI_DBG2(("ossaDiscoverSasCB: adding ....\n"));
431 tdssAddSASToSharedcontext(
437 agDeviceInfo->phyIdentifier,
438 TD_OPERATION_INITIATOR
444 tiIntrEventTypeDeviceChange,
451 TI_DBG5(("ossaDiscoverSasCB: $$$$$ not end device. not adding....\n"));
458 case OSSA_DISCOVER_REMOVED_DEVICE:
460 TI_DBG3(("ossaDiscoverSasCB: REMOVED_DEVICE\n"));
461 agDevHandle = (agsaDevHandle_t *)pParm1;
462 agDeviceInfo = (agsaSASDeviceInfo_t *)pParm2;
463 oneDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
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));
472 if (oneDeviceData == agNULL)
474 TI_DBG1(("ossaDiscoverSasCB: Wrong. DevHandle->osData is NULL but is being removed\n"));
478 tdssRemoveSASFromSharedcontext(onePortContext,
481 agDevHandle->osData = agNULL;
486 tiIntrEventTypeDeviceChange,
494 case OSSA_DISCOVER_COMPLETE:
496 TI_DBG2(("ossaDiscoverSasCB: SAS COMPLETE pid %d\n", onePortContext->id));
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
504 onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED;
505 TI_DBG6(("ossaDiscoverSasCB: COMPLETE pid %d\n", onePortContext->id));
509 TI_DBG2(("ossaDiscoverSasCB: calling SATA discovery\n"));
511 /* Continue with SATA discovery */
512 saDiscover(agRoot, agPortContext, AG_SA_DISCOVERY_TYPE_SATA,
513 onePortContext->discoveryOptions);
515 #else /* SATA not enable */
517 #ifdef TD_INTERNAL_DEBUG /* for debugging */
518 /* dump device list */
519 DeviceListList = tdsaAllShared->MainPortContextList.flink;
521 while (DeviceListList != &(tdsaAllShared->MainPortContextList))
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;
531 /* letting OS layer know discovery has been successfully complete */
536 tiIntrEventTypeDiscovery,
540 #endif /* SATA_ENABLE */
544 case OSSA_DISCOVER_ABORT:
546 TI_DBG3(("ossaDiscoverSasCB: ABORT\n"));
547 /* letting OS layer know discovery has not been successfully complete */
552 tiIntrEventTypeDiscovery,
558 case OSSA_DISCOVER_ABORT_ERROR_1:
560 TI_DBG3(("ossaDiscoverSasCB: ERROR 1\n"));
561 /* letting OS layer know discovery has not been successfully complete */
566 tiIntrEventTypeDiscovery,
573 case OSSA_DISCOVER_ABORT_ERROR_2:
575 TI_DBG3(("ossaDiscoverSasCB: ERROR 2\n"));
576 /* letting OS layer know discovery has not been successfully complete */
581 tiIntrEventTypeDiscovery,
588 case OSSA_DISCOVER_ABORT_ERROR_3:
590 TI_DBG3(("ossaDiscoverSasCB: ERROR 3\n"));
591 /* letting OS layer know discovery has not been successfully complete */
596 tiIntrEventTypeDiscovery,
602 case OSSA_DISCOVER_ABORT_ERROR_4:
604 TI_DBG3(("ossaDiscoverSasCB: ERROR 4\n"));
605 /* letting OS layer know discovery has not been successfully complete */
610 tiIntrEventTypeDiscovery,
616 case OSSA_DISCOVER_ABORT_ERROR_5:
618 TI_DBG3(("ossaDiscoverSasCB: ERROR 5\n"));
619 /* letting OS layer know discovery has not been successfully complete */
624 tiIntrEventTypeDiscovery,
630 case OSSA_DISCOVER_ABORT_ERROR_6:
632 TI_DBG3(("ossaDiscoverSasCB: ERROR 6\n"));
633 /* letting OS layer know discovery has not been successfully complete */
638 tiIntrEventTypeDiscovery,
644 case OSSA_DISCOVER_ABORT_ERROR_7:
646 TI_DBG3(("ossaDiscoverSasCB: ERROR 7\n"));
647 /* letting OS layer know discovery has not been successfully complete */
652 tiIntrEventTypeDiscovery,
658 case OSSA_DISCOVER_ABORT_ERROR_8:
660 TI_DBG3(("ossaDiscoverSasCB: ERROR 8\n"));
661 /* letting OS layer know discovery has not been successfully complete */
666 tiIntrEventTypeDiscovery,
672 case OSSA_DISCOVER_ABORT_ERROR_9:
674 TI_DBG3(("ossaDiscoverSasCB: ERROR 9\n"));
675 /* letting OS layer know discovery has not been successfully complete */
680 tiIntrEventTypeDiscovery,
687 TI_DBG3(("ossaDiscoverSasCB: ERROR default event 0x%x\n", event));
688 /* letting OS layer know discovery has not been successfully complete */
693 tiIntrEventTypeDiscovery,
698 } /* end of switch */
699 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y1");
702 #endif // #ifdef INITIATOR_DRIVER
704 osGLOBAL void ossaLogTrace0(
712 osGLOBAL void ossaLogTrace1(
721 osGLOBAL void ossaLogTrace2(
731 osGLOBAL void ossaLogTrace3(
757 /*****************************************************************************
760 * Purpose: This function is called by lower layer to inform TD layer of
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
772 * \note - For details, refer to SAS/SATA Low-Level API Specification
774 *****************************************************************************/
775 osGLOBAL void ossaHwCB(
777 agsaPortContext_t *agPortContext,
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;
792 #ifdef INITIATOR_DRIVER
793 tdsaSASSubID_t agSASSubID;
799 bit32 HwAckSatus = AGSA_RC_SUCCESS;
801 // #ifdef INITIATOR_DRIVER
802 #ifdef INITIATOR_DRIVER
803 agsaFisRegDeviceToHost_t *RegD2H = agNULL;
804 tdsaDeviceData_t *oneDeviceData = agNULL;
805 tdList_t *DeviceListList;
808 bit32 found = agFALSE;
810 agsaHWEventEncrypt_t *pEncryptCBData;
811 agsaEncryptInfo_t *pEncryptInfo;
812 agsaHWEventMode_t *pModeEvent;
813 tiEncryptPort_t encryptEventData;
814 tiEncryptInfo_t encryptInfo;
819 bit32 securitySetModeStatus;
820 bit32 securityModeStatus;
822 // #endif /* INITIATOR_DRIVER */
823 agsaPhyErrCountersPage_t *agPhyErrCountersPage;
824 agsaEventSource_t eventSource;
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;
834 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y2");
836 TI_DBG2(("ossaHwCB: agPortContext %p event 0x%x eventParm1 0x%x eventParm2 %p eventParm3 %p\n",
837 agPortContext,event,eventParm1,eventParm2,eventParm3 ));
841 case OSSA_HW_EVENT_SAS_PHY_UP:
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;
850 TI_DBG2(("ossaHwCB: Phy%d SAS link Up\n", PhyID));
852 if (agPortContext == agNULL)
854 TI_DBG1(("ossaHwCB: agPortContext null, wrong\n"));
855 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y2");
858 if (agDevHandle == agNULL)
860 TI_DBG3(("ossaHwCB: agDevHandle null by design change\n"));
863 if (IDframe == agNULL)
865 TI_DBG1(("ossaHwCB: IDframe null, wrong\n"));
866 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y2");
870 if (LinkRate == 0x01)
872 TI_DBG1(("ossaHwCB: SAS Link Rate is 1.5 Gbps PhyID %d\n",PhyID));
874 if (LinkRate == 0x02)
876 TI_DBG1(("ossaHwCB: SAS Link Rate is 3.0 Gbps PhyID %d\n",PhyID));
878 if (LinkRate == 0x04)
880 TI_DBG1(("ossaHwCB: SAS Link Rate is 6.0 Gbps PhyID %d\n",PhyID));
882 if (LinkRate == 0x08)
884 TI_DBG1(("ossaHwCB: SAS Link Rate is 12.0 Gbps PhyID %d\n",PhyID));
887 if (PortState == OSSA_PORT_INVALID)
889 TI_DBG1(("ossaHwCB: Wrong port state with SAS link up\n"));
890 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y2");
894 if ( agPortContext->osData == agNULL)
896 TI_DBG6 (("ossaHwCB: PhyID %d tdsaAllShared %p\n", PhyID, tdsaAllShared));
897 if (tdsaAllShared->Ports[PhyID].tiPortalContext == agNULL)
899 TI_DBG6(("ossaHwCB: NULL portalcontext\n"));
903 TI_DBG6(("ossaHwCB: NOT NULL portalcontext\n"));
906 if (IDframe == agNULL)
908 TI_DBG1(("ossaHwCB: IDFrame is NULL; SATA !!!!\n"));
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)));
919 setting tdsaPortContext fields
920 take the head from the FreeLink of tdsaPortContext_t
922 then put it in MainLink of tdsaPortContext_t
924 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
925 if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
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)
934 TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
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;
943 onePortContext->PhyIDList[PhyID] = agTRUE;
944 if (IDframe == agNULL)
946 onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
947 onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
948 onePortContext->directAttatchedSAS = agTRUE;
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)
959 onePortContext->directAttatchedSAS = agTRUE;
962 if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_EDGE_EXPANDER_DEVICE ||
963 SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_FANOUT_EXPANDER_DEVICE
966 onePortContext->UseDM = agTRUE;
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)
981 onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
983 else if (LinkRate == 0x02)
985 onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
987 else if (LinkRate == 0x04)
989 onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
991 else /* (LinkRate == 0x08) */
993 onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
996 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
997 TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
998 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
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);
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));
1013 dmPortInfo.flag = onePortContext->LinkRate;
1015 if (onePortContext->UseDM == agTRUE)
1017 TI_DBG1(("ossaHwCB: calling dmCreatePort\n"));
1018 status = dmCreatePort(dmRoot, dmPortContext, &dmPortInfo);
1019 if (status != DM_RC_SUCCESS)
1021 TI_DBG1(("ossaHwCB: dmCreatePort failed!!! 0x%x\n", status));
1029 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1030 TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
1032 #ifdef TD_INTERNAL_DEBUG /* for debugging only */
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);
1040 #ifdef TD_INTERNAL_DEBUG /* for debugging */
1041 PortContextList = tdsaPortContext->MainLink.flink;
1042 while (PortContextList != &(tdsaPortContext->MainLink))
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;
1050 /* add agDevHandle */
1051 if (SA_IDFRM_GET_DEVICETTYPE(IDframe) != SAS_NO_DEVICE)
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;
1060 TI_DBG2(("ossaHwCB: adding ....\n"));
1061 /* uses only SASIDframe not agsaSASDeviceInfo_t */
1062 #ifdef INITIATOR_DRIVER
1063 tdssAddSASToSharedcontext(
1066 agDevHandle, /* agNULL */
1070 TD_OPERATION_INITIATOR
1075 if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE &&
1076 SA_IDFRM_IS_SSP_TARGET(IDframe) )
1078 TI_DBG2(("ossaHwCB: NOTIFY_ENABLE_SPINUP PhyID %d \n", PhyID));
1080 for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
1082 saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
1087 tdsaUpdateMCN(dmRoot, onePortContext);
1090 #ifdef TARGET_DRIVER
1091 TI_DBG1(("ossaHwCB: target, link up PhyID 0x%x\n",PhyID));
1093 /* notifying link up */
1098 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
1104 TI_DBG5(("ossaHwCB: $$$$$ not end device. not adding....\n"));
1107 saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RECOVERY_TIME */
1111 AGSA_PORT_SET_PORT_RECOVERY_TIME,
1112 tdsaAllShared->portTMO, //PORT_RECOVERY_TIMEOUT
1115 /* setting SAS PORT RESET TMO and SATA PORT RESET TMO*/
1116 if (tIsSPCV12G(agRoot))
1118 saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RESET_TIME */
1122 AGSA_PORT_SET_PORT_RESET_TIME,
1123 SAS_12G_PORT_RESET_TMO, // 800 ms
1129 saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RESET_TIME */
1133 AGSA_PORT_SET_PORT_RESET_TIME,
1134 SAS_PORT_RESET_TMO, // 300 ms
1142 an existing portcontext
1146 TI_DBG2(("ossaHwCB: SAS existing portcontext returned\n"));
1148 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
1149 if (onePortContext == agNULL)
1151 TI_DBG1(("ossaHwCB: onePortContext is NULL, wrong!\n"));
1154 if (onePortContext->valid == agFALSE)
1156 /* port has been invalidated; needs to be allocated */
1157 TI_DBG2(("ossaHwCB: SAS allocating port context\n"));
1159 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1160 if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
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)
1169 TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
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;
1177 onePortContext->PhyIDList[PhyID] = agTRUE;
1178 if (IDframe == agNULL)
1180 onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
1181 onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
1182 onePortContext->directAttatchedSAS = agTRUE;
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)
1193 onePortContext->directAttatchedSAS = agTRUE;
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)
1207 onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
1209 else if (LinkRate == 0x02)
1211 onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
1213 else if (LinkRate == 0x04)
1215 onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
1217 else /* (LinkRate == 0x08) */
1219 onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
1221 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1222 TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
1223 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1227 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1228 TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
1229 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y2");
1232 } /* invalidated port */
1235 /* already alloacated */
1236 TI_DBG2(("ossaHwCB: SAS already allocated port context\n"));
1237 if (TDLIST_EMPTY(&(tdsaAllShared->MainPortContextList)))
1239 TI_DBG1(("ossaHwCB: wrong!!! null tdsaPortContext list\n"));
1240 smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "Y2");
1243 if (onePortContext == agNULL)
1245 TI_DBG1(("ossaHwCB: wrong !!! No corressponding tdsaPortContext\n"));
1246 smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "Y2");
1250 TI_DBG2(("ossaHwCB: existing pid %d\n", onePortContext->id));
1251 if (tdsaAllShared->Ports[PhyID].portContext == agNULL)
1253 TI_DBG1(("ossaHwCB: existing allshared pid is NULL\n"));
1257 TI_DBG2(("ossaHwCB: existing allshared pid %d\n", tdsaAllShared->Ports[PhyID].portContext->id));
1259 /* updates PhyID belong to a port */
1260 onePortContext->PhyIDList[PhyID] = agTRUE;
1262 if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE &&
1263 SA_IDFRM_IS_SSP_TARGET(IDframe) )
1265 TI_DBG2(("ossaHwCB: NOTIFY_ENABLE_SPINUP PhyID %d \n", PhyID));
1267 for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
1269 saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
1274 tdsaUpdateMCN(dmRoot, onePortContext);
1277 onePortContext->SeenLinkUp = agTRUE;
1278 } /* else, old portcontext */
1282 #ifdef INITIATOR_DRIVER
1283 case OSSA_HW_EVENT_SATA_PHY_UP:
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;
1291 TI_DBG2(("ossaHwCB: Phy%d SATA link Up\n", PhyID));
1293 if (agDevHandle == agNULL)
1295 TI_DBG3(("ossaHwCB: agDevHandle null by design change\n"));
1298 if (RegD2H == agNULL)
1300 TI_DBG1(("ossaHwCB: RegD2H null, wrong\n"));
1301 smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "Y2");
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));
1314 /* debugging only */
1315 if (LinkRate == 0x01)
1317 TI_DBG1(("ossaHwCB: SATA Link Rate is 1.5 Gbps PhyID %d\n",PhyID));
1319 if (LinkRate == 0x02)
1321 TI_DBG1(("ossaHwCB: SATA Link Rate is 3.0 Gbps PhyID %d\n",PhyID));
1323 if (LinkRate == 0x04)
1325 TI_DBG1(("ossaHwCB: SATA Link Rate is 6.0 Gbps PhyID %d\n",PhyID));
1327 if (LinkRate == 0x08)
1329 TI_DBG1(("ossaHwCB: SATA Link Rate is 12.0 Gbps PhyID %d\n",PhyID));
1332 if (PortState == OSSA_PORT_INVALID)
1334 TI_DBG1(("ossaHwCB: Wrong port state with SATA link up\n"));
1335 smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "Y2");
1339 if ( agPortContext->osData == agNULL)
1341 TI_DBG6 (("ossaHwCB: PhyID %d tdsaAllShared %p\n", PhyID, tdsaAllShared));
1342 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1343 if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
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)
1352 TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
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;
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)
1381 onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
1383 else if (LinkRate == 0x02)
1385 onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
1387 else if (LinkRate == 0x04)
1389 onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
1391 else /* (LinkRate == 0x08) */
1393 onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
1396 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1397 TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
1398 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1402 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1403 TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
1404 smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "Y2");
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
1412 tdssAddSATAToSharedcontext(
1415 agDevHandle, /* agNULL */
1421 /* setting SAS PORT RESET TMO and SATA PORT RESET TMO*/
1422 saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RESET_TIME */
1426 AGSA_PORT_SET_PORT_RESET_TIME,
1428 SATA_PORT_RESET_TMO // 8000 ms
1435 an existing portcontext
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)
1444 /* port has been invalidated; needs to be allocated */
1445 TI_DBG2(("ossaHwCB: SATA allocating port context\n"));
1449 /* already alloacated */
1450 TI_DBG1(("ossaHwCB: Wrong!!! SATA already allocated port context\n"));
1451 smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "Y2");
1455 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1456 if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
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)
1465 TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
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;
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)
1494 onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
1496 else if (LinkRate == 0x02)
1498 onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
1500 else if (LinkRate == 0x04)
1502 onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
1504 else /* (LinkRate == 0x08) */
1506 onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
1509 tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1510 TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
1511 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1515 tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1516 TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
1517 smTraceFuncExit(hpDBG_VERY_LOUD, 'k', "Y2");
1524 tdssAddSATAToSharedcontext(
1527 agDevHandle, /* agNULL */
1539 case OSSA_HW_EVENT_SATA_SPINUP_HOLD:
1541 PhyID = TD_GET_PHY_ID(eventParm1);
1543 TI_DBG2(("ossaHwCB: spinup hold PhyID %d\n", PhyID));
1547 case OSSA_HW_EVENT_PHY_DOWN:
1549 bit32 AllPhyDown = agTRUE;
1552 PhyID = TD_GET_PHY_ID(eventParm1);
1553 LinkRate = TD_GET_LINK_RATE(eventParm1);
1554 PortState = TD_GET_PORT_STATE(eventParm1);
1557 TI_DBG2(("ossaHwCB: Phy%d link Down\n", PhyID));
1559 if (agPortContext == agNULL)
1561 TI_DBG1(("ossaHwCB: agPortContext null, wrong\n"));
1562 smTraceFuncExit(hpDBG_VERY_LOUD, 'l', "Y2");
1566 if ( agPortContext->osData == agNULL)
1568 /* PortContext must exit at this point */
1569 TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
1573 TI_DBG3(("ossaHwCB: NOT NULL portalcontext\n"));
1574 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
1575 if (onePortContext == agNULL)
1577 TI_DBG1(("ossaHwCB: wrong !!! No corressponding tdsaPortContext\n"));
1578 smTraceFuncExit(hpDBG_VERY_LOUD, 'm', "Y2");
1581 onePortContext->PhyIDList[PhyID] = agFALSE;
1582 for(i=0;i<TD_MAX_NUM_PHYS;i++)
1584 if (onePortContext->PhyIDList[i] == agTRUE)
1586 TI_DBG3(("ossaHwCB: Phy %d is still up\n", i));
1587 AllPhyDown = agFALSE;
1592 /* last phy belong to the portcontext */
1593 if (AllPhyDown == agTRUE)
1596 TI_DBG1(("ossaHwCB: calling tiPortLinkDown\n"));
1601 (void *)onePortContext->tiPortalContext
1606 if (PortState == OSSA_PORT_VALID)
1609 /* no ack for every phy down */
1611 /* update MCN for all devices belong to this port */
1612 tdsaUpdateMCN(dmRoot, onePortContext);
1615 else if (PortState == OSSA_PORT_LOSTCOMM)
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.
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;
1627 tdsaAllShared->eventSource[PhyID].Source.param = PhyID;
1629 onePortContext->eventPhyID = PhyID;
1631 onePortContext->valid = agFALSE;
1634 else if (PortState == OSSA_PORT_IN_RESET)
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;
1642 tdsaAllShared->eventSource[PhyID].Source.param = PhyID;
1644 onePortContext->eventPhyID = PhyID;
1646 onePortContext->valid = agFALSE;
1649 else if (PortState == OSSA_PORT_INVALID)
1651 TI_DBG1(("ossaHwCB: Last phy Down and port invalid OSSA_PORT_INVALID\n"));
1654 then, saHwEventAck() in ossaDeregisterDeviceHandleCB()
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;
1662 tdsaAllShared->eventSource[PhyID].Source.param = PhyID;
1664 onePortContext->eventPhyID = PhyID;
1666 onePortContext->valid = agFALSE;
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) */
1675 (void *)onePortContext->tiPortalContext
1679 #ifdef TARGET_DRIVER
1684 (void *)onePortContext->tiPortalContext
1689 #ifdef INITIATOR_DRIVER
1690 tdssReportRemovals(agRoot,
1695 #ifdef TARGET_DRIVER
1696 ttdssReportRemovals(agRoot,
1703 /* find a PhyID and reset for portContext in tdssSASShared */
1704 for(i=0;i<TD_MAX_NUM_PHYS;i++)
1706 if (onePortContext->PhyIDList[i] == agTRUE)
1708 tdsaAllShared->Ports[i].portContext = agNULL;
1711 /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
1712 ossaDeregisterDeviceHandleCB
1714 }/* OSSA_PORT_INVALID */
1717 /* other newly defined port state */
1719 TI_DBG2(("ossaHwCB: portstate 0x%x\n", PortState));
1724 case OSSA_HW_EVENT_PHY_START_STATUS:
1726 PhyID = TD_GET_PHY_ID(eventParm1);
1727 PhyStatus = TD_GET_PHY_STATUS(eventParm1);
1729 TI_DBG6(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS\n"));
1730 if (PhyStatus == 0x00)
1732 TI_DBG6(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, SUCCESS\n"));
1734 else if (PhyStatus == 0x01)
1736 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, INVALID_PHY\n"));
1738 else if (PhyStatus == 0x02)
1740 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, PHY_NOT_DISABLED\n"));
1744 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, OTHER_FAILURE %d\n", PhyStatus));
1748 case OSSA_HW_EVENT_PHY_STOP_STATUS:
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);
1755 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS\n"));
1756 if (PhyStatus == 0x00)
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)
1763 TI_DBG1(("ossaHwCB: onePortContext is null, wrong!!!\n"));
1766 onePortContext->PhyIDList[PhyID] = agFALSE;
1767 if (PortState == OSSA_PORT_INVALID) /* invalid port */
1769 TI_DBG1(("ossaHwCB: OSSA_PORT_INVALID\n"));
1770 tdsaAllShared->eventSource[PhyID].EventValid = NO_ACK;
1771 onePortContext->eventPhyID = PhyID;
1772 onePortContext->valid = agFALSE;
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) */
1781 (void *)onePortContext->tiPortalContext
1785 #ifdef TARGET_DRIVER
1790 (void *)onePortContext->tiPortalContext
1795 #ifdef INITIATOR_DRIVER
1796 tdssReportRemovals(agRoot,
1801 #ifdef TARGET_DRIVER
1802 ttdssReportRemovals(agRoot,
1809 /* find a PhyID and reset for portContext in tdssSASShared */
1810 for(i=0;i<TD_MAX_NUM_PHYS;i++)
1812 if (onePortContext->PhyIDList[i] == agTRUE)
1814 tdsaAllShared->Ports[i].portContext = agNULL;
1817 /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
1818 ossaDeregisterDeviceHandleCB
1820 } /* invalid port */
1822 else if (PhyStatus == 0x01)
1824 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, INVALID_PHY\n"));
1826 else if (PhyStatus == 0x02)
1828 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, DEVICES_ATTACHED\n"));
1830 else if (PhyStatus == 0x03)
1832 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, OTHER_FAILURE\n"));
1834 else if (PhyStatus == 0x04)
1836 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, PHY_NOT_DISABLED\n"));
1840 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, Unknown %d\n", PhyStatus));
1845 case OSSA_HW_EVENT_RESET_START:
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)
1851 tdsaAllShared->flags.resetInProgress = agTRUE;
1852 TI_DBG2(("ossaHwCB: RESET_START, SUCCESS\n"));
1854 else if (new_status == OSSA_FAILURE)
1856 TI_DBG1(("ossaHwCB: RESET_START, FAILURE\n"));
1860 TI_DBG1(("ossaHwCB: RESET_START, PENDING\n"));
1865 case OSSA_HW_EVENT_RESET_COMPLETE:
1867 bit32 new_status = TD_GET_RESET_STATUS(eventParm1);
1868 #ifdef SOFT_RESET_TEST
1869 DbgPrint("Reset Complete\n");
1871 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_RESET_COMPLETE, status %d\n", new_status));
1872 if (new_status == OSSA_SUCCESS)
1874 /* remove all portcontext and devices */
1875 #ifdef INITIATOR_DRIVER
1876 tdssRemoveSASSATAFromSharedcontextByReset(agRoot);
1878 tdsaAllShared->flags.resetInProgress = agFALSE;
1880 a callback notifying reset completion
1884 tiPortResetComplete,
1892 a callback notifying reset completion
1894 tdsaAllShared->flags.resetInProgress = agFALSE;
1897 tiPortResetComplete,
1906 case OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC:
1908 PhyID = TD_GET_PHY_ID(eventParm1);
1909 PortState = TD_GET_PORT_STATE(eventParm1);
1910 agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
1912 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC from PhyID %d; to be tested\n", PhyID));
1914 if (PortState == OSSA_PORT_INVALID)
1916 TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC\n"));
1917 smTraceFuncExit(hpDBG_VERY_LOUD, 'n', "Y2");
1921 if (agPhyErrCountersPage != agNULL)
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 ));
1934 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC: Error!!! eventParm2 is NULL\n"));
1937 /* saHwEventAck() */
1938 eventSource.agPortContext = agPortContext;
1939 eventSource.event = OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC;
1941 eventSource.param = PhyID;
1942 HwAckSatus = saHwEventAck(
1944 agNULL, /* agContext */
1946 &eventSource, /* agsaEventSource_t */
1950 if ( HwAckSatus != AGSA_RC_SUCCESS)
1952 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
1953 smTraceFuncExit(hpDBG_VERY_LOUD, 'o', "Y2");
1959 case OSSA_HW_EVENT_PORT_INVALID:
1961 TI_DBG1(("ossaHwCB: PORT_INVALID\n"));
1963 if ( agPortContext == agNULL)
1965 TI_DBG1(("ossaHwCB: agPortContext is NULL, wrong.\n"));
1966 smTraceFuncExit(hpDBG_VERY_LOUD, 'p', "Y2");
1969 if ( agPortContext->osData != agNULL)
1971 TI_DBG1(("ossaHwCB: NOT NULL osDATA\n"));
1973 put the old portcontext back to free list
1975 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
1976 TI_DBG1(("ossaHwCB: pid %d\n", onePortContext->id));
1978 #ifdef INITIATOR_DRIVER
1979 /* notifying link down (all links belonging to a port are down) */
1984 (void *)onePortContext->tiPortalContext
1987 #endif /* INITIATOR_DRIVER */
1988 #ifdef TARGET_DRIVER
1993 (void *)onePortContext->tiPortalContext
1996 #endif /*TARGET_DRIVER */
1998 /* find the device belonging to the port and remove it from the device list */
1999 //tdssRemoveSASSATAFromSharedcontext(agRoot, tdsaDeviceData, onePortContext);
2002 #ifdef INITIATOR_DRIVER
2003 /* reset the fields of portcontext */
2004 onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
2005 tdssReportRemovals(agRoot,
2010 onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
2011 onePortContext->DiscoveryRdyGiven = agFALSE;
2012 onePortContext->SeenLinkUp = agFALSE;
2014 #endif /* INITIATOR_DRIVER */
2020 /* find a PhyID and reset for portContext in tdssSASShared */
2021 for(i=0;i<TD_MAX_NUM_PHYS;i++)
2023 if (onePortContext->PhyIDList[i] == agTRUE)
2025 tdsaAllShared->Ports[i].portContext = agNULL;
2029 /* reset PhyIDList in portcontext */
2030 for(i=0;i<TD_MAX_NUM_PHYS;i++)
2032 onePortContext->PhyIDList[i] = agFALSE;
2035 // onePortContext->tiPortalContext = agNULL;
2036 // onePortContext->agRoot = agNULL;
2037 onePortContext->agPortContext = agNULL;
2038 onePortContext->valid = agFALSE;
2040 TI_DBG4(("ossaHwCB: pid %d count %d\n", onePortContext->id, onePortContext->Count));
2042 /* resets the number of devices in onePortContext */
2043 onePortContext->Count = 0;
2044 onePortContext->discovery.pendingSMP = 0;
2045 onePortContext->discovery.SeenBC = agFALSE;
2049 put all devices belonging to the onePortContext
2050 back to the free link
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);
2060 TI_DBG1(("ossaHwCB: NULL osDATA: wrong\n"));
2062 TI_DBG6(("ossaHwCB: PORT_INVALID end\n"));
2065 #endif /* REMOVED */
2067 case OSSA_HW_EVENT_BROADCAST_CHANGE:
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));
2073 if (PortState == OSSA_PORT_INVALID)
2075 TI_DBG1(("ossaHwCB: Wrong port state with BROADCAST_CHANGE\n"));
2076 smTraceFuncExit(hpDBG_VERY_LOUD, 'q', "Y2");
2079 /* saHwEventAck() */
2080 eventSource.agPortContext = agPortContext;
2081 eventSource.event = OSSA_HW_EVENT_BROADCAST_CHANGE;
2083 eventSource.param = PhyID;
2084 HwAckSatus = saHwEventAck(
2086 agNULL, /* agContext */
2088 &eventSource, /* agsaEventSource_t */
2092 TI_DBG4(("ossaHwCB: calling saHwEventAck\n"));
2094 if ( HwAckSatus != AGSA_RC_SUCCESS)
2096 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
2097 smTraceFuncExit(hpDBG_VERY_LOUD, 'r', "Y2");
2100 if (tIsSPC12SATA(agRoot))
2102 TI_DBG1(("ossaHwCB: BROADCAST_CHANGE received for SATA Controller\n"));
2106 * incremental discovery is to be tested and debugged further
2109 /* just for testing discovery abort */
2111 if (agPortContext == agNULL)
2113 /* this case happens when broadcase is received first before the link up */
2114 TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
2116 else if ( agPortContext->osData != agNULL)
2118 dmRoot = &(tdsaAllShared->dmRoot);
2119 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2120 dmPortContext = &(onePortContext->dmPortContext);
2122 dmQueryDiscovery(dmRoot, dmPortContext);
2123 // dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_ABORT);
2126 if (onePortContext->DMDiscoveryState == dmDiscInProgress)
2128 dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_ABORT);
2132 TI_DBG2(("ossaHwCB: portcontext pid %d\n", onePortContext->id));
2133 if (onePortContext->DMDiscoveryState == dmDiscCompleted ||
2134 onePortContext->DMDiscoveryState == dmDiscAborted ||
2135 onePortContext->DMDiscoveryState == dmDiscAbortInvalid )
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);
2144 TI_DBG2(("ossaHwCB: pid %d BROADCAST_CHANGE; updating SeenBC. calling dmNotifyBC\n", onePortContext->id));
2145 dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2150 TI_DBG1(("ossaHwCB: BROADCAST_CHANGE NULL osDATA wrong !!! \n"));
2154 #endif /* FDS_DM_NO */
2157 if (agPortContext == agNULL)
2159 /* this case happens when broadcase is received first before the link up */
2160 TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
2162 else if ( agPortContext->osData != agNULL)
2164 dmRoot = &(tdsaAllShared->dmRoot);
2165 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2166 dmPortContext = &(onePortContext->dmPortContext);
2168 dmQueryDiscovery(dmRoot, dmPortContext);
2170 TI_DBG2(("ossaHwCB: portcontext pid %d\n", onePortContext->id));
2171 if (onePortContext->DMDiscoveryState == dmDiscCompleted ||
2172 onePortContext->DMDiscoveryState == dmDiscAborted ||
2173 onePortContext->DMDiscoveryState == dmDiscAbortInvalid )
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);
2181 else if (onePortContext->DMDiscoveryState == dmDiscFailed )
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);
2189 TI_DBG2(("ossaHwCB: pid %d BROADCAST_CHANGE; updating SeenBC. calling dmNotifyBC\n", onePortContext->id));
2190 dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2195 TI_DBG1(("ossaHwCB: BROADCAST_CHANGE NULL osDATA wrong !!! \n"));
2199 #ifdef FDS_DM_WORKED
2200 if (agPortContext == agNULL)
2202 /* this case happens when broadcase is received first before the link up */
2203 TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
2205 else if ( agPortContext->osData != agNULL)
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);
2213 #endif /* FDS_DM_WORKED */
2216 #ifdef INITIATOR_DRIVER
2217 if (agPortContext == agNULL)
2219 /* this case happens when broadcase is received first before the link up */
2220 TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
2222 else if ( agPortContext->osData != agNULL)
2224 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2225 TI_DBG2(("ossaHwCB: portcontext pid %d\n", onePortContext->id));
2226 if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
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;
2234 if (tdsaAllShared->ResetInDiscovery != 0 &&
2235 onePortContext->discovery.ResetTriggerred == agTRUE)
2237 TI_DBG2(("ossaHwCB: tdsaBCTimer\n"));
2238 tdsaBCTimer(tiRoot, onePortContext);
2245 TDSA_DISCOVERY_TYPE_SAS,
2246 TDSA_DISCOVERY_OPTION_INCREMENTAL_START
2252 AG_SA_DISCOVERY_TYPE_SAS,
2253 onePortContext->discoveryOptions);
2258 TI_DBG2(("ossaHwCB: pid %d BROADCAST_CHANGE; updating SeenBC. Do nothing.\n", onePortContext->id));
2259 onePortContext->discovery.SeenBC = agTRUE;
2264 TI_DBG1(("ossaHwCB: BROADCAST_CHANGE NULL osDATA wrong !!! \n"));
2267 #endif /* ifndef FDS_DM */
2272 case OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO:
2274 PhyID = TD_GET_PHY_ID(eventParm1);
2275 PortState = TD_GET_PORT_STATE(eventParm1);
2278 1. tear town the portcontext just like link down last phy down
2280 port state must be invalid
2283 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO\n"));
2285 if (PortState == OSSA_PORT_VALID)
2287 TI_DBG1(("ossaHwCB: Wrong port state\n"));
2288 smTraceFuncExit(hpDBG_VERY_LOUD, 's', "Y2");
2292 TD_ASSERT(agPortContext, "agPortContext");
2293 if ( agPortContext->osData == agNULL)
2295 /* PortContext must exit at this point */
2296 TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
2300 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2301 onePortContext->valid = agFALSE;
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) */
2310 (void *)onePortContext->tiPortalContext
2314 #ifdef TARGET_DRIVER
2319 (void *)onePortContext->tiPortalContext
2324 #ifdef INITIATOR_DRIVER
2325 tdssReportRemovals(agRoot,
2330 #ifdef TARGET_DRIVER
2331 ttdssReportRemovals(agRoot,
2337 /* find a PhyID and reset for portContext in tdssSASShared */
2338 for(i=0;i<TD_MAX_NUM_PHYS;i++)
2340 if (onePortContext->PhyIDList[i] == agTRUE)
2342 tdsaAllShared->Ports[i].portContext = agNULL;
2345 /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
2346 ossaDeregisterDeviceHandleCB
2353 case OSSA_HW_EVENT_PORT_RESET_TIMER_TMO:
2358 PhyID = TD_GET_PHY_ID(eventParm1);
2359 PortState = TD_GET_PORT_STATE(eventParm1);
2361 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RESET_TIMER_TMO\n"));
2363 if (PortState == OSSA_PORT_VALID)
2365 TI_DBG1(("ossaHwCB: Wrong port state\n"));
2366 smTraceFuncExit(hpDBG_VERY_LOUD, 't', "Y2");
2370 if (agPortContext == agNULL)
2372 TI_DBG1(("ossaHwCB: agPortContext is NULL, error\n"));
2373 smTraceFuncExit(hpDBG_VERY_LOUD, 'u', "Y2");
2377 if ( agPortContext->osData == agNULL)
2379 /* PortContext must exit at this point */
2380 TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
2384 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2385 onePortContext->valid = agFALSE;
2387 TI_DBG1(("ossaHwCB: pid %d tiPortStopped\n", onePortContext->id));
2389 #ifdef INITIATOR_DRIVER
2390 /* notifying link down (all links belonging to a port are down) */
2395 (void *)onePortContext->tiPortalContext
2399 #ifdef TARGET_DRIVER
2404 (void *)onePortContext->tiPortalContext
2409 #ifdef INITIATOR_DRIVER
2410 tdssReportRemovals(agRoot,
2415 #ifdef TARGET_DRIVER
2416 ttdssReportRemovals(agRoot,
2422 /* find a PhyID and reset for portContext in tdssSASShared */
2423 for(i=0;i<TD_MAX_NUM_PHYS;i++)
2425 if (onePortContext->PhyIDList[i] == agTRUE)
2427 tdsaAllShared->Ports[i].portContext = agNULL;
2430 /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
2431 ossaDeregisterDeviceHandleCB
2438 case OSSA_HW_EVENT_PORT_RESET_COMPLETE:
2440 #ifdef INITIATOR_DRIVER
2441 tiIORequest_t *currentTaskTag = agNULL;
2445 smRoot_t *smRoot = &(tdsaAllShared->smRoot);
2448 PhyID = TD_GET_PHY_ID(eventParm1);
2449 PortState = TD_GET_PORT_STATE(eventParm1);
2450 IDframe = (agsaSASIdentify_t *)eventParm3;
2452 /* completes for Lun Reset and Target reset for directly attached SATA */
2453 /* completes for Target reset for directly attached SAS */
2455 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PORT_RESET_COMPLETE, phyID %d\n", PhyID));
2458 if (PortState == OSSA_PORT_INVALID)
2460 TI_DBG1(("ossaHwCB: Wrong port state\n"));
2461 smTraceFuncExit(hpDBG_VERY_LOUD, 'v', "Y2");
2465 if (agPortContext == agNULL)
2467 TI_DBG1(("ossaHwCB: agPortContext null, wrong\n"));
2468 smTraceFuncExit(hpDBG_VERY_LOUD, 'w', "Y2");
2471 if ( agPortContext->osData == agNULL)
2473 TI_DBG1(("ossaHwCB: agPortContext->osData null, wrong\n"));
2474 smTraceFuncExit(hpDBG_VERY_LOUD, 'x', "Y2");
2478 /* find a corresponding portcontext */
2479 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2481 if (onePortContext == agNULL)
2483 TI_DBG1(("ossaHwCB: oneportContext is NULL; wrong??????\n"));
2487 TI_DBG1(("ossaHwCB: oneportContext %p pid %d\n", onePortContext, onePortContext->id));
2488 onePortContext->valid = agTRUE;
2489 #ifdef INITIATOR_DRIVER
2491 if (tdsaAllShared->ResetInDiscovery != 0)
2493 DeviceListList = tdsaAllShared->MainDeviceList.flink;
2494 while (DeviceListList != &(tdsaAllShared->MainDeviceList))
2496 oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
2497 if (oneDeviceData->tdPortContext != onePortContext)
2499 DeviceListList = DeviceListList->flink;
2507 if (found == agTRUE)
2509 /* applied to only SATA devices */
2510 if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
2513 tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
2515 tdssRetrySATAID(tiRoot, oneDeviceData);
2521 TI_DBG1(("ossaHwCB: no onedevicedata found!\n"));
2526 DeviceListList = tdsaAllShared->MainDeviceList.flink;
2527 while (DeviceListList != &(tdsaAllShared->MainDeviceList))
2529 oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
2530 if ( oneDeviceData == agNULL)
2532 TI_DBG1(("ossaHwCB: oneDeviceData is NULL!!!\n"));
2536 if ( (oneDeviceData->tdPortContext == onePortContext) &&
2537 (oneDeviceData->directlyAttached == agTRUE) &&
2538 (oneDeviceData->phyID == PhyID) )
2540 TI_DBG1(("ossaHwCB: found the onePortContext and oneDeviceData!!\n"));
2542 currentTaskTag = (tiIORequest_t *)oneDeviceData->agDeviceResetContext.osData;
2543 if (currentTaskTag != agNULL )
2545 /* applied to only SATA devices */
2546 if (DEVICE_IS_SATA_DEVICE(oneDeviceData))
2548 tdIORequestBody_t *SMTMtdIORequestBody = agNULL;
2549 SMTMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData;
2550 if (SMTMtdIORequestBody != agNULL)
2552 /* free the SMTMtdIORequestBody memory allocated in tiINITaskManagement function */
2555 SMTMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
2556 sizeof(tdIORequestBody_t)
2561 TI_DBG1(("ossaHwCB: SATA device but SMTMtdIORequestBody is NULL!!!\n"));
2564 /* set device state to DS_OPERATIONAL */
2565 saSetDeviceState(agRoot,
2567 tdsaRotateQnumber(tiRoot, oneDeviceData),
2568 oneDeviceData->agDevHandle,
2571 /* notify OS layer to complete the TMF IO */
2572 ostiInitiatorEvent(tiRoot,
2575 tiIntrEventTypeTaskManagement,
2583 TI_DBG1(("ossaHwCB: currentTaskTag is NULL!!!\n"));
2590 DeviceListList = DeviceListList->flink;
2597 case OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT:
2599 PhyID = TD_GET_PHY_ID(eventParm1);
2600 PortState = TD_GET_PORT_STATE(eventParm1);
2602 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT\n"));
2603 if (tIsSPC12SATA(agRoot))
2605 TI_DBG1(("ossaHwCB: BROADCAST_ASYNCH_EVENT received for SATA Controller\n"));
2608 if (agPortContext == agNULL)
2610 TI_DBG1(("ossaHwCB: Error!!! agPortContext is NULL %d\n", PhyID));
2611 smTraceFuncExit(hpDBG_VERY_LOUD, 'y', "Y2");
2614 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2615 if (onePortContext == agNULL)
2617 TI_DBG1(("ossaHwCB: Error!!! onePortContext is NULL %d\n", PhyID));
2618 smTraceFuncExit(hpDBG_VERY_LOUD, 'z', "Y2");
2622 if (onePortContext->tiPortalContext != agNULL)
2627 onePortContext->tiPortalContext,
2629 tiIntrEventTypeDeviceChange,
2630 OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT,
2637 TI_DBG1(("ossaHwCB: Error!!! onePortContext->tiPortalContext is NULL\n"));
2638 smTraceFuncExit(hpDBG_VERY_LOUD, 'A', "Y2");
2645 case OSSA_HW_EVENT_PORT_RECOVER:
2648 PhyID = TD_GET_PHY_ID(eventParm1);
2649 if (agPortContext == agNULL)
2651 TI_DBG1(("ossaHwCB: Error!!! agPortContext is NULL %d\n", PhyID));
2652 smTraceFuncExit(hpDBG_VERY_LOUD, 'B', "Y2");
2656 LinkRate = TD_GET_LINK_RATE(eventParm1);
2657 PortState = TD_GET_PORT_STATE(eventParm1);
2658 agDevHandle = agNULL;
2659 IDframe = (agsaSASIdentify_t *)eventParm3;
2662 1. this is like link up
2664 3. no trigger discovery (broadcast change will do this later)
2665 port state must be valid
2668 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVER, phyID %d\n", PhyID));
2670 if (PortState == OSSA_PORT_INVALID)
2672 TI_DBG1(("ossaHwCB: Wrong port state\n"));
2673 smTraceFuncExit(hpDBG_VERY_LOUD, 'C', "Y2");
2676 if ( agPortContext->osData == agNULL)
2678 /* PortContext must exit at this point */
2679 TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
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)
2692 onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
2694 else if (LinkRate == 0x02)
2696 onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
2698 else if (LinkRate == 0x04)
2700 onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
2702 else /* (LinkRate == 0x08) */
2704 onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
2707 if (SA_IDFRM_GET_DEVICETTYPE(&onePortContext->sasIDframe) == SAS_END_DEVICE &&
2708 SA_IDFRM_IS_SSP_TARGET(&onePortContext->sasIDframe) )
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++)
2713 saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
2717 /* transient period between link up and link down/port recovery */
2718 if (onePortContext->Transient == agTRUE && onePortContext->RegisteredDevNums == 0)
2720 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVER transient period"));
2721 if (SA_IDFRM_GET_DEVICETTYPE(IDframe) != SAS_NO_DEVICE)
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(
2731 agDevHandle, /* agNULL */
2735 TD_OPERATION_INITIATOR
2739 onePortContext->Transient = agFALSE;
2749 case OSSA_HW_EVENT_BROADCAST_SES:
2751 PhyID = TD_GET_PHY_ID(eventParm1);
2752 PortState = TD_GET_PORT_STATE(eventParm1);
2754 TI_DBG2(("ossaHwCB: BROADCAST_SES from PhyID %d; to be tested\n", PhyID));
2755 if (tIsSPC12SATA(agRoot))
2757 TI_DBG1(("ossaHwCB: BROADCAST_SES received for SATA Controller\n"));
2760 if (PortState == OSSA_PORT_INVALID)
2762 TI_DBG1(("ossaHwCB: Wrong port state with BROADCAST_SES\n"));
2763 smTraceFuncExit(hpDBG_VERY_LOUD, 'D', "Y2");
2768 let os layer read payload
2772 case OSSA_HW_EVENT_BROADCAST_EXP:
2774 PhyID = TD_GET_PHY_ID(eventParm1);
2775 PortState = TD_GET_PORT_STATE(eventParm1);
2777 TI_DBG2(("ossaHwCB: BROADCAST_EXP from PhyID %d; to be tested\n", PhyID));
2778 if (tIsSPC12SATA(agRoot))
2780 TI_DBG1(("ossaHwCB: BROADCAST_EXP received for SATA Controller\n"));
2784 if (PortState == OSSA_PORT_INVALID)
2786 TI_DBG1(("ossaHwCB: Wrong port state with BROADCAST_EXP\n"));
2787 smTraceFuncExit(hpDBG_VERY_LOUD, 'E', "Y2");
2791 let os layer read payload
2796 case OSSA_HW_EVENT_HARD_RESET_RECEIVED:
2798 PhyID = TD_GET_PHY_ID(eventParm1);
2799 PortState = TD_GET_PORT_STATE(eventParm1);
2801 TI_DBG2(("ossaHwCB: HARD_RESET_RECEIVED from PhyID %d\n", PhyID));
2803 if (PortState == OSSA_PORT_VALID && tiIS_SPC(agRoot))
2805 TI_DBG1(("ossaHwCB: calling saPortControl and OSSA_PORT_VALID\n"));
2806 saPortControl(agRoot, agNULL, 0, agPortContext, AGSA_PORT_HARD_RESET, 0,0);
2808 else if (PortState == OSSA_PORT_3RDPARTY_RESET && (tIsSPCV12or6G(agRoot)) )
2810 TI_DBG1(("ossaHwCB: calling saPortControl and OSSA_PORT_3RDPARTY_RESET\n"));
2811 saPortControl(agRoot, agNULL, 0, agPortContext, AGSA_PORT_HARD_RESET, 0,0);
2813 else /* PortState == OSSA_PORT_INVALID */
2815 TI_DBG1(("ossaHwCB: Error. Port state is invalid\n"));
2817 TI_DBG1(("ossaHwCB: calling saLocalPhyControl on phyID %d\n", PhyID));
2818 saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_LINK_RESET, agNULL);
2825 case OSSA_HW_EVENT_MALFUNCTION:
2827 #ifdef TD_DEBUG_ENABLE
2828 agsaFatalErrorInfo_t *FatalError = (agsaFatalErrorInfo_t *)eventParm2;
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));
2837 if (eventParm1 == agTRUE)
2839 TI_DBG1(("ossaHwCB: fatal error\n"));
2850 TI_DBG1(("ossaHwCB: non-fatal error \n"));
2855 case OSSA_HW_EVENT_ID_FRAME_TIMEOUT:
2857 PhyID = TD_GET_PHY_ID(eventParm1);
2858 PortState = TD_GET_PORT_STATE(eventParm1);
2860 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_ID_FRAME_TIMEOUT from PhyID %d\n", PhyID));
2862 if (PortState == OSSA_PORT_INVALID)
2864 TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_ID_FRAME_TIMEOUT\n"));
2865 smTraceFuncExit(hpDBG_VERY_LOUD, 'F', "Y2");
2871 case OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD:
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"));
2878 if (PortState == OSSA_PORT_INVALID)
2880 TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD\n"));
2881 smTraceFuncExit(hpDBG_VERY_LOUD, 'G', "Y2");
2885 if (agPhyErrCountersPage != agNULL)
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));
2892 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD: Error!!! eventParm2 is NULL\n"));
2895 /* saHwEventAck() */
2896 eventSource.agPortContext = agPortContext;
2897 eventSource.event = OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD;
2899 eventSource.param = PhyID;
2900 HwAckSatus = saHwEventAck(
2902 agNULL, /* agContext */
2904 &eventSource, /* agsaEventSource_t */
2908 if ( HwAckSatus != AGSA_RC_SUCCESS)
2910 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
2911 smTraceFuncExit(hpDBG_VERY_LOUD, 'H', "Y2");
2918 case OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR:
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"));
2925 if (PortState == OSSA_PORT_INVALID)
2927 TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR\n"));
2928 smTraceFuncExit(hpDBG_VERY_LOUD, 'I', "Y2");
2932 if (agPhyErrCountersPage != agNULL)
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));
2939 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR: Error!!! eventParm2 is NULL\n"));
2942 /* saHwEventAck() */
2943 eventSource.agPortContext = agPortContext;
2944 eventSource.event = OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR;
2946 eventSource.param = PhyID;
2947 HwAckSatus = saHwEventAck(
2949 agNULL, /* agContext */
2951 &eventSource, /* agsaEventSource_t */
2955 if ( HwAckSatus != AGSA_RC_SUCCESS)
2957 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
2958 smTraceFuncExit(hpDBG_VERY_LOUD, 'J', "Y2");
2965 case OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION:
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"));
2972 if (PortState == OSSA_PORT_INVALID)
2974 TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION\n"));
2975 smTraceFuncExit(hpDBG_VERY_LOUD, 'K', "Y2");
2979 if (agPhyErrCountersPage != agNULL)
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));
2986 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION: Error!!! eventParm2 is NULL\n"));
2989 /* saHwEventAck() */
2990 eventSource.agPortContext = agPortContext;
2991 eventSource.event = OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION;
2993 eventSource.param = PhyID;
2994 HwAckSatus = saHwEventAck(
2996 agNULL, /* agContext */
2998 &eventSource, /* agsaEventSource_t */
3002 if ( HwAckSatus != AGSA_RC_SUCCESS)
3004 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
3005 smTraceFuncExit(hpDBG_VERY_LOUD, 'L', "Y2");
3013 case OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION1:
3015 PhyID = eventParm1 & 0xFF;
3016 agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
3018 if (agPhyErrCountersPage != agNULL)
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));
3030 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION1: Error!!! eventParm2 is NULL\n"));
3034 #endif /* REMOVED */
3036 case OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH:
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"));
3043 if (PortState == OSSA_PORT_INVALID)
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");
3050 if (agPhyErrCountersPage != agNULL)
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));
3057 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH: Error!!! eventParm2 is NULL\n"));
3060 /* saHwEventAck() */
3061 eventSource.agPortContext = agPortContext;
3062 eventSource.event = OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH;
3064 eventSource.param = PhyID;
3065 HwAckSatus = saHwEventAck(
3067 agNULL, /* agContext */
3069 &eventSource, /* agsaEventSource_t */
3073 if ( HwAckSatus != AGSA_RC_SUCCESS)
3075 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
3076 smTraceFuncExit(hpDBG_VERY_LOUD, 'N', "Y2");
3083 case OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED:
3085 PhyID = TD_GET_PHY_ID(eventParm1);
3086 PortState = TD_GET_PORT_STATE(eventParm1);
3087 agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
3089 TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED\n"));
3091 if (PortState == OSSA_PORT_INVALID)
3093 TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED\n"));
3094 smTraceFuncExit(hpDBG_VERY_LOUD, 'O', "Y2");
3098 if (agPhyErrCountersPage != agNULL)
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));
3105 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED: Error!!! eventParm2 is NULL\n"));
3108 /* saHwEventAck() */
3109 eventSource.agPortContext = agPortContext;
3110 eventSource.event = OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED;
3112 eventSource.param = PhyID;
3113 HwAckSatus = saHwEventAck(
3115 agNULL, /* agContext */
3117 &eventSource, /* agsaEventSource_t */
3121 if ( HwAckSatus != AGSA_RC_SUCCESS)
3123 TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
3124 smTraceFuncExit(hpDBG_VERY_LOUD, 'P', "Y2");
3131 // #ifdef INITIATOR_DRIVER
3132 case OSSA_HW_EVENT_ENCRYPTION:
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));
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.
3144 if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE)
3146 TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE\n"));
3147 encryptEventData.encryptEvent = tiEncryptKekStore;
3149 else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE)
3151 TI_DBG1(("ossaHwCB:OSSA_HW_ENCRYPT_KEK_UPDATE \n"));
3152 encryptEventData.encryptEvent = tiEncryptKekAdd;
3154 else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_INVALIDTE)
3156 TI_DBG1(("ossaHwCB:OSSA_HW_ENCRYPT_KEK_INVALIDTE \n"));
3159 else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_DEK_UPDATE)
3161 TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_DEK_UPDATE\n"));
3162 encryptEventData.encryptEvent = tiEncryptDekAdd;
3164 else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_DEK_INVALIDTE)
3166 TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_DEK_INVALIDTE\n"));
3167 encryptEventData.encryptEvent = tiEncryptDekInvalidate;
3169 else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT)
3171 TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT\n"));
3172 encryptEventData.encryptEvent = tiEncryptOperatorManagement;
3174 else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_TEST_EXECUTE)
3176 TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_TEST_EXECUTE\n"));
3177 encryptEventData.encryptEvent = tiEncryptSelfTest;
3178 encryptEventData.subEvent = pEncryptCBData->eq;
3182 TI_DBG1(("ossaHwCB: unknown encryptOperation 0x%x\n",pEncryptCBData->encryptOperation));
3185 if (pEncryptCBData->status != OSSA_SUCCESS)
3187 encryptStatus = tiError;
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));
3194 encryptStatus = tiSuccess;
3197 if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE ||
3198 pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE )
3200 /* returning new KEK index */
3201 encryptEventData.pData = pEncryptCBData->handle;
3205 /* returning current KEK index or DEK index */
3206 encryptEventData.pData = pEncryptCBData->param;
3209 ostiPortEvent(tiRoot,
3215 case OSSA_HW_EVENT_SECURITY_MODE:
3217 securitySetModeStatus = eventParm1;
3218 pEncryptInfo = (agsaEncryptInfo_t *) eventParm2;
3220 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_SECURITY_MODE\n"));
3221 if (securitySetModeStatus == OSSA_SUCCESS)
3223 securityModeStatus = tiSuccess;
3227 securityModeStatus = tiError;
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)
3236 encryptEventData.subEvent = tiNVRAMSuccess;
3238 else if (pEncryptInfo->status == 0x24)
3240 encryptEventData.subEvent = tiNVRAMNotFound;
3242 else if (pEncryptInfo->status == 0x05 || pEncryptInfo->status == 0x20 || pEncryptInfo->status == 0x21)
3244 encryptEventData.subEvent = tiNVRAMAccessTimeout;
3248 encryptEventData.subEvent = tiNVRAMWriteFail;
3251 encryptEventData.pData = agNULL;
3252 ostiPortEvent(tiRoot,
3259 case OSSA_HW_EVENT_MODE:
3261 pModeEvent = (agsaHWEventMode_t *) eventParm2;
3262 pModePage = (bit32 *) pModeEvent->modePage;
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));
3267 if (pModeEvent->modePageOperation == agsaModePageSet)
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,
3275 else if (pModeEvent->modePageOperation == agsaModePageGet)
3277 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_MODE error qualifier 0x%x\n", eventParm1));
3278 switch ((*pModePage) & 0xFF)
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,
3285 pModeEvent->modePageLen,
3286 pModeEvent->modePage,
3287 pModeEvent->context));
3288 ostiPortEvent(tiRoot,
3289 tiModePageOperation,
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,
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,
3307 case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:
3308 TI_DBG1(("ossaHwCB: AGSA_ENCRYPTION_CONTROL_PARM_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3310 * This page is directly related to tiCOMEncryptGetInfo() and
3311 * will be translated into a tiEncrytOperation for the OS layer.
3314 /* Fill out tiEncryptInfo_t */
3315 securityMode = *pModePage & 0x0F00 >> 8;
3316 cipherMode = *pModePage & 0xF000 >> 12;
3318 if (securityMode == agsaEncryptSMA)
3320 encryptInfo.securityCipherMode = TI_ENCRYPT_SEC_MODE_A;
3322 else if (securityMode == agsaEncryptSMB)
3324 encryptInfo.securityCipherMode = TI_ENCRYPT_SEC_MODE_B;
3328 encryptInfo.securityCipherMode = TI_ENCRYPT_SEC_MODE_FACT_INIT;
3331 if (cipherMode == agsaEncryptCipherModeECB)
3333 encryptInfo.securityCipherMode |= TI_ENCRYPT_ATTRIB_CIPHER_ECB;
3336 if (cipherMode == agsaEncryptCipherModeXTS)
3338 encryptInfo.securityCipherMode |= TI_ENCRYPT_ATTRIB_CIPHER_XTS;
3341 /* How will subEvents be tracked? */
3342 encryptInfo.status = 0;
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;
3351 encryptEventData.encryptEvent = tiEncryptGetInfo;
3352 encryptEventData.subEvent = 0;
3353 encryptEventData.pData = &encryptInfo;
3355 ostiPortEvent(tiRoot,
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));
3363 #ifdef IOCTL_INTERRUPT_TIME_CONFIG
3364 ostiPortEvent(tiRoot,
3365 tiModePageOperation,
3369 #endif /* IOCTL_INTERRUPT_TIME_CONFIG */
3371 /*ostiPortEvent(tiRoot,
3372 tiModePageOperation,
3374 &encryptEventData);*/
3376 case AGSA_INTERRUPT_CONFIGURATION_PAGE:
3377 TI_DBG1(("ossaHwCB: AGSA_INTERRUPT_CONFIGURATION_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3379 #ifdef IOCTL_INTERRUPT_TIME_CONFIG
3380 ostiPortEvent(tiRoot,
3381 tiModePageOperation,
3385 #endif /* IOCTL_INTERRUPT_TIME_CONFIG */
3389 TI_DBG1(("ossaHwCB: Unknown Mode Event %x\n", *pModePage));
3396 TI_DBG1(("ossaHwCB: Unknown modePageOperation %x\n", pModeEvent->modePageOperation));
3401 // #endif /* INITIATOR_DRIVER */
3404 case OSSA_HW_EVENT_PHY_UNRECOVERABLE_ERROR:
3406 PhyID = TD_GET_PHY_ID(eventParm1);
3407 PortState = TD_GET_PORT_STATE(eventParm1);
3409 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_UNRECOVERABLE_ERROR\n"));
3411 if (PortState == OSSA_PORT_INVALID)
3413 TI_DBG1(("ossaHwCB: INVALID port state\n"));
3417 TI_DBG1(("ossaHwCB: VALID port state\n"));
3421 #endif /* REMOVED */
3422 case OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED:
3424 TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED\n"));
3430 TI_DBG1(("ossaHwCB: default error (0x%X)!!!!!\n",event));
3435 smTraceFuncExit(hpDBG_VERY_LOUD, 'R', "Y2");
3439 osGLOBAL void ossaPortControlCB(
3441 agsaContext_t *agContext,
3442 agsaPortContext_t *agPortContext,
3443 bit32 portOperation,
3446 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3447 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3448 tdsaPortContext_t *onePortContext = agNULL;
3450 TI_DBG6(("ossaPortControlCB: start\n"));
3452 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y3");
3453 if (portOperation == AGSA_PORT_SET_SMP_PHY_WIDTH)
3455 TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_SET_SMP_PHY_WIDTH\n"));
3457 else if (portOperation == AGSA_PORT_SET_PORT_RECOVERY_TIME)
3459 TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_SET_PORT_RECOVERY_TIME\n"));
3461 else if (portOperation == AGSA_PORT_IO_ABORT)
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.
3467 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
3468 if (onePortContext == agNULL)
3470 TI_DBG1(("ossaPortControlCB: onePortContext is NULL\n"));
3473 /* qqqqq deregister all devices */
3474 tdsaDeregisterDevicesInPort(tiRoot, onePortContext);
3477 else if (portOperation == AGSA_PORT_SET_PORT_RESET_TIME)
3479 TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_SET_PORT_RESET_TIME\n"));
3481 else if (portOperation == AGSA_PORT_HARD_RESET)
3483 TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_HARD_RESET\n"));
3485 else if (portOperation == AGSA_PORT_CLEAN_UP)
3487 TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_CLEAN_UP\n"));
3489 else if (portOperation == AGSA_STOP_PORT_RECOVERY_TIMER)
3491 TI_DBG1(("ossaPortControlCB: portOperation AGSA_STOP_PORT_RECOVERY_TIMER\n"));
3495 TI_DBG1(("ossaPortControlCB: undefined portOperation %d\n", portOperation));
3498 TI_DBG1(("ossaPortControlCB: status %d\n", status));
3500 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y3");
3504 /*****************************************************************************
3505 *! \brief ossaHwRegRead
3507 * Purpose: This routine is called to read a 32-bit value from the PCI
3508 * registers of the controller
3510 * \param agRoot: Pointer to chip/driver Instance.
3511 * \param regOffset: Byte offset to chip register from which to read a 32-bit
3514 * \return: 32-bit value.
3516 * \note - The scope is shared target and initiator.
3518 *****************************************************************************/
3521 ossaHwRegRead(agsaRoot_t *agRoot,
3525 tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3529 return_value = ostiChipReadBit32 (
3533 if( agNULL != agRoot->sdkData )
3535 smTrace(hpDBG_REGISTERS,"RR",regOffset);
3536 /* TP:RR regOffset */
3537 smTrace(hpDBG_REGISTERS,"RV",return_value);
3538 /* TP:RV value read */
3541 return(return_value);
3545 /*****************************************************************************
3546 *! \brief ossaHwRegWrite
3548 * Purpose: This routine is called to write a 32-bit value to the PCI
3549 * registers of the controller.
3551 * \param agRoot: Pointer to chip/driver Instance.
3552 * \param regOffset: Byte offset to chip register to which chipIOValue is
3554 * \param regValue: 32-bit value to write at chipIOOffset in host byte order.
3558 * \note - The scope is shared target and initiator.
3560 *****************************************************************************/
3563 ossaHwRegWrite(agsaRoot_t *agRoot,
3569 tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3570 if( agNULL != agRoot->sdkData )
3572 smTrace(hpDBG_REGISTERS,"RW",regOffset);
3573 /* TP:RW regOffset */
3574 smTrace(hpDBG_REGISTERS,"VW",regValue);
3575 /* TP:VW value written */
3578 ostiChipWriteBit32 (
3586 /*****************************************************************************
3587 *! \brief ossaHwRegReadExt
3589 * Purpose: This routine is called to read a 32-bit value from a bus-specific
3590 * mapped registers of the controller
3592 * \param agRoot: Pointer to chip/driver Instance.
3593 * \param regOffset: Byte offset to chip register from which to read a 32-bit
3596 * \return: 32-bit value.
3598 * \note - The scope is shared target and initiator.
3600 *****************************************************************************/
3605 bit32 busBaseNumber,
3609 tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3613 return_value = ostiChipReadBit32Ext(
3619 /* TI_DBG4(("#_R: 0x%x:0x%x=0x%x\n",busBaseNumber,regOffset,return_value)); */
3621 if( agNULL != agRoot->sdkData )
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 */
3630 return(return_value);
3633 void ossaPCI_TRIGGER(agsaRoot_t *agRoot )
3635 tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3636 ostiPCI_TRIGGER(osData->tiRoot);
3642 /*****************************************************************************
3643 *! \brief ossaHwRegWriteExt
3645 * Purpose: This routine is called to write a 32-bit value to a bus specific
3646 * mapped registers of the controller.
3648 * \param agRoot: Pointer to chip/driver Instance.
3649 * \param regOffset: Byte offset to chip register to which chipIOValue is
3651 * \param regValue: 32-bit value to write at chipIOOffset in host byte order.
3655 * \note - The scope is shared target and initiator.
3657 *****************************************************************************/
3662 bit32 busBaseNumber,
3667 tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3668 ostiChipWriteBit32Ext(
3675 /* TI_DBG4(("#_W: 0x%x:0x%x=0x%x\n",busBaseNumber,regOffset,regValue)); */
3677 if( agNULL != agRoot->sdkData )
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*/
3690 osGLOBAL bit32 ossaHwRegReadConfig32(
3695 tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3697 to_ret= ostiChipConfigReadBit32( osData->tiRoot, regOffset);
3698 TI_DBG4(("ossaHwRegReadConfig32: regOffset 0x%x returns 0x%x\n",regOffset,to_ret));
3705 #ifdef TD_INT_COALESCE
3707 ossaIntCoalesceInitCB(
3709 agsaIntCoalesceContext_t *agIntCoContext,
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;;
3722 TI_DBG2(("ossaIntCoalesceInitCB: start\n"));
3724 tdsaIntCoalCxt = (tdsaIntCoalesceContext_t *)agIntCoContext->osData;
3725 tiIntCoalesceCxt = tdsaIntCoalCxt->tiIntCoalesceCxt;
3728 case AGSA_RC_SUCCESS:
3729 tiStatus = tiSuccess;
3734 case AGSA_RC_FAILURE:
3738 TI_DBG1(("ossaIntCoalesceInitCB: unknown status %d\n", status));
3743 TI_DBG2(("ossaIntCoalesceInitCB: status %d\n", tiStatus));
3745 /* enqueue tdsaIntCoalCxt to freelink */
3746 tdsaIntCoalCxt->tiIntCoalesceCxt = agNULL;
3747 TI_DBG2(("ossaIntCoalesceInitCB: id %d\n", tdsaIntCoalCxt->id));
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);
3754 #ifdef OS_INT_COALESCE
3755 ostiInitiatorIntCoalesceInitCB(tiRoot,
3760 TI_DBG2(("ossaIntCoalesceInitCB: return end\n"));
3764 #endif /* TD_INT_COALESCE */
3766 /*****************************************************************************/
3767 /*! \brief ossaSingleThreadedEnter
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
3775 * \param agRoot: Pointer to chip/driver Instance.
3776 * \param syncLockId to be explained.
3781 * \note - The scope is shared target and initiator.
3784 /*****************************************************************************/
3786 void ossaSingleThreadedEnter(
3791 tdsaRootOsData_t *pOsData = agNULL;
3792 tiRoot_t *ptiRoot = agNULL;
3793 tdsaContext_t *tdsaAllShared = agNULL;
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");
3801 tdsaAllShared = (tdsaContext_t *)pOsData->tdsaAllShared;
3802 TD_ASSERT(tdsaAllShared, "tdsaAllShared");
3804 ostiSingleThreadedEnter(ptiRoot, syncLockId + tdsaAllShared->MaxNumOSLocks);
3808 /*****************************************************************************/
3809 /*! \brief ossaSingleThreadedLeave
3812 * Purpose: This routine is called to leave a critical region of code
3813 * previously protected by a call to osSingleThreadedEnter()
3816 * \param agRoot: Pointer to chip/driver Instance.
3817 * \param syncLockId to be explained.
3822 * \note - The scope is shared target and initiator.
3825 /*****************************************************************************/
3827 void ossaSingleThreadedLeave(
3832 tdsaRootOsData_t *pOsData = agNULL;
3833 tiRoot_t *ptiRoot = agNULL;
3834 tdsaContext_t *tdsaAllShared = agNULL;
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");
3842 tdsaAllShared = (tdsaContext_t *)pOsData->tdsaAllShared;
3843 TD_ASSERT(tdsaAllShared, "tdsaAllShared");
3845 ostiSingleThreadedLeave(ptiRoot, syncLockId + tdsaAllShared->MaxNumOSLocks);
3850 osGLOBAL void ossaEnter(agsaRoot_t *agRoot, int io)
3852 ostiEnter(((tdsaRootOsData_t*)(agRoot->osData))->tiRoot, 0, io);
3856 osGLOBAL void ossaLeave(agsaRoot_t *agRoot, int io)
3858 ostiLeave(((tdsaRootOsData_t*)(agRoot->osData))->tiRoot, 0, io);
3865 ossaSSPIoctlCompleted(
3867 agsaIORequest_t *agIORequest,
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;
3882 agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
3883 agSSPFrame = &(agSASRequestBody->sspInitiatorReq);
3884 scsiOpcode = agSSPFrame->sspCmdIU.cdb[0];
3886 TI_DBG2(("ossaSSPIoctlCompleted: start\n"));
3888 if (agIOStatus == OSSA_SUCCESS)
3890 TI_DBG2(("ossaSSPIoctlCompleted: Success status\n"));
3894 TI_DBG1(("ossaSSPIoctlCompleted: Status 0x%x\n", agIOStatus));
3898 case REPORT_LUN_OPCODE:
3899 ostiNumOfLUNIOCTLRsp(tiRoot, agIOStatus);
3903 TI_DBG1(("ossaSSPIoctlCompleted: Unsupported SCSI command Response 0x%x\n",scsiOpcode));
3906 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yi");
3912 ossaSMPIoctlCompleted(
3914 agsaIORequest_t *agIORequest,
3917 agsaFrameHandle_t agFrameHandle
3920 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3921 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3922 TI_DBG2(("ossaSMPIoctlCompleted: start\n"));
3924 if (agIOStatus == OSSA_SUCCESS)
3926 TI_DBG2(("ossaSMPIoctlCompleted: Success status\n"));
3930 TI_DBG1(("ossaSMPIoctlCompleted: Status 0x%x\n", agIOStatus));
3933 ostiSendSMPIOCTLRsp(tiRoot, agIOStatus);
3934 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yi");
3940 /*****************************************************************************/
3941 /*! \brief ossaSMPCompleted
3944 * Purpose: This routine is called by lower layer to indicate the completion of
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
3957 * \note - The scope is shared target and initiator.
3958 * For details, refer to SAS/SATA Low-Level API Specification
3960 /*****************************************************************************/
3961 osGLOBAL void ossaSMPCompleted(
3963 agsaIORequest_t *agIORequest,
3966 agsaFrameHandle_t agFrameHandle
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];
3977 TI_DBG2(("ossaSMPCompleted: start and passthrough\n"));
3978 #else /* not PASSTHROUGH */
3980 tdssSMPRequestBody_t *pSMPRequestBody = (tdssSMPRequestBody_t *) agIORequest->osData;
3981 TI_DBG4(("ossaSMPCompleted: start\n"));
3982 #endif /* end not PASSTHROUGH */
3984 TDSA_OUT_ENTER((tiRoot_t *)((tdsaRootOsData_t *)agRoot->osData)->tiRoot);
3985 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y4");
3988 if (tdPTCmndBody == agNULL)
3990 TI_DBG1(("ossaSMPCompleted: tdPTCmndBody is NULL \n"));
3991 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y4");
3995 if (tdPTCmndBody->EventCB == agNULL)
3997 TI_DBG1(("ossaSMPCompleted: tdPTCmndBody->EventCB is NULL \n"));
3998 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y4");
4002 if (agIOStatus == OSSA_IO_SUCCESS)
4004 tiStatus = tiPassthroughSuccess;
4006 else if (agIOStatus == OSSA_IO_ABORTED)
4008 tiStatus = tiPassthroughAborted;
4012 tiStatus = tiPassthroughError;
4015 osti_memset(SMPpayload, 0, agIOInfoLen);
4016 osti_memset(SMPframe, 0, agIOInfoLen + sizeof(agsaSMPFrameHeader_t));
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);
4023 tdPTCmndBody->EventCB(tiRoot,
4024 tdPTCmndBody->tiPassthroughRequest,
4027 agIOInfoLen + sizeof(agsaSMPFrameHeader_t)
4031 #else /* not PASSTHROUGH */
4034 At initiator, passing SMP to TD layer, itdssSMPCompleted(), which does nothing.
4035 At target, passing SMP to TD layer, ttdsaSMPCompleted()
4038 how to use agFrameHandle, when saFrameReadBlock() is used
4041 /* SPC can't be SMP target */
4043 TI_DBG4(("ossaSMPCompleted: start\n"));
4045 if (pSMPRequestBody == agNULL)
4047 TI_DBG1(("ossaSMPCompleted: pSMPRequestBody is NULL \n"));
4048 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y4");
4052 if (pSMPRequestBody->SMPCompletionFunc == agNULL)
4054 TI_DBG1(("ossaSMPCompleted: pSMPRequestBody->SMPCompletionFunc is NULL \n"));
4055 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y4");
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 */
4067 if initiator, calling itdssSMPCompleted() in itdcb.c
4068 if target, calling ttdsaSMPCompleted() in ttdsmp.c
4070 pSMPRequestBody->SMPCompletionFunc(
4078 #endif /* Not PASSTHROUGH */
4080 smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "Y4");
4082 TDSA_OUT_LEAVE((tiRoot_t *)((tdsaRootOsData_t *)agRoot->osData)->tiRoot);
4089 agsaDevHandle_t *agDevHandle,
4090 agsaFrameHandle_t agFrameHandle,
4095 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y5");
4096 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y5");
4100 /*****************************************************************************/
4101 /*! \brief ossaSMPCAMCompleted
4104 * Purpose: This routine is called by lower layer to indicate the completion of
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
4116 * \note - The scope is shared target and initiator.
4117 * For details, refer to SAS/SATA Low-Level API Specification
4119 /*****************************************************************************/
4120 osGLOBAL void ossaSMPCAMCompleted(
4122 agsaIORequest_t *agIORequest,
4125 agsaFrameHandle_t agFrameHandle
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;
4135 bit32 memAllocStatus;
4138 TI_DBG2(("ossaSMPCAMCompleted: start\n"));
4139 TI_DBG2(("ossaSMPCAMCompleted: agIOInfoLen %d\n", agIOInfoLen));
4140 if (!agIORequest->osData)
4142 TD_ASSERT((0), "ossaSMPCAMCompleted agIORequest->osData");
4145 tdSMPRequestBody = (tdIORequestBody_t *)agIORequest->osData;
4146 if (tdSMPRequestBody->tiIORequest->osData == agNULL)
4148 TI_DBG1(("ossaSMPCAMCompleted: tdIORequestBody->tiIORequest->osData is null, wrong\n"));
4151 /* allocating agIORequest for SMP Payload itself */
4152 memAllocStatus = ostiAllocMemory(
4155 (void **)&SMPpayload,
4162 if (memAllocStatus != tiSuccess)
4164 /* let os process IO */
4165 TI_DBG1(("ossaSMPCAMCompleted: ostiAllocMemory failed...\n"));
4168 if (SMPpayload == agNULL)
4170 TI_DBG1(("ossaSMPCAMCompleted: ostiAllocMemory returned NULL SMPpayload\n"));
4173 if (agIOStatus == OSSA_IO_SUCCESS)
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;
4182 else if (agIOStatus == OSSA_IO_ABORTED)
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
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
4206 ostiInitiatorSMPCompleted(tiRoot,
4207 tdSMPRequestBody->tiIORequest,
4214 TDSA_OUT_LEAVE((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4218 #ifdef TARGET_DRIVER
4219 /*****************************************************************************/
4220 /*! \brief ossaSMPReqReceived
4223 * Purpose: This routine is called by lower layer to indicate the reception of
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
4233 * \note - The scope is target only
4234 * For details, refer to SAS/SATA Low-Level API Specification
4236 /*****************************************************************************/
4237 osGLOBAL void ossaSMPReqReceived(
4239 agsaDevHandle_t *agDevHandle,
4240 agsaFrameHandle_t agFrameHandle,
4241 bit32 agFrameLength,
4246 agsaSMPFrameHeader_t *agFrameHeader;
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;
4253 bit8 SMPframe[agIOInfoLen + sizeof(agsaSMPFrameHeader_t)];
4254 bit8 SMPpayload[agIOInfoLen];
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);
4264 Target->PasthroughCB(
4270 agIOInfoLen + sizeof(agsaSMPFrameHeader_t),
4277 agDevHandle_t->osData points to tdssDeviceData_t
4279 tdsaDeviceData_t *pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
4281 saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4);
4282 agFrameHeader = (agsaSMPFrameHeader_t *)smpHeader;
4283 TI_DBG4(("ossaSMPReqReceived: start\n"));
4285 /* tdtypes.h, calling ttdsaSMPReqReceived in ttdsmp.c */
4286 pDeviceData->pJumpTable->pSMPReqReceived (
4300 /*****************************************************************************/
4301 /*! \brief ossaSSPCompleted
4304 * Purpose: This routine is called by lower layer to indicate the completion of
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
4316 * \note - The scope is shared target and initiator.
4317 * For details, refer to SAS/SATA Low-Level API Specification
4319 /*****************************************************************************/
4321 void ossaSSPCompleted(
4323 agsaIORequest_t *agIORequest,
4331 tdIORequestBody_t *pIORequestBody;
4332 #ifdef TD_DEBUG_ENABLE
4333 tiDeviceHandle_t *tiDeviceHandle = agNULL;
4334 tdsaDeviceData_t *oneDeviceData = agNULL;
4337 TDSA_OUT_ENTER((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4338 smTraceFuncEnter(hpDBG_VERY_LOUD,"2L");
4340 if(!agIORequest->osData)
4342 TD_ASSERT((0), "ossaSSPCompleted agIORequest->osData");
4343 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2L");
4346 pIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4349 TI_DBG4(("ossaSSPCompleted: start\n"));
4351 if (pIORequestBody == agNULL)
4353 TI_DBG1(("ossaSSPCompleted: pIORequestBody is NULL \n"));
4354 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2L");
4357 if (pIORequestBody->IOCompletionFunc == agNULL)
4359 #ifdef TD_DEBUG_ENABLE
4360 tiDeviceHandle = pIORequestBody->tiDevHandle;
4361 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
4363 TI_DBG1(("ossaSSPCompleted: IOCompletionFunc is NULL \n"));
4364 TI_DBG1(("ossaSSPCompleted: did %d \n", oneDeviceData->id));
4365 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2L");
4370 if initiator, calling itdssIOCompleted() in itdcb.c
4371 if initiator, calling itdssTaskCompleted in itdcb.c
4372 if target, calling ttdsaIOCompleted() in ttdio.c
4374 pIORequestBody->IOCompletionFunc(
4382 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2L");
4384 TDSA_OUT_LEAVE((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4389 GLOBAL void ossaFastSSPCompleted(
4391 agsaIORequest_t *cbArg,
4399 agsaFastCBBuf_t *safb = (agsaFastCBBuf_t*)cbArg;
4400 tdsaRootOsData_t *osData = (tdsaRootOsData_t*)agRoot->osData;
4401 tiRoot_t *tiRoot = (tiRoot_t*)osData->tiRoot;
4407 agsaSSPResponseInfoUnit_t agSSPRespIU;
4409 TDSA_OUT_ENTER((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4410 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y6");
4412 TI_DBG4(("ossaSSPCompleted: start\n"));
4414 if (safb->cb == agNULL || safb->cbArg == agNULL)
4416 TI_DBG1(("ossaFastSSPCompleted: pIORequestBody is NULL \n"));
4417 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y6");
4424 case OSSA_IO_SUCCESS:
4426 /* ~ itdssIOSuccessHandler */
4427 if ((agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t)))
4429 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, OSSA_IO_SUCCESS, 0);
4433 /* reads agsaSSPResponseInfoUnit_t */
4434 saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU,
4435 sizeof(agsaSSPResponseInfoUnit_t));
4437 data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
4438 scsi_status = agSSPRespIU.status;
4440 TI_DBG1(("itdssIOSuccessHandler: scsi_status %d\n", scsi_status));
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));
4448 if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen)
4450 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4451 tiDetailOtherError);
4455 /* reads response data */
4456 saFrameReadBlock(agRoot, agParam, sizeof(agsaSSPResponseInfoUnit_t),
4458 /* reads sense data */
4459 saFrameReadBlock(agRoot, agParam, sizeof(agsaSSPResponseInfoUnit_t)
4460 + respLen, safb->pSenseData, senseLen);
4462 if (data_status == 0)
4465 TI_DBG2(("ossaFastSSPCompleted: no data\n"));
4466 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOSuccess,
4471 if (data_status == 1)
4474 TI_DBG1(("ossaFastSSPCompleted: response data \n"));
4475 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOSuccess, 0);
4479 if (data_status == 2)
4481 tiSenseData_t senseData;
4484 TI_DBG2(("itdssIOSuccessHandler: sense data \n"));
4486 senseData.senseData = safb->pSenseData;
4487 senseData.senseLen = MIN(*(safb->senseLen), senseLen);
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)
4497 TI_DBG2(("ossaFastSSPCompleted: sending notfify spinup\n"));
4499 if (((tdsaDeviceData_t*)safb->oneDeviceData)->directlyAttached ==
4502 for (i = 0; i < TD_MAX_NUM_NOTIFY_SPINUP; i++)
4504 saLocalPhyControl(agRoot, agNULL, 0,
4505 ((tdsaDeviceData_t*)safb->oneDeviceData)->phyID,
4506 AGSA_PHY_NOTIFY_ENABLE_SPINUP,
4512 if (*(safb->senseLen) > senseData.senseLen)
4513 *(safb->senseLen) = senseData.senseLen;
4514 // memcpy((void *)safb->pSenseData, senseData.senseData, safb->senseLen);
4516 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOSuccess,
4521 if (data_status == 3)
4524 TI_DBG1(("ossaFastSSPCompleted: reserved wrong!!!\n"));
4526 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4532 case OSSA_IO_OVERFLOW:
4533 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOOverRun,
4536 #endif /* REMOVED */
4537 case OSSA_IO_UNDERFLOW:
4538 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOUnderRun,
4542 case OSSA_IO_ABORTED:
4543 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4546 case OSSA_IO_ABORT_RESET:
4547 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4548 tiDetailAbortReset);
4550 case OSSA_IO_NO_DEVICE:
4551 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4554 case OSSA_IO_DS_NON_OPERATIONAL:
4557 tdsaDeviceData_t *oneDeviceData;
4559 oneDeviceData = (tdsaDeviceData_t*)safb->oneDeviceData;
4560 if (oneDeviceData->valid == agTRUE &&
4561 oneDeviceData->registered == agTRUE &&
4562 oneDeviceData->tdPortContext != agNULL)
4564 saSetDeviceState(oneDeviceData->agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData),
4565 oneDeviceData->agDevHandle, SA_DS_OPERATIONAL);
4571 ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4572 tiDetailOtherError);
4576 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y6");
4579 TDSA_OUT_LEAVE((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4581 } /* ossaFastSSPCompleted */
4584 /*****************************************************************************/
4585 /*! \brief ossaSSPReqReceived
4588 * Purpose: This routine is called by lower layer to indicate the reception of
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
4599 * \note - The scope is target only
4600 * For details, refer to SAS/SATA Low-Level API Specification
4602 /*****************************************************************************/
4603 osGLOBAL void ossaSSPReqReceived(
4605 agsaDevHandle_t *agDevHandle,
4606 agsaFrameHandle_t agFrameHandle,
4607 bit16 agInitiatorTag,
4614 uses jumptable, not callback
4617 agDevHandle_t->osData points to tdssDeviceData_t
4619 tdsaDeviceData_t *pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
4620 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y7");
4622 /* tdtypes.h, calling ttdsaSSPReqReceived() in ttdio.c */
4623 pDeviceData->pJumpTable->pSSPReqReceived (
4631 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y7");
4634 /*****************************************************************************/
4635 /*! \brief ossaStallThread
4638 * Purpose: This routine is called to stall this thread for a number of
4642 * \param agRoot: Pointer to chip/driver Instance.
4643 * \param microseconds: Micro second to stall.
4648 * \note - The scope is shared target and initiator.
4651 /*****************************************************************************/
4652 osGLOBAL void ossaStallThread(agsaRoot_t *agRoot,
4656 tdsaRootOsData_t *pOsData = (tdsaRootOsData_t *) (agRoot->osData);
4666 /*****************************************************************************
4667 *! \brief ossaSSPEvent
4669 * This routine is called to notify the OS Layer of an event associated with
4670 * SAS port or SAS device
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
4680 *****************************************************************************/
4681 /* in case of CMD ACK_NAK timeout, send query task */
4682 osGLOBAL void ossaSSPEvent(
4684 agsaIORequest_t *agIORequest,
4685 agsaPortContext_t *agPortContext,
4686 agsaDevHandle_t *agDevHandle,
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; */
4698 tdIORequestBody_t *TMtdIORequestBody;
4701 bit32 memAllocStatus;
4702 bit32 agRequestType;
4703 agsaIORequest_t *agTMIORequest = agNULL; /* task management itself */
4704 agsaSASRequestBody_t *agSASRequestBody = agNULL;
4705 agsaSSPScsiTaskMgntReq_t *agSSPTaskMgntRequest;
4707 bit32 agIORequestType; /* type of IO recevied */
4708 tiIORequest_t *taskTag; /* being task managed one */
4709 tdIORequestBody_t *tdIORequestBody;
4713 tiDeviceHandle_t *tiDeviceHandle;
4714 tdsaDeviceData_t *oneDeviceData = agNULL;
4715 tdIORequestBody_t *tdAbortIORequestBody;
4717 agsaDifDetails_t agDifDetails;
4718 bit8 framePayload[256];
4720 bit16 frameOffset = 0;
4724 TI_DBG6(("ossaSSPEvent: start\n"));
4725 smTraceFuncEnter(hpDBG_VERY_LOUD,"Y9");
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
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;
4741 tiDeviceHandle = tdIORequestBody->tiDevHandle;
4742 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
4745 #ifdef INITIATOR_DRIVER
4746 agIORequestType = tdIORequestBody->agRequestType;
4748 /* error checking; only command is expected here */
4749 if (agIORequestType == AGSA_REQ_TYPE_UNKNOWN)
4751 TI_DBG1(("ossaSSPEvent: incorrect frame 0x%x. Should be command\n", agIORequestType));
4752 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y9");
4756 /* Allocate memory for query task management */
4757 memAllocStatus = ostiAllocMemory(
4760 (void **)&TMtdIORequestBody,
4764 sizeof(tdIORequestBody_t),
4768 if (memAllocStatus != tiSuccess)
4770 /* let os process IO */
4771 TI_DBG1(("ossaSSPEvent: ostiAllocMemory failed...\n"));
4772 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y9");
4776 if (TMtdIORequestBody == agNULL)
4778 /* let os process IO */
4779 TI_DBG1(("ossaSSPEvent: ostiAllocMemory returned NULL TMIORequestBody\n"));
4780 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y9");
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;
4790 /* initialize callback function */
4791 TMtdIORequestBody->IOCompletionFunc = itdssQueryTaskCompleted;
4793 /* initialize tiDevhandle */
4794 TMtdIORequestBody->tiDevHandle = tdIORequestBody->tiDevHandle;
4797 /* initialize agIORequest */
4798 agTMIORequest = &(TMtdIORequestBody->agIORequest);
4799 agTMIORequest->osData = (void *) TMtdIORequestBody;
4800 agTMIORequest->sdkData = agNULL; /* LL takes care of this */
4803 agRequestType = AGSA_SSP_TASK_MGNT_REQ;
4804 TMtdIORequestBody->agRequestType = AGSA_SSP_TASK_MGNT_REQ;
4808 tdIORequestBody_t tdIORequestBody -> agSASRequestBody
4810 agSASRequestBody = &(TMtdIORequestBody->transport.SAS.agSASRequestBody);
4811 agSSPTaskMgntRequest = &(agSASRequestBody->sspTaskMgntReq);
4813 /* fill up LUN field */
4814 osti_memset(agSSPTaskMgntRequest->lun, 0, 8);
4816 /* sets taskMgntFunction field */
4817 agSSPTaskMgntRequest->taskMgntFunction = AGSA_QUERY_TASK;
4819 if (TMtdIORequestBody->IOCompletionFunc == agNULL)
4821 TI_DBG1(("ossaSSPEvent: Error !!! IOCompletionFunc is NULL\n"));
4823 /* send query task management */
4824 saStatus = saSSPStart(agRoot,
4833 if (saStatus != AGSA_RC_SUCCESS)
4835 /* free up allocated memory */
4838 TMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
4839 sizeof(tdIORequestBody_t)
4841 TI_DBG1(("ossaSSPEvent: saSSPStart failed\n"));
4847 else if (event == OSSA_IO_ABORTED)
4849 TI_DBG2(("ossaSSPEvent: OSSA_IO_ABORTED\n"));
4850 /* clean up TD layer's IORequestBody */
4851 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4854 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
4855 sizeof(tdIORequestBody_t)
4859 else if (event == OSSA_IO_NOT_VALID)
4861 TI_DBG1(("ossaSSPEvent: OSSA_IO_NOT_VALID\n"));
4862 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4865 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
4866 sizeof(tdIORequestBody_t)
4872 else if (event == OSSA_IO_XFER_CMD_FRAME_ISSUED)
4874 TI_DBG2(("ossaSSPEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED\n"));
4876 else if (event == OSSA_IO_XFER_ERROR_OFFSET_MISMATCH)
4878 TI_DBG1(("ossaSSPEvent: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH\n"));
4880 else if (event == OSSA_IO_OVERFLOW)
4882 TI_DBG1(("ossaSSPEvent: OSSA_IO_OVERFLOW\n"));
4884 ??? can't call; missing agIOInfoLen
4885 ostiInitiatorIOCompleted (
4887 tdIORequestBody->tiIORequest,
4897 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED)
4899 TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED\n"));
4901 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO)
4903 TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO\n"));
4905 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST)
4907 TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST\n"));
4909 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE)
4911 TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE\n"));
4913 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED)
4915 TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED\n"));
4917 else if (event == OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH)
4919 TI_DBG1(("ossaSSPEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH\n"));
4921 else if (event == OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN)
4923 TI_DBG1(("ossaSSPEvent: OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN\n"));
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 )
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)
4935 TI_DBG2(("ossaSSPEvent: agParam is NULL!!!\n"));
4938 if (agIOInfoLen < sizeof(agsaDifDetails_t))
4940 TI_DBG2(("ossaSSPEvent: wrong agIOInfoLen!!! agIOInfoLen %d sizeof(agsaDifDetails_t) %d\n", agIOInfoLen, (int)sizeof(agsaDifDetails_t)));
4943 /* reads agsaDifDetails_t */
4944 saFrameReadBlock(agRoot, agParam, 0, &agDifDetails, sizeof(agsaDifDetails_t));
4946 frameOffset = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF);
4948 frameLen = (bit16)((agDifDetails.ErrBoffsetEDataLen & 0xFFFF0000) >> 16);
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)
4957 saFrameReadBlock(agRoot, agParam, sizeof(agsaDifDetails_t), framePayload, frameLen);
4958 tdhexdump("ossaSSPEvent frame", framePayload, frameLen);
4963 TI_DBG1(("ossaSSPEvent: other event 0x%x\n", event));
4966 smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y9");
4971 osGLOBAL void ossaSATAIDAbortCB(
4973 agsaIORequest_t *agIORequest,
4977 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4978 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4979 tdIORequestBody_t *tdAbortIORequestBody;
4981 TI_DBG1(("ossaSATAIDAbortCB: start flag %d status %d\n", flag, status));
4983 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4986 triggered by tdIDStartTimerCB
4990 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
4991 sizeof(tdIORequestBody_t)
4997 #ifdef INITIATOR_DRIVER
4998 osGLOBAL void ossaSSPAbortCB(
5000 agsaIORequest_t *agIORequest,
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;
5011 TI_DBG2(("ossaSSPAbortCB: start\n"));
5012 smTraceFuncEnter(hpDBG_VERY_LOUD,"Ya");
5014 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5015 if (tdAbortIORequestBody == agNULL)
5017 TI_DBG1(("ossaSSPAbortCB: tdAbortIORequestBody is NULL warning!!!!\n"));
5023 /* abort per port */
5024 TI_DBG1(("ossaSSPAbortCB: abort per port\n"));
5028 TI_DBG2(("ossaSSPAbortCB: abort all\n"));
5030 tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
5031 if (tiDeviceHandle == agNULL)
5033 TI_DBG1(("ossaSSPAbortCB: tiDeviceHandle is NULL warning!!!!\n"));
5036 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5037 sizeof(tdIORequestBody_t)
5042 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
5043 if (oneDeviceData == agNULL)
5045 TI_DBG1(("ossaSSPAbortCB: oneDeviceData is NULL warning!!!!\n"));
5048 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5049 sizeof(tdIORequestBody_t)
5054 if (status == OSSA_IO_SUCCESS)
5056 TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
5057 /* clean up TD layer's IORequestBody */
5058 if (oneDeviceData->OSAbortAll == agTRUE)
5060 oneDeviceData->OSAbortAll = agFALSE;
5061 ostiInitiatorEvent( tiRoot,
5064 tiIntrEventTypeLocalAbort,
5070 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5071 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5073 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5076 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5077 sizeof(tdIORequestBody_t)
5081 else if (status == OSSA_IO_NOT_VALID)
5083 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
5084 /* clean up TD layer's IORequestBody */
5085 if (oneDeviceData->OSAbortAll == agTRUE)
5087 oneDeviceData->OSAbortAll = agFALSE;
5088 ostiInitiatorEvent( tiRoot,
5091 tiIntrEventTypeLocalAbort,
5097 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5098 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5100 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5103 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5104 sizeof(tdIORequestBody_t)
5107 else if (status == OSSA_IO_NO_DEVICE)
5109 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
5110 /* clean up TD layer's IORequestBody */
5111 if (oneDeviceData->OSAbortAll == agTRUE)
5113 oneDeviceData->OSAbortAll = agFALSE;
5114 ostiInitiatorEvent( tiRoot,
5117 tiIntrEventTypeLocalAbort,
5123 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5124 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5126 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5129 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5130 sizeof(tdIORequestBody_t)
5133 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
5135 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
5136 /* clean up TD layer's IORequestBody */
5137 if (oneDeviceData->OSAbortAll == agTRUE)
5139 oneDeviceData->OSAbortAll = agFALSE;
5140 ostiInitiatorEvent( tiRoot,
5143 tiIntrEventTypeLocalAbort,
5149 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5150 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5152 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5155 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5156 sizeof(tdIORequestBody_t)
5160 else if (status == OSSA_IO_ABORT_DELAYED)
5162 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
5163 /* clean up TD layer's IORequestBody */
5164 if (oneDeviceData->OSAbortAll == agTRUE)
5166 oneDeviceData->OSAbortAll = agFALSE;
5167 ostiInitiatorEvent( tiRoot,
5170 tiIntrEventTypeLocalAbort,
5176 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5177 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5179 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5182 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5183 sizeof(tdIORequestBody_t)
5189 TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
5190 /* clean up TD layer's IORequestBody */
5191 if (oneDeviceData->OSAbortAll == agTRUE)
5193 oneDeviceData->OSAbortAll = agFALSE;
5194 ostiInitiatorEvent( tiRoot,
5197 tiIntrEventTypeLocalAbort,
5203 TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5204 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5206 TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5209 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5210 sizeof(tdIORequestBody_t)
5216 TI_DBG2(("ossaSSPAbortCB: abort one\n"));
5217 taskTag = tdAbortIORequestBody->tiIOToBeAbortedRequest;
5219 if ( taskTag == agNULL)
5221 TI_DBG1(("ossaSSPAbortCB: taskTag is NULL; triggered by itdssQueryTaskCompleted\n"));
5223 if (status == OSSA_IO_SUCCESS)
5225 TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
5226 if (taskTag != agNULL)
5228 ostiInitiatorEvent( tiRoot,
5231 tiIntrEventTypeLocalAbort,
5237 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5238 sizeof(tdIORequestBody_t)
5242 else if (status == OSSA_IO_NOT_VALID)
5244 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
5246 if (taskTag != agNULL)
5248 ostiInitiatorEvent( tiRoot,
5251 tiIntrEventTypeLocalAbort,
5257 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5258 sizeof(tdIORequestBody_t)
5261 else if (status == OSSA_IO_NO_DEVICE)
5263 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
5265 if (taskTag != agNULL)
5267 ostiInitiatorEvent( tiRoot,
5270 tiIntrEventTypeLocalAbort,
5276 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5277 sizeof(tdIORequestBody_t)
5280 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
5282 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
5284 if (taskTag != agNULL)
5286 ostiInitiatorEvent( tiRoot,
5289 tiIntrEventTypeLocalAbort,
5295 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5296 sizeof(tdIORequestBody_t)
5300 else if (status == OSSA_IO_ABORT_DELAYED)
5302 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
5304 if (taskTag != agNULL)
5306 ostiInitiatorEvent( tiRoot,
5309 tiIntrEventTypeLocalAbort,
5315 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5316 sizeof(tdIORequestBody_t)
5322 TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
5324 if (taskTag != agNULL)
5326 ostiInitiatorEvent( tiRoot,
5329 tiIntrEventTypeLocalAbort,
5335 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5336 sizeof(tdIORequestBody_t)
5342 TI_DBG1(("ossaSSPAbortCB: wrong flag %d\n", flag));
5344 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ya");
5351 #ifdef TARGET_DRIVER
5352 osGLOBAL void ossaSSPAbortCB(
5354 agsaIORequest_t *agIORequest,
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;
5364 TI_DBG3(("ossaSSPAbortCB: start\n"));
5365 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5369 /* abort per port */
5370 TI_DBG2(("ossaSSPAbortCB: abort per port\n"));
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)
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));
5386 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5387 sizeof(tdIORequestBody_t)
5391 else if (status == OSSA_IO_NOT_VALID)
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));
5400 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5401 sizeof(tdIORequestBody_t)
5404 else if (status == OSSA_IO_NO_DEVICE)
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));
5413 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5414 sizeof(tdIORequestBody_t)
5417 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
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));
5426 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5427 sizeof(tdIORequestBody_t)
5431 else if (status == OSSA_IO_ABORT_DELAYED)
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));
5440 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5441 sizeof(tdIORequestBody_t)
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));
5454 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5455 sizeof(tdIORequestBody_t)
5461 TI_DBG2(("ossaSSPAbortCB: abort one\n"));
5462 if (status == OSSA_IO_SUCCESS)
5464 TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
5467 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5468 sizeof(tdIORequestBody_t)
5472 else if (status == OSSA_IO_NOT_VALID)
5474 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
5477 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5478 sizeof(tdIORequestBody_t)
5481 else if (status == OSSA_IO_NO_DEVICE)
5483 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
5486 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5487 sizeof(tdIORequestBody_t)
5490 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
5492 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
5495 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5496 sizeof(tdIORequestBody_t)
5500 else if (status == OSSA_IO_ABORT_DELAYED)
5502 TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
5505 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5506 sizeof(tdIORequestBody_t)
5512 TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
5515 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5516 sizeof(tdIORequestBody_t)
5522 TI_DBG1(("ossaSSPAbortCB: wrong flag %d\n", flag));
5531 /*****************************************************************************/
5532 /*! \brief ossaLocalPhyControlCB
5535 * Purpose: This routine is called by lower layer to indicate the status of
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
5548 /*****************************************************************************/
5549 osGLOBAL void ossaLocalPhyControlCB(
5551 agsaContext_t *agContext,
5559 agsaPhyErrCounters_t *agPhyErrCounters;
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;
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)
5576 case AGSA_PHY_LINK_RESET: /* fall through */
5577 case AGSA_PHY_HARD_RESET:
5578 if (phyOperation == AGSA_PHY_LINK_RESET)
5580 TI_DBG1(("ossaLocalPhyControlCB: AGSA_PHY_LINK_RESET, status 0x%x\n", status));
5584 TI_DBG1(("ossaLocalPhyControlCB: AGSA_PHY_HARD_RESET, status 0x%x\n", status));
5586 #ifdef INITIATOR_DRIVER
5587 if (agContext != agNULL)
5589 currentTaskTag = (tiIORequest_t *)agContext->osData;
5590 if (status == OSSA_SUCCESS)
5592 if (currentTaskTag != agNULL)
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;
5602 if (TargetDeviceData->TRflag == agTRUE)
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,
5616 agDevHandle = TargetDeviceData->agDevHandle;
5617 if (agDevHandle == agNULL)
5619 TI_DBG1(("ossaLocalPhyControlCB: wrong, agDevHandle is NULL\n"));
5621 /* move this to OSSA_HW_EVENT_PORT_RESET_COMPLETE in ossaHwCB() */
5622 agContextDevice = &(TargetDeviceData->agDeviceResetContext);
5623 agContextDevice->osData = currentTaskTag;
5626 ostiInitiatorEvent( tiRoot,
5629 tiIntrEventTypeTaskManagement,
5638 if (currentTaskTag != agNULL)
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)
5647 TargetDeviceData->TRflag = agFALSE;
5648 ostiInitiatorEvent(tiRoot,
5649 TargetDeviceData->tdPortContext->tiPortalContext,
5650 &(TargetDeviceData->tiDeviceHandle),
5651 tiIntrEventTypeTransportRecovery,
5658 ostiInitiatorEvent( tiRoot,
5661 tiIntrEventTypeTaskManagement,
5671 case AGSA_PHY_GET_ERROR_COUNTS:
5673 TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_GET_ERROR_COUNTS, status 0x%x\n", status));
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));
5685 case AGSA_PHY_CLEAR_ERROR_COUNTS:
5686 TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_CLEAR_ERROR_COUNTS, status 0x%x\n", status));
5689 case AGSA_PHY_NOTIFY_ENABLE_SPINUP:
5690 TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_NOTIFY_ENABLE_SPINUP, status 0x%x\n", status));
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))
5696 TI_DBG1(("ossaLocalPhyControlCB: BROADCAST_ASYNCH_EVENT received for SATA Controller\n"));
5700 case AGSA_PHY_COMINIT_OOB :
5701 TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_COMINIT_OOB, status 0x%x\n", status));
5704 TI_DBG1(("ossaLocalPhyControlCB: UNKNOWN default case. phyOperation %d status 0x%x\n", phyOperation, status));
5707 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yb");
5711 GLOBAL void ossaGetPhyProfileCB(
5713 agsaContext_t *agContext,
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;
5729 agsaPhyBWCountersPage_t *agBWCounters;
5730 agsaPhyErrCountersPage_t *agPhyErrCounters;
5731 TI_DBG1(("ossaGetPhyProfileCB: agContext %p parm %p\n", agContext, parm));
5733 if( tdsaAllShared->tdFWControlEx.inProgress )
5735 tdsaAllShared->tdFWControlEx.inProgress = 0;
5736 PhyBlob = (tdPhyCount_t *)tdsaAllShared->tdFWControlEx.usrAddr;
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));
5745 agBWCounters = (agsaPhyBWCountersPage_t *)parm;
5746 TI_DBG1(("ossaGetPhyProfileCB: RX %d TX %d\n", agBWCounters->RXBWCounter,agBWCounters->TXBWCounter));
5747 if(PhyBlob !=agNULL )
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;
5760 case AGSA_SAS_PHY_ERR_COUNTERS_PAGE:
5761 if( tdsaAllShared->tdFWControlEx.inProgress )
5763 tdsaAllShared->tdFWControlEx.inProgress = 0;
5764 PhyBlob = (tdPhyCount_t *)tdsaAllShared->tdFWControlEx.usrAddr;
5766 TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_ERR_COUNTERS_PAGE, status 0x%x phyID %d\n", status, phyID));
5769 agPhyErrCounters = (agsaPhyErrCountersPage_t *)parm;
5770 if(PhyBlob !=agNULL )
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;
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));
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));
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
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);
5809 #endif /* CCFLAGS_PHYCONTROL_COUNTS */
5811 case AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE:
5813 TI_DBG1(("ossaGetPhyProfileCB:AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE status 0x%x phyID %d\n", status, phyID));
5816 #ifdef TD_DEBUG_ENABLE
5817 agsaSASPhyOpenRejectRetryBackOffThresholdPage_t *Backoff =
5818 (agsaSASPhyOpenRejectRetryBackOffThresholdPage_t *)parm;
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));
5827 case AGSA_SAS_PHY_GENERAL_STATUS_PAGE:
5829 agsaSASPhyGeneralStatusPage_t * GenStatus = NULL;
5831 TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_GENERAL_STATUS_PAGE status 0x%x phyID %d\n",
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));
5841 ostiGetPhyGeneralStatusRsp(tiRoot, GenStatus, phyID);
5847 TI_DBG1(("ossaGetPhyProfileCB: UNKNOWN default case. phyOperation %d status 0x%x\n", ppc, status));
5852 ostiGetPhyProfileIOCTLRsp(tiRoot, status);
5857 GLOBAL void ossaSetPhyProfileCB(
5859 agsaContext_t *agContext,
5865 TI_DBG1(("ossaSetPhyProfileCB:agContext %p status 0x%x ppc %d phyID %d parm %p\n",agContext, status, ppc, phyID,parm));
5869 /*****************************************************************************/
5870 /*! \brief ossaGetDeviceHandlesCB
5873 * Purpose: This routine is called by lower layer to corresponding to
5874 * saGetDeviceHandles()
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
5882 * \param validDevs Number of valid device handles
5887 * \note - The scope is shared target and initiator.
5888 * For details, refer to SAS/SATA Low-Level API Specification
5890 /*****************************************************************************/
5891 osGLOBAL void ossaGetDeviceHandlesCB(
5893 agsaContext_t *agContext,
5894 agsaPortContext_t *agPortContext,
5895 agsaDevHandle_t *agDev[],
5899 TI_DBG2(("ossaGetDeviceHandlesCB: start\n"));
5900 TI_DBG2(("ossaGetDeviceHandlesCB: validDevs %d\n", validDevs));
5901 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yc");
5903 for (i = 0 ; i < validDevs ; i++)
5908 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yc");
5912 /*****************************************************************************/
5913 /*! \brief ossaGetDeviceInfoCB
5916 * Purpose: This routine is called by lower layer to corresponding to
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
5927 * \note - The scope is shared target and initiator.
5928 * For details, refer to SAS/SATA Low-Level API Specification
5930 /*****************************************************************************/
5931 osGLOBAL void ossaGetDeviceInfoCB(
5933 agsaContext_t *agContext,
5934 agsaDevHandle_t *agDevHandle,
5940 #ifdef TD_DEBUG_ENABLE
5941 agsaDeviceInfo_t *agDeviceInfo;
5942 agsaSASDeviceInfo_t *agSASDeviceInfo;
5943 agsaSATADeviceInfo_t *agSATADeviceInfo;
5945 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yd");
5947 TI_DBG1(("ossaGetDeviceInfoCB: start agContext %p\n",agContext));
5950 case OSSA_DEV_INFO_INVALID_HANDLE:
5951 TI_DBG1(("ossaGetDeviceInfoCB: OSSA_DEV_INFO_INVALID_HANDLE\n"));
5952 /*ostiGetDeviceInfoIOCTLRsp(tiRoot, status, agNULL);*/
5954 case OSSA_DEV_INFO_NO_EXTENDED_INFO:
5955 #ifdef TD_DEBUG_ENABLE
5956 agDeviceInfo = (agsaDeviceInfo_t *)agInfo;
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));
5964 /*ostiPortEvent (tiRoot, tiGetDevInfo, tiSuccess,(void *)agContext );*/
5965 /*ostiGetDeviceInfoIOCTLRsp(tiRoot, status, agDeviceInfo);*/
5967 case OSSA_DEV_INFO_SAS_EXTENDED_INFO:
5968 #ifdef TD_DEBUG_ENABLE
5969 agSASDeviceInfo = (agsaSASDeviceInfo_t *)agInfo;
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));
5980 case OSSA_DEV_INFO_SATA_EXTENDED_INFO:
5981 #ifdef TD_DEBUG_ENABLE
5982 agSATADeviceInfo = (agsaSATADeviceInfo_t *)agInfo;
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);
5995 TI_DBG2(("ossaGetDeviceInfoCB: error default case, status is %d\n", status));
5998 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yd");
6002 /*****************************************************************************/
6003 /*! \brief ossaDeviceRegistrationCB
6006 * Purpose: This routine is called by lower layer to corresponding to
6007 * saRegisterNewDevice()
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.
6020 /*****************************************************************************/
6021 osGLOBAL void ossaDeviceRegistrationCB(
6023 agsaContext_t *agContext,
6025 agsaDevHandle_t *agDevHandle,
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;
6040 dmRoot_t *dmRoot = &(tdsaAllShared->dmRoot);
6041 dmPortContext_t *dmPortContext = &(onePortContext->dmPortContext);
6042 dmDeviceInfo_t dmDeviceInfo;
6043 bit32 DMstatus = DM_RC_FAILURE;
6045 bit32 expanderType = 1;
6048 #if defined(FDS_DM) && !defined(FDS_SM)
6053 smRoot_t *smRoot = &(tdsaAllShared->smRoot);
6054 bit32 SMstatus = SM_RC_FAILURE;
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 ));
6064 /* transient period caused by tdssReportRemovals(), device was in the middle
6065 of registration but port is invalidated
6067 if (oneDeviceData->valid == agFALSE && oneDeviceData->valid2 == agFALSE
6068 && oneDeviceData->DeviceType == TD_DEFAULT_DEVICE)
6070 if (status == OSSA_SUCCESS)
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))
6077 if (oneDeviceData->satDevData.IDDeviceValid == agFALSE)
6079 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, 0);
6083 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
6088 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
6091 else if (status == OSSA_FAILURE_PORT_NOT_VALID_STATE || status == OSSA_ERR_PORT_STATE_NOT_VALID)
6094 TI_DBG2(("ossaDeviceRegistrationCB: transient, do nothing did %d\n", oneDeviceData->id));
6099 if (agDevHandle == agNULL)
6101 TI_DBG3(("ossaDeviceRegistrationCB: agDevHandle is NULL\n"));
6105 TI_DBG3(("ossaDeviceRegistrationCB: agDevHandle is NOT NULL\n"));
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)
6116 TI_DBG1(("ossaDeviceRegistrationCB: agDevHandle is NULL, wrong!\n"));
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++;
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));
6131 /* if device is an expander, register it to DM */
6132 if (onePortContext->valid == agTRUE)
6134 if (DEVICE_IS_SMP_TARGET(oneDeviceData))
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)
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;
6157 DMstatus = dmRegisterDevice(dmRoot, dmPortContext, &dmDeviceInfo, oneDeviceData->agDevHandle);
6158 if (DMstatus != DM_RC_SUCCESS)
6160 TI_DBG1(("ossaDeviceRegistrationCB: dmRegisterDevice failed!!! 0x%x\n", DMstatus));
6166 /* if device is SATA, register it to SM */
6167 if (onePortContext->valid == agTRUE)
6169 if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6171 TI_DBG1(("ossaDeviceRegistrationCB: calling smRegisterDevice\n"));
6172 if (oneDeviceData->directlyAttached == agTRUE)
6174 SMstatus = smRegisterDevice(smRoot,
6176 &(oneDeviceData->smDeviceHandle),
6178 (bit32)oneDeviceData->phyID,
6179 oneDeviceData->satDevData.satDeviceType);
6183 if (oneDeviceData->ExpDevice == agNULL)
6185 TI_DBG1(("ossaDeviceRegistrationCB: oneDeviceData->ExpDevice NULL!!!\n"));
6188 if (oneDeviceData->ExpDevice->agDevHandle == agNULL)
6190 TI_DBG1(("ossaDeviceRegistrationCB: oneDeviceData->ExpDevice->agDevHandle NULL!!!\n"));
6192 SMstatus = smRegisterDevice(smRoot,
6194 &(oneDeviceData->smDeviceHandle),
6195 oneDeviceData->ExpDevice->agDevHandle,
6196 (bit32)oneDeviceData->phyID,
6197 oneDeviceData->satDevData.satDeviceType);
6199 if (SMstatus != SM_RC_SUCCESS)
6201 TI_DBG1(("ossaDeviceRegistrationCB: smRegisterDevice failed!!! 0x%x\n", DMstatus));
6206 /* special case for directly attached targets */
6207 if (oneDeviceData->directlyAttached == agTRUE)
6209 TI_DBG3(("ossaDeviceRegistrationCB: directly attached did %d\n", oneDeviceData->id));
6210 if (oneDeviceData->DeviceType == TD_SAS_DEVICE)
6212 TI_DBG3(("ossaDeviceRegistrationCB: SAS target\n"));
6213 if (onePortContext->valid == agTRUE)
6215 if (onePortContext->PortRecoverPhyID != 0xFF)
6217 oneDeviceData->phyID = (bit8)onePortContext->PortRecoverPhyID;
6218 onePortContext->PortRecoverPhyID = 0xFF;
6219 TI_DBG3(("ossaDeviceRegistrationCB: PortRecoverPhyID %d\n", oneDeviceData->phyID));
6221 /* link up and discovery ready event */
6222 if (onePortContext->DiscoveryRdyGiven == agFALSE)
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)
6231 TI_DBG1(("ossaDeviceRegistrationCB: wrong discovery state 0x%x\n", onePortContext->DiscoveryState));
6233 /* notifying link up */
6238 (void *)onePortContext->tiPortalContext
6240 #ifdef INITIATOR_DRIVER
6241 /* triggers discovery */
6244 tiPortDiscoveryReady,
6246 (void *)onePortContext->tiPortalContext
6253 TI_DBG2(("ossaDeviceRegistrationCB: abort call\n"));
6254 /* abort all followed by deregistration of sas target */
6255 tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
6260 TI_DBG2(("ossaDeviceRegistrationCB: SATA target\n"));
6261 if (onePortContext->valid == agTRUE)
6263 if (oneDeviceData->satDevData.IDDeviceValid == agFALSE)
6266 /* send identify device data */
6267 tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
6270 /* send identify device data */
6271 tdssSubAddSATAToSharedcontext(tiRoot, oneDeviceData);
6277 TI_DBG2(("ossaDeviceRegistrationCB: abort call\n"));
6278 /* abort all followed by deregistration of sas target */
6279 tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
6283 else /* behind the expander */
6285 #if defined(FDS_DM) && defined(FDS_SM)
6286 /* send ID to SATA targets
6287 needs go allocate tdIORequestBody_t for smIORequest
6290 if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6292 oneDeviceData->satDevData.IDDeviceValid == agFALSE)
6294 tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
6297 #elif defined(FDS_DM) /* worked with DM */
6298 if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6300 oneDeviceData->satDevData.IDDeviceValid == agFALSE)
6302 IDstatus = tdsaDiscoveryStartIDDev(tiRoot,
6304 &(oneDeviceData->tiDeviceHandle),
6308 if (IDstatus != tiSuccess)
6310 /* identify device data is not valid */
6311 TI_DBG1(("ossaDeviceRegistrationCB: fail or busy %d\n", IDstatus));
6312 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
6319 /* after discovery is finished */
6320 if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
6322 TI_DBG2(("ossaDeviceRegistrationCB: calling new device arrival\n"));
6323 if (DEVICE_IS_SSP_TARGET(oneDeviceData))
6325 /* in case registration is finished after discovery is finished */
6327 if (tdsaAllShared->SASConnectTimeLimit)
6328 tdsaCTLSet(tiRoot, onePortContext, tiIntrEventTypeDeviceChange,
6336 tiIntrEventTypeDeviceChange,
6341 else if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6343 oneDeviceData->satDevData.IDDeviceValid == agTRUE )
6345 /* in case registration is finished after discovery is finished */
6350 tiIntrEventTypeDeviceChange,
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;
6362 case OSSA_FAILURE_DEVICE_ALREADY_REGISTERED: /* fall through */
6363 case OSSA_ERR_DEVICE_ALREADY_REGISTERED:
6365 TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_DEVICE_ALREADY_REGISTERED or OSSA_ERR_DEVICE_ALREADY_REGISTERED\n"));
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;
6372 case OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED: /* fall through */
6373 case OSSA_ERR_PHY_ID_ALREADY_REGISTERED:
6375 TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED or OSSA_ERR_PHY_ID_ALREADY_REGISTERED\n"));
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;
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))
6391 TI_DBG1(("ossaDeviceRegistrationCB: retries regisration\n"));
6393 //temp; setting MCN to tdsaAllShared->MCN
6394 oneDeviceData->agDeviceInfo.flag = oneDeviceData->agDeviceInfo.flag | (tdsaAllShared->MCN << 16);
6397 saRegisterNewDevice( /* ossaDeviceRegistrationCB */
6399 &oneDeviceData->agContext,
6401 &oneDeviceData->agDeviceInfo,
6402 onePortContext->agPortContext,
6406 else if (oneDeviceData->directlyAttached == agTRUE && DEVICE_IS_SATA_DEVICE(oneDeviceData))
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);
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;
6421 TI_DBG1(("ossaDeviceRegistrationCB: wrong. default status is %d\n", status));
6426 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ye");
6431 /*****************************************************************************/
6432 /*! \brief ossaDeregisterDeviceHandleCB
6435 * Purpose: This routine is called by lower layer to corresponding to
6436 * saDeregisterDeviceHandle()
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
6447 /*****************************************************************************/
6448 osGLOBAL void ossaDeregisterDeviceHandleCB(
6450 agsaContext_t *agContext,
6451 agsaDevHandle_t *agDevHandle,
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;
6465 dmRoot_t *dmRoot = &(tdsaAllShared->dmRoot);
6466 dmPortContext_t *dmPortContext = agNULL;
6467 dmPortInfo_t dmPortInfo;
6468 bit32 DMstatus = DM_RC_FAILURE;
6471 smRoot_t *smRoot = &(tdsaAllShared->smRoot);
6474 TI_DBG3(("ossaDeregisterDeviceHandleCB: start\n"));
6475 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yf");
6477 if (status == OSSA_ERR_DEVICE_HANDLE_INVALID)
6479 /* there is no device handle to process */
6480 TI_DBG2(("ossaDeregisterDeviceHandleCB: OSSA_ERR_DEVICE_HANDLE_INVALID\n"));
6484 oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
6485 onePortContext = oneDeviceData->tdPortContext;
6487 dmPortContext = &(onePortContext->dmPortContext);
6490 if (oneDeviceData->valid == agFALSE && oneDeviceData->valid2 == agFALSE &&
6491 oneDeviceData->DeviceType == TD_DEFAULT_DEVICE && onePortContext->valid == agTRUE)
6493 TI_DBG2(("ossaDeregisterDeviceHandleCB: transient did %d\n", oneDeviceData->id));
6497 if (onePortContext != agNULL)
6499 TI_DBG2(("ossaDeregisterDeviceHandleCB: pid %d registeredNumDevice %d\n", onePortContext->id, onePortContext->RegisteredDevNums));
6505 TI_DBG3(("ossaDeregisterDeviceHandleCB: Success\n"));
6506 if (onePortContext == agNULL)
6508 TI_DBG1(("ossaDeregisterDeviceHandleCB: onePortContext is NULL, wrong!\n"));
6511 /* port is going down */
6512 if (onePortContext->valid == agFALSE)
6514 if (!(oneDeviceData->valid == agFALSE && oneDeviceData->valid2 == agFALSE && oneDeviceData->DeviceType == TD_DEFAULT_DEVICE))
6516 /* remove oneDevice from MainLink */
6517 TI_DBG2(("ossaDeregisterDeviceHandleCB: delete from MainLink\n"));
6519 if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6521 TI_DBG1(("ossaDeregisterDeviceHandleCB: did %d calling smDeregisterDevice\n", oneDeviceData->id));
6522 smDeregisterDevice(smRoot, oneDeviceData->agDevHandle, &(oneDeviceData->smDeviceHandle));
6525 tdsaDeviceDataReInit(tiRoot, oneDeviceData);
6526 osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
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);
6533 /* for portcontext */
6534 PhyID = onePortContext->eventPhyID;
6535 TI_DBG3(("ossaDeregisterDeviceHandleCB: PhyID %d\n", PhyID));
6536 onePortContext->RegisteredDevNums--;
6538 check if valid in tdsaAllShared and the last registered device in a portcontext;
6539 if so, call saHwEventAck()
6541 if (tdsaAllShared->eventSource[PhyID].EventValid == agTRUE &&
6542 onePortContext->RegisteredDevNums == 0 &&
6546 TI_DBG2(("ossaDeregisterDeviceHandleCB: calling saHwEventAck\n"));
6547 eventSource = &(tdsaAllShared->eventSource[PhyID].Source);
6548 HwAckSatus = saHwEventAck(
6550 agNULL, /* agContext */
6552 eventSource, /* agsaEventSource_t */
6556 if ( HwAckSatus != AGSA_RC_SUCCESS)
6558 TI_DBG1(("ossaDeregisterDeviceHandleCB: failing in saHwEventAck; status %d\n", HwAckSatus));
6562 tdsaAllShared->eventSource[PhyID].EventValid = agFALSE;
6565 if (onePortContext->UseDM == agTRUE)
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)
6576 TI_DBG1(("ossaDeregisterDeviceHandleCB: dmDestroyPort failed!!! 0x%x\n", DMstatus));
6580 tdsaPortContextReInit(tiRoot, onePortContext);
6582 put all devices belonging to the onePortContext
6583 back to the free link
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);
6591 else if (tdsaAllShared->eventSource[PhyID].EventValid == NO_ACK &&
6592 onePortContext->RegisteredDevNums == 0
6595 TI_DBG2(("ossaDeregisterDeviceHandleCB: NO ACK case\n"));
6597 if (onePortContext->UseDM == agTRUE)
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)
6608 TI_DBG1(("ossaDeregisterDeviceHandleCB: dmDestroyPort failed!!! 0x%x\n", DMstatus));
6612 tdsaPortContextReInit(tiRoot, onePortContext);
6614 put all devices belonging to the onePortContext
6615 back to the free link
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);
6625 if (PhyID < TD_MAX_NUM_PHYS)
6627 TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d eventvalid %d registeredNumDevice %d\n", onePortContext->id, tdsaAllShared->eventSource[PhyID].EventValid , onePortContext->RegisteredDevNums));
6631 TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d registeredNumDevice %d wrong phyid %d\n", onePortContext->id, onePortContext->RegisteredDevNums, PhyID));
6637 PhyID = onePortContext->eventPhyID;
6638 TI_DBG3(("ossaDeregisterDeviceHandleCB: PhyID %d\n", PhyID));
6639 onePortContext->RegisteredDevNums--;
6641 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
6642 if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6644 smDeregisterDevice(smRoot, oneDeviceData->agDevHandle, &(oneDeviceData->smDeviceHandle));
6648 check if valid in tdsaAllShared and the last registered device in a portcontext;
6649 if so, call saHwEventAck()
6651 if (tdsaAllShared->eventSource[PhyID].EventValid == agTRUE &&
6652 onePortContext->RegisteredDevNums == 0 &&
6656 TI_DBG2(("ossaDeregisterDeviceHandleCB: calling saHwEventAck\n"));
6657 eventSource = &(tdsaAllShared->eventSource[PhyID].Source);
6658 HwAckSatus = saHwEventAck(
6660 agNULL, /* agContext */
6662 eventSource, /* agsaEventSource_t */
6666 if ( HwAckSatus != AGSA_RC_SUCCESS)
6668 TI_DBG1(("ossaDeregisterDeviceHandleCB: failing in saHwEventAck; status %d\n", HwAckSatus));
6672 tdsaAllShared->eventSource[PhyID].EventValid = agFALSE;
6674 #ifdef INITIATOR_DRIVER
6675 else if (onePortContext->RegisteredDevNums == 1)
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)
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;
6687 TI_DBG1(("ossaDeregisterDeviceHandleCB: not calling dmDiscover\n"));
6688 /* qqqqq needs to change discovery state to onePortContext->DMDiscoveryState == dmDiscCompleted
6690 change the discovery state from dmDiscFailed to dmDiscCompleted
6692 dmResetFailedDiscovery(dmRoot, dmPortContext);
6699 if (PhyID < TD_MAX_NUM_PHYS)
6701 TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d eventvalid %d registeredNumDevice %d\n", onePortContext->id, tdsaAllShared->eventSource[PhyID].EventValid , onePortContext->RegisteredDevNums));
6705 TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d registeredNumDevice %d wrong phyid %d\n", onePortContext->id, onePortContext->RegisteredDevNums, PhyID));
6710 case OSSA_INVALID_HANDLE:
6711 TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_INVALID_HANDLE\n"));
6714 case OSSA_FAILURE_DEVICE_DIRECT_ATTACH:
6715 TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_FAILURE_DEVICE_DIRECT_ATTACH\n"));
6718 case OSSA_ERR_DEVICE_HANDLE_INVALID:
6719 TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_ERR_DEVICE_HANDLE_INVALID\n"));
6721 case OSSA_ERR_DEVICE_BUSY:
6722 TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_ERR_DEVICE_BUSY\n"));
6725 TI_DBG1(("ossaDeregisterDeviceHandleCB: unknown status 0x%x\n", status));
6729 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yf");
6733 /*****************************************************************************/
6734 /*! \brief ossaDeviceHandleRemovedEvent
6737 * Purpose: This routine is called by lower layer to notify the device removal
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.
6749 /*****************************************************************************/
6750 osGLOBAL void ossaDeviceHandleRemovedEvent (
6752 agsaDevHandle_t *agDevHandle,
6753 agsaPortContext_t *agPortContext
6757 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6758 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6760 tdsaPortContext_t *onePortContext = agNULL;
6761 tdsaDeviceData_t *oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
6763 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yg");
6764 TI_DBG2(("ossaDeviceHandleRemovedEvent: start\n"));
6765 if (oneDeviceData == agNULL)
6767 TI_DBG1(("ossaDeviceHandleRemovedEvent: Wrong! oneDeviceData is NULL\n"));
6768 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yg");
6771 TI_DBG2(("ossaDeviceHandleRemovedEvent: did %d\n", oneDeviceData->id));
6772 oneDeviceData->registered = agFALSE;
6773 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
6774 if (onePortContext == agNULL)
6776 TI_DBG1(("ossaDeviceHandleRemovedEvent: Wrong! onePortContext is NULL\n"));
6777 smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Yg");
6780 TI_DBG2(("ossaDeviceHandleRemovedEvent: pid %d\n", onePortContext->id));
6781 onePortContext->RegisteredDevNums--;
6785 onePortContext->tiPortalContext,
6787 tiIntrEventTypeDeviceChange,
6793 smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Yg");
6797 #ifdef SPC_ENABLE_PROFILE
6798 /*****************************************************************************/
6799 /*! \brief ossaFwProfileCB
6802 * Purpose: This routine is called by lower layer to corresponding to
6805 * \param agRoot: Pointer to chip/driver Instance.
6806 * \param agContext: Context of the operation originally passed
6807 * into saFwProfile()
6808 * \param status: status
6814 /*****************************************************************************/
6815 osGLOBAL void ossaFwProfileCB(
6817 agsaContext_t *agContext,
6821 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6822 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6824 TI_DBG2(("ossaFwProfileCB: start\n"));
6828 case AGSA_RC_SUCCESS:
6830 TI_DBG2(("ossaFwProfileCB: SUCCESS\n"));
6833 case AGSA_RC_FAILURE:
6835 TI_DBG1(("ossaFwProfileCB: FAIL\n"));
6840 TI_DBG1(("ossaFwProfileCB: !!! default, status %d\n", status));
6845 ostiFWProfileIOCTLRsp(tiRoot, status, len);
6849 /*****************************************************************************/
6850 /*! \brief ossaFwFlashUpdateCB
6853 * Purpose: This routine is called by lower layer to corresponding to
6856 * \param agRoot: Pointer to chip/driver Instance.
6857 * \param agContext: Context of the operation originally passed
6858 * into saFwFlashUpdate()
6859 * \param status: status
6865 /*****************************************************************************/
6866 osGLOBAL void ossaFwFlashUpdateCB(
6868 agsaContext_t *agContext,
6872 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6873 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6875 TI_DBG2(("ossaFwFlashUpdateCB: start\n"));
6877 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yh");
6880 case OSSA_FLASH_UPDATE_COMPLETE_PENDING_REBOOT:
6882 TI_DBG2(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_COMPLETE_PENDING_REBOOT\n"));
6885 case OSSA_FLASH_UPDATE_IN_PROGRESS:
6887 TI_DBG2(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_IN_PROGRESS\n"));
6890 case OSSA_FLASH_UPDATE_HDR_ERR:
6892 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_HDR_ERR\n"));
6895 case OSSA_FLASH_UPDATE_OFFSET_ERR:
6897 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_OFFSET_ERR\n"));
6900 case OSSA_FLASH_UPDATE_CRC_ERR:
6902 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_CRC_ERR\n"));
6905 case OSSA_FLASH_UPDATE_LENGTH_ERR:
6907 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_LENGTH_ERR\n"));
6910 case OSSA_FLASH_UPDATE_HW_ERR:
6912 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_HW_ERR\n"));
6915 case OSSA_FLASH_UPDATE_DNLD_NOT_SUPPORTED:
6917 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_DNLD_NOT_SUPPORTED\n"));
6920 case OSSA_FLASH_UPDATE_DISABLED:
6922 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_DISABLED\n"));
6925 case OSSA_FLASH_FWDNLD_DEVICE_UNSUPPORT:
6927 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_FWDNLD_DEVICE_UNSUPPORT\n"));
6930 case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
6932 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE\n"));
6935 case OSSA_FLASH_UPDATE_HMAC_ERR:
6937 TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_HMAC_ERR\n"));
6943 TI_DBG1(("ossaFwFlashUpdateCB: !!! default, status 0x%X\n", status));
6948 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yh");
6949 ostiCOMMgntIOCTLRsp(tiRoot, status);
6955 GLOBAL void ossaFlashExtExecuteCB(
6957 agsaContext_t *agContext,
6960 agsaFlashExtResponse_t *agFlashExtRsp)
6962 TI_DBG1(("ossaFlashExtExecuteCB: command 0x%X status 0x%X\n",command, status));
6968 /*****************************************************************************/
6969 /*! \brief ossaGetNVMDResponseCB
6972 * Purpose: This routine is called by lower layer to corresponding to
6973 * saGetNVMDCommand()
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
6988 /*****************************************************************************/
6989 osGLOBAL void ossaGetNVMDResponseCB(
6991 agsaContext_t *agContext,
6993 bit8 indirectPayload,
6995 agsaFrameHandle_t agFrameHandle
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");
7004 if (status == OSSA_SUCCESS)
7006 TI_DBG2(("ossaGetNVMDResponseCB: Success status\n"));
7007 if (indirectPayload == 0 && agInfoLen != 0)
7009 TI_DBG2(("ossaGetNVMDResponseCB: direct\n"));
7010 tdhexdump("ossaGetNVMDResponseCB", (bit8 *)agFrameHandle, agInfoLen);
7015 TI_DBG1(("ossaGetNVMDResponseCB: Status 0x%x\n", status));
7018 if (indirectPayload == 0)
7020 TI_DBG2(("ossaGetNVMDResponseCB: direct\n"));
7024 TI_DBG2(("ossaGetNVMDResponseCB: indirect\n"));
7027 ostiGetNVMDIOCTLRsp(tiRoot, status);
7028 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yi");
7033 /*****************************************************************************/
7034 /*! \brief ossaSetNVMDResponseCB
7037 * Purpose: This routine is called by lower layer to corresponding to
7038 * saSetNVMDCommand()
7040 * \param agRoot: Pointer to chip/driver Instance.
7041 * \param agContext: Context of the operation originally passed
7042 * into saSetVPDCommand()
7043 * \param status: status
7049 /*****************************************************************************/
7050 osGLOBAL void ossaSetNVMDResponseCB(
7052 agsaContext_t *agContext,
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)
7062 TI_DBG2(("ossaSetNVMDResponseCB: success\n"));
7066 TI_DBG1(("ossaSetNVMDResponseCB: fail or undefined staus %d\n", status));
7068 ostiSetNVMDIOCTLRsp(tiRoot, status);
7069 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yj");
7075 /*****************************************************************************/
7076 /*! \brief ossaGetVPDResponseCB
7079 * Purpose: This routine is called by lower layer to corresponding to
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
7093 /*****************************************************************************/
7094 osGLOBAL void ossaGetVPDResponseCB(
7096 agsaContext_t *agContext,
7100 agsaFrameHandle_t agFrameHandle
7105 TI_DBG2(("ossaGetVPDResponseCB: start\n"));
7107 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yk");
7108 if (status == OSSA_SUCCESS)
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);
7121 TI_DBG1(("ossaGetVPDResponseCB: fail or undefined staus %d\n", status));
7123 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yk");
7128 /*****************************************************************************/
7129 /*! \brief ossaSetVPDResponseCB
7132 * Purpose: This routine is called by lower layer to corresponding to
7135 * \param agRoot: Pointer to chip/driver Instance.
7136 * \param agContext: Context of the operation originally passed
7137 * into saSetVPDCommand()
7138 * \param status: status
7144 /*****************************************************************************/
7145 osGLOBAL void ossaSetVPDResponseCB(
7147 agsaContext_t *agContext,
7151 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7152 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7154 TI_DBG2(("ossaSetVPDResponseCB: start\n"));
7155 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yl");
7157 if (status == OSSA_SUCCESS)
7159 TI_DBG2(("ossaSetVPDResponseCB: success\n"));
7160 ostiCOMMgntVPDSetIOCTLRsp(tiRoot, 0);
7166 /* temporary to test saSetVPDCommand() and saGetVPDCommand */
7173 TI_DBG1(("ossaSetVPDResponseCB: fail or undefined staus %d\n", status));
7175 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yl");
7180 /*****************************************************************************/
7181 /*! \brief ossaEchoCB
7184 * Purpose: This routine is called by lower layer to corresponding to
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
7196 /*****************************************************************************/
7197 osGLOBAL void ossaEchoCB(
7199 agsaContext_t *agContext,
7204 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7205 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7209 TI_DBG2(("ossaEchoCB: start\n"));
7210 smTraceFuncEnter(hpDBG_VERY_LOUD,"Ym");
7212 /* dumping received echo payload is 56 bytes */
7213 tdhexdump("ossaEchoCB: echoPayload", (bit8 *)(echoPayload), 56);
7216 /* temporary to test saEchoCommand() */
7218 /* new echo payload */
7219 osti_memset(payload,0, sizeof(payload));
7222 payload[55] = gEcho;
7224 TI_DBG2(("ossaEchoCB: gEcho %d\n", gEcho));
7226 saEchoCommand(agRoot, agNULL, tdsaRotateQnumber(tiRoot, agNULL), (void *)&payload);
7238 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ym");
7242 /*****************************************************************************/
7243 /*! \brief ossaGpioResponseCB
7246 * Purpose: This routine is called by lower layer to corresponding to
7247 * saGpioEventSetup(), saGpioPinSetup(), saGpioRead(), or
7250 * \param agRoot: Pointer to chip/driver Instance.
7251 * \param agContext: Context of the operation originally passed
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
7265 /*****************************************************************************/
7266 osGLOBAL void ossaGpioResponseCB(
7268 agsaContext_t *agContext,
7270 bit32 gpioReadValue,
7271 agsaGpioPinSetupInfo_t *gpioPinSetupInfo,
7272 agsaGpioEventSetupInfo_t *gpioEventSetupInfo
7275 TI_DBG2(("ossaGpioResponseCB: start\n"));
7276 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yn");
7277 if (status == OSSA_SUCCESS)
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));
7291 TI_DBG1(("ossaGpioResponseCB: Failure\n"));
7293 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yn");
7297 /*****************************************************************************/
7298 /*! \brief ossaGpioEvent
7301 * Purpose: This routine is called by lower layer to corresponding to
7302 * saGpioEventSetup(), saGpioPinSetup(), saGpioRead(), or
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.
7313 /*****************************************************************************/
7314 osGLOBAL void ossaGpioEvent(
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");
7327 /*****************************************************************************/
7328 /*! \brief ossaSASDiagExecuteCB
7331 * Purpose: This routine is called by lower layer to corresponding to
7332 * saSASDiagExecute()
7334 * \param agRoot: Pointer to chip/driver Instance.
7335 * \param agContext: Context of the operation originally passed
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
7346 /*****************************************************************************/
7347 osGLOBAL void ossaSASDiagExecuteCB(
7349 agsaContext_t *agContext,
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));
7360 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yq");
7366 /*****************************************************************************/
7367 /*! \brief ossaSASDiagStartEndCB
7370 * Purpose: This routine is called by lower layer to corresponding to
7371 * saSASDiagExecute()
7373 * \param agRoot: Pointer to chip/driver Instance.
7374 * \param agContext: Context of the operation originally passed
7376 * \param status: Diagnostic operation completion status
7382 /*****************************************************************************/
7383 osGLOBAL void ossaSASDiagStartEndCB(
7385 agsaContext_t *agContext,
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");
7395 /*****************************************************************************/
7396 /*! \brief ossaReconfigSASParamsCB
7399 * Purpose: This routine is called by lower layer to corresponding to
7400 * saReconfigSASParams()
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
7412 /*****************************************************************************/
7413 osGLOBAL void ossaReconfigSASParamsCB(
7415 agsaContext_t *agContext,
7417 agsaSASReconfig_t *agSASConfig)
7419 TI_DBG2(("ossaReconfigSASParamsCB: status %d\n", status));
7423 GLOBAL void ossaPCIeDiagExecuteCB(
7425 agsaContext_t *agContext,
7428 agsaPCIeDiagResponse_t *resp )
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 ));
7444 GLOBAL void ossaSGpioCB(
7446 agsaContext_t *agContext,
7447 agsaSGpioReqResponse_t *pSgpioResponse
7450 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7451 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
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);
7459 tdhexdump("ossaSGpioCB Response", (bit8 *)pSgpioResponse, sizeof(agsaSGpioReqResponse_t));
7460 ostiSgpioIoctlRsp(tiRoot, pSgpioResponse);
7465 /*****************************************************************************/
7466 /*! \brief ossaLogDebugString
7469 * Purpose: This routine is called by lower layer to log.
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.
7482 /*****************************************************************************/
7483 GLOBAL void ossaLogDebugString(
7493 #if defined(SALLSDK_DEBUG)
7494 TIDEBUG_MSG(gLLDebugLevel, level, ("%s %p %p %d %d\n", string, ptr1, ptr2, value1, value2));
7499 /*****************************************************************************/
7500 /*! \brief ossaHwEventAckCB
7503 * Purpose: This routine is called by lower layer to corresponding to
7506 * \param agRoot: Pointer to chip/driver Instance.
7507 * \param agContext: Context of the operation originally passed
7509 * \param status: Status
7515 /*****************************************************************************/
7516 GLOBAL void ossaHwEventAckCB(
7518 agsaContext_t *agContext,
7522 TI_DBG3(("ossaHwEventAckCB: start\n"));
7523 smTraceFuncEnter(hpDBG_VERY_LOUD,"Ys");
7524 if (status == tiSuccess)
7526 TI_DBG3(("ossaHwEventAckCB: SUCCESS status\n"));
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));
7537 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ys");
7541 /*****************************************************************************/
7542 /*! \brief ossaGetTimeStampCB
7545 * Purpose: This routine is called by lower layer to corresponding to
7548 * \param agRoot: Pointer to chip/driver Instance.
7549 * \param agContext: Context of the operation originally passed
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.
7560 /*****************************************************************************/
7561 GLOBAL void ossaGetTimeStampCB(
7563 agsaContext_t *agContext,
7564 bit32 timeStampLower,
7565 bit32 timeStampUpper
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");
7576 /*****************************************************************************/
7577 /*! \brief ossaSMPAbortCB
7580 * Purpose: This routine is called by lower layer to corresponding to
7583 * \param agRoot: Pointer to chip/driver Instance.
7584 * \param agIORequest: This is the agIORequest parameter passed in
7586 * \param status: Status of abort
7591 /*****************************************************************************/
7592 GLOBAL void ossaSMPAbortCB(
7594 agsaIORequest_t *agIORequest,
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;
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");
7609 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
7610 if (tdAbortIORequestBody == agNULL)
7612 TI_DBG1(("ossaSMPAbortCB: tdAbortIORequestBody is NULL warning!!!!\n"));
7618 /* abort per port */
7619 TI_DBG2(("ossaSMPAbortCB: abort per port\n"));
7623 TI_DBG2(("ossaSMPAbortCB: abort all\n"));
7625 tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
7626 if (tiDeviceHandle == agNULL)
7628 TI_DBG1(("ossaSMPAbortCB: tiDeviceHandle is NULL warning!!!!\n"));
7631 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7632 sizeof(tdIORequestBody_t)
7637 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
7638 if (oneDeviceData == agNULL)
7640 TI_DBG1(("ossaSMPAbortCB: oneDeviceData is NULL warning!!!!\n"));
7643 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7644 sizeof(tdIORequestBody_t)
7649 if (status == OSSA_IO_SUCCESS)
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));
7658 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7659 sizeof(tdIORequestBody_t)
7663 else if (status == OSSA_IO_NOT_VALID)
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));
7672 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7673 sizeof(tdIORequestBody_t)
7676 else if (status == OSSA_IO_NO_DEVICE)
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));
7685 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7686 sizeof(tdIORequestBody_t)
7689 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
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));
7698 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7699 sizeof(tdIORequestBody_t)
7703 else if (status == OSSA_IO_ABORT_DELAYED)
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));
7712 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7713 sizeof(tdIORequestBody_t)
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));
7726 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7727 sizeof(tdIORequestBody_t)
7733 TI_DBG2(("ossaSMPAbortCB: abort one\n"));
7734 if (status == OSSA_IO_SUCCESS)
7736 TI_DBG2(("ossaSMPAbortCB: OSSA_IO_SUCCESS\n"));
7739 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7740 sizeof(tdIORequestBody_t)
7744 else if (status == OSSA_IO_NOT_VALID)
7746 TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NOT_VALID\n"));
7749 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7750 sizeof(tdIORequestBody_t)
7753 else if (status == OSSA_IO_NO_DEVICE)
7755 TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NO_DEVICE\n"));
7758 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7759 sizeof(tdIORequestBody_t)
7762 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
7764 TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
7767 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7768 sizeof(tdIORequestBody_t)
7772 else if (status == OSSA_IO_ABORT_DELAYED)
7774 TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
7777 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7778 sizeof(tdIORequestBody_t)
7784 TI_DBG1(("ossaSMPAbortCB: other status %d\n", status));
7787 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7788 sizeof(tdIORequestBody_t)
7794 TI_DBG1(("ossaSMPAbortCB: wrong flag %d\n", flag));
7798 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yu");
7802 /*****************************************************************************/
7803 /*! \brief ossaGeneralEvent
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.
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
7818 /*****************************************************************************/
7819 GLOBAL void ossaGeneralEvent(
7822 agsaContext_t *agContext,
7825 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7826 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7828 TI_DBG1(("ossaGeneralEvent: start\n"));
7829 TI_DBG1(("ossaGeneralEvent: status %d\n", status));
7833 TI_DBG1(("ossaGeneralEvent: *msg %X\n", *msg));
7836 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yv");
7837 ostiGenEventIOCTLRsp(tiRoot, status);
7838 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yv");
7842 GLOBAL void ossaGetForensicDataCB (
7844 agsaContext_t *agContext,
7846 agsaForensicData_t *forensicData)
7848 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7849 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7851 ostiGetForensicDataIOCTLRsp(tiRoot, status, forensicData);
7856 #ifdef INITIATOR_DRIVER
7858 GLOBAL void ossaGetIOErrorStatsCB (
7860 agsaContext_t *agContext,
7862 agsaIOErrorEventStats_t *stats)
7865 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7866 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7868 ostiGetIoErrorStatsIOCTLRsp(tiRoot, status, stats);
7871 GLOBAL void ossaGetIOErrorStatsCB (
7873 agsaContext_t *agContext,
7875 agsaIOErrorEventStats_t *stats)
7883 GLOBAL void ossaGetIOEventStatsCB (
7885 agsaContext_t *agContext,
7887 agsaIOErrorEventStats_t *stats)
7890 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7891 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7893 ostiGetIoEventStatsIOCTLRsp(tiRoot, status, stats);
7897 /*****************************************************************************/
7898 /*! \brief ossaGetRegisterDumpCB
7901 * Purpose: ossaGetRegisterDumpCB() is the response callback function
7902 * called by the LL Layer to indicate a response to
7903 * saGetRegisterDump()
7905 * \param agRoot: Pointer to chip/driver Instance.
7906 * \param agContext: Context of the operation originally
7907 * passed into saGetRegisterDump()
7908 * \param status: status
7913 /*****************************************************************************/
7914 GLOBAL void ossaGetRegisterDumpCB(
7916 agsaContext_t *agContext,
7920 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7921 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7923 TI_DBG4(("ossaGetRegisterDumpCB: start\n"));
7924 TI_DBG4(("ossaGetRegisterDumpCB: status %d\n", status));
7925 smTraceFuncEnter(hpDBG_VERY_LOUD,"Yw");
7927 ostiRegDumpIOCTLRsp(tiRoot, status);
7928 smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yw");
7932 /*****************************************************************************/
7933 /*! \brief ossaSetDeviceStateCB
7936 * Purpose: ossaSetDeviceStateCB() is the response callback function
7937 * called by the LL Layer to indicate a response to
7938 * saSetDeviceState()
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
7951 /*****************************************************************************/
7952 GLOBAL void ossaSetDeviceStateCB(
7954 agsaContext_t *agContext,
7955 agsaDevHandle_t *agDevHandle,
7957 bit32 newDeviceState,
7958 bit32 previousDeviceState
7961 tdsaDeviceData_t *oneDeviceData = agNULL;
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));
7968 if (agDevHandle == agNULL)
7970 TI_DBG4(("ossaSetDeviceStateCB: agDevHandle is NULL\n"));
7974 oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
7976 if (oneDeviceData == agNULL)
7978 TI_DBG1(("ossaSetDeviceStateCB: wrong; oneDeviceData is NULL\n"));
7982 TI_DBG2(("ossaSetDeviceStateCB: did %d\n", oneDeviceData->id));
7988 /*****************************************************************************/
7989 /*! \brief ossaGetDeviceStateCB
7992 * Purpose: ossaGetDeviceStateCB() is the response callback function
7993 * called by the LL Layer to indicate a response to
7994 * saGetDeviceState()
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
8006 /*****************************************************************************/
8007 GLOBAL void ossaGetDeviceStateCB(
8009 agsaContext_t *agContext,
8010 agsaDevHandle_t *agDevHandle,
8015 TI_DBG4(("ossaGetDeviceStateCB: start\n"));
8016 TI_DBG4(("ossaGetDeviceStateCB: status %d\n", status));
8017 TI_DBG4(("ossaGetDeviceStateCB: deviceState %d\n", deviceState));
8022 #ifdef INITIATOR_DRIVER
8023 /*****************************************************************************/
8024 /*! \brief ossaIniSetDeviceInfoCB
8027 * Purpose: ossaIniSetDeviceInfoCB() is the response callback function
8028 * called by the LL Layer to indicate a response to
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()
8042 /*****************************************************************************/
8044 ossaIniSetDeviceInfoCB(
8046 agsaContext_t *agContext,
8047 agsaDevHandle_t *agDevHandle,
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;
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));
8070 if (status != OSSA_SUCCESS)
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 */
8077 TI_DBG1(("ossaIniSetDeviceInfoCB: IO failure\n"));
8078 agIORequest = (agsaIORequest_t *)agContext->osData;
8079 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
8080 ostiInitiatorIOCompleted(
8082 tdIORequestBody->tiIORequest,
8090 if (agDevHandle == agNULL)
8092 TI_DBG4(("ossaIniSetDeviceInfoCB: agDevHandle is NULL\n"));
8095 oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
8096 if (oneDeviceData == agNULL)
8098 TI_DBG1(("ossaIniSetDeviceInfoCB: wrong; oneDeviceData is NULL\n"));
8103 TI_DBG4(("ossaIniSetDeviceInfoCB: did %d\n", oneDeviceData->id));
8107 if (option == 32) /* set connection rate */
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 )
8119 saStatus = saSSPStart(agRoot,
8121 tdsaRotateQnumber(tiRoot, oneDeviceData),
8123 tdIORequestBody->agRequestType,
8124 &(tdIORequestBody->transport.SAS.agSASRequestBody),
8127 if (saStatus == AGSA_RC_SUCCESS)
8129 TI_DBG1(("ossaIniSetDeviceInfoCB: retried\n"));
8130 Initiator->NumIOsActive++;
8131 tdIORequestBody->ioStarted = agTRUE;
8132 tdIORequestBody->ioCompleted = agFALSE;
8137 TI_DBG1(("ossaIniSetDeviceInfoCB: retry failed\n"));
8138 tdIORequestBody->ioStarted = agFALSE;
8139 tdIORequestBody->ioCompleted = agTRUE;
8140 ostiInitiatorIOCompleted(
8142 tdIORequestBody->tiIORequest,
8154 /*****************************************************************************/
8155 /*! \brief ossaSetDeviceInfoCB
8158 * Purpose: ossaSetDeviceInfoCB() is the response callback function
8159 * called by the LL Layer to indicate a response to
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()
8173 /*****************************************************************************/
8174 GLOBAL void ossaSetDeviceInfoCB(
8176 agsaContext_t *agContext,
8177 agsaDevHandle_t *agDevHandle,
8183 tdsaDeviceData_t *oneDeviceData = agNULL;
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));
8190 if (status != OSSA_SUCCESS)
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));
8197 if (agDevHandle == agNULL)
8199 TI_DBG4(("ossaSetDeviceInfoCB: agDevHandle is NULL\n"));
8203 oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
8205 if (oneDeviceData == agNULL)
8207 TI_DBG1(("ossaSetDeviceInfoCB: wrong; oneDeviceData is NULL\n"));
8211 TI_DBG4(("ossaSetDeviceInfoCB: did %d\n", oneDeviceData->id));
8217 /*****************************************************************************/
8218 /*! \brief ossaGetDFEDataCB
8221 * Purpose: ossaGetDFEDataCB() is the response callback function
8222 * called by the LL Layer to indicate a response to
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
8234 /*****************************************************************************/
8235 GLOBAL void ossaGetDFEDataCB(
8237 agsaContext_t *agContext,
8241 TI_DBG1(("ossaGetDFEDataCB: start\n"));
8242 TI_DBG1(("ossaGetDFEDataCB: status 0x%x agInfoLen 0x%x\n", status, agInfoLen));
8246 /*****************************************************************************/
8247 /*! \brief ossaVhistCaptureCB
8250 * Purpose: ossaVhistCaptureCB() is the response callback function
8251 * called by the LL Layer to indicate a response to
8254 * \param agRoot: Pointer to chip/driver Instance.
8255 * \param agContext: Context of the operation originally
8257 * \param status: status
8258 * \param len: length in bytes of Vis data captured and transferred
8263 /*****************************************************************************/
8265 void ossaVhistCaptureCB(
8267 agsaContext_t *agContext,
8271 TI_DBG1(("ossaVhistCaptureCB: start\n"));
8272 TI_DBG1(("ossaVhistCaptureCB: status 0x%x agInfoLen 0x%x\n", status,len ));
8276 GLOBAL void ossaOperatorManagementCB(
8278 agsaContext_t *agContext,
8283 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8284 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8285 tiEncryptPort_t encryptEventData;
8287 TI_DBG1(("ossaOperatorManagementCB: status 0x%x eq 0x%x\n", status, eq));
8289 osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
8290 encryptEventData.encryptEvent = tiEncryptOperatorManagement;
8291 encryptEventData.subEvent = eq;
8292 encryptEventData.pData = agNULL;
8294 ostiPortEvent(tiRoot,
8300 GLOBAL void ossaEncryptSelftestExecuteCB (
8302 agsaContext_t *agContext,
8309 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8310 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8311 tiEncryptPort_t encryptEventData;
8313 TI_DBG1(("ossaEncryptSelftestExecuteCB: status 0x%x type 0x%x length 0x%x\n", status, type, length));
8315 osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
8316 encryptEventData.encryptEvent = tiEncryptSelfTest;
8317 encryptEventData.subEvent = type;
8318 encryptEventData.pData = (void*)TestResult;
8320 ostiPortEvent(tiRoot,
8326 GLOBAL void ossaGetOperatorCB(
8328 agsaContext_t *agContext,
8337 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8338 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8339 tiEncryptPort_t encryptEventData;
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;
8351 case OSSA_IO_SUCCESS:
8352 TI_DBG1(("ossaGetOperatorCB: OSSA_IO_SUCCESS option 0x%x\n", option));
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)
8365 TI_DBG1(("ossaGetOperatorCB: number operators 0x%02x\n", num ));
8368 encryptEventData.pData = id;
8370 case OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION:
8371 TI_DBG1(("ossaGetOperatorCB: OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION 0x%x\n",option));
8373 case OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE:
8374 TI_DBG1(("ossaGetOperatorCB: OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE 0x%x\n",option));
8377 TI_DBG1(("ossaGetOperatorCB: Unknown status 0x%x\n",status));
8379 ostiPortEvent(tiRoot,
8386 GLOBAL void ossaSetOperatorCB(
8388 agsaContext_t *agContext,
8393 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8394 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8395 tiEncryptPort_t encryptEventData;
8397 TI_DBG1(("ossaSetOperatorCB: agContext %p status 0x%x eq 0x%x\n",agContext, status, eq));
8399 osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
8400 encryptEventData.encryptEvent = tiEncryptSetOperator;
8401 encryptEventData.subEvent = 0;
8404 case OSSA_IO_SUCCESS:
8405 TI_DBG1(("ossaSetOperatorCB: OSSA_IO_SUCCESS\n"));
8406 encryptEventData.pData = agNULL;
8408 case OSSA_MPI_ENC_ERR_CONTROLLER_NOT_IDLE:
8409 TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_ERR_CONTROLLER_NOT_IDLE\n"));
8411 case OSSA_MPI_ENC_OPERATOR_AUTH_FAILURE:
8412 TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_OPERATOR_AUTH_FAILURE error qualifier 0x%x\n",eq));
8414 case OSSA_MPI_ENC_OPERATOR_OPERATOR_ALREADY_LOGGED_IN:
8415 TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_OPERATOR_OPERATOR_ALREADY_LOGGED_IN\n"));
8417 case OSSA_MPI_ENC_OPERATOR_ILLEGAL_PARAMETER:
8418 TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_OPERATOR_ILLEGAL_PARAMETER\n"));
8420 case OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION:
8421 TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION\n"));
8423 case OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE:
8424 TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE\n"));
8427 TI_DBG1(("ossaGetOperatorCB: Unknown status 0x%x\n",status));
8429 ostiPortEvent(tiRoot,
8435 GLOBAL void ossaDIFEncryptionOffloadStartCB(
8437 agsaContext_t *agContext,
8439 agsaOffloadDifDetails_t *agsaOffloadDifDetails)
8441 TI_DBG1(("ossaDIFEncryptionOffloadStartCB: start\n"));
8442 TI_DBG1(("ossaDIFEncryptionOffloadStartCB: status 0x%x agsaOffloadDifDetails=%p\n", status, agsaOffloadDifDetails));
8446 GLOBAL bit32 ossaTimeStamp( agsaRoot_t *agRoot )
8448 tdsaRootOsData_t *osData= agNULL;
8449 tiRoot_t *tiRoot= agNULL;
8452 osData = (tdsaRootOsData_t *)agRoot->osData;
8456 tiRoot = (tiRoot_t *)osData->tiRoot;
8458 return(ostiTimeStamp(tiRoot));
8461 GLOBAL bit64 ossaTimeStamp64( agsaRoot_t *agRoot)
8463 tdsaRootOsData_t *osData= agNULL;
8464 tiRoot_t *tiRoot= agNULL;
8467 osData = (tdsaRootOsData_t *)agRoot->osData;
8471 tiRoot = (tiRoot_t *)osData->tiRoot;
8473 return(ostiTimeStamp64(tiRoot));
8478 tdIDStartTimer(tiRoot_t *tiRoot,
8479 smIORequest_t *smIORequest,
8480 tdsaDeviceData_t *oneDeviceData
8483 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
8484 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8485 itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
8487 TI_DBG1(("tdIDStartTimer: start\n"));
8489 tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
8490 if (oneDeviceData->tdIDTimer.timerRunning == agTRUE)
8492 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
8495 &oneDeviceData->tdIDTimer
8500 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
8503 tdsaSetTimerRequest(
8505 &oneDeviceData->tdIDTimer,
8506 SATA_ID_DEVICE_DATA_TIMER_VALUE/Initiator->OperatingOption.UsecsPerTick,
8515 &Initiator->timerlist,
8516 &oneDeviceData->tdIDTimer
8518 TI_DBG1(("tdIDStartTimer: end\n"));
8530 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
8531 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8532 smIORequest_t *smIORequest;
8533 tdsaDeviceData_t *oneDeviceData;
8535 tdIORequestBody_t *tdIORequestBody;
8536 smDeviceHandle_t *smDeviceHandle;
8537 tdsaPortContext_t *onePortContext;
8543 agsaIORequest_t *agAbortIORequest = agNULL;
8544 tdIORequestBody_t *tdAbortIORequestBody = agNULL;
8547 bit32 memAllocStatus;
8550 #ifdef TD_DEBUG_ENABLE
8551 bit32 status = AGSA_RC_FAILURE;
8554 TI_DBG1(("tdIDStartTimerCB start\n"));
8555 smIORequest = (smIORequest_t *)timerData1;
8556 oneDeviceData = (tdsaDeviceData_t *)timerData2;
8557 smRoot = &(tdsaAllShared->smRoot);
8559 agRoot = oneDeviceData->agRoot;
8562 if (smIORequest == agNULL)
8564 TI_DBG1(("tdIDStartTimerCB: smIORequest == agNULL !!!!!!\n"));
8568 if (oneDeviceData == agNULL)
8570 TI_DBG1(("tdIDStartTimerCB: oneDeviceData == agNULL !!!!!!\n"));
8574 if (oneDeviceData->satDevData.IDPending == agFALSE || oneDeviceData->satDevData.IDDeviceValid == agTRUE)
8576 /*the Identify Device command already normally completed, just return*/
8580 tdIORequestBody = (tdIORequestBody_t *)smIORequest->tdData;
8581 smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
8582 onePortContext = oneDeviceData->tdPortContext;
8583 if (tdIORequestBody == agNULL)
8585 TI_DBG1(("tdIDStartTimerCB: tdIORequestBody == agNULL !!!!!!\n"));
8589 if (smDeviceHandle == agNULL)
8591 TI_DBG1(("tdIDStartTimerCB: smDeviceHandle == agNULL !!!!!!\n"));
8595 if (onePortContext == agNULL)
8597 TI_DBG1(("tdIDStartTimerCB: onePortContext == agNULL !!!!!!\n"));
8601 TI_DBG1(("tdIDStartTimerCB: did %d\n", oneDeviceData->id));
8604 2. in tdsmIDCompletedCB(), retry
8606 if (oneDeviceData->valid == agFALSE)
8608 TI_DBG1(("tdIDStartTimerCB: invalid device\n"));
8611 #ifdef TD_DEBUG_ENABLE
8612 status = smIOAbort( smRoot, smIORequest );
8614 smIOAbort( smRoot, smIORequest );
8618 /* allocating agIORequest for abort itself */
8619 memAllocStatus = ostiAllocMemory(
8622 (void **)&tdAbortIORequestBody,
8626 sizeof(tdIORequestBody_t),
8629 if (memAllocStatus != tiSuccess)
8631 /* let os process IO */
8632 TI_DBG1(("tdIDStartTimerCB: ostiAllocMemory failed...; can't retry ID data \n"));
8635 if (tdAbortIORequestBody == agNULL)
8637 /* let os process IO */
8638 TI_DBG1(("tdIDStartTimerCB: ostiAllocMemory returned NULL tdAbortIORequestBody; can't retry ID data\n"));
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 */
8653 status = saSATAAbort(agRoot,
8656 oneDeviceData->agDevHandle,
8661 status = saSATAAbort(agRoot,
8664 oneDeviceData->agDevHandle,
8671 if (status != AGSA_RC_SUCCESS)
8673 TI_DBG1(("tdIDStartTimerCB: saSATAAbort failed; can't retry ID data\n"));
8675 if (oneDeviceData->satDevData.IDDeviceValid == agTRUE)
8677 TI_DBG1(("tdIDStartTimerCB: IDDeviceValid is valid, no need to retry\n"));
8680 if (tdIORequestBody->reTries <= SM_RETRIES)
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)
8690 TI_DBG1(("tdIDStartTimerCB: being retried!!!\n"));
8691 tdIORequestBody->reTries++;
8692 tdIORequestBody->ioCompleted = agFALSE;
8693 tdIORequestBody->ioStarted = agTRUE;
8694 tdIDStartTimer(tiRoot, smIORequest, oneDeviceData);
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)
8707 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
8708 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
8715 TI_DBG1(("tdIDStartTimerCB: retries are over!!!\n"));
8716 if (oneDeviceData->tdIDTimer.timerRunning == agTRUE)
8718 tdsaKillTimer( tiRoot, &oneDeviceData->tdIDTimer );
8720 tdIORequestBody->reTries = 0;
8721 tdIORequestBody->ioCompleted = agTRUE;
8722 tdIORequestBody->ioStarted = agFALSE;
8725 tdIORequestBody->osMemHandle,
8726 sizeof(tdIORequestBody_t)
8728 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
8730 if (oneDeviceData->SMNumOfID <= 0) /* does SMP HARD RESET only upto one time */
8732 TI_DBG1(("tdIDStartTimerCB: fail; sending HARD_RESET\n"));
8733 oneDeviceData->SMNumOfID++;
8734 if (oneDeviceData->directlyAttached == agTRUE)
8736 saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_HARD_RESET, agNULL);
8740 tdsaPhyControlSend(tiRoot,
8742 SMP_PHY_CONTROL_HARD_RESET,
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)
8752 smReportRemovalDirect(tiRoot, agRoot, oneDeviceData);
8756 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
8762 TI_DBG1(("tdIDStartTimerCB: end, smIOAbort status %d\n", status));
8768 #if defined(FDS_DM) && defined(FDS_SM)
8775 tdsaDeviceData_t *oneDeviceData,
8776 tdsaPortContext_t *onePortContext
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;
8787 bit32 memAllocStatus;
8791 TI_DBG1(("tdIDStart: start, did %d\n",oneDeviceData->id));
8793 if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData)|| DEVICE_IS_STP_TARGET(oneDeviceData))
8795 oneDeviceData->satDevData.IDDeviceValid == agFALSE
8797 oneDeviceData->satDevData.IDPending == agFALSE
8800 TI_DBG2(("tdIDStart: in loop, did %d\n", oneDeviceData->id));
8801 /* allocating tdIORequestBody */
8802 memAllocStatus = ostiAllocMemory(
8805 (void **)&tdIORequestBody,
8809 sizeof(tdIORequestBody_t),
8812 if (memAllocStatus != tiSuccess || tdIORequestBody == agNULL)
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)
8819 /* notifying link up */
8824 (void *)onePortContext->tiPortalContext
8826 #ifdef INITIATOR_DRIVER
8827 /* triggers discovery */
8830 tiPortDiscoveryReady,
8832 (void *) onePortContext->tiPortalContext
8840 osti_memset(tdIORequestBody, 0, sizeof(tdIORequestBody_t));
8842 tdIORequestBody->osMemHandle = osMemHandle;
8843 TI_DBG2(("tdIDStart: tdIORequestBody %p tdIORequestBody->osMemHandle %p\n", tdIORequestBody, tdIORequestBody->osMemHandle));
8846 tdIORequestBody->IOCompletionFunc = agNULL;
8847 tdIORequestBody->tiDevHandle = agNULL;
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;
8856 smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
8857 smDeviceHandle->tdData = oneDeviceData;
8859 TI_DBG2(("tdIDStart: smIORequest %p\n", smIORequest));
8861 SMstatus = smIDStart(smRoot,
8863 &(oneDeviceData->smDeviceHandle)
8866 if (SMstatus == SM_RC_SUCCESS)
8868 if (oneDeviceData->directlyAttached == agTRUE)
8870 TI_DBG2(("tdIDStart: successfully sent identify device data\n"));
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));
8878 oneDeviceData->satDevData.IDPending = agTRUE;
8880 tdIDStartTimer(tiRoot, smIORequest, oneDeviceData);
8884 /* failed to send */
8885 TI_DBG1(("tdIDStart: smIDStart fail or busy %d\n", SMstatus));
8887 /* free up allocated memory */
8890 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
8891 sizeof(tdIORequestBody_t)
8894 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
8895 if (oneDeviceData->directlyAttached == agTRUE)
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 */
8907 (void *)onePortContext->tiPortalContext
8909 #ifdef INITIATOR_DRIVER
8910 /* triggers discovery */
8913 tiPortDiscoveryReady,
8915 (void *) onePortContext->tiPortalContext
8921 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
8926 TI_DBG1(("tdIDStart: exit\n"));
8932 #ifdef SALLSDK_OS_IOMB_LOG_ENABLE
8933 GLOBAL void ossaLogIomb(agsaRoot_t *agRoot,
8935 agBOOLEAN isInbound,
8941 #endif /* SALLSDK_OS_IOMB_LOG_ENABLE */
8945 * These callback routines are defined in ossasat.c which are included in the
8946 * compilation if SATA_ENABLED is defined.
8949 /*****************************************************************************
8950 *! \brief ossaDiscoverSataCB
8952 * Purpose: This function is called by lower layer to inform TD layer of
8953 * STP/SATA discovery results
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
8964 * \note - For details, refer to SAS/SATA Low-Level API Specification
8966 *****************************************************************************/
8968 osGLOBAL void ossaDiscoverSataCB( agsaRoot_t *agRoot,
8969 agsaPortContext_t *agPortContext,
8979 /*****************************************************************************
8980 *! \brief ossaSATACompleted
8982 * This routine is called to complete a SATA request previously issued to the
8983 * LL Layer in saSATAStart()
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
8991 * \param agParam: Additional info based on status.
8995 *****************************************************************************/
8996 GLOBAL void ossaSATACompleted(
8998 agsaIORequest_t *agIORequest,
9009 /*****************************************************************************
9010 *! \brief ossaSATAEvent
9012 * This routine is called to notify the OS Layer of an event associated with
9013 * SATA port or SATA device
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
9023 *****************************************************************************/
9024 osGLOBAL void ossaSATAEvent(
9026 agsaIORequest_t *agIORequest,
9027 agsaPortContext_t *agPortContext,
9028 agsaDevHandle_t *agDevHandle,
9038 /*****************************************************************************
9039 *! \brief ossaSATADeviceResetCB
9041 * This routine is called to complete a SATA device reset request previously
9042 * issued to the LL Layer in saSATADeviceReset().
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.
9053 *****************************************************************************/
9054 osGLOBAL void ossaSATADeviceResetCB(
9056 agsaDevHandle_t *agDevHandle,
9065 /*****************************************************************************
9066 *! \brief ossaDiscoverSasCB
9068 * Purpose: This function is called by lower layer to inform TD layer of
9069 * SAS discovery results
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
9080 * \note - For details, refer to SAS/SATA Low-Level API Specification
9082 *****************************************************************************/
9083 osGLOBAL void ossaDiscoverSasCB(agsaRoot_t *agRoot,
9084 agsaPortContext_t *agPortContext,