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