xref: /freebsd/sys/dev/pms/RefTisa/tisa/sassata/common/tddmcmnapi.c (revision 685dc743dc3b5645e34836464128e1c0558b404b)
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