tddmcmnapi.c revision 285809
1191762Simp/*******************************************************************************
2191762Simp*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3191762Simp*
4191762Simp*Redistribution and use in source and binary forms, with or without modification, are permitted provided
5191762Simp*that the following conditions are met:
6191762Simp*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7191762Simp*following disclaimer.
8191762Simp*2. Redistributions in binary form must reproduce the above copyright notice,
9191762Simp*this list of conditions and the following disclaimer in the documentation and/or other materials provided
10191762Simp*with the distribution.
11191762Simp*
12191762Simp*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13191762Simp*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14191762Simp*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15191762Simp*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16191762Simp*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17191762Simp*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18191762Simp*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19191762Simp*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20191762Simp
21191762Simp********************************************************************************/
22191762Simp#include <sys/cdefs.h>
23191762Simp__FBSDID("$FreeBSD$");
24191762Simp#include <dev/pms/config.h>
25191762Simp
26191762Simp#include <dev/pms/freebsd/driver/common/osenv.h>
27191762Simp#include <dev/pms/freebsd/driver/common/ostypes.h>
28191762Simp#include <dev/pms/freebsd/driver/common/osdebug.h>
29191762Simp
30191762Simp#include <dev/pms/RefTisa/tisa/api/titypes.h>
31191762Simp#include <dev/pms/RefTisa/tisa/api/ostiapi.h>
32191762Simp#include <dev/pms/RefTisa/tisa/api/tiapi.h>
33191762Simp/* for TIDEBUG_MSG */
34191762Simp#include <dev/pms/RefTisa/tisa/api/tiglobal.h>
35191762Simp
36191762Simp#ifdef FDS_DM
37191762Simp
38191762Simp#include <dev/pms/RefTisa/discovery/api/dm.h>
39191762Simp#include <dev/pms/RefTisa/discovery/api/dmapi.h>
40191762Simp#include <dev/pms/RefTisa/discovery/api/tddmapi.h>
41191762Simp
42191762Simp#ifdef FDS_SM
43191762Simp#include <dev/pms/RefTisa/sat/api/sm.h>
44191762Simp#include <dev/pms/RefTisa/sat/api/smapi.h>
45191762Simp#endif
46191762Simp
47191762Simp#ifdef INITIATOR_DRIVER
48191762Simp#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
49191762Simp#endif
50191762Simp
51191762Simp#include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
52191762Simp#include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
53191762Simp#include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
54191762Simp
55191762Simp#if defined(DM_DEBUG)
56191762Simpextern bit32 gDMDebugLevel;
57191762Simp#endif
58191762Simp
59191762SimposGLOBAL bit32
60191762SimptddmRotateQnumber(
61191762Simp                  dmRoot_t          *dmRoot,
62191762Simp                  agsaDevHandle_t   *agDevHandle
63191762Simp                 )
64191762Simp{
65191762Simp  tdsaRoot_t         *tdsaRoot;
66191762Simp  tdsaContext_t      *tdsaAllShared;
67191762Simp  tiRoot_t           *tiRoot;
68191762Simp  tdsaDeviceData_t     *oneDeviceData = agNULL;
69191762Simp  TI_DBG1(("tddmRotateQnumber: start\n"));
70191762Simp  if (agDevHandle == agNULL)
71191762Simp  {
72191762Simp    TI_DBG1(("tddmRotateQnumber: agDevHandle is NULL!!!\n"));
73191762Simp    return 0;
74191762Simp  }
75191762Simp  oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
76191762Simp  if (oneDeviceData == agNULL)
77191762Simp  {
78191762Simp    TI_DBG1(("tddmRotateQnumber: oneDeviceData is NULL!!!\n"));
79191762Simp    return 0;
80191762Simp  }
81191762Simp  tdsaRoot = (tdsaRoot_t *)dmRoot->tdData;
82191762Simp  if (tdsaRoot == agNULL)
83191762Simp  {
84191762Simp    TI_DBG1(("tddmRotateQnumber: tdsaRoot is NULL\n"));
85191762Simp    return 0;
86191762Simp  }
87191762Simp  tdsaAllShared = &(tdsaRoot->tdsaAllShared);
88191762Simp  if (tdsaAllShared == agNULL)
89191762Simp  {
90191762Simp    TI_DBG1(("tddmRotateQnumber: tdsaAllShared is NULL\n"));
91191762Simp    return 0;
92191762Simp  }
93191762Simp  tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
94191762Simp  if (tiRoot == agNULL)
95191762Simp  {
96191762Simp    TI_DBG1(("tddmRotateQnumber: tiRoot is NULL\n"));
97191762Simp    return 0;
98191762Simp  }
99191762Simp  return tdsaRotateQnumber(tiRoot, oneDeviceData);
100191762Simp}
101191762SimposGLOBAL bit32
102191762SimptdsaFindLocalMCN(
103191762Simp                 tiRoot_t                   *tiRoot,
104191762Simp                 tdsaPortContext_t          *onePortContext
105191762Simp                )
106191762Simp{
107191762Simp  bit32              i, localMCN = 0;
108191762Simp
109191762Simp  TI_DBG2(("tdsaFindLocalMCN: start\n"));
110191762Simp
111191762Simp  if (onePortContext->valid == agFALSE)
112191762Simp  {
113191762Simp    TI_DBG1(("tdsaFindLocalMCN: invalid portcontext id %d\n", onePortContext->id));
114191762Simp    return 0;
115191762Simp  }
116191762Simp
117191762Simp  for(i=0;i<TD_MAX_NUM_PHYS;i++)
118191762Simp  {
119191762Simp    if (onePortContext->PhyIDList[i] == agTRUE)
120191762Simp    {
121191762Simp      localMCN++;
122191762Simp    }
123191762Simp  }
124191762Simp
125191762Simp  return localMCN;
126191762Simp}
127191762Simp
128191762Simp
129191762Simp/*
130191762Simp on success,
131191762Simp           ostiInitiatorEvent(
132191762Simp                             tiRoot,
133191762Simp                             onePortContext->tiPortalContext,
134191762Simp                             agNULL,
135191762Simp                             tiIntrEventTypeDiscovery,
136191762Simp                             tiDiscOK,
137191762Simp                             agNULL
138191762Simp                             );
139191762Simpelse
140191762Simp        remove(de-register) all devices
141191762Simp        ostiInitiatorEvent(
142191762Simp                           tiRoot,
143191762Simp                           onePortContext->tiPortalContext,
144191762Simp                           agNULL,
145191762Simp                           tiIntrEventTypeDiscovery,
146191762Simp                           tiDiscFailed,
147191762Simp                           agNULL
148191762Simp                           );
149191762Simp
150191762Simp
151191762Simp  dmRoot->tdData is tdsaRoot_t (just like current TD layer)
152191762Simp  dmPortContext->tdData is tdsaPortContext_t
153191762Simp
154191762Simp*/
155191762SimposGLOBAL void
156191762SimptddmDiscoverCB(
157191762Simp               dmRoot_t        *dmRoot,
158191762Simp               dmPortContext_t *dmPortContext,
159191762Simp               bit32           eventStatus
160191762Simp              )
161191762Simp{
162191762Simp  tdsaRoot_t         *tdsaRoot;
163191762Simp  tdsaContext_t      *tdsaAllShared;
164191762Simp  tiRoot_t           *tiRoot;
165191762Simp  tdsaPortContext_t  *onePortContext;
166191762Simp  agsaRoot_t         *agRoot;
167191762Simp  agsaPortContext_t  *agPortContext;
168191762Simp
169191762Simp  TI_DBG1(("tddmDiscoverCB: start\n"));
170191762Simp  tdsaRoot = (tdsaRoot_t *)dmRoot->tdData;
171191762Simp  if (tdsaRoot == agNULL)
172191762Simp  {
173191762Simp    TI_DBG1(("tddmDiscoverCB: tdsaRoot is NULL\n"));
174191762Simp    return;
175191762Simp  }
176191762Simp
177191762Simp  tdsaAllShared = &(tdsaRoot->tdsaAllShared);
178191762Simp  if (tdsaAllShared == agNULL)
179191762Simp  {
180191762Simp    TI_DBG1(("tddmDiscoverCB: tdsaAllShared is NULL\n"));
181191762Simp    return;
182191762Simp  }
183191762Simp
184191762Simp  tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
185191762Simp  if (tiRoot == agNULL)
186191762Simp  {
187191762Simp    TI_DBG1(("tddmDiscoverCB: tiRoot is NULL\n"));
188191762Simp    return;
189191762Simp  }
190191762Simp
191191762Simp  onePortContext = (tdsaPortContext_t *)dmPortContext->tdData;
192191762Simp  if (onePortContext == agNULL)
193191762Simp  {
194191762Simp    TI_DBG1(("tddmDiscoverCB: onePortContext is NULL\n"));
195191762Simp    return;
196191762Simp  }
197191762Simp
198191762Simp  TI_DBG2(("tddmDiscoverCB: localMCN 0x%x\n", tdsaFindLocalMCN(tiRoot, onePortContext)));
199191762Simp
200191762Simp  if (eventStatus == dmDiscCompleted)
201191762Simp  {
202191762Simp    TI_DBG1(("tddmDiscoverCB: dmDiscCompleted\n"));
203191762Simp    onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED;
204191762Simp    onePortContext->DMDiscoveryState = dmDiscCompleted;
205191762Simp    TI_DBG1(("tddmDiscoverCB: pid %d tiPortalContext %p\n", onePortContext->id, onePortContext->tiPortalContext));
206191762Simp
207191762Simp    /* update onePortContext->UpdateMCN = agFALSE */
208191762Simp    if ( onePortContext->UpdateMCN == agTRUE)
209191762Simp    {
210191762Simp      TI_DBG2(("tddmDiscoverCB: calling tdsaUpdateMCN\n"));
211191762Simp      onePortContext->UpdateMCN = agFALSE;
212191762Simp      tdsaUpdateMCN(dmRoot, onePortContext);
213191762Simp    }
214191762Simp
215191762Simp    ostiInitiatorEvent(
216191762Simp                       tiRoot,
217191762Simp                       onePortContext->tiPortalContext,
218191762Simp                       agNULL,
219191762Simp                       tiIntrEventTypeDiscovery,
220191762Simp                       tiDiscOK,
221191762Simp                       agNULL
222191762Simp                      );
223191762Simp  }
224191762Simp  else if (eventStatus == dmDiscFailed )
225191762Simp  {
226191762Simp    TI_DBG1(("tddmDiscoverCB: dmDiscFailed \n"));
227191762Simp    onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED;
228191762Simp    onePortContext->DMDiscoveryState = dmDiscFailed;
229191762Simp    TI_DBG1(("tddmDiscoverCB: pid %d tiPortalContext %p\n", onePortContext->id, onePortContext->tiPortalContext));
230191762Simp    agRoot = &(tdsaAllShared->agRootNonInt);
231191762Simp    if (agRoot == agNULL)
232191762Simp    {
233191762Simp      TI_DBG1(("tddmDiscoverCB: agRoot is NULL\n"));
234191762Simp      return;
235191762Simp    }
236191762Simp    agPortContext = onePortContext->agPortContext;
237191762Simp    if (agPortContext == agNULL)
238191762Simp    {
239191762Simp      TI_DBG1(("tddmDiscoverCB: agPortContext is NULL\n"));
240191762Simp      return;
241191762Simp    }
242191762Simp    /*
243191762Simp      invalidate all devices in this port
244191762Simp    */
245191762Simp    tddmInvalidateDevicesInPort(tiRoot, onePortContext);
246191762Simp
247191762Simp    saPortControl(agRoot,
248191762Simp                  agNULL,
249191762Simp                  0,
250191762Simp                  agPortContext,
251191762Simp                  AGSA_PORT_IO_ABORT,
252191762Simp                  0 /*quarantine */,
253191762Simp                  0 /* unused */);
254191762Simp
255191762Simp
256191762Simp    ostiInitiatorEvent(
257191762Simp                       tiRoot,
258191762Simp                       onePortContext->tiPortalContext,
259191762Simp                       agNULL,
260191762Simp                       tiIntrEventTypeDiscovery,
261191762Simp                       tiDiscFailed,
262191762Simp                       agNULL
263191762Simp                      );
264191762Simp  }
265191762Simp  else if (eventStatus == dmDiscAborted )
266191762Simp  {
267191762Simp    TI_DBG1(("tddmDiscoverCB: dmDiscAborted \n"));
268191762Simp    onePortContext->DMDiscoveryState = dmDiscAborted;
269191762Simp  }
270191762Simp  else if (eventStatus == dmDiscAbortFailed  )
271191762Simp  {
272191762Simp     TI_DBG1(("tddmDiscoverCB: dmDiscAbortFailed  \n"));
273191762Simp     onePortContext->DMDiscoveryState = dmDiscAbortFailed;
274191762Simp  }
275191762Simp  else if (eventStatus == dmDiscAbortInvalid  )
276191762Simp  {
277191762Simp     TI_DBG1(("tddmDiscoverCB: dmDiscAbortInvalid  \n"));
278191762Simp     onePortContext->DMDiscoveryState = dmDiscAbortInvalid;
279191762Simp  }
280191762Simp  else if (eventStatus == dmDiscAbortInProgress  )
281191762Simp  {
282191762Simp     TI_DBG1(("tddmDiscoverCB: dmDiscAbortInProgress  \n"));
283191762Simp     onePortContext->DMDiscoveryState = dmDiscAbortInProgress;
284191762Simp  }
285191762Simp  else
286191762Simp  {
287191762Simp    TI_DBG1(("tddmDiscoverCB: undefined eventStatus 0x%x\n", eventStatus));
288191762Simp    onePortContext->DMDiscoveryState = dmDiscFailed;
289191762Simp  }
290191762Simp
291191762Simp  return;
292191762Simp}
293191762Simp
294191762Simp
295191762SimposGLOBAL void
296191762SimptddmQueryDiscoveryCB(
297191762Simp                     dmRoot_t        *dmRoot,
298191762Simp                     dmPortContext_t *dmPortContext,
299191762Simp                     bit32           discType,
300191762Simp                     bit32           discState
301191762Simp                    )
302191762Simp{
303191762Simp  tdsaPortContext_t  *onePortContext = agNULL;
304191762Simp
305191762Simp  TI_DBG2(("tddmQueryDiscoveryCB: start\n"));
306191762Simp  onePortContext = (tdsaPortContext_t *)dmPortContext->tdData;
307191762Simp  if (onePortContext == agNULL)
308191762Simp  {
309191762Simp    TI_DBG1(("tddmQueryDiscoveryCB: onePortContext is NULL\n"));
310191762Simp    return;
311191762Simp  }
312191762Simp  TI_DBG2(("tddmQueryDiscoveryCB: discType %d discState %d\n", discType, discState));
313191762Simp
314191762Simp  onePortContext->DMDiscoveryState = discState;
315191762Simp  return;
316191762Simp}
317191762Simp
318191762SimposGLOBAL void
319191762SimptddmInvalidateDevicesInPort(
320191762Simp                tiRoot_t             *tiRoot,
321191762Simp                tdsaPortContext_t    *onePortContext
322191762Simp               )
323191762Simp{
324191762Simp  tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
325191762Simp  tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
326191762Simp  tdsaDeviceData_t  *oneDeviceData = agNULL;
327191762Simp  tdList_t          *DeviceListList;
328191762Simp
329191762Simp  TI_DBG1(("tddmInvalidateDevicesInPort: start\n"));
330191762Simp
331191762Simp  /* find a device's existence */
332191762Simp  DeviceListList = tdsaAllShared->MainDeviceList.flink;
333191762Simp  while (DeviceListList != &(tdsaAllShared->MainDeviceList))
334191762Simp  {
335191762Simp    oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
336191762Simp    if (oneDeviceData == agNULL)
337191762Simp    {
338191762Simp      TI_DBG1(("tddmInvalidateDevicesInPort: oneDeviceData is NULL!!!\n"));
339191762Simp      return;
340191762Simp    }
341191762Simp    if ((oneDeviceData->registered == agTRUE) &&
342191762Simp        (oneDeviceData->tdPortContext == onePortContext)
343191762Simp        )
344191762Simp    {
345191762Simp
346191762Simp      TI_DBG3(("tddmInvalidateDevicesInPort: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
347191762Simp      if (oneDeviceData->SASAddressID.sasAddressHi == onePortContext->sasRemoteAddressHi &&
348191762Simp          oneDeviceData->SASAddressID.sasAddressLo == onePortContext->sasRemoteAddressLo
349191762Simp         )
350191762Simp      {
351191762Simp        TI_DBG1(("tddmInvalidateDevicesInPort: keeping\n"));
352191762Simp        oneDeviceData->valid = agTRUE;
353191762Simp        oneDeviceData->valid2 = agFALSE;
354191762Simp      }
355191762Simp      else if (oneDeviceData->valid == agTRUE)
356191762Simp      {
357191762Simp        oneDeviceData->valid = agFALSE;
358191762Simp        oneDeviceData->valid2 = agFALSE;
359191762Simp        oneDeviceData->registered = agFALSE;
360191762Simp      }
361191762Simp     }
362191762Simp    DeviceListList = DeviceListList->flink;
363191762Simp  }
364191762Simp
365191762Simp  TI_DBG3(("tddmInvalidateDevicesInPort: end\n"));
366191762Simp
367191762Simp  return;
368191762Simp}
369191762Simp
370191762SimposGLOBAL bit32
371191762SimptddmNewSASorNot(
372191762Simp                tiRoot_t             *tiRoot,
373191762Simp                tdsaPortContext_t    *onePortContext,
374191762Simp                tdsaSASSubID_t       *agSASSubID
375191762Simp               )
376191762Simp{
377191762Simp  tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
378191762Simp  tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
379191762Simp  tdsaDeviceData_t  *oneDeviceData = agNULL;
380191762Simp  tdList_t          *DeviceListList;
381191762Simp  bit32             ret = agTRUE;
382191762Simp
383191762Simp  TI_DBG3(("tddmNewSASorNot: start\n"));
384191762Simp
385191762Simp  /* find a device's existence */
386191762Simp  DeviceListList = tdsaAllShared->MainDeviceList.flink;
387191762Simp  while (DeviceListList != &(tdsaAllShared->MainDeviceList))
388191762Simp  {
389191762Simp    oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
390191762Simp    if (oneDeviceData == agNULL)
391191762Simp    {
392191762Simp      TI_DBG1(("tddmNewSASorNot: oneDeviceData is NULL!!!\n"));
393191762Simp      return agFALSE;
394191762Simp    }
395191762Simp    if ((oneDeviceData->SASAddressID.sasAddressHi == agSASSubID->sasAddressHi) &&
396191762Simp        (oneDeviceData->SASAddressID.sasAddressLo == agSASSubID->sasAddressLo) &&
397191762Simp        (oneDeviceData->registered == agTRUE) &&
398191762Simp        (oneDeviceData->tdPortContext == onePortContext)
399191762Simp        )
400191762Simp    {
401191762Simp      TI_DBG3(("tddmNewSASorNot: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
402191762Simp      ret = agFALSE;
403191762Simp      break;
404191762Simp    }
405191762Simp    DeviceListList = DeviceListList->flink;
406191762Simp  }
407191762Simp
408191762Simp
409191762Simp
410191762Simp  TI_DBG3(("tddmNewSASorNot: end\n"));
411191762Simp
412191762Simp  return ret;
413191762Simp}
414191762Simp
415191762SimposGLOBAL tdsaDeviceData_t *
416191762SimptddmPortSASDeviceFind(
417191762Simp                      tiRoot_t           *tiRoot,
418191762Simp                      tdsaPortContext_t  *onePortContext,
419191762Simp                      bit32              sasAddrLo,
420191762Simp                      bit32              sasAddrHi
421191762Simp                      )
422191762Simp{
423191762Simp  tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
424191762Simp  tdsaContext_t     *tdsaAllShared   = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
425191762Simp  tdsaDeviceData_t  *oneDeviceData, *RetDeviceData=agNULL;
426191762Simp  tdList_t          *DeviceListList;
427191762Simp
428191762Simp  TI_DBG2(("tddmPortSASDeviceFind: start\n"));
429191762Simp
430191762Simp  TD_ASSERT((agNULL != tiRoot), "");
431191762Simp  TD_ASSERT((agNULL != onePortContext), "");
432191762Simp
433191762Simp  tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
434191762Simp
435191762Simp  /* find a device's existence */
436191762Simp  DeviceListList = tdsaAllShared->MainDeviceList.flink;
437191762Simp  while (DeviceListList != &(tdsaAllShared->MainDeviceList))
438191762Simp  {
439191762Simp    oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
440191762Simp    if (oneDeviceData == agNULL)
441191762Simp    {
442191762Simp      TI_DBG1(("tddmPortSASDeviceFind: oneDeviceData is NULL!!!\n"));
443191762Simp      return agNULL;
444191762Simp    }
445191762Simp    if ((oneDeviceData->SASAddressID.sasAddressHi == sasAddrHi) &&
446191762Simp        (oneDeviceData->SASAddressID.sasAddressLo == sasAddrLo) &&
447191762Simp        (oneDeviceData->valid == agTRUE) &&
448191762Simp        (oneDeviceData->tdPortContext == onePortContext)
449191762Simp      )
450191762Simp    {
451191762Simp      TI_DBG2(("tddmPortSASDeviceFind: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
452191762Simp      TI_DBG2(("tddmPortSASDeviceFind: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
453191762Simp      TI_DBG2(("tddmPortSASDeviceFind: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
454191762Simp      RetDeviceData = oneDeviceData;
455191762Simp      break;
456191762Simp    }
457191762Simp    DeviceListList = DeviceListList->flink;
458191762Simp  }
459191762Simp
460191762Simp  tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
461191762Simp
462191762Simp  return RetDeviceData;
463191762Simp}
464191762Simp
465191762Simp/* not in use yet */
466191762SimposGLOBAL tdsaDeviceData_t *
467191762SimptddmAddToSharedcontext(
468191762Simp                       agsaRoot_t           *agRoot,
469191762Simp                       tdsaPortContext_t    *onePortContext,
470191762Simp                       tdsaSASSubID_t       *agSASSubID,
471191762Simp                       tdsaDeviceData_t     *oneExpDeviceData,
472191762Simp                       bit8                 phyID
473191762Simp                      )
474191762Simp{
475191762Simp  tdsaDeviceData_t  *oneDeviceData = agNULL;
476191762Simp  tdList_t          *DeviceListList;
477191762Simp  tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
478191762Simp  tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
479191762Simp  tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
480191762Simp  tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
481191762Simp  bit32             new_device = agTRUE;
482191762Simp
483191762Simp  TI_DBG1(("tddmAddToSharedcontext: start\n"));
484191762Simp
485191762Simp  TI_DBG1(("tddmAddToSharedcontext: oneportContext ID %d\n", onePortContext->id));
486191762Simp  /* find a device's existence */
487191762Simp  DeviceListList = tdsaAllShared->MainDeviceList.flink;
488191762Simp  while (DeviceListList != &(tdsaAllShared->MainDeviceList))
489191762Simp  {
490191762Simp    oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
491191762Simp    if (oneDeviceData == agNULL)
492191762Simp    {
493191762Simp      TI_DBG1(("tddmAddToSharedcontext: oneDeviceData is NULL!!!\n"));
494191762Simp      return agNULL;
495191762Simp    }
496191762Simp    if ((oneDeviceData->SASAddressID.sasAddressHi == agSASSubID->sasAddressHi) &&
497191762Simp        (oneDeviceData->SASAddressID.sasAddressLo == agSASSubID->sasAddressLo) &&
498191762Simp        (oneDeviceData->tdPortContext == onePortContext)
499191762Simp        )
500191762Simp    {
501191762Simp      TI_DBG1(("tddmAddToSharedcontext: pid %dtddmAddToSharedcontext did %d\n", onePortContext->id, oneDeviceData->id));
502191762Simp      new_device = agFALSE;
503191762Simp      break;
504191762Simp    }
505191762Simp    DeviceListList = DeviceListList->flink;
506191762Simp  }
507191762Simp
508191762Simp  /* new device */
509191762Simp  if (new_device == agTRUE)
510191762Simp  {
511191762Simp    TI_DBG1(("tddmAddToSharedcontext: new device\n"));
512191762Simp    tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
513191762Simp    if (!TDLIST_NOT_EMPTY(&(tdsaAllShared->FreeDeviceList)))
514191762Simp    {
515191762Simp      tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
516191762Simp      TI_DBG1(("tddmAddToSharedcontext: empty DeviceData FreeLink\n"));
517191762Simp      return agNULL;
518191762Simp    }
519191762Simp
520191762Simp    TDLIST_DEQUEUE_FROM_HEAD(&DeviceListList, &(tdsaAllShared->FreeDeviceList));
521191762Simp    tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
522191762Simp    oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, FreeLink, DeviceListList);
523191762Simp
524191762Simp    TI_DBG1(("tddmAddToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
525191762Simp
526191762Simp    onePortContext->Count++;
527191762Simp    oneDeviceData->agRoot = agRoot;
528191762Simp    /* saving sas address */
529191762Simp    oneDeviceData->SASAddressID.sasAddressLo = agSASSubID->sasAddressLo;
530191762Simp    oneDeviceData->SASAddressID.sasAddressHi = agSASSubID->sasAddressHi;
531191762Simp    oneDeviceData->initiator_ssp_stp_smp = agSASSubID->initiator_ssp_stp_smp;
532191762Simp    oneDeviceData->target_ssp_stp_smp = agSASSubID->target_ssp_stp_smp;
533191762Simp    oneDeviceData->tdPortContext = onePortContext;
534191762Simp    /* handles both SAS target and STP-target, SATA-device */
535191762Simp    if (!DEVICE_IS_SATA_DEVICE(oneDeviceData) && !DEVICE_IS_STP_TARGET(oneDeviceData))
536191762Simp    {
537191762Simp      oneDeviceData->DeviceType = TD_SAS_DEVICE;
538191762Simp    }
539191762Simp    else
540191762Simp    {
541191762Simp      oneDeviceData->DeviceType = TD_SATA_DEVICE;
542191762Simp    }
543191762Simp
544191762Simp    oneDeviceData->ExpDevice = oneExpDeviceData;
545191762Simp    /* set phyID only when it has initial value of 0xFF */
546191762Simp    if (oneDeviceData->phyID == 0xFF)
547191762Simp    {
548191762Simp      oneDeviceData->phyID = phyID;
549191762Simp    }
550191762Simp
551191762Simp    oneDeviceData->valid = agTRUE;
552191762Simp
553191762Simp    /* add the devicedata to the portcontext */
554191762Simp    tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
555191762Simp    TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList));
556191762Simp    tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
557191762Simp    TI_DBG1(("tddmAddToSharedcontext: one case pid %d did %d \n", onePortContext->id, oneDeviceData->id));
558191762Simp    TI_DBG1(("tddmAddToSharedcontext: new case pid %d did %d phyID %d\n", onePortContext->id, oneDeviceData->id, oneDeviceData->phyID));
559191762Simp  }
560191762Simp  else /* old device */
561191762Simp  {
562191762Simp    TI_DBG1(("tddmAddToSharedcontext: old device\n"));
563191762Simp    TI_DBG1(("tddmAddToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
564191762Simp
565191762Simp    oneDeviceData->agRoot = agRoot;
566191762Simp    /* saving sas address */
567191762Simp    oneDeviceData->SASAddressID.sasAddressLo = agSASSubID->sasAddressLo;
568191762Simp    oneDeviceData->SASAddressID.sasAddressHi = agSASSubID->sasAddressHi;
569191762Simp    oneDeviceData->initiator_ssp_stp_smp = agSASSubID->initiator_ssp_stp_smp;
570191762Simp    oneDeviceData->target_ssp_stp_smp = agSASSubID->target_ssp_stp_smp;
571191762Simp    oneDeviceData->tdPortContext = onePortContext;
572191762Simp    /* handles both SAS target and STP-target, SATA-device */
573191762Simp    if (!DEVICE_IS_SATA_DEVICE(oneDeviceData) && !DEVICE_IS_STP_TARGET(oneDeviceData))
574199198Sjhb    {
575191762Simp      oneDeviceData->DeviceType = TD_SAS_DEVICE;
576191762Simp    }
577191762Simp    else
578191762Simp    {
579191762Simp      oneDeviceData->DeviceType = TD_SATA_DEVICE;
580191762Simp    }
581191762Simp
582191762Simp    oneDeviceData->ExpDevice = oneExpDeviceData;
583191762Simp    /* set phyID only when it has initial value of 0xFF */
584191762Simp    if (oneDeviceData->phyID == 0xFF)
585191762Simp    {
586191762Simp      oneDeviceData->phyID = phyID;
587191762Simp    }
588191762Simp
589191762Simp    oneDeviceData->valid = agTRUE;
590191762Simp    TI_DBG1(("tddmAddToSharedcontext: old case pid %d did %d phyID %d\n", onePortContext->id, oneDeviceData->id, oneDeviceData->phyID));
591191762Simp
592191762Simp  }
593191762Simp  return oneDeviceData;
594191762Simp
595191762Simp}
596191762Simp
597191762Simp
598191762Simp/*
599191762Simp  calls saRegisterNewDevice()
600191762Simp  in ossaDeviceRegistrationCB(), if an expander, register to DM
601191762Simp#define DEVICE_IS_SMP_TARGET(DeviceData) \
602191762Simp  (((DeviceData)->target_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT)
603191762Simp*/
604191762SimposGLOBAL tdsaDeviceData_t *
605191762SimptddmPortDeviceAdd(
606191762Simp                     tiRoot_t            *tiRoot,
607191762Simp                     tdsaPortContext_t   *onePortContext,
608191762Simp                     dmDeviceInfo_t      *dmDeviceInfo,
609191762Simp                     tdsaDeviceData_t    *oneExpDeviceData
610191762Simp      )
611191762Simp{
612191762Simp  tdsaRoot_t        *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
613191762Simp  tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
614191762Simp  tdsaDeviceData_t  *oneDeviceData = agNULL;
615191762Simp  tdsaSASSubID_t    agSASSubID;
616191762Simp  bit8              phyID;
617191762Simp
618191762Simp  TI_DBG2(("tddmPortDeviceAdd: start\n"));
619191762Simp
620191762Simp
621191762Simp  agSASSubID.sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi);
622191762Simp  agSASSubID.sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo);
623191762Simp  agSASSubID.initiator_ssp_stp_smp = dmDeviceInfo->initiator_ssp_stp_smp;
624191762Simp  agSASSubID.target_ssp_stp_smp = dmDeviceInfo->target_ssp_stp_smp;
625191762Simp  phyID = (dmDeviceInfo->ext) & 0xFF;
626191762Simp
627191762Simp  /* old device and already registered to LL; added by link-up event */
628191762Simp  if ( agFALSE == tdssNewSASorNot(
629191762Simp                                   onePortContext->agRoot,
630191762Simp                                   onePortContext,
631191762Simp                                   &agSASSubID
632191762Simp                                   )
633191762Simp       )
634191762Simp  {
635191762Simp    /* old device and already registered to LL; added by link-up event */
636191762Simp    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));
637191762Simp    /* find the old device */
638191762Simp    oneDeviceData = tdssNewAddSASToSharedcontext(
639191762Simp                                                 onePortContext->agRoot,
640191762Simp                                                 onePortContext,
641191762Simp                                                 &agSASSubID,
642191762Simp                                                 oneExpDeviceData,
643191762Simp                                                 phyID
644191762Simp                                                 );
645191762Simp
646191762Simp    if (oneDeviceData == agNULL)
647191762Simp    {
648191762Simp      TI_DBG1(("tddmPortDeviceAdd: no more device!!! oneDeviceData is null\n"));
649191762Simp    }
650191762Simp
651191762Simp    /* If a device is allocated */
652191762Simp    if ( oneDeviceData != agNULL )
653191762Simp    {
654191762Simp
655191762Simp      TI_DBG2(("tddmPortDeviceAdd: sasAddressHi 0x%08x\n", agSASSubID.sasAddressHi));
656191762Simp      TI_DBG2(("tddmPortDeviceAdd: sasAddressLo 0x%08x\n", agSASSubID.sasAddressLo));
657191762Simp      TI_DBG2(("tddmPortDeviceAdd: phyID 0x%x\n", phyID));
658191762Simp
659191762Simp      /* copy dmDeviceInfo to oneDeviceData->agDeviceInfo except ext field */
660191762Simp      oneDeviceData->agDeviceInfo.smpTimeout = dmDeviceInfo->smpTimeout;
661191762Simp      oneDeviceData->agDeviceInfo.it_NexusTimeout = dmDeviceInfo->it_NexusTimeout;
662191762Simp      oneDeviceData->agDeviceInfo.firstBurstSize = dmDeviceInfo->firstBurstSize;
663191762Simp      oneDeviceData->agDeviceInfo.devType_S_Rate = dmDeviceInfo->devType_S_Rate;
664191762Simp      osti_memcpy(&(oneDeviceData->agDeviceInfo.sasAddressHi), &(dmDeviceInfo->sasAddressHi), 4);
665191762Simp      osti_memcpy(&(oneDeviceData->agDeviceInfo.sasAddressLo), &(dmDeviceInfo->sasAddressLo), 4);
666191762Simp      if (dmDeviceInfo->sataDeviceType == SATA_ATAPI_DEVICE)
667191762Simp      {
668191762Simp          oneDeviceData->agDeviceInfo.flag |= ATAPI_DEVICE_FLAG;
669191762Simp      }
670191762Simp
671191762Simp      oneDeviceData->satDevData.satDeviceType = dmDeviceInfo->sataDeviceType;
672191762Simp
673191762Simp
674191762Simp
675191762Simp      oneDeviceData->agContext.osData = oneDeviceData;
676191762Simp      oneDeviceData->agContext.sdkData = agNULL;
677191762Simp
678191762Simp    }
679191762Simp    return oneDeviceData;
680191762Simp  } /* old device */
681191762Simp
682191762Simp  /* new device */
683191762Simp
684191762Simp  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));
685191762Simp
686191762Simp  /* allocate a new device and set the valid bit */
687191762Simp  oneDeviceData = tdssNewAddSASToSharedcontext(
688191762Simp                                               onePortContext->agRoot,
689191762Simp                                               onePortContext,
690191762Simp                                               &agSASSubID,
691191762Simp                                               oneExpDeviceData,
692191762Simp                                               phyID
693191762Simp                                               );
694191762Simp
695191762Simp  if (oneDeviceData == agNULL)
696191762Simp  {
697191762Simp    TI_DBG1(("tddmPortDeviceAdd: no more device!!! oneDeviceData is null\n"));
698191762Simp  }
699191762Simp
700191762Simp   /* If a device is allocated */
701191762Simp  if ( oneDeviceData != agNULL )
702191762Simp  {
703191762Simp
704    TI_DBG2(("tddmPortDeviceAdd: sasAddressHi 0x%08x\n", agSASSubID.sasAddressHi));
705    TI_DBG2(("tddmPortDeviceAdd: sasAddressLo 0x%08x\n", agSASSubID.sasAddressLo));
706    TI_DBG2(("tddmPortDeviceAdd: phyID 0x%x\n", phyID));
707
708    /* copy dmDeviceInfo to oneDeviceData->agDeviceInfo except ext field */
709    oneDeviceData->agDeviceInfo.smpTimeout = dmDeviceInfo->smpTimeout;
710    oneDeviceData->agDeviceInfo.it_NexusTimeout = dmDeviceInfo->it_NexusTimeout;
711    oneDeviceData->agDeviceInfo.firstBurstSize = dmDeviceInfo->firstBurstSize;
712    oneDeviceData->agDeviceInfo.devType_S_Rate = dmDeviceInfo->devType_S_Rate;
713    osti_memcpy(&(oneDeviceData->agDeviceInfo.sasAddressHi), &(dmDeviceInfo->sasAddressHi), 4);
714    osti_memcpy(&(oneDeviceData->agDeviceInfo.sasAddressLo), &(dmDeviceInfo->sasAddressLo), 4);
715
716    oneDeviceData->satDevData.satDeviceType = dmDeviceInfo->sataDeviceType;
717    if (dmDeviceInfo->sataDeviceType == SATA_ATAPI_DEVICE)
718    {
719        oneDeviceData->agDeviceInfo.flag |= ATAPI_DEVICE_FLAG;
720    }
721
722    oneDeviceData->agContext.osData = oneDeviceData;
723    oneDeviceData->agContext.sdkData = agNULL;
724
725    TI_DBG2(("tddmPortDeviceAdd: did %d\n", oneDeviceData->id));
726
727    /* don't add and register initiator for T2D */
728    if ( (((oneDeviceData->initiator_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT) &&
729         ((oneDeviceData->target_ssp_stp_smp & DEVICE_SSP_BIT) != DEVICE_SSP_BIT))
730        ||
731         (((oneDeviceData->initiator_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT) &&
732         ((oneDeviceData->target_ssp_stp_smp & DEVICE_SSP_BIT) != DEVICE_SSP_BIT))
733       )
734    {
735      TI_DBG1(("tddmPortDeviceAdd: initiator. no add and registration\n"));
736      TI_DBG1(("tddmPortDeviceAdd: sasAddressHi 0x%08x\n", agSASSubID.sasAddressHi));
737      TI_DBG1(("tddmPortDeviceAdd: sasAddressLo 0x%08x\n", agSASSubID.sasAddressLo));
738
739    }
740    else
741    {
742      if (oneDeviceData->registered == agFALSE)
743      {
744#ifdef REMOVED
745        //temp; setting MCN to tdsaAllShared->MCN
746        oneDeviceData->agDeviceInfo.flag = oneDeviceData->agDeviceInfo.flag | (tdsaAllShared->MCN << 16);
747        //end temp
748#endif
749        if( tdsaAllShared->sflag )
750        {
751          if( ! DEVICE_IS_SMP_TARGET(oneDeviceData))
752          {
753            TI_DBG1(("tddmPortDeviceAdd: saRegisterNewDevice sflag %d\n", tdsaAllShared->sflag));
754            oneDeviceData->agDeviceInfo.flag = oneDeviceData->agDeviceInfo.flag | TD_XFER_RDY_PRIORTY_DEVICE_FLAG;
755          }
756        }
757        saRegisterNewDevice( /* tddmPortDeviceAdd */
758                            onePortContext->agRoot,
759                            &oneDeviceData->agContext,
760                            0,
761                            &oneDeviceData->agDeviceInfo,
762                            onePortContext->agPortContext,
763                            0
764                            );
765      }
766    }
767  }
768
769  return oneDeviceData;
770}
771
772
773/*
774  each call, add the device to the device list
775  typedef struct{
776  bit16 smpTimeout;
777  bit16 it_NexusTimeout;
778  bit16 firstBurstSize;
779  bit8  flag;
780  bit8  devType_S_Rate;
781  bit8  sasAddressHi[4];
782  bit8  sasAddressLo[4];
783} dmDeviceInfo_t;
784
785 find oneExpDeviceData (expander device data) from dmExpDeviceInfo and
786 pass it to tddmPortDeviceAdd()
787 start here - change spec from bit32 to void
788
789 phyID = ((dmDeviceInfo->flag) & 0xFC) >> 2;
790 Initiators are not registered
791*/
792//start here
793osGLOBAL void
794tddmReportDevice(
795                 dmRoot_t        *dmRoot,
796                 dmPortContext_t *dmPortContext,
797                 dmDeviceInfo_t  *dmDeviceInfo, /* device */
798                 dmDeviceInfo_t  *dmExpDeviceInfo, /* expander the device is attached to */
799     bit32                   flag
800
801                 )
802{
803  agsaRoot_t         *agRoot;
804  tdsaRoot_t         *tdsaRoot;
805  tdsaContext_t      *tdsaAllShared;
806  tiRoot_t           *tiRoot;
807  tdsaDeviceData_t   *oneExpDeviceData = agNULL;
808  bit32              sasAddressHi, sasAddressLo;
809  tdsaPortContext_t  *onePortContext;
810  tdsaDeviceData_t   *oneDeviceData = agNULL;
811  bit32              localMCN = 0, finalMCN = 0;
812  bit32              devMCN = 1;
813  bit32              DLR = 0xA;
814  bit32              option;
815  bit32              param;
816
817#ifdef FDS_SM
818  smRoot_t           *smRoot;
819#endif
820
821  TI_DBG2(("tddmReportDevice: start\n"));
822  tdsaRoot = (tdsaRoot_t *)dmRoot->tdData;
823  if (tdsaRoot == agNULL)
824  {
825    TI_DBG1(("tddmReportDevice: tdsaRoot is NULL\n"));
826    return;
827  }
828
829  tdsaAllShared = &(tdsaRoot->tdsaAllShared);
830  if (tdsaAllShared == agNULL)
831  {
832    TI_DBG1(("tddmReportDevice: tdsaAllShared is NULL\n"));
833    return;
834  }
835
836  tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
837  if (tiRoot == agNULL)
838  {
839    TI_DBG1(("tddmReportDevice: tiRoot is NULL\n"));
840    return;
841  }
842
843  onePortContext = (tdsaPortContext_t *)dmPortContext->tdData;
844  if (onePortContext == agNULL)
845  {
846    TI_DBG1(("tddmReportDevice: onePortContext is NULL\n"));
847    return;
848  }
849
850#ifdef FDS_SM
851  smRoot = &(tdsaAllShared->smRoot);
852#endif
853
854  TI_DBG2(("tddmReportDevice: device addrHi 0x%08x addrLo 0x%08x\n",
855            TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi), TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressLo)));
856
857  if (dmExpDeviceInfo != agNULL)
858  {
859    TI_DBG2(("tddmReportDevice: attached expander addrHi 0x%08x addrLo 0x%08x\n",
860              TD_GET_SAS_ADDRESSHI(dmExpDeviceInfo->sasAddressHi), TD_GET_SAS_ADDRESSLO(dmExpDeviceInfo->sasAddressLo)));
861  }
862  else
863  {
864    TI_DBG2(("tddmReportDevice: No attached expander\n"));
865  }
866
867  /* initiators only (e.g. SPC or SPCv) are discarded */
868  if ( (dmDeviceInfo->target_ssp_stp_smp == 0) &&
869       ( DEVICE_IS_SSP_INITIATOR(dmDeviceInfo) || DEVICE_IS_STP_INITIATOR(dmDeviceInfo) || DEVICE_IS_SMP_INITIATOR(dmDeviceInfo))
870     )
871  {
872    TI_DBG3(("tddmReportDevice: Initiators are not added\n"));
873    TI_DBG3(("tddmReportDevice: device addrHi 0x%08x addrLo 0x%08x\n",
874            TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi), TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressLo)));
875    return;
876  }
877
878  if (flag == dmDeviceArrival)
879  {
880    TI_DBG2(("tddmReportDevice: arrival\n"));
881    if (dmExpDeviceInfo != agNULL)
882    {
883      sasAddressHi = TD_GET_SAS_ADDRESSHI(dmExpDeviceInfo->sasAddressHi);
884      sasAddressLo = TD_GET_SAS_ADDRESSLO(dmExpDeviceInfo->sasAddressLo);
885
886      oneExpDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi);
887    }
888
889    tddmPortDeviceAdd(tiRoot, onePortContext, dmDeviceInfo, oneExpDeviceData);
890
891  }
892  else if (flag == dmDeviceRemoval)
893  {
894    TI_DBG2(("tddmReportDevice: removal\n"));
895    sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi);
896    sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo);
897    oneDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi);
898    if (oneDeviceData == agNULL)
899    {
900      TI_DBG2(("tddmReportDevice: oneDeviceData is NULL!!!\n"));
901    }
902    else
903    {
904      /* invalidate device */
905      TI_DBG2(("tddmReportDevice: invalidating\n"));
906      TI_DBG2(("tddmReportDevice: agDevHandle %p\n", oneDeviceData->agDevHandle));
907      if ( oneDeviceData->agDevHandle != agNULL)
908      {
909        TI_DBG2(("tddmReportDevice: agDevHandle->sdkData %p\n", oneDeviceData->agDevHandle->sdkData));
910      }
911      else
912      {
913        TI_DBG2(("tddmReportDevice: agDevHandle->sdkData is NULL\n"));
914      }
915      oneDeviceData->valid = agFALSE;
916//to do; to be tested
917      agRoot = oneDeviceData->agRoot;
918      if ( (oneDeviceData->registered == agTRUE) &&
919           ( DEVICE_IS_SSP_TARGET(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData)
920           || DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_SMP_TARGET(oneDeviceData) )
921         )
922      {
923        if ( !( DEVICE_IS_SMP_TARGET(oneDeviceData) && oneDeviceData->directlyAttached == agTRUE))
924        {
925          tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
926          oneDeviceData->registered = agFALSE;
927        }
928        else
929        {
930          TI_DBG2(("tddmReportDevice: keeping\n"));
931          oneDeviceData->registered = agTRUE;
932        }
933      }
934      else if (oneDeviceData->registered == agTRUE)
935      {
936        if ( oneDeviceData->agDevHandle == agNULL)
937        {
938          TI_DBG1(("tddmReportDevice: agDevHandle->sdkData is NULL. Error!!! \n"));
939        }
940        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
941        oneDeviceData->registered = agFALSE;
942      }
943//to do remove
944#ifdef FDS_SM_WRONG
945      if (DEVICE_IS_SATA_DEVICE(oneDeviceData))
946      {
947        TI_DBG2(("tddmReportDevice: smDeregisterDevice\n"));
948        smDeregisterDevice(smRoot, agNULL, oneDeviceData->agDevHandle, &(oneDeviceData->smDeviceHandle));
949        oneDeviceData->satDevData.IDDeviceValid = agFALSE;
950      }
951#endif
952    }
953  }
954  else if (flag == dmDeviceNoChange)
955  {
956    TI_DBG2(("tddmReportDevice: no change; do nothing \n"));
957#ifdef FDS_SM
958    sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi);
959    sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo);
960    oneDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi);
961    if (oneDeviceData == agNULL)
962    {
963      TI_DBG2(("tddmReportDevice: oneDeviceData is NULL!!!\n"));
964    }
965    else
966    {
967      agRoot = oneDeviceData->agRoot;
968      if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
969          &&
970          oneDeviceData->satDevData.IDDeviceValid == agFALSE)
971      {
972        tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
973      }
974    }
975#endif
976  }
977  else if (flag == dmDeviceMCNChange)
978  {
979    TI_DBG2(("tddmReportDevice: dmDeviceMCNChange \n"));
980    localMCN = tdsaFindLocalMCN(tiRoot, onePortContext);
981    devMCN = DEVINFO_GET_EXT_MCN(dmDeviceInfo);
982    TI_DBG2(("tddmReportDevice: devMCN 0x%08x localMCN 0x%08x\n", devMCN, localMCN));
983
984    sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi);
985    sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo);
986    oneDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi);
987    if (oneDeviceData == agNULL)
988    {
989      TI_DBG1(("tddmReportDevice: oneDeviceData is NULL!!!\n"));
990    }
991    else
992    {
993      agRoot = oneDeviceData->agRoot;
994      oneDeviceData->devMCN = devMCN;
995      TI_DBG2(("tddmReportDevice: sasAddrHi 0x%08x sasAddrLo 0x%08x\n", sasAddressHi, sasAddressLo));
996      if (oneDeviceData->directlyAttached == agTRUE)
997      {
998        finalMCN = localMCN;
999        TI_DBG2(("tddmReportDevice: directlyAttached, Final MCN 0x%08x\n", finalMCN));
1000      }
1001      else
1002      {
1003        finalMCN = MIN(devMCN, localMCN);
1004        TI_DBG2(("tddmReportDevice: Not directlyAttached, Final MCN 0x%08x\n", finalMCN));
1005      }
1006      if ( oneDeviceData->registered == agTRUE)
1007      {
1008        /* saSetDeviceInfo to change MCN, using finalMCN */
1009        option = 8; /* setting only MCN 1000b */
1010        param = finalMCN << 24;
1011        TI_DBG2(("tddmReportDevice: option 0x%x param 0x%x MCN 0x%x\n", option, param, finalMCN));
1012        saSetDeviceInfo(agRoot, agNULL, 0, oneDeviceData->agDevHandle, option, param, ossaSetDeviceInfoCB);
1013      }
1014      else
1015      {
1016        TI_DBG1(("tddmReportDevice: oneDeviceData is not yet registered !!!\n"));
1017      }
1018      oneDeviceData->finalMCN = finalMCN;
1019    }
1020  }
1021  else if (flag == dmDeviceRateChange)
1022  {
1023    TI_DBG1(("tddmReportDevice: dmDeviceRateChange \n"));
1024    sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi);
1025    sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo);
1026    oneDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi);
1027    if (oneDeviceData == agNULL)
1028    {
1029      TI_DBG1(("tddmReportDevice: oneDeviceData is NULL!!!\n"));
1030    }
1031    else
1032    {
1033      agRoot = oneDeviceData->agRoot;
1034      if ( oneDeviceData->registered == agTRUE)
1035      {
1036        option = 0x20; /* bit 5 */
1037        DLR = DEVINFO_GET_LINKRATE(dmDeviceInfo);
1038        param = DLR << 28;
1039        TI_DBG1(("tddmReportDevice: option 0x%x param 0x%x DLR 0x%x\n", option, param, DLR));
1040        saSetDeviceInfo(agRoot, agNULL, 0, oneDeviceData->agDevHandle, option, param, ossaSetDeviceInfoCB);
1041
1042      }
1043      else
1044      {
1045        TI_DBG1(("tddmReportDevice: oneDeviceData is not yet registered !!!\n"));
1046      }
1047
1048    }
1049  }
1050  else
1051  {
1052    TI_DBG1(("tddmReportDevice: unknown flag 0x%x, wrong\n", flag));
1053  }
1054
1055  return;
1056}
1057
1058osGLOBAL void
1059tdsaUpdateMCN(
1060              dmRoot_t             *dmRoot,
1061              tdsaPortContext_t    *onePortContext
1062             )
1063{
1064  tdsaRoot_t         *tdsaRoot;
1065  tdsaContext_t      *tdsaAllShared;
1066  tiRoot_t           *tiRoot;
1067  tdsaDeviceData_t   *oneDeviceData = agNULL;
1068  tdList_t           *DeviceListList;
1069  bit32              localMCN = 0, finalMCN = 0;
1070  bit32              devMCN = 1;
1071  bit32              option;
1072  bit32              param;
1073
1074  TI_DBG3(("tdsaUpdateMCN: start\n"));
1075  tdsaRoot = (tdsaRoot_t *)dmRoot->tdData;
1076  if (tdsaRoot == agNULL)
1077  {
1078    TI_DBG1(("tdsaUpdateMCN: tdsaRoot is NULL\n"));
1079    return;
1080  }
1081
1082  tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1083  if (tdsaAllShared == agNULL)
1084  {
1085    TI_DBG1(("tdsaUpdateMCN: tdsaAllShared is NULL\n"));
1086    return;
1087  }
1088
1089  tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1090  if (tiRoot == agNULL)
1091  {
1092    TI_DBG1(("tdsaUpdateMCN: tiRoot is NULL\n"));
1093    return;
1094  }
1095
1096  if (onePortContext->valid == agFALSE)
1097  {
1098    TI_DBG1(("tdsaUpdateMCN: onePortContext is invalid\n"));
1099    return;
1100  }
1101
1102  TI_DBG3(("tdsaUpdateMCN: pid %d\n", onePortContext->id));
1103
1104  localMCN = tdsaFindLocalMCN(tiRoot, onePortContext);
1105
1106  if (TDLIST_EMPTY(&(tdsaAllShared->MainDeviceList)))
1107  {
1108    TI_DBG1(("tdsaUpdateMCN: empty device list\n"));
1109    return;
1110  }
1111
1112  /* update directly and behind expander device */
1113  DeviceListList = tdsaAllShared->MainDeviceList.flink;
1114  while (DeviceListList != &(tdsaAllShared->MainDeviceList))
1115  {
1116    oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
1117    if (oneDeviceData == agNULL)
1118    {
1119      TI_DBG1(("tdsaUpdateMCN: oneDeviceData is NULL!!!\n"));
1120      return;
1121    }
1122    TI_DBG3(("tdsaUpdateMCN: loop did %d\n", oneDeviceData->id));
1123    TI_DBG3(("tdsaUpdateMCN: sasAddrHi 0x%08x sasAddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
1124    devMCN = oneDeviceData->devMCN;
1125    if ( oneDeviceData->tdPortContext == onePortContext)
1126    {
1127      if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE && oneDeviceData->directlyAttached == agTRUE)
1128      {
1129        TI_DBG3(("tdsaUpdateMCN: found directly attached\n"));
1130        finalMCN = localMCN;
1131        TI_DBG3(("tdsaUpdateMCN: devMCN 0x%08x localMCN 0x%08x\n", devMCN, localMCN));
1132        TI_DBG3(("tdsaUpdateMCN: finalMCN 0x%08x\n", finalMCN));
1133        if (oneDeviceData->finalMCN != finalMCN)
1134        {
1135          /* saSetDeviceInfo using finalMCN */
1136          option = 8; /* setting only MCN 1000b */
1137          param = finalMCN << 24;
1138          TI_DBG3(("tdsaUpdateMCN: option 0x%x param 0x%x MCN 0x%x\n", option, param, finalMCN));
1139          saSetDeviceInfo(oneDeviceData->agRoot, agNULL, 0, oneDeviceData->agDevHandle, option, param, ossaSetDeviceInfoCB);
1140          oneDeviceData->finalMCN = finalMCN;
1141        }
1142
1143      }
1144      else if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE && oneDeviceData->directlyAttached == agFALSE)
1145      {
1146        TI_DBG3(("tdsaUpdateMCN: found behind expander device\n"));
1147        finalMCN = MIN(localMCN, devMCN);
1148        TI_DBG3(("tdsaUpdateMCN: devMCN 0x%08x localMCN 0x%08x\n", devMCN, localMCN));
1149        TI_DBG3(("tdsaUpdateMCN: finalMCN 0x%08x\n", finalMCN));
1150        if (oneDeviceData->finalMCN != finalMCN)
1151        {
1152          /* saSetDeviceInfo using finalMCN */
1153          option = 8; /* setting only MCN 1000b */
1154          param = finalMCN << 24;
1155          TI_DBG3(("tdsaUpdateMCN: option 0x%x param 0x%x MCN 0x%x\n", option, param, finalMCN));
1156          saSetDeviceInfo(oneDeviceData->agRoot, agNULL, 0, oneDeviceData->agDevHandle, option, param, ossaSetDeviceInfoCB);
1157          oneDeviceData->finalMCN = finalMCN;
1158        }
1159
1160      }
1161      DeviceListList = DeviceListList->flink;
1162    }
1163    else
1164    {
1165      if (oneDeviceData->tdPortContext != agNULL)
1166      {
1167        TI_DBG3(("tdsaUpdateMCN: different portcontext; oneDeviceData->tdPortContext pid %d oneportcontext pid %d\n", oneDeviceData->tdPortContext->id, onePortContext->id));
1168      }
1169      else
1170      {
1171        TI_DBG3(("tdsaUpdateMCN: different portcontext; oneDeviceData->tdPortContext pid NULL oneportcontext pid %d\n", onePortContext->id));
1172      }
1173      DeviceListList = DeviceListList->flink;
1174    }
1175  }  /* while */
1176
1177  return;
1178}
1179
1180osGLOBAL bit8
1181tddmSATADeviceTypeDecode(bit8 * pSignature)
1182{
1183    return (bit8)tdssSATADeviceTypeDecode(pSignature);
1184}
1185
1186
1187osGLOBAL void
1188tddmSingleThreadedEnter(
1189                        dmRoot_t    *dmRoot,
1190                        bit32       syncLockId
1191                       )
1192{
1193  tdsaRoot_t         *tdsaRoot;
1194  tdsaContext_t      *tdsaAllShared;
1195  tiRoot_t           *tiRoot;
1196  bit32              offset = 0;
1197
1198  TI_DBG7(("tddmSingleThreadedEnter: start\n"));
1199
1200  tdsaRoot = (tdsaRoot_t *)dmRoot->tdData;
1201  if (tdsaRoot == agNULL)
1202  {
1203    TI_DBG1(("tddmSingleThreadedEnter: tdsaRoot is NULL\n"));
1204    return;
1205  }
1206
1207  tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1208  if (tdsaAllShared == agNULL)
1209  {
1210    TI_DBG1(("tddmSingleThreadedEnter: tdsaAllShared is NULL\n"));
1211    return;
1212  }
1213
1214  tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1215  if (tiRoot == agNULL)
1216  {
1217    TI_DBG1(("tddmSingleThreadedEnter: tiRoot is NULL\n"));
1218    return;
1219  }
1220  offset = tdsaAllShared->MaxNumLLLocks + tdsaAllShared->MaxNumOSLocks + TD_MAX_LOCKS;
1221
1222  ostiSingleThreadedEnter(tiRoot, syncLockId + offset);
1223  return;
1224}
1225
1226osGLOBAL void
1227tddmSingleThreadedLeave(
1228                        dmRoot_t    *dmRoot,
1229                        bit32       syncLockId
1230                       )
1231{
1232  tdsaRoot_t         *tdsaRoot;
1233  tdsaContext_t      *tdsaAllShared;
1234  tiRoot_t           *tiRoot;
1235  bit32              offset = 0;
1236
1237  TI_DBG7(("tddmSingleThreadedLeave: start\n"));
1238
1239  tdsaRoot = (tdsaRoot_t *)dmRoot->tdData;
1240  if (tdsaRoot == agNULL)
1241  {
1242    TI_DBG1(("tddmSingleThreadedLeave: tdsaRoot is NULL\n"));
1243    return;
1244  }
1245
1246  tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1247  if (tdsaAllShared == agNULL)
1248  {
1249    TI_DBG1(("tddmSingleThreadedLeave: tdsaAllShared is NULL\n"));
1250    return;
1251  }
1252
1253  tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1254  if (tiRoot == agNULL)
1255  {
1256    TI_DBG1(("tddmSingleThreadedLeave: tiRoot is NULL\n"));
1257    return;
1258  }
1259  offset = tdsaAllShared->MaxNumLLLocks + tdsaAllShared->MaxNumOSLocks + TD_MAX_LOCKS;
1260
1261  ostiSingleThreadedLeave(tiRoot, syncLockId + offset);
1262
1263  return;
1264}
1265
1266osGLOBAL bit32 tddmGetTransportParam(
1267                        dmRoot_t    *dmRoot,
1268                        char        *key,
1269                        char        *subkey1,
1270                        char        *subkey2,
1271                        char        *subkey3,
1272                        char        *subkey4,
1273                        char        *subkey5,
1274                        char        *valueName,
1275                        char        *buffer,
1276                        bit32       bufferLen,
1277                        bit32       *lenReceived
1278                        )
1279{
1280  bit32              ret = tiError;
1281
1282  TI_DBG7(("tddmGetTransportParam: start\n"));
1283  ret = ostiGetTransportParam(agNULL,
1284                              key,
1285                              subkey1,
1286                              subkey2,
1287                              subkey3,
1288                              subkey4,
1289                              subkey5,
1290                              valueName,
1291                              buffer,
1292                              bufferLen,
1293                              lenReceived
1294                              );
1295
1296  return ret;
1297}
1298
1299#endif /* FDS_DM */
1300
1301