]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - sys/dev/pms/RefTisa/tisa/sassata/common/tdinit.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / sys / dev / pms / RefTisa / tisa / sassata / common / tdinit.c
1 /*******************************************************************************
2 *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved. 
3 *
4 *Redistribution and use in source and binary forms, with or without modification, are permitted provided 
5 *that the following conditions are met: 
6 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7 *following disclaimer. 
8 *2. Redistributions in binary form must reproduce the above copyright notice, 
9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10 *with the distribution. 
11 *
12 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 
13 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
16 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
17 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
18 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
19 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20
21
22 ********************************************************************************/
23 /*******************************************************************************/
24 /** \file
25  *
26  * This file contains the SAS/SATA TD layer initialization functions
27  *
28  */
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31 #include <dev/pms/config.h>
32
33 #include <dev/pms/freebsd/driver/common/osenv.h>
34 #include <dev/pms/freebsd/driver/common/ostypes.h>
35 #include <dev/pms/freebsd/driver/common/osdebug.h>
36
37 #include <dev/pms/RefTisa/sallsdk/api/sa.h>
38 #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
39 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
40
41 #include <dev/pms/RefTisa/tisa/api/titypes.h>
42 #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
43 #include <dev/pms/RefTisa/tisa/api/tiapi.h>
44 #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
45
46 #ifdef FDS_SM
47 #include <dev/pms/RefTisa/sat/api/sm.h>
48 #include <dev/pms/RefTisa/sat/api/smapi.h>
49 #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
50 #endif
51
52 #ifdef FDS_DM
53 #include <dev/pms/RefTisa/discovery/api/dm.h>
54 #include <dev/pms/RefTisa/discovery/api/dmapi.h>
55 #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
56 #endif
57
58 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
59 #include <dev/pms/freebsd/driver/common/osstring.h>
60 #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
61
62 #ifdef INITIATOR_DRIVER
63 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
64 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
65 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
66 #endif
67
68 #ifdef TARGET_DRIVER
69 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
70 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
71 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
72 #endif
73
74 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
75 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
76
77 LOCAL bit32 tdsaGetCardID(tiRoot_t * tiRoot);
78
79
80 bit32 tdCardIDList[TD_MAX_CARD_NUM] = {
81   TD_CARD_ID_FREE , TD_CARD_ID_FREE , 
82   TD_CARD_ID_FREE , TD_CARD_ID_FREE , 
83   TD_CARD_ID_FREE , TD_CARD_ID_FREE , 
84   TD_CARD_ID_FREE , TD_CARD_ID_FREE , 
85   TD_CARD_ID_FREE , TD_CARD_ID_FREE , 
86   TD_CARD_ID_FREE , TD_CARD_ID_FREE , 
87   TD_CARD_ID_FREE , TD_CARD_ID_FREE , 
88   TD_CARD_ID_FREE , TD_CARD_ID_FREE , 
89   TD_CARD_ID_FREE , TD_CARD_ID_FREE , 
90   TD_CARD_ID_FREE , TD_CARD_ID_FREE
91 };
92
93 /*****************************************************************************
94 *
95 * tdsaGetCardID
96 *
97 *  Purpose:  
98 *
99 *  Parameters:
100 *
101 *    tiRoot:        Pointer to driver/port instance.
102 *
103 *  Return: 
104 *   tiSuccess : CardIDString was successfully read
105 *   tiError   : CardIDString reading failed
106 *
107 *****************************************************************************/ 
108 bit32 tdsaGetCardID(tiRoot_t * tiRoot)
109 {
110   bit32 i;
111   bit32 RetVal = 0xFFFFFFFF;
112
113   for (i = 0 ; i < TD_MAX_CARD_NUM ; i++)
114   {
115     if (tdCardIDList[i] == TD_CARD_ID_FREE)
116     {
117       tdCardIDList[i] = TD_CARD_ID_ALLOC;
118       RetVal = i;
119       break;
120     }
121   }
122
123   return RetVal;
124
125 } /* tdsaGetCardID() */
126
127 /*****************************************************************************
128 *
129 * tdsaFreeCardID
130 *
131 *  Purpose:  
132 *
133 *  Parameters:
134 *
135 *    tiRoot:        Pointer to driver/port instance.
136 *
137 *  Return: 
138 *   tiSuccess : CardIDString was successfully read
139 *   tiError   : CardIDString reading failed
140 *
141 *****************************************************************************/ 
142 osGLOBAL void 
143 tdsaFreeCardID(tiRoot_t *tiRoot, bit32 CardID)
144 {
145   OS_ASSERT(CardID < TD_MAX_CARD_NUM, "Invalid CardID\n");
146
147   tdCardIDList[CardID] = TD_CARD_ID_FREE;
148
149   return;
150
151 } /* tdFreeCardID() */
152
153 /*****************************************************************************
154 *
155 * tdsaGetCardIDString
156 *
157 *  Purpose:  
158 *
159 *  Parameters:
160 *
161 *    tiRoot:        Pointer to driver/port instance.
162 *
163 *  Return: 
164 *   tiSuccess : CardIDString was successfully read
165 *   tiError   : CardIDString reading failed
166 *
167 *****************************************************************************/ 
168 bit32 tdsaGetCardIDString(tiRoot_t *tiRoot)
169 {
170   tdsaRoot_t     *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
171   tdsaContext_t  *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
172   bit32          ret = tiError;
173   bit32          thisCardID = tdsaGetCardID(tiRoot);
174   char           CardNum[10];
175     
176   TI_DBG3(("tdsaGetCardIDString: start\n"));
177
178   TI_DBG3(("tdsaGetCardIDString: thisCardID 0x%x\n", thisCardID));
179   
180
181   if (thisCardID == 0xFFFFFFFF)
182   {
183     TI_DBG1(("tdGetCardIDString: No more CardIDs available\n"));
184     ret = tiError;
185   }
186   else
187   {
188     tdsaAllShared->CardID = thisCardID;
189     osti_sprintf(CardNum,"CardNum%d", thisCardID);
190     TI_DBG3(("tdsaGetCardIDString: CardNum is %s\n", CardNum));  
191     osti_strcpy(tdsaAllShared->CardIDString, CardNum);
192     TI_DBG3(("tdsaGetCardIDString: tdsaAllShared->CardIDString is %s\n", tdsaAllShared->CardIDString));    
193     ret = tiSuccess;
194   
195   }  
196   return ret;
197 }
198 /*****************************************************************************
199 *! \brief tiCOMGetResource
200 *
201 *  Purpose:  This function is called to determine the Transport
202 *            Dependent Layer internal resource requirement.
203 *            This function will internally call the initiator specific,
204 *            target specific and shared TD resource requirement calls.
205 *
206 * \param   tiRoot:             Pointer to driver/port instance.
207 * \param   loResource:         Pointer to low level TSDK resource requirement.
208 * \param   initiatorResource:  Pointer to initiator functionality memory and
209 *                              option requirement.
210 * \param  targetResource:      Pointer to target functionality memory and
211 *                              option requirement.
212 * \param  tdSharedMem:         Pointer to cached memory required by the
213 *                              target/initiator shared functionality.
214 *
215 *  \return None
216 *
217 *  \note - This function only return the memory requirement in the tiMem_t
218 *          structure in loResource, initiatorResource, targetResource
219 *          and tdSharedMem. It does not allocate memory, so the address
220 *          fields in tiMem_t are not used.
221 *
222 *****************************************************************************/
223 osGLOBAL void
224 tiCOMGetResource(
225                  tiRoot_t              *tiRoot,
226                  tiLoLevelResource_t   *loResource,
227                  tiInitiatorResource_t *initiatorResource,
228                  tiTargetResource_t    *targetResource,
229                  tiTdSharedMem_t       *tdSharedMem
230                  )
231 {
232   TI_DBG6(("tiCOMGetResource start\n"));
233   TI_DBG6(("tiCOMGetResource: loResource %p\n", loResource));
234   
235   if(loResource != agNULL)
236   {
237     tdsaLoLevelGetResource(tiRoot, loResource);
238   }
239   if(tdSharedMem != agNULL)
240   {
241     tdsaSharedMemCalculate(tiRoot, loResource, tdSharedMem);
242   }
243   
244 #ifdef INITIATOR_DRIVER
245   /* initiator */
246   if(initiatorResource != agNULL)
247   {
248     itdssGetResource(tiRoot, initiatorResource);
249     /* 
250      * for the time being set the initiator usecsPerTick
251      * same as lolevel usecsPerTick
252      */
253     if (loResource == agNULL)
254     {
255       TI_DBG1(("tiCOMGetResource: loResource is NULL, wrong\n"));
256       return;
257     }
258   }
259 #endif
260   
261 #ifdef TARGET_DRIVER
262   /* target */
263   if(targetResource != agNULL)
264   {
265     ttdssGetResource(tiRoot, targetResource);
266   }
267 #endif
268   
269   return;
270 }
271
272
273 /*****************************************************************************
274 *! \brief tiCOMInit
275 *
276 *  Purpose:  This function is called to initialize Transport Dependent Layer.
277 *            This function will internally call the initiator specific,
278 *            target specific and shared TD initialization calls.
279 *
280 *  \param  tiRoot:             Pointer to target driver/port instance.
281 *  \param  loResource:         Pointer to low level TSDK resource requirement.
282 *  \param  initiatorResource:  Pointer to initiator functionality memory and
283 *                              option requirement.
284 *  \param  targetResource:     Pointer to target functionality memory and
285 *                              option requirement.
286 *  \param  tdSharedMem:        Pointer to cached memory required by the
287 *                              target/initiator shared functionality.
288 *
289 *  \return: tiSuccess  - if successful
290 *           tiError    - if failed
291 *
292 *****************************************************************************/
293 osGLOBAL bit32
294 tiCOMInit(
295            tiRoot_t              *tiRoot,
296            tiLoLevelResource_t   *loResource,
297            tiInitiatorResource_t *initiatorResource,
298            tiTargetResource_t    *targetResource,
299            tiTdSharedMem_t       *tdSharedMem )
300 {
301   tdsaRoot_t         *tdsaRoot;
302   tdsaPortContext_t  *tdsaPortContext;
303   tdsaDeviceData_t   *tdsaDeviceData;
304   
305 #ifdef TD_INT_COALESCE
306   tdsaIntCoalesceContext_t *tdsaIntCoalCxt;
307 #endif
308   
309 #ifdef TD_DISCOVER
310   tdsaExpander_t     *tdsaExpander;
311 #endif
312   
313   bit32         status = tiSuccess;
314   void          *IniAddr = agNULL;
315   void          *TgtAddr = agNULL;
316   tdsaContext_t *tdsaAllShared;
317 #if defined(TD_INT_COALESCE) || defined(TD_DISCOVER) || defined(TD_INTERNAL_DEBUG)
318   bit32         MaxTargets;
319 #endif  
320 #ifdef TD_INTERNAL_DEBUG  /* for debugging only */
321   tdsaEsglAllInfo_t  *pEsglAllInfo;
322   tdList_t           *tdlist_to_fill;
323   tdsaEsglPageInfo_t *page_to_fill;
324 #endif  
325   bit32          i;
326 #ifdef FDS_DM
327   dmSwConfig_t                   dmSwConfig;
328   static dmMemoryRequirement_t   dmMemRequirement;
329   bit32                          dmUsecsPerTick = 0;
330   bit32                          dmMaxNumLocks = 0;
331 #endif  
332  #ifdef FDS_SM
333   smSwConfig_t                   smSwConfig;
334   static smMemoryRequirement_t   smMemRequirement;
335   bit32                          smUsecsPerTick = 0;
336   bit32                          smMaxNumLocks = 0;
337 #endif  
338  
339   
340   /* for memory analysis */
341   TI_DBG6(("ticominit: tdsaroot\n"));
342   TI_DBG6(("ticominit: tdsaRoot_t %d\n", (int)sizeof(tdsaRoot_t)));
343   TI_DBG6(("ticominit: tdsaEsglAllInfo_t %d\n", (int)sizeof(tdsaEsglAllInfo_t)));
344   TI_DBG6(("ticominit: portcontext\n"));
345   TI_DBG6(("ticominit: tdsaPortContext_t %d\n", (int)sizeof(tdsaPortContext_t)));
346   TI_DBG6(("ticominit: device data\n"));
347   TI_DBG6(("ticominit: tdsaDeviceData_t  %d\n", (int)sizeof(tdsaDeviceData_t)));
348   TI_DBG6(("ticominit: agsaSASDeviceInfo_t  %d\n", (int)sizeof(agsaSASDeviceInfo_t)));
349   TI_DBG6(("ticominit: satDeviceData_t  %d\n", (int)sizeof(satDeviceData_t)));
350   TI_DBG6(("ticominit: agsaSATAIdentifyData_t  %d\n", (int)sizeof(agsaSATAIdentifyData_t)));
351   
352   TI_DBG6(("ticominit: IO request body\n"));
353   TI_DBG6(("ticominit: tdIORequestBody_t %d\n", (int)sizeof(tdIORequestBody_t)));
354   TI_DBG6(("ticominit: tdssIOCompleted_t %d\n", (int)sizeof(tdssIOCompleted_t)));
355   TI_DBG6(("ticominit: agsaIORequest_t %d\n", (int)sizeof(agsaIORequest_t)));
356   
357   TI_DBG6(("ticominit: FOR SAS\n"));
358   TI_DBG6(("ticominit: agsaSASRequestBody_t %d\n", (int)sizeof(agsaSASRequestBody_t)));
359   TI_DBG6(("ticominit: FOR SATA\n"));
360   TI_DBG6(("ticominit: agsaSATAInitiatorRequest_t %d\n", (int)sizeof(agsaSATAInitiatorRequest_t)));
361   TI_DBG6(("ticominit: scsiRspSense_t %d\n", (int)sizeof(scsiRspSense_t)));
362   TI_DBG6(("ticominit: tiSenseData_t %d\n", (int)sizeof(tiSenseData_t)));
363   TI_DBG6(("ticominit: satIOContext_t %d\n", (int)sizeof(satIOContext_t)));
364   TI_DBG6(("ticominit: satInternalIo_t %d\n", (int)sizeof(satInternalIo_t)));
365   
366   
367   /*************************************************************************
368   * TD SHARED AREA
369   *************************************************************************/
370
371   TI_DBG6(("ticominit: start\n"));
372
373   
374 #if defined(TD_INT_COALESCE) && defined(TD_DISCOVER)
375
376   /* Let's start from the tdsaRoot */
377   tdsaRoot = tdSharedMem->tdSharedCachedMem1.virtPtr;
378   tdsaPortContext = (tdsaPortContext_t *)((bitptr)tdSharedMem->tdSharedCachedMem1.virtPtr + sizeof(tdsaRoot_t));
379   tdsaDeviceData = (tdsaDeviceData_t *)((bitptr)tdsaPortContext + (sizeof(tdsaPortContext_t) * TD_MAX_PORT_CONTEXT));
380
381   /* the following fn fills in MaxTargets */
382   tdssGetMaxTargetsParams(tiRoot, &MaxTargets);
383   TI_DBG6(("tiCOMInit: MaxTargets %d\n", MaxTargets));
384
385   tdsaIntCoalCxt   =
386     (tdsaIntCoalesceContext_t *)((bitptr)tdsaDeviceData
387                                  + (sizeof(tdsaDeviceData_t) * MaxTargets));
388
389   tdsaExpander  =
390     (tdsaExpander_t *)((bitptr)tdsaIntCoalCxt
391                        + (sizeof(tdsaIntCoalesceContext_t) * TD_MAX_INT_COALESCE));
392     
393
394 #elif defined(TD_INT_COALESCE)
395
396
397   
398   /* Let's start from the tdsaRoot */
399   tdsaRoot = tdSharedMem->tdSharedCachedMem1.virtPtr;
400   tdsaPortContext = (tdsaPortContext_t *)((bitptr)tdSharedMem->tdSharedCachedMem1.virtPtr + sizeof(tdsaRoot_t));
401   tdsaDeviceData = (tdsaDeviceData_t *)((bitptr)tdsaPortContext + (sizeof(tdsaPortContext_t) * TD_MAX_PORT_CONTEXT));
402
403   /* the following fn fills in MaxTargets */
404   tdssGetMaxTargetsParams(tiRoot, &MaxTargets);
405   TI_DBG6(("tiCOMInit: MaxTargets %d\n", MaxTargets));
406
407   tdsaIntCoalCxt   =
408     (tdsaIntCoalesceContext_t *)((bitptr)tdsaDeviceData
409                                  + (sizeof(tdsaDeviceData_t) * MaxTargets));
410
411   
412 #elif defined(TD_DISCOVER)
413
414   
415   /* Let's start from the tdsaRoot */
416   tdsaRoot = tdSharedMem->tdSharedCachedMem1.virtPtr;
417   tdsaPortContext = (tdsaPortContext_t *)((bitptr)tdSharedMem->tdSharedCachedMem1.virtPtr + sizeof(tdsaRoot_t));
418   tdsaDeviceData = (tdsaDeviceData_t *)((bitptr)tdsaPortContext + (sizeof(tdsaPortContext_t) * TD_MAX_PORT_CONTEXT));
419
420   /* the following fn fills in MaxTargets */
421   tdssGetMaxTargetsParams(tiRoot, &MaxTargets);
422   TI_DBG6(("tiCOMInit: MaxTargets %d\n", MaxTargets));
423
424   tdsaExpander  =
425     (tdsaExpander_t *)((bitptr)tdsaDeviceData
426                       + (sizeof(tdsaDeviceData_t) * MaxTargets));
427
428
429   
430 #else
431
432   /* Let's start from the tdsaRoot */
433   tdsaRoot = tdSharedMem->tdSharedCachedMem1.virtPtr;
434   tdsaPortContext = (tdsaPortContext_t *)((bitptr)tdSharedMem->tdSharedCachedMem1.virtPtr + sizeof(tdsaRoot_t));
435   tdsaDeviceData = (tdsaDeviceData_t *)((bitptr)tdsaPortContext + (sizeof(tdsaPortContext_t) * TD_MAX_PORT_CONTEXT));
436
437 #endif
438
439   TI_DBG6(("tiCOMInit: ******* tdsaRoot %p tdsaPortContext %p tdsaDeviceData %p\n", tdsaRoot, tdsaPortContext, tdsaDeviceData));
440
441   
442   tiRoot->tdData    = tdsaRoot;
443   tdsaAllShared = &(tdsaRoot->tdsaAllShared);
444   
445   
446 #ifdef INITIATOR_DRIVER
447   /**< Initialize initiator; itdssIni_t itself */
448   if(initiatorResource)
449   {
450     IniAddr = initiatorResource->initiatorMem.tdCachedMem[0].virtPtr;
451     tdsaRoot->itdsaIni = IniAddr;
452     tdsaRoot->itdsaIni->tdsaAllShared = tdsaAllShared;
453     tdsaAllShared->itdsaIni = tdsaRoot->itdsaIni;
454   }
455 #endif
456   
457 #ifdef TARGET_DRIVER
458   /**< Initialize target; ttdssTgt_t itself */
459   if(targetResource)
460   {
461     TgtAddr = targetResource->targetMem.tdMem[0].virtPtr;
462     tdsaRoot->ttdsaTgt = TgtAddr;
463     tdsaRoot->ttdsaTgt->tdsaAllShared = tdsaAllShared;
464     tdsaAllShared->ttdsaTgt = tdsaRoot->ttdsaTgt;
465   }
466 #endif /* target driver */
467   
468   TI_DBG5(("tiCOMInit: IniAddr %p TgtAddr %p\n", IniAddr, TgtAddr));
469
470   TI_DBG3(("tiCOMInit: tdsaRoot %p tdsaAllShared %p \n",tdsaRoot, tdsaAllShared));  
471
472   /**<  Initialize the OS data part of the interrupt context agRoot */
473   tdsaAllShared->agRootOsDataForInt.tiRoot     = tiRoot;
474   tdsaAllShared->agRootOsDataForInt.tdsaAllShared   = (void *) tdsaAllShared;
475   tdsaAllShared->agRootOsDataForInt.itdsaIni      = (void *) IniAddr;
476   tdsaAllShared->agRootOsDataForInt.ttdsaTgt      = (void *) TgtAddr;
477   /* for sata */
478   tdsaAllShared->agRootOsDataForInt.tdstHost = agNULL;
479   tdsaAllShared->agRootOsDataForInt.tdstDevice = agNULL;
480   
481   /* tiInterruptContext is an enum value */
482   tdsaAllShared->agRootOsDataForInt.IntContext = tiInterruptContext;
483   /* queueId or lockid in TD layer; LL maxlock + 1 since TD uses only one lock */
484   
485   /* agsaRoot_t */
486   tdsaAllShared->agRootInt.osData              = 
487     (void *) &(tdsaAllShared->agRootOsDataForInt);
488   tdsaAllShared->agRootInt.sdkData              = agNULL;
489
490   /**< Initialize the OS data part of the non-interrupt context agRoot */
491   tdsaAllShared->agRootOsDataForNonInt.tiRoot     = tiRoot;
492   tdsaAllShared->agRootOsDataForNonInt.tdsaAllShared   = (void *) tdsaAllShared;
493   tdsaAllShared->agRootOsDataForNonInt.itdsaIni      = (void *) IniAddr;
494   tdsaAllShared->agRootOsDataForNonInt.ttdsaTgt      = (void *) TgtAddr;
495   /* for sata */
496   tdsaAllShared->agRootOsDataForNonInt.tdstHost = agNULL;
497   tdsaAllShared->agRootOsDataForNonInt.tdstDevice = agNULL;
498   
499   tdsaAllShared->agRootOsDataForNonInt.IntContext = tiNonInterruptContext;
500   /* queueId or lockid in TD layer; LL maxlock + 1 since TD uses only one lock */
501
502   /* agsaRoot_t */
503   tdsaAllShared->agRootNonInt.osData              = 
504     (void *) &(tdsaAllShared->agRootOsDataForNonInt);
505   tdsaAllShared->agRootNonInt.sdkData              = agNULL;
506
507   tdsaAllShared->loResource = *loResource;
508
509   tdsaAllShared->PortContextMem = tdsaPortContext;
510   tdsaAllShared->DeviceMem = tdsaDeviceData;
511
512   tdsaAllShared->IBQnumber = 0;
513   tdsaAllShared->OBQnumber = 0;
514     
515 #ifdef TD_INT_COALESCE
516   tdsaAllShared->IntCoalesce = tdsaIntCoalCxt;
517 #endif
518
519 #ifdef TD_DISCOVER
520   tdsaAllShared->ExpanderHead = tdsaExpander;
521 #endif
522
523   tdsaAllShared->MaxNumLocks = loResource->loLevelOption.numOfQueuesPerPort;
524
525   tdsaAllShared->MaxNumOSLocks = loResource->loLevelOption.maxNumOSLocks;
526   
527 #if defined(FDS_DM) && defined(FDS_SM)
528   dmGetRequirements(agNULL, 
529                     &dmSwConfig, 
530                     &dmMemRequirement, 
531                     &dmUsecsPerTick, 
532                     &dmMaxNumLocks
533                     );
534   
535   tdsaAllShared->MaxNumDMLocks = dmMaxNumLocks;
536   TI_DBG2(("tiCOMInit: DM MaxNumDMLocks 0x%x\n", tdsaAllShared->MaxNumDMLocks));
537   
538   smGetRequirements(agNULL, 
539                     &smSwConfig, 
540                     &smMemRequirement, 
541                     &smUsecsPerTick, 
542                     &smMaxNumLocks
543                     );
544   
545   tdsaAllShared->MaxNumSMLocks = smMaxNumLocks;
546   TI_DBG2(("tiCOMInit: SM MaxNumSMLocks 0x%x\n", tdsaAllShared->MaxNumSMLocks));
547   
548   tdsaAllShared->MaxNumLLLocks = tdsaAllShared->MaxNumLocks - TD_MAX_LOCKS - tdsaAllShared->MaxNumDMLocks - tdsaAllShared->MaxNumSMLocks;
549   TI_DBG2(("tiCOMInit: LL MaxNumLLLocks 0x%x\n", tdsaAllShared->MaxNumLLLocks));
550
551 #elif defined(FDS_DM)
552   dmGetRequirements(agNULL, 
553                     &dmSwConfig, 
554                     &dmMemRequirement, 
555                     &dmUsecsPerTick, 
556                     &dmMaxNumLocks
557                     );
558   
559   tdsaAllShared->MaxNumDMLocks = dmMaxNumLocks;
560   TI_DBG2(("tiCOMInit: DM MaxNumDMLocks 0x%x\n", tdsaAllShared->MaxNumDMLocks));
561
562   tdsaAllShared->MaxNumLLLocks = tdsaAllShared->MaxNumLocks - TD_MAX_LOCKS - tdsaAllShared->MaxNumDMLocks;
563   TI_DBG2(("tiCOMInit: LL MaxNumLLLocks 0x%x\n", tdsaAllShared->MaxNumLLLocks));
564 #elif defined(FDS_SM)
565   smGetRequirements(agNULL, 
566                     &smSwConfig, 
567                     &smMemRequirement, 
568                     &smUsecsPerTick, 
569                     &smMaxNumLocks
570                     );
571   
572   tdsaAllShared->MaxNumSMLocks = smMaxNumLocks;
573   TI_DBG2(("tiCOMInit: SM MaxNumSMLocks 0x%x\n", tdsaAllShared->MaxNumSMLocks));
574
575   tdsaAllShared->MaxNumLLLocks = tdsaAllShared->MaxNumLocks - TD_MAX_LOCKS - tdsaAllShared->MaxNumSMLocks;
576   TI_DBG2(("tiCOMInit: LL MaxNumLLLocks 0x%x\n", tdsaAllShared->MaxNumLLLocks));
577 #else
578   tdsaAllShared->MaxNumLLLocks = tdsaAllShared->MaxNumLocks - TD_MAX_LOCKS;
579   TI_DBG2(("tiCOMInit: LL MaxNumLLLocks 0x%x\n", tdsaAllShared->MaxNumLLLocks));
580 #endif
581     
582 #ifdef TBD
583   tdsaAllShared->MaxNumLLLocks = loResource->loLevelOption.numOfQueuesPerPort - TD_MAX_LOCKS;
584 #endif
585   
586   tdsaAllShared->resetCount = 0;
587
588   /* used for saHwEventAck() and ossaDeregisterDeviceHandleCB() */
589 //  tdsaAllShared->EventValid = agFALSE;
590   for(i=0; i<TD_MAX_NUM_PHYS; i++)
591   {
592     tdsaAllShared->eventSource[i].EventValid =  agFALSE;
593     tdsaAllShared->eventSource[i].Source.agPortContext =  agNULL;
594     tdsaAllShared->eventSource[i].Source.event =  0;
595     /* phy ID */
596     tdsaAllShared->eventSource[i].Source.param =  0xFF;
597   } 
598
599
600 #ifdef TD_INTERNAL_DEBUG  /* for debugging only */
601   pEsglAllInfo = (tdsaEsglAllInfo_t *)&(tdsaAllShared->EsglAllInfo);
602 #endif
603
604   /* initialize CardIDString */
605   osti_strcpy(tdsaAllShared->CardIDString,"");
606
607
608 #ifdef FDS_DM
609   tdsaAllShared->dmRoot.tdData = tdsaRoot;
610 #endif    
611             
612 #ifdef FDS_SM
613   tdsaAllShared->smRoot.tdData = tdsaRoot;
614 #endif    
615   
616   /* get card ID */
617   if (tdsaGetCardIDString(tiRoot) == tiError)
618   {
619     TI_DBG1(("tdsaGetCardIDString() failed\n"));
620     return tiError;
621   }
622     
623   /**< initializes jumptable */
624   tdsaJumpTableInit(tiRoot);
625   
626   /**< initializes tdsaPortStartInfo_s including flags */
627   tdssInitSASPortStartInfo(tiRoot);
628   
629   /* resets all the relevant flags */
630   tdsaResetComMemFlags(tiRoot);
631
632   /**< initializes timers */
633   tdsaInitTimers(tiRoot);
634
635   TI_DBG6(("ticominit: ******* before tdsaRoot %p tdsaPortContext %p tdsaDeviceData %p\n", tdsaRoot, tdsaPortContext, tdsaDeviceData));
636   
637
638   /**< initializes tdsaPortContext_t */
639   tdsaPortContextInit(tiRoot);
640
641   /**< initializes devicelist in tdsaPortContext_t */
642   tdsaDeviceDataInit(tiRoot);
643   
644 #ifdef TD_INT_COALESCE
645   tdsaIntCoalCxtInit(tiRoot);
646 #endif
647   
648 #ifdef TD_DISCOVER
649   tdsaExpanderInit(tiRoot);
650 #endif  
651
652   tdsaQueueConfigInit(tiRoot);  
653   
654 #ifdef TD_INTERNAL_DEBUG /* for debugging only */
655   TI_DBG6(("ticominit: temp 1\n"));
656   TDLIST_DEQUEUE_FROM_HEAD(&tdlist_to_fill, &pEsglAllInfo->freelist);
657   /* get the pointer to the page from list pointer */
658   page_to_fill = TDLIST_OBJECT_BASE(tdsaEsglPageInfo_t, tdlist, tdlist_to_fill);
659   TI_DBG6(("ticominit: pageinfo ID %d\n", page_to_fill->id));
660   /* this does not work */
661   TDLIST_ENQUEUE_AT_HEAD(tdlist_to_fill, &pEsglAllInfo->freelist); 
662
663   TI_DBG6(("ticominit: devide\n"));
664   TDLIST_DEQUEUE_FROM_HEAD(&tdlist_to_fill, &pEsglAllInfo->freelist);
665   /* get the pointer to the page from list pointer */
666   page_to_fill = TDLIST_OBJECT_BASE(tdsaEsglPageInfo_t, tdlist, tdlist_to_fill);
667   TDINIT_PRINT("ticominit: second pageinfo ID %d\n", page_to_fill->id);
668
669   TDLIST_ENQUEUE_AT_HEAD(tdlist_to_fill, &pEsglAllInfo->freelist);
670   
671 #endif 
672   
673
674 #ifdef INITIATOR_DRIVER
675   if(initiatorResource != agNULL)
676   {
677     tdsaAllShared->currentOperation |= TD_OPERATION_INITIATOR;
678     TI_DBG5(("tiCOMInit: calling itdssInit\n"));
679     status = itdssInit(tiRoot, initiatorResource, tdSharedMem);
680     
681     if(status != tiSuccess)
682     {
683       TI_DBG1(("tiCOMInit: itdInit FAILED\n"));
684       return status;
685     }
686   }
687 #endif
688
689 #ifdef TARGET_DRIVER
690   if(targetResource != agNULL)
691   {
692     tdsaAllShared->currentOperation |= TD_OPERATION_TARGET;
693     TI_DBG5 (("tiCOMInit: calling ttdssInit\n"));
694     status = ttdssInit(tiRoot, targetResource, tdSharedMem);
695
696     if(status != tiSuccess)
697     {
698       TI_DBG1(("tiCOMInit: ttdInit FAILED\n"));
699       return status;
700     }
701   }
702 #endif
703   
704   return status;
705 }
706
707 /*****************************************************************************
708 *! \brief tdsaLoLevelGetResource
709 *
710 *  Purpose:  This function is called to determine the Transport 
711 *            Dependent Layer internal resource requirement used by the 
712 *            lower layer TSDK.
713 *
714 *  \param  tiRoot:             Pointer to driver/port instance.
715 *  \param  loResource:         Pointer to low level TSDK resource requirement.
716 *
717 *  \return: None
718 *
719 *  \note -  currenlty mem[0] - mem[18] are being used
720 *
721 *****************************************************************************/
722 /*
723   this calls ostiGetTransportParam which parses the configuration file to get
724   parameters.
725 */
726 osGLOBAL void
727 tdsaLoLevelGetResource(
728                        tiRoot_t              * tiRoot, 
729                        tiLoLevelResource_t   * loResource)
730 {
731   agsaRoot_t          agRoot;
732   bit32               usecsPerTick = 0;
733   agsaSwConfig_t      SwConfig;
734   static agsaQueueConfig_t   QueueConfig;
735   static agsaMemoryRequirement_t memRequirement;
736   bit32  maxQueueSets = 0;
737   bit32  maxNumOSLocks = 0;
738   bit32  i;
739   
740   char    *buffer;
741   bit32   buffLen;
742   bit32   lenRecv = 0;
743   char    *pLastUsedChar = agNULL;
744   char    globalStr[]     = "Global";
745   char    iniParmsStr[]   = "InitiatorParms";
746   char    SwParmsStr[]   = "SWParms";
747   char    OBQueueProps[] = "OBQueueProps";
748   char    IBQueueProps[] = "IBQueueProps";
749   
750   static char   IBQueueSize[30];
751   static char   OBQueueSize[30];
752   static char   IBQueueEleSize[30];
753   static char   OBQueueEleSize[30];
754     
755   static char    OBQueueInterruptCount[30]; 
756   static char    OBQueueInterruptDelay[30]; 
757   static char    OBQueueInterruptEnable[30]; 
758   static char    IBQueuePriority[30];
759
760       
761   static char    tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
762   static bit32   InboundQueueSize[AGSA_MAX_OUTBOUND_Q];
763   static bit32   OutboundQueueSize[AGSA_MAX_OUTBOUND_Q];
764   static bit32   InboundQueueEleSize[AGSA_MAX_OUTBOUND_Q];
765   static bit32   OutboundQueueEleSize[AGSA_MAX_OUTBOUND_Q];
766   static bit32   InboundQueuePriority[AGSA_MAX_INBOUND_Q];
767   static bit32   OutboundQueueInterruptDelay[AGSA_MAX_OUTBOUND_Q];
768   static bit32   OutboundQueueInterruptCount[AGSA_MAX_OUTBOUND_Q];
769   static bit32   OutboundQueueInterruptEnable[AGSA_MAX_OUTBOUND_Q];
770   static bit32 cardID = 0;
771   char    CardNum[10];
772   
773 #ifdef FDS_DM
774   dmRoot_t                     dmRoot;
775   dmSwConfig_t                 dmSwConfig;
776   static dmMemoryRequirement_t dmMemRequirement;
777   bit32                        dmUsecsPerTick = 0;
778   bit32                        dmMaxNumLocks = 0;
779 #endif  
780
781 #ifdef FDS_SM
782   smRoot_t                     smRoot;
783   smSwConfig_t                 smSwConfig;
784   static smMemoryRequirement_t smMemRequirement;
785   bit32                        smUsecsPerTick = 0;
786   bit32                        smMaxNumLocks = 0;
787 #endif  
788     
789   TI_DBG1(("tdsaLoLevelGetResource: start \n"));
790   TI_DBG6(("tdsaLoLevelGetResource: loResource %p\n", loResource));
791
792   osti_memset(&agRoot, 0, sizeof(agsaRoot_t));
793   osti_memset(&QueueConfig, 0, sizeof(QueueConfig));
794   osti_memset(&memRequirement, 0, sizeof(memRequirement));
795   osti_memset(InboundQueueSize, 0, sizeof(InboundQueueSize));
796   osti_memset(OutboundQueueSize, 0, sizeof(OutboundQueueSize));
797   osti_memset(InboundQueueEleSize, 0, sizeof(InboundQueueEleSize));
798   osti_memset(OutboundQueueEleSize, 0, sizeof(OutboundQueueEleSize));
799
800   memRequirement.count = 0;
801
802   /* default values which are overwritten later */
803   /* The followings are default values */
804   SwConfig.maxActiveIOs = DEFAULT_MAX_ACTIVE_IOS;
805   SwConfig.numDevHandles = DEFAULT_MAX_DEV;
806   SwConfig.smpReqTimeout = DEFAULT_SMP_TIMEOUT; /* DEFAULT_VALUE; */
807   SwConfig.numberOfEventRegClients = DEFAULT_NUM_REG_CLIENTS; 
808   SwConfig.sizefEventLog1 = HOST_EVENT_LOG_SIZE; /* in KBytes */
809   SwConfig.sizefEventLog2 = HOST_EVENT_LOG_SIZE; /* in KBytes */
810   SwConfig.eventLog1Option = DEFAULT_EVENT_LOG_OPTION;
811   SwConfig.eventLog2Option = DEFAULT_EVENT_LOG_OPTION;
812   SwConfig.fatalErrorInterruptEnable = 1;
813   SwConfig.fatalErrorInterruptVector = 0; /* Was 1 */
814   SwConfig.hostDirectAccessSupport = 0;
815   SwConfig.hostDirectAccessMode = 0;
816   SwConfig.FWConfig = 0;
817   SwConfig.enableDIF = agFALSE;
818   SwConfig.enableEncryption = agFALSE;
819
820 #ifdef SA_CONFIG_MDFD_REGISTRY
821   SwConfig.disableMDF = agFALSE;
822 #endif /*SA_CONFIG_MDFD_REGISTRY*/
823
824 #if defined(SALLSDK_DEBUG)  
825   SwConfig.sallDebugLevel = 1; /* DEFAULT_VALUE; */
826 #endif
827
828
829 #ifdef SA_ENABLE_PCI_TRIGGER
830   SwConfig.PCI_trigger = 0; /* DEFAULT_VALUE; */
831  #endif /* SA_ENABLE_PCI_TRIGGER */
832  
833 #ifdef FDS_DM
834   /* defaults */
835   dmMemRequirement.count = 0;
836   dmSwConfig.numDevHandles = DEFAULT_MAX_DEV;
837 #ifdef DM_DEBUG
838   dmSwConfig.DMDebugLevel = 1;
839 #endif  
840 #endif
841   
842 #ifdef FDS_SM
843   /* defaults */
844   smMemRequirement.count = 0;
845   smSwConfig.maxActiveIOs = DEFAULT_MAX_ACTIVE_IOS;
846   smSwConfig.numDevHandles = DEFAULT_MAX_DEV;
847 #ifdef SM_DEBUG
848   smSwConfig.SMDebugLevel = 1;
849 #endif  
850 #endif
851   
852   buffer = tmpBuffer;
853   buffLen = sizeof(tmpBuffer);
854
855   /* param3 points to QueueConfig; tdsaAllShared does not exit at this point yet */
856   SwConfig.param3 = (void *)&QueueConfig;
857
858   osti_memset(buffer, 0, buffLen);
859   lenRecv = 0;
860   
861   if ((ostiGetTransportParam(
862                              tiRoot, 
863                              globalStr,
864                              iniParmsStr,
865                              agNULL,
866                              agNULL,
867                              agNULL, 
868                              agNULL, 
869                              "MaxTargets",
870                              buffer, 
871                              buffLen, 
872                              &lenRecv
873                              ) == tiSuccess) && (lenRecv != 0))
874   {
875     if (osti_strncmp(buffer, "0x", 2) == 0)
876     { 
877       SwConfig.numDevHandles = osti_strtoul (buffer, &pLastUsedChar, 0);
878     }
879     else
880     {
881       SwConfig.numDevHandles = osti_strtoul (buffer, &pLastUsedChar, 10);
882     }
883    TI_DBG2(("tdsaLoLevelGetResource: MaxTargets %d\n",  SwConfig.numDevHandles));
884   }
885   
886    
887   /*                                                              
888    * read the NumInboundQueue parameter
889    */
890   osti_memset(buffer, 0, buffLen);
891   lenRecv = 0;
892
893   QueueConfig.numInboundQueues = DEFAULT_NUM_INBOUND_QUEUE;  /* default 1 Inbound queue */
894
895   if ((ostiGetTransportParam(
896                              tiRoot, 
897                              globalStr,   /* key */
898                              SwParmsStr,  /* subkey1 */
899                              agNULL,      /* subkey2 */
900                              agNULL,
901                              agNULL, 
902                              agNULL,      /* subkey5 */
903                              "NumInboundQueues", /* valueName */
904                              buffer, 
905                              buffLen, 
906                              &lenRecv
907                              ) == tiSuccess) && (lenRecv != 0))
908   {
909     if (osti_strncmp(buffer, "0x", 2) == 0)
910     { 
911       QueueConfig.numInboundQueues = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
912     }
913     else
914     {
915       QueueConfig.numInboundQueues = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
916     }
917
918     if (QueueConfig.numInboundQueues > AGSA_MAX_INBOUND_Q)
919     {
920       QueueConfig.numInboundQueues = AGSA_MAX_INBOUND_Q;
921     }
922   }
923
924   /*                                                              
925    * read the NumOutboundQueue parameter
926    */
927   osti_memset(buffer, 0, buffLen);
928   lenRecv = 0;
929   
930   QueueConfig.numOutboundQueues = DEFAULT_NUM_OUTBOUND_QUEUE;  /* default 1 Outbound queue */
931
932   if ((ostiGetTransportParam(
933                              tiRoot, 
934                              globalStr,   /* key */
935                              SwParmsStr,  /* subkey1 */
936                              agNULL,      /* subkey2 */
937                              agNULL,
938                              agNULL, 
939                              agNULL,      /* subkey5 */
940                              "NumOutboundQueues", /* valueName */
941                              buffer, 
942                              buffLen, 
943                              &lenRecv
944                              ) == tiSuccess) && (lenRecv != 0))
945   {
946     if (osti_strncmp(buffer, "0x", 2) == 0)
947     { 
948       QueueConfig.numOutboundQueues = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
949     }
950     else
951     {
952       QueueConfig.numOutboundQueues = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
953     }
954
955     if (QueueConfig.numOutboundQueues > AGSA_MAX_OUTBOUND_Q)
956     {
957       QueueConfig.numOutboundQueues = AGSA_MAX_OUTBOUND_Q;
958     }
959   }
960        
961   /*                                                              
962    * read the MaxActiveIO parameter
963    */
964   osti_memset(buffer, 0, buffLen);
965   lenRecv = 0;
966   
967   
968   if ((ostiGetTransportParam(
969                              tiRoot, 
970                              globalStr,   /* key */
971                              SwParmsStr,  /* subkey1 */
972                              agNULL,      /* subkey2 */
973                              agNULL,
974                              agNULL, 
975                              agNULL,      /* subkey5 */
976                              "MaxActiveIO", /* valueName */
977                              buffer, 
978                              buffLen, 
979                              &lenRecv
980                              ) == tiSuccess) && (lenRecv != 0))
981   {
982     if (osti_strncmp(buffer, "0x", 2) == 0)
983     { 
984       SwConfig.maxActiveIOs = osti_strtoul (buffer, &pLastUsedChar, 0);
985     }
986     else
987     {
988       SwConfig.maxActiveIOs = osti_strtoul (buffer, &pLastUsedChar, 10);
989     }
990   }
991
992
993   
994   /*                                                              
995    * read the SMPTO parameter (SMP Timeout)
996    */
997   osti_memset(buffer, 0, buffLen);
998   lenRecv = 0;
999   
1000   if ((ostiGetTransportParam(
1001                              tiRoot, 
1002                              globalStr,   /* key */
1003                              SwParmsStr,  /* subkey1 */
1004                              agNULL,      /* subkey2 */
1005                              agNULL,
1006                              agNULL, 
1007                              agNULL,      /* subkey5 */
1008                              "SMPTO", /* valueName */
1009                              buffer, 
1010                              buffLen, 
1011                              &lenRecv
1012                              ) == tiSuccess) && (lenRecv != 0))
1013   {
1014     if (osti_strncmp(buffer, "0x", 2) == 0)
1015     { 
1016       SwConfig.smpReqTimeout = osti_strtoul (buffer, &pLastUsedChar, 0);
1017     }
1018     else
1019     {
1020       SwConfig.smpReqTimeout = osti_strtoul (buffer, &pLastUsedChar, 10);
1021     }
1022   }
1023   
1024   /*                                                              
1025    * read the NumRegClients parameter
1026    */
1027   osti_memset(buffer, 0, buffLen);
1028   lenRecv = 0;
1029   
1030   if ((ostiGetTransportParam(
1031                              tiRoot, 
1032                              globalStr,   /* key */
1033                              SwParmsStr,  /* subkey1 */
1034                              agNULL,      /* subkey2 */
1035                              agNULL,
1036                              agNULL, 
1037                              agNULL,      /* subkey5 */
1038                              "NumRegClients", /* valueName */
1039                              buffer, 
1040                              buffLen, 
1041                              &lenRecv
1042                              ) == tiSuccess) && (lenRecv != 0))
1043   {
1044     if (osti_strncmp(buffer, "0x", 2) == 0)
1045     { 
1046       SwConfig.numberOfEventRegClients = osti_strtoul (buffer, &pLastUsedChar, 0);
1047     }
1048     else
1049     {
1050       SwConfig.numberOfEventRegClients = osti_strtoul (buffer, &pLastUsedChar, 10);
1051     }
1052   }
1053
1054 #if defined(SALLSDK_DEBUG)  
1055   osti_memset(buffer, 0, buffLen);
1056   lenRecv = 0;
1057
1058   if ((ostiGetTransportParam(
1059                              tiRoot, 
1060                              globalStr,   /* key */
1061                              SwParmsStr,  /* subkey1 */
1062                              agNULL,      /* subkey2 */
1063                              agNULL,
1064                              agNULL, 
1065                              agNULL,      /* subkey5 */
1066                              "LLDebugLevel", /* valueName */
1067                              buffer, 
1068                              buffLen, 
1069                              &lenRecv
1070                              ) == tiSuccess) && (lenRecv != 0))
1071   {
1072     if (osti_strncmp(buffer, "0x", 2) == 0)
1073     { 
1074       SwConfig.sallDebugLevel = osti_strtoul (buffer, &pLastUsedChar, 0);
1075     }
1076     else
1077     {
1078       SwConfig.sallDebugLevel = osti_strtoul (buffer, &pLastUsedChar, 10);
1079     }
1080   }
1081 #endif  
1082
1083
1084 #if defined(DM_DEBUG)  
1085   osti_memset(buffer, 0, buffLen);
1086   lenRecv = 0;
1087
1088   if ((ostiGetTransportParam(
1089                              tiRoot, 
1090                              globalStr,   /* key */
1091                              SwParmsStr,  /* subkey1 */
1092                              agNULL,      /* subkey2 */
1093                              agNULL,
1094                              agNULL, 
1095                              agNULL,      /* subkey5 */
1096                              "DMDebugLevel", /* valueName */
1097                              buffer, 
1098                              buffLen, 
1099                              &lenRecv
1100                              ) == tiSuccess) && (lenRecv != 0))
1101   {
1102     if (osti_strncmp(buffer, "0x", 2) == 0)
1103     { 
1104       dmSwConfig.DMDebugLevel = osti_strtoul (buffer, &pLastUsedChar, 0);
1105     }
1106     else
1107     {
1108       dmSwConfig.DMDebugLevel = osti_strtoul (buffer, &pLastUsedChar, 10);
1109     }
1110   }
1111 #endif  
1112
1113 #if defined(SM_DEBUG)  
1114   osti_memset(buffer, 0, buffLen);
1115   lenRecv = 0;
1116
1117   if ((ostiGetTransportParam(
1118                              tiRoot, 
1119                              globalStr,   /* key */
1120                              SwParmsStr,  /* subkey1 */
1121                              agNULL,      /* subkey2 */
1122                              agNULL,
1123                              agNULL, 
1124                              agNULL,      /* subkey5 */
1125                              "SMDebugLevel", /* valueName */
1126                              buffer, 
1127                              buffLen, 
1128                              &lenRecv
1129                              ) == tiSuccess) && (lenRecv != 0))
1130   {
1131     if (osti_strncmp(buffer, "0x", 2) == 0)
1132     { 
1133       smSwConfig.SMDebugLevel = osti_strtoul (buffer, &pLastUsedChar, 0);
1134     }
1135     else
1136     {
1137       smSwConfig.SMDebugLevel = osti_strtoul (buffer, &pLastUsedChar, 10);
1138     }
1139   }
1140 #endif  
1141         
1142   osti_memset(buffer, 0, buffLen);
1143   lenRecv = 0;
1144
1145   for (i=0;i<QueueConfig.numInboundQueues;i++)
1146   {
1147     osti_sprintf(IBQueueSize,"IBQueueNumElements%d", i);
1148     osti_sprintf(IBQueueEleSize,"IBQueueElementSize%d", i);
1149     osti_sprintf(IBQueuePriority,"IBQueuePriority%d", i);
1150     
1151     
1152     
1153     /*
1154      * read the IBQueueSize
1155      */
1156     osti_memset(buffer, 0, buffLen);
1157     lenRecv = 0;
1158         
1159     InboundQueueSize[i] = DEFAULT_INBOUND_QUEUE_SIZE;  /* default 256 Inbound queue size */
1160   
1161     if ((ostiGetTransportParam(
1162                              tiRoot, 
1163                              globalStr,   /* key */
1164                              SwParmsStr,  /* subkey1 */
1165                              IBQueueProps,      /* subkey2 */
1166                              agNULL,
1167                              agNULL, 
1168                              agNULL,      /* subkey5 */
1169                              IBQueueSize, /* valueName */
1170                              buffer, 
1171                              buffLen, 
1172                              &lenRecv
1173                              ) == tiSuccess) && (lenRecv != 0))
1174     {
1175       if (osti_strncmp(buffer, "0x", 2) == 0)
1176       { 
1177         InboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1178       }
1179       else
1180       {
1181         InboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1182         TI_DBG6(("tdsaLoLevelGetResource: queue number %d IB queue size %d\n", i, InboundQueueSize[i]));        
1183       }
1184     }
1185
1186
1187     /*
1188      * read the IBQueueEleSize
1189      */
1190     osti_memset(buffer, 0, buffLen);
1191     lenRecv = 0;
1192         
1193     InboundQueueEleSize[i] = DEFAULT_INBOUND_QUEUE_ELE_SIZE;  /* default 128 Inbound queue element */
1194   
1195     if ((ostiGetTransportParam(
1196                              tiRoot, 
1197                              globalStr,   /* key */
1198                              SwParmsStr,  /* subkey1 */
1199                              IBQueueProps,      /* subkey2 */
1200                              agNULL,
1201                              agNULL, 
1202                              agNULL,      /* subkey5 */
1203                              IBQueueEleSize, /* valueName */
1204                              buffer, 
1205                              buffLen, 
1206                              &lenRecv
1207                              ) == tiSuccess) && (lenRecv != 0))
1208     {
1209       if (osti_strncmp(buffer, "0x", 2) == 0)
1210       { 
1211         InboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1212       }
1213       else
1214       {
1215         InboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1216         TI_DBG6(("tdsaLoLevelGetResource: queue number %d IB queue ele size %d\n", i, InboundQueueEleSize[i]));        
1217       }
1218     }
1219    
1220     /*
1221      * read the IBQueuePriority
1222      */
1223   
1224     osti_memset(buffer, 0, buffLen);
1225     lenRecv = 0;
1226
1227     InboundQueuePriority[i] = DEFAULT_INBOUND_QUEUE_PRIORITY; /* default 0 Inbound queue priority */
1228   
1229     if ((ostiGetTransportParam(
1230                              tiRoot, 
1231                              globalStr,   /* key */
1232                              SwParmsStr,  /* subkey1 */
1233                              IBQueueProps,/* subkey2 */
1234                              agNULL,
1235                              agNULL, 
1236                              agNULL,      /* subkey5 */
1237                              IBQueuePriority, /* valueName */
1238                              buffer, 
1239                              buffLen, 
1240                              &lenRecv
1241                              ) == tiSuccess) && (lenRecv != 0))
1242     {
1243       if (osti_strncmp(buffer, "0x", 2) == 0)
1244       { 
1245         InboundQueuePriority[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1246       }
1247       else
1248       {
1249         InboundQueuePriority[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1250         TI_DBG6(("tdsaLoLevelGetResource: queue number %d priority %d\n", i, InboundQueuePriority[i]));        
1251       }
1252     }
1253       
1254     /**********************************************/            
1255     osti_memset(buffer, 0, buffLen);
1256     lenRecv = 0;
1257   }/* end of loop */
1258     
1259
1260   osti_memset(buffer, 0, buffLen);
1261   lenRecv = 0;
1262
1263   for (i=0;i<QueueConfig.numOutboundQueues;i++)
1264   {
1265     osti_sprintf(OBQueueSize,"OBQueueNumElements%d", i);
1266     osti_sprintf(OBQueueEleSize,"OBQueueElementSize%d", i);
1267     osti_sprintf(OBQueueInterruptDelay,"OBQueueInterruptDelay%d", i);
1268     osti_sprintf(OBQueueInterruptCount,"OBQueueInterruptCount%d", i);
1269     osti_sprintf(OBQueueInterruptEnable,"OBQueueInterruptEnable%d", i);
1270
1271     /*
1272      * read the OBQueueSize
1273      */
1274     osti_memset(buffer, 0, buffLen);
1275     lenRecv = 0;
1276         
1277     OutboundQueueSize[i] = DEFAULT_OUTBOUND_QUEUE_SIZE;  /* default 256 Outbound queue size */
1278   
1279     if ((ostiGetTransportParam(
1280                              tiRoot, 
1281                              globalStr,   /* key */
1282                              SwParmsStr,  /* subkey1 */
1283                              OBQueueProps,      /* subkey2 */
1284                              agNULL,
1285                              agNULL, 
1286                              agNULL,      /* subkey5 */
1287                              OBQueueSize, /* valueName */
1288                              buffer, 
1289                              buffLen, 
1290                              &lenRecv
1291                              ) == tiSuccess) && (lenRecv != 0))
1292     {
1293       if (osti_strncmp(buffer, "0x", 2) == 0)
1294       { 
1295         OutboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1296       }
1297       else
1298       {
1299         OutboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1300         TI_DBG6(("tdsaLoLevelGetResource: queue number %d OB queue size %d\n", i, OutboundQueueSize[i]));        
1301       }
1302     }
1303
1304
1305     /*
1306      * read the OBQueueEleSize
1307      */
1308     osti_memset(buffer, 0, buffLen);
1309     lenRecv = 0;
1310         
1311     OutboundQueueEleSize[i] = DEFAULT_OUTBOUND_QUEUE_ELE_SIZE;  /* default 128 Outbound queue element */
1312   
1313     if ((ostiGetTransportParam(
1314                              tiRoot, 
1315                              globalStr,   /* key */
1316                              SwParmsStr,  /* subkey1 */
1317                              OBQueueProps,      /* subkey2 */
1318                              agNULL,
1319                              agNULL, 
1320                              agNULL,      /* subkey5 */
1321                              OBQueueEleSize, /* valueName */
1322                              buffer, 
1323                              buffLen, 
1324                              &lenRecv
1325                              ) == tiSuccess) && (lenRecv != 0))
1326     {
1327       if (osti_strncmp(buffer, "0x", 2) == 0)
1328       { 
1329         OutboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1330       }
1331       else
1332       {
1333         OutboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1334         TI_DBG6(("tdsaLoLevelGetResource: queue number %d OB queue ele size %d\n", i, OutboundQueueEleSize[i]));        
1335       }
1336     }
1337
1338     /*
1339      * read the OBQueueInterruptDelay
1340      */
1341     osti_memset(buffer, 0, buffLen);
1342     lenRecv = 0;
1343
1344     OutboundQueueInterruptDelay[i] = DEFAULT_OUTBOUND_QUEUE_INTERRUPT_DELAY;  /* default 1 Outbound interrupt delay */
1345   
1346     if ((ostiGetTransportParam(
1347                              tiRoot, 
1348                              globalStr,   /* key */
1349                              SwParmsStr,  /* subkey1 */
1350                              OBQueueProps,      /* subkey2 */
1351                              agNULL,
1352                              agNULL, 
1353                              agNULL,      /* subkey5 */
1354                              OBQueueInterruptDelay, /* valueName */
1355                              buffer, 
1356                              buffLen, 
1357                              &lenRecv
1358                              ) == tiSuccess) && (lenRecv != 0))
1359     {
1360       if (osti_strncmp(buffer, "0x", 2) == 0)
1361       { 
1362         OutboundQueueInterruptDelay[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1363       }
1364       else
1365       {
1366         OutboundQueueInterruptDelay[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1367         TI_DBG6(("tdsaLoLevelGetResource: queue number %d interrupt delay %d\n", i, OutboundQueueInterruptDelay[i]));        
1368       }
1369     }
1370   
1371     /*
1372      * read the OBQueueInterruptCount
1373      */
1374   
1375     osti_memset(buffer, 0, buffLen);
1376     lenRecv = 0;
1377
1378     OutboundQueueInterruptCount[i] = DEFAULT_OUTBOUND_QUEUE_INTERRUPT_COUNT;  /* default 1 Outbound interrupt count */
1379   
1380     if ((ostiGetTransportParam(
1381                              tiRoot, 
1382                              globalStr,   /* key */
1383                              SwParmsStr,  /* subkey1 */
1384                              OBQueueProps,      /* subkey2 */
1385                              agNULL,
1386                              agNULL, 
1387                              agNULL,      /* subkey5 */
1388                              OBQueueInterruptCount, /* valueName */
1389                              buffer, 
1390                              buffLen, 
1391                              &lenRecv
1392                              ) == tiSuccess) && (lenRecv != 0))
1393     {
1394       if (osti_strncmp(buffer, "0x", 2) == 0)
1395       { 
1396         OutboundQueueInterruptCount[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1397       }
1398       else
1399       {
1400         OutboundQueueInterruptCount[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1401         TI_DBG6(("tdsaLoLevelGetResource: queue number %d interrupt count %d\n", i, OutboundQueueInterruptCount[i]));        
1402       }
1403     }
1404     
1405     /*
1406      * read the OBQueueInterruptEnable
1407      */
1408      
1409     osti_memset(buffer, 0, buffLen);
1410     lenRecv = 0;
1411     
1412     OutboundQueueInterruptEnable[i] = DEFAULT_OUTBOUND_INTERRUPT_ENABLE;  /* default 1 Outbound interrupt is enabled */
1413   
1414     if ((ostiGetTransportParam(
1415                              tiRoot, 
1416                              globalStr,   /* key */
1417                              SwParmsStr,  /* subkey1 */
1418                              OBQueueProps,      /* subkey2 */
1419                              agNULL,
1420                              agNULL, 
1421                              agNULL,      /* subkey5 */
1422                              OBQueueInterruptEnable, /* valueName */
1423                              buffer, 
1424                              buffLen, 
1425                              &lenRecv
1426                              ) == tiSuccess) && (lenRecv != 0))
1427     {
1428       if (osti_strncmp(buffer, "0x", 2) == 0)
1429       { 
1430         OutboundQueueInterruptEnable[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1431 #ifdef SPC_POLLINGMODE
1432         OutboundQueueInterruptEnable[i] = 0;
1433 #endif /* SPC_POLLINGMODE */
1434
1435       }
1436       else
1437       {
1438         OutboundQueueInterruptEnable[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1439 #ifdef SPC_POLLINGMODE
1440         OutboundQueueInterruptEnable[i] = 0;
1441 #endif /* SPC_POLLINGMODE */
1442       }
1443     TI_DBG2(("tdsaLoLevelGetResource: queue number %d interrupt enable %d\n", i, OutboundQueueInterruptEnable[i]));        
1444     }
1445     
1446     /**********************************************/            
1447     osti_memset(buffer, 0, buffLen);
1448     lenRecv = 0;
1449
1450   }/* end of loop */   
1451       
1452       
1453       
1454   /************************************************************
1455    * READ CARD Specific
1456   */
1457   osti_memset(buffer, 0, buffLen);
1458   lenRecv = 0;
1459
1460   for (i=0;i<QueueConfig.numInboundQueues;i++)
1461   {
1462     osti_sprintf(CardNum,"CardNum%d", cardID);  
1463     osti_sprintf(IBQueueSize,"IBQueueNumElements%d", i);
1464     osti_sprintf(IBQueueEleSize,"IBQueueElementSize%d", i);
1465     osti_sprintf(IBQueuePriority,"IBQueuePriority%d", i);
1466
1467     /*
1468      * read the IBQueueSize
1469      */
1470     osti_memset(buffer, 0, buffLen);
1471     lenRecv = 0;
1472
1473     if ((ostiGetTransportParam(
1474                              tiRoot, 
1475                              CardNum,   /* key */
1476                              SwParmsStr,  /* subkey1 */
1477                              IBQueueProps,      /* subkey2 */
1478                              agNULL,
1479                              agNULL, 
1480                              agNULL,      /* subkey5 */
1481                              IBQueueSize, /* valueName */
1482                              buffer, 
1483                              buffLen, 
1484                              &lenRecv
1485                              ) == tiSuccess) && (lenRecv != 0))
1486     {
1487       if (osti_strncmp(buffer, "0x", 2) == 0)
1488       { 
1489         InboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1490       }
1491       else
1492       {
1493         InboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1494         TI_DBG6(("tdsaLoLevelGetResource: queue number %d IB queue size %d\n", i, InboundQueueSize[i]));        
1495       }
1496     }
1497
1498
1499     /*
1500      * read the IBQueueEleSize
1501      */
1502     osti_memset(buffer, 0, buffLen);
1503     lenRecv = 0;
1504         
1505     if ((ostiGetTransportParam(
1506                              tiRoot, 
1507                              CardNum,   /* key */
1508                              SwParmsStr,  /* subkey1 */
1509                              IBQueueProps,      /* subkey2 */
1510                              agNULL,
1511                              agNULL, 
1512                              agNULL,      /* subkey5 */
1513                              IBQueueEleSize, /* valueName */
1514                              buffer, 
1515                              buffLen, 
1516                              &lenRecv
1517                              ) == tiSuccess) && (lenRecv != 0))
1518     {
1519       if (osti_strncmp(buffer, "0x", 2) == 0)
1520       { 
1521         InboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1522       }
1523       else
1524       {
1525         InboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1526         TI_DBG6(("tdsaLoLevelGetResource: queue number %d IB queue size %d\n", i, InboundQueueEleSize[i]));        
1527       }
1528     }
1529
1530     /*
1531      * read the IBQueuePriority
1532      */
1533   
1534     osti_memset(buffer, 0, buffLen);
1535     lenRecv = 0;
1536     if ((ostiGetTransportParam(
1537                              tiRoot, 
1538                              CardNum,   /* key */
1539                              SwParmsStr,  /* subkey1 */
1540                              IBQueueProps,/* subkey2 */
1541                              agNULL,
1542                              agNULL, 
1543                              agNULL,      /* subkey5 */
1544                              IBQueuePriority, /* valueName */
1545                              buffer, 
1546                              buffLen, 
1547                              &lenRecv
1548                              ) == tiSuccess) && (lenRecv != 0))
1549     {
1550       if (osti_strncmp(buffer, "0x", 2) == 0)
1551       { 
1552         InboundQueuePriority[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1553       }
1554       else
1555       {
1556         InboundQueuePriority[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1557         TI_DBG6(("tdsaLoLevelGetResource: card number %d queue number %d priority %d\n", cardID, i, InboundQueuePriority[i]));        
1558       }
1559     }
1560       
1561     /**********************************************/            
1562     osti_memset(buffer, 0, buffLen);
1563     lenRecv = 0;
1564   }/* end of loop */
1565           
1566
1567                               
1568   osti_memset(buffer, 0, buffLen);
1569   lenRecv = 0;
1570
1571   for (i=0;i<QueueConfig.numOutboundQueues;i++)
1572   {
1573     osti_sprintf(CardNum,"CardNum%d", cardID);  
1574     osti_sprintf(OBQueueSize,"OBQueueNumElements%d", i);
1575     osti_sprintf(OBQueueEleSize,"OBQueueElementSize%d", i);
1576     osti_sprintf(OBQueueInterruptDelay,"OBQueueInterruptDelay%d", i);
1577     osti_sprintf(OBQueueInterruptCount,"OBQueueInterruptCount%d", i);
1578     osti_sprintf(OBQueueInterruptEnable,"OBQueueInterruptEnable%d", i);
1579     
1580     /*
1581      * read the OBQueueSize
1582      */
1583     osti_memset(buffer, 0, buffLen);
1584     lenRecv = 0;
1585         
1586     if ((ostiGetTransportParam(
1587                              tiRoot, 
1588                              CardNum,   /* key */
1589                              SwParmsStr,  /* subkey1 */
1590                              OBQueueProps,      /* subkey2 */
1591                              agNULL,
1592                              agNULL, 
1593                              agNULL,      /* subkey5 */
1594                              OBQueueSize, /* valueName */
1595                              buffer, 
1596                              buffLen, 
1597                              &lenRecv
1598                              ) == tiSuccess) && (lenRecv != 0))
1599     {
1600       if (osti_strncmp(buffer, "0x", 2) == 0)
1601       { 
1602         OutboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1603       }
1604       else
1605       {
1606         OutboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1607         TI_DBG6(("tdsaLoLevelGetResource: queue number %d OB queue size %d\n", i, OutboundQueueSize[i]));        
1608       }
1609     }
1610
1611
1612     /*
1613      * read the OBQueueEleSize
1614      */
1615     osti_memset(buffer, 0, buffLen);
1616     lenRecv = 0;
1617         
1618     if ((ostiGetTransportParam(
1619                              tiRoot, 
1620                              CardNum,   /* key */
1621                              SwParmsStr,  /* subkey1 */
1622                              OBQueueProps,      /* subkey2 */
1623                              agNULL,
1624                              agNULL, 
1625                              agNULL,      /* subkey5 */
1626                              OBQueueEleSize, /* valueName */
1627                              buffer, 
1628                              buffLen, 
1629                              &lenRecv
1630                              ) == tiSuccess) && (lenRecv != 0))
1631     {
1632       if (osti_strncmp(buffer, "0x", 2) == 0)
1633       { 
1634         OutboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1635       }
1636       else
1637       {
1638         OutboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1639         TI_DBG6(("tdsaLoLevelGetResource: queue number %d OB queue ele size %d\n", i, OutboundQueueEleSize[i]));        
1640       }
1641     }
1642
1643     /*
1644      * read the OBQueueInterruptDelay
1645      */
1646     osti_memset(buffer, 0, buffLen);
1647     lenRecv = 0;
1648   
1649     if ((ostiGetTransportParam(
1650                              tiRoot, 
1651                              CardNum,   /* key */
1652                              SwParmsStr,  /* subkey1 */
1653                              OBQueueProps,      /* subkey2 */
1654                              agNULL,
1655                              agNULL, 
1656                              agNULL,      /* subkey5 */
1657                              OBQueueInterruptDelay, /* valueName */
1658                              buffer, 
1659                              buffLen, 
1660                              &lenRecv
1661                              ) == tiSuccess) && (lenRecv != 0))
1662     {
1663       if (osti_strncmp(buffer, "0x", 2) == 0)
1664       { 
1665         OutboundQueueInterruptDelay[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1666       }
1667       else
1668       {
1669         OutboundQueueInterruptDelay[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1670         TI_DBG6(("tdsaLoLevelGetResource: card number %d queue number %d interrupt delay %d\n", cardID, i, OutboundQueueInterruptDelay[i]));        
1671       }
1672     }
1673   
1674     /*
1675      * read the OBQueueInterruptCount
1676      */
1677   
1678     osti_memset(buffer, 0, buffLen);
1679     lenRecv = 0;
1680     if ((ostiGetTransportParam(
1681                              tiRoot, 
1682                              CardNum,   /* key */
1683                              SwParmsStr,  /* subkey1 */
1684                              OBQueueProps,      /* subkey2 */
1685                              agNULL,
1686                              agNULL, 
1687                              agNULL,      /* subkey5 */
1688                              OBQueueInterruptCount, /* valueName */
1689                              buffer, 
1690                              buffLen, 
1691                              &lenRecv
1692                              ) == tiSuccess) && (lenRecv != 0))
1693     {
1694       if (osti_strncmp(buffer, "0x", 2) == 0)
1695       { 
1696         OutboundQueueInterruptCount[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1697       }
1698       else
1699       {
1700         OutboundQueueInterruptCount[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1701         TI_DBG6(("tdsaLoLevelGetResource: card number %d queue number %d interrupt count %d\n", cardID, i, OutboundQueueInterruptCount[i]));        
1702       }
1703     }
1704     
1705     /*
1706      * read the OBQueueInterruptEnable
1707      */
1708   
1709     osti_memset(buffer, 0, buffLen);
1710     lenRecv = 0;
1711     if ((ostiGetTransportParam(
1712                              tiRoot, 
1713                              CardNum,   /* key */
1714                              SwParmsStr,  /* subkey1 */
1715                              OBQueueProps,      /* subkey2 */
1716                              agNULL,
1717                              agNULL, 
1718                              agNULL,      /* subkey5 */
1719                              OBQueueInterruptEnable, /* valueName */
1720                              buffer, 
1721                              buffLen, 
1722                              &lenRecv
1723                              ) == tiSuccess) && (lenRecv != 0))
1724     {
1725       if (osti_strncmp(buffer, "0x", 2) == 0)
1726       { 
1727         OutboundQueueInterruptEnable[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
1728 #ifdef SPC_POLLINGMODE
1729         OutboundQueueInterruptEnable[i] = 0;
1730 #endif /* SPC_POLLINGMODE */
1731
1732       }
1733       else
1734       {
1735         OutboundQueueInterruptEnable[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
1736 #ifdef SPC_POLLINGMODE
1737         OutboundQueueInterruptEnable[i] = 0;
1738 #endif /* SPC_POLLINGMODE */
1739       }
1740       TI_DBG2(("tdsaLoLevelGetResource: card number %d queue number %d interrupt count %d\n", cardID, i, OutboundQueueInterruptEnable[i]));        
1741     }
1742     
1743     
1744     /**********************************************/            
1745     osti_memset(buffer, 0, buffLen);
1746     lenRecv = 0;
1747
1748   }/* end of loop */   
1749                                                
1750                                                                                                                                                                                                                                                                                                  
1751   TI_DBG6(("tdsaLoLevelGetResource: \n"));
1752   tdsaPrintSwConfig(&SwConfig);
1753
1754   /* fills in queue related parameters */
1755   for (i=0;i<QueueConfig.numInboundQueues;i++)
1756   {
1757     QueueConfig.inboundQueues[i].elementCount = InboundQueueSize[i];
1758     QueueConfig.inboundQueues[i].elementSize = InboundQueueEleSize[i];
1759     QueueConfig.inboundQueues[i].priority = InboundQueuePriority[i];    
1760   }
1761   for (i=0;i<QueueConfig.numOutboundQueues;i++)
1762   {
1763     QueueConfig.outboundQueues[i].elementCount = OutboundQueueSize[i];
1764     QueueConfig.outboundQueues[i].elementSize = OutboundQueueEleSize[i]; 
1765     QueueConfig.outboundQueues[i].interruptDelay = OutboundQueueInterruptDelay[i]; 
1766     QueueConfig.outboundQueues[i].interruptCount = OutboundQueueInterruptCount[i]; 
1767     QueueConfig.outboundQueues[i].interruptEnable = OutboundQueueInterruptEnable[i]; 
1768   }
1769   
1770   
1771   /* process event log related parameters */
1772   osti_memset(buffer, 0, buffLen);
1773   lenRecv = 0;
1774   
1775   
1776   if ((ostiGetTransportParam(
1777                              tiRoot, 
1778                              globalStr,   /* key */
1779                              SwParmsStr,  /* subkey1 */
1780                              agNULL,      /* subkey2 */
1781                              agNULL,
1782                              agNULL, 
1783                              agNULL,      /* subkey5 */
1784                              "EventLogSize1", /* valueName */
1785                              buffer, 
1786                              buffLen, 
1787                              &lenRecv
1788                              ) == tiSuccess) && (lenRecv != 0))
1789   {
1790     if (osti_strncmp(buffer, "0x", 2) == 0)
1791     { 
1792       SwConfig.sizefEventLog1 = osti_strtoul (buffer, &pLastUsedChar, 0);
1793     }
1794     else
1795     {
1796       SwConfig.sizefEventLog1 = osti_strtoul (buffer, &pLastUsedChar, 10);
1797     }
1798   }
1799
1800   osti_memset(buffer, 0, buffLen);
1801   lenRecv = 0;
1802   
1803   
1804   if ((ostiGetTransportParam(
1805                              tiRoot, 
1806                              globalStr,   /* key */
1807                              SwParmsStr,  /* subkey1 */
1808                              agNULL,      /* subkey2 */
1809                              agNULL,
1810                              agNULL, 
1811                              agNULL,      /* subkey5 */
1812                              "EventLogOption1", /* valueName */
1813                              buffer, 
1814                              buffLen, 
1815                              &lenRecv
1816                              ) == tiSuccess) && (lenRecv != 0))
1817   {
1818     if (osti_strncmp(buffer, "0x", 2) == 0)
1819     { 
1820       SwConfig.eventLog1Option = osti_strtoul (buffer, &pLastUsedChar, 0);
1821     }
1822     else
1823     {
1824       SwConfig.eventLog1Option = osti_strtoul (buffer, &pLastUsedChar, 10);
1825     }
1826   }
1827
1828   osti_memset(buffer, 0, buffLen);
1829   lenRecv = 0;
1830   
1831   
1832   if ((ostiGetTransportParam(
1833                              tiRoot, 
1834                              globalStr,   /* key */
1835                              SwParmsStr,  /* subkey1 */
1836                              agNULL,      /* subkey2 */
1837                              agNULL,
1838                              agNULL, 
1839                              agNULL,      /* subkey5 */
1840                              "EventLogSize2", /* valueName */ /* size in K Dwords  */
1841                              buffer, 
1842                              buffLen, 
1843                              &lenRecv
1844                              ) == tiSuccess) && (lenRecv != 0))
1845   {
1846     if (osti_strncmp(buffer, "0x", 2) == 0)
1847     { 
1848       SwConfig.sizefEventLog2 = osti_strtoul (buffer, &pLastUsedChar, 0);
1849     }
1850     else
1851     {
1852       SwConfig.sizefEventLog2 = osti_strtoul (buffer, &pLastUsedChar, 10);
1853     }
1854   }
1855
1856   osti_memset(buffer, 0, buffLen);
1857   lenRecv = 0;
1858   
1859   
1860   if ((ostiGetTransportParam(
1861                              tiRoot, 
1862                              globalStr,   /* key */
1863                              SwParmsStr,  /* subkey1 */
1864                              agNULL,      /* subkey2 */
1865                              agNULL,
1866                              agNULL, 
1867                              agNULL,      /* subkey5 */
1868                              "EventLogOption2", /* valueName */
1869                              buffer, 
1870                              buffLen, 
1871                              &lenRecv
1872                              ) == tiSuccess) && (lenRecv != 0))
1873   {
1874     if (osti_strncmp(buffer, "0x", 2) == 0)
1875     { 
1876       SwConfig.eventLog2Option = osti_strtoul (buffer, &pLastUsedChar, 0);
1877     }
1878     else
1879     {
1880       SwConfig.eventLog2Option = osti_strtoul (buffer, &pLastUsedChar, 10);
1881     }
1882   }
1883   /* end of event log related parameters */
1884
1885   /*
1886     HDA parameters
1887   */
1888   osti_memset(buffer, 0, buffLen);
1889   lenRecv = 0;
1890   
1891   
1892   if ((ostiGetTransportParam(
1893                              tiRoot, 
1894                              globalStr,   /* key */
1895                              SwParmsStr,  /* subkey1 */
1896                              agNULL,      /* subkey2 */
1897                              agNULL,
1898                              agNULL, 
1899                              agNULL,      /* subkey5 */
1900                              "HDASupport", /* valueName */
1901                              buffer, 
1902                              buffLen, 
1903                              &lenRecv
1904                              ) == tiSuccess) && (lenRecv != 0))
1905   {
1906     if (osti_strncmp(buffer, "0x", 2) == 0)
1907     { 
1908       SwConfig.hostDirectAccessSupport = osti_strtoul (buffer, &pLastUsedChar, 0);
1909     }
1910     else
1911     {
1912       SwConfig.hostDirectAccessSupport = osti_strtoul (buffer, &pLastUsedChar, 10);
1913     }
1914   }
1915   /***********************************************************************/
1916   osti_memset(buffer, 0, buffLen);
1917   lenRecv = 0;
1918   
1919   
1920   if ((ostiGetTransportParam(
1921                              tiRoot, 
1922                              globalStr,   /* key */
1923                              SwParmsStr,  /* subkey1 */
1924                              agNULL,      /* subkey2 */
1925                              agNULL,
1926                              agNULL, 
1927                              agNULL,      /* subkey5 */
1928                              "HDAMode", /* valueName */
1929                              buffer, 
1930                              buffLen, 
1931                              &lenRecv
1932                              ) == tiSuccess) && (lenRecv != 0))
1933   {
1934     if (osti_strncmp(buffer, "0x", 2) == 0)
1935     { 
1936       SwConfig.hostDirectAccessMode = osti_strtoul (buffer, &pLastUsedChar, 0);
1937     }
1938     else
1939     {
1940       SwConfig.hostDirectAccessMode = osti_strtoul (buffer, &pLastUsedChar, 10);
1941     }
1942   }
1943   /***********************************************************************/
1944   /* the end of HDA parameters */
1945
1946
1947   /* FW configuration */
1948   osti_memset(buffer, 0, buffLen);
1949   lenRecv = 0;
1950   
1951   
1952   if ((ostiGetTransportParam(
1953                              tiRoot, 
1954                              globalStr,   /* key */
1955                              SwParmsStr,  /* subkey1 */
1956                              agNULL,      /* subkey2 */
1957                              agNULL,
1958                              agNULL, 
1959                              agNULL,      /* subkey5 */
1960                              "FWConfig", /* valueName */
1961                              buffer, 
1962                              buffLen, 
1963                              &lenRecv
1964                              ) == tiSuccess) && (lenRecv != 0))
1965   {
1966     if (osti_strncmp(buffer, "0x", 2) == 0)
1967     { 
1968       SwConfig.FWConfig = osti_strtoul (buffer, &pLastUsedChar, 0);
1969     }
1970     else
1971     {
1972       SwConfig.FWConfig = osti_strtoul (buffer, &pLastUsedChar, 10);
1973     }
1974   }
1975   /* The end of FW configuration */
1976
1977
1978
1979 #ifdef SA_ENABLE_TRACE_FUNCTIONS
1980
1981  TI_DBG2(("tdsaLoLevelGetResource:  SA_ENABLE_TRACE_FUNCTIONS\n"));
1982
1983 /*
1984   buffer = tmpBuffer;
1985   buffLen = sizeof(tmpBuffer);
1986
1987   osti_memset(buffer, 0, buffLen);
1988   lenRecv = 0;
1989 */
1990
1991   SwConfig.TraceBufferSize = 0;
1992   if ((ostiGetTransportParam(
1993                              tiRoot, 
1994                              globalStr,   /* key */
1995                              SwParmsStr,  /* subkey1 */
1996                              agNULL,      /* subkey2 */
1997                              agNULL,
1998                              agNULL, 
1999                              agNULL,      /* subkey5 */
2000                              "TraceBufferSize", /* valueName */
2001                              buffer, 
2002                              buffLen, 
2003                              &lenRecv
2004                              ) == tiSuccess) && (lenRecv != 0))
2005   {
2006     if (osti_strncmp(buffer, "0x", 2) == 0)
2007     { 
2008       SwConfig.TraceBufferSize = osti_strtoul (buffer, &pLastUsedChar, 0);
2009     }
2010     else
2011     {
2012       SwConfig.TraceBufferSize = osti_strtoul (buffer, &pLastUsedChar, 10);
2013     }
2014     TI_DBG2(("tdsaLoLevelGetResource: SwConfig.TraceBufferSize %d\n",SwConfig.TraceBufferSize));
2015   }
2016
2017 #endif /*# SA_ENABLE_TRACE_FUNCTIONS */
2018       
2019   SwConfig.mpiContextTable = agNULL;
2020   SwConfig.mpiContextTablelen = 0;
2021                
2022   /* default */
2023   for (i=0;i<8;i++)
2024   {
2025     QueueConfig.sasHwEventQueue[i] = 0;
2026     QueueConfig.sataNCQErrorEventQueue[i] = 0;
2027   }
2028   
2029 #ifdef TARGET_DRIVER
2030   for (i=0;i<8;i++)
2031   {
2032     QueueConfig.tgtITNexusEventQueue[i] = 0;
2033     QueueConfig.tgtSSPEventQueue[i] = 0;
2034     QueueConfig.tgtSMPEventQueue[i] = 0;
2035   }
2036 #endif
2037     
2038   QueueConfig.iqNormalPriorityProcessingDepth = 0;
2039   QueueConfig.iqHighPriorityProcessingDepth = 0;
2040   QueueConfig.generalEventQueue = 0;
2041   
2042   /* 
2043    * can agRoot be agNULL below? Yes. 
2044    * saGetRequirements(agRoot, IN, OUT, OUT, OUT); 
2045    */
2046   saGetRequirements(&agRoot, 
2047                     &SwConfig, 
2048                     &memRequirement, 
2049                     &usecsPerTick, 
2050                     &maxQueueSets
2051                     );
2052 #ifdef FDS_DM
2053   dmGetRequirements(&dmRoot, 
2054                     &dmSwConfig, 
2055                     &dmMemRequirement, 
2056                     &dmUsecsPerTick, 
2057                     &dmMaxNumLocks
2058                     );
2059
2060
2061 #endif
2062
2063 #ifdef FDS_SM
2064   smGetRequirements(
2065                     &smRoot,
2066                     &smSwConfig,
2067                     &smMemRequirement,
2068                     &smUsecsPerTick,
2069                     &smMaxNumLocks
2070                    );
2071
2072 #endif
2073
2074  /* initialization */
2075  maxNumOSLocks = loResource->loLevelOption.maxNumOSLocks;
2076  /*
2077    MAX_LL_LAYER_MEM_DESCRIPTORS is 24. see tidefs.h and tiLoLevelMem_t
2078    in titypes.h
2079  */
2080 #if defined (FDS_DM) && defined (FDS_SM)
2081   /* for LL */
2082   TI_DBG1(("tdsaLoLevelGetResource:MAX_LL_LAYER_MEM_DESCRIPTORS %d\n", MAX_LL_LAYER_MEM_DESCRIPTORS)); 
2083   for(i=0;i<MAX_LL_LAYER_MEM_DESCRIPTORS;i++)
2084   {
2085     loResource->loLevelMem.mem[i].numElements           = 0;
2086     loResource->loLevelMem.mem[i].totalLength           = 0;
2087     loResource->loLevelMem.mem[i].singleElementLength   = 0;
2088     loResource->loLevelMem.mem[i].alignment             = 0;
2089     loResource->loLevelMem.mem[i].type                  = 0;
2090     loResource->loLevelMem.mem[i].reserved              = 0;
2091     loResource->loLevelMem.mem[i].virtPtr               = agNULL;
2092     loResource->loLevelMem.mem[i].osHandle              = agNULL;
2093     loResource->loLevelMem.mem[i].physAddrUpper         = 0;
2094     loResource->loLevelMem.mem[i].physAddrLower         = 0;
2095   }
2096
2097   TI_DBG1(("tdsaLoLevelGetResource:memRequirement.count %d\n", memRequirement.count)); 
2098   /* using the returned value from saGetRequirements */
2099   for (i=0;i< memRequirement.count;i++)
2100   {
2101     /* hardcoded values for now */
2102     loResource->loLevelMem.mem[i].numElements = memRequirement.agMemory[i].numElements;
2103     loResource->loLevelMem.mem[i].totalLength = memRequirement.agMemory[i].totalLength;
2104     loResource->loLevelMem.mem[i].singleElementLength = memRequirement.agMemory[i].singleElementLength;
2105     loResource->loLevelMem.mem[i].alignment = memRequirement.agMemory[i].alignment;
2106     TI_DBG2(("tdsaLoLevelGetResource: index %d numElements %d totalLength %d singleElementLength %d alignment %d\n", i, loResource->loLevelMem.mem[i].numElements, loResource->loLevelMem.mem[i].totalLength, loResource->loLevelMem.mem[i].singleElementLength,loResource->loLevelMem.mem[i].alignment ));
2107     if ( AGSA_DMA_MEM == memRequirement.agMemory[i].type )
2108     {
2109       loResource->loLevelMem.mem[i].type = TI_DMA_MEM;
2110       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_DMA_MEM\n", i));
2111       
2112     }
2113     else if ( AGSA_CACHED_MEM == memRequirement.agMemory[i].type )
2114     {
2115       loResource->loLevelMem.mem[i].type = TI_CACHED_MEM;      
2116       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_MEM\n", i));
2117     }
2118     else if ( AGSA_CACHED_DMA_MEM == memRequirement.agMemory[i].type )
2119     {
2120       loResource->loLevelMem.mem[i].type = TI_CACHED_DMA_MEM;      
2121       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_DMA_MEM\n", i));
2122     }
2123   }
2124
2125   /* for DM */
2126   TI_DBG1(("tdsaLoLevelGetResource:dmMemRequirement.count %d\n", dmMemRequirement.count)); 
2127   /* using the returned value from dmGetRequirements */
2128   for (i=memRequirement.count;i< (memRequirement.count + dmMemRequirement.count);i++)
2129   {
2130     /* hardcoded values for now */
2131     loResource->loLevelMem.mem[i].numElements = dmMemRequirement.dmMemory[i-memRequirement.count].numElements;
2132     loResource->loLevelMem.mem[i].totalLength = dmMemRequirement.dmMemory[i-memRequirement.count].totalLength;
2133     loResource->loLevelMem.mem[i].singleElementLength = dmMemRequirement.dmMemory[i-memRequirement.count].singleElementLength;
2134     loResource->loLevelMem.mem[i].alignment = dmMemRequirement.dmMemory[i-memRequirement.count].alignment;
2135     TI_DBG2(("tdsaLoLevelGetResource: index %d numElements %d totalLength %d singleElementLength %d alignment %d\n", i, loResource->loLevelMem.mem[i].numElements, loResource->loLevelMem.mem[i].totalLength, loResource->loLevelMem.mem[i].singleElementLength,loResource->loLevelMem.mem[i].alignment ));
2136     if ( AGSA_DMA_MEM == dmMemRequirement.dmMemory[i-memRequirement.count].type )
2137     {
2138       loResource->loLevelMem.mem[i].type = TI_DMA_MEM;
2139       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_DMA_MEM\n", i));
2140       
2141     }
2142     else if ( AGSA_CACHED_MEM == dmMemRequirement.dmMemory[i-memRequirement.count].type )
2143     {
2144       loResource->loLevelMem.mem[i].type = TI_CACHED_MEM;      
2145       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_MEM\n", i));
2146     }
2147     else if ( AGSA_CACHED_DMA_MEM == dmMemRequirement.dmMemory[i-memRequirement.count].type )
2148     {
2149       loResource->loLevelMem.mem[i].type = TI_CACHED_DMA_MEM;      
2150       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_DMA_MEM\n", i));
2151     }
2152   }
2153
2154   /* for SM */
2155   TI_DBG1(("tdsaLoLevelGetResource:smMemRequirement.count %d\n", smMemRequirement.count)); 
2156   /* using the returned value from dmGetRequirements */
2157   for (i=(memRequirement.count + dmMemRequirement.count);i< (memRequirement.count + dmMemRequirement.count + smMemRequirement.count);i++)
2158   {
2159     /* hardcoded values for now */
2160     loResource->loLevelMem.mem[i].numElements = smMemRequirement.smMemory[i-memRequirement.count-dmMemRequirement.count].numElements;
2161     loResource->loLevelMem.mem[i].totalLength = smMemRequirement.smMemory[i-memRequirement.count-dmMemRequirement.count].totalLength;
2162     loResource->loLevelMem.mem[i].singleElementLength = smMemRequirement.smMemory[i-memRequirement.count-dmMemRequirement.count].singleElementLength;
2163     loResource->loLevelMem.mem[i].alignment = smMemRequirement.smMemory[i-memRequirement.count-dmMemRequirement.count].alignment;
2164     TI_DBG2(("tdsaLoLevelGetResource: index %d numElements %d totalLength %d singleElementLength %d alignment %d\n", i, loResource->loLevelMem.mem[i].numElements, loResource->loLevelMem.mem[i].totalLength, loResource->loLevelMem.mem[i].singleElementLength,loResource->loLevelMem.mem[i].alignment ));
2165     if ( AGSA_DMA_MEM == smMemRequirement.smMemory[i-memRequirement.count-dmMemRequirement.count].type )
2166     {
2167       loResource->loLevelMem.mem[i].type = TI_DMA_MEM;
2168       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_DMA_MEM\n", i));
2169       
2170     }
2171     else if ( AGSA_CACHED_MEM == smMemRequirement.smMemory[i-memRequirement.count-dmMemRequirement.count].type )
2172     {
2173       loResource->loLevelMem.mem[i].type = TI_CACHED_MEM;      
2174       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_MEM\n", i));
2175     }
2176     else if ( AGSA_CACHED_DMA_MEM == smMemRequirement.smMemory[i-memRequirement.count-dmMemRequirement.count].type )
2177     {
2178       loResource->loLevelMem.mem[i].type = TI_CACHED_DMA_MEM;      
2179       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_DMA_MEM\n", i));
2180     }
2181   }
2182
2183   /* sets the low level options */
2184   loResource->loLevelOption.usecsPerTick       = MIN(MIN(usecsPerTick, dmUsecsPerTick), smUsecsPerTick);
2185   loResource->loLevelOption.numOfQueuesPerPort = maxQueueSets + dmMaxNumLocks + smMaxNumLocks + TD_MAX_LOCKS + maxNumOSLocks;
2186   loResource->loLevelOption.mutexLockUsage     = tiOneMutexLockPerQueue;
2187   /* no more ESGL */
2188   loResource->loLevelMem.count = memRequirement.count + dmMemRequirement.count + smMemRequirement.count;
2189   /* setting interrupt requirements */ 
2190   loResource->loLevelOption.maxInterruptVectors = SwConfig.max_MSIX_InterruptVectors;
2191   loResource->loLevelOption.max_MSI_InterruptVectors = SwConfig.max_MSI_InterruptVectors;
2192   loResource->loLevelOption.flag = SwConfig.legacyInt_X;
2193   TI_DBG2(("tdsaLoLevelGetResource: asking maxInterruptVectors(MSIX) %d \n", loResource->loLevelOption.maxInterruptVectors));
2194   TI_DBG2(("tdsaLoLevelGetResource: asking max_MSI_InterruptVectors %d \n", loResource->loLevelOption.max_MSI_InterruptVectors));
2195   TI_DBG2(("tdsaLoLevelGetResource: asking flag - legacyInt_X %d \n", loResource->loLevelOption.flag));
2196
2197 //  TI_DBG6(("tdsaLoLevelGetResource: index %d numElements %d totalLength %d singleElementLength %d alignment %d\n",memRequirement.count, loResource->loLevelMem.mem[memRequirement.count].numElements,loResource->loLevelMem.mem[memRequirement.count].totalLength, loResource->loLevelMem.mem[memRequirement.count].singleElementLength,loResource->loLevelMem.mem[memRequirement.count].alignment ));
2198   TI_DBG6(("tdsaLoLevelGetResource: total memRequirement count %d TI_DMA_MEM\n", loResource->loLevelMem.count));
2199
2200 #elif defined(FDS_DM)
2201   TI_DBG1(("tdsaLoLevelGetResource:MAX_LL_LAYER_MEM_DESCRIPTORS %d\n", MAX_LL_LAYER_MEM_DESCRIPTORS)); 
2202   for(i=0;i<MAX_LL_LAYER_MEM_DESCRIPTORS;i++)
2203   {
2204     loResource->loLevelMem.mem[i].numElements           = 0;
2205     loResource->loLevelMem.mem[i].totalLength           = 0;
2206     loResource->loLevelMem.mem[i].singleElementLength   = 0;
2207     loResource->loLevelMem.mem[i].alignment             = 0;
2208     loResource->loLevelMem.mem[i].type                  = 0;
2209     loResource->loLevelMem.mem[i].reserved              = 0;
2210     loResource->loLevelMem.mem[i].virtPtr               = agNULL;
2211     loResource->loLevelMem.mem[i].osHandle              = agNULL;
2212     loResource->loLevelMem.mem[i].physAddrUpper         = 0;
2213     loResource->loLevelMem.mem[i].physAddrLower         = 0;
2214   }
2215
2216   TI_DBG1(("tdsaLoLevelGetResource:memRequirement.count %d\n", memRequirement.count)); 
2217   /* using the returned value from saGetRequirements */
2218   for (i=0;i< memRequirement.count;i++)
2219   {
2220     /* hardcoded values for now */
2221     loResource->loLevelMem.mem[i].numElements = memRequirement.agMemory[i].numElements;
2222     loResource->loLevelMem.mem[i].totalLength = memRequirement.agMemory[i].totalLength;
2223     loResource->loLevelMem.mem[i].singleElementLength = memRequirement.agMemory[i].singleElementLength;
2224     loResource->loLevelMem.mem[i].alignment = memRequirement.agMemory[i].alignment;
2225     TI_DBG2(("tdsaLoLevelGetResource: index %d numElements %d totalLength %d singleElementLength %d alignment %d\n", i, loResource->loLevelMem.mem[i].numElements, loResource->loLevelMem.mem[i].totalLength, loResource->loLevelMem.mem[i].singleElementLength,loResource->loLevelMem.mem[i].alignment ));
2226     if ( AGSA_DMA_MEM == memRequirement.agMemory[i].type )
2227     {
2228       loResource->loLevelMem.mem[i].type = TI_DMA_MEM;
2229       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_DMA_MEM\n", i));
2230       
2231     }
2232     else if ( AGSA_CACHED_MEM == memRequirement.agMemory[i].type )
2233     {
2234       loResource->loLevelMem.mem[i].type = TI_CACHED_MEM;      
2235       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_MEM\n", i));
2236     }
2237     else if ( AGSA_CACHED_DMA_MEM == memRequirement.agMemory[i].type )
2238     {
2239       loResource->loLevelMem.mem[i].type = TI_CACHED_DMA_MEM;      
2240       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_DMA_MEM\n", i));
2241     }
2242   }
2243   
2244   TI_DBG1(("tdsaLoLevelGetResource:dmMemRequirement.count %d\n", dmMemRequirement.count)); 
2245   /* using the returned value from dmGetRequirements */
2246   for (i=memRequirement.count;i< (memRequirement.count + dmMemRequirement.count);i++)
2247   {
2248     /* hardcoded values for now */
2249     loResource->loLevelMem.mem[i].numElements = dmMemRequirement.dmMemory[i-memRequirement.count].numElements;
2250     loResource->loLevelMem.mem[i].totalLength = dmMemRequirement.dmMemory[i-memRequirement.count].totalLength;
2251     loResource->loLevelMem.mem[i].singleElementLength = dmMemRequirement.dmMemory[i-memRequirement.count].singleElementLength;
2252     loResource->loLevelMem.mem[i].alignment = dmMemRequirement.dmMemory[i-memRequirement.count].alignment;
2253     TI_DBG2(("tdsaLoLevelGetResource: index %d numElements %d totalLength %d singleElementLength %d alignment %d\n", i, loResource->loLevelMem.mem[i].numElements, loResource->loLevelMem.mem[i].totalLength, loResource->loLevelMem.mem[i].singleElementLength,loResource->loLevelMem.mem[i].alignment ));
2254     if ( AGSA_DMA_MEM == dmMemRequirement.dmMemory[i-memRequirement.count].type )
2255     {
2256       loResource->loLevelMem.mem[i].type = TI_DMA_MEM;
2257       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_DMA_MEM\n", i));
2258       
2259     }
2260     else if ( AGSA_CACHED_MEM == dmMemRequirement.dmMemory[i-memRequirement.count].type )
2261     {
2262       loResource->loLevelMem.mem[i].type = TI_CACHED_MEM;      
2263       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_MEM\n", i));
2264     }
2265     else if ( AGSA_CACHED_DMA_MEM == dmMemRequirement.dmMemory[i-memRequirement.count].type )
2266     {
2267       loResource->loLevelMem.mem[i].type = TI_CACHED_DMA_MEM;      
2268       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_DMA_MEM\n", i));
2269     }
2270   }
2271   
2272  
2273   
2274   /* sets the low level options */
2275   loResource->loLevelOption.usecsPerTick       = MIN(usecsPerTick, dmUsecsPerTick);
2276   loResource->loLevelOption.numOfQueuesPerPort = maxQueueSets + dmMaxNumLocks + TD_MAX_LOCKS + maxNumOSLocks;
2277   loResource->loLevelOption.mutexLockUsage     = tiOneMutexLockPerQueue;
2278   /* no more ESGL */
2279   loResource->loLevelMem.count = memRequirement.count + dmMemRequirement.count;
2280   /* setting interrupt requirements */ 
2281   loResource->loLevelOption.maxInterruptVectors = SwConfig.max_MSIX_InterruptVectors;
2282   loResource->loLevelOption.max_MSI_InterruptVectors = SwConfig.max_MSI_InterruptVectors;
2283   loResource->loLevelOption.flag = SwConfig.legacyInt_X;
2284   TI_DBG2(("tdsaLoLevelGetResource: asking maxInterruptVectors(MSIX) %d \n", loResource->loLevelOption.maxInterruptVectors));
2285   TI_DBG2(("tdsaLoLevelGetResource: asking max_MSI_InterruptVectors %d \n", loResource->loLevelOption.max_MSI_InterruptVectors));
2286   TI_DBG2(("tdsaLoLevelGetResource: asking flag - legacyInt_X %d \n", loResource->loLevelOption.flag));
2287
2288 //  TI_DBG6(("tdsaLoLevelGetResource: index %d numElements %d totalLength %d singleElementLength %d alignment %d\n",memRequirement.count, loResource->loLevelMem.mem[memRequirement.count].numElements,loResource->loLevelMem.mem[memRequirement.count].totalLength, loResource->loLevelMem.mem[memRequirement.count].singleElementLength,loResource->loLevelMem.mem[memRequirement.count].alignment ));
2289   TI_DBG6(("tdsaLoLevelGetResource: total memRequirement count %d TI_DMA_MEM\n", loResource->loLevelMem.count));
2290   
2291 #elif defined(FDS_SM)
2292   TI_DBG1(("tdsaLoLevelGetResource:MAX_LL_LAYER_MEM_DESCRIPTORS %d\n", MAX_LL_LAYER_MEM_DESCRIPTORS)); 
2293   for(i=0;i<MAX_LL_LAYER_MEM_DESCRIPTORS;i++)
2294   {
2295     loResource->loLevelMem.mem[i].numElements           = 0;
2296     loResource->loLevelMem.mem[i].totalLength           = 0;
2297     loResource->loLevelMem.mem[i].singleElementLength   = 0;
2298     loResource->loLevelMem.mem[i].alignment             = 0;
2299     loResource->loLevelMem.mem[i].type                  = 0;
2300     loResource->loLevelMem.mem[i].reserved              = 0;
2301     loResource->loLevelMem.mem[i].virtPtr               = agNULL;
2302     loResource->loLevelMem.mem[i].osHandle              = agNULL;
2303     loResource->loLevelMem.mem[i].physAddrUpper         = 0;
2304     loResource->loLevelMem.mem[i].physAddrLower         = 0;
2305   }
2306
2307   TI_DBG1(("tdsaLoLevelGetResource:memRequirement.count %d\n", memRequirement.count)); 
2308   /* using the returned value from saGetRequirements */
2309   for (i=0;i< memRequirement.count;i++)
2310   {
2311     /* hardcoded values for now */
2312     loResource->loLevelMem.mem[i].numElements = memRequirement.agMemory[i].numElements;
2313     loResource->loLevelMem.mem[i].totalLength = memRequirement.agMemory[i].totalLength;
2314     loResource->loLevelMem.mem[i].singleElementLength = memRequirement.agMemory[i].singleElementLength;
2315     loResource->loLevelMem.mem[i].alignment = memRequirement.agMemory[i].alignment;
2316     TI_DBG6(("tdsaLoLevelGetResource: index %d numElements %d totalLength %d singleElementLength %d alignment %d\n", i, loResource->loLevelMem.mem[i].numElements, loResource->loLevelMem.mem[i].totalLength, loResource->loLevelMem.mem[i].singleElementLength,loResource->loLevelMem.mem[i].alignment ));
2317     if ( AGSA_DMA_MEM == memRequirement.agMemory[i].type )
2318     {
2319       loResource->loLevelMem.mem[i].type = TI_DMA_MEM;
2320       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_DMA_MEM\n", i));
2321       
2322     }
2323     else if ( AGSA_CACHED_MEM == memRequirement.agMemory[i].type )
2324     {
2325       loResource->loLevelMem.mem[i].type = TI_CACHED_MEM;      
2326       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_MEM\n", i));
2327     }
2328     else if ( AGSA_CACHED_DMA_MEM == memRequirement.agMemory[i].type )
2329     {
2330       loResource->loLevelMem.mem[i].type = TI_CACHED_DMA_MEM;      
2331       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_DMA_MEM\n", i));
2332     }
2333   }
2334   
2335   TI_DBG1(("tdsaLoLevelGetResource:smMemRequirement.count %d\n", smMemRequirement.count)); 
2336   /* using the returned value from smGetRequirements */
2337   for (i=memRequirement.count;i< (memRequirement.count + smMemRequirement.count);i++)
2338   {
2339     /* hardcoded values for now */
2340     loResource->loLevelMem.mem[i].numElements = smMemRequirement.smMemory[i-memRequirement.count].numElements;
2341     loResource->loLevelMem.mem[i].totalLength = smMemRequirement.smMemory[i-memRequirement.count].totalLength;
2342     loResource->loLevelMem.mem[i].singleElementLength = smMemRequirement.smMemory[i-memRequirement.count].singleElementLength;
2343     loResource->loLevelMem.mem[i].alignment = smMemRequirement.smMemory[i-memRequirement.count].alignment;
2344     TI_DBG6(("tdsaLoLevelGetResource: index %d numElements %d totalLength %d singleElementLength %d alignment %d\n", i, loResource->loLevelMem.mem[i].numElements, loResource->loLevelMem.mem[i].totalLength, loResource->loLevelMem.mem[i].singleElementLength,loResource->loLevelMem.mem[i].alignment ));
2345     if ( AGSA_DMA_MEM == smMemRequirement.smMemory[i-memRequirement.count].type )
2346     {
2347       loResource->loLevelMem.mem[i].type = TI_DMA_MEM;
2348       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_DMA_MEM\n", i));
2349       
2350     }
2351     else if ( AGSA_CACHED_MEM == smMemRequirement.smMemory[i-memRequirement.count].type )
2352     {
2353       loResource->loLevelMem.mem[i].type = TI_CACHED_MEM;      
2354       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_MEM\n", i));
2355     }
2356     else if ( AGSA_CACHED_DMA_MEM == smMemRequirement.smMemory[i-memRequirement.count].type )
2357     {
2358       loResource->loLevelMem.mem[i].type = TI_CACHED_DMA_MEM;      
2359       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_DMA_MEM\n", i));
2360     }
2361   }
2362   
2363  
2364   
2365   /* sets the low level options */
2366   loResource->loLevelOption.usecsPerTick       = MIN(usecsPerTick, smUsecsPerTick);
2367   loResource->loLevelOption.numOfQueuesPerPort = maxQueueSets + smMaxNumLocks + TD_MAX_LOCKS + maxNumOSLocks;
2368   loResource->loLevelOption.mutexLockUsage     = tiOneMutexLockPerQueue;
2369   /* no more ESGL */
2370   loResource->loLevelMem.count = memRequirement.count + smMemRequirement.count;
2371   /* setting interrupt requirements */ 
2372   loResource->loLevelOption.maxInterruptVectors = SwConfig.max_MSIX_InterruptVectors;
2373   loResource->loLevelOption.max_MSI_InterruptVectors = SwConfig.max_MSI_InterruptVectors;
2374   loResource->loLevelOption.flag = SwConfig.legacyInt_X;
2375   TI_DBG2(("tdsaLoLevelGetResource: asking maxInterruptVectors(MSIX) %d \n", loResource->loLevelOption.maxInterruptVectors));
2376   TI_DBG2(("tdsaLoLevelGetResource: asking max_MSI_InterruptVectors %d \n", loResource->loLevelOption.max_MSI_InterruptVectors));
2377   TI_DBG2(("tdsaLoLevelGetResource: asking flag - legacyInt_X %d \n", loResource->loLevelOption.flag));
2378
2379 //  TI_DBG6(("tdsaLoLevelGetResource: index %d numElements %d totalLength %d singleElementLength %d alignment %d\n",memRequirement.count, loResource->loLevelMem.mem[memRequirement.count].numElements,loResource->loLevelMem.mem[memRequirement.count].totalLength, loResource->loLevelMem.mem[memRequirement.count].singleElementLength,loResource->loLevelMem.mem[memRequirement.count].alignment ));
2380   TI_DBG6(("tdsaLoLevelGetResource: total memRequirement count %d TI_DMA_MEM\n", loResource->loLevelMem.count));
2381   
2382
2383 #else
2384   TI_DBG6(("tdsaLoLevelGetResource:MAX_LL_LAYER_MEM_DESCRIPTORS %d\n", MAX_LL_LAYER_MEM_DESCRIPTORS)); 
2385   for(i=0;i<MAX_LL_LAYER_MEM_DESCRIPTORS;i++)
2386   {
2387     loResource->loLevelMem.mem[i].numElements           = 0;
2388     loResource->loLevelMem.mem[i].totalLength           = 0;
2389     loResource->loLevelMem.mem[i].singleElementLength   = 0;
2390     loResource->loLevelMem.mem[i].alignment             = 0;
2391     loResource->loLevelMem.mem[i].type                  = 0;
2392     loResource->loLevelMem.mem[i].reserved              = 0;
2393     loResource->loLevelMem.mem[i].virtPtr               = agNULL;
2394     loResource->loLevelMem.mem[i].osHandle              = agNULL;
2395     loResource->loLevelMem.mem[i].physAddrUpper         = 0;
2396     loResource->loLevelMem.mem[i].physAddrLower         = 0;
2397   }
2398   
2399   /* using the returned value from saGetRequirements */
2400   for (i=0;i< memRequirement.count;i++)
2401   {
2402     /* hardcoded values for now */
2403     loResource->loLevelMem.mem[i].numElements = memRequirement.agMemory[i].numElements;
2404     loResource->loLevelMem.mem[i].totalLength = memRequirement.agMemory[i].totalLength;
2405     loResource->loLevelMem.mem[i].singleElementLength = memRequirement.agMemory[i].singleElementLength;
2406     loResource->loLevelMem.mem[i].alignment = memRequirement.agMemory[i].alignment;
2407     TI_DBG6(("tdsaLoLevelGetResource: index %d numElements %d totalLength %d singleElementLength %d alignment %d\n", i, loResource->loLevelMem.mem[i].numElements, loResource->loLevelMem.mem[i].totalLength, loResource->loLevelMem.mem[i].singleElementLength,loResource->loLevelMem.mem[i].alignment ));
2408     if ( AGSA_DMA_MEM == memRequirement.agMemory[i].type )
2409     {
2410       loResource->loLevelMem.mem[i].type = TI_DMA_MEM;
2411       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_DMA_MEM\n", i));
2412       
2413     }
2414     else if ( AGSA_CACHED_MEM == memRequirement.agMemory[i].type )
2415     {
2416       loResource->loLevelMem.mem[i].type = TI_CACHED_MEM;      
2417       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_MEM\n", i));
2418     }
2419     else if ( AGSA_CACHED_DMA_MEM == memRequirement.agMemory[i].type )
2420     {
2421       loResource->loLevelMem.mem[i].type = TI_CACHED_DMA_MEM;      
2422       TI_DBG6(("tdsaLoLevelGetResource: index %d TI_CACHED_DMA_MEM\n", i));
2423     }
2424   }
2425   
2426  
2427   
2428   /* sets the low level options */
2429   loResource->loLevelOption.usecsPerTick       = usecsPerTick;
2430   loResource->loLevelOption.numOfQueuesPerPort = maxQueueSets + TD_MAX_LOCKS + maxNumOSLocks;
2431   loResource->loLevelOption.mutexLockUsage     = tiOneMutexLockPerQueue;
2432   /* no more ESGL */
2433   loResource->loLevelMem.count = memRequirement.count;
2434   /* setting interrupt requirements */ 
2435   loResource->loLevelOption.maxInterruptVectors = SwConfig.max_MSIX_InterruptVectors;
2436   loResource->loLevelOption.max_MSI_InterruptVectors = SwConfig.max_MSI_InterruptVectors;
2437   loResource->loLevelOption.flag = SwConfig.legacyInt_X;
2438   TI_DBG2(("tdsaLoLevelGetResource: asking maxInterruptVectors(MSIX) %d \n", loResource->loLevelOption.maxInterruptVectors));
2439   TI_DBG2(("tdsaLoLevelGetResource: asking max_MSI_InterruptVectors %d \n", loResource->loLevelOption.max_MSI_InterruptVectors));
2440   TI_DBG2(("tdsaLoLevelGetResource: asking flag - legacyInt_X %d \n", loResource->loLevelOption.flag));
2441
2442   TI_DBG6(("tdsaLoLevelGetResource: index %d numElements %d totalLength %d singleElementLength %d alignment %d\n",memRequirement.count, loResource->loLevelMem.mem[memRequirement.count].numElements,loResource->loLevelMem.mem[memRequirement.count].totalLength, loResource->loLevelMem.mem[memRequirement.count].singleElementLength,loResource->loLevelMem.mem[memRequirement.count].alignment ));
2443   TI_DBG6(("tdsaLoLevelGetResource: memRequirement.count %d TI_DMA_MEM\n", memRequirement.count));
2444 #endif 
2445
2446
2447
2448  return;
2449 }
2450
2451 /*****************************************************************************
2452 *! \brief tdsaSharedMemCalculate
2453 *
2454 *  Purpose:  This function is called to determine the Transport 
2455 *            Dependent Layer internal resource requirement 
2456 *            for shared memory between target and initiator
2457 *            functionality.
2458 *
2459 *  \param  tiRoot:             Pointer to driver/port instance.
2460 *  \param  tdSharedMem:        Pointer to shared memory structure
2461 *
2462 *  \return: None
2463 *
2464 *  \note - The shared memory is composed of like the followings
2465 *          sizeof(tdsaRoot_t)
2466 *          + sizeof(tdsaPortContext_t) * TD_MAX_PORT_CONTEXT
2467 *          + sizeof(tdsaDeviceData_t) * MaxTargets
2468 *          + sizeof(tdsaEsglPageInfo_t) * NumEsglPages
2469 *
2470 *****************************************************************************/
2471 osGLOBAL void
2472 tdsaSharedMemCalculate(
2473                        tiRoot_t              * tiRoot,
2474                        tiLoLevelResource_t   * loResource,
2475                        tiTdSharedMem_t       * tdSharedMem
2476                        )
2477 {
2478   bit32 MaxTargets;
2479   
2480   /* the following fn fills in MaxTargets */
2481   tdssGetMaxTargetsParams(tiRoot, &MaxTargets);
2482   TI_DBG6(("tdsaSharedMemCalculate: MaxTargets %d\n", MaxTargets));
2483    
2484   /*
2485    * Cached mem for the shared TD Layer functionality
2486    */
2487   tdSharedMem->tdSharedCachedMem1.singleElementLength =
2488     sizeof(tdsaRoot_t) + (sizeof(tdsaPortContext_t) * TD_MAX_PORT_CONTEXT) +
2489     (sizeof(tdsaDeviceData_t) * MaxTargets);
2490   
2491 #ifdef TD_INT_COALESCE
2492   /* adding TD interrupt coalesce data structure to the shared TD layer */
2493   /* TD_MAX_INT_COALESCE is defined to be 512 */
2494   tdSharedMem->tdSharedCachedMem1.singleElementLength +=
2495     sizeof(tdsaIntCoalesceContext_t) * TD_MAX_INT_COALESCE;
2496 #endif
2497
2498 #ifdef TD_DISCOVER
2499   /* adding expander data strutures */
2500   tdSharedMem->tdSharedCachedMem1.singleElementLength +=
2501     sizeof(tdsaExpander_t) * MaxTargets;
2502 #endif
2503
2504   tdSharedMem->tdSharedCachedMem1.numElements = 1;
2505
2506   tdSharedMem->tdSharedCachedMem1.totalLength =
2507       tdSharedMem->tdSharedCachedMem1.singleElementLength *
2508       tdSharedMem->tdSharedCachedMem1.numElements;
2509
2510   tdSharedMem->tdSharedCachedMem1.alignment = 8;
2511
2512   tdSharedMem->tdSharedCachedMem1.type = TI_CACHED_MEM;
2513   
2514   tdSharedMem->tdSharedCachedMem1.virtPtr = agNULL;
2515   tdSharedMem->tdSharedCachedMem1.osHandle = agNULL;
2516   tdSharedMem->tdSharedCachedMem1.physAddrUpper = 0;
2517   tdSharedMem->tdSharedCachedMem1.physAddrLower = 0;
2518   tdSharedMem->tdSharedCachedMem1.reserved = 0;
2519
2520   return;
2521 }
2522
2523
2524 /*****************************************************************************
2525 *! \biref tdResetComMemFlags
2526 *
2527 *  Purpose:  This function is called to reset all the flags for the port
2528 *
2529 *  \param  tiRoot:             Pointer to driver/port instance.
2530 *
2531 *  \return: None
2532 *
2533 *
2534 *****************************************************************************/
2535 osGLOBAL void
2536 tdsaResetComMemFlags(
2537                      tiRoot_t *tiRoot
2538                      )
2539 {
2540   tdsaRoot_t    *tdsaRoot = (tdsaRoot_t *)tiRoot->tdData;
2541   tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2542 #ifdef TD_DEBUG_ENABLE
2543   tdsaPortContext_t *tdsaPortContext = (tdsaPortContext_t *)tdsaAllShared->PortContextMem;
2544   TI_DBG6(("tdsaResetComMemFlags: start\n"));
2545   TI_DBG6(("tdsaResetComMemFlag:: ******* tdsaRoot %p \n", tdsaRoot));
2546   TI_DBG6(("tdsaResetComMemFlag:: ******* tdsaPortContext %p \n",tdsaPortContext));
2547 #endif
2548   
2549   tdsaAllShared->flags.sysIntsActive              = agFALSE;
2550   tdsaAllShared->flags.resetInProgress            = agFALSE;
2551   
2552   return;
2553 }
2554
2555 /*****************************************************************************
2556 *! \biref tdssInitSASPortStartInfo
2557 *
2558 *  Purpose:  This function sets information related to staring a port
2559 *
2560 *  \param  tiRoot:             Pointer to driver/port instance.
2561 *
2562 *  \return: None
2563 *
2564 *
2565 *****************************************************************************/
2566 osGLOBAL void 
2567 tdssInitSASPortStartInfo(
2568                          tiRoot_t *tiRoot
2569                          )
2570 {
2571   tdsaRoot_t        *tdsaRoot = (tdsaRoot_t *)tiRoot->tdData;
2572   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2573   int i;
2574 #ifdef TD_DEBUG_ENABLE
2575   tdsaPortContext_t *tdsaPortContext = (tdsaPortContext_t *)tdsaAllShared->PortContextMem;
2576   TI_DBG6(("tdssInitSASPortStartInfo: start\n"));
2577   
2578   TI_DBG6(("tdssInitSASPortStartInfo: ******* tdsaRoot %p \n", tdsaRoot));
2579   TI_DBG6(("tdssInitSASPortStartInfo: ******* tdsaPortContext %p \n",tdsaPortContext));
2580 #endif
2581   
2582   for(i=0;i<TD_MAX_NUM_PHYS;i++)
2583   {
2584     tdsaAllShared->Ports[i].tiPortalContext = agNULL;
2585     tdsaAllShared->Ports[i].portContext = agNULL;
2586     tdsaAllShared->Ports[i].SASID.sasAddressHi[0] = 0;
2587     tdsaAllShared->Ports[i].SASID.sasAddressHi[1] = 0;
2588     tdsaAllShared->Ports[i].SASID.sasAddressHi[2] = 0;
2589     tdsaAllShared->Ports[i].SASID.sasAddressHi[3] = 0;
2590     tdsaAllShared->Ports[i].SASID.sasAddressLo[0] = 0;
2591     tdsaAllShared->Ports[i].SASID.sasAddressLo[1] = 0;
2592     tdsaAllShared->Ports[i].SASID.sasAddressLo[2] = 0;
2593     tdsaAllShared->Ports[i].SASID.sasAddressLo[3] = 0;
2594     tdsaAllShared->Ports[i].SASID.phyIdentifier = (bit8) i;
2595     /* continue .... */
2596     
2597     tdsaAllShared->Ports[i].flags.portStarted = agFALSE; 
2598     tdsaAllShared->Ports[i].flags.portInitialized = agFALSE;
2599     tdsaAllShared->Ports[i].flags.portReadyForDiscoverySent = agFALSE;
2600     tdsaAllShared->Ports[i].flags.portStoppedByOSLayer = agFALSE;
2601     tdsaAllShared->Ports[i].flags.failPortInit = agFALSE;
2602   }
2603   
2604   return;
2605 }
2606
2607
2608 /*****************************************************************************
2609 *! \brief tdsaInitTimers
2610 *
2611 *  Purpose: This function is called to initialize the timers
2612 *           for initiator
2613 *
2614 *  \param   tiRoot: pointer to the driver instance
2615 *
2616 *  \return: None
2617 *
2618 *  \note: 
2619 *
2620 *****************************************************************************/ 
2621
2622 osGLOBAL void
2623 tdsaInitTimers(
2624                tiRoot_t *tiRoot 
2625                )
2626 {
2627   tdsaRoot_t               *tdsaRoot    = (tdsaRoot_t *)tiRoot->tdData;
2628   tdsaContext_t            *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2629 #ifdef TD_DEBUG_ENABLE
2630   tdsaPortContext_t *tdsaPortContext = (tdsaPortContext_t *)tdsaAllShared->PortContextMem;
2631   
2632   TI_DBG6(("tdsaInitTimers: start \n"));
2633   TI_DBG6(("tdsaInitTimers: ******* tdsaRoot %p \n", tdsaRoot));
2634   TI_DBG6(("tdsaInitTimers: ******* tdsaPortContext %p \n",tdsaPortContext));
2635 #endif
2636   
2637   /* initialize the timerlist */
2638   TDLIST_INIT_HDR(&(tdsaAllShared->timerlist));
2639
2640   return;
2641 }
2642
2643
2644 /*****************************************************************************
2645 *! \brief tdsaJumpTableInit
2646 *
2647 *  Purpose: This function initializes SAS related callback functions
2648 *
2649 *  \param   tiRoot: pointer to the driver instance
2650 *
2651 *  \return: None
2652 *
2653 *  \note: 
2654 *
2655 *****************************************************************************/
2656 osGLOBAL void
2657 tdsaJumpTableInit(
2658                   tiRoot_t *tiRoot
2659                   )
2660 {
2661   
2662   tdsaRoot_t        *tdsaRoot    = (tdsaRoot_t *)tiRoot->tdData;
2663   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2664 #ifdef TD_DEBUG_ENABLE
2665   tdsaPortContext_t *tdsaPortContext = (tdsaPortContext_t *)tdsaAllShared->PortContextMem;
2666   
2667   TI_DBG6(("tdsaJumpTableInit: start \n"));
2668   TI_DBG6(("tdsaJumpTableInit:: ******* tdsaRoot %p \n", tdsaRoot));
2669   TI_DBG6(("tdsaJumpTableInit:: ******* tdsaPortContext %p \n",tdsaPortContext));
2670 #endif
2671
2672   /* tdtype.h */
2673   /*
2674     For combo,
2675     pSSPIOCompleted, pSMPCompleted; use callback 
2676     pSSPReqReceive, pSMPReqReceived; use jumptable
2677   */
2678
2679 #ifdef INITIATOR_DRIVER
2680   tdsaAllShared->tdJumpTable.pSSPIOCompleted = agNULL; /* initiator */
2681   tdsaAllShared->tdJumpTable.pSMPCompleted =agNULL; /* initiator */
2682 #endif
2683 #ifdef TARGET_DRIVER
2684   tdsaAllShared->tdJumpTable.pSSPIOCompleted = agNULL;
2685   tdsaAllShared->tdJumpTable.pSSPReqReceived = &ttdsaSSPReqReceived;
2686   tdsaAllShared->tdJumpTable.pSMPReqReceived = &ttdsaSMPReqReceived;
2687   tdsaAllShared->tdJumpTable.pSMPCompleted =agNULL; 
2688 #endif
2689   tdsaAllShared->tdJumpTable.pGetSGLChunk = agNULL;
2690   return;
2691
2692 }
2693
2694
2695 /*****************************************************************************
2696 *! \brief tdsaPortContextInit
2697 *
2698 *  Purpose: This function initializes port contexts.
2699 *
2700 *  \param   tiRoot: pointer to the driver instance
2701 *
2702 *  \return: None
2703 *
2704 *  \note: 
2705 *
2706 *****************************************************************************/
2707 osGLOBAL void
2708 tdsaPortContextInit(
2709                     tiRoot_t *tiRoot 
2710                     )
2711 {
2712   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
2713   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2714   tdsaPortContext_t *tdsaPortContext = (tdsaPortContext_t *)tdsaAllShared->PortContextMem;
2715   int i = 0;
2716   int j = 0;
2717
2718   TI_DBG6(("tdsaPortContextInit: start\n"));
2719   TI_DBG6(("tdsaPortContextInit: ******* sizeof(tdsaPortContext) %d %x\n", (int)sizeof(tdsaPortContext_t), (unsigned int)sizeof(tdsaPortContext_t)));
2720   TI_DBG6(("tdsaPortContextInit: ******* tdsaRoot %p \n", tdsaRoot));
2721   TI_DBG6(("tdsaPortContextInit: ******* tdsaPortContext %p \n",tdsaPortContext)); 
2722   TI_DBG6(("tdsaPortContextInit: ******* tdsaPortContext+1 %p \n",tdsaPortContext + 1)); 
2723   TI_DBG6(("tdsaPortContextInit: ******* &tdsaPortContext[0] %p  &tdsaPortContext[1] %p\n", &(tdsaPortContext[0]), &(tdsaPortContext[1])));
2724
2725   TDLIST_INIT_HDR(&(tdsaAllShared->MainPortContextList));
2726   TDLIST_INIT_HDR(&(tdsaAllShared->FreePortContextList));
2727
2728   for(i=0;i<TD_MAX_PORT_CONTEXT;i++)
2729   {
2730     TDLIST_INIT_ELEMENT(&(tdsaPortContext[i].FreeLink));
2731     TDLIST_INIT_ELEMENT(&(tdsaPortContext[i].MainLink));
2732
2733 #ifdef TD_DISCOVER
2734     TDLIST_INIT_HDR(&(tdsaPortContext[i].discovery.discoveringExpanderList));
2735     TDLIST_INIT_HDR(&(tdsaPortContext[i].discovery.UpdiscoveringExpanderList));
2736     tdsaPortContext[i].discovery.type = TDSA_DISCOVERY_OPTION_FULL_START;
2737     tdsaInitTimerRequest(tiRoot, &(tdsaPortContext[i].discovery.discoveryTimer));
2738     tdsaInitTimerRequest(tiRoot, &(tdsaPortContext[i].discovery.configureRouteTimer));
2739     tdsaInitTimerRequest(tiRoot, &(tdsaPortContext[i].discovery.deviceRegistrationTimer));
2740     tdsaInitTimerRequest(tiRoot, &(tdsaPortContext[i].discovery.SMPBusyTimer));
2741     tdsaInitTimerRequest(tiRoot, &(tdsaPortContext[i].discovery.BCTimer));
2742     tdsaInitTimerRequest(tiRoot, &(tdsaPortContext[i].discovery.DiscoverySMPTimer));
2743     tdsaPortContext[i].discovery.retries = 0;  
2744     tdsaPortContext[i].discovery.configureRouteRetries = 0;  
2745     tdsaPortContext[i].discovery.deviceRetistrationRetries = 0;  
2746     tdsaPortContext[i].discovery.pendingSMP = 0;  
2747     tdsaPortContext[i].discovery.SeenBC = agFALSE;  
2748     tdsaPortContext[i].discovery.forcedOK = agFALSE;  
2749     tdsaPortContext[i].discovery.SMPRetries = 0;  
2750 //    tdsaPortContext[i].discovery.doIncremental = agFALSE;  
2751     tdsaPortContext[i].discovery.ResetTriggerred = agFALSE;  
2752 #endif
2753
2754     
2755 #ifdef INITIATOR_DRIVER  
2756     tdsaPortContext[i].DiscoveryState = ITD_DSTATE_NOT_STARTED;
2757     tdsaPortContext[i].nativeSATAMode = agFALSE;
2758     tdsaPortContext[i].directAttatchedSAS = agFALSE;
2759     tdsaPortContext[i].DiscoveryRdyGiven = agFALSE;
2760     tdsaPortContext[i].SeenLinkUp = agFALSE;
2761     
2762 #endif      
2763     tdsaPortContext[i].id = i;
2764     tdsaPortContext[i].agPortContext = agNULL;
2765     tdsaPortContext[i].LinkRate = 0;
2766     tdsaPortContext[i].Count = 0;
2767     tdsaPortContext[i].valid = agFALSE;
2768     for (j=0;j<TD_MAX_NUM_PHYS;j++)
2769     {
2770       tdsaPortContext[i].PhyIDList[j] = agFALSE;
2771     }
2772     tdsaPortContext[i].RegisteredDevNums = 0;
2773     tdsaPortContext[i].eventPhyID = 0xFF;
2774     tdsaPortContext[i].Transient = agFALSE;
2775     tdsaPortContext[i].PortRecoverPhyID = 0xFF;
2776     tdsaPortContext[i].DiscFailNSeenBC = agFALSE;
2777 #ifdef FDS_DM
2778     tdsaPortContext[i].dmPortContext.tdData = &(tdsaPortContext[i]);
2779     tdsaPortContext[i].DMDiscoveryState = dmDiscCompleted;
2780     tdsaPortContext[i].UseDM = agFALSE;    
2781     tdsaPortContext[i].UpdateMCN = agFALSE;    
2782 #endif
2783     /* add more variables later */
2784     TDLIST_ENQUEUE_AT_TAIL(&(tdsaPortContext[i].FreeLink), &(tdsaAllShared->FreePortContextList));
2785   }
2786
2787 #ifdef TD_INTERNAL_DEBUG  /* for debugging only */
2788   for(i=0;i<TD_MAX_PORT_CONTEXT;i++)
2789   {
2790     TI_DBG6(("tdsaPortContextInit: index %d  &tdsaPortContext[] %p\n", i, &(tdsaPortContext[i])));
2791   }
2792   TI_DBG6(("tdsaPortContextInit: sizeof(tdsaPortContext_t) %d 0x%x\n", sizeof(tdsaPortContext_t), sizeof(tdsaPortContext_t)));
2793 #endif
2794   return;
2795 }
2796
2797 /*****************************************************************************
2798 *! \brief tdsaPortContextReInit
2799 *
2800 *  Purpose: This function re-initializes port contexts for reuse.
2801 *
2802 *  \param   tiRoot:         pointer to the driver instance
2803 *  \param   onePortContext: pointer to the portcontext
2804 *
2805 *  \return: None
2806 *
2807 *  \note: 
2808 *
2809 *****************************************************************************/
2810 osGLOBAL void
2811 tdsaPortContextReInit(
2812                       tiRoot_t             *tiRoot,
2813                       tdsaPortContext_t    *onePortContext                   
2814                     )
2815 {
2816   int               j=0;
2817 #ifdef TD_DISCOVER
2818   tdsaDiscovery_t   *discovery;
2819 #endif
2820
2821   TI_DBG3(("tdsaPortContextReInit: start\n"));
2822   
2823 #ifdef TD_DISCOVER
2824   discovery = &(onePortContext->discovery);
2825   
2826     onePortContext->discovery.type = TDSA_DISCOVERY_OPTION_FULL_START;
2827     onePortContext->discovery.retries = 0;  
2828     onePortContext->discovery.configureRouteRetries = 0;  
2829     onePortContext->discovery.deviceRetistrationRetries = 0;  
2830     onePortContext->discovery.pendingSMP = 0;  
2831     onePortContext->discovery.SeenBC = agFALSE;  
2832     onePortContext->discovery.forcedOK = agFALSE;  
2833     onePortContext->discovery.SMPRetries = 0;  
2834     onePortContext->discovery.ResetTriggerred = agFALSE;
2835     /* free expander lists */
2836     tdsaFreeAllExp(tiRoot, onePortContext);
2837     /* kill the discovery-related timers if they are running */  
2838     if (discovery->discoveryTimer.timerRunning == agTRUE)
2839     {
2840       tdsaKillTimer(
2841                     tiRoot,
2842                     &discovery->discoveryTimer
2843                    );
2844     }
2845     if (discovery->configureRouteTimer.timerRunning == agTRUE)
2846     {
2847       tdsaKillTimer(
2848                     tiRoot,
2849                     &discovery->configureRouteTimer
2850                    );
2851     }
2852     if (discovery->deviceRegistrationTimer.timerRunning == agTRUE)
2853     {
2854       tdsaKillTimer(
2855                     tiRoot,
2856                     &discovery->deviceRegistrationTimer
2857                    );
2858     }
2859     if (discovery->BCTimer.timerRunning == agTRUE)
2860     {
2861       tdsaKillTimer(
2862                     tiRoot,
2863                     &discovery->BCTimer
2864                    );
2865     }
2866     if (discovery->SMPBusyTimer.timerRunning == agTRUE)
2867     {
2868       tdsaKillTimer(
2869                     tiRoot,
2870                     &discovery->SMPBusyTimer
2871                    );
2872     }    
2873     if (discovery->DiscoverySMPTimer.timerRunning == agTRUE)
2874     {
2875       tdsaKillTimer(
2876                     tiRoot,
2877                     &discovery->DiscoverySMPTimer
2878                    );
2879     }    
2880 #endif
2881
2882 #ifdef INITIATOR_DRIVER  
2883     onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
2884     onePortContext->nativeSATAMode = agFALSE;
2885     onePortContext->directAttatchedSAS = agFALSE;
2886     onePortContext->DiscoveryRdyGiven = agFALSE;
2887     onePortContext->SeenLinkUp = agFALSE;
2888 #endif
2889     onePortContext->agPortContext->osData = agNULL;
2890     onePortContext->agPortContext = agNULL;
2891     onePortContext->tiPortalContext = agNULL;
2892     onePortContext->agRoot = agNULL;
2893     onePortContext->LinkRate = 0;
2894     onePortContext->Count = 0;
2895     onePortContext->valid = agFALSE;
2896     for (j=0;j<TD_MAX_NUM_PHYS;j++)
2897     {
2898       onePortContext->PhyIDList[j] = agFALSE;
2899     }
2900     onePortContext->RegisteredDevNums = 0;
2901     onePortContext->eventPhyID = 0xFF;
2902     onePortContext->Transient = agFALSE;
2903     onePortContext->PortRecoverPhyID = 0xFF;
2904     onePortContext->DiscFailNSeenBC = agFALSE;
2905
2906 #ifdef FDS_DM
2907     onePortContext->dmPortContext.tdData = onePortContext;
2908     onePortContext->DMDiscoveryState = dmDiscCompleted;
2909     onePortContext->UseDM = agFALSE;
2910     onePortContext->UpdateMCN = agFALSE;
2911 #endif
2912   return;
2913 }
2914                     
2915 /*****************************************************************************
2916 *! \brief tdsaDeviceDataInit
2917 *
2918 *  Purpose: This function initializes devices
2919 *
2920 *  \param   tiRoot: pointer to the driver instance
2921 *
2922 *  \return: None
2923 *
2924 *  \note: 
2925 *
2926 *****************************************************************************/
2927 osGLOBAL void
2928 tdsaDeviceDataInit(
2929                    tiRoot_t *tiRoot 
2930                    )
2931 {
2932   tdsaRoot_t        *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
2933   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2934 #ifdef TD_DEBUG_ENABLE
2935   tdsaPortContext_t *tdsaPortContext = (tdsaPortContext_t *)tdsaAllShared->PortContextMem;
2936 #endif
2937   tdsaDeviceData_t  *tdsaDeviceData =
2938     (tdsaDeviceData_t *)tdsaAllShared->DeviceMem;
2939   int i;
2940 #ifdef  SATA_ENABLE
2941   bit32             j;
2942   satInternalIo_t   *satIntIO;
2943 #endif
2944   bit32             MaxTargets;
2945   
2946   TI_DBG6(("tdsaDeviceDataInit: start\n"));
2947   TI_DBG6(("tdsaDeviceDataInit: ******* tdsaPortContext %p \n",tdsaPortContext));
2948   TI_DBG6(("tdsaDeviceDataInit: ******* tdsaDeviceData %p\n", tdsaDeviceData));
2949   TI_DBG6(("tdsaDeviceDataInit: ******* tdsaDeviceData+1 %p\n", tdsaDeviceData+1));
2950   TI_DBG6(("tdsaDeviceDataInit: ******* &tdsaDeviceData[0] %p  &tdsaDeviceData[1] %p\n", &(tdsaDeviceData[0]), &(tdsaDeviceData[1])));
2951   
2952   /* the following fn fills in MaxTargets */
2953   tdssGetMaxTargetsParams(tiRoot, &MaxTargets);
2954   TI_DBG6(("tdsaDeviceDataInit: MaxTargets %d\n", MaxTargets));
2955   
2956   TDLIST_INIT_HDR(&(tdsaAllShared->MainDeviceList));
2957   TDLIST_INIT_HDR(&(tdsaAllShared->FreeDeviceList));
2958
2959   for(i=0;i<(int)MaxTargets;i++)
2960   {
2961     TDLIST_INIT_ELEMENT(&(tdsaDeviceData[i].FreeLink));
2962     TDLIST_INIT_ELEMENT(&(tdsaDeviceData[i].MainLink));
2963     TDLIST_INIT_ELEMENT(&(tdsaDeviceData[i].IncDisLink));
2964     tdsaDeviceData[i].id = i;
2965     tdsaDeviceData[i].InQID = 0;
2966     tdsaDeviceData[i].OutQID = 0;
2967     tdsaDeviceData[i].DeviceType = TD_DEFAULT_DEVICE;
2968     tdsaDeviceData[i].agRoot = agNULL;
2969     tdsaDeviceData[i].agDevHandle = agNULL;
2970     
2971     tdsaDeviceData[i].pJumpTable = &(tdsaAllShared->tdJumpTable);
2972     tdsaDeviceData[i].tiDeviceHandle.osData = agNULL;
2973     tdsaDeviceData[i].tiDeviceHandle.tdData = &(tdsaDeviceData[i]);
2974     tdsaDeviceData[i].tdPortContext = agNULL;
2975     tdsaDeviceData[i].tdExpander = agNULL;
2976     tdsaDeviceData[i].ExpDevice = agNULL;
2977     tdsaDeviceData[i].phyID = 0xFF;
2978     tdsaDeviceData[i].SASAddressID.sasAddressHi = 0;
2979     tdsaDeviceData[i].SASAddressID.sasAddressLo = 0;
2980     tdsaDeviceData[i].valid = agFALSE;
2981     tdsaDeviceData[i].valid2 = agFALSE;
2982     tdsaDeviceData[i].processed = agFALSE;
2983     tdsaDeviceData[i].initiator_ssp_stp_smp = 0;
2984     tdsaDeviceData[i].target_ssp_stp_smp = 0;
2985     tdsaDeviceData[i].numOfPhys = 0;
2986     tdsaDeviceData[i].registered = agFALSE;
2987     tdsaDeviceData[i].directlyAttached = agFALSE;
2988     tdsaDeviceData[i].SASSpecDeviceType = 0xFF;
2989     tdsaDeviceData[i].IOStart = 0;
2990     tdsaDeviceData[i].IOResponse = 0;
2991     tdsaDeviceData[i].agDeviceResetContext.osData = agNULL;
2992     tdsaDeviceData[i].agDeviceResetContext.sdkData = agNULL;
2993     tdsaDeviceData[i].TRflag = agFALSE;
2994     tdsaDeviceData[i].ResetCnt = 0;
2995     tdsaDeviceData[i].OSAbortAll = agFALSE;
2996     
2997 #ifdef FDS_DM
2998     tdsaDeviceData[i].devMCN = 1;
2999     tdsaDeviceData[i].finalMCN = 1;
3000 #endif
3001
3002 #ifdef FDS_SM
3003     tdsaDeviceData[i].SMNumOfFCA = 0;
3004     tdsaDeviceData[i].SMNumOfID = 0;
3005 #endif
3006     
3007 #ifdef  SATA_ENABLE
3008     TDLIST_INIT_HDR(&(tdsaDeviceData[i].satDevData.satIoLinkList));
3009     TDLIST_INIT_HDR(&(tdsaDeviceData[i].satDevData.satFreeIntIoLinkList));
3010     TDLIST_INIT_HDR(&(tdsaDeviceData[i].satDevData.satActiveIntIoLinkList));
3011     
3012     /* default */
3013     tdsaDeviceData[i].satDevData.satDriveState = SAT_DEV_STATE_NORMAL;
3014     tdsaDeviceData[i].satDevData.satNCQMaxIO =SAT_NCQ_MAX;
3015     tdsaDeviceData[i].satDevData.satPendingIO = 0;
3016     tdsaDeviceData[i].satDevData.satPendingNCQIO = 0;
3017     tdsaDeviceData[i].satDevData.satPendingNONNCQIO = 0;
3018     tdsaDeviceData[i].satDevData.IDDeviceValid = agFALSE;
3019     tdsaDeviceData[i].satDevData.freeSATAFDMATagBitmap = 0;
3020     tdsaDeviceData[i].satDevData.NumOfFCA = 0;
3021     tdsaDeviceData[i].satDevData.NumOfIDRetries = 0;
3022     tdsaDeviceData[i].satDevData.ID_Retries = 0;
3023     tdsaDeviceData[i].satDevData.IDPending = agFALSE;
3024     tdsaInitTimerRequest(tiRoot, &(tdsaDeviceData[i].SATAIDDeviceTimer));
3025 #ifdef FDS_SM
3026     tdsaInitTimerRequest(tiRoot, &(tdsaDeviceData[i].tdIDTimer));
3027 #endif   
3028     osti_memset(tdsaDeviceData[i].satDevData.satMaxLBA, 0, sizeof(tdsaDeviceData[i].satDevData.satMaxLBA));
3029
3030     tdsaDeviceData[i].satDevData.satSaDeviceData = &tdsaDeviceData[i];
3031     satIntIO = &tdsaDeviceData[i].satDevData.satIntIo[0];
3032     for (j = 0; j < SAT_MAX_INT_IO; j++)
3033     {
3034       TDLIST_INIT_ELEMENT (&satIntIO->satIntIoLink);
3035       TDLIST_ENQUEUE_AT_TAIL (&satIntIO->satIntIoLink, 
3036                               &tdsaDeviceData[i].satDevData.satFreeIntIoLinkList);
3037       satIntIO->satOrgTiIORequest = agNULL;
3038       satIntIO->id = j;
3039       satIntIO = satIntIO + 1;
3040     }
3041 #endif
3042     /* some other variables */
3043     TDLIST_ENQUEUE_AT_TAIL(&(tdsaDeviceData[i].FreeLink), &(tdsaAllShared->FreeDeviceList)); 
3044   }
3045
3046 #ifdef TD_INTERNAL_DEBUG  /* for debugging only */
3047   for(i=0;i<MaxTargets;i++)
3048   {
3049     TI_DBG6(("tdsaDeviceDataInit: index %d  &tdsaDeviceData[] %p\n", i, &(tdsaDeviceData[i])));
3050     
3051   }
3052   TI_DBG6(("tdsaDeviceDataInit: sizeof(tdsaDeviceData_t) %d 0x%x\n", sizeof(tdsaDeviceData_t), sizeof(tdsaDeviceData_t)));
3053 #endif  
3054   return;
3055 }
3056
3057 /*****************************************************************************
3058 *! \brief tdsaDeviceDataReInit
3059 *
3060 *  Purpose: This function re-initializes device data for reuse.
3061 *
3062 *  \param   tiRoot:         pointer to the driver instance
3063 *  \param   onePortContext: pointer to the device data
3064 *
3065 *  \return: None
3066 *
3067 *  \note: 
3068 *
3069 *****************************************************************************/
3070 osGLOBAL void
3071 tdsaDeviceDataReInit(
3072                    tiRoot_t             *tiRoot, 
3073                    tdsaDeviceData_t     *oneDeviceData
3074                    )
3075 {
3076   tdsaRoot_t        *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
3077   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3078 #ifdef  SATA_ENABLE    
3079   int               j=0;
3080   satInternalIo_t   *satIntIO;
3081 #endif
3082   
3083   TI_DBG3(("tdsaDeviceDataReInit: start\n"));
3084   
3085     oneDeviceData->InQID = 0;
3086     oneDeviceData->OutQID = 0;
3087     oneDeviceData->DeviceType = TD_DEFAULT_DEVICE;
3088     oneDeviceData->agDevHandle = agNULL;
3089     
3090     oneDeviceData->pJumpTable = &(tdsaAllShared->tdJumpTable);
3091     oneDeviceData->tiDeviceHandle.osData = agNULL;
3092     oneDeviceData->tiDeviceHandle.tdData = oneDeviceData;
3093     oneDeviceData->tdPortContext = agNULL;
3094     oneDeviceData->tdExpander = agNULL;
3095     oneDeviceData->ExpDevice = agNULL;
3096     oneDeviceData->phyID = 0xFF;
3097     oneDeviceData->SASAddressID.sasAddressHi = 0;
3098     oneDeviceData->SASAddressID.sasAddressLo = 0;
3099     oneDeviceData->valid = agFALSE;
3100     oneDeviceData->valid2 = agFALSE;
3101     oneDeviceData->processed = agFALSE;
3102     oneDeviceData->initiator_ssp_stp_smp = 0;
3103     oneDeviceData->target_ssp_stp_smp = 0;
3104     oneDeviceData->numOfPhys = 0;
3105     oneDeviceData->registered = agFALSE;
3106     oneDeviceData->directlyAttached = agFALSE;
3107     oneDeviceData->SASSpecDeviceType = 0xFF;
3108     oneDeviceData->IOStart = 0;
3109     oneDeviceData->IOResponse = 0;
3110     oneDeviceData->agDeviceResetContext.osData = agNULL;
3111     oneDeviceData->agDeviceResetContext.sdkData = agNULL;
3112     oneDeviceData->TRflag = agFALSE;
3113     oneDeviceData->ResetCnt = 0;   
3114     oneDeviceData->OSAbortAll = agFALSE;   
3115
3116 #ifdef FDS_DM
3117     oneDeviceData->devMCN = 1;
3118     oneDeviceData->finalMCN = 1;
3119 #endif
3120     
3121 #ifdef FDS_SM
3122     oneDeviceData->SMNumOfFCA = 0;
3123     oneDeviceData->SMNumOfID = 0;
3124     if (oneDeviceData->tdIDTimer.timerRunning == agTRUE)
3125     {
3126       tdsaKillTimer(
3127                     tiRoot,
3128                     &oneDeviceData->tdIDTimer
3129                     );
3130     }
3131 #endif
3132
3133 #ifdef  SATA_ENABLE    
3134     /* default */
3135     oneDeviceData->satDevData.satDriveState = SAT_DEV_STATE_NORMAL;
3136     oneDeviceData->satDevData.satNCQMaxIO =SAT_NCQ_MAX;
3137     oneDeviceData->satDevData.satPendingIO = 0;
3138     oneDeviceData->satDevData.satPendingNCQIO = 0;
3139     oneDeviceData->satDevData.satPendingNONNCQIO = 0;
3140     oneDeviceData->satDevData.IDDeviceValid = agFALSE;
3141     oneDeviceData->satDevData.freeSATAFDMATagBitmap = 0;
3142     oneDeviceData->satDevData.NumOfFCA = 0;
3143     oneDeviceData->satDevData.NumOfIDRetries = 0;
3144     oneDeviceData->satDevData.ID_Retries = 0;
3145     oneDeviceData->satDevData.IDPending = agFALSE;
3146     
3147     osti_memset(oneDeviceData->satDevData.satMaxLBA, 0, sizeof(oneDeviceData->satDevData.satMaxLBA));
3148     osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
3149
3150     oneDeviceData->satDevData.satSaDeviceData = oneDeviceData;
3151     
3152     satIntIO = (satInternalIo_t *)&(oneDeviceData->satDevData.satIntIo[0]);
3153     for (j = 0; j < SAT_MAX_INT_IO; j++)
3154     {
3155       TI_DBG3(("tdsaDeviceDataReInit: in loop of internal io free, id %d\n", satIntIO->id));
3156       satFreeIntIoResource(tiRoot, &(oneDeviceData->satDevData), satIntIO);    
3157       satIntIO = satIntIO + 1;    
3158     }
3159 #endif
3160   return;
3161 }                  
3162
3163 #ifdef TD_INT_COALESCE
3164 /*****************************************************************************
3165 *! \brief tdsaIntCoalCxtInit(
3166 *
3167 *  Purpose: This function initializes interrupt coalesce contexts.
3168 *
3169 *  \param   tiRoot: pointer to the driver instance
3170 *
3171 *  \return: None
3172 *
3173 *  \note: 
3174 *
3175 *****************************************************************************/
3176 osGLOBAL void
3177 tdsaIntCoalCxtInit(
3178                     tiRoot_t *tiRoot 
3179                     )
3180 {
3181   tdsaRoot_t               *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
3182   tdsaContext_t            *tdsaAllShared   = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3183   tdsaPortContext_t        *tdsaPortContext = (tdsaPortContext_t *)tdsaAllShared->PortContext;
3184   tdsaDeviceData_t         *tdsaDeviceData  = (tdsaDeviceData_t *)tdsaAllShared->DeviceDataHead;
3185   tdsaIntCoalesceContext_t *tdsaIntCoalCxt  = (tdsaIntCoalesceContext_t *)tdsaAllShared->IntCoalesce;
3186   int i = 0;
3187   int j = 0;
3188   bit32             MaxTargets;
3189    
3190   TI_DBG2(("tdsaIntCoalCxtInit: start\n"));
3191   TI_DBG6(("tdsaIntCoalCxtInit: ******* sizeof(tdsaPortContext) %d 0x%x\n", sizeof(tdsaPortContext_t), sizeof(tdsaPortContext_t)));
3192   TI_DBG6(("tdsaIntCoalCxtInit: ******* sizeof(tdsaIntCoalCxt) %d 0x%x\n", sizeof(tdsaDeviceData_t), sizeof(tdsaDeviceData_t)));
3193   TI_DBG6(("tdsaIntCoalCxtInit: ******* sizeof(tdsaIntCoalCxt) %d 0x%x\n", sizeof(tdsaIntCoalesceContext_t), sizeof(tdsaIntCoalesceContext_t)));
3194   TI_DBG6(("tdsaIntCoalCxtInit: ******* tdsaRoot %p \n", tdsaRoot));
3195   TI_DBG6(("tdsaIntCoalCxtInit: ******* tdsaPortContext %p \n",tdsaPortContext));
3196   TI_DBG6(("tdsaDeviceDataInit: ******* tdsaDeviceData %p\n", tdsaDeviceData));
3197   TI_DBG6(("tdsaIntCoalCxtInit: ******* tdsaIntCoalCxt+1 %p \n", tdsaIntCoalCxt + 1)); 
3198   TI_DBG6(("tdsaIntCoalCxtInit: ******* &tdsaIntCoalCxt[0] %p  &tdsaIntCoalCxt[1] %p\n", &(tdsaIntCoalCxt[0]), &(tdsaIntCoalCxt[1])));
3199
3200   /* for debug */
3201   TI_DBG6(("tdsaIntCoalCxtInit: TD_MAX_PORT_CONTEXT %d\n", TD_MAX_PORT_CONTEXT));
3202   /* the following fn fills in MaxTargets */
3203   tdssGetMaxTargetsParams(tiRoot, &MaxTargets);
3204   TI_DBG6(("tdsaIntCoalCxtInit: MaxTargets %d\n", MaxTargets));
3205   
3206   TI_DBG6(("tdsaIntCoalCxtInit: portcontext in sum 0x%x\n", sizeof(tdsaPortContext_t) * TD_MAX_PORT_CONTEXT));
3207   TI_DBG6(("tdsaIntCoalCxtInit: devicedata in sum 0x%x\n", sizeof(tdsaDeviceData_t) * MaxTargets));
3208   
3209   /* 
3210      tdsaIntCoalCx[0] is just head, not an element
3211   */
3212   TDLIST_INIT_HDR(&(tdsaIntCoalCxt[0].MainLink));
3213   TDLIST_INIT_HDR(&(tdsaIntCoalCxt[0].FreeLink));
3214
3215   tdsaIntCoalCxt[0].tdsaAllShared = tdsaAllShared;
3216   tdsaIntCoalCxt[0].tiIntCoalesceCxt = agNULL;
3217   tdsaIntCoalCxt[0].id = 0;
3218
3219   
3220   for(i=1;i<TD_MAX_INT_COALESCE;i++)
3221   {
3222     TDLIST_INIT_ELEMENT(&(tdsaIntCoalCxt[i].FreeLink));
3223     TDLIST_INIT_ELEMENT(&(tdsaIntCoalCxt[i].MainLink));
3224     
3225     tdsaIntCoalCxt[i].tdsaAllShared = tdsaAllShared;
3226     tdsaIntCoalCxt[i].tiIntCoalesceCxt = agNULL;
3227     tdsaIntCoalCxt[i].id = i;
3228
3229     /* enqueue */
3230     TDLIST_ENQUEUE_AT_TAIL(&(tdsaIntCoalCxt[i].FreeLink), &(tdsaIntCoalCxt[0].FreeLink));
3231   }
3232   return;
3233 }
3234 #endif /* TD_INT_COALESCE */
3235
3236
3237 osGLOBAL void
3238 tdsaExpanderInit(
3239                  tiRoot_t *tiRoot 
3240                  )
3241 {
3242   tdsaRoot_t        *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
3243   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3244
3245   tdsaExpander_t    *tdsaExpander =
3246     (tdsaExpander_t *)tdsaAllShared->ExpanderHead;
3247   bit32             MaxTargets;
3248
3249   
3250   int i;
3251
3252   TI_DBG6(("tdsaExpanderInit: start\n"));
3253   tdssGetMaxTargetsParams(tiRoot, &MaxTargets);
3254   TI_DBG6(("tdsaExpanderInit: MaxTargets %d\n", MaxTargets));
3255   
3256   //  TDLIST_INIT_HDR(&(tdsaAllShared->discoveringExpanderList));
3257   TDLIST_INIT_HDR(&(tdsaAllShared->freeExpanderList));
3258   
3259   for(i=0;i<(int)MaxTargets;i++)
3260   {
3261     TDLIST_INIT_ELEMENT(&(tdsaExpander[i].linkNode));
3262     TDLIST_INIT_ELEMENT(&(tdsaExpander[i].upNode));
3263     /* initialize expander fields */
3264     tdsaExpander[i].tdDevice = agNULL;
3265     tdsaExpander[i].tdUpStreamExpander = agNULL;
3266     tdsaExpander[i].tdDeviceToProcess = agNULL;
3267     tdsaExpander[i].tdCurrentDownStreamExpander = agNULL;
3268     tdsaExpander[i].hasUpStreamDevice = agFALSE;
3269     tdsaExpander[i].numOfUpStreamPhys = 0;
3270     tdsaExpander[i].currentUpStreamPhyIndex = 0;
3271     tdsaExpander[i].numOfDownStreamPhys = 0;
3272     tdsaExpander[i].currentDownStreamPhyIndex = 0;
3273     tdsaExpander[i].discoveringPhyId = 0;
3274     tdsaExpander[i].underDiscovering = agFALSE;
3275     tdsaExpander[i].id = i;
3276     tdsaExpander[i].tdReturnginExpander = agNULL;
3277     tdsaExpander[i].discoverSMPAllowed = agTRUE;
3278     osti_memset( &(tdsaExpander[i].currentIndex), 0, sizeof(tdsaExpander[i].currentIndex));
3279     osti_memset( &(tdsaExpander[i].upStreamPhys), 0, sizeof(tdsaExpander[i].upStreamPhys));
3280     osti_memset( &(tdsaExpander[i].downStreamPhys), 0, sizeof(tdsaExpander[i].downStreamPhys));
3281     osti_memset( &(tdsaExpander[i].routingAttribute), 0, sizeof(tdsaExpander[i].routingAttribute));
3282     tdsaExpander[i].configSASAddrTableIndex = 0;
3283     osti_memset( &(tdsaExpander[i].configSASAddressHiTable), 0, sizeof(tdsaExpander[i].configSASAddressHiTable));
3284     osti_memset( &(tdsaExpander[i].configSASAddressLoTable), 0, sizeof(tdsaExpander[i].configSASAddressLoTable));
3285     
3286     
3287     TDLIST_ENQUEUE_AT_TAIL(&(tdsaExpander[i].linkNode), &(tdsaAllShared->freeExpanderList)); 
3288   }
3289   return;
3290 }
3291
3292 osGLOBAL void 
3293 tdsaQueueConfigInit(
3294              tiRoot_t *tiRoot
3295              )
3296 {
3297   tdsaRoot_t     *tdsaRoot    = (tdsaRoot_t *)tiRoot->tdData;
3298   tdsaContext_t  *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3299   
3300   /* for memory index requirement */
3301   agsaQueueConfig_t   *QueueConfig;
3302   bit32                i;
3303
3304   TI_DBG2(("tdsaQueueConfigInit: start\n"));
3305   tdsaGetSwConfigParams(tiRoot);
3306   QueueConfig = &tdsaAllShared->QueueConfig;
3307
3308   for(i=0;i<QueueConfig->numInboundQueues;i++)
3309   {
3310     QueueConfig->inboundQueues[i].elementCount = tdsaAllShared->InboundQueueSize[i];
3311     QueueConfig->inboundQueues[i].elementSize = tdsaAllShared->InboundQueueEleSize[i];
3312     QueueConfig->inboundQueues[i].priority = tdsaAllShared->InboundQueuePriority[i];
3313     QueueConfig->inboundQueues[i].reserved = 0;
3314   }
3315   for(i=0;i<QueueConfig->numOutboundQueues;i++)
3316   {
3317     QueueConfig->outboundQueues[i].elementCount = tdsaAllShared->OutboundQueueSize[i];
3318     QueueConfig->outboundQueues[i].elementSize = tdsaAllShared->OutboundQueueEleSize[i];
3319     QueueConfig->outboundQueues[i].interruptDelay = tdsaAllShared->OutboundQueueInterruptDelay[i]; /* default 0; no interrupt delay */
3320     QueueConfig->outboundQueues[i].interruptCount = tdsaAllShared->OutboundQueueInterruptCount[i]; /* default 1*/
3321     QueueConfig->outboundQueues[i].interruptEnable = tdsaAllShared->OutboundQueueInterruptEnable[i]; /* default 1*/
3322     QueueConfig->outboundQueues[i].interruptVectorIndex = 0;
3323   }
3324   /*  default  */
3325   for (i=0;i<8;i++)
3326   {
3327     QueueConfig->sasHwEventQueue[i] = 0;
3328     QueueConfig->sataNCQErrorEventQueue[i] = 0;
3329   }
3330
3331 #ifdef TARGET_DRIVER
3332   for (i=0;i<8;i++)
3333   {
3334     QueueConfig->tgtITNexusEventQueue[i] = 0;
3335     QueueConfig->tgtSSPEventQueue[i] = 0;
3336     QueueConfig->tgtSMPEventQueue[i] = 0;
3337   }
3338 #endif
3339   QueueConfig->iqNormalPriorityProcessingDepth = 0;
3340   QueueConfig->iqHighPriorityProcessingDepth = 0;
3341   QueueConfig->generalEventQueue = 0;
3342
3343   return;
3344 }
3345
3346 /*****************************************************************************
3347 *! \brief  tdssGetMaxTargetsParams
3348 *
3349 *  Purpose: This function is called to get default parameters from the 
3350 *           OS Specific area. This function is called in the context of 
3351 *           tiCOMGetResource() and tiCOMInit().
3352 *
3353 *
3354 *  \param  tiRoot:   Pointer to initiator driver/port instance.
3355 *  \param  option:   Pointer to bit32 where the max target number is saved
3356 *
3357 *  \return: None
3358 *
3359 *  \note -
3360 *
3361 *****************************************************************************/
3362 osGLOBAL void 
3363 tdssGetMaxTargetsParams(
3364                       tiRoot_t                *tiRoot, 
3365                       bit32                   *pMaxTargets
3366                       )
3367 {
3368   char    *key = agNULL;
3369   char    *subkey1 = agNULL;
3370   char    *subkey2 = agNULL;
3371   char    *buffer;
3372   bit32   buffLen;
3373   bit32   lenRecv = 0;
3374   char    *pLastUsedChar = agNULL;
3375   char    tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
3376   char    globalStr[]     = "Global";
3377   char    iniParmsStr[]   = "InitiatorParms";
3378   bit32   MaxTargets;
3379
3380   TI_DBG6(("tdssGetMaxTargetsParams: start\n"));
3381   
3382   *pMaxTargets = DEFAULT_MAX_DEV;
3383  
3384   /* to remove compiler warnings */ 
3385   pLastUsedChar   = pLastUsedChar;
3386   lenRecv         = lenRecv;
3387   subkey2         = subkey2;
3388   subkey1         = subkey1;
3389   key             = key;
3390   buffer          = &tmpBuffer[0];
3391   buffLen         = sizeof (tmpBuffer);
3392
3393   osti_memset(buffer, 0, buffLen); 
3394
3395   /* defaults are overwritten in the following */
3396   /* Get MaxTargets */ 
3397   if ((ostiGetTransportParam(
3398                              tiRoot, 
3399                              globalStr,
3400                              iniParmsStr,
3401                              agNULL,
3402                              agNULL,
3403                              agNULL, 
3404                              agNULL, 
3405                              "MaxTargets",
3406                              buffer, 
3407                              buffLen, 
3408                              &lenRecv
3409                              ) == tiSuccess) && (lenRecv != 0))
3410   {
3411     if (osti_strncmp(buffer, "0x", 2) == 0)
3412     { 
3413       MaxTargets = osti_strtoul (buffer, &pLastUsedChar, 0);
3414     }
3415     else
3416     {
3417       MaxTargets = osti_strtoul (buffer, &pLastUsedChar, 10);
3418     }
3419     *pMaxTargets = MaxTargets;
3420     TI_DBG2(("tdssGetMaxTargetsParams: MaxTargets %d\n", MaxTargets ));
3421   }
3422   
3423   osti_memset(buffer, 0, buffLen);
3424   lenRecv = 0;
3425   
3426   return;
3427 }
3428
3429 /* temporary to distinguish SAS and SATA mode  */
3430 osGLOBAL void 
3431 tdssGetSATAOnlyModeParams(
3432                       tiRoot_t                *tiRoot, 
3433                       bit32                   *pSATAOnlyMode
3434                       )
3435 {
3436   char    *key = agNULL;
3437   char    *subkey1 = agNULL;
3438   char    *subkey2 = agNULL;
3439   char    *buffer;
3440   bit32   buffLen;
3441   bit32   lenRecv = 0;
3442   char    *pLastUsedChar = agNULL;
3443   char    tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
3444   char    globalStr[]     = "Global";
3445   char    iniParmsStr[]   = "InitiatorParms";
3446   bit32   SATAOnlyMode;
3447
3448   TI_DBG6(("tdssGetSATAOnlyModeParams: start\n"));
3449   
3450   *pSATAOnlyMode = agFALSE; /* default SAS and SATA */
3451  
3452   /* to remove compiler warnings */ 
3453   pLastUsedChar   = pLastUsedChar;
3454   lenRecv         = lenRecv;
3455   subkey2         = subkey2;
3456   subkey1         = subkey1;
3457   key             = key;
3458   buffer          = &tmpBuffer[0];
3459   buffLen         = sizeof (tmpBuffer);
3460
3461   osti_memset(buffer, 0, buffLen); 
3462
3463   /* defaults are overwritten in the following */
3464   /* Get SATAOnlyMode */ 
3465   if ((ostiGetTransportParam(
3466                              tiRoot, 
3467                              globalStr,
3468                              iniParmsStr,
3469                              agNULL,
3470                              agNULL,
3471                              agNULL, 
3472                              agNULL, 
3473                              "SATAOnlyMode",
3474                              buffer, 
3475                              buffLen, 
3476                              &lenRecv
3477                              ) == tiSuccess) && (lenRecv != 0))
3478   {
3479     if (osti_strncmp(buffer, "0x", 2) == 0)
3480     { 
3481       SATAOnlyMode = osti_strtoul (buffer, &pLastUsedChar, 0);
3482     }
3483     else
3484     {
3485       SATAOnlyMode = osti_strtoul (buffer, &pLastUsedChar, 10);
3486     }
3487     *pSATAOnlyMode = SATAOnlyMode;
3488   }
3489   
3490   osti_memset(buffer, 0, buffLen);
3491   lenRecv = 0;
3492   
3493   return;
3494 }
3495
3496