1*4e1bc9a0SAchim Leubner /*******************************************************************************
2*4e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
3*4e1bc9a0SAchim Leubner *
4*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*4e1bc9a0SAchim Leubner *that the following conditions are met:
6*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*4e1bc9a0SAchim Leubner *following disclaimer.
8*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
9*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*4e1bc9a0SAchim Leubner *with the distribution.
11*4e1bc9a0SAchim Leubner *
12*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20*4e1bc9a0SAchim Leubner
21*4e1bc9a0SAchim Leubner ********************************************************************************/
22*4e1bc9a0SAchim Leubner #include <sys/cdefs.h>
23*4e1bc9a0SAchim Leubner #include <dev/pms/config.h>
24*4e1bc9a0SAchim Leubner
25*4e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osenv.h>
26*4e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/ostypes.h>
27*4e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osdebug.h>
28*4e1bc9a0SAchim Leubner
29*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/titypes.h>
30*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
31*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/tiapi.h>
32*4e1bc9a0SAchim Leubner /* for TIDEBUG_MSG */
33*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
34*4e1bc9a0SAchim Leubner
35*4e1bc9a0SAchim Leubner #ifdef FDS_DM
36*4e1bc9a0SAchim Leubner
37*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dm.h>
38*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dmapi.h>
39*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
40*4e1bc9a0SAchim Leubner
41*4e1bc9a0SAchim Leubner #ifdef FDS_SM
42*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sat/api/sm.h>
43*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sat/api/smapi.h>
44*4e1bc9a0SAchim Leubner #endif
45*4e1bc9a0SAchim Leubner
46*4e1bc9a0SAchim Leubner #ifdef INITIATOR_DRIVER
47*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
48*4e1bc9a0SAchim Leubner #endif
49*4e1bc9a0SAchim Leubner
50*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
51*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
52*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
53*4e1bc9a0SAchim Leubner
54*4e1bc9a0SAchim Leubner #if defined(DM_DEBUG)
55*4e1bc9a0SAchim Leubner extern bit32 gDMDebugLevel;
56*4e1bc9a0SAchim Leubner #endif
57*4e1bc9a0SAchim Leubner
58*4e1bc9a0SAchim Leubner osGLOBAL bit32
tddmRotateQnumber(dmRoot_t * dmRoot,agsaDevHandle_t * agDevHandle)59*4e1bc9a0SAchim Leubner tddmRotateQnumber(
60*4e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
61*4e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle
62*4e1bc9a0SAchim Leubner )
63*4e1bc9a0SAchim Leubner {
64*4e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot;
65*4e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared;
66*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot;
67*4e1bc9a0SAchim Leubner tdsaDeviceData_t *oneDeviceData = agNULL;
68*4e1bc9a0SAchim Leubner TI_DBG1(("tddmRotateQnumber: start\n"));
69*4e1bc9a0SAchim Leubner if (agDevHandle == agNULL)
70*4e1bc9a0SAchim Leubner {
71*4e1bc9a0SAchim Leubner TI_DBG1(("tddmRotateQnumber: agDevHandle is NULL!!!\n"));
72*4e1bc9a0SAchim Leubner return 0;
73*4e1bc9a0SAchim Leubner }
74*4e1bc9a0SAchim Leubner oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
75*4e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
76*4e1bc9a0SAchim Leubner {
77*4e1bc9a0SAchim Leubner TI_DBG1(("tddmRotateQnumber: oneDeviceData is NULL!!!\n"));
78*4e1bc9a0SAchim Leubner return 0;
79*4e1bc9a0SAchim Leubner }
80*4e1bc9a0SAchim Leubner tdsaRoot = (tdsaRoot_t *)dmRoot->tdData;
81*4e1bc9a0SAchim Leubner if (tdsaRoot == agNULL)
82*4e1bc9a0SAchim Leubner {
83*4e1bc9a0SAchim Leubner TI_DBG1(("tddmRotateQnumber: tdsaRoot is NULL\n"));
84*4e1bc9a0SAchim Leubner return 0;
85*4e1bc9a0SAchim Leubner }
86*4e1bc9a0SAchim Leubner tdsaAllShared = &(tdsaRoot->tdsaAllShared);
87*4e1bc9a0SAchim Leubner if (tdsaAllShared == agNULL)
88*4e1bc9a0SAchim Leubner {
89*4e1bc9a0SAchim Leubner TI_DBG1(("tddmRotateQnumber: tdsaAllShared is NULL\n"));
90*4e1bc9a0SAchim Leubner return 0;
91*4e1bc9a0SAchim Leubner }
92*4e1bc9a0SAchim Leubner tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
93*4e1bc9a0SAchim Leubner if (tiRoot == agNULL)
94*4e1bc9a0SAchim Leubner {
95*4e1bc9a0SAchim Leubner TI_DBG1(("tddmRotateQnumber: tiRoot is NULL\n"));
96*4e1bc9a0SAchim Leubner return 0;
97*4e1bc9a0SAchim Leubner }
98*4e1bc9a0SAchim Leubner return tdsaRotateQnumber(tiRoot, oneDeviceData);
99*4e1bc9a0SAchim Leubner }
100*4e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaFindLocalMCN(tiRoot_t * tiRoot,tdsaPortContext_t * onePortContext)101*4e1bc9a0SAchim Leubner tdsaFindLocalMCN(
102*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
103*4e1bc9a0SAchim Leubner tdsaPortContext_t *onePortContext
104*4e1bc9a0SAchim Leubner )
105*4e1bc9a0SAchim Leubner {
106*4e1bc9a0SAchim Leubner bit32 i, localMCN = 0;
107*4e1bc9a0SAchim Leubner
108*4e1bc9a0SAchim Leubner TI_DBG2(("tdsaFindLocalMCN: start\n"));
109*4e1bc9a0SAchim Leubner
110*4e1bc9a0SAchim Leubner if (onePortContext->valid == agFALSE)
111*4e1bc9a0SAchim Leubner {
112*4e1bc9a0SAchim Leubner TI_DBG1(("tdsaFindLocalMCN: invalid portcontext id %d\n", onePortContext->id));
113*4e1bc9a0SAchim Leubner return 0;
114*4e1bc9a0SAchim Leubner }
115*4e1bc9a0SAchim Leubner
116*4e1bc9a0SAchim Leubner for(i=0;i<TD_MAX_NUM_PHYS;i++)
117*4e1bc9a0SAchim Leubner {
118*4e1bc9a0SAchim Leubner if (onePortContext->PhyIDList[i] == agTRUE)
119*4e1bc9a0SAchim Leubner {
120*4e1bc9a0SAchim Leubner localMCN++;
121*4e1bc9a0SAchim Leubner }
122*4e1bc9a0SAchim Leubner }
123*4e1bc9a0SAchim Leubner
124*4e1bc9a0SAchim Leubner return localMCN;
125*4e1bc9a0SAchim Leubner }
126*4e1bc9a0SAchim Leubner
127*4e1bc9a0SAchim Leubner
128*4e1bc9a0SAchim Leubner /*
129*4e1bc9a0SAchim Leubner on success,
130*4e1bc9a0SAchim Leubner ostiInitiatorEvent(
131*4e1bc9a0SAchim Leubner tiRoot,
132*4e1bc9a0SAchim Leubner onePortContext->tiPortalContext,
133*4e1bc9a0SAchim Leubner agNULL,
134*4e1bc9a0SAchim Leubner tiIntrEventTypeDiscovery,
135*4e1bc9a0SAchim Leubner tiDiscOK,
136*4e1bc9a0SAchim Leubner agNULL
137*4e1bc9a0SAchim Leubner );
138*4e1bc9a0SAchim Leubner else
139*4e1bc9a0SAchim Leubner remove(de-register) all devices
140*4e1bc9a0SAchim Leubner ostiInitiatorEvent(
141*4e1bc9a0SAchim Leubner tiRoot,
142*4e1bc9a0SAchim Leubner onePortContext->tiPortalContext,
143*4e1bc9a0SAchim Leubner agNULL,
144*4e1bc9a0SAchim Leubner tiIntrEventTypeDiscovery,
145*4e1bc9a0SAchim Leubner tiDiscFailed,
146*4e1bc9a0SAchim Leubner agNULL
147*4e1bc9a0SAchim Leubner );
148*4e1bc9a0SAchim Leubner
149*4e1bc9a0SAchim Leubner
150*4e1bc9a0SAchim Leubner dmRoot->tdData is tdsaRoot_t (just like current TD layer)
151*4e1bc9a0SAchim Leubner dmPortContext->tdData is tdsaPortContext_t
152*4e1bc9a0SAchim Leubner
153*4e1bc9a0SAchim Leubner */
154*4e1bc9a0SAchim Leubner osGLOBAL void
tddmDiscoverCB(dmRoot_t * dmRoot,dmPortContext_t * dmPortContext,bit32 eventStatus)155*4e1bc9a0SAchim Leubner tddmDiscoverCB(
156*4e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
157*4e1bc9a0SAchim Leubner dmPortContext_t *dmPortContext,
158*4e1bc9a0SAchim Leubner bit32 eventStatus
159*4e1bc9a0SAchim Leubner )
160*4e1bc9a0SAchim Leubner {
161*4e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot;
162*4e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared;
163*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot;
164*4e1bc9a0SAchim Leubner tdsaPortContext_t *onePortContext;
165*4e1bc9a0SAchim Leubner agsaRoot_t *agRoot;
166*4e1bc9a0SAchim Leubner agsaPortContext_t *agPortContext;
167*4e1bc9a0SAchim Leubner
168*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: start\n"));
169*4e1bc9a0SAchim Leubner tdsaRoot = (tdsaRoot_t *)dmRoot->tdData;
170*4e1bc9a0SAchim Leubner if (tdsaRoot == agNULL)
171*4e1bc9a0SAchim Leubner {
172*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: tdsaRoot is NULL\n"));
173*4e1bc9a0SAchim Leubner return;
174*4e1bc9a0SAchim Leubner }
175*4e1bc9a0SAchim Leubner
176*4e1bc9a0SAchim Leubner tdsaAllShared = &(tdsaRoot->tdsaAllShared);
177*4e1bc9a0SAchim Leubner if (tdsaAllShared == agNULL)
178*4e1bc9a0SAchim Leubner {
179*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: tdsaAllShared is NULL\n"));
180*4e1bc9a0SAchim Leubner return;
181*4e1bc9a0SAchim Leubner }
182*4e1bc9a0SAchim Leubner
183*4e1bc9a0SAchim Leubner tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
184*4e1bc9a0SAchim Leubner if (tiRoot == agNULL)
185*4e1bc9a0SAchim Leubner {
186*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: tiRoot is NULL\n"));
187*4e1bc9a0SAchim Leubner return;
188*4e1bc9a0SAchim Leubner }
189*4e1bc9a0SAchim Leubner
190*4e1bc9a0SAchim Leubner onePortContext = (tdsaPortContext_t *)dmPortContext->tdData;
191*4e1bc9a0SAchim Leubner if (onePortContext == agNULL)
192*4e1bc9a0SAchim Leubner {
193*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: onePortContext is NULL\n"));
194*4e1bc9a0SAchim Leubner return;
195*4e1bc9a0SAchim Leubner }
196*4e1bc9a0SAchim Leubner
197*4e1bc9a0SAchim Leubner TI_DBG2(("tddmDiscoverCB: localMCN 0x%x\n", tdsaFindLocalMCN(tiRoot, onePortContext)));
198*4e1bc9a0SAchim Leubner
199*4e1bc9a0SAchim Leubner if (eventStatus == dmDiscCompleted)
200*4e1bc9a0SAchim Leubner {
201*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: dmDiscCompleted\n"));
202*4e1bc9a0SAchim Leubner onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED;
203*4e1bc9a0SAchim Leubner onePortContext->DMDiscoveryState = dmDiscCompleted;
204*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: pid %d tiPortalContext %p\n", onePortContext->id, onePortContext->tiPortalContext));
205*4e1bc9a0SAchim Leubner
206*4e1bc9a0SAchim Leubner /* update onePortContext->UpdateMCN = agFALSE */
207*4e1bc9a0SAchim Leubner if ( onePortContext->UpdateMCN == agTRUE)
208*4e1bc9a0SAchim Leubner {
209*4e1bc9a0SAchim Leubner TI_DBG2(("tddmDiscoverCB: calling tdsaUpdateMCN\n"));
210*4e1bc9a0SAchim Leubner onePortContext->UpdateMCN = agFALSE;
211*4e1bc9a0SAchim Leubner tdsaUpdateMCN(dmRoot, onePortContext);
212*4e1bc9a0SAchim Leubner }
213*4e1bc9a0SAchim Leubner
214*4e1bc9a0SAchim Leubner ostiInitiatorEvent(
215*4e1bc9a0SAchim Leubner tiRoot,
216*4e1bc9a0SAchim Leubner onePortContext->tiPortalContext,
217*4e1bc9a0SAchim Leubner agNULL,
218*4e1bc9a0SAchim Leubner tiIntrEventTypeDiscovery,
219*4e1bc9a0SAchim Leubner tiDiscOK,
220*4e1bc9a0SAchim Leubner agNULL
221*4e1bc9a0SAchim Leubner );
222*4e1bc9a0SAchim Leubner }
223*4e1bc9a0SAchim Leubner else if (eventStatus == dmDiscFailed )
224*4e1bc9a0SAchim Leubner {
225*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: dmDiscFailed \n"));
226*4e1bc9a0SAchim Leubner onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED;
227*4e1bc9a0SAchim Leubner onePortContext->DMDiscoveryState = dmDiscFailed;
228*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: pid %d tiPortalContext %p\n", onePortContext->id, onePortContext->tiPortalContext));
229*4e1bc9a0SAchim Leubner agRoot = &(tdsaAllShared->agRootNonInt);
230*4e1bc9a0SAchim Leubner if (agRoot == agNULL)
231*4e1bc9a0SAchim Leubner {
232*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: agRoot is NULL\n"));
233*4e1bc9a0SAchim Leubner return;
234*4e1bc9a0SAchim Leubner }
235*4e1bc9a0SAchim Leubner agPortContext = onePortContext->agPortContext;
236*4e1bc9a0SAchim Leubner if (agPortContext == agNULL)
237*4e1bc9a0SAchim Leubner {
238*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: agPortContext is NULL\n"));
239*4e1bc9a0SAchim Leubner return;
240*4e1bc9a0SAchim Leubner }
241*4e1bc9a0SAchim Leubner /*
242*4e1bc9a0SAchim Leubner invalidate all devices in this port
243*4e1bc9a0SAchim Leubner */
244*4e1bc9a0SAchim Leubner tddmInvalidateDevicesInPort(tiRoot, onePortContext);
245*4e1bc9a0SAchim Leubner
246*4e1bc9a0SAchim Leubner saPortControl(agRoot,
247*4e1bc9a0SAchim Leubner agNULL,
248*4e1bc9a0SAchim Leubner 0,
249*4e1bc9a0SAchim Leubner agPortContext,
250*4e1bc9a0SAchim Leubner AGSA_PORT_IO_ABORT,
251*4e1bc9a0SAchim Leubner 0 /*quarantine */,
252*4e1bc9a0SAchim Leubner 0 /* unused */);
253*4e1bc9a0SAchim Leubner
254*4e1bc9a0SAchim Leubner
255*4e1bc9a0SAchim Leubner ostiInitiatorEvent(
256*4e1bc9a0SAchim Leubner tiRoot,
257*4e1bc9a0SAchim Leubner onePortContext->tiPortalContext,
258*4e1bc9a0SAchim Leubner agNULL,
259*4e1bc9a0SAchim Leubner tiIntrEventTypeDiscovery,
260*4e1bc9a0SAchim Leubner tiDiscFailed,
261*4e1bc9a0SAchim Leubner agNULL
262*4e1bc9a0SAchim Leubner );
263*4e1bc9a0SAchim Leubner }
264*4e1bc9a0SAchim Leubner else if (eventStatus == dmDiscAborted )
265*4e1bc9a0SAchim Leubner {
266*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: dmDiscAborted \n"));
267*4e1bc9a0SAchim Leubner onePortContext->DMDiscoveryState = dmDiscAborted;
268*4e1bc9a0SAchim Leubner }
269*4e1bc9a0SAchim Leubner else if (eventStatus == dmDiscAbortFailed )
270*4e1bc9a0SAchim Leubner {
271*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: dmDiscAbortFailed \n"));
272*4e1bc9a0SAchim Leubner onePortContext->DMDiscoveryState = dmDiscAbortFailed;
273*4e1bc9a0SAchim Leubner }
274*4e1bc9a0SAchim Leubner else if (eventStatus == dmDiscAbortInvalid )
275*4e1bc9a0SAchim Leubner {
276*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: dmDiscAbortInvalid \n"));
277*4e1bc9a0SAchim Leubner onePortContext->DMDiscoveryState = dmDiscAbortInvalid;
278*4e1bc9a0SAchim Leubner }
279*4e1bc9a0SAchim Leubner else if (eventStatus == dmDiscAbortInProgress )
280*4e1bc9a0SAchim Leubner {
281*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: dmDiscAbortInProgress \n"));
282*4e1bc9a0SAchim Leubner onePortContext->DMDiscoveryState = dmDiscAbortInProgress;
283*4e1bc9a0SAchim Leubner }
284*4e1bc9a0SAchim Leubner else
285*4e1bc9a0SAchim Leubner {
286*4e1bc9a0SAchim Leubner TI_DBG1(("tddmDiscoverCB: undefined eventStatus 0x%x\n", eventStatus));
287*4e1bc9a0SAchim Leubner onePortContext->DMDiscoveryState = dmDiscFailed;
288*4e1bc9a0SAchim Leubner }
289*4e1bc9a0SAchim Leubner
290*4e1bc9a0SAchim Leubner return;
291*4e1bc9a0SAchim Leubner }
292*4e1bc9a0SAchim Leubner
293*4e1bc9a0SAchim Leubner
294*4e1bc9a0SAchim Leubner osGLOBAL void
tddmQueryDiscoveryCB(dmRoot_t * dmRoot,dmPortContext_t * dmPortContext,bit32 discType,bit32 discState)295*4e1bc9a0SAchim Leubner tddmQueryDiscoveryCB(
296*4e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
297*4e1bc9a0SAchim Leubner dmPortContext_t *dmPortContext,
298*4e1bc9a0SAchim Leubner bit32 discType,
299*4e1bc9a0SAchim Leubner bit32 discState
300*4e1bc9a0SAchim Leubner )
301*4e1bc9a0SAchim Leubner {
302*4e1bc9a0SAchim Leubner tdsaPortContext_t *onePortContext = agNULL;
303*4e1bc9a0SAchim Leubner
304*4e1bc9a0SAchim Leubner TI_DBG2(("tddmQueryDiscoveryCB: start\n"));
305*4e1bc9a0SAchim Leubner onePortContext = (tdsaPortContext_t *)dmPortContext->tdData;
306*4e1bc9a0SAchim Leubner if (onePortContext == agNULL)
307*4e1bc9a0SAchim Leubner {
308*4e1bc9a0SAchim Leubner TI_DBG1(("tddmQueryDiscoveryCB: onePortContext is NULL\n"));
309*4e1bc9a0SAchim Leubner return;
310*4e1bc9a0SAchim Leubner }
311*4e1bc9a0SAchim Leubner TI_DBG2(("tddmQueryDiscoveryCB: discType %d discState %d\n", discType, discState));
312*4e1bc9a0SAchim Leubner
313*4e1bc9a0SAchim Leubner onePortContext->DMDiscoveryState = discState;
314*4e1bc9a0SAchim Leubner return;
315*4e1bc9a0SAchim Leubner }
316*4e1bc9a0SAchim Leubner
317*4e1bc9a0SAchim Leubner osGLOBAL void
tddmInvalidateDevicesInPort(tiRoot_t * tiRoot,tdsaPortContext_t * onePortContext)318*4e1bc9a0SAchim Leubner tddmInvalidateDevicesInPort(
319*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
320*4e1bc9a0SAchim Leubner tdsaPortContext_t *onePortContext
321*4e1bc9a0SAchim Leubner )
322*4e1bc9a0SAchim Leubner {
323*4e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
324*4e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
325*4e1bc9a0SAchim Leubner tdsaDeviceData_t *oneDeviceData = agNULL;
326*4e1bc9a0SAchim Leubner tdList_t *DeviceListList;
327*4e1bc9a0SAchim Leubner
328*4e1bc9a0SAchim Leubner TI_DBG1(("tddmInvalidateDevicesInPort: start\n"));
329*4e1bc9a0SAchim Leubner
330*4e1bc9a0SAchim Leubner /* find a device's existence */
331*4e1bc9a0SAchim Leubner DeviceListList = tdsaAllShared->MainDeviceList.flink;
332*4e1bc9a0SAchim Leubner while (DeviceListList != &(tdsaAllShared->MainDeviceList))
333*4e1bc9a0SAchim Leubner {
334*4e1bc9a0SAchim Leubner oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
335*4e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
336*4e1bc9a0SAchim Leubner {
337*4e1bc9a0SAchim Leubner TI_DBG1(("tddmInvalidateDevicesInPort: oneDeviceData is NULL!!!\n"));
338*4e1bc9a0SAchim Leubner return;
339*4e1bc9a0SAchim Leubner }
340*4e1bc9a0SAchim Leubner if ((oneDeviceData->registered == agTRUE) &&
341*4e1bc9a0SAchim Leubner (oneDeviceData->tdPortContext == onePortContext)
342*4e1bc9a0SAchim Leubner )
343*4e1bc9a0SAchim Leubner {
344*4e1bc9a0SAchim Leubner
345*4e1bc9a0SAchim Leubner TI_DBG3(("tddmInvalidateDevicesInPort: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
346*4e1bc9a0SAchim Leubner if (oneDeviceData->SASAddressID.sasAddressHi == onePortContext->sasRemoteAddressHi &&
347*4e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo == onePortContext->sasRemoteAddressLo
348*4e1bc9a0SAchim Leubner )
349*4e1bc9a0SAchim Leubner {
350*4e1bc9a0SAchim Leubner TI_DBG1(("tddmInvalidateDevicesInPort: keeping\n"));
351*4e1bc9a0SAchim Leubner oneDeviceData->valid = agTRUE;
352*4e1bc9a0SAchim Leubner oneDeviceData->valid2 = agFALSE;
353*4e1bc9a0SAchim Leubner }
354*4e1bc9a0SAchim Leubner else if (oneDeviceData->valid == agTRUE)
355*4e1bc9a0SAchim Leubner {
356*4e1bc9a0SAchim Leubner oneDeviceData->valid = agFALSE;
357*4e1bc9a0SAchim Leubner oneDeviceData->valid2 = agFALSE;
358*4e1bc9a0SAchim Leubner oneDeviceData->registered = agFALSE;
359*4e1bc9a0SAchim Leubner }
360*4e1bc9a0SAchim Leubner }
361*4e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
362*4e1bc9a0SAchim Leubner }
363*4e1bc9a0SAchim Leubner
364*4e1bc9a0SAchim Leubner TI_DBG3(("tddmInvalidateDevicesInPort: end\n"));
365*4e1bc9a0SAchim Leubner
366*4e1bc9a0SAchim Leubner return;
367*4e1bc9a0SAchim Leubner }
368*4e1bc9a0SAchim Leubner
369*4e1bc9a0SAchim Leubner osGLOBAL bit32
tddmNewSASorNot(tiRoot_t * tiRoot,tdsaPortContext_t * onePortContext,tdsaSASSubID_t * agSASSubID)370*4e1bc9a0SAchim Leubner tddmNewSASorNot(
371*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
372*4e1bc9a0SAchim Leubner tdsaPortContext_t *onePortContext,
373*4e1bc9a0SAchim Leubner tdsaSASSubID_t *agSASSubID
374*4e1bc9a0SAchim Leubner )
375*4e1bc9a0SAchim Leubner {
376*4e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
377*4e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
378*4e1bc9a0SAchim Leubner tdsaDeviceData_t *oneDeviceData = agNULL;
379*4e1bc9a0SAchim Leubner tdList_t *DeviceListList;
380*4e1bc9a0SAchim Leubner bit32 ret = agTRUE;
381*4e1bc9a0SAchim Leubner
382*4e1bc9a0SAchim Leubner TI_DBG3(("tddmNewSASorNot: start\n"));
383*4e1bc9a0SAchim Leubner
384*4e1bc9a0SAchim Leubner /* find a device's existence */
385*4e1bc9a0SAchim Leubner DeviceListList = tdsaAllShared->MainDeviceList.flink;
386*4e1bc9a0SAchim Leubner while (DeviceListList != &(tdsaAllShared->MainDeviceList))
387*4e1bc9a0SAchim Leubner {
388*4e1bc9a0SAchim Leubner oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
389*4e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
390*4e1bc9a0SAchim Leubner {
391*4e1bc9a0SAchim Leubner TI_DBG1(("tddmNewSASorNot: oneDeviceData is NULL!!!\n"));
392*4e1bc9a0SAchim Leubner return agFALSE;
393*4e1bc9a0SAchim Leubner }
394*4e1bc9a0SAchim Leubner if ((oneDeviceData->SASAddressID.sasAddressHi == agSASSubID->sasAddressHi) &&
395*4e1bc9a0SAchim Leubner (oneDeviceData->SASAddressID.sasAddressLo == agSASSubID->sasAddressLo) &&
396*4e1bc9a0SAchim Leubner (oneDeviceData->registered == agTRUE) &&
397*4e1bc9a0SAchim Leubner (oneDeviceData->tdPortContext == onePortContext)
398*4e1bc9a0SAchim Leubner )
399*4e1bc9a0SAchim Leubner {
400*4e1bc9a0SAchim Leubner TI_DBG3(("tddmNewSASorNot: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
401*4e1bc9a0SAchim Leubner ret = agFALSE;
402*4e1bc9a0SAchim Leubner break;
403*4e1bc9a0SAchim Leubner }
404*4e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
405*4e1bc9a0SAchim Leubner }
406*4e1bc9a0SAchim Leubner
407*4e1bc9a0SAchim Leubner
408*4e1bc9a0SAchim Leubner
409*4e1bc9a0SAchim Leubner TI_DBG3(("tddmNewSASorNot: end\n"));
410*4e1bc9a0SAchim Leubner
411*4e1bc9a0SAchim Leubner return ret;
412*4e1bc9a0SAchim Leubner }
413*4e1bc9a0SAchim Leubner
414*4e1bc9a0SAchim Leubner osGLOBAL tdsaDeviceData_t *
tddmPortSASDeviceFind(tiRoot_t * tiRoot,tdsaPortContext_t * onePortContext,bit32 sasAddrLo,bit32 sasAddrHi)415*4e1bc9a0SAchim Leubner tddmPortSASDeviceFind(
416*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
417*4e1bc9a0SAchim Leubner tdsaPortContext_t *onePortContext,
418*4e1bc9a0SAchim Leubner bit32 sasAddrLo,
419*4e1bc9a0SAchim Leubner bit32 sasAddrHi
420*4e1bc9a0SAchim Leubner )
421*4e1bc9a0SAchim Leubner {
422*4e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
423*4e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
424*4e1bc9a0SAchim Leubner tdsaDeviceData_t *oneDeviceData, *RetDeviceData=agNULL;
425*4e1bc9a0SAchim Leubner tdList_t *DeviceListList;
426*4e1bc9a0SAchim Leubner
427*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortSASDeviceFind: start\n"));
428*4e1bc9a0SAchim Leubner
429*4e1bc9a0SAchim Leubner TD_ASSERT((agNULL != tiRoot), "");
430*4e1bc9a0SAchim Leubner TD_ASSERT((agNULL != onePortContext), "");
431*4e1bc9a0SAchim Leubner
432*4e1bc9a0SAchim Leubner tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
433*4e1bc9a0SAchim Leubner
434*4e1bc9a0SAchim Leubner /* find a device's existence */
435*4e1bc9a0SAchim Leubner DeviceListList = tdsaAllShared->MainDeviceList.flink;
436*4e1bc9a0SAchim Leubner while (DeviceListList != &(tdsaAllShared->MainDeviceList))
437*4e1bc9a0SAchim Leubner {
438*4e1bc9a0SAchim Leubner oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
439*4e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
440*4e1bc9a0SAchim Leubner {
441*4e1bc9a0SAchim Leubner TI_DBG1(("tddmPortSASDeviceFind: oneDeviceData is NULL!!!\n"));
442*4e1bc9a0SAchim Leubner return agNULL;
443*4e1bc9a0SAchim Leubner }
444*4e1bc9a0SAchim Leubner if ((oneDeviceData->SASAddressID.sasAddressHi == sasAddrHi) &&
445*4e1bc9a0SAchim Leubner (oneDeviceData->SASAddressID.sasAddressLo == sasAddrLo) &&
446*4e1bc9a0SAchim Leubner (oneDeviceData->valid == agTRUE) &&
447*4e1bc9a0SAchim Leubner (oneDeviceData->tdPortContext == onePortContext)
448*4e1bc9a0SAchim Leubner )
449*4e1bc9a0SAchim Leubner {
450*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortSASDeviceFind: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
451*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortSASDeviceFind: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
452*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortSASDeviceFind: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
453*4e1bc9a0SAchim Leubner RetDeviceData = oneDeviceData;
454*4e1bc9a0SAchim Leubner break;
455*4e1bc9a0SAchim Leubner }
456*4e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
457*4e1bc9a0SAchim Leubner }
458*4e1bc9a0SAchim Leubner
459*4e1bc9a0SAchim Leubner tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
460*4e1bc9a0SAchim Leubner
461*4e1bc9a0SAchim Leubner return RetDeviceData;
462*4e1bc9a0SAchim Leubner }
463*4e1bc9a0SAchim Leubner
464*4e1bc9a0SAchim Leubner /* not in use yet */
465*4e1bc9a0SAchim Leubner osGLOBAL tdsaDeviceData_t *
tddmAddToSharedcontext(agsaRoot_t * agRoot,tdsaPortContext_t * onePortContext,tdsaSASSubID_t * agSASSubID,tdsaDeviceData_t * oneExpDeviceData,bit8 phyID)466*4e1bc9a0SAchim Leubner tddmAddToSharedcontext(
467*4e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
468*4e1bc9a0SAchim Leubner tdsaPortContext_t *onePortContext,
469*4e1bc9a0SAchim Leubner tdsaSASSubID_t *agSASSubID,
470*4e1bc9a0SAchim Leubner tdsaDeviceData_t *oneExpDeviceData,
471*4e1bc9a0SAchim Leubner bit8 phyID
472*4e1bc9a0SAchim Leubner )
473*4e1bc9a0SAchim Leubner {
474*4e1bc9a0SAchim Leubner tdsaDeviceData_t *oneDeviceData = agNULL;
475*4e1bc9a0SAchim Leubner tdList_t *DeviceListList;
476*4e1bc9a0SAchim Leubner tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
477*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
478*4e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
479*4e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
480*4e1bc9a0SAchim Leubner bit32 new_device = agTRUE;
481*4e1bc9a0SAchim Leubner
482*4e1bc9a0SAchim Leubner TI_DBG1(("tddmAddToSharedcontext: start\n"));
483*4e1bc9a0SAchim Leubner
484*4e1bc9a0SAchim Leubner TI_DBG1(("tddmAddToSharedcontext: oneportContext ID %d\n", onePortContext->id));
485*4e1bc9a0SAchim Leubner /* find a device's existence */
486*4e1bc9a0SAchim Leubner DeviceListList = tdsaAllShared->MainDeviceList.flink;
487*4e1bc9a0SAchim Leubner while (DeviceListList != &(tdsaAllShared->MainDeviceList))
488*4e1bc9a0SAchim Leubner {
489*4e1bc9a0SAchim Leubner oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
490*4e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
491*4e1bc9a0SAchim Leubner {
492*4e1bc9a0SAchim Leubner TI_DBG1(("tddmAddToSharedcontext: oneDeviceData is NULL!!!\n"));
493*4e1bc9a0SAchim Leubner return agNULL;
494*4e1bc9a0SAchim Leubner }
495*4e1bc9a0SAchim Leubner if ((oneDeviceData->SASAddressID.sasAddressHi == agSASSubID->sasAddressHi) &&
496*4e1bc9a0SAchim Leubner (oneDeviceData->SASAddressID.sasAddressLo == agSASSubID->sasAddressLo) &&
497*4e1bc9a0SAchim Leubner (oneDeviceData->tdPortContext == onePortContext)
498*4e1bc9a0SAchim Leubner )
499*4e1bc9a0SAchim Leubner {
500*4e1bc9a0SAchim Leubner TI_DBG1(("tddmAddToSharedcontext: pid %dtddmAddToSharedcontext did %d\n", onePortContext->id, oneDeviceData->id));
501*4e1bc9a0SAchim Leubner new_device = agFALSE;
502*4e1bc9a0SAchim Leubner break;
503*4e1bc9a0SAchim Leubner }
504*4e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
505*4e1bc9a0SAchim Leubner }
506*4e1bc9a0SAchim Leubner
507*4e1bc9a0SAchim Leubner /* new device */
508*4e1bc9a0SAchim Leubner if (new_device == agTRUE)
509*4e1bc9a0SAchim Leubner {
510*4e1bc9a0SAchim Leubner TI_DBG1(("tddmAddToSharedcontext: new device\n"));
511*4e1bc9a0SAchim Leubner tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
512*4e1bc9a0SAchim Leubner if (!TDLIST_NOT_EMPTY(&(tdsaAllShared->FreeDeviceList)))
513*4e1bc9a0SAchim Leubner {
514*4e1bc9a0SAchim Leubner tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
515*4e1bc9a0SAchim Leubner TI_DBG1(("tddmAddToSharedcontext: empty DeviceData FreeLink\n"));
516*4e1bc9a0SAchim Leubner return agNULL;
517*4e1bc9a0SAchim Leubner }
518*4e1bc9a0SAchim Leubner
519*4e1bc9a0SAchim Leubner TDLIST_DEQUEUE_FROM_HEAD(&DeviceListList, &(tdsaAllShared->FreeDeviceList));
520*4e1bc9a0SAchim Leubner tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
521*4e1bc9a0SAchim Leubner oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, FreeLink, DeviceListList);
522*4e1bc9a0SAchim Leubner
523*4e1bc9a0SAchim Leubner TI_DBG1(("tddmAddToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
524*4e1bc9a0SAchim Leubner
525*4e1bc9a0SAchim Leubner onePortContext->Count++;
526*4e1bc9a0SAchim Leubner oneDeviceData->agRoot = agRoot;
527*4e1bc9a0SAchim Leubner /* saving sas address */
528*4e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo = agSASSubID->sasAddressLo;
529*4e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi = agSASSubID->sasAddressHi;
530*4e1bc9a0SAchim Leubner oneDeviceData->initiator_ssp_stp_smp = agSASSubID->initiator_ssp_stp_smp;
531*4e1bc9a0SAchim Leubner oneDeviceData->target_ssp_stp_smp = agSASSubID->target_ssp_stp_smp;
532*4e1bc9a0SAchim Leubner oneDeviceData->tdPortContext = onePortContext;
533*4e1bc9a0SAchim Leubner /* handles both SAS target and STP-target, SATA-device */
534*4e1bc9a0SAchim Leubner if (!DEVICE_IS_SATA_DEVICE(oneDeviceData) && !DEVICE_IS_STP_TARGET(oneDeviceData))
535*4e1bc9a0SAchim Leubner {
536*4e1bc9a0SAchim Leubner oneDeviceData->DeviceType = TD_SAS_DEVICE;
537*4e1bc9a0SAchim Leubner }
538*4e1bc9a0SAchim Leubner else
539*4e1bc9a0SAchim Leubner {
540*4e1bc9a0SAchim Leubner oneDeviceData->DeviceType = TD_SATA_DEVICE;
541*4e1bc9a0SAchim Leubner }
542*4e1bc9a0SAchim Leubner
543*4e1bc9a0SAchim Leubner oneDeviceData->ExpDevice = oneExpDeviceData;
544*4e1bc9a0SAchim Leubner /* set phyID only when it has initial value of 0xFF */
545*4e1bc9a0SAchim Leubner if (oneDeviceData->phyID == 0xFF)
546*4e1bc9a0SAchim Leubner {
547*4e1bc9a0SAchim Leubner oneDeviceData->phyID = phyID;
548*4e1bc9a0SAchim Leubner }
549*4e1bc9a0SAchim Leubner
550*4e1bc9a0SAchim Leubner oneDeviceData->valid = agTRUE;
551*4e1bc9a0SAchim Leubner
552*4e1bc9a0SAchim Leubner /* add the devicedata to the portcontext */
553*4e1bc9a0SAchim Leubner tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
554*4e1bc9a0SAchim Leubner TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList));
555*4e1bc9a0SAchim Leubner tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
556*4e1bc9a0SAchim Leubner TI_DBG1(("tddmAddToSharedcontext: one case pid %d did %d \n", onePortContext->id, oneDeviceData->id));
557*4e1bc9a0SAchim Leubner TI_DBG1(("tddmAddToSharedcontext: new case pid %d did %d phyID %d\n", onePortContext->id, oneDeviceData->id, oneDeviceData->phyID));
558*4e1bc9a0SAchim Leubner }
559*4e1bc9a0SAchim Leubner else /* old device */
560*4e1bc9a0SAchim Leubner {
561*4e1bc9a0SAchim Leubner TI_DBG1(("tddmAddToSharedcontext: old device\n"));
562*4e1bc9a0SAchim Leubner TI_DBG1(("tddmAddToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
563*4e1bc9a0SAchim Leubner
564*4e1bc9a0SAchim Leubner oneDeviceData->agRoot = agRoot;
565*4e1bc9a0SAchim Leubner /* saving sas address */
566*4e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo = agSASSubID->sasAddressLo;
567*4e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi = agSASSubID->sasAddressHi;
568*4e1bc9a0SAchim Leubner oneDeviceData->initiator_ssp_stp_smp = agSASSubID->initiator_ssp_stp_smp;
569*4e1bc9a0SAchim Leubner oneDeviceData->target_ssp_stp_smp = agSASSubID->target_ssp_stp_smp;
570*4e1bc9a0SAchim Leubner oneDeviceData->tdPortContext = onePortContext;
571*4e1bc9a0SAchim Leubner /* handles both SAS target and STP-target, SATA-device */
572*4e1bc9a0SAchim Leubner if (!DEVICE_IS_SATA_DEVICE(oneDeviceData) && !DEVICE_IS_STP_TARGET(oneDeviceData))
573*4e1bc9a0SAchim Leubner {
574*4e1bc9a0SAchim Leubner oneDeviceData->DeviceType = TD_SAS_DEVICE;
575*4e1bc9a0SAchim Leubner }
576*4e1bc9a0SAchim Leubner else
577*4e1bc9a0SAchim Leubner {
578*4e1bc9a0SAchim Leubner oneDeviceData->DeviceType = TD_SATA_DEVICE;
579*4e1bc9a0SAchim Leubner }
580*4e1bc9a0SAchim Leubner
581*4e1bc9a0SAchim Leubner oneDeviceData->ExpDevice = oneExpDeviceData;
582*4e1bc9a0SAchim Leubner /* set phyID only when it has initial value of 0xFF */
583*4e1bc9a0SAchim Leubner if (oneDeviceData->phyID == 0xFF)
584*4e1bc9a0SAchim Leubner {
585*4e1bc9a0SAchim Leubner oneDeviceData->phyID = phyID;
586*4e1bc9a0SAchim Leubner }
587*4e1bc9a0SAchim Leubner
588*4e1bc9a0SAchim Leubner oneDeviceData->valid = agTRUE;
589*4e1bc9a0SAchim Leubner TI_DBG1(("tddmAddToSharedcontext: old case pid %d did %d phyID %d\n", onePortContext->id, oneDeviceData->id, oneDeviceData->phyID));
590*4e1bc9a0SAchim Leubner
591*4e1bc9a0SAchim Leubner }
592*4e1bc9a0SAchim Leubner return oneDeviceData;
593*4e1bc9a0SAchim Leubner
594*4e1bc9a0SAchim Leubner }
595*4e1bc9a0SAchim Leubner
596*4e1bc9a0SAchim Leubner
597*4e1bc9a0SAchim Leubner /*
598*4e1bc9a0SAchim Leubner calls saRegisterNewDevice()
599*4e1bc9a0SAchim Leubner in ossaDeviceRegistrationCB(), if an expander, register to DM
600*4e1bc9a0SAchim Leubner #define DEVICE_IS_SMP_TARGET(DeviceData) \
601*4e1bc9a0SAchim Leubner (((DeviceData)->target_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT)
602*4e1bc9a0SAchim Leubner */
603*4e1bc9a0SAchim Leubner osGLOBAL tdsaDeviceData_t *
tddmPortDeviceAdd(tiRoot_t * tiRoot,tdsaPortContext_t * onePortContext,dmDeviceInfo_t * dmDeviceInfo,tdsaDeviceData_t * oneExpDeviceData)604*4e1bc9a0SAchim Leubner tddmPortDeviceAdd(
605*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
606*4e1bc9a0SAchim Leubner tdsaPortContext_t *onePortContext,
607*4e1bc9a0SAchim Leubner dmDeviceInfo_t *dmDeviceInfo,
608*4e1bc9a0SAchim Leubner tdsaDeviceData_t *oneExpDeviceData
609*4e1bc9a0SAchim Leubner )
610*4e1bc9a0SAchim Leubner {
611*4e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
612*4e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
613*4e1bc9a0SAchim Leubner tdsaDeviceData_t *oneDeviceData = agNULL;
614*4e1bc9a0SAchim Leubner tdsaSASSubID_t agSASSubID;
615*4e1bc9a0SAchim Leubner bit8 phyID;
616*4e1bc9a0SAchim Leubner
617*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortDeviceAdd: start\n"));
618*4e1bc9a0SAchim Leubner
619*4e1bc9a0SAchim Leubner
620*4e1bc9a0SAchim Leubner agSASSubID.sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi);
621*4e1bc9a0SAchim Leubner agSASSubID.sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo);
622*4e1bc9a0SAchim Leubner agSASSubID.initiator_ssp_stp_smp = dmDeviceInfo->initiator_ssp_stp_smp;
623*4e1bc9a0SAchim Leubner agSASSubID.target_ssp_stp_smp = dmDeviceInfo->target_ssp_stp_smp;
624*4e1bc9a0SAchim Leubner phyID = (dmDeviceInfo->ext) & 0xFF;
625*4e1bc9a0SAchim Leubner
626*4e1bc9a0SAchim Leubner /* old device and already registered to LL; added by link-up event */
627*4e1bc9a0SAchim Leubner if ( agFALSE == tdssNewSASorNot(
628*4e1bc9a0SAchim Leubner onePortContext->agRoot,
629*4e1bc9a0SAchim Leubner onePortContext,
630*4e1bc9a0SAchim Leubner &agSASSubID
631*4e1bc9a0SAchim Leubner )
632*4e1bc9a0SAchim Leubner )
633*4e1bc9a0SAchim Leubner {
634*4e1bc9a0SAchim Leubner /* old device and already registered to LL; added by link-up event */
635*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortDeviceAdd: OLD qqqq initiator_ssp_stp_smp %d target_ssp_stp_smp %d\n", agSASSubID.initiator_ssp_stp_smp, agSASSubID.target_ssp_stp_smp));
636*4e1bc9a0SAchim Leubner /* find the old device */
637*4e1bc9a0SAchim Leubner oneDeviceData = tdssNewAddSASToSharedcontext(
638*4e1bc9a0SAchim Leubner onePortContext->agRoot,
639*4e1bc9a0SAchim Leubner onePortContext,
640*4e1bc9a0SAchim Leubner &agSASSubID,
641*4e1bc9a0SAchim Leubner oneExpDeviceData,
642*4e1bc9a0SAchim Leubner phyID
643*4e1bc9a0SAchim Leubner );
644*4e1bc9a0SAchim Leubner
645*4e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
646*4e1bc9a0SAchim Leubner {
647*4e1bc9a0SAchim Leubner TI_DBG1(("tddmPortDeviceAdd: no more device!!! oneDeviceData is null\n"));
648*4e1bc9a0SAchim Leubner }
649*4e1bc9a0SAchim Leubner
650*4e1bc9a0SAchim Leubner /* If a device is allocated */
651*4e1bc9a0SAchim Leubner if ( oneDeviceData != agNULL )
652*4e1bc9a0SAchim Leubner {
653*4e1bc9a0SAchim Leubner
654*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortDeviceAdd: sasAddressHi 0x%08x\n", agSASSubID.sasAddressHi));
655*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortDeviceAdd: sasAddressLo 0x%08x\n", agSASSubID.sasAddressLo));
656*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortDeviceAdd: phyID 0x%x\n", phyID));
657*4e1bc9a0SAchim Leubner
658*4e1bc9a0SAchim Leubner /* copy dmDeviceInfo to oneDeviceData->agDeviceInfo except ext field */
659*4e1bc9a0SAchim Leubner oneDeviceData->agDeviceInfo.smpTimeout = dmDeviceInfo->smpTimeout;
660*4e1bc9a0SAchim Leubner oneDeviceData->agDeviceInfo.it_NexusTimeout = dmDeviceInfo->it_NexusTimeout;
661*4e1bc9a0SAchim Leubner oneDeviceData->agDeviceInfo.firstBurstSize = dmDeviceInfo->firstBurstSize;
662*4e1bc9a0SAchim Leubner oneDeviceData->agDeviceInfo.devType_S_Rate = dmDeviceInfo->devType_S_Rate;
663*4e1bc9a0SAchim Leubner osti_memcpy(&(oneDeviceData->agDeviceInfo.sasAddressHi), &(dmDeviceInfo->sasAddressHi), 4);
664*4e1bc9a0SAchim Leubner osti_memcpy(&(oneDeviceData->agDeviceInfo.sasAddressLo), &(dmDeviceInfo->sasAddressLo), 4);
665*4e1bc9a0SAchim Leubner if (dmDeviceInfo->sataDeviceType == SATA_ATAPI_DEVICE)
666*4e1bc9a0SAchim Leubner {
667*4e1bc9a0SAchim Leubner oneDeviceData->agDeviceInfo.flag |= ATAPI_DEVICE_FLAG;
668*4e1bc9a0SAchim Leubner }
669*4e1bc9a0SAchim Leubner
670*4e1bc9a0SAchim Leubner oneDeviceData->satDevData.satDeviceType = dmDeviceInfo->sataDeviceType;
671*4e1bc9a0SAchim Leubner
672*4e1bc9a0SAchim Leubner
673*4e1bc9a0SAchim Leubner
674*4e1bc9a0SAchim Leubner oneDeviceData->agContext.osData = oneDeviceData;
675*4e1bc9a0SAchim Leubner oneDeviceData->agContext.sdkData = agNULL;
676*4e1bc9a0SAchim Leubner
677*4e1bc9a0SAchim Leubner }
678*4e1bc9a0SAchim Leubner return oneDeviceData;
679*4e1bc9a0SAchim Leubner } /* old device */
680*4e1bc9a0SAchim Leubner
681*4e1bc9a0SAchim Leubner /* new device */
682*4e1bc9a0SAchim Leubner
683*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortDeviceAdd: NEW qqqq initiator_ssp_stp_smp %d target_ssp_stp_smp %d\n", agSASSubID.initiator_ssp_stp_smp, agSASSubID.target_ssp_stp_smp));
684*4e1bc9a0SAchim Leubner
685*4e1bc9a0SAchim Leubner /* allocate a new device and set the valid bit */
686*4e1bc9a0SAchim Leubner oneDeviceData = tdssNewAddSASToSharedcontext(
687*4e1bc9a0SAchim Leubner onePortContext->agRoot,
688*4e1bc9a0SAchim Leubner onePortContext,
689*4e1bc9a0SAchim Leubner &agSASSubID,
690*4e1bc9a0SAchim Leubner oneExpDeviceData,
691*4e1bc9a0SAchim Leubner phyID
692*4e1bc9a0SAchim Leubner );
693*4e1bc9a0SAchim Leubner
694*4e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
695*4e1bc9a0SAchim Leubner {
696*4e1bc9a0SAchim Leubner TI_DBG1(("tddmPortDeviceAdd: no more device!!! oneDeviceData is null\n"));
697*4e1bc9a0SAchim Leubner }
698*4e1bc9a0SAchim Leubner
699*4e1bc9a0SAchim Leubner /* If a device is allocated */
700*4e1bc9a0SAchim Leubner if ( oneDeviceData != agNULL )
701*4e1bc9a0SAchim Leubner {
702*4e1bc9a0SAchim Leubner
703*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortDeviceAdd: sasAddressHi 0x%08x\n", agSASSubID.sasAddressHi));
704*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortDeviceAdd: sasAddressLo 0x%08x\n", agSASSubID.sasAddressLo));
705*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortDeviceAdd: phyID 0x%x\n", phyID));
706*4e1bc9a0SAchim Leubner
707*4e1bc9a0SAchim Leubner /* copy dmDeviceInfo to oneDeviceData->agDeviceInfo except ext field */
708*4e1bc9a0SAchim Leubner oneDeviceData->agDeviceInfo.smpTimeout = dmDeviceInfo->smpTimeout;
709*4e1bc9a0SAchim Leubner oneDeviceData->agDeviceInfo.it_NexusTimeout = dmDeviceInfo->it_NexusTimeout;
710*4e1bc9a0SAchim Leubner oneDeviceData->agDeviceInfo.firstBurstSize = dmDeviceInfo->firstBurstSize;
711*4e1bc9a0SAchim Leubner oneDeviceData->agDeviceInfo.devType_S_Rate = dmDeviceInfo->devType_S_Rate;
712*4e1bc9a0SAchim Leubner osti_memcpy(&(oneDeviceData->agDeviceInfo.sasAddressHi), &(dmDeviceInfo->sasAddressHi), 4);
713*4e1bc9a0SAchim Leubner osti_memcpy(&(oneDeviceData->agDeviceInfo.sasAddressLo), &(dmDeviceInfo->sasAddressLo), 4);
714*4e1bc9a0SAchim Leubner
715*4e1bc9a0SAchim Leubner oneDeviceData->satDevData.satDeviceType = dmDeviceInfo->sataDeviceType;
716*4e1bc9a0SAchim Leubner if (dmDeviceInfo->sataDeviceType == SATA_ATAPI_DEVICE)
717*4e1bc9a0SAchim Leubner {
718*4e1bc9a0SAchim Leubner oneDeviceData->agDeviceInfo.flag |= ATAPI_DEVICE_FLAG;
719*4e1bc9a0SAchim Leubner }
720*4e1bc9a0SAchim Leubner
721*4e1bc9a0SAchim Leubner oneDeviceData->agContext.osData = oneDeviceData;
722*4e1bc9a0SAchim Leubner oneDeviceData->agContext.sdkData = agNULL;
723*4e1bc9a0SAchim Leubner
724*4e1bc9a0SAchim Leubner TI_DBG2(("tddmPortDeviceAdd: did %d\n", oneDeviceData->id));
725*4e1bc9a0SAchim Leubner
726*4e1bc9a0SAchim Leubner /* don't add and register initiator for T2D */
727*4e1bc9a0SAchim Leubner if ( (((oneDeviceData->initiator_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT) &&
728*4e1bc9a0SAchim Leubner ((oneDeviceData->target_ssp_stp_smp & DEVICE_SSP_BIT) != DEVICE_SSP_BIT))
729*4e1bc9a0SAchim Leubner ||
730*4e1bc9a0SAchim Leubner (((oneDeviceData->initiator_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT) &&
731*4e1bc9a0SAchim Leubner ((oneDeviceData->target_ssp_stp_smp & DEVICE_SSP_BIT) != DEVICE_SSP_BIT))
732*4e1bc9a0SAchim Leubner )
733*4e1bc9a0SAchim Leubner {
734*4e1bc9a0SAchim Leubner TI_DBG1(("tddmPortDeviceAdd: initiator. no add and registration\n"));
735*4e1bc9a0SAchim Leubner TI_DBG1(("tddmPortDeviceAdd: sasAddressHi 0x%08x\n", agSASSubID.sasAddressHi));
736*4e1bc9a0SAchim Leubner TI_DBG1(("tddmPortDeviceAdd: sasAddressLo 0x%08x\n", agSASSubID.sasAddressLo));
737*4e1bc9a0SAchim Leubner
738*4e1bc9a0SAchim Leubner }
739*4e1bc9a0SAchim Leubner else
740*4e1bc9a0SAchim Leubner {
741*4e1bc9a0SAchim Leubner if (oneDeviceData->registered == agFALSE)
742*4e1bc9a0SAchim Leubner {
743*4e1bc9a0SAchim Leubner #ifdef REMOVED
744*4e1bc9a0SAchim Leubner //temp; setting MCN to tdsaAllShared->MCN
745*4e1bc9a0SAchim Leubner oneDeviceData->agDeviceInfo.flag = oneDeviceData->agDeviceInfo.flag | (tdsaAllShared->MCN << 16);
746*4e1bc9a0SAchim Leubner //end temp
747*4e1bc9a0SAchim Leubner #endif
748*4e1bc9a0SAchim Leubner if( tdsaAllShared->sflag )
749*4e1bc9a0SAchim Leubner {
750*4e1bc9a0SAchim Leubner if( ! DEVICE_IS_SMP_TARGET(oneDeviceData))
751*4e1bc9a0SAchim Leubner {
752*4e1bc9a0SAchim Leubner TI_DBG1(("tddmPortDeviceAdd: saRegisterNewDevice sflag %d\n", tdsaAllShared->sflag));
753*4e1bc9a0SAchim Leubner oneDeviceData->agDeviceInfo.flag = oneDeviceData->agDeviceInfo.flag | TD_XFER_RDY_PRIORTY_DEVICE_FLAG;
754*4e1bc9a0SAchim Leubner }
755*4e1bc9a0SAchim Leubner }
756*4e1bc9a0SAchim Leubner saRegisterNewDevice( /* tddmPortDeviceAdd */
757*4e1bc9a0SAchim Leubner onePortContext->agRoot,
758*4e1bc9a0SAchim Leubner &oneDeviceData->agContext,
759*4e1bc9a0SAchim Leubner 0,
760*4e1bc9a0SAchim Leubner &oneDeviceData->agDeviceInfo,
761*4e1bc9a0SAchim Leubner onePortContext->agPortContext,
762*4e1bc9a0SAchim Leubner 0
763*4e1bc9a0SAchim Leubner );
764*4e1bc9a0SAchim Leubner }
765*4e1bc9a0SAchim Leubner }
766*4e1bc9a0SAchim Leubner }
767*4e1bc9a0SAchim Leubner
768*4e1bc9a0SAchim Leubner return oneDeviceData;
769*4e1bc9a0SAchim Leubner }
770*4e1bc9a0SAchim Leubner
771*4e1bc9a0SAchim Leubner
772*4e1bc9a0SAchim Leubner /*
773*4e1bc9a0SAchim Leubner each call, add the device to the device list
774*4e1bc9a0SAchim Leubner typedef struct{
775*4e1bc9a0SAchim Leubner bit16 smpTimeout;
776*4e1bc9a0SAchim Leubner bit16 it_NexusTimeout;
777*4e1bc9a0SAchim Leubner bit16 firstBurstSize;
778*4e1bc9a0SAchim Leubner bit8 flag;
779*4e1bc9a0SAchim Leubner bit8 devType_S_Rate;
780*4e1bc9a0SAchim Leubner bit8 sasAddressHi[4];
781*4e1bc9a0SAchim Leubner bit8 sasAddressLo[4];
782*4e1bc9a0SAchim Leubner } dmDeviceInfo_t;
783*4e1bc9a0SAchim Leubner
784*4e1bc9a0SAchim Leubner find oneExpDeviceData (expander device data) from dmExpDeviceInfo and
785*4e1bc9a0SAchim Leubner pass it to tddmPortDeviceAdd()
786*4e1bc9a0SAchim Leubner start here - change spec from bit32 to void
787*4e1bc9a0SAchim Leubner
788*4e1bc9a0SAchim Leubner phyID = ((dmDeviceInfo->flag) & 0xFC) >> 2;
789*4e1bc9a0SAchim Leubner Initiators are not registered
790*4e1bc9a0SAchim Leubner */
791*4e1bc9a0SAchim Leubner //start here
792*4e1bc9a0SAchim Leubner osGLOBAL void
tddmReportDevice(dmRoot_t * dmRoot,dmPortContext_t * dmPortContext,dmDeviceInfo_t * dmDeviceInfo,dmDeviceInfo_t * dmExpDeviceInfo,bit32 flag)793*4e1bc9a0SAchim Leubner tddmReportDevice(
794*4e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
795*4e1bc9a0SAchim Leubner dmPortContext_t *dmPortContext,
796*4e1bc9a0SAchim Leubner dmDeviceInfo_t *dmDeviceInfo, /* device */
797*4e1bc9a0SAchim Leubner dmDeviceInfo_t *dmExpDeviceInfo, /* expander the device is attached to */
798*4e1bc9a0SAchim Leubner bit32 flag
799*4e1bc9a0SAchim Leubner
800*4e1bc9a0SAchim Leubner )
801*4e1bc9a0SAchim Leubner {
802*4e1bc9a0SAchim Leubner agsaRoot_t *agRoot;
803*4e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot;
804*4e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared;
805*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot;
806*4e1bc9a0SAchim Leubner tdsaDeviceData_t *oneExpDeviceData = agNULL;
807*4e1bc9a0SAchim Leubner bit32 sasAddressHi, sasAddressLo;
808*4e1bc9a0SAchim Leubner tdsaPortContext_t *onePortContext;
809*4e1bc9a0SAchim Leubner tdsaDeviceData_t *oneDeviceData = agNULL;
810*4e1bc9a0SAchim Leubner bit32 localMCN = 0, finalMCN = 0;
811*4e1bc9a0SAchim Leubner bit32 devMCN = 1;
812*4e1bc9a0SAchim Leubner bit32 DLR = 0xA;
813*4e1bc9a0SAchim Leubner bit32 option;
814*4e1bc9a0SAchim Leubner bit32 param;
815*4e1bc9a0SAchim Leubner
816*4e1bc9a0SAchim Leubner #ifdef FDS_SM
817*4e1bc9a0SAchim Leubner smRoot_t *smRoot;
818*4e1bc9a0SAchim Leubner #endif
819*4e1bc9a0SAchim Leubner
820*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: start\n"));
821*4e1bc9a0SAchim Leubner tdsaRoot = (tdsaRoot_t *)dmRoot->tdData;
822*4e1bc9a0SAchim Leubner if (tdsaRoot == agNULL)
823*4e1bc9a0SAchim Leubner {
824*4e1bc9a0SAchim Leubner TI_DBG1(("tddmReportDevice: tdsaRoot is NULL\n"));
825*4e1bc9a0SAchim Leubner return;
826*4e1bc9a0SAchim Leubner }
827*4e1bc9a0SAchim Leubner
828*4e1bc9a0SAchim Leubner tdsaAllShared = &(tdsaRoot->tdsaAllShared);
829*4e1bc9a0SAchim Leubner if (tdsaAllShared == agNULL)
830*4e1bc9a0SAchim Leubner {
831*4e1bc9a0SAchim Leubner TI_DBG1(("tddmReportDevice: tdsaAllShared is NULL\n"));
832*4e1bc9a0SAchim Leubner return;
833*4e1bc9a0SAchim Leubner }
834*4e1bc9a0SAchim Leubner
835*4e1bc9a0SAchim Leubner tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
836*4e1bc9a0SAchim Leubner if (tiRoot == agNULL)
837*4e1bc9a0SAchim Leubner {
838*4e1bc9a0SAchim Leubner TI_DBG1(("tddmReportDevice: tiRoot is NULL\n"));
839*4e1bc9a0SAchim Leubner return;
840*4e1bc9a0SAchim Leubner }
841*4e1bc9a0SAchim Leubner
842*4e1bc9a0SAchim Leubner onePortContext = (tdsaPortContext_t *)dmPortContext->tdData;
843*4e1bc9a0SAchim Leubner if (onePortContext == agNULL)
844*4e1bc9a0SAchim Leubner {
845*4e1bc9a0SAchim Leubner TI_DBG1(("tddmReportDevice: onePortContext is NULL\n"));
846*4e1bc9a0SAchim Leubner return;
847*4e1bc9a0SAchim Leubner }
848*4e1bc9a0SAchim Leubner
849*4e1bc9a0SAchim Leubner #ifdef FDS_SM
850*4e1bc9a0SAchim Leubner smRoot = &(tdsaAllShared->smRoot);
851*4e1bc9a0SAchim Leubner #endif
852*4e1bc9a0SAchim Leubner
853*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: device addrHi 0x%08x addrLo 0x%08x\n",
854*4e1bc9a0SAchim Leubner TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi), TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressLo)));
855*4e1bc9a0SAchim Leubner
856*4e1bc9a0SAchim Leubner if (dmExpDeviceInfo != agNULL)
857*4e1bc9a0SAchim Leubner {
858*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: attached expander addrHi 0x%08x addrLo 0x%08x\n",
859*4e1bc9a0SAchim Leubner TD_GET_SAS_ADDRESSHI(dmExpDeviceInfo->sasAddressHi), TD_GET_SAS_ADDRESSLO(dmExpDeviceInfo->sasAddressLo)));
860*4e1bc9a0SAchim Leubner }
861*4e1bc9a0SAchim Leubner else
862*4e1bc9a0SAchim Leubner {
863*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: No attached expander\n"));
864*4e1bc9a0SAchim Leubner }
865*4e1bc9a0SAchim Leubner
866*4e1bc9a0SAchim Leubner /* initiators only (e.g. SPC or SPCv) are discarded */
867*4e1bc9a0SAchim Leubner if ( (dmDeviceInfo->target_ssp_stp_smp == 0) &&
868*4e1bc9a0SAchim Leubner ( DEVICE_IS_SSP_INITIATOR(dmDeviceInfo) || DEVICE_IS_STP_INITIATOR(dmDeviceInfo) || DEVICE_IS_SMP_INITIATOR(dmDeviceInfo))
869*4e1bc9a0SAchim Leubner )
870*4e1bc9a0SAchim Leubner {
871*4e1bc9a0SAchim Leubner TI_DBG3(("tddmReportDevice: Initiators are not added\n"));
872*4e1bc9a0SAchim Leubner TI_DBG3(("tddmReportDevice: device addrHi 0x%08x addrLo 0x%08x\n",
873*4e1bc9a0SAchim Leubner TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi), TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressLo)));
874*4e1bc9a0SAchim Leubner return;
875*4e1bc9a0SAchim Leubner }
876*4e1bc9a0SAchim Leubner
877*4e1bc9a0SAchim Leubner if (flag == dmDeviceArrival)
878*4e1bc9a0SAchim Leubner {
879*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: arrival\n"));
880*4e1bc9a0SAchim Leubner if (dmExpDeviceInfo != agNULL)
881*4e1bc9a0SAchim Leubner {
882*4e1bc9a0SAchim Leubner sasAddressHi = TD_GET_SAS_ADDRESSHI(dmExpDeviceInfo->sasAddressHi);
883*4e1bc9a0SAchim Leubner sasAddressLo = TD_GET_SAS_ADDRESSLO(dmExpDeviceInfo->sasAddressLo);
884*4e1bc9a0SAchim Leubner
885*4e1bc9a0SAchim Leubner oneExpDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi);
886*4e1bc9a0SAchim Leubner }
887*4e1bc9a0SAchim Leubner
888*4e1bc9a0SAchim Leubner tddmPortDeviceAdd(tiRoot, onePortContext, dmDeviceInfo, oneExpDeviceData);
889*4e1bc9a0SAchim Leubner
890*4e1bc9a0SAchim Leubner }
891*4e1bc9a0SAchim Leubner else if (flag == dmDeviceRemoval)
892*4e1bc9a0SAchim Leubner {
893*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: removal\n"));
894*4e1bc9a0SAchim Leubner sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi);
895*4e1bc9a0SAchim Leubner sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo);
896*4e1bc9a0SAchim Leubner oneDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi);
897*4e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
898*4e1bc9a0SAchim Leubner {
899*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: oneDeviceData is NULL!!!\n"));
900*4e1bc9a0SAchim Leubner }
901*4e1bc9a0SAchim Leubner else
902*4e1bc9a0SAchim Leubner {
903*4e1bc9a0SAchim Leubner /* invalidate device */
904*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: invalidating\n"));
905*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: agDevHandle %p\n", oneDeviceData->agDevHandle));
906*4e1bc9a0SAchim Leubner if ( oneDeviceData->agDevHandle != agNULL)
907*4e1bc9a0SAchim Leubner {
908*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: agDevHandle->sdkData %p\n", oneDeviceData->agDevHandle->sdkData));
909*4e1bc9a0SAchim Leubner }
910*4e1bc9a0SAchim Leubner else
911*4e1bc9a0SAchim Leubner {
912*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: agDevHandle->sdkData is NULL\n"));
913*4e1bc9a0SAchim Leubner }
914*4e1bc9a0SAchim Leubner oneDeviceData->valid = agFALSE;
915*4e1bc9a0SAchim Leubner //to do; to be tested
916*4e1bc9a0SAchim Leubner agRoot = oneDeviceData->agRoot;
917*4e1bc9a0SAchim Leubner if ( (oneDeviceData->registered == agTRUE) &&
918*4e1bc9a0SAchim Leubner ( DEVICE_IS_SSP_TARGET(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData)
919*4e1bc9a0SAchim Leubner || DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_SMP_TARGET(oneDeviceData) )
920*4e1bc9a0SAchim Leubner )
921*4e1bc9a0SAchim Leubner {
922*4e1bc9a0SAchim Leubner if ( !( DEVICE_IS_SMP_TARGET(oneDeviceData) && oneDeviceData->directlyAttached == agTRUE))
923*4e1bc9a0SAchim Leubner {
924*4e1bc9a0SAchim Leubner tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
925*4e1bc9a0SAchim Leubner oneDeviceData->registered = agFALSE;
926*4e1bc9a0SAchim Leubner }
927*4e1bc9a0SAchim Leubner else
928*4e1bc9a0SAchim Leubner {
929*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: keeping\n"));
930*4e1bc9a0SAchim Leubner oneDeviceData->registered = agTRUE;
931*4e1bc9a0SAchim Leubner }
932*4e1bc9a0SAchim Leubner }
933*4e1bc9a0SAchim Leubner else if (oneDeviceData->registered == agTRUE)
934*4e1bc9a0SAchim Leubner {
935*4e1bc9a0SAchim Leubner if ( oneDeviceData->agDevHandle == agNULL)
936*4e1bc9a0SAchim Leubner {
937*4e1bc9a0SAchim Leubner TI_DBG1(("tddmReportDevice: agDevHandle->sdkData is NULL. Error!!! \n"));
938*4e1bc9a0SAchim Leubner }
939*4e1bc9a0SAchim Leubner saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
940*4e1bc9a0SAchim Leubner oneDeviceData->registered = agFALSE;
941*4e1bc9a0SAchim Leubner }
942*4e1bc9a0SAchim Leubner //to do remove
943*4e1bc9a0SAchim Leubner #ifdef FDS_SM_WRONG
944*4e1bc9a0SAchim Leubner if (DEVICE_IS_SATA_DEVICE(oneDeviceData))
945*4e1bc9a0SAchim Leubner {
946*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: smDeregisterDevice\n"));
947*4e1bc9a0SAchim Leubner smDeregisterDevice(smRoot, agNULL, oneDeviceData->agDevHandle, &(oneDeviceData->smDeviceHandle));
948*4e1bc9a0SAchim Leubner oneDeviceData->satDevData.IDDeviceValid = agFALSE;
949*4e1bc9a0SAchim Leubner }
950*4e1bc9a0SAchim Leubner #endif
951*4e1bc9a0SAchim Leubner }
952*4e1bc9a0SAchim Leubner }
953*4e1bc9a0SAchim Leubner else if (flag == dmDeviceNoChange)
954*4e1bc9a0SAchim Leubner {
955*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: no change; do nothing \n"));
956*4e1bc9a0SAchim Leubner #ifdef FDS_SM
957*4e1bc9a0SAchim Leubner sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi);
958*4e1bc9a0SAchim Leubner sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo);
959*4e1bc9a0SAchim Leubner oneDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi);
960*4e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
961*4e1bc9a0SAchim Leubner {
962*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: oneDeviceData is NULL!!!\n"));
963*4e1bc9a0SAchim Leubner }
964*4e1bc9a0SAchim Leubner else
965*4e1bc9a0SAchim Leubner {
966*4e1bc9a0SAchim Leubner agRoot = oneDeviceData->agRoot;
967*4e1bc9a0SAchim Leubner if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
968*4e1bc9a0SAchim Leubner &&
969*4e1bc9a0SAchim Leubner oneDeviceData->satDevData.IDDeviceValid == agFALSE)
970*4e1bc9a0SAchim Leubner {
971*4e1bc9a0SAchim Leubner tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
972*4e1bc9a0SAchim Leubner }
973*4e1bc9a0SAchim Leubner }
974*4e1bc9a0SAchim Leubner #endif
975*4e1bc9a0SAchim Leubner }
976*4e1bc9a0SAchim Leubner else if (flag == dmDeviceMCNChange)
977*4e1bc9a0SAchim Leubner {
978*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: dmDeviceMCNChange \n"));
979*4e1bc9a0SAchim Leubner localMCN = tdsaFindLocalMCN(tiRoot, onePortContext);
980*4e1bc9a0SAchim Leubner devMCN = DEVINFO_GET_EXT_MCN(dmDeviceInfo);
981*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: devMCN 0x%08x localMCN 0x%08x\n", devMCN, localMCN));
982*4e1bc9a0SAchim Leubner
983*4e1bc9a0SAchim Leubner sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi);
984*4e1bc9a0SAchim Leubner sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo);
985*4e1bc9a0SAchim Leubner oneDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi);
986*4e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
987*4e1bc9a0SAchim Leubner {
988*4e1bc9a0SAchim Leubner TI_DBG1(("tddmReportDevice: oneDeviceData is NULL!!!\n"));
989*4e1bc9a0SAchim Leubner }
990*4e1bc9a0SAchim Leubner else
991*4e1bc9a0SAchim Leubner {
992*4e1bc9a0SAchim Leubner agRoot = oneDeviceData->agRoot;
993*4e1bc9a0SAchim Leubner oneDeviceData->devMCN = devMCN;
994*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: sasAddrHi 0x%08x sasAddrLo 0x%08x\n", sasAddressHi, sasAddressLo));
995*4e1bc9a0SAchim Leubner if (oneDeviceData->directlyAttached == agTRUE)
996*4e1bc9a0SAchim Leubner {
997*4e1bc9a0SAchim Leubner finalMCN = localMCN;
998*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: directlyAttached, Final MCN 0x%08x\n", finalMCN));
999*4e1bc9a0SAchim Leubner }
1000*4e1bc9a0SAchim Leubner else
1001*4e1bc9a0SAchim Leubner {
1002*4e1bc9a0SAchim Leubner finalMCN = MIN(devMCN, localMCN);
1003*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: Not directlyAttached, Final MCN 0x%08x\n", finalMCN));
1004*4e1bc9a0SAchim Leubner }
1005*4e1bc9a0SAchim Leubner if ( oneDeviceData->registered == agTRUE)
1006*4e1bc9a0SAchim Leubner {
1007*4e1bc9a0SAchim Leubner /* saSetDeviceInfo to change MCN, using finalMCN */
1008*4e1bc9a0SAchim Leubner option = 8; /* setting only MCN 1000b */
1009*4e1bc9a0SAchim Leubner param = finalMCN << 24;
1010*4e1bc9a0SAchim Leubner TI_DBG2(("tddmReportDevice: option 0x%x param 0x%x MCN 0x%x\n", option, param, finalMCN));
1011*4e1bc9a0SAchim Leubner saSetDeviceInfo(agRoot, agNULL, 0, oneDeviceData->agDevHandle, option, param, ossaSetDeviceInfoCB);
1012*4e1bc9a0SAchim Leubner }
1013*4e1bc9a0SAchim Leubner else
1014*4e1bc9a0SAchim Leubner {
1015*4e1bc9a0SAchim Leubner TI_DBG1(("tddmReportDevice: oneDeviceData is not yet registered !!!\n"));
1016*4e1bc9a0SAchim Leubner }
1017*4e1bc9a0SAchim Leubner oneDeviceData->finalMCN = finalMCN;
1018*4e1bc9a0SAchim Leubner }
1019*4e1bc9a0SAchim Leubner }
1020*4e1bc9a0SAchim Leubner else if (flag == dmDeviceRateChange)
1021*4e1bc9a0SAchim Leubner {
1022*4e1bc9a0SAchim Leubner TI_DBG1(("tddmReportDevice: dmDeviceRateChange \n"));
1023*4e1bc9a0SAchim Leubner sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi);
1024*4e1bc9a0SAchim Leubner sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo);
1025*4e1bc9a0SAchim Leubner oneDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi);
1026*4e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
1027*4e1bc9a0SAchim Leubner {
1028*4e1bc9a0SAchim Leubner TI_DBG1(("tddmReportDevice: oneDeviceData is NULL!!!\n"));
1029*4e1bc9a0SAchim Leubner }
1030*4e1bc9a0SAchim Leubner else
1031*4e1bc9a0SAchim Leubner {
1032*4e1bc9a0SAchim Leubner agRoot = oneDeviceData->agRoot;
1033*4e1bc9a0SAchim Leubner if ( oneDeviceData->registered == agTRUE)
1034*4e1bc9a0SAchim Leubner {
1035*4e1bc9a0SAchim Leubner option = 0x20; /* bit 5 */
1036*4e1bc9a0SAchim Leubner DLR = DEVINFO_GET_LINKRATE(dmDeviceInfo);
1037*4e1bc9a0SAchim Leubner param = DLR << 28;
1038*4e1bc9a0SAchim Leubner TI_DBG1(("tddmReportDevice: option 0x%x param 0x%x DLR 0x%x\n", option, param, DLR));
1039*4e1bc9a0SAchim Leubner saSetDeviceInfo(agRoot, agNULL, 0, oneDeviceData->agDevHandle, option, param, ossaSetDeviceInfoCB);
1040*4e1bc9a0SAchim Leubner
1041*4e1bc9a0SAchim Leubner }
1042*4e1bc9a0SAchim Leubner else
1043*4e1bc9a0SAchim Leubner {
1044*4e1bc9a0SAchim Leubner TI_DBG1(("tddmReportDevice: oneDeviceData is not yet registered !!!\n"));
1045*4e1bc9a0SAchim Leubner }
1046*4e1bc9a0SAchim Leubner
1047*4e1bc9a0SAchim Leubner }
1048*4e1bc9a0SAchim Leubner }
1049*4e1bc9a0SAchim Leubner else
1050*4e1bc9a0SAchim Leubner {
1051*4e1bc9a0SAchim Leubner TI_DBG1(("tddmReportDevice: unknown flag 0x%x, wrong\n", flag));
1052*4e1bc9a0SAchim Leubner }
1053*4e1bc9a0SAchim Leubner
1054*4e1bc9a0SAchim Leubner return;
1055*4e1bc9a0SAchim Leubner }
1056*4e1bc9a0SAchim Leubner
1057*4e1bc9a0SAchim Leubner osGLOBAL void
tdsaUpdateMCN(dmRoot_t * dmRoot,tdsaPortContext_t * onePortContext)1058*4e1bc9a0SAchim Leubner tdsaUpdateMCN(
1059*4e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
1060*4e1bc9a0SAchim Leubner tdsaPortContext_t *onePortContext
1061*4e1bc9a0SAchim Leubner )
1062*4e1bc9a0SAchim Leubner {
1063*4e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot;
1064*4e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared;
1065*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot;
1066*4e1bc9a0SAchim Leubner tdsaDeviceData_t *oneDeviceData = agNULL;
1067*4e1bc9a0SAchim Leubner tdList_t *DeviceListList;
1068*4e1bc9a0SAchim Leubner bit32 localMCN = 0, finalMCN = 0;
1069*4e1bc9a0SAchim Leubner bit32 devMCN = 1;
1070*4e1bc9a0SAchim Leubner bit32 option;
1071*4e1bc9a0SAchim Leubner bit32 param;
1072*4e1bc9a0SAchim Leubner
1073*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: start\n"));
1074*4e1bc9a0SAchim Leubner tdsaRoot = (tdsaRoot_t *)dmRoot->tdData;
1075*4e1bc9a0SAchim Leubner if (tdsaRoot == agNULL)
1076*4e1bc9a0SAchim Leubner {
1077*4e1bc9a0SAchim Leubner TI_DBG1(("tdsaUpdateMCN: tdsaRoot is NULL\n"));
1078*4e1bc9a0SAchim Leubner return;
1079*4e1bc9a0SAchim Leubner }
1080*4e1bc9a0SAchim Leubner
1081*4e1bc9a0SAchim Leubner tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1082*4e1bc9a0SAchim Leubner if (tdsaAllShared == agNULL)
1083*4e1bc9a0SAchim Leubner {
1084*4e1bc9a0SAchim Leubner TI_DBG1(("tdsaUpdateMCN: tdsaAllShared is NULL\n"));
1085*4e1bc9a0SAchim Leubner return;
1086*4e1bc9a0SAchim Leubner }
1087*4e1bc9a0SAchim Leubner
1088*4e1bc9a0SAchim Leubner tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1089*4e1bc9a0SAchim Leubner if (tiRoot == agNULL)
1090*4e1bc9a0SAchim Leubner {
1091*4e1bc9a0SAchim Leubner TI_DBG1(("tdsaUpdateMCN: tiRoot is NULL\n"));
1092*4e1bc9a0SAchim Leubner return;
1093*4e1bc9a0SAchim Leubner }
1094*4e1bc9a0SAchim Leubner
1095*4e1bc9a0SAchim Leubner if (onePortContext->valid == agFALSE)
1096*4e1bc9a0SAchim Leubner {
1097*4e1bc9a0SAchim Leubner TI_DBG1(("tdsaUpdateMCN: onePortContext is invalid\n"));
1098*4e1bc9a0SAchim Leubner return;
1099*4e1bc9a0SAchim Leubner }
1100*4e1bc9a0SAchim Leubner
1101*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: pid %d\n", onePortContext->id));
1102*4e1bc9a0SAchim Leubner
1103*4e1bc9a0SAchim Leubner localMCN = tdsaFindLocalMCN(tiRoot, onePortContext);
1104*4e1bc9a0SAchim Leubner
1105*4e1bc9a0SAchim Leubner if (TDLIST_EMPTY(&(tdsaAllShared->MainDeviceList)))
1106*4e1bc9a0SAchim Leubner {
1107*4e1bc9a0SAchim Leubner TI_DBG1(("tdsaUpdateMCN: empty device list\n"));
1108*4e1bc9a0SAchim Leubner return;
1109*4e1bc9a0SAchim Leubner }
1110*4e1bc9a0SAchim Leubner
1111*4e1bc9a0SAchim Leubner /* update directly and behind expander device */
1112*4e1bc9a0SAchim Leubner DeviceListList = tdsaAllShared->MainDeviceList.flink;
1113*4e1bc9a0SAchim Leubner while (DeviceListList != &(tdsaAllShared->MainDeviceList))
1114*4e1bc9a0SAchim Leubner {
1115*4e1bc9a0SAchim Leubner oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
1116*4e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
1117*4e1bc9a0SAchim Leubner {
1118*4e1bc9a0SAchim Leubner TI_DBG1(("tdsaUpdateMCN: oneDeviceData is NULL!!!\n"));
1119*4e1bc9a0SAchim Leubner return;
1120*4e1bc9a0SAchim Leubner }
1121*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: loop did %d\n", oneDeviceData->id));
1122*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: sasAddrHi 0x%08x sasAddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
1123*4e1bc9a0SAchim Leubner devMCN = oneDeviceData->devMCN;
1124*4e1bc9a0SAchim Leubner if ( oneDeviceData->tdPortContext == onePortContext)
1125*4e1bc9a0SAchim Leubner {
1126*4e1bc9a0SAchim Leubner if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE && oneDeviceData->directlyAttached == agTRUE)
1127*4e1bc9a0SAchim Leubner {
1128*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: found directly attached\n"));
1129*4e1bc9a0SAchim Leubner finalMCN = localMCN;
1130*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: devMCN 0x%08x localMCN 0x%08x\n", devMCN, localMCN));
1131*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: finalMCN 0x%08x\n", finalMCN));
1132*4e1bc9a0SAchim Leubner if (oneDeviceData->finalMCN != finalMCN)
1133*4e1bc9a0SAchim Leubner {
1134*4e1bc9a0SAchim Leubner /* saSetDeviceInfo using finalMCN */
1135*4e1bc9a0SAchim Leubner option = 8; /* setting only MCN 1000b */
1136*4e1bc9a0SAchim Leubner param = finalMCN << 24;
1137*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: option 0x%x param 0x%x MCN 0x%x\n", option, param, finalMCN));
1138*4e1bc9a0SAchim Leubner saSetDeviceInfo(oneDeviceData->agRoot, agNULL, 0, oneDeviceData->agDevHandle, option, param, ossaSetDeviceInfoCB);
1139*4e1bc9a0SAchim Leubner oneDeviceData->finalMCN = finalMCN;
1140*4e1bc9a0SAchim Leubner }
1141*4e1bc9a0SAchim Leubner
1142*4e1bc9a0SAchim Leubner }
1143*4e1bc9a0SAchim Leubner else if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE && oneDeviceData->directlyAttached == agFALSE)
1144*4e1bc9a0SAchim Leubner {
1145*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: found behind expander device\n"));
1146*4e1bc9a0SAchim Leubner finalMCN = MIN(localMCN, devMCN);
1147*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: devMCN 0x%08x localMCN 0x%08x\n", devMCN, localMCN));
1148*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: finalMCN 0x%08x\n", finalMCN));
1149*4e1bc9a0SAchim Leubner if (oneDeviceData->finalMCN != finalMCN)
1150*4e1bc9a0SAchim Leubner {
1151*4e1bc9a0SAchim Leubner /* saSetDeviceInfo using finalMCN */
1152*4e1bc9a0SAchim Leubner option = 8; /* setting only MCN 1000b */
1153*4e1bc9a0SAchim Leubner param = finalMCN << 24;
1154*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: option 0x%x param 0x%x MCN 0x%x\n", option, param, finalMCN));
1155*4e1bc9a0SAchim Leubner saSetDeviceInfo(oneDeviceData->agRoot, agNULL, 0, oneDeviceData->agDevHandle, option, param, ossaSetDeviceInfoCB);
1156*4e1bc9a0SAchim Leubner oneDeviceData->finalMCN = finalMCN;
1157*4e1bc9a0SAchim Leubner }
1158*4e1bc9a0SAchim Leubner
1159*4e1bc9a0SAchim Leubner }
1160*4e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
1161*4e1bc9a0SAchim Leubner }
1162*4e1bc9a0SAchim Leubner else
1163*4e1bc9a0SAchim Leubner {
1164*4e1bc9a0SAchim Leubner if (oneDeviceData->tdPortContext != agNULL)
1165*4e1bc9a0SAchim Leubner {
1166*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: different portcontext; oneDeviceData->tdPortContext pid %d oneportcontext pid %d\n", oneDeviceData->tdPortContext->id, onePortContext->id));
1167*4e1bc9a0SAchim Leubner }
1168*4e1bc9a0SAchim Leubner else
1169*4e1bc9a0SAchim Leubner {
1170*4e1bc9a0SAchim Leubner TI_DBG3(("tdsaUpdateMCN: different portcontext; oneDeviceData->tdPortContext pid NULL oneportcontext pid %d\n", onePortContext->id));
1171*4e1bc9a0SAchim Leubner }
1172*4e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
1173*4e1bc9a0SAchim Leubner }
1174*4e1bc9a0SAchim Leubner } /* while */
1175*4e1bc9a0SAchim Leubner
1176*4e1bc9a0SAchim Leubner return;
1177*4e1bc9a0SAchim Leubner }
1178*4e1bc9a0SAchim Leubner
1179*4e1bc9a0SAchim Leubner osGLOBAL bit8
tddmSATADeviceTypeDecode(bit8 * pSignature)1180*4e1bc9a0SAchim Leubner tddmSATADeviceTypeDecode(bit8 * pSignature)
1181*4e1bc9a0SAchim Leubner {
1182*4e1bc9a0SAchim Leubner return (bit8)tdssSATADeviceTypeDecode(pSignature);
1183*4e1bc9a0SAchim Leubner }
1184*4e1bc9a0SAchim Leubner
1185*4e1bc9a0SAchim Leubner
1186*4e1bc9a0SAchim Leubner osGLOBAL void
tddmSingleThreadedEnter(dmRoot_t * dmRoot,bit32 syncLockId)1187*4e1bc9a0SAchim Leubner tddmSingleThreadedEnter(
1188*4e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
1189*4e1bc9a0SAchim Leubner bit32 syncLockId
1190*4e1bc9a0SAchim Leubner )
1191*4e1bc9a0SAchim Leubner {
1192*4e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot;
1193*4e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared;
1194*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot;
1195*4e1bc9a0SAchim Leubner bit32 offset = 0;
1196*4e1bc9a0SAchim Leubner
1197*4e1bc9a0SAchim Leubner TI_DBG7(("tddmSingleThreadedEnter: start\n"));
1198*4e1bc9a0SAchim Leubner
1199*4e1bc9a0SAchim Leubner tdsaRoot = (tdsaRoot_t *)dmRoot->tdData;
1200*4e1bc9a0SAchim Leubner if (tdsaRoot == agNULL)
1201*4e1bc9a0SAchim Leubner {
1202*4e1bc9a0SAchim Leubner TI_DBG1(("tddmSingleThreadedEnter: tdsaRoot is NULL\n"));
1203*4e1bc9a0SAchim Leubner return;
1204*4e1bc9a0SAchim Leubner }
1205*4e1bc9a0SAchim Leubner
1206*4e1bc9a0SAchim Leubner tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1207*4e1bc9a0SAchim Leubner if (tdsaAllShared == agNULL)
1208*4e1bc9a0SAchim Leubner {
1209*4e1bc9a0SAchim Leubner TI_DBG1(("tddmSingleThreadedEnter: tdsaAllShared is NULL\n"));
1210*4e1bc9a0SAchim Leubner return;
1211*4e1bc9a0SAchim Leubner }
1212*4e1bc9a0SAchim Leubner
1213*4e1bc9a0SAchim Leubner tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1214*4e1bc9a0SAchim Leubner if (tiRoot == agNULL)
1215*4e1bc9a0SAchim Leubner {
1216*4e1bc9a0SAchim Leubner TI_DBG1(("tddmSingleThreadedEnter: tiRoot is NULL\n"));
1217*4e1bc9a0SAchim Leubner return;
1218*4e1bc9a0SAchim Leubner }
1219*4e1bc9a0SAchim Leubner offset = tdsaAllShared->MaxNumLLLocks + tdsaAllShared->MaxNumOSLocks + TD_MAX_LOCKS;
1220*4e1bc9a0SAchim Leubner
1221*4e1bc9a0SAchim Leubner ostiSingleThreadedEnter(tiRoot, syncLockId + offset);
1222*4e1bc9a0SAchim Leubner return;
1223*4e1bc9a0SAchim Leubner }
1224*4e1bc9a0SAchim Leubner
1225*4e1bc9a0SAchim Leubner osGLOBAL void
tddmSingleThreadedLeave(dmRoot_t * dmRoot,bit32 syncLockId)1226*4e1bc9a0SAchim Leubner tddmSingleThreadedLeave(
1227*4e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
1228*4e1bc9a0SAchim Leubner bit32 syncLockId
1229*4e1bc9a0SAchim Leubner )
1230*4e1bc9a0SAchim Leubner {
1231*4e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot;
1232*4e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared;
1233*4e1bc9a0SAchim Leubner tiRoot_t *tiRoot;
1234*4e1bc9a0SAchim Leubner bit32 offset = 0;
1235*4e1bc9a0SAchim Leubner
1236*4e1bc9a0SAchim Leubner TI_DBG7(("tddmSingleThreadedLeave: start\n"));
1237*4e1bc9a0SAchim Leubner
1238*4e1bc9a0SAchim Leubner tdsaRoot = (tdsaRoot_t *)dmRoot->tdData;
1239*4e1bc9a0SAchim Leubner if (tdsaRoot == agNULL)
1240*4e1bc9a0SAchim Leubner {
1241*4e1bc9a0SAchim Leubner TI_DBG1(("tddmSingleThreadedLeave: tdsaRoot is NULL\n"));
1242*4e1bc9a0SAchim Leubner return;
1243*4e1bc9a0SAchim Leubner }
1244*4e1bc9a0SAchim Leubner
1245*4e1bc9a0SAchim Leubner tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1246*4e1bc9a0SAchim Leubner if (tdsaAllShared == agNULL)
1247*4e1bc9a0SAchim Leubner {
1248*4e1bc9a0SAchim Leubner TI_DBG1(("tddmSingleThreadedLeave: tdsaAllShared is NULL\n"));
1249*4e1bc9a0SAchim Leubner return;
1250*4e1bc9a0SAchim Leubner }
1251*4e1bc9a0SAchim Leubner
1252*4e1bc9a0SAchim Leubner tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1253*4e1bc9a0SAchim Leubner if (tiRoot == agNULL)
1254*4e1bc9a0SAchim Leubner {
1255*4e1bc9a0SAchim Leubner TI_DBG1(("tddmSingleThreadedLeave: tiRoot is NULL\n"));
1256*4e1bc9a0SAchim Leubner return;
1257*4e1bc9a0SAchim Leubner }
1258*4e1bc9a0SAchim Leubner offset = tdsaAllShared->MaxNumLLLocks + tdsaAllShared->MaxNumOSLocks + TD_MAX_LOCKS;
1259*4e1bc9a0SAchim Leubner
1260*4e1bc9a0SAchim Leubner ostiSingleThreadedLeave(tiRoot, syncLockId + offset);
1261*4e1bc9a0SAchim Leubner
1262*4e1bc9a0SAchim Leubner return;
1263*4e1bc9a0SAchim Leubner }
1264*4e1bc9a0SAchim Leubner
tddmGetTransportParam(dmRoot_t * dmRoot,char * key,char * subkey1,char * subkey2,char * subkey3,char * subkey4,char * subkey5,char * valueName,char * buffer,bit32 bufferLen,bit32 * lenReceived)1265*4e1bc9a0SAchim Leubner osGLOBAL bit32 tddmGetTransportParam(
1266*4e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
1267*4e1bc9a0SAchim Leubner char *key,
1268*4e1bc9a0SAchim Leubner char *subkey1,
1269*4e1bc9a0SAchim Leubner char *subkey2,
1270*4e1bc9a0SAchim Leubner char *subkey3,
1271*4e1bc9a0SAchim Leubner char *subkey4,
1272*4e1bc9a0SAchim Leubner char *subkey5,
1273*4e1bc9a0SAchim Leubner char *valueName,
1274*4e1bc9a0SAchim Leubner char *buffer,
1275*4e1bc9a0SAchim Leubner bit32 bufferLen,
1276*4e1bc9a0SAchim Leubner bit32 *lenReceived
1277*4e1bc9a0SAchim Leubner )
1278*4e1bc9a0SAchim Leubner {
1279*4e1bc9a0SAchim Leubner bit32 ret = tiError;
1280*4e1bc9a0SAchim Leubner
1281*4e1bc9a0SAchim Leubner TI_DBG7(("tddmGetTransportParam: start\n"));
1282*4e1bc9a0SAchim Leubner ret = ostiGetTransportParam(agNULL,
1283*4e1bc9a0SAchim Leubner key,
1284*4e1bc9a0SAchim Leubner subkey1,
1285*4e1bc9a0SAchim Leubner subkey2,
1286*4e1bc9a0SAchim Leubner subkey3,
1287*4e1bc9a0SAchim Leubner subkey4,
1288*4e1bc9a0SAchim Leubner subkey5,
1289*4e1bc9a0SAchim Leubner valueName,
1290*4e1bc9a0SAchim Leubner buffer,
1291*4e1bc9a0SAchim Leubner bufferLen,
1292*4e1bc9a0SAchim Leubner lenReceived
1293*4e1bc9a0SAchim Leubner );
1294*4e1bc9a0SAchim Leubner
1295*4e1bc9a0SAchim Leubner return ret;
1296*4e1bc9a0SAchim Leubner }
1297*4e1bc9a0SAchim Leubner
1298*4e1bc9a0SAchim Leubner #endif /* FDS_DM */
1299*4e1bc9a0SAchim Leubner
1300