xref: /freebsd/sys/dev/pms/RefTisa/discovery/dm/dminit.c (revision 685dc743dc3b5645e34836464128e1c0558b404b)
1*4e1bc9a0SAchim Leubner /*******************************************************************************
2*4e1bc9a0SAchim Leubner **
3*4e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
4*4e1bc9a0SAchim Leubner *
5*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
6*4e1bc9a0SAchim Leubner *that the following conditions are met:
7*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
8*4e1bc9a0SAchim Leubner *following disclaimer.
9*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
10*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
11*4e1bc9a0SAchim Leubner *with the distribution.
12*4e1bc9a0SAchim Leubner *
13*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
14*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
15*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
17*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
18*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
19*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
20*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
21*4e1bc9a0SAchim Leubner 
22*4e1bc9a0SAchim Leubner ********************************************************************************/
23*4e1bc9a0SAchim Leubner #include <sys/cdefs.h>
24*4e1bc9a0SAchim Leubner #include <dev/pms/config.h>
25*4e1bc9a0SAchim Leubner 
26*4e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osenv.h>
27*4e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/ostypes.h>
28*4e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osdebug.h>
29*4e1bc9a0SAchim Leubner 
30*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/sa.h>
31*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
32*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
33*4e1bc9a0SAchim Leubner 
34*4e1bc9a0SAchim Leubner #ifdef FDS_DM
35*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dm.h>
36*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dmapi.h>
37*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
38*4e1bc9a0SAchim Leubner 
39*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/dm/dmdefs.h>
40*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/dm/dmtypes.h>
41*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/dm/dmproto.h>
42*4e1bc9a0SAchim Leubner 
43*4e1bc9a0SAchim Leubner #ifdef DM_DEBUG
44*4e1bc9a0SAchim Leubner bit32 gDMDebugLevel = 1;
45*4e1bc9a0SAchim Leubner #endif
46*4e1bc9a0SAchim Leubner 
47*4e1bc9a0SAchim Leubner osGLOBAL void
dmGetRequirements(dmRoot_t * dmRoot,dmSwConfig_t * swConfig,dmMemoryRequirement_t * memoryRequirement,bit32 * usecsPerTick,bit32 * maxNumLocks)48*4e1bc9a0SAchim Leubner dmGetRequirements(
49*4e1bc9a0SAchim Leubner                   dmRoot_t 	  		*dmRoot,
50*4e1bc9a0SAchim Leubner                   dmSwConfig_t			*swConfig,
51*4e1bc9a0SAchim Leubner                   dmMemoryRequirement_t		*memoryRequirement,
52*4e1bc9a0SAchim Leubner                   bit32 			*usecsPerTick,
53*4e1bc9a0SAchim Leubner                   bit32				*maxNumLocks)
54*4e1bc9a0SAchim Leubner {
55*4e1bc9a0SAchim Leubner   bit32               memoryReqCount = 0;
56*4e1bc9a0SAchim Leubner   bit32               max_expander = DM_MAX_EXPANDER_DEV;
57*4e1bc9a0SAchim Leubner   char    *buffer;
58*4e1bc9a0SAchim Leubner   bit32   buffLen;
59*4e1bc9a0SAchim Leubner   bit32   lenRecv = 0;
60*4e1bc9a0SAchim Leubner   static char    tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
61*4e1bc9a0SAchim Leubner   char    *pLastUsedChar = agNULL;
62*4e1bc9a0SAchim Leubner   char    globalStr[]     = "Global";
63*4e1bc9a0SAchim Leubner   char    iniParmsStr[]   = "InitiatorParms";
64*4e1bc9a0SAchim Leubner   char    SwParmsStr[]    = "SWParms";
65*4e1bc9a0SAchim Leubner 
66*4e1bc9a0SAchim Leubner   DM_DBG3(("dmGetRequirements: start\n"));
67*4e1bc9a0SAchim Leubner   /* sanity check */
68*4e1bc9a0SAchim Leubner   DM_ASSERT((agNULL != swConfig), "");
69*4e1bc9a0SAchim Leubner   DM_ASSERT((agNULL != memoryRequirement), "");
70*4e1bc9a0SAchim Leubner   DM_ASSERT((agNULL != usecsPerTick), "");
71*4e1bc9a0SAchim Leubner   DM_ASSERT((agNULL != maxNumLocks), "");
72*4e1bc9a0SAchim Leubner 
73*4e1bc9a0SAchim Leubner   /* memory requirement for dmRoot, CACHE memory */
74*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].singleElementLength = sizeof(dmIntRoot_t);
75*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].numElements = 1;
76*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].totalLength =
77*4e1bc9a0SAchim Leubner       (memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].singleElementLength) * (memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].numElements);
78*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].alignment = 4;
79*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_ROOT_MEM_INDEX].type = DM_CACHED_MEM;
80*4e1bc9a0SAchim Leubner   memoryReqCount++;
81*4e1bc9a0SAchim Leubner 
82*4e1bc9a0SAchim Leubner   /* memory requirement for Port Context Links, CACHE memory */
83*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].singleElementLength = sizeof(dmIntPortContext_t);
84*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].numElements = DM_MAX_PORT_CONTEXT;
85*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].totalLength =
86*4e1bc9a0SAchim Leubner       (memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].singleElementLength) * (memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].numElements);
87*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].alignment = 4;
88*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_PORT_MEM_INDEX].type = DM_CACHED_MEM;
89*4e1bc9a0SAchim Leubner   memoryReqCount++;
90*4e1bc9a0SAchim Leubner 
91*4e1bc9a0SAchim Leubner   /* memory requirement for Device Links, CACHE memory */
92*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].singleElementLength = sizeof(dmDeviceData_t);
93*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].numElements = DM_MAX_DEV;
94*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].totalLength =
95*4e1bc9a0SAchim Leubner       (memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].singleElementLength) * (memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].numElements);
96*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].alignment = 4;
97*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_DEVICE_MEM_INDEX].type = DM_CACHED_MEM;
98*4e1bc9a0SAchim Leubner   memoryReqCount++;
99*4e1bc9a0SAchim Leubner 
100*4e1bc9a0SAchim Leubner   /* memory requirement for Expander Device Links, CACHE memory */
101*4e1bc9a0SAchim Leubner   /*
102*4e1bc9a0SAchim Leubner      Maximum number of expanders are configurable
103*4e1bc9a0SAchim Leubner      The default is DM_MAX_EXPANDER_DEV
104*4e1bc9a0SAchim Leubner   */
105*4e1bc9a0SAchim Leubner   buffer = tmpBuffer;
106*4e1bc9a0SAchim Leubner   buffLen = sizeof(tmpBuffer);
107*4e1bc9a0SAchim Leubner 
108*4e1bc9a0SAchim Leubner   dm_memset(buffer, 0, buffLen);
109*4e1bc9a0SAchim Leubner   lenRecv = 0;
110*4e1bc9a0SAchim Leubner 
111*4e1bc9a0SAchim Leubner   if ((tddmGetTransportParam(
112*4e1bc9a0SAchim Leubner                              dmRoot,
113*4e1bc9a0SAchim Leubner                              globalStr,
114*4e1bc9a0SAchim Leubner                              iniParmsStr,
115*4e1bc9a0SAchim Leubner                              agNULL,
116*4e1bc9a0SAchim Leubner                              agNULL,
117*4e1bc9a0SAchim Leubner                              agNULL,
118*4e1bc9a0SAchim Leubner                              agNULL,
119*4e1bc9a0SAchim Leubner                              "MaxExpanders",
120*4e1bc9a0SAchim Leubner                              buffer,
121*4e1bc9a0SAchim Leubner                              buffLen,
122*4e1bc9a0SAchim Leubner                              &lenRecv
123*4e1bc9a0SAchim Leubner                              ) == DM_RC_SUCCESS) && (lenRecv != 0))
124*4e1bc9a0SAchim Leubner   {
125*4e1bc9a0SAchim Leubner     if (osti_strncmp(buffer, "0x", 2) == 0)
126*4e1bc9a0SAchim Leubner     {
127*4e1bc9a0SAchim Leubner       max_expander = osti_strtoul (buffer, &pLastUsedChar, 0);
128*4e1bc9a0SAchim Leubner     }
129*4e1bc9a0SAchim Leubner     else
130*4e1bc9a0SAchim Leubner     {
131*4e1bc9a0SAchim Leubner       max_expander = osti_strtoul (buffer, &pLastUsedChar, 10);
132*4e1bc9a0SAchim Leubner     }
133*4e1bc9a0SAchim Leubner   }
134*4e1bc9a0SAchim Leubner   DM_DBG3(("dmGetRequirements: max_expander %d\n", max_expander));
135*4e1bc9a0SAchim Leubner 
136*4e1bc9a0SAchim Leubner 
137*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].singleElementLength = sizeof(dmExpander_t);
138*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].numElements = max_expander;
139*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].totalLength =
140*4e1bc9a0SAchim Leubner       (memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].singleElementLength) * (memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].numElements);
141*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].alignment = 4;
142*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_EXPANDER_MEM_INDEX].type = DM_CACHED_MEM;
143*4e1bc9a0SAchim Leubner   memoryReqCount++;
144*4e1bc9a0SAchim Leubner 
145*4e1bc9a0SAchim Leubner   /* memory requirement for SMP command Links, CACHE memory */
146*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].singleElementLength = sizeof(dmSMPRequestBody_t);
147*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].numElements = DM_MAX_SMP;
148*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].totalLength =
149*4e1bc9a0SAchim Leubner       (memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].singleElementLength) * (memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].numElements);
150*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].alignment = 4;
151*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_SMP_MEM_INDEX].type = DM_CACHED_MEM;
152*4e1bc9a0SAchim Leubner   memoryReqCount++;
153*4e1bc9a0SAchim Leubner 
154*4e1bc9a0SAchim Leubner   /* memory requirement for INDIRECT SMP command/response Links, DMA memory */
155*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].singleElementLength = SMP_INDIRECT_PAYLOAD; /* 512 */
156*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].numElements = DM_MAX_INDIRECT_SMP;
157*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].totalLength =
158*4e1bc9a0SAchim Leubner       (memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].singleElementLength) * (memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].numElements);
159*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].alignment = 4;
160*4e1bc9a0SAchim Leubner   memoryRequirement->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].type = DM_DMA_MEM;
161*4e1bc9a0SAchim Leubner   memoryReqCount++;
162*4e1bc9a0SAchim Leubner 
163*4e1bc9a0SAchim Leubner 
164*4e1bc9a0SAchim Leubner   /* set up memory requirement count */
165*4e1bc9a0SAchim Leubner   memoryRequirement->count = memoryReqCount;
166*4e1bc9a0SAchim Leubner 
167*4e1bc9a0SAchim Leubner   /* requirement for locks */
168*4e1bc9a0SAchim Leubner   *maxNumLocks = DM_MAX_LOCKS;
169*4e1bc9a0SAchim Leubner 
170*4e1bc9a0SAchim Leubner   /* setup the time tick */
171*4e1bc9a0SAchim Leubner   *usecsPerTick = DM_USECS_PER_TICK;
172*4e1bc9a0SAchim Leubner 
173*4e1bc9a0SAchim Leubner 
174*4e1bc9a0SAchim Leubner   /* set up the number of Expander device handles */
175*4e1bc9a0SAchim Leubner   swConfig->numDevHandles = DM_MAX_DEV;
176*4e1bc9a0SAchim Leubner   swConfig->itNexusTimeout = IT_NEXUS_TIMEOUT;   /* default is 2000 ms*/
177*4e1bc9a0SAchim Leubner 
178*4e1bc9a0SAchim Leubner   dm_memset(buffer, 0, buffLen);
179*4e1bc9a0SAchim Leubner   lenRecv = 0;
180*4e1bc9a0SAchim Leubner 
181*4e1bc9a0SAchim Leubner   if ((tddmGetTransportParam(
182*4e1bc9a0SAchim Leubner                              dmRoot,
183*4e1bc9a0SAchim Leubner                              globalStr,
184*4e1bc9a0SAchim Leubner                              SwParmsStr,
185*4e1bc9a0SAchim Leubner                              agNULL,
186*4e1bc9a0SAchim Leubner                              agNULL,
187*4e1bc9a0SAchim Leubner                              agNULL,
188*4e1bc9a0SAchim Leubner                              agNULL,
189*4e1bc9a0SAchim Leubner                              "IT_NEXUS_TIMEOUT",
190*4e1bc9a0SAchim Leubner                              buffer,
191*4e1bc9a0SAchim Leubner                              buffLen,
192*4e1bc9a0SAchim Leubner                              &lenRecv
193*4e1bc9a0SAchim Leubner                              ) == DM_RC_SUCCESS) && (lenRecv != 0))
194*4e1bc9a0SAchim Leubner   {
195*4e1bc9a0SAchim Leubner     if (osti_strncmp(buffer, "0x", 2) == 0)
196*4e1bc9a0SAchim Leubner     {
197*4e1bc9a0SAchim Leubner       swConfig->itNexusTimeout = osti_strtoul (buffer, &pLastUsedChar, 0);
198*4e1bc9a0SAchim Leubner     }
199*4e1bc9a0SAchim Leubner     else
200*4e1bc9a0SAchim Leubner     {
201*4e1bc9a0SAchim Leubner       swConfig->itNexusTimeout = osti_strtoul (buffer, &pLastUsedChar, 10);
202*4e1bc9a0SAchim Leubner     }
203*4e1bc9a0SAchim Leubner   }
204*4e1bc9a0SAchim Leubner 
205*4e1bc9a0SAchim Leubner   DM_DBG1(("dmGetRequirements: swConfig->itNexusTimeout 0x%X\n", swConfig->itNexusTimeout));
206*4e1bc9a0SAchim Leubner 
207*4e1bc9a0SAchim Leubner   DM_DBG3(("dmGetRequirements: memoryReqCount %d\n", memoryRequirement->count));
208*4e1bc9a0SAchim Leubner 
209*4e1bc9a0SAchim Leubner   return;
210*4e1bc9a0SAchim Leubner }
211*4e1bc9a0SAchim Leubner /*
212*4e1bc9a0SAchim Leubner   ??? processing swConfig
213*4e1bc9a0SAchim Leubner */
214*4e1bc9a0SAchim Leubner osGLOBAL bit32
dmInitialize(dmRoot_t * dmRoot,agsaRoot_t * agRoot,dmMemoryRequirement_t * memoryAllocated,dmSwConfig_t * swConfig,bit32 usecsPerTick)215*4e1bc9a0SAchim Leubner dmInitialize(
216*4e1bc9a0SAchim Leubner              dmRoot_t			*dmRoot,
217*4e1bc9a0SAchim Leubner              agsaRoot_t                 *agRoot,
218*4e1bc9a0SAchim Leubner              dmMemoryRequirement_t	*memoryAllocated,
219*4e1bc9a0SAchim Leubner              dmSwConfig_t		*swConfig,
220*4e1bc9a0SAchim Leubner              bit32			usecsPerTick )
221*4e1bc9a0SAchim Leubner {
222*4e1bc9a0SAchim Leubner   dmIntRoot_t               *dmIntRoot;
223*4e1bc9a0SAchim Leubner   dmIntPortContext_t        *dmIntPortContext;
224*4e1bc9a0SAchim Leubner   dmDeviceData_t            *dmDevice;
225*4e1bc9a0SAchim Leubner   dmExpander_t              *dmExpander;
226*4e1bc9a0SAchim Leubner   dmSMPRequestBody_t        *dmSMPRequest;
227*4e1bc9a0SAchim Leubner   bit8                      *dmIndirectSMPRequest;
228*4e1bc9a0SAchim Leubner   dmIntContext_t            *dmAllShared;
229*4e1bc9a0SAchim Leubner   bit32              i;
230*4e1bc9a0SAchim Leubner   bit32               max_expander = DM_MAX_EXPANDER_DEV;
231*4e1bc9a0SAchim Leubner   char    *buffer;
232*4e1bc9a0SAchim Leubner   bit32   buffLen;
233*4e1bc9a0SAchim Leubner   bit32   lenRecv = 0;
234*4e1bc9a0SAchim Leubner   static char    tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
235*4e1bc9a0SAchim Leubner   char    *pLastUsedChar = agNULL;
236*4e1bc9a0SAchim Leubner   char    globalStr[]     = "Global";
237*4e1bc9a0SAchim Leubner   char    iniParmsStr[]   = "InitiatorParms";
238*4e1bc9a0SAchim Leubner   char    SwParmsStr[]    = "SWParms";
239*4e1bc9a0SAchim Leubner 
240*4e1bc9a0SAchim Leubner   DM_DBG3(("dmInitialize: start\n"));
241*4e1bc9a0SAchim Leubner   /* sanity check */
242*4e1bc9a0SAchim Leubner   DM_ASSERT((agNULL != dmRoot), "");
243*4e1bc9a0SAchim Leubner   DM_ASSERT((agNULL != agRoot), "");
244*4e1bc9a0SAchim Leubner   DM_ASSERT((agNULL != memoryAllocated), "");
245*4e1bc9a0SAchim Leubner   DM_ASSERT((agNULL != swConfig), "");
246*4e1bc9a0SAchim Leubner   DM_ASSERT((DM_ROOT_MEM_INDEX < memoryAllocated->count), "");
247*4e1bc9a0SAchim Leubner   DM_ASSERT((DM_PORT_MEM_INDEX < memoryAllocated->count), "");
248*4e1bc9a0SAchim Leubner   DM_ASSERT((DM_DEVICE_MEM_INDEX < memoryAllocated->count), "");
249*4e1bc9a0SAchim Leubner   DM_ASSERT((DM_EXPANDER_MEM_INDEX < memoryAllocated->count), "");
250*4e1bc9a0SAchim Leubner   DM_ASSERT((DM_SMP_MEM_INDEX < memoryAllocated->count), "");
251*4e1bc9a0SAchim Leubner   DM_ASSERT((DM_INDIRECT_SMP_MEM_INDEX < memoryAllocated->count), "");
252*4e1bc9a0SAchim Leubner 
253*4e1bc9a0SAchim Leubner   /* Check the memory allocated */
254*4e1bc9a0SAchim Leubner   for ( i = 0; i < memoryAllocated->count; i ++ )
255*4e1bc9a0SAchim Leubner   {
256*4e1bc9a0SAchim Leubner     /* If memory allocatation failed  */
257*4e1bc9a0SAchim Leubner     if (memoryAllocated->dmMemory[i].singleElementLength &&
258*4e1bc9a0SAchim Leubner         memoryAllocated->dmMemory[i].numElements)
259*4e1bc9a0SAchim Leubner     {
260*4e1bc9a0SAchim Leubner       if ( (0 != memoryAllocated->dmMemory[i].numElements)
261*4e1bc9a0SAchim Leubner           && (0 == memoryAllocated->dmMemory[i].totalLength) )
262*4e1bc9a0SAchim Leubner       {
263*4e1bc9a0SAchim Leubner         /* return failure */
264*4e1bc9a0SAchim Leubner         DM_DBG1(("dmInitialize: Memory[%d]  singleElementLength = 0x%0x  numElements = 0x%x NOT allocated!!!\n",
265*4e1bc9a0SAchim Leubner           i,
266*4e1bc9a0SAchim Leubner           memoryAllocated->dmMemory[i].singleElementLength,
267*4e1bc9a0SAchim Leubner           memoryAllocated->dmMemory[i].numElements));
268*4e1bc9a0SAchim Leubner         return DM_RC_FAILURE;
269*4e1bc9a0SAchim Leubner       }
270*4e1bc9a0SAchim Leubner     }
271*4e1bc9a0SAchim Leubner   }
272*4e1bc9a0SAchim Leubner 
273*4e1bc9a0SAchim Leubner   /* DM's internal root */
274*4e1bc9a0SAchim Leubner   dmIntRoot  = (dmIntRoot_t *) (memoryAllocated->dmMemory[DM_ROOT_MEM_INDEX].virtPtr);
275*4e1bc9a0SAchim Leubner   dmRoot->dmData = (void *) dmIntRoot;
276*4e1bc9a0SAchim Leubner 
277*4e1bc9a0SAchim Leubner   dmAllShared = (dmIntContext_t *)&(dmIntRoot->dmAllShared);
278*4e1bc9a0SAchim Leubner   /**<  Initialize the TDM data part of the interrupt context */
279*4e1bc9a0SAchim Leubner   dmAllShared->dmRootOsData.dmRoot     = dmRoot;
280*4e1bc9a0SAchim Leubner   dmAllShared->dmRootOsData.dmAllShared   = (void *) dmAllShared;
281*4e1bc9a0SAchim Leubner 
282*4e1bc9a0SAchim Leubner   /* Port Contexts */
283*4e1bc9a0SAchim Leubner   dmIntPortContext = (dmIntPortContext_t *) (memoryAllocated->dmMemory[DM_PORT_MEM_INDEX].virtPtr);
284*4e1bc9a0SAchim Leubner   dmAllShared->PortContextMem = (dmIntPortContext_t *)dmIntPortContext;
285*4e1bc9a0SAchim Leubner 
286*4e1bc9a0SAchim Leubner   /* Devices */
287*4e1bc9a0SAchim Leubner   dmDevice = (dmDeviceData_t *) (memoryAllocated->dmMemory[DM_DEVICE_MEM_INDEX].virtPtr);
288*4e1bc9a0SAchim Leubner   dmAllShared->DeviceMem = (dmDeviceData_t *)dmDevice;
289*4e1bc9a0SAchim Leubner 
290*4e1bc9a0SAchim Leubner   /* Expanders */
291*4e1bc9a0SAchim Leubner   dmExpander = (dmExpander_t *) (memoryAllocated->dmMemory[DM_EXPANDER_MEM_INDEX].virtPtr);
292*4e1bc9a0SAchim Leubner   dmAllShared->ExpanderMem = (dmExpander_t *)dmExpander;
293*4e1bc9a0SAchim Leubner 
294*4e1bc9a0SAchim Leubner   /* SMP commands */
295*4e1bc9a0SAchim Leubner   dmSMPRequest = (dmSMPRequestBody_t *) (memoryAllocated->dmMemory[DM_SMP_MEM_INDEX].virtPtr);
296*4e1bc9a0SAchim Leubner   dmAllShared->SMPMem = (dmSMPRequestBody_t *)dmSMPRequest;
297*4e1bc9a0SAchim Leubner 
298*4e1bc9a0SAchim Leubner   /* DMAable SMP request/reponse pointed by dmSMPRequestBody_t */
299*4e1bc9a0SAchim Leubner   dmIndirectSMPRequest = (bit8 *) (memoryAllocated->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].virtPtr);
300*4e1bc9a0SAchim Leubner   dmAllShared->IndirectSMPMem = (bit8 *)dmIndirectSMPRequest;
301*4e1bc9a0SAchim Leubner   dmAllShared->IndirectSMPUpper32 = memoryAllocated->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].physAddrUpper;
302*4e1bc9a0SAchim Leubner   dmAllShared->IndirectSMPLower32 = memoryAllocated->dmMemory[DM_INDIRECT_SMP_MEM_INDEX].physAddrLower;
303*4e1bc9a0SAchim Leubner 
304*4e1bc9a0SAchim Leubner   dmAllShared->agRoot = agRoot;
305*4e1bc9a0SAchim Leubner 
306*4e1bc9a0SAchim Leubner 
307*4e1bc9a0SAchim Leubner   dmAllShared->usecsPerTick = usecsPerTick;
308*4e1bc9a0SAchim Leubner   dmAllShared->itNexusTimeout = IT_NEXUS_TIMEOUT;/*swConfig->itNexusTimeout;*/
309*4e1bc9a0SAchim Leubner   dmAllShared->MaxRetryDiscovery = DISCOVERY_RETRIES;
310*4e1bc9a0SAchim Leubner   dmAllShared->RateAdjust = 0;
311*4e1bc9a0SAchim Leubner   /**< initializes timers */
312*4e1bc9a0SAchim Leubner   dmInitTimers(dmRoot);
313*4e1bc9a0SAchim Leubner 
314*4e1bc9a0SAchim Leubner   /**< initializes port contexts */
315*4e1bc9a0SAchim Leubner   dmPortContextInit(dmRoot);
316*4e1bc9a0SAchim Leubner 
317*4e1bc9a0SAchim Leubner   /**< initializes devices */
318*4e1bc9a0SAchim Leubner   dmDeviceDataInit(dmRoot);
319*4e1bc9a0SAchim Leubner 
320*4e1bc9a0SAchim Leubner   /**< initializes expander devices */
321*4e1bc9a0SAchim Leubner   buffer = tmpBuffer;
322*4e1bc9a0SAchim Leubner   buffLen = sizeof(tmpBuffer);
323*4e1bc9a0SAchim Leubner 
324*4e1bc9a0SAchim Leubner   dm_memset(buffer, 0, buffLen);
325*4e1bc9a0SAchim Leubner   lenRecv = 0;
326*4e1bc9a0SAchim Leubner 
327*4e1bc9a0SAchim Leubner   if ((tddmGetTransportParam(
328*4e1bc9a0SAchim Leubner                              dmRoot,
329*4e1bc9a0SAchim Leubner                              globalStr,
330*4e1bc9a0SAchim Leubner                              iniParmsStr,
331*4e1bc9a0SAchim Leubner                              agNULL,
332*4e1bc9a0SAchim Leubner                              agNULL,
333*4e1bc9a0SAchim Leubner                              agNULL,
334*4e1bc9a0SAchim Leubner                              agNULL,
335*4e1bc9a0SAchim Leubner                              "MaxExpanders",
336*4e1bc9a0SAchim Leubner                              buffer,
337*4e1bc9a0SAchim Leubner                              buffLen,
338*4e1bc9a0SAchim Leubner                              &lenRecv
339*4e1bc9a0SAchim Leubner                              ) == DM_RC_SUCCESS) && (lenRecv != 0))
340*4e1bc9a0SAchim Leubner   {
341*4e1bc9a0SAchim Leubner     if (osti_strncmp(buffer, "0x", 2) == 0)
342*4e1bc9a0SAchim Leubner     {
343*4e1bc9a0SAchim Leubner       max_expander = osti_strtoul (buffer, &pLastUsedChar, 0);
344*4e1bc9a0SAchim Leubner     }
345*4e1bc9a0SAchim Leubner     else
346*4e1bc9a0SAchim Leubner     {
347*4e1bc9a0SAchim Leubner       max_expander = osti_strtoul (buffer, &pLastUsedChar, 10);
348*4e1bc9a0SAchim Leubner     }
349*4e1bc9a0SAchim Leubner   }
350*4e1bc9a0SAchim Leubner 
351*4e1bc9a0SAchim Leubner   dm_memset(buffer, 0, buffLen);
352*4e1bc9a0SAchim Leubner   lenRecv = 0;
353*4e1bc9a0SAchim Leubner 
354*4e1bc9a0SAchim Leubner   if ((tddmGetTransportParam(
355*4e1bc9a0SAchim Leubner                              dmRoot,
356*4e1bc9a0SAchim Leubner                              globalStr,
357*4e1bc9a0SAchim Leubner                              SwParmsStr,
358*4e1bc9a0SAchim Leubner                              agNULL,
359*4e1bc9a0SAchim Leubner                              agNULL,
360*4e1bc9a0SAchim Leubner                              agNULL,
361*4e1bc9a0SAchim Leubner                              agNULL,
362*4e1bc9a0SAchim Leubner                              "IT_NEXUS_TIMEOUT",
363*4e1bc9a0SAchim Leubner                              buffer,
364*4e1bc9a0SAchim Leubner                              buffLen,
365*4e1bc9a0SAchim Leubner                              &lenRecv
366*4e1bc9a0SAchim Leubner                              ) == DM_RC_SUCCESS) && (lenRecv != 0))
367*4e1bc9a0SAchim Leubner   {
368*4e1bc9a0SAchim Leubner     if (osti_strncmp(buffer, "0x", 2) == 0)
369*4e1bc9a0SAchim Leubner     {
370*4e1bc9a0SAchim Leubner       dmAllShared->itNexusTimeout = osti_strtoul (buffer, &pLastUsedChar, 0);
371*4e1bc9a0SAchim Leubner     }
372*4e1bc9a0SAchim Leubner     else
373*4e1bc9a0SAchim Leubner     {
374*4e1bc9a0SAchim Leubner       dmAllShared->itNexusTimeout = osti_strtoul (buffer, &pLastUsedChar, 10);
375*4e1bc9a0SAchim Leubner     }
376*4e1bc9a0SAchim Leubner   }
377*4e1bc9a0SAchim Leubner 
378*4e1bc9a0SAchim Leubner   DM_DBG1(("dmAllShared->itNexusTimeout %d \n", dmAllShared->itNexusTimeout));
379*4e1bc9a0SAchim Leubner 
380*4e1bc9a0SAchim Leubner   dm_memset(buffer, 0, buffLen);
381*4e1bc9a0SAchim Leubner   lenRecv = 0;
382*4e1bc9a0SAchim Leubner 
383*4e1bc9a0SAchim Leubner   if ((tddmGetTransportParam(
384*4e1bc9a0SAchim Leubner                              dmRoot,
385*4e1bc9a0SAchim Leubner                              globalStr,
386*4e1bc9a0SAchim Leubner                              SwParmsStr,
387*4e1bc9a0SAchim Leubner                              agNULL,
388*4e1bc9a0SAchim Leubner                              agNULL,
389*4e1bc9a0SAchim Leubner                              agNULL,
390*4e1bc9a0SAchim Leubner                              agNULL,
391*4e1bc9a0SAchim Leubner                              "MaxRetryDiscovery",
392*4e1bc9a0SAchim Leubner                              buffer,
393*4e1bc9a0SAchim Leubner                              buffLen,
394*4e1bc9a0SAchim Leubner                              &lenRecv
395*4e1bc9a0SAchim Leubner                              ) == DM_RC_SUCCESS) && (lenRecv != 0))
396*4e1bc9a0SAchim Leubner   {
397*4e1bc9a0SAchim Leubner     if (osti_strncmp(buffer, "0x", 2) == 0)
398*4e1bc9a0SAchim Leubner     {
399*4e1bc9a0SAchim Leubner       dmAllShared->MaxRetryDiscovery = osti_strtoul (buffer, &pLastUsedChar, 0);
400*4e1bc9a0SAchim Leubner     }
401*4e1bc9a0SAchim Leubner     else
402*4e1bc9a0SAchim Leubner     {
403*4e1bc9a0SAchim Leubner       dmAllShared->MaxRetryDiscovery = osti_strtoul (buffer, &pLastUsedChar, 10);
404*4e1bc9a0SAchim Leubner     }
405*4e1bc9a0SAchim Leubner   }
406*4e1bc9a0SAchim Leubner 
407*4e1bc9a0SAchim Leubner   DM_DBG1(("dmAllShared->MaxRetryDiscovery %d \n", dmAllShared->MaxRetryDiscovery));
408*4e1bc9a0SAchim Leubner 
409*4e1bc9a0SAchim Leubner   dm_memset(buffer, 0, buffLen);
410*4e1bc9a0SAchim Leubner   lenRecv = 0;
411*4e1bc9a0SAchim Leubner   if ((tddmGetTransportParam(
412*4e1bc9a0SAchim Leubner                              dmRoot,
413*4e1bc9a0SAchim Leubner                              globalStr,
414*4e1bc9a0SAchim Leubner                              SwParmsStr,
415*4e1bc9a0SAchim Leubner                              agNULL,
416*4e1bc9a0SAchim Leubner                              agNULL,
417*4e1bc9a0SAchim Leubner                              agNULL,
418*4e1bc9a0SAchim Leubner                              agNULL,
419*4e1bc9a0SAchim Leubner                              "RateAdjust",
420*4e1bc9a0SAchim Leubner                              buffer,
421*4e1bc9a0SAchim Leubner                              buffLen,
422*4e1bc9a0SAchim Leubner                              &lenRecv
423*4e1bc9a0SAchim Leubner                              ) == DM_RC_SUCCESS) && (lenRecv != 0))
424*4e1bc9a0SAchim Leubner   {
425*4e1bc9a0SAchim Leubner     if (osti_strncmp(buffer, "0x", 2) == 0)
426*4e1bc9a0SAchim Leubner     {
427*4e1bc9a0SAchim Leubner       dmAllShared->RateAdjust = osti_strtoul (buffer, &pLastUsedChar, 0);
428*4e1bc9a0SAchim Leubner     }
429*4e1bc9a0SAchim Leubner     else
430*4e1bc9a0SAchim Leubner     {
431*4e1bc9a0SAchim Leubner       dmAllShared->RateAdjust = osti_strtoul (buffer, &pLastUsedChar, 10);
432*4e1bc9a0SAchim Leubner     }
433*4e1bc9a0SAchim Leubner   }
434*4e1bc9a0SAchim Leubner   DM_DBG1(("dmAllShared->RateAdjust %d \n", dmAllShared->RateAdjust));
435*4e1bc9a0SAchim Leubner 
436*4e1bc9a0SAchim Leubner   dmExpanderDeviceDataInit(dmRoot, max_expander);
437*4e1bc9a0SAchim Leubner 
438*4e1bc9a0SAchim Leubner   /**< initializes SMP commands */
439*4e1bc9a0SAchim Leubner   dmSMPInit(dmRoot);
440*4e1bc9a0SAchim Leubner 
441*4e1bc9a0SAchim Leubner #ifdef DM_DEBUG
442*4e1bc9a0SAchim Leubner   gDMDebugLevel = swConfig->DMDebugLevel;
443*4e1bc9a0SAchim Leubner #endif
444*4e1bc9a0SAchim Leubner   return DM_RC_SUCCESS;
445*4e1bc9a0SAchim Leubner }
446*4e1bc9a0SAchim Leubner 
447*4e1bc9a0SAchim Leubner osGLOBAL void
dmSMPInit(dmRoot_t * dmRoot)448*4e1bc9a0SAchim Leubner dmSMPInit(
449*4e1bc9a0SAchim Leubner           dmRoot_t *dmRoot
450*4e1bc9a0SAchim Leubner          )
451*4e1bc9a0SAchim Leubner {
452*4e1bc9a0SAchim Leubner   dmIntRoot_t               *dmIntRoot    = (dmIntRoot_t *)dmRoot->dmData;
453*4e1bc9a0SAchim Leubner   dmIntContext_t            *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
454*4e1bc9a0SAchim Leubner   dmSMPRequestBody_t        *dmSMPCommand = (dmSMPRequestBody_t *)dmAllShared->SMPMem;
455*4e1bc9a0SAchim Leubner   bit8                      *dmIndirectSMPReqRsp = (bit8 *)dmAllShared->IndirectSMPMem;
456*4e1bc9a0SAchim Leubner   bit32                     prev_PhysAddrLower;
457*4e1bc9a0SAchim Leubner 
458*4e1bc9a0SAchim Leubner   int i = 0;
459*4e1bc9a0SAchim Leubner   DM_DBG3(("dmSMPInit: start \n"));
460*4e1bc9a0SAchim Leubner 
461*4e1bc9a0SAchim Leubner   DMLIST_INIT_HDR(&(dmAllShared->freeSMPList));
462*4e1bc9a0SAchim Leubner 
463*4e1bc9a0SAchim Leubner   for(i=0;i<DM_MAX_SMP;i++)
464*4e1bc9a0SAchim Leubner   {
465*4e1bc9a0SAchim Leubner     DMLIST_INIT_ELEMENT(&(dmSMPCommand[i].Link));
466*4e1bc9a0SAchim Leubner     /* initialize expander fields */
467*4e1bc9a0SAchim Leubner     dmSMPCommand[i].dmRoot = agNULL;
468*4e1bc9a0SAchim Leubner     dmSMPCommand[i].dmDevice = agNULL;
469*4e1bc9a0SAchim Leubner     dmSMPCommand[i].dmPortContext = agNULL;
470*4e1bc9a0SAchim Leubner     dmSMPCommand[i].retries = 0;
471*4e1bc9a0SAchim Leubner     dmSMPCommand[i].id = i;
472*4e1bc9a0SAchim Leubner     dm_memset( &(dmSMPCommand[i].smpPayload), 0, sizeof(dmSMPCommand[i].smpPayload));
473*4e1bc9a0SAchim Leubner     /* indirect SMP related */
474*4e1bc9a0SAchim Leubner     dmSMPCommand[i].IndirectSMPResponse = agNULL;
475*4e1bc9a0SAchim Leubner     dmSMPCommand[i].IndirectSMP = ((bit8 *)dmIndirectSMPReqRsp) + (i*SMP_INDIRECT_PAYLOAD);
476*4e1bc9a0SAchim Leubner     dmSMPCommand[i].IndirectSMPUpper32 = dmAllShared->IndirectSMPUpper32;
477*4e1bc9a0SAchim Leubner     dmSMPCommand[i].IndirectSMPLower32 = dmAllShared->IndirectSMPLower32;
478*4e1bc9a0SAchim Leubner 
479*4e1bc9a0SAchim Leubner     prev_PhysAddrLower = dmAllShared->IndirectSMPLower32;
480*4e1bc9a0SAchim Leubner     dmAllShared->IndirectSMPLower32 = dmAllShared->IndirectSMPLower32 + SMP_INDIRECT_PAYLOAD;
481*4e1bc9a0SAchim Leubner     if (dmAllShared->IndirectSMPLower32 <= prev_PhysAddrLower)
482*4e1bc9a0SAchim Leubner     {
483*4e1bc9a0SAchim Leubner       dmAllShared->IndirectSMPUpper32++;
484*4e1bc9a0SAchim Leubner     }
485*4e1bc9a0SAchim Leubner 
486*4e1bc9a0SAchim Leubner     DMLIST_ENQUEUE_AT_TAIL(&(dmSMPCommand[i].Link), &(dmAllShared->freeSMPList));
487*4e1bc9a0SAchim Leubner   }
488*4e1bc9a0SAchim Leubner   return;
489*4e1bc9a0SAchim Leubner 
490*4e1bc9a0SAchim Leubner }
491*4e1bc9a0SAchim Leubner 
492*4e1bc9a0SAchim Leubner osGLOBAL void
dmDeviceDataInit(dmRoot_t * dmRoot)493*4e1bc9a0SAchim Leubner dmDeviceDataInit(
494*4e1bc9a0SAchim Leubner                  dmRoot_t *dmRoot
495*4e1bc9a0SAchim Leubner                 )
496*4e1bc9a0SAchim Leubner {
497*4e1bc9a0SAchim Leubner   dmIntRoot_t               *dmIntRoot    = (dmIntRoot_t *)dmRoot->dmData;
498*4e1bc9a0SAchim Leubner   dmIntContext_t            *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
499*4e1bc9a0SAchim Leubner   dmDeviceData_t            *dmDeviceData = (dmDeviceData_t *)dmAllShared->DeviceMem;
500*4e1bc9a0SAchim Leubner   int i;
501*4e1bc9a0SAchim Leubner 
502*4e1bc9a0SAchim Leubner   DM_DBG3(("dmDeviceDataInit: start \n"));
503*4e1bc9a0SAchim Leubner 
504*4e1bc9a0SAchim Leubner   DMLIST_INIT_HDR(&(dmAllShared->MainDeviceList));
505*4e1bc9a0SAchim Leubner   DMLIST_INIT_HDR(&(dmAllShared->FreeDeviceList));
506*4e1bc9a0SAchim Leubner 
507*4e1bc9a0SAchim Leubner   for(i=0;i<DM_MAX_DEV;i++)
508*4e1bc9a0SAchim Leubner   {
509*4e1bc9a0SAchim Leubner     DMLIST_INIT_ELEMENT(&(dmDeviceData[i].FreeLink));
510*4e1bc9a0SAchim Leubner     DMLIST_INIT_ELEMENT(&(dmDeviceData[i].MainLink));
511*4e1bc9a0SAchim Leubner     DMLIST_INIT_ELEMENT(&(dmDeviceData[i].IncDisLink));
512*4e1bc9a0SAchim Leubner     dmDeviceData[i].id = i;
513*4e1bc9a0SAchim Leubner     dmDeviceData[i].DeviceType = DM_DEFAULT_DEVICE;
514*4e1bc9a0SAchim Leubner     dmDeviceData[i].dmRoot = agNULL;
515*4e1bc9a0SAchim Leubner //    dmDeviceData[i].agDevHandle = agNULL;
516*4e1bc9a0SAchim Leubner 
517*4e1bc9a0SAchim Leubner     dmDeviceData[i].dmPortContext = agNULL;
518*4e1bc9a0SAchim Leubner     dmDeviceData[i].dmExpander = agNULL;
519*4e1bc9a0SAchim Leubner     dmDeviceData[i].ExpDevice = agNULL;
520*4e1bc9a0SAchim Leubner     dmDeviceData[i].phyID = 0xFF;
521*4e1bc9a0SAchim Leubner     dmDeviceData[i].SASAddressID.sasAddressHi = 0;
522*4e1bc9a0SAchim Leubner     dmDeviceData[i].SASAddressID.sasAddressLo = 0;
523*4e1bc9a0SAchim Leubner     dmDeviceData[i].valid = agFALSE;
524*4e1bc9a0SAchim Leubner     dmDeviceData[i].valid2 = agFALSE;
525*4e1bc9a0SAchim Leubner     dmDeviceData[i].processed = agFALSE;
526*4e1bc9a0SAchim Leubner     dmDeviceData[i].initiator_ssp_stp_smp = 0;
527*4e1bc9a0SAchim Leubner     dmDeviceData[i].target_ssp_stp_smp = 0;
528*4e1bc9a0SAchim Leubner     dmDeviceData[i].numOfPhys = 0;
529*4e1bc9a0SAchim Leubner //    dmDeviceData[i].registered = agFALSE;
530*4e1bc9a0SAchim Leubner     dmDeviceData[i].directlyAttached = agFALSE;
531*4e1bc9a0SAchim Leubner     dmDeviceData[i].SASSpecDeviceType = 0xFF;
532*4e1bc9a0SAchim Leubner     dmDeviceData[i].IOStart = 0;
533*4e1bc9a0SAchim Leubner     dmDeviceData[i].IOResponse = 0;
534*4e1bc9a0SAchim Leubner     dmDeviceData[i].agDeviceResetContext.osData = agNULL;
535*4e1bc9a0SAchim Leubner     dmDeviceData[i].agDeviceResetContext.sdkData = agNULL;
536*4e1bc9a0SAchim Leubner     dmDeviceData[i].TRflag = agFALSE;
537*4e1bc9a0SAchim Leubner     dmDeviceData[i].ResetCnt = 0;
538*4e1bc9a0SAchim Leubner     dmDeviceData[i].registered = agFALSE;
539*4e1bc9a0SAchim Leubner     dmDeviceData[i].reported = agFALSE;
540*4e1bc9a0SAchim Leubner 
541*4e1bc9a0SAchim Leubner     dmDeviceData[i].MCN = 0;
542*4e1bc9a0SAchim Leubner     dmDeviceData[i].MCNDone = agFALSE;
543*4e1bc9a0SAchim Leubner     dmDeviceData[i].PrevMCN = 0;
544*4e1bc9a0SAchim Leubner 
545*4e1bc9a0SAchim Leubner     dm_memset( &(dmDeviceData[i].dmDeviceInfo), 0, sizeof(dmDeviceInfo_t));
546*4e1bc9a0SAchim Leubner     /* some other variables */
547*4e1bc9a0SAchim Leubner     DMLIST_ENQUEUE_AT_TAIL(&(dmDeviceData[i].FreeLink), &(dmAllShared->FreeDeviceList));
548*4e1bc9a0SAchim Leubner   }
549*4e1bc9a0SAchim Leubner 
550*4e1bc9a0SAchim Leubner   return;
551*4e1bc9a0SAchim Leubner }
552*4e1bc9a0SAchim Leubner osGLOBAL void
dmDeviceDataReInit(dmRoot_t * dmRoot,dmDeviceData_t * oneDeviceData)553*4e1bc9a0SAchim Leubner dmDeviceDataReInit(
554*4e1bc9a0SAchim Leubner                    dmRoot_t		  *dmRoot,
555*4e1bc9a0SAchim Leubner                    dmDeviceData_t         *oneDeviceData
556*4e1bc9a0SAchim Leubner                   )
557*4e1bc9a0SAchim Leubner {
558*4e1bc9a0SAchim Leubner   DM_DBG3(("dmDeviceDataReInit: start \n"));
559*4e1bc9a0SAchim Leubner 
560*4e1bc9a0SAchim Leubner   oneDeviceData->DeviceType = DM_DEFAULT_DEVICE;
561*4e1bc9a0SAchim Leubner //  oneDeviceData->agDevHandle = agNULL;
562*4e1bc9a0SAchim Leubner 
563*4e1bc9a0SAchim Leubner   oneDeviceData->dmPortContext = agNULL;
564*4e1bc9a0SAchim Leubner   oneDeviceData->dmExpander = agNULL;
565*4e1bc9a0SAchim Leubner   oneDeviceData->ExpDevice = agNULL;
566*4e1bc9a0SAchim Leubner   oneDeviceData->phyID = 0xFF;
567*4e1bc9a0SAchim Leubner   oneDeviceData->SASAddressID.sasAddressHi = 0;
568*4e1bc9a0SAchim Leubner   oneDeviceData->SASAddressID.sasAddressLo = 0;
569*4e1bc9a0SAchim Leubner   oneDeviceData->valid = agFALSE;
570*4e1bc9a0SAchim Leubner   oneDeviceData->valid2 = agFALSE;
571*4e1bc9a0SAchim Leubner   oneDeviceData->processed = agFALSE;
572*4e1bc9a0SAchim Leubner   oneDeviceData->initiator_ssp_stp_smp = 0;
573*4e1bc9a0SAchim Leubner   oneDeviceData->target_ssp_stp_smp = 0;
574*4e1bc9a0SAchim Leubner   oneDeviceData->numOfPhys = 0;
575*4e1bc9a0SAchim Leubner //  oneDeviceData->registered = agFALSE;
576*4e1bc9a0SAchim Leubner   oneDeviceData->directlyAttached = agFALSE;
577*4e1bc9a0SAchim Leubner   oneDeviceData->SASSpecDeviceType = 0xFF;
578*4e1bc9a0SAchim Leubner   oneDeviceData->IOStart = 0;
579*4e1bc9a0SAchim Leubner   oneDeviceData->IOResponse = 0;
580*4e1bc9a0SAchim Leubner   oneDeviceData->agDeviceResetContext.osData = agNULL;
581*4e1bc9a0SAchim Leubner   oneDeviceData->agDeviceResetContext.sdkData = agNULL;
582*4e1bc9a0SAchim Leubner   oneDeviceData->TRflag = agFALSE;
583*4e1bc9a0SAchim Leubner   oneDeviceData->ResetCnt = 0;
584*4e1bc9a0SAchim Leubner   oneDeviceData->registered = agFALSE;
585*4e1bc9a0SAchim Leubner   oneDeviceData->reported = agFALSE;
586*4e1bc9a0SAchim Leubner 
587*4e1bc9a0SAchim Leubner   oneDeviceData->MCN = 0;
588*4e1bc9a0SAchim Leubner   oneDeviceData->MCNDone = agFALSE;
589*4e1bc9a0SAchim Leubner   oneDeviceData->PrevMCN = 0;
590*4e1bc9a0SAchim Leubner 
591*4e1bc9a0SAchim Leubner   dm_memset( &(oneDeviceData->dmDeviceInfo), 0, sizeof(dmDeviceInfo_t));
592*4e1bc9a0SAchim Leubner 
593*4e1bc9a0SAchim Leubner   return;
594*4e1bc9a0SAchim Leubner }
595*4e1bc9a0SAchim Leubner 
596*4e1bc9a0SAchim Leubner 
597*4e1bc9a0SAchim Leubner osGLOBAL void
dmExpanderDeviceDataInit(dmRoot_t * dmRoot,bit32 max_exp)598*4e1bc9a0SAchim Leubner dmExpanderDeviceDataInit(
599*4e1bc9a0SAchim Leubner                          dmRoot_t *dmRoot,
600*4e1bc9a0SAchim Leubner                          bit32    max_exp
601*4e1bc9a0SAchim Leubner                         )
602*4e1bc9a0SAchim Leubner {
603*4e1bc9a0SAchim Leubner   dmIntRoot_t               *dmIntRoot    = (dmIntRoot_t *)dmRoot->dmData;
604*4e1bc9a0SAchim Leubner   dmIntContext_t            *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
605*4e1bc9a0SAchim Leubner   dmExpander_t              *dmExpData = (dmExpander_t *)dmAllShared->ExpanderMem;
606*4e1bc9a0SAchim Leubner   bit32 i = 0;
607*4e1bc9a0SAchim Leubner   DM_DBG3(("dmExpanderDeviceDataInit: start \n"));
608*4e1bc9a0SAchim Leubner 
609*4e1bc9a0SAchim Leubner   DMLIST_INIT_HDR(&(dmAllShared->freeExpanderList));
610*4e1bc9a0SAchim Leubner   DMLIST_INIT_HDR(&(dmAllShared->mainExpanderList));
611*4e1bc9a0SAchim Leubner 
612*4e1bc9a0SAchim Leubner   for(i=0;i<max_exp;i++)
613*4e1bc9a0SAchim Leubner   {
614*4e1bc9a0SAchim Leubner     DMLIST_INIT_ELEMENT(&(dmExpData[i].linkNode));
615*4e1bc9a0SAchim Leubner     DMLIST_INIT_ELEMENT(&(dmExpData[i].upNode));
616*4e1bc9a0SAchim Leubner     /* initialize expander fields */
617*4e1bc9a0SAchim Leubner     dmExpData[i].dmRoot = agNULL;
618*4e1bc9a0SAchim Leubner     dmExpData[i].agDevHandle = agNULL;
619*4e1bc9a0SAchim Leubner     dmExpData[i].dmDevice = agNULL;
620*4e1bc9a0SAchim Leubner     dmExpData[i].dmUpStreamExpander = agNULL;
621*4e1bc9a0SAchim Leubner     dmExpData[i].dmCurrentDownStreamExpander = agNULL;
622*4e1bc9a0SAchim Leubner     dmExpData[i].hasUpStreamDevice = agFALSE;
623*4e1bc9a0SAchim Leubner     dmExpData[i].numOfUpStreamPhys = 0;
624*4e1bc9a0SAchim Leubner     dmExpData[i].currentUpStreamPhyIndex = 0;
625*4e1bc9a0SAchim Leubner     dmExpData[i].numOfDownStreamPhys = 0;
626*4e1bc9a0SAchim Leubner     dmExpData[i].currentDownStreamPhyIndex = 0;
627*4e1bc9a0SAchim Leubner     dmExpData[i].discoveringPhyId = 0;
628*4e1bc9a0SAchim Leubner     dmExpData[i].underDiscovering = agFALSE;
629*4e1bc9a0SAchim Leubner     dmExpData[i].id = i;
630*4e1bc9a0SAchim Leubner     DM_DBG3(("dmExpanderDeviceDataInit: exp id %d\n", i));
631*4e1bc9a0SAchim Leubner 
632*4e1bc9a0SAchim Leubner     dmExpData[i].dmReturnginExpander = agNULL;
633*4e1bc9a0SAchim Leubner     dmExpData[i].discoverSMPAllowed = agTRUE;
634*4e1bc9a0SAchim Leubner     dm_memset( &(dmExpData[i].currentIndex), 0, sizeof(dmExpData[i].currentIndex));
635*4e1bc9a0SAchim Leubner     dm_memset( &(dmExpData[i].upStreamPhys), 0, sizeof(dmExpData[i].upStreamPhys));
636*4e1bc9a0SAchim Leubner     dm_memset( &(dmExpData[i].downStreamPhys), 0, sizeof(dmExpData[i].downStreamPhys));
637*4e1bc9a0SAchim Leubner     dm_memset( &(dmExpData[i].routingAttribute), 0, sizeof(dmExpData[i].routingAttribute));
638*4e1bc9a0SAchim Leubner     dmExpData[i].configSASAddrTableIndex = 0;
639*4e1bc9a0SAchim Leubner     dm_memset( &(dmExpData[i].configSASAddressHiTable), 0, sizeof(dmExpData[i].configSASAddressHiTable));
640*4e1bc9a0SAchim Leubner     dm_memset( &(dmExpData[i].configSASAddressLoTable), 0, sizeof(dmExpData[i].configSASAddressLoTable));
641*4e1bc9a0SAchim Leubner     dmExpData[i].SAS2 = 0;  /* default is SAS 1.1 spec */
642*4e1bc9a0SAchim Leubner     dmExpData[i].TTTSupported = agFALSE;  /* Table to Table is supported */
643*4e1bc9a0SAchim Leubner     dmExpData[i].UndoDueToTTTSupported = agFALSE;
644*4e1bc9a0SAchim Leubner 
645*4e1bc9a0SAchim Leubner 
646*4e1bc9a0SAchim Leubner     DMLIST_ENQUEUE_AT_TAIL(&(dmExpData[i].linkNode), &(dmAllShared->freeExpanderList));
647*4e1bc9a0SAchim Leubner   }
648*4e1bc9a0SAchim Leubner   return;
649*4e1bc9a0SAchim Leubner }
650*4e1bc9a0SAchim Leubner 
651*4e1bc9a0SAchim Leubner /* re-intialize an expander */
652*4e1bc9a0SAchim Leubner osGLOBAL void
dmExpanderDeviceDataReInit(dmRoot_t * dmRoot,dmExpander_t * oneExpander)653*4e1bc9a0SAchim Leubner dmExpanderDeviceDataReInit(
654*4e1bc9a0SAchim Leubner                            dmRoot_t         *dmRoot,
655*4e1bc9a0SAchim Leubner                            dmExpander_t     *oneExpander
656*4e1bc9a0SAchim Leubner                           )
657*4e1bc9a0SAchim Leubner {
658*4e1bc9a0SAchim Leubner   DM_DBG3(("dmExpanderDeviceDataReInit: start \n"));
659*4e1bc9a0SAchim Leubner   oneExpander->dmRoot = agNULL;
660*4e1bc9a0SAchim Leubner   oneExpander->agDevHandle = agNULL;
661*4e1bc9a0SAchim Leubner   oneExpander->dmDevice = agNULL;
662*4e1bc9a0SAchim Leubner   oneExpander->dmUpStreamExpander = agNULL;
663*4e1bc9a0SAchim Leubner   oneExpander->dmCurrentDownStreamExpander = agNULL;
664*4e1bc9a0SAchim Leubner   oneExpander->hasUpStreamDevice = agFALSE;
665*4e1bc9a0SAchim Leubner   oneExpander->numOfUpStreamPhys = 0;
666*4e1bc9a0SAchim Leubner   oneExpander->currentUpStreamPhyIndex = 0;
667*4e1bc9a0SAchim Leubner   oneExpander->numOfDownStreamPhys = 0;
668*4e1bc9a0SAchim Leubner   oneExpander->currentDownStreamPhyIndex = 0;
669*4e1bc9a0SAchim Leubner   oneExpander->discoveringPhyId = 0;
670*4e1bc9a0SAchim Leubner   oneExpander->underDiscovering = agFALSE;
671*4e1bc9a0SAchim Leubner   oneExpander->dmReturnginExpander = agNULL;
672*4e1bc9a0SAchim Leubner   oneExpander->discoverSMPAllowed = agTRUE;
673*4e1bc9a0SAchim Leubner   dm_memset( &(oneExpander->currentIndex), 0, sizeof(oneExpander->currentIndex));
674*4e1bc9a0SAchim Leubner   dm_memset( &(oneExpander->upStreamPhys), 0, sizeof(oneExpander->upStreamPhys));
675*4e1bc9a0SAchim Leubner   dm_memset( &(oneExpander->downStreamPhys), 0, sizeof(oneExpander->downStreamPhys));
676*4e1bc9a0SAchim Leubner   dm_memset( &(oneExpander->routingAttribute), 0, sizeof(oneExpander->routingAttribute));
677*4e1bc9a0SAchim Leubner   oneExpander->configSASAddrTableIndex = 0;
678*4e1bc9a0SAchim Leubner   dm_memset( &(oneExpander->configSASAddressHiTable), 0, sizeof(oneExpander->configSASAddressHiTable));
679*4e1bc9a0SAchim Leubner   dm_memset( &(oneExpander->configSASAddressLoTable), 0, sizeof(oneExpander->configSASAddressLoTable));
680*4e1bc9a0SAchim Leubner   oneExpander->SAS2 = 0;  /* default is SAS 1.1 spec */
681*4e1bc9a0SAchim Leubner   oneExpander->TTTSupported = agFALSE;  /* Table to Table is supported */
682*4e1bc9a0SAchim Leubner   oneExpander->UndoDueToTTTSupported = agFALSE;
683*4e1bc9a0SAchim Leubner 
684*4e1bc9a0SAchim Leubner   return;
685*4e1bc9a0SAchim Leubner }
686*4e1bc9a0SAchim Leubner 
687*4e1bc9a0SAchim Leubner osGLOBAL void
dmPortContextInit(dmRoot_t * dmRoot)688*4e1bc9a0SAchim Leubner dmPortContextInit(
689*4e1bc9a0SAchim Leubner                   dmRoot_t *dmRoot
690*4e1bc9a0SAchim Leubner                  )
691*4e1bc9a0SAchim Leubner {
692*4e1bc9a0SAchim Leubner   dmIntRoot_t               *dmIntRoot    = (dmIntRoot_t *)dmRoot->dmData;
693*4e1bc9a0SAchim Leubner   dmIntContext_t            *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
694*4e1bc9a0SAchim Leubner   dmIntPortContext_t        *dmPortContext = (dmIntPortContext_t *)dmAllShared->PortContextMem;
695*4e1bc9a0SAchim Leubner   int i = 0;
696*4e1bc9a0SAchim Leubner #ifdef TBD
697*4e1bc9a0SAchim Leubner   int j = 0;
698*4e1bc9a0SAchim Leubner #endif
699*4e1bc9a0SAchim Leubner 
700*4e1bc9a0SAchim Leubner   DM_DBG3(("dmPortContextInit: start \n"));
701*4e1bc9a0SAchim Leubner 
702*4e1bc9a0SAchim Leubner   DMLIST_INIT_HDR(&(dmAllShared->MainPortContextList));
703*4e1bc9a0SAchim Leubner   DMLIST_INIT_HDR(&(dmAllShared->FreePortContextList));
704*4e1bc9a0SAchim Leubner   for(i=0;i<DM_MAX_PORT_CONTEXT;i++)
705*4e1bc9a0SAchim Leubner   {
706*4e1bc9a0SAchim Leubner     DMLIST_INIT_ELEMENT(&(dmPortContext[i].FreeLink));
707*4e1bc9a0SAchim Leubner     DMLIST_INIT_ELEMENT(&(dmPortContext[i].MainLink));
708*4e1bc9a0SAchim Leubner 
709*4e1bc9a0SAchim Leubner     DMLIST_INIT_HDR(&(dmPortContext[i].discovery.discoveringExpanderList));
710*4e1bc9a0SAchim Leubner     DMLIST_INIT_HDR(&(dmPortContext[i].discovery.UpdiscoveringExpanderList));
711*4e1bc9a0SAchim Leubner     dmPortContext[i].discovery.type = DM_DISCOVERY_OPTION_FULL_START;
712*4e1bc9a0SAchim Leubner     dmInitTimerRequest(dmRoot, &(dmPortContext[i].discovery.discoveryTimer));
713*4e1bc9a0SAchim Leubner     dmInitTimerRequest(dmRoot, &(dmPortContext[i].discovery.configureRouteTimer));
714*4e1bc9a0SAchim Leubner     dmInitTimerRequest(dmRoot, &(dmPortContext[i].discovery.deviceRegistrationTimer));
715*4e1bc9a0SAchim Leubner     dmInitTimerRequest(dmRoot, &(dmPortContext[i].discovery.SMPBusyTimer));
716*4e1bc9a0SAchim Leubner     dmInitTimerRequest(dmRoot, &(dmPortContext[i].discovery.BCTimer));
717*4e1bc9a0SAchim Leubner     dmInitTimerRequest(dmRoot, &(dmPortContext[i].discovery.DiscoverySMPTimer));
718*4e1bc9a0SAchim Leubner     dmPortContext[i].discovery.retries = 0;
719*4e1bc9a0SAchim Leubner     dmPortContext[i].discovery.configureRouteRetries = 0;
720*4e1bc9a0SAchim Leubner     dmPortContext[i].discovery.deviceRetistrationRetries = 0;
721*4e1bc9a0SAchim Leubner     dmPortContext[i].discovery.pendingSMP = 0;
722*4e1bc9a0SAchim Leubner     dmPortContext[i].discovery.SeenBC = agFALSE;
723*4e1bc9a0SAchim Leubner     dmPortContext[i].discovery.forcedOK = agFALSE;
724*4e1bc9a0SAchim Leubner     dmPortContext[i].discovery.SMPRetries = 0;
725*4e1bc9a0SAchim Leubner     dmPortContext[i].discovery.DeferredError = agFALSE;
726*4e1bc9a0SAchim Leubner     dmPortContext[i].discovery.ConfiguresOthers = agFALSE;
727*4e1bc9a0SAchim Leubner     dmPortContext[i].discovery.ResetTriggerred = agFALSE;
728*4e1bc9a0SAchim Leubner 
729*4e1bc9a0SAchim Leubner #ifdef INITIATOR_DRIVER
730*4e1bc9a0SAchim Leubner     dmPortContext[i].DiscoveryState = DM_DSTATE_NOT_STARTED;
731*4e1bc9a0SAchim Leubner     dmPortContext[i].DiscoveryAbortInProgress = agFALSE;
732*4e1bc9a0SAchim Leubner     dmPortContext[i].directAttatchedSAS = agFALSE;
733*4e1bc9a0SAchim Leubner     dmPortContext[i].DiscoveryRdyGiven = agFALSE;
734*4e1bc9a0SAchim Leubner     dmPortContext[i].SeenLinkUp = agFALSE;
735*4e1bc9a0SAchim Leubner 
736*4e1bc9a0SAchim Leubner #endif
737*4e1bc9a0SAchim Leubner     dmPortContext[i].id = i;
738*4e1bc9a0SAchim Leubner #ifdef TBD
739*4e1bc9a0SAchim Leubner     dmPortContext[i].agPortContext = agNULL;
740*4e1bc9a0SAchim Leubner #endif
741*4e1bc9a0SAchim Leubner     dmPortContext[i].LinkRate = 0;
742*4e1bc9a0SAchim Leubner     dmPortContext[i].Count = 0;
743*4e1bc9a0SAchim Leubner     dmPortContext[i].valid = agFALSE;
744*4e1bc9a0SAchim Leubner     dmPortContext[i].RegFailed = agFALSE;
745*4e1bc9a0SAchim Leubner 
746*4e1bc9a0SAchim Leubner #ifdef TBD
747*4e1bc9a0SAchim Leubner     for (j=0;j<DM_MAX_NUM_PHYS;j++)
748*4e1bc9a0SAchim Leubner     {
749*4e1bc9a0SAchim Leubner       dmPortContext[i].PhyIDList[j] = agFALSE;
750*4e1bc9a0SAchim Leubner     }
751*4e1bc9a0SAchim Leubner #endif
752*4e1bc9a0SAchim Leubner     dmPortContext[i].RegisteredDevNums = 0;
753*4e1bc9a0SAchim Leubner     dmPortContext[i].eventPhyID = 0xFF;
754*4e1bc9a0SAchim Leubner     dmPortContext[i].Transient = agFALSE;
755*4e1bc9a0SAchim Leubner 
756*4e1bc9a0SAchim Leubner     /* add more variables later */
757*4e1bc9a0SAchim Leubner     DMLIST_ENQUEUE_AT_TAIL(&(dmPortContext[i].FreeLink), &(dmAllShared->FreePortContextList));
758*4e1bc9a0SAchim Leubner   }
759*4e1bc9a0SAchim Leubner 
760*4e1bc9a0SAchim Leubner #ifdef DM_INTERNAL_DEBUG  /* for debugging only */
761*4e1bc9a0SAchim Leubner   for(i=0;i<DM_MAX_PORT_CONTEXT;i++)
762*4e1bc9a0SAchim Leubner   {
763*4e1bc9a0SAchim Leubner     DM_DBG6(("dmPortContextInit: index %d  &tdsaPortContext[] %p\n", i, &(dmPortContext[i])));
764*4e1bc9a0SAchim Leubner   }
765*4e1bc9a0SAchim Leubner   DM_DBG6(("dmPortContextInit: sizeof(tdsaPortContext_t) %d 0x%x\n", sizeof(dmIntPortContext_t), sizeof(dmIntPortContext_t)));
766*4e1bc9a0SAchim Leubner #endif
767*4e1bc9a0SAchim Leubner 
768*4e1bc9a0SAchim Leubner   return;
769*4e1bc9a0SAchim Leubner }
770*4e1bc9a0SAchim Leubner 
771*4e1bc9a0SAchim Leubner osGLOBAL void
dmPortContextReInit(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)772*4e1bc9a0SAchim Leubner dmPortContextReInit(
773*4e1bc9a0SAchim Leubner                     dmRoot_t		  *dmRoot,
774*4e1bc9a0SAchim Leubner                     dmIntPortContext_t    *onePortContext
775*4e1bc9a0SAchim Leubner                     )
776*4e1bc9a0SAchim Leubner {
777*4e1bc9a0SAchim Leubner   dmDiscovery_t   *discovery;
778*4e1bc9a0SAchim Leubner 
779*4e1bc9a0SAchim Leubner   DM_DBG3(("dmPortContextReInit: start \n"));
780*4e1bc9a0SAchim Leubner 
781*4e1bc9a0SAchim Leubner   discovery = &(onePortContext->discovery);
782*4e1bc9a0SAchim Leubner 
783*4e1bc9a0SAchim Leubner   onePortContext->discovery.type = DM_DISCOVERY_OPTION_FULL_START;
784*4e1bc9a0SAchim Leubner   onePortContext->discovery.retries = 0;
785*4e1bc9a0SAchim Leubner   onePortContext->discovery.configureRouteRetries = 0;
786*4e1bc9a0SAchim Leubner   onePortContext->discovery.deviceRetistrationRetries = 0;
787*4e1bc9a0SAchim Leubner   onePortContext->discovery.pendingSMP = 0;
788*4e1bc9a0SAchim Leubner   onePortContext->discovery.SeenBC = agFALSE;
789*4e1bc9a0SAchim Leubner   onePortContext->discovery.forcedOK = agFALSE;
790*4e1bc9a0SAchim Leubner   onePortContext->discovery.SMPRetries = 0;
791*4e1bc9a0SAchim Leubner   onePortContext->discovery.DeferredError = agFALSE;
792*4e1bc9a0SAchim Leubner   onePortContext->discovery.ConfiguresOthers = agFALSE;
793*4e1bc9a0SAchim Leubner   onePortContext->discovery.ResetTriggerred = agFALSE;
794*4e1bc9a0SAchim Leubner 
795*4e1bc9a0SAchim Leubner   /* free expander lists */
796*4e1bc9a0SAchim Leubner   dmCleanAllExp(dmRoot, onePortContext);
797*4e1bc9a0SAchim Leubner 
798*4e1bc9a0SAchim Leubner   /* kill the discovery-related timers if they are running */
799*4e1bc9a0SAchim Leubner   tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
800*4e1bc9a0SAchim Leubner   if (discovery->discoveryTimer.timerRunning == agTRUE)
801*4e1bc9a0SAchim Leubner   {
802*4e1bc9a0SAchim Leubner     tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
803*4e1bc9a0SAchim Leubner     dmKillTimer(
804*4e1bc9a0SAchim Leubner                 dmRoot,
805*4e1bc9a0SAchim Leubner                 &discovery->discoveryTimer
806*4e1bc9a0SAchim Leubner                );
807*4e1bc9a0SAchim Leubner   }
808*4e1bc9a0SAchim Leubner   else
809*4e1bc9a0SAchim Leubner   {
810*4e1bc9a0SAchim Leubner     tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
811*4e1bc9a0SAchim Leubner   }
812*4e1bc9a0SAchim Leubner 
813*4e1bc9a0SAchim Leubner 
814*4e1bc9a0SAchim Leubner   tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
815*4e1bc9a0SAchim Leubner   if (discovery->configureRouteTimer.timerRunning == agTRUE)
816*4e1bc9a0SAchim Leubner   {
817*4e1bc9a0SAchim Leubner     tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
818*4e1bc9a0SAchim Leubner     dmKillTimer(
819*4e1bc9a0SAchim Leubner                 dmRoot,
820*4e1bc9a0SAchim Leubner                 &discovery->configureRouteTimer
821*4e1bc9a0SAchim Leubner                );
822*4e1bc9a0SAchim Leubner   }
823*4e1bc9a0SAchim Leubner   else
824*4e1bc9a0SAchim Leubner   {
825*4e1bc9a0SAchim Leubner     tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
826*4e1bc9a0SAchim Leubner   }
827*4e1bc9a0SAchim Leubner 
828*4e1bc9a0SAchim Leubner 
829*4e1bc9a0SAchim Leubner   tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
830*4e1bc9a0SAchim Leubner   if (discovery->deviceRegistrationTimer.timerRunning == agTRUE)
831*4e1bc9a0SAchim Leubner   {
832*4e1bc9a0SAchim Leubner     tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
833*4e1bc9a0SAchim Leubner     dmKillTimer(
834*4e1bc9a0SAchim Leubner                 dmRoot,
835*4e1bc9a0SAchim Leubner                 &discovery->deviceRegistrationTimer
836*4e1bc9a0SAchim Leubner                );
837*4e1bc9a0SAchim Leubner   }
838*4e1bc9a0SAchim Leubner   else
839*4e1bc9a0SAchim Leubner   {
840*4e1bc9a0SAchim Leubner     tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
841*4e1bc9a0SAchim Leubner   }
842*4e1bc9a0SAchim Leubner 
843*4e1bc9a0SAchim Leubner 
844*4e1bc9a0SAchim Leubner   tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
845*4e1bc9a0SAchim Leubner   if (discovery->BCTimer.timerRunning == agTRUE)
846*4e1bc9a0SAchim Leubner   {
847*4e1bc9a0SAchim Leubner     tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
848*4e1bc9a0SAchim Leubner     dmKillTimer(
849*4e1bc9a0SAchim Leubner                 dmRoot,
850*4e1bc9a0SAchim Leubner                 &discovery->BCTimer
851*4e1bc9a0SAchim Leubner                );
852*4e1bc9a0SAchim Leubner   }
853*4e1bc9a0SAchim Leubner   else
854*4e1bc9a0SAchim Leubner   {
855*4e1bc9a0SAchim Leubner     tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
856*4e1bc9a0SAchim Leubner   }
857*4e1bc9a0SAchim Leubner 
858*4e1bc9a0SAchim Leubner 
859*4e1bc9a0SAchim Leubner   tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
860*4e1bc9a0SAchim Leubner   if (discovery->SMPBusyTimer.timerRunning == agTRUE)
861*4e1bc9a0SAchim Leubner   {
862*4e1bc9a0SAchim Leubner     tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
863*4e1bc9a0SAchim Leubner     dmKillTimer(
864*4e1bc9a0SAchim Leubner                 dmRoot,
865*4e1bc9a0SAchim Leubner                 &discovery->SMPBusyTimer
866*4e1bc9a0SAchim Leubner                );
867*4e1bc9a0SAchim Leubner   }
868*4e1bc9a0SAchim Leubner   else
869*4e1bc9a0SAchim Leubner   {
870*4e1bc9a0SAchim Leubner     tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
871*4e1bc9a0SAchim Leubner   }
872*4e1bc9a0SAchim Leubner 
873*4e1bc9a0SAchim Leubner 
874*4e1bc9a0SAchim Leubner   tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
875*4e1bc9a0SAchim Leubner   if (discovery->DiscoverySMPTimer.timerRunning == agTRUE)
876*4e1bc9a0SAchim Leubner   {
877*4e1bc9a0SAchim Leubner     tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
878*4e1bc9a0SAchim Leubner     dmKillTimer(
879*4e1bc9a0SAchim Leubner                 dmRoot,
880*4e1bc9a0SAchim Leubner                 &discovery->DiscoverySMPTimer
881*4e1bc9a0SAchim Leubner                );
882*4e1bc9a0SAchim Leubner   }
883*4e1bc9a0SAchim Leubner   else
884*4e1bc9a0SAchim Leubner   {
885*4e1bc9a0SAchim Leubner     tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
886*4e1bc9a0SAchim Leubner   }
887*4e1bc9a0SAchim Leubner 
888*4e1bc9a0SAchim Leubner   onePortContext->DiscoveryState = DM_DSTATE_NOT_STARTED;
889*4e1bc9a0SAchim Leubner   onePortContext->DiscoveryAbortInProgress = agFALSE;
890*4e1bc9a0SAchim Leubner   onePortContext->directAttatchedSAS = agFALSE;
891*4e1bc9a0SAchim Leubner   onePortContext->DiscoveryRdyGiven = agFALSE;
892*4e1bc9a0SAchim Leubner   onePortContext->SeenLinkUp = agFALSE;
893*4e1bc9a0SAchim Leubner 
894*4e1bc9a0SAchim Leubner   onePortContext->dmPortContext->dmData = agNULL;
895*4e1bc9a0SAchim Leubner   onePortContext->dmPortContext = agNULL;
896*4e1bc9a0SAchim Leubner   onePortContext->dmRoot = agNULL;
897*4e1bc9a0SAchim Leubner 
898*4e1bc9a0SAchim Leubner   onePortContext->LinkRate = 0;
899*4e1bc9a0SAchim Leubner   onePortContext->Count = 0;
900*4e1bc9a0SAchim Leubner   onePortContext->valid = agFALSE;
901*4e1bc9a0SAchim Leubner   onePortContext->RegisteredDevNums = 0;
902*4e1bc9a0SAchim Leubner   onePortContext->eventPhyID = 0xFF;
903*4e1bc9a0SAchim Leubner   onePortContext->Transient = agFALSE;
904*4e1bc9a0SAchim Leubner 
905*4e1bc9a0SAchim Leubner   return;
906*4e1bc9a0SAchim Leubner }
907*4e1bc9a0SAchim Leubner 
908*4e1bc9a0SAchim Leubner 
909*4e1bc9a0SAchim Leubner osGLOBAL void
dmInitTimers(dmRoot_t * dmRoot)910*4e1bc9a0SAchim Leubner dmInitTimers(
911*4e1bc9a0SAchim Leubner                dmRoot_t *dmRoot
912*4e1bc9a0SAchim Leubner                )
913*4e1bc9a0SAchim Leubner {
914*4e1bc9a0SAchim Leubner   dmIntRoot_t               *dmIntRoot    = (dmIntRoot_t *)dmRoot->dmData;
915*4e1bc9a0SAchim Leubner   dmIntContext_t            *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
916*4e1bc9a0SAchim Leubner 
917*4e1bc9a0SAchim Leubner #ifdef DM_DEBUG_ENABLE
918*4e1bc9a0SAchim Leubner   dmIntPortContext_t *dmPortContext = (dmIntPortContext_t *)dmAllShared->PortContextMem;
919*4e1bc9a0SAchim Leubner 
920*4e1bc9a0SAchim Leubner   DM_DBG6(("dmInitTimers: start \n"));
921*4e1bc9a0SAchim Leubner   DM_DBG6(("dmInitTimers: ******* tdsaRoot %p \n", dmIntRoot));
922*4e1bc9a0SAchim Leubner   DM_DBG6(("dmInitTimers: ******* tdsaPortContext %p \n",dmPortContext));
923*4e1bc9a0SAchim Leubner #endif
924*4e1bc9a0SAchim Leubner 
925*4e1bc9a0SAchim Leubner   /* initialize the timerlist */
926*4e1bc9a0SAchim Leubner   DMLIST_INIT_HDR(&(dmAllShared->timerlist));
927*4e1bc9a0SAchim Leubner 
928*4e1bc9a0SAchim Leubner   return;
929*4e1bc9a0SAchim Leubner }
930*4e1bc9a0SAchim Leubner #endif /* FDS_ DM */
931*4e1bc9a0SAchim Leubner 
932*4e1bc9a0SAchim Leubner 
933