1 /*******************************************************************************
3 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
5 *Redistribution and use in source and binary forms, with or without modification, are permitted provided
6 *that the following conditions are met:
7 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
9 *2. Redistributions in binary form must reproduce the above copyright notice,
10 *this list of conditions and the following disclaimer in the documentation and/or other materials provided
11 *with the distribution.
13 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
14 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
15 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
17 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
18 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
19 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
20 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
22 ********************************************************************************/
23 #include <sys/cdefs.h>
24 __FBSDID("$FreeBSD$");
25 #include <dev/pms/config.h>
27 #include <dev/pms/freebsd/driver/common/osenv.h>
28 #include <dev/pms/freebsd/driver/common/ostypes.h>
29 #include <dev/pms/freebsd/driver/common/osdebug.h>
31 #include <dev/pms/RefTisa/sallsdk/api/sa.h>
32 #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
33 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
36 #include <dev/pms/RefTisa/discovery/api/dm.h>
37 #include <dev/pms/RefTisa/discovery/api/dmapi.h>
38 #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
40 #include <dev/pms/RefTisa/discovery/dm/dmdefs.h>
41 #include <dev/pms/RefTisa/discovery/dm/dmtypes.h>
42 #include <dev/pms/RefTisa/discovery/dm/dmproto.h>
45 bit32 gDMDebugLevel = 1;
51 dmSwConfig_t *swConfig,
52 dmMemoryRequirement_t *memoryRequirement,
56 bit32 memoryReqCount = 0;
57 bit32 max_expander = DM_MAX_EXPANDER_DEV;
61 static char tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
62 char *pLastUsedChar = agNULL;
63 char globalStr[] = "Global";
64 char iniParmsStr[] = "InitiatorParms";
65 char SwParmsStr[] = "SWParms";
67 DM_DBG3(("dmGetRequirements: start\n"));
69 DM_ASSERT((agNULL != swConfig), "");
70 DM_ASSERT((agNULL != memoryRequirement), "");
71 DM_ASSERT((agNULL != usecsPerTick), "");
72 DM_ASSERT((agNULL != maxNumLocks), "");
74 /* memory requirement for dmRoot, CACHE memory */
75 memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].singleElementLength = sizeof(dmIntRoot_t);
76 memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].numElements = 1;
77 memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].totalLength =
78 (memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].singleElementLength) * (memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].numElements);
79 memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].alignment = 4;
80 memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].type = DM_CACHED_MEM;
83 /* memory requirement for Port Context Links, CACHE memory */
84 memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].singleElementLength = sizeof(dmIntPortContext_t);
85 memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].numElements = DM_MAX_PORT_CONTEXT;
86 memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].totalLength =
87 (memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].singleElementLength) * (memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].numElements);
88 memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].alignment = 4;
89 memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].type = DM_CACHED_MEM;
92 /* memory requirement for Device Links, CACHE memory */
93 memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].singleElementLength = sizeof(dmDeviceData_t);
94 memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].numElements = DM_MAX_DEV;
95 memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].totalLength =
96 (memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].singleElementLength) * (memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].numElements);
97 memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].alignment = 4;
98 memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].type = DM_CACHED_MEM;
101 /* memory requirement for Expander Device Links, CACHE memory */
103 Maximum number of expanders are configurable
104 The default is DM_MAX_EXPANDER_DEV
107 buffLen = sizeof(tmpBuffer);
109 dm_memset(buffer, 0, buffLen);
112 if ((tddmGetTransportParam(
124 ) == DM_RC_SUCCESS) && (lenRecv != 0))
126 if (osti_strncmp(buffer, "0x", 2) == 0)
128 max_expander = osti_strtoul (buffer, &pLastUsedChar, 0);
132 max_expander = osti_strtoul (buffer, &pLastUsedChar, 10);
135 DM_DBG3(("dmGetRequirements: max_expander %d\n", max_expander));
138 memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].singleElementLength = sizeof(dmExpander_t);
139 memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].numElements = max_expander;
140 memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].totalLength =
141 (memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].singleElementLength) * (memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].numElements);
142 memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].alignment = 4;
143 memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].type = DM_CACHED_MEM;
146 /* memory requirement for SMP command Links, CACHE memory */
147 memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].singleElementLength = sizeof(dmSMPRequestBody_t);
148 memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].numElements = DM_MAX_SMP;
149 memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].totalLength =
150 (memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].singleElementLength) * (memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].numElements);
151 memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].alignment = 4;
152 memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].type = DM_CACHED_MEM;
155 /* memory requirement for INDIRECT SMP command/response Links, DMA memory */
156 memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].singleElementLength = SMP_INDIRECT_PAYLOAD; /* 512 */
157 memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].numElements = DM_MAX_INDIRECT_SMP;
158 memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].totalLength =
159 (memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].singleElementLength) * (memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].numElements);
160 memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].alignment = 4;
161 memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].type = DM_DMA_MEM;
165 /* set up memory requirement count */
166 memoryRequirement->count = memoryReqCount;
168 /* requirement for locks */
169 *maxNumLocks = DM_MAX_LOCKS;
171 /* setup the time tick */
172 *usecsPerTick = DM_USECS_PER_TICK;
175 /* set up the number of Expander device handles */
176 swConfig->numDevHandles = DM_MAX_DEV;
177 swConfig->itNexusTimeout = IT_NEXUS_TIMEOUT; /* default is 2000 ms*/
179 dm_memset(buffer, 0, buffLen);
182 if ((tddmGetTransportParam(
194 ) == DM_RC_SUCCESS) && (lenRecv != 0))
196 if (osti_strncmp(buffer, "0x", 2) == 0)
198 swConfig->itNexusTimeout = osti_strtoul (buffer, &pLastUsedChar, 0);
202 swConfig->itNexusTimeout = osti_strtoul (buffer, &pLastUsedChar, 10);
206 DM_DBG1(("dmGetRequirements: swConfig->itNexusTimeout 0x%X\n", swConfig->itNexusTimeout));
208 DM_DBG3(("dmGetRequirements: memoryReqCount %d\n", memoryRequirement->count));
213 ??? processing swConfig
219 dmMemoryRequirement_t *memoryAllocated,
220 dmSwConfig_t *swConfig,
223 dmIntRoot_t *dmIntRoot;
224 dmIntPortContext_t *dmIntPortContext;
225 dmDeviceData_t *dmDevice;
226 dmExpander_t *dmExpander;
227 dmSMPRequestBody_t *dmSMPRequest;
228 bit8 *dmIndirectSMPRequest;
229 dmIntContext_t *dmAllShared;
231 bit32 max_expander = DM_MAX_EXPANDER_DEV;
235 static char tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
236 char *pLastUsedChar = agNULL;
237 char globalStr[] = "Global";
238 char iniParmsStr[] = "InitiatorParms";
239 char SwParmsStr[] = "SWParms";
241 DM_DBG3(("dmInitialize: start\n"));
243 DM_ASSERT((agNULL != dmRoot), "");
244 DM_ASSERT((agNULL != agRoot), "");
245 DM_ASSERT((agNULL != memoryAllocated), "");
246 DM_ASSERT((agNULL != swConfig), "");
247 DM_ASSERT((DM_ROOT_MEM_INDEX < memoryAllocated->count), "");
248 DM_ASSERT((DM_PORT_MEM_INDEX < memoryAllocated->count), "");
249 DM_ASSERT((DM_DEVICE_MEM_INDEX < memoryAllocated->count), "");
250 DM_ASSERT((DM_EXPANDER_MEM_INDEX < memoryAllocated->count), "");
251 DM_ASSERT((DM_SMP_MEM_INDEX < memoryAllocated->count), "");
252 DM_ASSERT((DM_INDIRECT_SMP_MEM_INDEX < memoryAllocated->count), "");
254 /* Check the memory allocated */
255 for ( i = 0; i < memoryAllocated->count; i ++ )
257 /* If memory allocatation failed */
258 if (memoryAllocated->dmMemory[i].singleElementLength &&
259 memoryAllocated->dmMemory[i].numElements)
261 if ( (0 != memoryAllocated->dmMemory[i].numElements)
262 && (0 == memoryAllocated->dmMemory[i].totalLength) )
265 DM_DBG1(("dmInitialize: Memory[%d] singleElementLength = 0x%0x numElements = 0x%x NOT allocated!!!\n",
267 memoryAllocated->dmMemory[i].singleElementLength,
268 memoryAllocated->dmMemory[i].numElements));
269 return DM_RC_FAILURE;
274 /* DM's internal root */
275 dmIntRoot = (dmIntRoot_t *) (memoryAllocated->dmMemory[DM_ROOT_MEM_INDEX].virtPtr);
276 dmRoot->dmData = (void *) dmIntRoot;
278 dmAllShared = (dmIntContext_t *)&(dmIntRoot->dmAllShared);
279 /**< Initialize the TDM data part of the interrupt context */
280 dmAllShared->dmRootOsData.dmRoot = dmRoot;
281 dmAllShared->dmRootOsData.dmAllShared = (void *) dmAllShared;
284 dmIntPortContext = (dmIntPortContext_t *) (memoryAllocated->dmMemory[DM_PORT_MEM_INDEX].virtPtr);
285 dmAllShared->PortContextMem = (dmIntPortContext_t *)dmIntPortContext;
288 dmDevice = (dmDeviceData_t *) (memoryAllocated->dmMemory[DM_DEVICE_MEM_INDEX].virtPtr);
289 dmAllShared->DeviceMem = (dmDeviceData_t *)dmDevice;
292 dmExpander = (dmExpander_t *) (memoryAllocated->dmMemory[DM_EXPANDER_MEM_INDEX].virtPtr);
293 dmAllShared->ExpanderMem = (dmExpander_t *)dmExpander;
296 dmSMPRequest = (dmSMPRequestBody_t *) (memoryAllocated->dmMemory[DM_SMP_MEM_INDEX].virtPtr);
297 dmAllShared->SMPMem = (dmSMPRequestBody_t *)dmSMPRequest;
299 /* DMAable SMP request/reponse pointed by dmSMPRequestBody_t */
300 dmIndirectSMPRequest = (bit8 *) (memoryAllocated->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].virtPtr);
301 dmAllShared->IndirectSMPMem = (bit8 *)dmIndirectSMPRequest;
302 dmAllShared->IndirectSMPUpper32 = memoryAllocated->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].physAddrUpper;
303 dmAllShared->IndirectSMPLower32 = memoryAllocated->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].physAddrLower;
305 dmAllShared->agRoot = agRoot;
308 dmAllShared->usecsPerTick = usecsPerTick;
309 dmAllShared->itNexusTimeout = IT_NEXUS_TIMEOUT;/*swConfig->itNexusTimeout;*/
310 dmAllShared->MaxRetryDiscovery = DISCOVERY_RETRIES;
311 dmAllShared->RateAdjust = 0;
312 /**< initializes timers */
313 dmInitTimers(dmRoot);
315 /**< initializes port contexts */
316 dmPortContextInit(dmRoot);
318 /**< initializes devices */
319 dmDeviceDataInit(dmRoot);
321 /**< initializes expander devices */
323 buffLen = sizeof(tmpBuffer);
325 dm_memset(buffer, 0, buffLen);
328 if ((tddmGetTransportParam(
340 ) == DM_RC_SUCCESS) && (lenRecv != 0))
342 if (osti_strncmp(buffer, "0x", 2) == 0)
344 max_expander = osti_strtoul (buffer, &pLastUsedChar, 0);
348 max_expander = osti_strtoul (buffer, &pLastUsedChar, 10);
352 dm_memset(buffer, 0, buffLen);
355 if ((tddmGetTransportParam(
367 ) == DM_RC_SUCCESS) && (lenRecv != 0))
369 if (osti_strncmp(buffer, "0x", 2) == 0)
371 dmAllShared->itNexusTimeout = osti_strtoul (buffer, &pLastUsedChar, 0);
375 dmAllShared->itNexusTimeout = osti_strtoul (buffer, &pLastUsedChar, 10);
379 DM_DBG1(("dmAllShared->itNexusTimeout %d \n", dmAllShared->itNexusTimeout));
381 dm_memset(buffer, 0, buffLen);
384 if ((tddmGetTransportParam(
396 ) == DM_RC_SUCCESS) && (lenRecv != 0))
398 if (osti_strncmp(buffer, "0x", 2) == 0)
400 dmAllShared->MaxRetryDiscovery = osti_strtoul (buffer, &pLastUsedChar, 0);
404 dmAllShared->MaxRetryDiscovery = osti_strtoul (buffer, &pLastUsedChar, 10);
408 DM_DBG1(("dmAllShared->MaxRetryDiscovery %d \n", dmAllShared->MaxRetryDiscovery));
410 dm_memset(buffer, 0, buffLen);
412 if ((tddmGetTransportParam(
424 ) == DM_RC_SUCCESS) && (lenRecv != 0))
426 if (osti_strncmp(buffer, "0x", 2) == 0)
428 dmAllShared->RateAdjust = osti_strtoul (buffer, &pLastUsedChar, 0);
432 dmAllShared->RateAdjust = osti_strtoul (buffer, &pLastUsedChar, 10);
435 DM_DBG1(("dmAllShared->RateAdjust %d \n", dmAllShared->RateAdjust));
437 dmExpanderDeviceDataInit(dmRoot, max_expander);
439 /**< initializes SMP commands */
443 gDMDebugLevel = swConfig->DMDebugLevel;
445 return DM_RC_SUCCESS;
453 dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
454 dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
455 dmSMPRequestBody_t *dmSMPCommand = (dmSMPRequestBody_t *)dmAllShared->SMPMem;
456 bit8 *dmIndirectSMPReqRsp = (bit8 *)dmAllShared->IndirectSMPMem;
457 bit32 prev_PhysAddrLower;
460 DM_DBG3(("dmSMPInit: start \n"));
462 DMLIST_INIT_HDR(&(dmAllShared->freeSMPList));
464 for(i=0;i<DM_MAX_SMP;i++)
466 DMLIST_INIT_ELEMENT(&(dmSMPCommand[i].Link));
467 /* initialize expander fields */
468 dmSMPCommand[i].dmRoot = agNULL;
469 dmSMPCommand[i].dmDevice = agNULL;
470 dmSMPCommand[i].dmPortContext = agNULL;
471 dmSMPCommand[i].retries = 0;
472 dmSMPCommand[i].id = i;
473 dm_memset( &(dmSMPCommand[i].smpPayload), 0, sizeof(dmSMPCommand[i].smpPayload));
474 /* indirect SMP related */
475 dmSMPCommand[i].IndirectSMPResponse = agNULL;
476 dmSMPCommand[i].IndirectSMP = ((bit8 *)dmIndirectSMPReqRsp) + (i*SMP_INDIRECT_PAYLOAD);
477 dmSMPCommand[i].IndirectSMPUpper32 = dmAllShared->IndirectSMPUpper32;
478 dmSMPCommand[i].IndirectSMPLower32 = dmAllShared->IndirectSMPLower32;
480 prev_PhysAddrLower = dmAllShared->IndirectSMPLower32;
481 dmAllShared->IndirectSMPLower32 = dmAllShared->IndirectSMPLower32 + SMP_INDIRECT_PAYLOAD;
482 if (dmAllShared->IndirectSMPLower32 <= prev_PhysAddrLower)
484 dmAllShared->IndirectSMPUpper32++;
487 DMLIST_ENQUEUE_AT_TAIL(&(dmSMPCommand[i].Link), &(dmAllShared->freeSMPList));
498 dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
499 dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
500 dmDeviceData_t *dmDeviceData = (dmDeviceData_t *)dmAllShared->DeviceMem;
503 DM_DBG3(("dmDeviceDataInit: start \n"));
505 DMLIST_INIT_HDR(&(dmAllShared->MainDeviceList));
506 DMLIST_INIT_HDR(&(dmAllShared->FreeDeviceList));
508 for(i=0;i<DM_MAX_DEV;i++)
510 DMLIST_INIT_ELEMENT(&(dmDeviceData[i].FreeLink));
511 DMLIST_INIT_ELEMENT(&(dmDeviceData[i].MainLink));
512 DMLIST_INIT_ELEMENT(&(dmDeviceData[i].IncDisLink));
513 dmDeviceData[i].id = i;
514 dmDeviceData[i].DeviceType = DM_DEFAULT_DEVICE;
515 dmDeviceData[i].dmRoot = agNULL;
516 // dmDeviceData[i].agDevHandle = agNULL;
518 dmDeviceData[i].dmPortContext = agNULL;
519 dmDeviceData[i].dmExpander = agNULL;
520 dmDeviceData[i].ExpDevice = agNULL;
521 dmDeviceData[i].phyID = 0xFF;
522 dmDeviceData[i].SASAddressID.sasAddressHi = 0;
523 dmDeviceData[i].SASAddressID.sasAddressLo = 0;
524 dmDeviceData[i].valid = agFALSE;
525 dmDeviceData[i].valid2 = agFALSE;
526 dmDeviceData[i].processed = agFALSE;
527 dmDeviceData[i].initiator_ssp_stp_smp = 0;
528 dmDeviceData[i].target_ssp_stp_smp = 0;
529 dmDeviceData[i].numOfPhys = 0;
530 // dmDeviceData[i].registered = agFALSE;
531 dmDeviceData[i].directlyAttached = agFALSE;
532 dmDeviceData[i].SASSpecDeviceType = 0xFF;
533 dmDeviceData[i].IOStart = 0;
534 dmDeviceData[i].IOResponse = 0;
535 dmDeviceData[i].agDeviceResetContext.osData = agNULL;
536 dmDeviceData[i].agDeviceResetContext.sdkData = agNULL;
537 dmDeviceData[i].TRflag = agFALSE;
538 dmDeviceData[i].ResetCnt = 0;
539 dmDeviceData[i].registered = agFALSE;
540 dmDeviceData[i].reported = agFALSE;
542 dmDeviceData[i].MCN = 0;
543 dmDeviceData[i].MCNDone = agFALSE;
544 dmDeviceData[i].PrevMCN = 0;
546 dm_memset( &(dmDeviceData[i].dmDeviceInfo), 0, sizeof(dmDeviceInfo_t));
547 /* some other variables */
548 DMLIST_ENQUEUE_AT_TAIL(&(dmDeviceData[i].FreeLink), &(dmAllShared->FreeDeviceList));
556 dmDeviceData_t *oneDeviceData
559 DM_DBG3(("dmDeviceDataReInit: start \n"));
561 oneDeviceData->DeviceType = DM_DEFAULT_DEVICE;
562 // oneDeviceData->agDevHandle = agNULL;
564 oneDeviceData->dmPortContext = agNULL;
565 oneDeviceData->dmExpander = agNULL;
566 oneDeviceData->ExpDevice = agNULL;
567 oneDeviceData->phyID = 0xFF;
568 oneDeviceData->SASAddressID.sasAddressHi = 0;
569 oneDeviceData->SASAddressID.sasAddressLo = 0;
570 oneDeviceData->valid = agFALSE;
571 oneDeviceData->valid2 = agFALSE;
572 oneDeviceData->processed = agFALSE;
573 oneDeviceData->initiator_ssp_stp_smp = 0;
574 oneDeviceData->target_ssp_stp_smp = 0;
575 oneDeviceData->numOfPhys = 0;
576 // oneDeviceData->registered = agFALSE;
577 oneDeviceData->directlyAttached = agFALSE;
578 oneDeviceData->SASSpecDeviceType = 0xFF;
579 oneDeviceData->IOStart = 0;
580 oneDeviceData->IOResponse = 0;
581 oneDeviceData->agDeviceResetContext.osData = agNULL;
582 oneDeviceData->agDeviceResetContext.sdkData = agNULL;
583 oneDeviceData->TRflag = agFALSE;
584 oneDeviceData->ResetCnt = 0;
585 oneDeviceData->registered = agFALSE;
586 oneDeviceData->reported = agFALSE;
588 oneDeviceData->MCN = 0;
589 oneDeviceData->MCNDone = agFALSE;
590 oneDeviceData->PrevMCN = 0;
592 dm_memset( &(oneDeviceData->dmDeviceInfo), 0, sizeof(dmDeviceInfo_t));
599 dmExpanderDeviceDataInit(
604 dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
605 dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
606 dmExpander_t *dmExpData = (dmExpander_t *)dmAllShared->ExpanderMem;
608 DM_DBG3(("dmExpanderDeviceDataInit: start \n"));
610 DMLIST_INIT_HDR(&(dmAllShared->freeExpanderList));
611 DMLIST_INIT_HDR(&(dmAllShared->mainExpanderList));
613 for(i=0;i<max_exp;i++)
615 DMLIST_INIT_ELEMENT(&(dmExpData[i].linkNode));
616 DMLIST_INIT_ELEMENT(&(dmExpData[i].upNode));
617 /* initialize expander fields */
618 dmExpData[i].dmRoot = agNULL;
619 dmExpData[i].agDevHandle = agNULL;
620 dmExpData[i].dmDevice = agNULL;
621 dmExpData[i].dmUpStreamExpander = agNULL;
622 dmExpData[i].dmCurrentDownStreamExpander = agNULL;
623 dmExpData[i].hasUpStreamDevice = agFALSE;
624 dmExpData[i].numOfUpStreamPhys = 0;
625 dmExpData[i].currentUpStreamPhyIndex = 0;
626 dmExpData[i].numOfDownStreamPhys = 0;
627 dmExpData[i].currentDownStreamPhyIndex = 0;
628 dmExpData[i].discoveringPhyId = 0;
629 dmExpData[i].underDiscovering = agFALSE;
631 DM_DBG3(("dmExpanderDeviceDataInit: exp id %d\n", i));
633 dmExpData[i].dmReturnginExpander = agNULL;
634 dmExpData[i].discoverSMPAllowed = agTRUE;
635 dm_memset( &(dmExpData[i].currentIndex), 0, sizeof(dmExpData[i].currentIndex));
636 dm_memset( &(dmExpData[i].upStreamPhys), 0, sizeof(dmExpData[i].upStreamPhys));
637 dm_memset( &(dmExpData[i].downStreamPhys), 0, sizeof(dmExpData[i].downStreamPhys));
638 dm_memset( &(dmExpData[i].routingAttribute), 0, sizeof(dmExpData[i].routingAttribute));
639 dmExpData[i].configSASAddrTableIndex = 0;
640 dm_memset( &(dmExpData[i].configSASAddressHiTable), 0, sizeof(dmExpData[i].configSASAddressHiTable));
641 dm_memset( &(dmExpData[i].configSASAddressLoTable), 0, sizeof(dmExpData[i].configSASAddressLoTable));
642 dmExpData[i].SAS2 = 0; /* default is SAS 1.1 spec */
643 dmExpData[i].TTTSupported = agFALSE; /* Table to Table is supported */
644 dmExpData[i].UndoDueToTTTSupported = agFALSE;
647 DMLIST_ENQUEUE_AT_TAIL(&(dmExpData[i].linkNode), &(dmAllShared->freeExpanderList));
652 /* re-intialize an expander */
654 dmExpanderDeviceDataReInit(
656 dmExpander_t *oneExpander
659 DM_DBG3(("dmExpanderDeviceDataReInit: start \n"));
660 oneExpander->dmRoot = agNULL;
661 oneExpander->agDevHandle = agNULL;
662 oneExpander->dmDevice = agNULL;
663 oneExpander->dmUpStreamExpander = agNULL;
664 oneExpander->dmCurrentDownStreamExpander = agNULL;
665 oneExpander->hasUpStreamDevice = agFALSE;
666 oneExpander->numOfUpStreamPhys = 0;
667 oneExpander->currentUpStreamPhyIndex = 0;
668 oneExpander->numOfDownStreamPhys = 0;
669 oneExpander->currentDownStreamPhyIndex = 0;
670 oneExpander->discoveringPhyId = 0;
671 oneExpander->underDiscovering = agFALSE;
672 oneExpander->dmReturnginExpander = agNULL;
673 oneExpander->discoverSMPAllowed = agTRUE;
674 dm_memset( &(oneExpander->currentIndex), 0, sizeof(oneExpander->currentIndex));
675 dm_memset( &(oneExpander->upStreamPhys), 0, sizeof(oneExpander->upStreamPhys));
676 dm_memset( &(oneExpander->downStreamPhys), 0, sizeof(oneExpander->downStreamPhys));
677 dm_memset( &(oneExpander->routingAttribute), 0, sizeof(oneExpander->routingAttribute));
678 oneExpander->configSASAddrTableIndex = 0;
679 dm_memset( &(oneExpander->configSASAddressHiTable), 0, sizeof(oneExpander->configSASAddressHiTable));
680 dm_memset( &(oneExpander->configSASAddressLoTable), 0, sizeof(oneExpander->configSASAddressLoTable));
681 oneExpander->SAS2 = 0; /* default is SAS 1.1 spec */
682 oneExpander->TTTSupported = agFALSE; /* Table to Table is supported */
683 oneExpander->UndoDueToTTTSupported = agFALSE;
693 dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
694 dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
695 dmIntPortContext_t *dmPortContext = (dmIntPortContext_t *)dmAllShared->PortContextMem;
701 DM_DBG3(("dmPortContextInit: start \n"));
703 DMLIST_INIT_HDR(&(dmAllShared->MainPortContextList));
704 DMLIST_INIT_HDR(&(dmAllShared->FreePortContextList));
705 for(i=0;i<DM_MAX_PORT_CONTEXT;i++)
707 DMLIST_INIT_ELEMENT(&(dmPortContext[i].FreeLink));
708 DMLIST_INIT_ELEMENT(&(dmPortContext[i].MainLink));
710 DMLIST_INIT_HDR(&(dmPortContext[i].discovery.discoveringExpanderList));
711 DMLIST_INIT_HDR(&(dmPortContext[i].discovery.UpdiscoveringExpanderList));
712 dmPortContext[i].discovery.type = DM_DISCOVERY_OPTION_FULL_START;
713 dmInitTimerRequest(dmRoot, &(dmPortContext[i].discovery.discoveryTimer));
714 dmInitTimerRequest(dmRoot, &(dmPortContext[i].discovery.configureRouteTimer));
715 dmInitTimerRequest(dmRoot, &(dmPortContext[i].discovery.deviceRegistrationTimer));
716 dmInitTimerRequest(dmRoot, &(dmPortContext[i].discovery.SMPBusyTimer));
717 dmInitTimerRequest(dmRoot, &(dmPortContext[i].discovery.BCTimer));
718 dmInitTimerRequest(dmRoot, &(dmPortContext[i].discovery.DiscoverySMPTimer));
719 dmPortContext[i].discovery.retries = 0;
720 dmPortContext[i].discovery.configureRouteRetries = 0;
721 dmPortContext[i].discovery.deviceRetistrationRetries = 0;
722 dmPortContext[i].discovery.pendingSMP = 0;
723 dmPortContext[i].discovery.SeenBC = agFALSE;
724 dmPortContext[i].discovery.forcedOK = agFALSE;
725 dmPortContext[i].discovery.SMPRetries = 0;
726 dmPortContext[i].discovery.DeferredError = agFALSE;
727 dmPortContext[i].discovery.ConfiguresOthers = agFALSE;
728 dmPortContext[i].discovery.ResetTriggerred = agFALSE;
730 #ifdef INITIATOR_DRIVER
731 dmPortContext[i].DiscoveryState = DM_DSTATE_NOT_STARTED;
732 dmPortContext[i].DiscoveryAbortInProgress = agFALSE;
733 dmPortContext[i].directAttatchedSAS = agFALSE;
734 dmPortContext[i].DiscoveryRdyGiven = agFALSE;
735 dmPortContext[i].SeenLinkUp = agFALSE;
738 dmPortContext[i].id = i;
740 dmPortContext[i].agPortContext = agNULL;
742 dmPortContext[i].LinkRate = 0;
743 dmPortContext[i].Count = 0;
744 dmPortContext[i].valid = agFALSE;
745 dmPortContext[i].RegFailed = agFALSE;
748 for (j=0;j<DM_MAX_NUM_PHYS;j++)
750 dmPortContext[i].PhyIDList[j] = agFALSE;
753 dmPortContext[i].RegisteredDevNums = 0;
754 dmPortContext[i].eventPhyID = 0xFF;
755 dmPortContext[i].Transient = agFALSE;
757 /* add more variables later */
758 DMLIST_ENQUEUE_AT_TAIL(&(dmPortContext[i].FreeLink), &(dmAllShared->FreePortContextList));
761 #ifdef DM_INTERNAL_DEBUG /* for debugging only */
762 for(i=0;i<DM_MAX_PORT_CONTEXT;i++)
764 DM_DBG6(("dmPortContextInit: index %d &tdsaPortContext[] %p\n", i, &(dmPortContext[i])));
766 DM_DBG6(("dmPortContextInit: sizeof(tdsaPortContext_t) %d 0x%x\n", sizeof(dmIntPortContext_t), sizeof(dmIntPortContext_t)));
775 dmIntPortContext_t *onePortContext
778 dmDiscovery_t *discovery;
780 DM_DBG3(("dmPortContextReInit: start \n"));
782 discovery = &(onePortContext->discovery);
784 onePortContext->discovery.type = DM_DISCOVERY_OPTION_FULL_START;
785 onePortContext->discovery.retries = 0;
786 onePortContext->discovery.configureRouteRetries = 0;
787 onePortContext->discovery.deviceRetistrationRetries = 0;
788 onePortContext->discovery.pendingSMP = 0;
789 onePortContext->discovery.SeenBC = agFALSE;
790 onePortContext->discovery.forcedOK = agFALSE;
791 onePortContext->discovery.SMPRetries = 0;
792 onePortContext->discovery.DeferredError = agFALSE;
793 onePortContext->discovery.ConfiguresOthers = agFALSE;
794 onePortContext->discovery.ResetTriggerred = agFALSE;
796 /* free expander lists */
797 dmCleanAllExp(dmRoot, onePortContext);
799 /* kill the discovery-related timers if they are running */
800 tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
801 if (discovery->discoveryTimer.timerRunning == agTRUE)
803 tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
806 &discovery->discoveryTimer
811 tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
815 tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
816 if (discovery->configureRouteTimer.timerRunning == agTRUE)
818 tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
821 &discovery->configureRouteTimer
826 tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
830 tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
831 if (discovery->deviceRegistrationTimer.timerRunning == agTRUE)
833 tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
836 &discovery->deviceRegistrationTimer
841 tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
845 tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
846 if (discovery->BCTimer.timerRunning == agTRUE)
848 tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
856 tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
860 tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
861 if (discovery->SMPBusyTimer.timerRunning == agTRUE)
863 tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
866 &discovery->SMPBusyTimer
871 tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
875 tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
876 if (discovery->DiscoverySMPTimer.timerRunning == agTRUE)
878 tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
881 &discovery->DiscoverySMPTimer
886 tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
889 onePortContext->DiscoveryState = DM_DSTATE_NOT_STARTED;
890 onePortContext->DiscoveryAbortInProgress = agFALSE;
891 onePortContext->directAttatchedSAS = agFALSE;
892 onePortContext->DiscoveryRdyGiven = agFALSE;
893 onePortContext->SeenLinkUp = agFALSE;
895 onePortContext->dmPortContext->dmData = agNULL;
896 onePortContext->dmPortContext = agNULL;
897 onePortContext->dmRoot = agNULL;
899 onePortContext->LinkRate = 0;
900 onePortContext->Count = 0;
901 onePortContext->valid = agFALSE;
902 onePortContext->RegisteredDevNums = 0;
903 onePortContext->eventPhyID = 0xFF;
904 onePortContext->Transient = agFALSE;
915 dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
916 dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
918 #ifdef DM_DEBUG_ENABLE
919 dmIntPortContext_t *dmPortContext = (dmIntPortContext_t *)dmAllShared->PortContextMem;
921 DM_DBG6(("dmInitTimers: start \n"));
922 DM_DBG6(("dmInitTimers: ******* tdsaRoot %p \n", dmIntRoot));
923 DM_DBG6(("dmInitTimers: ******* tdsaPortContext %p \n",dmPortContext));
926 /* initialize the timerlist */
927 DMLIST_INIT_HDR(&(dmAllShared->timerlist));