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 #include <sys/cdefs.h>
23 __FBSDID("$FreeBSD$");
24 #include <dev/pms/config.h>
26 #include <dev/pms/freebsd/driver/common/osenv.h>
27 #include <dev/pms/freebsd/driver/common/ostypes.h>
28 #include <dev/pms/freebsd/driver/common/osdebug.h>
30 #include <dev/pms/RefTisa/tisa/api/titypes.h>
31 #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
32 #include <dev/pms/RefTisa/tisa/api/tiapi.h>
34 #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
38 #include <dev/pms/RefTisa/sat/api/sm.h>
39 #include <dev/pms/RefTisa/sat/api/smapi.h>
40 #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
43 #include <dev/pms/RefTisa/discovery/api/dm.h>
46 #ifdef INITIATOR_DRIVER
47 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
50 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
51 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
52 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
55 extern bit32 gSMDebugLevel;
59 smReportRemovalDirect(
62 tdsaDeviceData_t *oneDeviceData
65 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
66 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
69 TI_DBG2(("smReportRemovalDirect: start\n"));
71 PhyID = oneDeviceData->phyID;
73 tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
74 oneDeviceData->valid = agFALSE;
75 oneDeviceData->valid2 = agFALSE;
76 /* put onedevicedata back to free list */
77 osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
78 TDLIST_DEQUEUE_THIS(&(oneDeviceData->MainLink));
79 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
81 /* notifying link up */
86 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
88 #ifdef INITIATOR_DRIVER
89 /* triggers discovery */
94 (void *) tdsaAllShared->Ports[PhyID].tiPortalContext
104 tdsaDeviceData_t *oneDeviceData,
105 tdsaPortContext_t *onePortContext
108 TI_DBG2(("smReportRemoval: start\n"));
110 if (oneDeviceData->registered == agTRUE)
113 1. remove this device
114 2. device removal event
116 tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
117 oneDeviceData->valid = agFALSE;
118 oneDeviceData->valid2 = agFALSE;
119 oneDeviceData->registered = agFALSE;
122 onePortContext->tiPortalContext,
124 tiIntrEventTypeDeviceChange,
136 tdsaDeviceData_t *oneDeviceData,
140 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
141 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
142 agsaSATAIdentifyData_t *pSATAIdData;
143 tdList_t *DeviceListList;
144 tdsaDeviceData_t *tmpOneDeviceData = agNULL;
145 int new_device = agTRUE;
148 TI_DBG2(("smHandleDirect: start\n"));
149 PhyID = oneDeviceData->phyID;
151 pSATAIdData = (agsaSATAIdentifyData_t *)IDdata;
152 //tdhexdump("satAddSATAIDDevCB after", (bit8 *)pSATAIdData, sizeof(agsaSATAIdentifyData_t));
154 /* compare idenitfy device data to the exiting list */
155 DeviceListList = tdsaAllShared->MainDeviceList.flink;
156 while (DeviceListList != &(tdsaAllShared->MainDeviceList))
158 tmpOneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
159 if (tmpOneDeviceData == agNULL)
161 TI_DBG1(("smHandleDirect: tmpOneDeviceData is NULL!!!\n"));
164 TI_DBG1(("smHandleDirect: LOOP tmpOneDeviceData %p did %d\n", tmpOneDeviceData, tmpOneDeviceData->id));
165 //tdhexdump("smHandleDirect LOOP", (bit8 *)&tmpOneDeviceData->satDevData.satIdentifyData, sizeof(agsaSATAIdentifyData_t));
167 /* what is unique ID for sata device -> response of identify devicedata; not really
168 Let's compare serial number, firmware version, model number
170 if ( tmpOneDeviceData->DeviceType == TD_SATA_DEVICE &&
171 (osti_memcmp (tmpOneDeviceData->satDevData.satIdentifyData.serialNumber,
172 pSATAIdData->serialNumber,
174 (osti_memcmp (tmpOneDeviceData->satDevData.satIdentifyData.firmwareVersion,
175 pSATAIdData->firmwareVersion,
177 (osti_memcmp (tmpOneDeviceData->satDevData.satIdentifyData.modelNumber,
178 pSATAIdData->modelNumber,
182 TI_DBG2(("smHandleDirect: did %d\n", tmpOneDeviceData->id));
183 new_device = agFALSE;
186 DeviceListList = DeviceListList->flink;
190 if (new_device == agFALSE)
192 TI_DBG2(("smHandleDirect: old device data\n"));
193 tmpOneDeviceData->valid = agTRUE;
194 tmpOneDeviceData->valid2 = agTRUE;
195 /* save data field from new device data */
196 tmpOneDeviceData->agRoot = agRoot;
197 tmpOneDeviceData->agDevHandle = oneDeviceData->agDevHandle;
198 tmpOneDeviceData->agDevHandle->osData = tmpOneDeviceData; /* TD layer */
199 tmpOneDeviceData->tdPortContext = oneDeviceData->tdPortContext;
200 tmpOneDeviceData->phyID = oneDeviceData->phyID;
203 one SATA directly attached device per phy;
204 Therefore, deregister then register
206 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
208 if (tmpOneDeviceData->registered == agFALSE)
210 TI_DBG2(("smHandleDirect: re-registering old device data\n"));
211 /* already has old information; just register it again */
212 saRegisterNewDevice( /* smHandleDirect */
214 &tmpOneDeviceData->agContext,
215 0,/*tdsaRotateQnumber(tiRoot, tmpOneDeviceData),*/
216 &tmpOneDeviceData->agDeviceInfo,
217 tmpOneDeviceData->tdPortContext->agPortContext,
222 // tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
223 /* put tmpOneDeviceData back to free list */
224 osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
225 TDLIST_DEQUEUE_THIS(&(oneDeviceData->MainLink));
226 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
228 TI_DBG2(("smHandleDirect: pid %d\n", tdsaAllShared->Ports[PhyID].portContext->id));
229 /* notifying link up */
234 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
238 #ifdef INITIATOR_DRIVER
239 /* triggers discovery */
242 tiPortDiscoveryReady,
244 (void *) tdsaAllShared->Ports[PhyID].tiPortalContext
250 TI_DBG2(("smHandleDirect: new device data\n"));
251 oneDeviceData->satDevData.satIdentifyData = *pSATAIdData;
252 /* notifying link up */
257 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
259 #ifdef INITIATOR_DRIVER
260 /* triggers discovery */
263 tiPortDiscoveryReady,
265 (void *) tdsaAllShared->Ports[PhyID].tiPortalContext
273 combine satAddSATAIDDevCB(expander) and satAddSATAIDDevCB(directly attached)
278 smIORequest_t *smIORequest,
279 smDeviceHandle_t *smDeviceHandle,
284 tdsaRoot_t *tdsaRoot;
285 tdsaContext_t *tdsaAllShared;
288 tdIORequestBody_t *tdIORequestBody;
289 tdsaDeviceData_t *oneDeviceData;
290 tdsaPortContext_t *onePortContext;
291 tiPortalContext_t *tiPortalContext;
294 agsaSATAIdentifyData_t *pSATAIdData;
296 TI_DBG2(("tdsmIDCompletedCB: start\n"));
298 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
299 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
300 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
301 tdIORequestBody = (tdIORequestBody_t *)smIORequest->tdData;
303 if (smDeviceHandle == agNULL)
305 TI_DBG1(("tdsmIDCompletedCB: smDeviceHandle is NULL !!!!\n"));
308 tdIORequestBody->osMemHandle,
309 sizeof(tdIORequestBody_t)
314 oneDeviceData = (tdsaDeviceData_t *)smDeviceHandle->tdData;
315 onePortContext = oneDeviceData->tdPortContext;
316 agRoot = oneDeviceData->agRoot;
317 pid = tdIORequestBody->pid;
320 // oneDeviceData->satDevData.IDDeviceValid = agFALSE;
321 oneDeviceData->satDevData.IDPending = agFALSE;
323 TI_DBG2(("tdsmIDCompletedCB: tdIORequestBody %p tdIORequestBody->osMemHandle %p\n", tdIORequestBody, tdIORequestBody->osMemHandle));
325 tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
327 if (oneDeviceData->tdIDTimer.timerRunning == agTRUE)
329 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
332 &oneDeviceData->tdIDTimer
337 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
340 if (onePortContext == agNULL)
342 TI_DBG1(("tdsmIDCompletedCB: onePortContext is NULL!!!\n"));
345 tdIORequestBody->osMemHandle,
346 sizeof(tdIORequestBody_t)
352 if (pid != onePortContext->id)
354 TI_DBG1(("tdsmIDCompletedCB: not matching pid; pid %d onePortContext->id %d!!!\n", pid, onePortContext->id));
355 if (oneDeviceData->directlyAttached == agTRUE)
357 smReportRemovalDirect(tiRoot, agRoot, oneDeviceData);
361 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
365 tdIORequestBody->osMemHandle,
366 sizeof(tdIORequestBody_t)
371 tiPortalContext= onePortContext->tiPortalContext;
373 if (tiPortalContext == agNULL)
375 TI_DBG1(("tdsmIDCompletedCB: tiPortalContext is NULL!!!\n"));
376 if (oneDeviceData->directlyAttached == agTRUE)
378 smReportRemovalDirect(tiRoot, agRoot, oneDeviceData);
382 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
386 tdIORequestBody->osMemHandle,
387 sizeof(tdIORequestBody_t)
392 if (agRoot == agNULL)
394 TI_DBG1(("tdsmIDCompletedCB: agRoot is NULL!!!\n"));
397 tdIORequestBody->osMemHandle,
398 sizeof(tdIORequestBody_t)
403 if (status == smIOSuccess)
405 TI_DBG2(("tdsmIDCompletedCB: smIOSuccess\n"));
407 oneDeviceData->satDevData.IDDeviceValid = agTRUE;
408 if (oneDeviceData->directlyAttached == agTRUE)
410 TI_DBG2(("tdsmIDCompletedCB: directlyAttached\n"));
411 pSATAIdData = (agsaSATAIdentifyData_t *)IDdata;
412 smHandleDirect(tiRoot, agRoot, oneDeviceData, IDdata);
414 osti_memcpy(onePortContext->remoteName, pSATAIdData->serialNumber, 20);
415 osti_memcpy(&(onePortContext->remoteName[20]), pSATAIdData->firmwareVersion, 8);
416 osti_memcpy(&(onePortContext->remoteName[28]), pSATAIdData->modelNumber, 40);
418 else /* expander attached */
421 TI_DBG2(("tdsmIDCompletedCB: expander attached\n"));
423 if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
425 TI_DBG1(("tdsmIDCompletedCB: ID completed after discovery is done; tiDeviceArrival\n"));
426 /* ID data completed after discovery is completed */
431 tiIntrEventTypeDeviceChange,
437 TI_DBG2(("tdsmIDCompletedCB: tdIORequestBody %p tdIORequestBody->osMemHandle %p\n", tdIORequestBody, tdIORequestBody->osMemHandle));
440 tdIORequestBody->osMemHandle,
441 sizeof(tdIORequestBody_t)
445 else if ( status == smIORetry)
447 TI_DBG1(("tdsmIDCompletedCB: smIORetry!!!\n"));
448 if ( !(oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
449 oneDeviceData->tdPortContext != agNULL)
452 TI_DBG1(("tdsmIDCompletedCB: smIORetry but device is not valid!!!\n"));
453 tdIORequestBody->reTries = 0;
454 tdIORequestBody->ioCompleted = agTRUE;
455 tdIORequestBody->ioStarted = agFALSE;
458 tdIORequestBody->osMemHandle,
459 sizeof(tdIORequestBody_t)
461 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
465 if (tdIORequestBody->reTries <= SM_RETRIES)
467 tdIORequestBody->tiIORequest = agNULL; /* not in use */
468 tdIORequestBody->pid = onePortContext->id;
469 smIORequest->tdData = tdIORequestBody;
470 smIORequest->smData = &tdIORequestBody->smIORequestBody;
472 smDeviceHandle->tdData = oneDeviceData;
474 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
476 IDstatus = smIDStart(smRoot,
480 if (IDstatus != SM_RC_SUCCESS)
482 /* identify device data is not valid */
483 TI_DBG1(("tdsmIDCompletedCB: smIDStart fail or busy %d!!!\n", IDstatus));
484 tdIORequestBody->reTries = 0;
485 tdIORequestBody->ioCompleted = agTRUE;
486 tdIORequestBody->ioStarted = agFALSE;
489 tdIORequestBody->osMemHandle,
490 sizeof(tdIORequestBody_t)
492 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
495 tdIORequestBody->reTries++;
496 tdIORequestBody->ioCompleted = agFALSE;
497 tdIORequestBody->ioStarted = agTRUE;
498 oneDeviceData->satDevData.IDPending = agTRUE;
500 tdIDStartTimer(tiRoot, smIORequest, oneDeviceData);
501 TI_DBG1(("tdsmIDCompletedCB: being retried!!!\n"));
506 TI_DBG1(("tdsmIDCompletedCB: retries are over!!!\n"));
507 tdIORequestBody->reTries = 0;
508 tdIORequestBody->ioCompleted = agTRUE;
509 tdIORequestBody->ioStarted = agFALSE;
512 tdIORequestBody->osMemHandle,
513 sizeof(tdIORequestBody_t)
515 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
516 /* SATA device is not usable; remove it */
517 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
520 else if ( status == smIOSTPResourceBusy)
522 /* decides to send smp hard reset or not */
523 TI_DBG1(("tdsmIDCompletedCB: smIOSTPResourceBusy\n"));
526 tdIORequestBody->osMemHandle,
527 sizeof(tdIORequestBody_t)
529 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
530 if (tdsaAllShared->FCA)
532 if (oneDeviceData->SMNumOfFCA <= 0) /* does SMP HARD RESET only upto one time */
534 TI_DBG1(("tdsmIDCompletedCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n"));
535 oneDeviceData->SMNumOfFCA++;
536 tdsaPhyControlSend(tiRoot,
538 SMP_PHY_CONTROL_HARD_RESET,
540 tdsaRotateQnumber(tiRoot, oneDeviceData)
545 /* given up after one time of SMP HARD RESET; */
546 TI_DBG1(("tdsmIDCompletedCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; but giving up sending HARD_RESET!!!\n"));
547 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
557 TI_DBG1(("tdsmIDCompletedCB: smIDStart fail, status 0x%x!!!\n", status));
558 TI_DBG1(("tdsmIDCompletedCB: did %d!!!\n", oneDeviceData->id));
559 if ( !(oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
560 oneDeviceData->tdPortContext != agNULL)
563 TI_DBG1(("tdsmIDCompletedCB: fail but device is not valid!!!\n"));
564 tdIORequestBody->reTries = 0;
565 tdIORequestBody->ioCompleted = agTRUE;
566 tdIORequestBody->ioStarted = agFALSE;
569 tdIORequestBody->osMemHandle,
570 sizeof(tdIORequestBody_t)
572 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
575 tdsaAllShared->IDRetry = agTRUE;
576 if (tdsaAllShared->IDRetry)
578 if (tdIORequestBody->reTries <= SM_RETRIES)
580 tdIORequestBody->tiIORequest = agNULL; /* not in use */
581 tdIORequestBody->pid = onePortContext->id;
582 smIORequest->tdData = tdIORequestBody;
583 smIORequest->smData = &tdIORequestBody->smIORequestBody;
585 smDeviceHandle->tdData = oneDeviceData;
586 IDstatus = smIDStart(smRoot,
590 if (IDstatus != SM_RC_SUCCESS)
592 /* identify device data is not valid */
593 TI_DBG1(("tdsmIDCompletedCB: smIDStart fail or busy %d!!!\n", IDstatus));
594 tdIORequestBody->reTries = 0;
595 tdIORequestBody->ioCompleted = agTRUE;
596 tdIORequestBody->ioStarted = agFALSE;
599 tdIORequestBody->osMemHandle,
600 sizeof(tdIORequestBody_t)
602 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
603 if (oneDeviceData->directlyAttached == agTRUE)
605 smReportRemovalDirect(tiRoot, agRoot, oneDeviceData);
609 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
613 tdIORequestBody->reTries++;
614 tdIORequestBody->ioCompleted = agFALSE;
615 tdIORequestBody->ioStarted = agTRUE;
616 oneDeviceData->satDevData.IDPending = agTRUE;
618 tdIDStartTimer(tiRoot, smIORequest, oneDeviceData);
619 TI_DBG1(("tdsmIDCompletedCB: being retried!!!\n"));
624 TI_DBG1(("tdsmIDCompletedCB: retries are over; sending hard reset!!!\n"));
625 tdIORequestBody->reTries = 0;
626 tdIORequestBody->ioCompleted = agTRUE;
627 tdIORequestBody->ioStarted = agFALSE;
630 tdIORequestBody->osMemHandle,
631 sizeof(tdIORequestBody_t)
633 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
635 if (oneDeviceData->SMNumOfID <= 0) /* does SMP HARD RESET only upto one time */
637 TI_DBG1(("tdsmIDCompletedCB: fail; sending HARD_RESET\n"));
638 oneDeviceData->SMNumOfID++;
639 if (oneDeviceData->directlyAttached == agTRUE)
641 saLocalPhyControl(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), oneDeviceData->phyID, AGSA_PHY_HARD_RESET, agNULL);
645 tdsaPhyControlSend(tiRoot,
647 SMP_PHY_CONTROL_HARD_RESET,
649 tdsaRotateQnumber(tiRoot, oneDeviceData)
655 /* given up after one time of SMP HARD RESET; */
656 TI_DBG1(("tdsmIDCompletedCB: fail; but giving up sending HARD_RESET!!!\n"));
657 if (oneDeviceData->directlyAttached == agTRUE)
659 smReportRemovalDirect(tiRoot, agRoot, oneDeviceData);
663 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
683 smIORequest_t *smIORequest,
686 smSenseData_t *senseData,
687 bit32 interruptContext
690 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
691 tdsaContext_t *tdsaAllShared = &(tdsaRoot->tdsaAllShared);
692 tiRoot_t *tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
693 tdIORequestBody_t *tdIORequestBody = (tdIORequestBody_t *)smIORequest->tdData;
694 tiIORequest_t *tiIORequest = tdIORequestBody->tiIORequest;
696 tdsaDeviceData_t *oneDeviceData;
697 tiDeviceHandle_t *tiDeviceHandle;
698 smDeviceHandle_t *smDeviceHandle;
699 smScsiInitiatorRequest_t *smSCSIRequest;
700 smSuperScsiInitiatorRequest_t *smSuperSCSIRequest;
702 bit32 SMStatus = SM_RC_FAILURE;
705 TI_DBG5(("tdsmIOCompletedCB: start\n"));
707 if (status == smIOSuccess)
709 ostiInitiatorIOCompleted( tiRoot,
713 (tiSenseData_t *)senseData,
716 else if (status == smIORetry)
718 TI_DBG1(("tdsmIOCompletedCB: smIORetry!!!\n"));
719 smIORequest = (smIORequest_t *)&(tdIORequestBody->smIORequest);
720 tiDeviceHandle = tdIORequestBody->tiDevHandle;
721 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
723 if (! (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
724 oneDeviceData->tdPortContext != agNULL)
727 TI_DBG1(("tdsmIOCompletedCB: smIORetry but device is not valid!!!\n"));
728 tdIORequestBody->reTries = 0;
729 tdIORequestBody->ioCompleted = agTRUE;
730 tdIORequestBody->ioStarted = agFALSE;
731 ostiInitiatorIOCompleted( tiRoot,
735 (tiSenseData_t *)senseData,
739 if (tdIORequestBody->reTries <= SM_RETRIES)
741 smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
742 if (tdIORequestBody->superIOFlag == agTRUE)
744 smSuperSCSIRequest = (smSuperScsiInitiatorRequest_t *)&(tdIORequestBody->SM.smSuperSCSIRequest);
745 SMStatus = smSuperIOStart(smRoot,
749 oneDeviceData->SASAddressID.sasAddressHi,
750 oneDeviceData->SASAddressID.sasAddressLo,
755 smSCSIRequest = (smScsiInitiatorRequest_t *)&(tdIORequestBody->SM.smSCSIRequest);
756 SMStatus = smIOStart(smRoot,
764 if (SMStatus != SM_RC_SUCCESS)
766 TI_DBG1(("tdsmIOCompletedCB: smIDStart fail or busy %d!!!\n", SMStatus));
767 tdIORequestBody->reTries = 0;
768 tdIORequestBody->ioCompleted = agTRUE;
769 tdIORequestBody->ioStarted = agFALSE;
770 ostiInitiatorIOCompleted( tiRoot,
774 (tiSenseData_t *)senseData,
780 TI_DBG1(("tdsmIOCompletedCB: being retried!!!\n"));
781 tdIORequestBody->reTries++;
782 tdIORequestBody->ioCompleted = agFALSE;
783 tdIORequestBody->ioStarted = agTRUE;
788 /* give up; complete IO */
789 TI_DBG1(("tdsmIOCompletedCB: retries are over!!!\n"));
790 tdIORequestBody->reTries = 0;
791 tdIORequestBody->ioCompleted = agTRUE;
792 tdIORequestBody->ioStarted = agFALSE;
793 ostiInitiatorIOCompleted( tiRoot,
797 (tiSenseData_t *)senseData,
803 else if ( status == smIOSTPResourceBusy)
805 /* decides to send smp hard reset or not */
806 TI_DBG1(("tdsmIOCompletedCB: smIOSTPResourceBusy\n"));
807 if (tdsaAllShared->FCA)
809 smIORequest = (smIORequest_t *)&(tdIORequestBody->smIORequest);
810 tiDeviceHandle = tdIORequestBody->tiDevHandle;
811 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
812 if (oneDeviceData->SMNumOfFCA <= 0) /* does SMP HARD RESET only upto one time */
814 TI_DBG1(("tdsmIOCompletedCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n"));
815 oneDeviceData->SMNumOfFCA++;
816 tdsaPhyControlSend(tiRoot,
818 SMP_PHY_CONTROL_HARD_RESET,
820 tdsaRotateQnumber(tiRoot, oneDeviceData)
825 /* given up after one time of SMP HARD RESET; */
826 TI_DBG1(("tdsmIOCompletedCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; but giving up sending HARD_RESET!!!\n"));
829 ostiInitiatorIOCompleted( tiRoot,
833 (tiSenseData_t *)senseData,
839 if (statusDetail == smDetailAborted)
841 tiDeviceHandle = tdIORequestBody->tiDevHandle;
842 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
843 TI_DBG1(("tdsmIOCompletedCB: agIOStatus = OSSA_IO_ABORTED did %d\n", oneDeviceData->id));
845 ostiInitiatorIOCompleted( tiRoot,
849 (tiSenseData_t *)senseData,
856 /* completion of taskmanagement
857 osGLOBAL void ostiInitiatorEvent (
859 tiPortalContext_t *portalContext,
860 tiDeviceHandle_t *tiDeviceHandle,
861 tiIntrEventType_t eventType,
871 smDeviceHandle_t *smDeviceHandle,
872 smIntrEventType_t eventType,
877 tdsaRoot_t *tdsaRoot;
878 tdsaContext_t *tdsaAllShared;
880 tdIORequestBody_t *tdIORequestBody;
881 smIORequest_t *SMcurrentTaskTag;
882 tiIORequest_t *currentTaskTag;
883 tdsaDeviceData_t *oneDeviceData;
885 tdsaPortContext_t *onePortContext;
886 tiPortalContext_t *tiportalContext;
887 tiDeviceHandle_t *tiDeviceHandle;
889 /* be sure to free using tdIORequestBody->->IOType.InitiatorTMIO.osMemHandle but how???
890 parm = pSatDevData->satTmTaskTag (currentTaskTag in tiINITaskManagement)
891 In this case, parm is smIORequest_t
894 TI_DBG2(("tdsmEventCB: start\n"));
896 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
897 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
898 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
901 if (eventType == smIntrEventTypeLocalAbort)
903 oneDeviceData = (tdsaDeviceData_t *)smDeviceHandle->tdData;
904 if (oneDeviceData == agNULL)
906 TI_DBG1(("tdsmEventCB: oneDeviceData is NULL\n"));
911 tiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
912 if (oneDeviceData->OSAbortAll == agTRUE)
914 oneDeviceData->OSAbortAll = agFALSE;
915 ostiInitiatorEvent( tiRoot,
918 tiIntrEventTypeLocalAbort,
927 SMcurrentTaskTag = (smIORequest_t *)parm;
928 if (SMcurrentTaskTag == agNULL)
930 TI_DBG1(("tdsmEventCB: SMcurrentTaskTag is NULL!!!\n"));
934 tdIORequestBody = (tdIORequestBody_t *)SMcurrentTaskTag->tdData;
935 if (tdIORequestBody == agNULL)
937 TI_DBG1(("tdsmEventCB: tdIORequestBody is NULL!!!\n"));
941 osMemHandle = tdIORequestBody->IOType.InitiatorTMIO.osMemHandle;
942 currentTaskTag = tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag;
945 oneDeviceData = (tdsaDeviceData_t *)smDeviceHandle->tdData;
946 if (oneDeviceData == agNULL)
948 TI_DBG1(("tdsmEventCB: oneDeviceData is NULL!!!\n"));
952 tiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
953 onePortContext = oneDeviceData->tdPortContext;
954 if (onePortContext == agNULL)
956 TI_DBG1(("tdsmEventCB: onePortContext is NULL!!!\n"));
959 tiportalContext = onePortContext->tiPortalContext;
961 /* free tdIORequestBody */
965 sizeof(tdIORequestBody_t)
969 TI_DBG2(("tdsmEventCB: calling ostiInitiatorEvent\n"));
976 (void *)currentTaskTag
980 /* completion of taskmanagement
981 osGLOBAL void ostiInitiatorEvent (
983 tiPortalContext_t *portalContext,
984 tiDeviceHandle_t *tiDeviceHandle,
985 tiIntrEventType_t eventType,
1001 tdsmSingleThreadedEnter(
1006 tdsaRoot_t *tdsaRoot;
1007 tdsaContext_t *tdsaAllShared;
1011 TI_DBG7(("tdsmSingleThreadedEnter: start\n"));
1013 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
1014 if (tdsaRoot == agNULL)
1016 TI_DBG1(("tdsmSingleThreadedEnter: tdsaRoot is NULL\n"));
1020 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1021 if (tdsaAllShared == agNULL)
1023 TI_DBG1(("tdsmSingleThreadedEnter: tdsaAllShared is NULL\n"));
1027 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1028 if (tiRoot == agNULL)
1030 TI_DBG1(("tdsmSingleThreadedEnter: tiRoot is NULL\n"));
1034 offset = tdsaAllShared->MaxNumLLLocks + tdsaAllShared->MaxNumOSLocks + TD_MAX_LOCKS + tdsaAllShared->MaxNumDMLocks;
1036 ostiSingleThreadedEnter(tiRoot, syncLockId + offset);
1042 tdsmSingleThreadedLeave(
1047 tdsaRoot_t *tdsaRoot;
1048 tdsaContext_t *tdsaAllShared;
1052 TI_DBG7(("tdsmSingleThreadedLeave: start\n"));
1054 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
1055 if (tdsaRoot == agNULL)
1057 TI_DBG1(("tdsmSingleThreadedLeave: tdsaRoot is NULL\n"));
1061 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1062 if (tdsaAllShared == agNULL)
1064 TI_DBG1(("tdsmSingleThreadedLeave: tdsaAllShared is NULL\n"));
1068 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1069 if (tiRoot == agNULL)
1071 TI_DBG1(("tdsmSingleThreadedLeave: tiRoot is NULL\n"));
1074 offset = tdsaAllShared->MaxNumLLLocks + tdsaAllShared->MaxNumOSLocks + TD_MAX_LOCKS + tdsaAllShared->MaxNumDMLocks;
1076 ostiSingleThreadedLeave(tiRoot, syncLockId + offset);
1081 osGLOBAL FORCEINLINE bit8
1088 return ostiBitScanForward(agNULL, Index, Mask);
1091 #ifdef LINUX_VERSION_CODE
1093 osGLOBAL FORCEINLINE sbit32
1094 tdsmInterlockedIncrement(
1096 sbit32 volatile *Addend
1099 return ostiAtomicIncrement(agNULL, Addend);
1102 osGLOBAL FORCEINLINE sbit32
1103 tdsmInterlockedDecrement(
1105 sbit32 volatile *Addend
1108 return ostiAtomicDecrement(agNULL, Addend);
1113 osGLOBAL FORCEINLINE sbit32
1116 sbit32 volatile *Destination,
1120 return ostiAtomicBitClear(agNULL, Destination, Value);
1123 osGLOBAL FORCEINLINE sbit32
1126 sbit32 volatile *Destination,
1130 return ostiAtomicBitSet(agNULL, Destination, Value);
1133 osGLOBAL FORCEINLINE sbit32
1136 sbit32 volatile *Target,
1140 return ostiAtomicExchange(agNULL, Target, Value);
1145 osGLOBAL FORCEINLINE sbit32
1146 tdsmInterlockedIncrement(
1148 sbit32 volatile *Addend
1151 return ostiInterlockedIncrement(agNULL, Addend);
1154 osGLOBAL FORCEINLINE sbit32
1155 tdsmInterlockedDecrement(
1157 sbit32 volatile *Addend
1160 return ostiInterlockedDecrement(agNULL, Addend);
1165 osGLOBAL FORCEINLINE sbit32
1168 sbit32 volatile *Destination,
1173 return ostiInterlockedAnd(agNULL, Destination, Value);
1176 osGLOBAL FORCEINLINE sbit32
1179 sbit32 volatile *Destination,
1183 return ostiInterlockedOr(agNULL, Destination, Value);
1186 osGLOBAL FORCEINLINE sbit32
1187 tdsmInterlockedExchange(
1189 sbit32 volatile *Target,
1193 return ostiInterlockedExchange(agNULL, Target, Value);
1196 #endif /*LINUX_VERSION_CODE*/
1203 bit32 * physAddrUpper,
1204 bit32 * physAddrLower,
1207 smBOOLEAN isCacheable
1210 tdsaRoot_t *tdsaRoot;
1211 tdsaContext_t *tdsaAllShared;
1215 TI_DBG5(("tdsmAllocMemory: start\n"));
1217 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
1218 if (tdsaRoot == agNULL)
1220 TI_DBG1(("tdsmAllocMemory: tdsaRoot is NULL\n"));
1221 return SM_RC_FAILURE;
1224 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1225 if (tdsaAllShared == agNULL)
1227 TI_DBG1(("tdsmAllocMemory: tdsaAllShared is NULL\n"));
1228 return SM_RC_FAILURE;
1231 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1232 if (tiRoot == agNULL)
1234 TI_DBG1(("tdsmAllocMemory: tiRoot is NULL\n"));
1235 return SM_RC_FAILURE;
1238 status = ostiAllocMemory(tiRoot,
1247 if (status == tiSuccess)
1249 return SM_RC_SUCCESS;
1253 return SM_RC_FAILURE;
1265 tdsaRoot_t *tdsaRoot;
1266 tdsaContext_t *tdsaAllShared;
1270 TI_DBG5(("tdsmFreeMemory: start\n"));
1272 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
1273 if (tdsaRoot == agNULL)
1275 TI_DBG1(("tdsmFreeMemory: tdsaRoot is NULL\n"));
1276 return SM_RC_FAILURE;
1279 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1280 if (tdsaAllShared == agNULL)
1282 TI_DBG1(("tdsmFreeMemory: tdsaAllShared is NULL\n"));
1283 return SM_RC_FAILURE;
1286 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1287 if (tiRoot == agNULL)
1289 TI_DBG1(("tdsmFreeMemory: tiRoot is NULL\n"));
1290 return SM_RC_FAILURE;
1293 status = ostiFreeMemory(tiRoot,
1297 if (status == tiSuccess)
1299 return SM_RC_SUCCESS;
1303 return SM_RC_FAILURE;
1308 tdsmRotateQnumber(smRoot_t *smRoot,
1309 smDeviceHandle_t *smDeviceHandle
1312 tdsaRoot_t *tdsaRoot;
1313 tdsaContext_t *tdsaAllShared;
1315 tdsaDeviceData_t *oneDeviceData;
1318 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
1319 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1320 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1323 TI_DBG6(("tdsmRotateQnumber: start\n"));
1325 if (smDeviceHandle == agNULL)
1327 TI_DBG1(("tdsmRotateQnumber: smDeviceHandle is NULL !!!!\n"));
1330 oneDeviceData = (tdsaDeviceData_t *)smDeviceHandle->tdData;
1331 if (oneDeviceData == agNULL)
1333 TI_DBG1(("tdsmRotateQnumber: oneDeviceData is NULL !!!!\n"));
1336 return tdsaRotateQnumber(tiRoot, oneDeviceData);
1340 tdsmSetDeviceQueueDepth(smRoot_t *smRoot,
1341 smIORequest_t *smIORequest,
1345 tdsaRoot_t *tdsaRoot = agNULL;
1346 tdsaContext_t *tdsaAllShared = agNULL;
1347 tiRoot_t *tiRoot = agNULL;
1348 tdIORequestBody_t *tdIORequestBody = (tdIORequestBody_t *)smIORequest->tdData;
1349 tiIORequest_t *tiIORequest = tdIORequestBody->tiIORequest;
1352 TI_DBG5(("tdsmSetDeviceQueueDepth: start\n"));
1354 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
1355 if (tdsaRoot == agNULL)
1357 TI_DBG1(("tdsmSetDeviceQueueDepth: tdsaRoot is NULL\n"));
1358 return SM_RC_FAILURE;
1361 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1362 if (tdsaAllShared == agNULL)
1364 TI_DBG1(("tdsmSetDeviceQueueDepth: tdsaAllShared is NULL\n"));
1365 return SM_RC_FAILURE;
1368 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1369 if (tiRoot == agNULL)
1371 TI_DBG1(("tdsmFreeMemory: tiRoot is NULL\n"));
1372 return SM_RC_FAILURE;
1375 return ostiSetDeviceQueueDepth(tiRoot, tiIORequest, QueueDepth);
1378 osGLOBAL bit32 tdsmGetTransportParam(
1392 bit32 ret = tiError;
1394 TI_DBG7(("tdsmGetTransportParam: start\n"));
1395 ret = ostiGetTransportParam(agNULL,