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