xref: /freebsd/sys/dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdinit.c (revision b5ff185e19f6013ca565b2a15bc2d6abce933f46)
1*4e1bc9a0SAchim Leubner /*******************************************************************************
2*4e1bc9a0SAchim Leubner  *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3*4e1bc9a0SAchim Leubner *
4*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*4e1bc9a0SAchim Leubner *that the following conditions are met:
6*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*4e1bc9a0SAchim Leubner *following disclaimer.
8*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
9*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*4e1bc9a0SAchim Leubner *with the distribution.
11*4e1bc9a0SAchim Leubner *
12*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20*4e1bc9a0SAchim Leubner  ********************************************************************************/
21*4e1bc9a0SAchim Leubner /*******************************************************************************/
22*4e1bc9a0SAchim Leubner /** \file
23*4e1bc9a0SAchim Leubner  *
24*4e1bc9a0SAchim Leubner  * $RCSfile: ttdinit.c,v $
25*4e1bc9a0SAchim Leubner  *
26*4e1bc9a0SAchim Leubner  * Copyright 2006 PMC-Sierra, Inc.
27*4e1bc9a0SAchim Leubner  *
28*4e1bc9a0SAchim Leubner  * $Author: vempatin $
29*4e1bc9a0SAchim Leubner  * $Revision: 113679 $
30*4e1bc9a0SAchim Leubner  * $Date: 2012-04-16 14:35:19 -0700 (Mon, 16 Apr 2012) $
31*4e1bc9a0SAchim Leubner  *
32*4e1bc9a0SAchim Leubner  * This file contains initiator IO related functions in TD layer
33*4e1bc9a0SAchim Leubner  *
34*4e1bc9a0SAchim Leubner  */
35*4e1bc9a0SAchim Leubner #include <osenv.h>
36*4e1bc9a0SAchim Leubner #include <ostypes.h>
37*4e1bc9a0SAchim Leubner #include <osdebug.h>
38*4e1bc9a0SAchim Leubner 
39*4e1bc9a0SAchim Leubner #include <sa.h>
40*4e1bc9a0SAchim Leubner #include <saapi.h>
41*4e1bc9a0SAchim Leubner #include <saosapi.h>
42*4e1bc9a0SAchim Leubner 
43*4e1bc9a0SAchim Leubner #include <titypes.h>
44*4e1bc9a0SAchim Leubner #include <ostiapi.h>
45*4e1bc9a0SAchim Leubner #include <tiapi.h>
46*4e1bc9a0SAchim Leubner #include <tiglobal.h>
47*4e1bc9a0SAchim Leubner 
48*4e1bc9a0SAchim Leubner #include <tdtypes.h>
49*4e1bc9a0SAchim Leubner #include <osstring.h>
50*4e1bc9a0SAchim Leubner #include <tdutil.h>
51*4e1bc9a0SAchim Leubner 
52*4e1bc9a0SAchim Leubner #ifdef INITIATOR_DRIVER
53*4e1bc9a0SAchim Leubner #include <itdtypes.h>
54*4e1bc9a0SAchim Leubner #include <itddefs.h>
55*4e1bc9a0SAchim Leubner #include <itdglobl.h>
56*4e1bc9a0SAchim Leubner #endif
57*4e1bc9a0SAchim Leubner 
58*4e1bc9a0SAchim Leubner #ifdef TARGET_DRIVER
59*4e1bc9a0SAchim Leubner #include "ttdglobl.h"
60*4e1bc9a0SAchim Leubner #include "ttdtxchg.h"
61*4e1bc9a0SAchim Leubner #include "ttdtypes.h"
62*4e1bc9a0SAchim Leubner #endif
63*4e1bc9a0SAchim Leubner 
64*4e1bc9a0SAchim Leubner #include <tdsatypes.h>
65*4e1bc9a0SAchim Leubner #include <tdproto.h>
66*4e1bc9a0SAchim Leubner 
67*4e1bc9a0SAchim Leubner /* io trace only */
68*4e1bc9a0SAchim Leubner extern void TDTraceInit(void);
69*4e1bc9a0SAchim Leubner /* io trace only */
70*4e1bc9a0SAchim Leubner 
71*4e1bc9a0SAchim Leubner 
72*4e1bc9a0SAchim Leubner osGLOBAL bit32
ttdssInit(tiRoot_t * tiRoot,tiTargetResource_t * targetResource,tiTdSharedMem_t * tdSharedMem)73*4e1bc9a0SAchim Leubner ttdssInit(
74*4e1bc9a0SAchim Leubner         tiRoot_t              *tiRoot,
75*4e1bc9a0SAchim Leubner         tiTargetResource_t    *targetResource,
76*4e1bc9a0SAchim Leubner         tiTdSharedMem_t       *tdSharedMem
77*4e1bc9a0SAchim Leubner )
78*4e1bc9a0SAchim Leubner {
79*4e1bc9a0SAchim Leubner     tdsaRoot_t                *tdsaRoot  = (tdsaRoot_t *)tiRoot->tdData;
80*4e1bc9a0SAchim Leubner     tiTargetMem_t             *tgtMem;
81*4e1bc9a0SAchim Leubner     ttdsaTgt_t                *Target;
82*4e1bc9a0SAchim Leubner     ttdssOperatingOption_t    *OperatingOption;
83*4e1bc9a0SAchim Leubner     char                      *buffer;
84*4e1bc9a0SAchim Leubner     bit32                     buffLen;
85*4e1bc9a0SAchim Leubner     bit32                     lenRecv = 0;
86*4e1bc9a0SAchim Leubner     char                      *pLastUsedChar = agNULL;
87*4e1bc9a0SAchim Leubner     char                      tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
88*4e1bc9a0SAchim Leubner     char                      globalStr[]     = "OSParms";
89*4e1bc9a0SAchim Leubner 
90*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdssInit: start\n"));
91*4e1bc9a0SAchim Leubner 
92*4e1bc9a0SAchim Leubner     /*
93*4e1bc9a0SAchim Leubner      first set the values to Default values
94*4e1bc9a0SAchim Leubner      Then, overwrite them using ostiGetTransportParam()
95*4e1bc9a0SAchim Leubner      */
96*4e1bc9a0SAchim Leubner 
97*4e1bc9a0SAchim Leubner     /* to remove compiler warnings */
98*4e1bc9a0SAchim Leubner     buffer          = &tmpBuffer[0];
99*4e1bc9a0SAchim Leubner     buffLen         = sizeof (tmpBuffer);
100*4e1bc9a0SAchim Leubner 
101*4e1bc9a0SAchim Leubner     osti_memset(buffer, 0, buffLen);
102*4e1bc9a0SAchim Leubner 
103*4e1bc9a0SAchim Leubner     tgtMem = &targetResource->targetMem;
104*4e1bc9a0SAchim Leubner 
105*4e1bc9a0SAchim Leubner     /*
106*4e1bc9a0SAchim Leubner      * Cached mem for target Transport Dependent Layer main functionality
107*4e1bc9a0SAchim Leubner      */
108*4e1bc9a0SAchim Leubner     Target = tgtMem->tdMem[0].virtPtr;
109*4e1bc9a0SAchim Leubner 
110*4e1bc9a0SAchim Leubner     OperatingOption = &Target->OperatingOption;
111*4e1bc9a0SAchim Leubner     /*
112*4e1bc9a0SAchim Leubner      * Get default parameters from the OS Specific area
113*4e1bc9a0SAchim Leubner      * and reads parameters from the configuration file
114*4e1bc9a0SAchim Leubner      */
115*4e1bc9a0SAchim Leubner     ttdssGetOperatingOptionParams(tiRoot, OperatingOption);
116*4e1bc9a0SAchim Leubner 
117*4e1bc9a0SAchim Leubner 
118*4e1bc9a0SAchim Leubner     /*
119*4e1bc9a0SAchim Leubner      * Update TD operating options
120*4e1bc9a0SAchim Leubner      */
121*4e1bc9a0SAchim Leubner     OperatingOption->UsecsPerTick =
122*4e1bc9a0SAchim Leubner             targetResource->targetOption.usecsPerTick;
123*4e1bc9a0SAchim Leubner     OperatingOption->numXchgs = tgtMem->tdMem[1].numElements;
124*4e1bc9a0SAchim Leubner 
125*4e1bc9a0SAchim Leubner 
126*4e1bc9a0SAchim Leubner     if (ttdsaXchgInit(tiRoot,
127*4e1bc9a0SAchim Leubner             &Target->ttdsaXchgData,
128*4e1bc9a0SAchim Leubner             tgtMem,
129*4e1bc9a0SAchim Leubner             OperatingOption->numXchgs
130*4e1bc9a0SAchim Leubner     ) == agFALSE)
131*4e1bc9a0SAchim Leubner     {
132*4e1bc9a0SAchim Leubner         TI_DBG1(("ttdInit: ttdsaXchgInit failed\n"));
133*4e1bc9a0SAchim Leubner         return tiError;
134*4e1bc9a0SAchim Leubner     }
135*4e1bc9a0SAchim Leubner 
136*4e1bc9a0SAchim Leubner     /* Get number of AutoGoodResponse entry */
137*4e1bc9a0SAchim Leubner     if ((ostiGetTransportParam(
138*4e1bc9a0SAchim Leubner                                 tiRoot,
139*4e1bc9a0SAchim Leubner                                 globalStr,
140*4e1bc9a0SAchim Leubner                                 agNULL,
141*4e1bc9a0SAchim Leubner                                 agNULL,
142*4e1bc9a0SAchim Leubner                                 agNULL,
143*4e1bc9a0SAchim Leubner                                 agNULL,
144*4e1bc9a0SAchim Leubner                                 agNULL,
145*4e1bc9a0SAchim Leubner                                 "AutoGoodResponse",
146*4e1bc9a0SAchim Leubner                                 buffer,
147*4e1bc9a0SAchim Leubner                                 buffLen,
148*4e1bc9a0SAchim Leubner                                 &lenRecv
149*4e1bc9a0SAchim Leubner                               ) == tiSuccess) && (lenRecv != 0))
150*4e1bc9a0SAchim Leubner     {
151*4e1bc9a0SAchim Leubner         if (osti_strncmp(buffer, "0x", 2) == 0)
152*4e1bc9a0SAchim Leubner         {
153*4e1bc9a0SAchim Leubner             tdsaRoot->autoGoodRSP = osti_strtoul (buffer, &pLastUsedChar, 0);
154*4e1bc9a0SAchim Leubner         }
155*4e1bc9a0SAchim Leubner         else
156*4e1bc9a0SAchim Leubner         {
157*4e1bc9a0SAchim Leubner             tdsaRoot->autoGoodRSP = osti_strtoul (buffer, &pLastUsedChar, 10);
158*4e1bc9a0SAchim Leubner         }
159*4e1bc9a0SAchim Leubner 
160*4e1bc9a0SAchim Leubner     }
161*4e1bc9a0SAchim Leubner 
162*4e1bc9a0SAchim Leubner     return tiSuccess;
163*4e1bc9a0SAchim Leubner }
164*4e1bc9a0SAchim Leubner 
165*4e1bc9a0SAchim Leubner /*
166*4e1bc9a0SAchim Leubner   this combines ttdGetDefaultParams and ttdGetTargetParms
167*4e1bc9a0SAchim Leubner 
168*4e1bc9a0SAchim Leubner  */
169*4e1bc9a0SAchim Leubner osGLOBAL void
ttdssGetOperatingOptionParams(tiRoot_t * tiRoot,ttdssOperatingOption_t * OperatingOption)170*4e1bc9a0SAchim Leubner ttdssGetOperatingOptionParams(
171*4e1bc9a0SAchim Leubner         tiRoot_t                *tiRoot,
172*4e1bc9a0SAchim Leubner         ttdssOperatingOption_t  *OperatingOption
173*4e1bc9a0SAchim Leubner )
174*4e1bc9a0SAchim Leubner {
175*4e1bc9a0SAchim Leubner     char    *key = agNULL;
176*4e1bc9a0SAchim Leubner     char    *subkey1 = agNULL;
177*4e1bc9a0SAchim Leubner     char    *subkey2 = agNULL;
178*4e1bc9a0SAchim Leubner     char    *buffer;
179*4e1bc9a0SAchim Leubner     bit32   buffLen;
180*4e1bc9a0SAchim Leubner     bit32   lenRecv = 0;
181*4e1bc9a0SAchim Leubner     char    *pLastUsedChar = agNULL;
182*4e1bc9a0SAchim Leubner     char    tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
183*4e1bc9a0SAchim Leubner     char    globalStr[]     = "Global";
184*4e1bc9a0SAchim Leubner     char    iniParmsStr[]   = "TargetParms";
185*4e1bc9a0SAchim Leubner 
186*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdssGetOperatingOptionParams: start\n"));
187*4e1bc9a0SAchim Leubner 
188*4e1bc9a0SAchim Leubner     /*
189*4e1bc9a0SAchim Leubner      first set the values to Default values
190*4e1bc9a0SAchim Leubner      Then, overwrite them using ostiGetTransportParam()
191*4e1bc9a0SAchim Leubner      */
192*4e1bc9a0SAchim Leubner 
193*4e1bc9a0SAchim Leubner 
194*4e1bc9a0SAchim Leubner     /* to remove compiler warnings */
195*4e1bc9a0SAchim Leubner     pLastUsedChar   = pLastUsedChar;
196*4e1bc9a0SAchim Leubner     lenRecv         = lenRecv;
197*4e1bc9a0SAchim Leubner     subkey2         = subkey2;
198*4e1bc9a0SAchim Leubner     subkey1         = subkey1;
199*4e1bc9a0SAchim Leubner     key             = key;
200*4e1bc9a0SAchim Leubner     buffer          = &tmpBuffer[0];
201*4e1bc9a0SAchim Leubner     buffLen         = sizeof (tmpBuffer);
202*4e1bc9a0SAchim Leubner 
203*4e1bc9a0SAchim Leubner     osti_memset(buffer, 0, buffLen);
204*4e1bc9a0SAchim Leubner 
205*4e1bc9a0SAchim Leubner 
206*4e1bc9a0SAchim Leubner     /* in ttgglobl.h */
207*4e1bc9a0SAchim Leubner     OperatingOption->numXchgs = DEFAULT_XCHGS;
208*4e1bc9a0SAchim Leubner     OperatingOption->UsecsPerTick = DEFAULT_TGT_TIMER_TICK; /* 1 sec */
209*4e1bc9a0SAchim Leubner     OperatingOption->MaxTargets = DEFAULT_MAX_TARGETS;
210*4e1bc9a0SAchim Leubner     OperatingOption->BlockSize = DEFAULT_BLOCK_SIZE;
211*4e1bc9a0SAchim Leubner 
212*4e1bc9a0SAchim Leubner 
213*4e1bc9a0SAchim Leubner     /* defaults are overwritten in the following */
214*4e1bc9a0SAchim Leubner     /* Get number of exchanges */
215*4e1bc9a0SAchim Leubner     if ((ostiGetTransportParam(
216*4e1bc9a0SAchim Leubner             tiRoot,
217*4e1bc9a0SAchim Leubner             globalStr,
218*4e1bc9a0SAchim Leubner             iniParmsStr,
219*4e1bc9a0SAchim Leubner             agNULL,
220*4e1bc9a0SAchim Leubner             agNULL,
221*4e1bc9a0SAchim Leubner             agNULL,
222*4e1bc9a0SAchim Leubner             agNULL,
223*4e1bc9a0SAchim Leubner             "NumberExchanges",
224*4e1bc9a0SAchim Leubner             buffer,
225*4e1bc9a0SAchim Leubner             buffLen,
226*4e1bc9a0SAchim Leubner             &lenRecv
227*4e1bc9a0SAchim Leubner     ) == tiSuccess) && (lenRecv != 0))
228*4e1bc9a0SAchim Leubner     {
229*4e1bc9a0SAchim Leubner         if (osti_strncmp(buffer, "0x", 2) == 0)
230*4e1bc9a0SAchim Leubner         {
231*4e1bc9a0SAchim Leubner             OperatingOption->numXchgs = osti_strtoul (buffer, &pLastUsedChar, 0);
232*4e1bc9a0SAchim Leubner         }
233*4e1bc9a0SAchim Leubner         else
234*4e1bc9a0SAchim Leubner         {
235*4e1bc9a0SAchim Leubner             OperatingOption->numXchgs = osti_strtoul (buffer, &pLastUsedChar, 10);
236*4e1bc9a0SAchim Leubner         }
237*4e1bc9a0SAchim Leubner 
238*4e1bc9a0SAchim Leubner     }
239*4e1bc9a0SAchim Leubner 
240*4e1bc9a0SAchim Leubner     osti_memset(buffer, 0, buffLen);
241*4e1bc9a0SAchim Leubner     lenRecv = 0;
242*4e1bc9a0SAchim Leubner 
243*4e1bc9a0SAchim Leubner     /* Get number of MaxTargets */
244*4e1bc9a0SAchim Leubner     if ((ostiGetTransportParam(
245*4e1bc9a0SAchim Leubner             tiRoot,
246*4e1bc9a0SAchim Leubner             globalStr,
247*4e1bc9a0SAchim Leubner             iniParmsStr,
248*4e1bc9a0SAchim Leubner             agNULL,
249*4e1bc9a0SAchim Leubner             agNULL,
250*4e1bc9a0SAchim Leubner             agNULL,
251*4e1bc9a0SAchim Leubner             agNULL,
252*4e1bc9a0SAchim Leubner             "MaxTargets",
253*4e1bc9a0SAchim Leubner             buffer,
254*4e1bc9a0SAchim Leubner             buffLen,
255*4e1bc9a0SAchim Leubner             &lenRecv
256*4e1bc9a0SAchim Leubner     ) == tiSuccess) && (lenRecv != 0))
257*4e1bc9a0SAchim Leubner     {
258*4e1bc9a0SAchim Leubner         if (osti_strncmp(buffer, "0x", 2) == 0)
259*4e1bc9a0SAchim Leubner         {
260*4e1bc9a0SAchim Leubner             OperatingOption->MaxTargets = osti_strtoul (buffer, &pLastUsedChar, 0);
261*4e1bc9a0SAchim Leubner         }
262*4e1bc9a0SAchim Leubner         else
263*4e1bc9a0SAchim Leubner         {
264*4e1bc9a0SAchim Leubner             OperatingOption->MaxTargets = osti_strtoul (buffer, &pLastUsedChar, 10);
265*4e1bc9a0SAchim Leubner         }
266*4e1bc9a0SAchim Leubner 
267*4e1bc9a0SAchim Leubner     }
268*4e1bc9a0SAchim Leubner     osti_memset(buffer, 0, buffLen);
269*4e1bc9a0SAchim Leubner     lenRecv = 0;
270*4e1bc9a0SAchim Leubner 
271*4e1bc9a0SAchim Leubner     /* Get number of BlockSize */
272*4e1bc9a0SAchim Leubner     if ((ostiGetTransportParam(
273*4e1bc9a0SAchim Leubner             tiRoot,
274*4e1bc9a0SAchim Leubner             globalStr,
275*4e1bc9a0SAchim Leubner             iniParmsStr,
276*4e1bc9a0SAchim Leubner             agNULL,
277*4e1bc9a0SAchim Leubner             agNULL,
278*4e1bc9a0SAchim Leubner             agNULL,
279*4e1bc9a0SAchim Leubner             agNULL,
280*4e1bc9a0SAchim Leubner             "BlockSize",
281*4e1bc9a0SAchim Leubner             buffer,
282*4e1bc9a0SAchim Leubner             buffLen,
283*4e1bc9a0SAchim Leubner             &lenRecv
284*4e1bc9a0SAchim Leubner     ) == tiSuccess) && (lenRecv != 0))
285*4e1bc9a0SAchim Leubner     {
286*4e1bc9a0SAchim Leubner         if (osti_strncmp(buffer, "0x", 2) == 0)
287*4e1bc9a0SAchim Leubner         {
288*4e1bc9a0SAchim Leubner             OperatingOption->BlockSize = osti_strtoul (buffer, &pLastUsedChar, 0);
289*4e1bc9a0SAchim Leubner         }
290*4e1bc9a0SAchim Leubner         else
291*4e1bc9a0SAchim Leubner         {
292*4e1bc9a0SAchim Leubner             OperatingOption->BlockSize = osti_strtoul (buffer, &pLastUsedChar, 10);
293*4e1bc9a0SAchim Leubner         }
294*4e1bc9a0SAchim Leubner     }
295*4e1bc9a0SAchim Leubner     osti_memset(buffer, 0, buffLen);
296*4e1bc9a0SAchim Leubner     lenRecv = 0;
297*4e1bc9a0SAchim Leubner 
298*4e1bc9a0SAchim Leubner 
299*4e1bc9a0SAchim Leubner 
300*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdssGetOperatingOptionParams: NumberExchanges %d UsecsPerTick %d MaxTargets %d BlockSize %d\n", OperatingOption->numXchgs, OperatingOption->UsecsPerTick, OperatingOption->MaxTargets, OperatingOption->BlockSize));
301*4e1bc9a0SAchim Leubner 
302*4e1bc9a0SAchim Leubner     return;
303*4e1bc9a0SAchim Leubner }
304*4e1bc9a0SAchim Leubner 
305*4e1bc9a0SAchim Leubner /* not yet */
306*4e1bc9a0SAchim Leubner osGLOBAL void
ttdssGetResource(tiRoot_t * tiRoot,tiTargetResource_t * targetResource)307*4e1bc9a0SAchim Leubner ttdssGetResource(
308*4e1bc9a0SAchim Leubner         tiRoot_t              *tiRoot,
309*4e1bc9a0SAchim Leubner         tiTargetResource_t    *targetResource
310*4e1bc9a0SAchim Leubner )
311*4e1bc9a0SAchim Leubner {
312*4e1bc9a0SAchim Leubner     tiTargetMem_t            *tgtMem;
313*4e1bc9a0SAchim Leubner     int i;
314*4e1bc9a0SAchim Leubner     ttdssOperatingOption_t   OperatingOption;
315*4e1bc9a0SAchim Leubner     bit32                     xchgSize;
316*4e1bc9a0SAchim Leubner     bit32                     respSize;
317*4e1bc9a0SAchim Leubner     bit32                     smprespSize;
318*4e1bc9a0SAchim Leubner 
319*4e1bc9a0SAchim Leubner     TI_DBG4(("ttdssGetResource: start\n"));
320*4e1bc9a0SAchim Leubner 
321*4e1bc9a0SAchim Leubner     tgtMem = &targetResource->targetMem;
322*4e1bc9a0SAchim Leubner 
323*4e1bc9a0SAchim Leubner     /*
324*4e1bc9a0SAchim Leubner     only 4 memory descriptors are used
325*4e1bc9a0SAchim Leubner      */
326*4e1bc9a0SAchim Leubner     tgtMem->count = 4;
327*4e1bc9a0SAchim Leubner 
328*4e1bc9a0SAchim Leubner     /* initiailization */
329*4e1bc9a0SAchim Leubner     for (i = 0 ; i < 10 ; i++)
330*4e1bc9a0SAchim Leubner     {
331*4e1bc9a0SAchim Leubner         tgtMem->tdMem[i].singleElementLength  = 0;
332*4e1bc9a0SAchim Leubner         tgtMem->tdMem[i].numElements          = 0;
333*4e1bc9a0SAchim Leubner         tgtMem->tdMem[i].totalLength          = 0;
334*4e1bc9a0SAchim Leubner         tgtMem->tdMem[i].alignment            = 0;
335*4e1bc9a0SAchim Leubner         tgtMem->tdMem[i].type                 = TI_CACHED_MEM;
336*4e1bc9a0SAchim Leubner         tgtMem->tdMem[i].reserved             = 0;
337*4e1bc9a0SAchim Leubner         tgtMem->tdMem[i].virtPtr               = agNULL;
338*4e1bc9a0SAchim Leubner         tgtMem->tdMem[i].osHandle              = agNULL;
339*4e1bc9a0SAchim Leubner         tgtMem->tdMem[i].physAddrUpper         = 0;
340*4e1bc9a0SAchim Leubner         tgtMem->tdMem[i].physAddrLower         = 0;
341*4e1bc9a0SAchim Leubner     }
342*4e1bc9a0SAchim Leubner 
343*4e1bc9a0SAchim Leubner     /*
344*4e1bc9a0SAchim Leubner      * Get default parameters from the OS Specific area
345*4e1bc9a0SAchim Leubner      * and reads parameters from the configuration file
346*4e1bc9a0SAchim Leubner      */
347*4e1bc9a0SAchim Leubner     ttdssGetOperatingOptionParams(tiRoot, &OperatingOption);
348*4e1bc9a0SAchim Leubner 
349*4e1bc9a0SAchim Leubner     /* target */
350*4e1bc9a0SAchim Leubner     tgtMem->tdMem[0].singleElementLength  = sizeof(ttdsaTgt_t);
351*4e1bc9a0SAchim Leubner     tgtMem->tdMem[0].numElements          = 1;
352*4e1bc9a0SAchim Leubner     tgtMem->tdMem[0].totalLength          =
353*4e1bc9a0SAchim Leubner             tgtMem->tdMem[0].singleElementLength *
354*4e1bc9a0SAchim Leubner             tgtMem->tdMem[0].numElements;
355*4e1bc9a0SAchim Leubner     tgtMem->tdMem[0].alignment            = sizeof (void *);
356*4e1bc9a0SAchim Leubner     tgtMem->tdMem[0].type                 = TI_CACHED_MEM;
357*4e1bc9a0SAchim Leubner     tgtMem->tdMem[0].reserved             = 0;
358*4e1bc9a0SAchim Leubner     tgtMem->tdMem[0].virtPtr               = agNULL;
359*4e1bc9a0SAchim Leubner     tgtMem->tdMem[0].osHandle              = agNULL;
360*4e1bc9a0SAchim Leubner     tgtMem->tdMem[0].physAddrUpper         = 0;
361*4e1bc9a0SAchim Leubner     tgtMem->tdMem[0].physAddrLower         = 0;
362*4e1bc9a0SAchim Leubner 
363*4e1bc9a0SAchim Leubner     /*
364*4e1bc9a0SAchim Leubner      * Cached memory for I/O exchange structures
365*4e1bc9a0SAchim Leubner      */
366*4e1bc9a0SAchim Leubner     xchgSize = sizeof(ttdsaXchg_t);
367*4e1bc9a0SAchim Leubner     xchgSize = AG_ALIGNSIZE(xchgSize, 8);
368*4e1bc9a0SAchim Leubner 
369*4e1bc9a0SAchim Leubner     tgtMem->tdMem[1].singleElementLength = xchgSize;
370*4e1bc9a0SAchim Leubner     tgtMem->tdMem[1].numElements         = OperatingOption.numXchgs;
371*4e1bc9a0SAchim Leubner     tgtMem->tdMem[1].totalLength         = tgtMem->tdMem[1].singleElementLength *
372*4e1bc9a0SAchim Leubner             tgtMem->tdMem[1].numElements;
373*4e1bc9a0SAchim Leubner     tgtMem->tdMem[1].alignment           = sizeof(void *);
374*4e1bc9a0SAchim Leubner     tgtMem->tdMem[1].type                = TI_CACHED_MEM;
375*4e1bc9a0SAchim Leubner     tgtMem->tdMem[1].reserved             = 0;
376*4e1bc9a0SAchim Leubner     tgtMem->tdMem[1].virtPtr               = agNULL;
377*4e1bc9a0SAchim Leubner     tgtMem->tdMem[1].osHandle              = agNULL;
378*4e1bc9a0SAchim Leubner     tgtMem->tdMem[1].physAddrUpper         = 0;
379*4e1bc9a0SAchim Leubner     tgtMem->tdMem[1].physAddrLower         = 0;
380*4e1bc9a0SAchim Leubner 
381*4e1bc9a0SAchim Leubner     /*
382*4e1bc9a0SAchim Leubner      * Uncached memory for response buffer structures
383*4e1bc9a0SAchim Leubner      */
384*4e1bc9a0SAchim Leubner     TI_DBG4(("ttdssGetResource: sas_resp_t size 0x%x %d\n",
385*4e1bc9a0SAchim Leubner             (unsigned int)sizeof(sas_resp_t), (int)sizeof(sas_resp_t)));
386*4e1bc9a0SAchim Leubner 
387*4e1bc9a0SAchim Leubner     respSize = (sizeof(sas_resp_t) + AG_WORD_ALIGN_ADD) & AG_WORD_ALIGN_MASK;
388*4e1bc9a0SAchim Leubner     TI_DBG4(("ttdssGetResource: response size 0x%x %d\n", respSize,respSize));
389*4e1bc9a0SAchim Leubner     respSize = AG_ALIGNSIZE(respSize, 8);
390*4e1bc9a0SAchim Leubner     TI_DBG4(("ttdssGetResource: response size 0x%x %d\n", respSize,respSize));
391*4e1bc9a0SAchim Leubner     tgtMem->tdMem[2].singleElementLength = 0x1000; /* respSize; 0x1000;  */
392*4e1bc9a0SAchim Leubner     tgtMem->tdMem[2].numElements         = OperatingOption.numXchgs;  /* Same as num of xchg */
393*4e1bc9a0SAchim Leubner     tgtMem->tdMem[2].totalLength         = tgtMem->tdMem[2].singleElementLength *
394*4e1bc9a0SAchim Leubner             tgtMem->tdMem[2].numElements;
395*4e1bc9a0SAchim Leubner     /* 8;4;16;256;sizeof(void *); all worked */
396*4e1bc9a0SAchim Leubner     tgtMem->tdMem[2].alignment           = 16;
397*4e1bc9a0SAchim Leubner     tgtMem->tdMem[2].type                = TI_DMA_MEM;  /* uncached memory */
398*4e1bc9a0SAchim Leubner     tgtMem->tdMem[2].reserved             = 0;
399*4e1bc9a0SAchim Leubner     tgtMem->tdMem[2].virtPtr               = agNULL;
400*4e1bc9a0SAchim Leubner     tgtMem->tdMem[2].osHandle              = agNULL;
401*4e1bc9a0SAchim Leubner     tgtMem->tdMem[2].physAddrUpper         = 0;
402*4e1bc9a0SAchim Leubner     tgtMem->tdMem[2].physAddrLower         = 0;
403*4e1bc9a0SAchim Leubner 
404*4e1bc9a0SAchim Leubner     /*
405*4e1bc9a0SAchim Leubner      * Uncached memory for SMP response buffer structures
406*4e1bc9a0SAchim Leubner      */
407*4e1bc9a0SAchim Leubner     smprespSize = sizeof(smp_resp_t);
408*4e1bc9a0SAchim Leubner     smprespSize = AG_ALIGNSIZE(smprespSize, 8);
409*4e1bc9a0SAchim Leubner     TI_DBG4(("ttdssGetResource: SMP response size 0x%x %d\n", smprespSize,smprespSize));
410*4e1bc9a0SAchim Leubner 
411*4e1bc9a0SAchim Leubner     tgtMem->tdMem[3].singleElementLength = smprespSize; /*0x1000; smprespSize; */
412*4e1bc9a0SAchim Leubner     tgtMem->tdMem[3].numElements         = OperatingOption.numXchgs;  /* Same as num of xchg */
413*4e1bc9a0SAchim Leubner     tgtMem->tdMem[3].totalLength
414*4e1bc9a0SAchim Leubner     = tgtMem->tdMem[3].singleElementLength * tgtMem->tdMem[3].numElements;
415*4e1bc9a0SAchim Leubner     tgtMem->tdMem[3].alignment           = 16; /* 4; 256; 16; sizeof(void *); */
416*4e1bc9a0SAchim Leubner     tgtMem->tdMem[3].type                = TI_DMA_MEM;  /* uncached memory */
417*4e1bc9a0SAchim Leubner     tgtMem->tdMem[3].reserved             = 0;
418*4e1bc9a0SAchim Leubner     tgtMem->tdMem[3].virtPtr               = agNULL;
419*4e1bc9a0SAchim Leubner     tgtMem->tdMem[3].osHandle              = agNULL;
420*4e1bc9a0SAchim Leubner     tgtMem->tdMem[3].physAddrUpper         = 0;
421*4e1bc9a0SAchim Leubner     tgtMem->tdMem[3].physAddrLower         = 0;
422*4e1bc9a0SAchim Leubner 
423*4e1bc9a0SAchim Leubner 
424*4e1bc9a0SAchim Leubner 
425*4e1bc9a0SAchim Leubner     targetResource->targetOption.usecsPerTick = OperatingOption.UsecsPerTick;
426*4e1bc9a0SAchim Leubner     targetResource->targetOption.pageSize     = 0; /* not applicable to SAS/SATA */
427*4e1bc9a0SAchim Leubner     targetResource->targetOption.numLgns      = 0; /* not applicable to SAS/SATA */
428*4e1bc9a0SAchim Leubner     targetResource->targetOption.numSessions  = 0; /* not applicable to SAS/SATA */
429*4e1bc9a0SAchim Leubner     targetResource->targetOption.numXchgs     = OperatingOption.numXchgs;
430*4e1bc9a0SAchim Leubner 
431*4e1bc9a0SAchim Leubner 
432*4e1bc9a0SAchim Leubner     /*
433*4e1bc9a0SAchim Leubner     This is not used in OS like Linux which supports dynamic memeory allocation
434*4e1bc9a0SAchim Leubner     In short, this is for Windows
435*4e1bc9a0SAchim Leubner      */
436*4e1bc9a0SAchim Leubner     /* Estimate dynamic DMA memory */
437*4e1bc9a0SAchim Leubner     targetResource->targetOption.dynamicDmaMem.alignment = sizeof(void *);
438*4e1bc9a0SAchim Leubner 
439*4e1bc9a0SAchim Leubner     targetResource->targetOption.dynamicDmaMem.numElements = 128;
440*4e1bc9a0SAchim Leubner     targetResource->targetOption.dynamicDmaMem.singleElementLength = sizeof(tdssSMPRequestBody_t);
441*4e1bc9a0SAchim Leubner     targetResource->targetOption.dynamicDmaMem.totalLength =
442*4e1bc9a0SAchim Leubner             targetResource->targetOption.dynamicDmaMem.numElements *
443*4e1bc9a0SAchim Leubner             targetResource->targetOption.dynamicDmaMem.singleElementLength;
444*4e1bc9a0SAchim Leubner 
445*4e1bc9a0SAchim Leubner     /* Estimate dynamic cached memory */
446*4e1bc9a0SAchim Leubner     targetResource->targetOption.dynamicCachedMem.alignment =  sizeof(void *);
447*4e1bc9a0SAchim Leubner     targetResource->targetOption.dynamicCachedMem.numElements = 128;
448*4e1bc9a0SAchim Leubner     targetResource->targetOption.dynamicCachedMem.singleElementLength = sizeof(tdssSMPRequestBody_t);
449*4e1bc9a0SAchim Leubner     targetResource->targetOption.dynamicCachedMem.totalLength =
450*4e1bc9a0SAchim Leubner             targetResource->targetOption.dynamicCachedMem.numElements *
451*4e1bc9a0SAchim Leubner             targetResource->targetOption.dynamicCachedMem.singleElementLength;
452*4e1bc9a0SAchim Leubner 
453*4e1bc9a0SAchim Leubner 
454*4e1bc9a0SAchim Leubner     return;
455*4e1bc9a0SAchim Leubner }
456*4e1bc9a0SAchim Leubner 
457*4e1bc9a0SAchim Leubner /* not in use */
458*4e1bc9a0SAchim Leubner osGLOBAL void
ttdssGetTargetParams(tiRoot_t * tiRoot)459*4e1bc9a0SAchim Leubner ttdssGetTargetParams(
460*4e1bc9a0SAchim Leubner         tiRoot_t          *tiRoot
461*4e1bc9a0SAchim Leubner )
462*4e1bc9a0SAchim Leubner {
463*4e1bc9a0SAchim Leubner     TI_DBG6(("ttdssGetTargetParams: start\n"));
464*4e1bc9a0SAchim Leubner     return;
465*4e1bc9a0SAchim Leubner }
466*4e1bc9a0SAchim Leubner 
467*4e1bc9a0SAchim Leubner osGLOBAL agBOOLEAN
ttdsaXchgInit(tiRoot_t * tiRoot,ttdsaXchgData_t * ttdsaXchgData,tiTargetMem_t * tgtMem,bit32 maxNumXchgs)468*4e1bc9a0SAchim Leubner ttdsaXchgInit(
469*4e1bc9a0SAchim Leubner         tiRoot_t           *tiRoot,
470*4e1bc9a0SAchim Leubner         ttdsaXchgData_t    *ttdsaXchgData,
471*4e1bc9a0SAchim Leubner         tiTargetMem_t      *tgtMem,
472*4e1bc9a0SAchim Leubner         bit32              maxNumXchgs
473*4e1bc9a0SAchim Leubner )
474*4e1bc9a0SAchim Leubner {
475*4e1bc9a0SAchim Leubner     ttdsaXchg_t       *ttdsaXchg;
476*4e1bc9a0SAchim Leubner     bit32             i, respLen;
477*4e1bc9a0SAchim Leubner     bit8              *virtualAddr;
478*4e1bc9a0SAchim Leubner     bit32             phyAddrLower, phyAddrUpper;
479*4e1bc9a0SAchim Leubner     bit32             smprespLen;
480*4e1bc9a0SAchim Leubner     bit32             smpphyAddrLower, smpphyAddrUpper;
481*4e1bc9a0SAchim Leubner     bit8              *smpvirtualAddr;
482*4e1bc9a0SAchim Leubner 
483*4e1bc9a0SAchim Leubner 
484*4e1bc9a0SAchim Leubner 
485*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgInit: start\n"));
486*4e1bc9a0SAchim Leubner     /* io trace only */
487*4e1bc9a0SAchim Leubner     TDTraceInit();
488*4e1bc9a0SAchim Leubner     /* io trace only */
489*4e1bc9a0SAchim Leubner 
490*4e1bc9a0SAchim Leubner     /*
491*4e1bc9a0SAchim Leubner      * Set and initialize some global exchange information
492*4e1bc9a0SAchim Leubner      */
493*4e1bc9a0SAchim Leubner     TDLIST_INIT_HDR(&ttdsaXchgData->xchgFreeList);
494*4e1bc9a0SAchim Leubner     TDLIST_INIT_HDR(&ttdsaXchgData->xchgBusyList);
495*4e1bc9a0SAchim Leubner 
496*4e1bc9a0SAchim Leubner     ttdsaXchgData->maxNumXchgs = maxNumXchgs;
497*4e1bc9a0SAchim Leubner 
498*4e1bc9a0SAchim Leubner     /* Initialize exchange and response buffer structures */
499*4e1bc9a0SAchim Leubner     ttdsaXchg = (ttdsaXchg_t *) tgtMem->tdMem[1].virtPtr;
500*4e1bc9a0SAchim Leubner 
501*4e1bc9a0SAchim Leubner     /* Initialize response buffer */
502*4e1bc9a0SAchim Leubner     virtualAddr  = tgtMem->tdMem[2].virtPtr;
503*4e1bc9a0SAchim Leubner     phyAddrUpper = tgtMem->tdMem[2].physAddrUpper;
504*4e1bc9a0SAchim Leubner     phyAddrLower = tgtMem->tdMem[2].physAddrLower;
505*4e1bc9a0SAchim Leubner     respLen      = tgtMem->tdMem[2].singleElementLength;
506*4e1bc9a0SAchim Leubner 
507*4e1bc9a0SAchim Leubner     ttdsaXchg->resp.virtAddr      = virtualAddr;
508*4e1bc9a0SAchim Leubner     ttdsaXchg->resp.phyAddrUpper = phyAddrUpper;
509*4e1bc9a0SAchim Leubner     ttdsaXchg->resp.phyAddrLower = phyAddrLower;
510*4e1bc9a0SAchim Leubner     ttdsaXchg->resp.length = respLen;
511*4e1bc9a0SAchim Leubner 
512*4e1bc9a0SAchim Leubner     /* Initialize SMP response buffer */
513*4e1bc9a0SAchim Leubner     smpvirtualAddr  = tgtMem->tdMem[3].virtPtr;
514*4e1bc9a0SAchim Leubner     smpphyAddrUpper = tgtMem->tdMem[3].physAddrUpper;
515*4e1bc9a0SAchim Leubner     smpphyAddrLower = tgtMem->tdMem[3].physAddrLower;
516*4e1bc9a0SAchim Leubner     smprespLen      = tgtMem->tdMem[3].singleElementLength;
517*4e1bc9a0SAchim Leubner 
518*4e1bc9a0SAchim Leubner     ttdsaXchg->smpresp.virtAddr      = smpvirtualAddr;
519*4e1bc9a0SAchim Leubner     ttdsaXchg->smpresp.phyAddrUpper = smpphyAddrUpper;
520*4e1bc9a0SAchim Leubner     ttdsaXchg->smpresp.phyAddrLower = smpphyAddrLower;
521*4e1bc9a0SAchim Leubner     ttdsaXchg->smpresp.length = smprespLen;
522*4e1bc9a0SAchim Leubner 
523*4e1bc9a0SAchim Leubner     /* Initialization of callback and etc */
524*4e1bc9a0SAchim Leubner     for (i=0;i<maxNumXchgs;i++)
525*4e1bc9a0SAchim Leubner     {
526*4e1bc9a0SAchim Leubner         ttdsaXchg->id = i;
527*4e1bc9a0SAchim Leubner         ttdsaXchg->usedEsgl = agFALSE;
528*4e1bc9a0SAchim Leubner         ttdsaXchg->io_found = agTRUE;
529*4e1bc9a0SAchim Leubner         ttdsaXchg->DeviceData = agNULL;
530*4e1bc9a0SAchim Leubner         /* callback for IO(ssp) and SMP */
531*4e1bc9a0SAchim Leubner         ttdsaXchg->IORequestBody.IOCompletionFunc = ttdsaIOCompleted;
532*4e1bc9a0SAchim Leubner         ttdsaXchg->SMPRequestBody.SMPCompletionFunc = ttdsaSMPCompleted;
533*4e1bc9a0SAchim Leubner 
534*4e1bc9a0SAchim Leubner 
535*4e1bc9a0SAchim Leubner         TDLIST_INIT_ELEMENT(&ttdsaXchg->XchgLinks );
536*4e1bc9a0SAchim Leubner 
537*4e1bc9a0SAchim Leubner         ttdsaXchg->IORequestBody.agIORequest.osData = (void *)ttdsaXchg;
538*4e1bc9a0SAchim Leubner         ttdsaXchg->IORequestBody.tiIORequest
539*4e1bc9a0SAchim Leubner         = &(ttdsaXchg->IORequestBody.IOType.TargetIO.tiIORequest);
540*4e1bc9a0SAchim Leubner 
541*4e1bc9a0SAchim Leubner         /* Init the tdData portion of tiIORequest context for this exchange */
542*4e1bc9a0SAchim Leubner         ttdsaXchg->IORequestBody.tiIORequest->tdData = ttdsaXchg;
543*4e1bc9a0SAchim Leubner 
544*4e1bc9a0SAchim Leubner         /* SMP */
545*4e1bc9a0SAchim Leubner         ttdsaXchg->SMPRequestBody.agIORequest.osData = (void *)ttdsaXchg;
546*4e1bc9a0SAchim Leubner         /* ttdsaXchg->SMPRequestBody.agIORequest.osData = (void *)&ttdsaXchg->SMPRequestBody; */
547*4e1bc9a0SAchim Leubner         /*ttdsaXchg->SMPRequestBody.tiIORequest.tdData = (void *)&ttdsaXchg->SMPRequestBody; */
548*4e1bc9a0SAchim Leubner 
549*4e1bc9a0SAchim Leubner 
550*4e1bc9a0SAchim Leubner 
551*4e1bc9a0SAchim Leubner 
552*4e1bc9a0SAchim Leubner         /* Initialize the CDB and LUN addresses */
553*4e1bc9a0SAchim Leubner         ttdsaXchg->tiTgtScsiCmnd.reqCDB  = &(ttdsaXchg->agSSPCmndIU.cdb[0]);
554*4e1bc9a0SAchim Leubner         ttdsaXchg->tiTgtScsiCmnd.scsiLun = &(ttdsaXchg->agSSPCmndIU.lun[0]);
555*4e1bc9a0SAchim Leubner 
556*4e1bc9a0SAchim Leubner         ttdsaXchg->index = i;
557*4e1bc9a0SAchim Leubner         ttdsaXchg->respLen = respLen; /* 100 */
558*4e1bc9a0SAchim Leubner         ttdsaXchg->smprespLen = smprespLen; /* 100 */
559*4e1bc9a0SAchim Leubner         ttdsaXchg->TLR = 0;
560*4e1bc9a0SAchim Leubner         TD_XCHG_SET_STATE(ttdsaXchg, TD_XCHG_STATE_INACTIVE);
561*4e1bc9a0SAchim Leubner         ttdsaXchg->retries = 0;
562*4e1bc9a0SAchim Leubner 
563*4e1bc9a0SAchim Leubner         ttdsaXchgLinkInit(tiRoot,ttdsaXchg);
564*4e1bc9a0SAchim Leubner 
565*4e1bc9a0SAchim Leubner         /* Save current response payload/buffer address */
566*4e1bc9a0SAchim Leubner         virtualAddr  = ttdsaXchg->resp.virtAddr;
567*4e1bc9a0SAchim Leubner         phyAddrLower = ttdsaXchg->resp.phyAddrLower;
568*4e1bc9a0SAchim Leubner         smpvirtualAddr  = ttdsaXchg->smpresp.virtAddr;
569*4e1bc9a0SAchim Leubner         smpphyAddrLower = ttdsaXchg->smpresp.phyAddrLower;
570*4e1bc9a0SAchim Leubner 
571*4e1bc9a0SAchim Leubner         TI_DBG5(("ttdsaXchgInit: +1 before\n"));
572*4e1bc9a0SAchim Leubner         if (i == (maxNumXchgs - 1))
573*4e1bc9a0SAchim Leubner         {
574*4e1bc9a0SAchim Leubner             /* at the last one */
575*4e1bc9a0SAchim Leubner             TI_DBG5(("ttdsaXchgInit: last one break\n"));
576*4e1bc9a0SAchim Leubner             break;
577*4e1bc9a0SAchim Leubner         }
578*4e1bc9a0SAchim Leubner 
579*4e1bc9a0SAchim Leubner         /* Advance to next exchange */
580*4e1bc9a0SAchim Leubner         ttdsaXchg = ttdsaXchg + 1;
581*4e1bc9a0SAchim Leubner         TI_DBG5(("ttdsaXchgInit: +1 after\n"));
582*4e1bc9a0SAchim Leubner 
583*4e1bc9a0SAchim Leubner         /* Update response payload/buffer address */
584*4e1bc9a0SAchim Leubner         ttdsaXchg->resp.virtAddr      = virtualAddr + respLen;
585*4e1bc9a0SAchim Leubner         TI_DBG5(("ttdsaXchgInit: pos 1\n"));
586*4e1bc9a0SAchim Leubner         ttdsaXchg->resp.phyAddrUpper = phyAddrUpper;
587*4e1bc9a0SAchim Leubner         TI_DBG5(("ttdsaXchgInit: pos 2\n"));
588*4e1bc9a0SAchim Leubner         ttdsaXchg->resp.phyAddrLower = phyAddrLower + respLen;
589*4e1bc9a0SAchim Leubner         TI_DBG5(("ttdsaXchgInit: pos 3\n"));
590*4e1bc9a0SAchim Leubner         ttdsaXchg->resp.length = respLen;
591*4e1bc9a0SAchim Leubner         TI_DBG5(("ttdsaXchgInit: pos 4\n"));
592*4e1bc9a0SAchim Leubner 
593*4e1bc9a0SAchim Leubner         /* Update SMP response payload/buffer address */
594*4e1bc9a0SAchim Leubner         ttdsaXchg->smpresp.virtAddr      = smpvirtualAddr + smprespLen;
595*4e1bc9a0SAchim Leubner         ttdsaXchg->smpresp.phyAddrUpper = smpphyAddrUpper;
596*4e1bc9a0SAchim Leubner         ttdsaXchg->smpresp.phyAddrLower = smpphyAddrLower + smprespLen;
597*4e1bc9a0SAchim Leubner         ttdsaXchg->smpresp.length = smprespLen;
598*4e1bc9a0SAchim Leubner 
599*4e1bc9a0SAchim Leubner     }
600*4e1bc9a0SAchim Leubner 
601*4e1bc9a0SAchim Leubner     /* Reinitialize counters.
602*4e1bc9a0SAchim Leubner      * This must be done at the end
603*4e1bc9a0SAchim Leubner      */
604*4e1bc9a0SAchim Leubner     TD_XCHG_CONTEXT_NO_USED(tiRoot)            = 0;
605*4e1bc9a0SAchim Leubner     TD_XCHG_CONTEXT_NO_FREED(tiRoot)           = 0;
606*4e1bc9a0SAchim Leubner     TD_XCHG_CONTEXT_NO_CMD_RCVD(tiRoot)        = 0;
607*4e1bc9a0SAchim Leubner     TD_XCHG_CONTEXT_NO_START_IO(tiRoot)        = 0;
608*4e1bc9a0SAchim Leubner     TD_XCHG_CONTEXT_NO_SEND_RSP(tiRoot)        = 0;
609*4e1bc9a0SAchim Leubner     TD_XCHG_CONTEXT_NO_IO_COMPLETED(tiRoot)    = 0;
610*4e1bc9a0SAchim Leubner 
611*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgInit: end\n"));
612*4e1bc9a0SAchim Leubner     return agTRUE;
613*4e1bc9a0SAchim Leubner }
614*4e1bc9a0SAchim Leubner 
615*4e1bc9a0SAchim Leubner osGLOBAL void
ttdsaXchgLinkInit(tiRoot_t * tiRoot,ttdsaXchg_t * ttdsaXchg)616*4e1bc9a0SAchim Leubner ttdsaXchgLinkInit(
617*4e1bc9a0SAchim Leubner         tiRoot_t           *tiRoot,
618*4e1bc9a0SAchim Leubner         ttdsaXchg_t        *ttdsaXchg
619*4e1bc9a0SAchim Leubner )
620*4e1bc9a0SAchim Leubner {
621*4e1bc9a0SAchim Leubner     tdsaRoot_t        *tdsaRoot    = (tdsaRoot_t *)tiRoot->tdData;
622*4e1bc9a0SAchim Leubner     tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
623*4e1bc9a0SAchim Leubner     ttdsaTgt_t         *Target = (ttdsaTgt_t *)tdsaAllShared->ttdsaTgt;
624*4e1bc9a0SAchim Leubner     bit32              i;
625*4e1bc9a0SAchim Leubner     bit8               *data;
626*4e1bc9a0SAchim Leubner 
627*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgLinkInit: start\n"));
628*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgLinkInit: xchg %p\n",ttdsaXchg));
629*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgLinkInit: resp %p\n",ttdsaXchg->resp.virtAddr));
630*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgLinkInit: smpresp %p\n",ttdsaXchg->smpresp.virtAddr));
631*4e1bc9a0SAchim Leubner 
632*4e1bc9a0SAchim Leubner     if (TD_XCHG_GET_STATE(ttdsaXchg) == TD_XCHG_STATE_ACTIVE)
633*4e1bc9a0SAchim Leubner     {
634*4e1bc9a0SAchim Leubner         TI_DBG1(("ttdsaXchgLinkInit: active xchg *****************; wrong\n"));
635*4e1bc9a0SAchim Leubner         return;
636*4e1bc9a0SAchim Leubner     }
637*4e1bc9a0SAchim Leubner 
638*4e1bc9a0SAchim Leubner     ttdsaXchg->tag = 0xFFFF;
639*4e1bc9a0SAchim Leubner     ttdsaXchg->IORequestBody.agIORequest.sdkData  = agNULL;
640*4e1bc9a0SAchim Leubner     ttdsaXchg->SMPRequestBody.agIORequest.sdkData  = agNULL;
641*4e1bc9a0SAchim Leubner     ttdsaXchg->statusSent        = agFALSE;
642*4e1bc9a0SAchim Leubner     ttdsaXchg->responseSent      = agFALSE;
643*4e1bc9a0SAchim Leubner     ttdsaXchg->readRspCollapsed  = agFALSE;
644*4e1bc9a0SAchim Leubner     ttdsaXchg->wrtRspCollapsed  = agFALSE;
645*4e1bc9a0SAchim Leubner     ttdsaXchg->pTMResp           = agNULL;
646*4e1bc9a0SAchim Leubner     ttdsaXchg->oustandingIos     = 0;
647*4e1bc9a0SAchim Leubner     ttdsaXchg->isAborting        = agFALSE;
648*4e1bc9a0SAchim Leubner     ttdsaXchg->oslayerAborting   = agFALSE;
649*4e1bc9a0SAchim Leubner     ttdsaXchg->isTMRequest       = agFALSE;
650*4e1bc9a0SAchim Leubner     ttdsaXchg->io_found          = agTRUE;
651*4e1bc9a0SAchim Leubner     ttdsaXchg->tiIOToBeAbortedRequest          = agNULL;
652*4e1bc9a0SAchim Leubner     ttdsaXchg->XchgToBeAborted          = agNULL;
653*4e1bc9a0SAchim Leubner 
654*4e1bc9a0SAchim Leubner     osti_memset((void *)ttdsaXchg->resp.virtAddr, 0, ttdsaXchg->respLen);
655*4e1bc9a0SAchim Leubner     osti_memset((void *)ttdsaXchg->smpresp.virtAddr, 0, ttdsaXchg->smprespLen);
656*4e1bc9a0SAchim Leubner 
657*4e1bc9a0SAchim Leubner     data = (bit8 *)ttdsaXchg->resp.virtAddr;
658*4e1bc9a0SAchim Leubner     for (i = 0; i< ttdsaXchg->respLen; i++)
659*4e1bc9a0SAchim Leubner     {
660*4e1bc9a0SAchim Leubner         if (data[i] != 0)
661*4e1bc9a0SAchim Leubner         {
662*4e1bc9a0SAchim Leubner             TI_DBG5(("!! ttdsaXchgLinkInit: data[%d] 0x%x\n", i, data[i]));
663*4e1bc9a0SAchim Leubner         }
664*4e1bc9a0SAchim Leubner     }
665*4e1bc9a0SAchim Leubner 
666*4e1bc9a0SAchim Leubner     ttdsaXchg->resp.length       = 0;
667*4e1bc9a0SAchim Leubner 
668*4e1bc9a0SAchim Leubner     ttdsaXchg->DeviceData = agNULL;
669*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgLinkInit: id %d\n", ttdsaXchg->id));
670*4e1bc9a0SAchim Leubner 
671*4e1bc9a0SAchim Leubner     TD_XCHG_SET_STATE(ttdsaXchg, TD_XCHG_STATE_INACTIVE);
672*4e1bc9a0SAchim Leubner     tdsaSingleThreadedEnter(tiRoot, TD_TGT_LOCK);
673*4e1bc9a0SAchim Leubner     TDLIST_ENQUEUE_AT_TAIL( &ttdsaXchg->XchgLinks, &Target->ttdsaXchgData.xchgFreeList);
674*4e1bc9a0SAchim Leubner     tdsaSingleThreadedLeave(tiRoot, TD_TGT_LOCK);
675*4e1bc9a0SAchim Leubner 
676*4e1bc9a0SAchim Leubner 
677*4e1bc9a0SAchim Leubner     TD_XCHG_CONTEXT_NO_FREED(tiRoot)           = TD_XCHG_CONTEXT_NO_FREED(tiRoot) +1;
678*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgLinkInit: end\n"));
679*4e1bc9a0SAchim Leubner     return;
680*4e1bc9a0SAchim Leubner }
681*4e1bc9a0SAchim Leubner 
682*4e1bc9a0SAchim Leubner /*
683*4e1bc9a0SAchim Leubner    before: ttdsaXchg is in xchgBusyList
684*4e1bc9a0SAchim Leubner    after: ttdsaXchg is in xchgFreeList
685*4e1bc9a0SAchim Leubner  */
686*4e1bc9a0SAchim Leubner osGLOBAL void
ttdsaXchgFreeStruct(tiRoot_t * tiRoot,ttdsaXchg_t * ttdsaXchg)687*4e1bc9a0SAchim Leubner ttdsaXchgFreeStruct(
688*4e1bc9a0SAchim Leubner         tiRoot_t           *tiRoot,
689*4e1bc9a0SAchim Leubner         ttdsaXchg_t        *ttdsaXchg
690*4e1bc9a0SAchim Leubner )
691*4e1bc9a0SAchim Leubner {
692*4e1bc9a0SAchim Leubner     tdsaRoot_t        *tdsaRoot    = (tdsaRoot_t *)tiRoot->tdData;
693*4e1bc9a0SAchim Leubner     tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
694*4e1bc9a0SAchim Leubner     ttdsaTgt_t        *Target = (ttdsaTgt_t *)tdsaAllShared->ttdsaTgt;
695*4e1bc9a0SAchim Leubner     bit32             i;
696*4e1bc9a0SAchim Leubner     bit8              *data;
697*4e1bc9a0SAchim Leubner 
698*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgFreeStruct: start\n"));
699*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgFreeStruct: xchg %p\n",ttdsaXchg));
700*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgFreeStruct: resp %p\n",ttdsaXchg->resp.virtAddr));
701*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgFreeStruct: smpresp %p\n",ttdsaXchg->smpresp.virtAddr));
702*4e1bc9a0SAchim Leubner 
703*4e1bc9a0SAchim Leubner     if (TD_XCHG_GET_STATE(ttdsaXchg) == TD_XCHG_STATE_INACTIVE)
704*4e1bc9a0SAchim Leubner     {
705*4e1bc9a0SAchim Leubner         TI_DBG1(("tdsaXchgFreeStruct: INACTIVE xchg *****************, wrong\n"));
706*4e1bc9a0SAchim Leubner         return;
707*4e1bc9a0SAchim Leubner     }
708*4e1bc9a0SAchim Leubner 
709*4e1bc9a0SAchim Leubner     ttdsaXchg->tag = 0xFFFF;
710*4e1bc9a0SAchim Leubner     ttdsaXchg->IORequestBody.agIORequest.sdkData  = agNULL;
711*4e1bc9a0SAchim Leubner     ttdsaXchg->SMPRequestBody.agIORequest.sdkData  = agNULL;
712*4e1bc9a0SAchim Leubner     ttdsaXchg->statusSent        = agFALSE;
713*4e1bc9a0SAchim Leubner     ttdsaXchg->responseSent      = agFALSE;
714*4e1bc9a0SAchim Leubner     ttdsaXchg->readRspCollapsed  = agFALSE;
715*4e1bc9a0SAchim Leubner     ttdsaXchg->wrtRspCollapsed  = agFALSE;
716*4e1bc9a0SAchim Leubner     ttdsaXchg->pTMResp           = agNULL;
717*4e1bc9a0SAchim Leubner     ttdsaXchg->oustandingIos     = 0;
718*4e1bc9a0SAchim Leubner     ttdsaXchg->isAborting        = agFALSE;
719*4e1bc9a0SAchim Leubner     ttdsaXchg->oslayerAborting   = agFALSE;
720*4e1bc9a0SAchim Leubner     ttdsaXchg->isTMRequest       = agFALSE;
721*4e1bc9a0SAchim Leubner     ttdsaXchg->io_found          = agTRUE;
722*4e1bc9a0SAchim Leubner     ttdsaXchg->tiIOToBeAbortedRequest          = agNULL;
723*4e1bc9a0SAchim Leubner     ttdsaXchg->XchgToBeAborted          = agNULL;
724*4e1bc9a0SAchim Leubner 
725*4e1bc9a0SAchim Leubner     osti_memset((void *)ttdsaXchg->resp.virtAddr, 0, ttdsaXchg->respLen);
726*4e1bc9a0SAchim Leubner     osti_memset((void *)ttdsaXchg->smpresp.virtAddr, 0, ttdsaXchg->smprespLen);
727*4e1bc9a0SAchim Leubner 
728*4e1bc9a0SAchim Leubner     data = (bit8 *)ttdsaXchg->resp.virtAddr;
729*4e1bc9a0SAchim Leubner     for (i = 0; i< ttdsaXchg->respLen; i++)
730*4e1bc9a0SAchim Leubner     {
731*4e1bc9a0SAchim Leubner         if (data[i] != 0)
732*4e1bc9a0SAchim Leubner         {
733*4e1bc9a0SAchim Leubner             TI_DBG5(("!! ttdsaXchgFreeStruct: data[%d] 0x%x\n", i, data[i]));
734*4e1bc9a0SAchim Leubner         }
735*4e1bc9a0SAchim Leubner     }
736*4e1bc9a0SAchim Leubner 
737*4e1bc9a0SAchim Leubner     ttdsaXchg->resp.length       = 0;
738*4e1bc9a0SAchim Leubner 
739*4e1bc9a0SAchim Leubner     ttdsaXchg->DeviceData = agNULL;
740*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgFreeStruct: id %d\n", ttdsaXchg->id));
741*4e1bc9a0SAchim Leubner 
742*4e1bc9a0SAchim Leubner     tdsaSingleThreadedEnter(tiRoot, TD_TGT_LOCK);
743*4e1bc9a0SAchim Leubner     TD_XCHG_SET_STATE(ttdsaXchg, TD_XCHG_STATE_INACTIVE);
744*4e1bc9a0SAchim Leubner     TDLIST_DEQUEUE_THIS(&ttdsaXchg->XchgLinks);
745*4e1bc9a0SAchim Leubner     TDLIST_ENQUEUE_AT_TAIL( &ttdsaXchg->XchgLinks, &Target->ttdsaXchgData.xchgFreeList);
746*4e1bc9a0SAchim Leubner     tdsaSingleThreadedLeave(tiRoot, TD_TGT_LOCK);
747*4e1bc9a0SAchim Leubner 
748*4e1bc9a0SAchim Leubner     TD_XCHG_CONTEXT_NO_FREED(tiRoot)           = TD_XCHG_CONTEXT_NO_FREED(tiRoot) +1;
749*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgFreeStruct: end\n"));
750*4e1bc9a0SAchim Leubner     return;
751*4e1bc9a0SAchim Leubner }
752*4e1bc9a0SAchim Leubner 
753*4e1bc9a0SAchim Leubner 
754*4e1bc9a0SAchim Leubner /*
755*4e1bc9a0SAchim Leubner    before: ttdsaXchg is in xchgFreeList
756*4e1bc9a0SAchim Leubner    after: ttdsaXchg is in xchgBusyList
757*4e1bc9a0SAchim Leubner  */
ttdsaXchgGetStruct(agsaRoot_t * agRoot)758*4e1bc9a0SAchim Leubner osGLOBAL ttdsaXchg_t *ttdsaXchgGetStruct(agsaRoot_t *agRoot)
759*4e1bc9a0SAchim Leubner {
760*4e1bc9a0SAchim Leubner     tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
761*4e1bc9a0SAchim Leubner     tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
762*4e1bc9a0SAchim Leubner     ttdsaTgt_t             *Target = (ttdsaTgt_t *)osData->ttdsaTgt;
763*4e1bc9a0SAchim Leubner     tdList_t               *Link;
764*4e1bc9a0SAchim Leubner     ttdsaXchg_t            *ttdsaXchg = agNULL;
765*4e1bc9a0SAchim Leubner 
766*4e1bc9a0SAchim Leubner     TI_DBG3 (("ttdsaXchgGetStruct: enter\n"));
767*4e1bc9a0SAchim Leubner 
768*4e1bc9a0SAchim Leubner     tdsaSingleThreadedEnter(tiRoot, TD_TGT_LOCK);
769*4e1bc9a0SAchim Leubner     if (TDLIST_EMPTY(&(Target->ttdsaXchgData.xchgFreeList)))
770*4e1bc9a0SAchim Leubner     {
771*4e1bc9a0SAchim Leubner         tdsaSingleThreadedLeave(tiRoot, TD_TGT_LOCK);
772*4e1bc9a0SAchim Leubner         TI_DBG1(("ttdsaXchgGetStruct: no free ttdsaXchgData\n"));
773*4e1bc9a0SAchim Leubner         //    ttdsaDumpallXchg(tiRoot);
774*4e1bc9a0SAchim Leubner         return agNULL;
775*4e1bc9a0SAchim Leubner     }
776*4e1bc9a0SAchim Leubner 
777*4e1bc9a0SAchim Leubner     TDLIST_DEQUEUE_FROM_HEAD(&Link, &Target->ttdsaXchgData.xchgFreeList);
778*4e1bc9a0SAchim Leubner     if ( Link == agNULL )
779*4e1bc9a0SAchim Leubner     {
780*4e1bc9a0SAchim Leubner         tdsaSingleThreadedLeave(tiRoot, TD_TGT_LOCK);
781*4e1bc9a0SAchim Leubner         TI_DBG1(("ttdsaXchgGetStruct: Link NULL: PRBLM \n"));
782*4e1bc9a0SAchim Leubner         return agNULL;
783*4e1bc9a0SAchim Leubner     }
784*4e1bc9a0SAchim Leubner 
785*4e1bc9a0SAchim Leubner     ttdsaXchg = TDLIST_OBJECT_BASE(ttdsaXchg_t, XchgLinks, Link);
786*4e1bc9a0SAchim Leubner 
787*4e1bc9a0SAchim Leubner     if (TD_XCHG_GET_STATE(ttdsaXchg) == TD_XCHG_STATE_ACTIVE)
788*4e1bc9a0SAchim Leubner     {
789*4e1bc9a0SAchim Leubner         TI_DBG1(("ttdsaXchgGetStruct: ACTIVE xchg *****************, wrong\n"));
790*4e1bc9a0SAchim Leubner         TDLIST_DEQUEUE_THIS(&ttdsaXchg->XchgLinks);
791*4e1bc9a0SAchim Leubner         TDLIST_ENQUEUE_AT_TAIL(&ttdsaXchg->XchgLinks, &Target->ttdsaXchgData.xchgFreeList);
792*4e1bc9a0SAchim Leubner         TD_XCHG_SET_STATE(ttdsaXchg, TD_XCHG_STATE_INACTIVE);
793*4e1bc9a0SAchim Leubner         tdsaSingleThreadedLeave(tiRoot, TD_TGT_LOCK);
794*4e1bc9a0SAchim Leubner 
795*4e1bc9a0SAchim Leubner         return agNULL;
796*4e1bc9a0SAchim Leubner     }
797*4e1bc9a0SAchim Leubner 
798*4e1bc9a0SAchim Leubner     TDLIST_DEQUEUE_THIS(&ttdsaXchg->XchgLinks);
799*4e1bc9a0SAchim Leubner     TDLIST_ENQUEUE_AT_TAIL(&ttdsaXchg->XchgLinks, &Target->ttdsaXchgData.xchgBusyList);
800*4e1bc9a0SAchim Leubner     TD_XCHG_SET_STATE(ttdsaXchg, TD_XCHG_STATE_ACTIVE);
801*4e1bc9a0SAchim Leubner     tdsaSingleThreadedLeave(tiRoot, TD_TGT_LOCK);
802*4e1bc9a0SAchim Leubner 
803*4e1bc9a0SAchim Leubner     TD_XCHG_CONTEXT_NO_USED(tiRoot)           = TD_XCHG_CONTEXT_NO_USED(tiRoot) +1;
804*4e1bc9a0SAchim Leubner     TI_DBG5(("ttdsaXchgGetStruct: id %d\n", ttdsaXchg->id));
805*4e1bc9a0SAchim Leubner     return ttdsaXchg;
806*4e1bc9a0SAchim Leubner }
807*4e1bc9a0SAchim Leubner 
808*4e1bc9a0SAchim Leubner /* for debugging */
809*4e1bc9a0SAchim Leubner osGLOBAL void
ttdsaDumpallXchg(tiRoot_t * tiRoot)810*4e1bc9a0SAchim Leubner ttdsaDumpallXchg(tiRoot_t           *tiRoot)
811*4e1bc9a0SAchim Leubner {
812*4e1bc9a0SAchim Leubner     tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
813*4e1bc9a0SAchim Leubner     tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
814*4e1bc9a0SAchim Leubner     ttdsaTgt_t        *Target = (ttdsaTgt_t *)tdsaAllShared->ttdsaTgt;
815*4e1bc9a0SAchim Leubner     ttdsaTgt_t        *tmpTarget;
816*4e1bc9a0SAchim Leubner     tdList_t          *XchgList;
817*4e1bc9a0SAchim Leubner #ifdef TD_DEBUG_ENABLE
818*4e1bc9a0SAchim Leubner     ttdsaXchg_t       *ttdsaXchg = agNULL;
819*4e1bc9a0SAchim Leubner #endif
820*4e1bc9a0SAchim Leubner 
821*4e1bc9a0SAchim Leubner     tmpTarget = Target;
822*4e1bc9a0SAchim Leubner 
823*4e1bc9a0SAchim Leubner     tdsaSingleThreadedEnter(tiRoot, TD_TGT_LOCK);
824*4e1bc9a0SAchim Leubner     if (TDLIST_EMPTY(&(tmpTarget->ttdsaXchgData.xchgFreeList)))
825*4e1bc9a0SAchim Leubner     {
826*4e1bc9a0SAchim Leubner         tdsaSingleThreadedLeave(tiRoot, TD_TGT_LOCK);
827*4e1bc9a0SAchim Leubner         TI_DBG1(("ttdsaDumpallXchg: no FREE ttdsaXchgData\n"));
828*4e1bc9a0SAchim Leubner     }
829*4e1bc9a0SAchim Leubner     else
830*4e1bc9a0SAchim Leubner     {
831*4e1bc9a0SAchim Leubner         tdsaSingleThreadedLeave(tiRoot, TD_TGT_LOCK);
832*4e1bc9a0SAchim Leubner         XchgList = tmpTarget->ttdsaXchgData.xchgFreeList.flink;
833*4e1bc9a0SAchim Leubner 
834*4e1bc9a0SAchim Leubner         while(XchgList != &(tmpTarget->ttdsaXchgData.xchgFreeList))
835*4e1bc9a0SAchim Leubner         {
836*4e1bc9a0SAchim Leubner #ifdef TD_DEBUG_ENABLE
837*4e1bc9a0SAchim Leubner             ttdsaXchg = TDLIST_OBJECT_BASE(ttdsaXchg_t, XchgLinks, XchgList);
838*4e1bc9a0SAchim Leubner #endif
839*4e1bc9a0SAchim Leubner             TI_DBG1(("ttdsaDumpallXchg: FREE id %d state %d\n", ttdsaXchg->id, TD_XCHG_GET_STATE(ttdsaXchg)));
840*4e1bc9a0SAchim Leubner             XchgList = XchgList->flink;
841*4e1bc9a0SAchim Leubner         }
842*4e1bc9a0SAchim Leubner     }
843*4e1bc9a0SAchim Leubner 
844*4e1bc9a0SAchim Leubner     tdsaSingleThreadedEnter(tiRoot, TD_TGT_LOCK);
845*4e1bc9a0SAchim Leubner     if (TDLIST_EMPTY(&(tmpTarget->ttdsaXchgData.xchgBusyList)))
846*4e1bc9a0SAchim Leubner     {
847*4e1bc9a0SAchim Leubner         tdsaSingleThreadedLeave(tiRoot, TD_TGT_LOCK);
848*4e1bc9a0SAchim Leubner         TI_DBG1(("ttdsaDumpallXchg: no BUSY ttdsaXchgData\n"));
849*4e1bc9a0SAchim Leubner     }
850*4e1bc9a0SAchim Leubner     else
851*4e1bc9a0SAchim Leubner     {
852*4e1bc9a0SAchim Leubner         tdsaSingleThreadedLeave(tiRoot, TD_TGT_LOCK);
853*4e1bc9a0SAchim Leubner         XchgList = tmpTarget->ttdsaXchgData.xchgBusyList.flink;
854*4e1bc9a0SAchim Leubner 
855*4e1bc9a0SAchim Leubner         while(XchgList != &(tmpTarget->ttdsaXchgData.xchgBusyList))
856*4e1bc9a0SAchim Leubner         {
857*4e1bc9a0SAchim Leubner #ifdef TD_DEBUG_ENABLE
858*4e1bc9a0SAchim Leubner             ttdsaXchg = TDLIST_OBJECT_BASE(ttdsaXchg_t, XchgLinks, XchgList);
859*4e1bc9a0SAchim Leubner #endif
860*4e1bc9a0SAchim Leubner             TI_DBG1(("ttdsaDumpallXchg: BUSY id %d state %d\n", ttdsaXchg->id, TD_XCHG_GET_STATE(ttdsaXchg)));
861*4e1bc9a0SAchim Leubner             XchgList = XchgList->flink;
862*4e1bc9a0SAchim Leubner         }
863*4e1bc9a0SAchim Leubner     }
864*4e1bc9a0SAchim Leubner 
865*4e1bc9a0SAchim Leubner 
866*4e1bc9a0SAchim Leubner     return;
867*4e1bc9a0SAchim Leubner }
868*4e1bc9a0SAchim Leubner 
869*4e1bc9a0SAchim Leubner 
870*4e1bc9a0SAchim Leubner #ifdef PASSTHROUGH
871*4e1bc9a0SAchim Leubner 
872*4e1bc9a0SAchim Leubner osGLOBAL bit32
tiTGTPassthroughCmndRegister(tiRoot_t * tiRoot,tiPortalContext_t * tiportalContext,tiPassthroughProtocol_t tiProtocol,tiPassthroughSubProtocol_t tiSubProtocol,tiPassthroughFrameType_t tiFrameType,ostiProcessPassthroughCmnd_t agPasthroughCB)873*4e1bc9a0SAchim Leubner tiTGTPassthroughCmndRegister(
874*4e1bc9a0SAchim Leubner         tiRoot_t                        *tiRoot,
875*4e1bc9a0SAchim Leubner         tiPortalContext_t               *tiportalContext,
876*4e1bc9a0SAchim Leubner         tiPassthroughProtocol_t        tiProtocol,
877*4e1bc9a0SAchim Leubner         tiPassthroughSubProtocol_t        tiSubProtocol,
878*4e1bc9a0SAchim Leubner         tiPassthroughFrameType_t        tiFrameType,
879*4e1bc9a0SAchim Leubner         ostiProcessPassthroughCmnd_t    agPasthroughCB
880*4e1bc9a0SAchim Leubner )
881*4e1bc9a0SAchim Leubner {
882*4e1bc9a0SAchim Leubner     tdsaRoot_t                *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
883*4e1bc9a0SAchim Leubner     tdsaContext_t             *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
884*4e1bc9a0SAchim Leubner     ttdsaTgt_t                *Target = (ttdsaTgt_t *)tdsaAllShared->ttdsaTgt;
885*4e1bc9a0SAchim Leubner 
886*4e1bc9a0SAchim Leubner     TI_DBG1(("tiTGTPassthroughCmndRegister: start\n"));
887*4e1bc9a0SAchim Leubner     /* error checking */
888*4e1bc9a0SAchim Leubner     if (tiProtocol != tiSASATA)
889*4e1bc9a0SAchim Leubner     {
890*4e1bc9a0SAchim Leubner         TI_DBG1(("tiTGTPassthroughCmndRegister: not supported protocol %d\n", tiProtocol));
891*4e1bc9a0SAchim Leubner         return tiError;
892*4e1bc9a0SAchim Leubner     }
893*4e1bc9a0SAchim Leubner 
894*4e1bc9a0SAchim Leubner     if (tiSubProtocol != tiSSP || tiSubProtocol != tiSTP || tiSubProtocol != tiSMP)
895*4e1bc9a0SAchim Leubner     {
896*4e1bc9a0SAchim Leubner         TI_DBG1(("tiTGTPassthroughCmndRegister: not supported sub protocol %d\n", tiSubProtocol));
897*4e1bc9a0SAchim Leubner         return tiError;
898*4e1bc9a0SAchim Leubner     }
899*4e1bc9a0SAchim Leubner 
900*4e1bc9a0SAchim Leubner 
901*4e1bc9a0SAchim Leubner     if (tiFrameType == tiSMPResponse)
902*4e1bc9a0SAchim Leubner     {
903*4e1bc9a0SAchim Leubner         TI_DBG1(("tiTGTPassthroughCmndRegister: SMP response frametype %d\n"));
904*4e1bc9a0SAchim Leubner         Target->PasthroughCB = agPasthroughCB;
905*4e1bc9a0SAchim Leubner     }
906*4e1bc9a0SAchim Leubner 
907*4e1bc9a0SAchim Leubner     else if (tiFrameType == tiSSPPMC)
908*4e1bc9a0SAchim Leubner     {
909*4e1bc9a0SAchim Leubner         TI_DBG1(("tiTGTPassthroughCmndRegister: RMC response frametype %d\n"));
910*4e1bc9a0SAchim Leubner         Target->PasthroughCB = agPasthroughCB;
911*4e1bc9a0SAchim Leubner     }
912*4e1bc9a0SAchim Leubner     else
913*4e1bc9a0SAchim Leubner     {
914*4e1bc9a0SAchim Leubner         TI_DBG1(("tiTGTPassthroughCmndRegister: not supported frametype %d\n", tiFrameType));
915*4e1bc9a0SAchim Leubner         return tiError;
916*4e1bc9a0SAchim Leubner     }
917*4e1bc9a0SAchim Leubner 
918*4e1bc9a0SAchim Leubner 
919*4e1bc9a0SAchim Leubner     return tiSuccess;
920*4e1bc9a0SAchim Leubner }
921*4e1bc9a0SAchim Leubner 
922*4e1bc9a0SAchim Leubner #endif
923