1 /*******************************************************************************
2 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
3 *
4 *Redistribution and use in source and binary forms, with or without modification, are permitted provided
5 *that the following conditions are met:
6 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7 *following disclaimer.
8 *2. Redistributions in binary form must reproduce the above copyright notice,
9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10 *with the distribution.
11 *
12 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20
21 ********************************************************************************/
22 /*******************************************************************************/
23 /** \file
24 *
25 *
26 * This file contains Management IOCTL APIs
27 *
28 */
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31 #include <dev/pms/config.h>
32
33 #include <dev/pms/freebsd/driver/common/osenv.h>
34 #include <dev/pms/freebsd/driver/common/ostypes.h>
35 #include <dev/pms/freebsd/driver/common/osdebug.h>
36
37 #include <dev/pms/RefTisa/sallsdk/api/sa.h>
38 #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
39 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
40
41 #include <dev/pms/RefTisa/tisa/api/titypes.h>
42 #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
43 #include <dev/pms/RefTisa/tisa/api/tiapi.h>
44 #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
45
46 #ifdef FDS_SM
47 #include <dev/pms/RefTisa/sat/api/sm.h>
48 #include <dev/pms/RefTisa/sat/api/smapi.h>
49 #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
50 #endif
51
52 #ifdef FDS_DM
53 #include <dev/pms/RefTisa/discovery/api/dm.h>
54 #include <dev/pms/RefTisa/discovery/api/dmapi.h>
55 #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
56 #endif
57
58 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
59 #include <dev/pms/freebsd/driver/common/osstring.h>
60 #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
61 #include <dev/pms/RefTisa/sallsdk/spc/mpidebug.h>
62
63 #ifdef INITIATOR_DRIVER
64 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
65 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
66 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
67 #endif
68
69 #ifdef TARGET_DRIVER
70 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
71 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
72 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
73 #endif
74
75 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
76 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
77 #include <dev/pms/RefTisa/tisa/sassata/common/tdioctl.h>
78
79 #include <dev/pms/RefTisa/sallsdk/spc/sadefs.h>
80 #include <dev/pms/RefTisa/sallsdk/spc/spcdefs.h>
81 #include <dev/pms/RefTisa/sallsdk/spc/mpi.h>
82 #include <dev/pms/RefTisa/sallsdk/spc/sallist.h>
83 #include <dev/pms/RefTisa/sallsdk/spc/satypes.h>
84
85
86 #define agFieldOffset(baseType,fieldName) \
87 /*lint -e545 */ \
88 ((bit32)((bitptr)(&(((baseType *)0)->fieldName)))) \
89
90 #ifdef SA_LL_API_TEST
91 osGLOBAL bit32 tdLlApiTestIoctl(tiRoot_t *tiRoot,
92 tiIOCTLPayload_t *agIOCTLPayload,
93 void *agParam1,
94 void *agParam2,
95 void *agParam3);
96 #endif /* SA_LL_API_TEST */
97
98
99 extern bit32 volatile sgpioResponseSet;
100
101 #ifdef SPC_ENABLE_PROFILE
102 /*****************************************************************************
103 *
104 * tdipFWProfileIoctl
105 *
106 * Purpose: This routine is called to process the FW Profile IOCTL function.
107 * This function is used for both target and initiator.
108 *
109 * Parameters:
110 * tiRoot: Pointer to driver instance
111 * agIOCTLPayload: Pointer to the IOCTL payload.
112 * agParam1: Pointer to pass context handle for IOCTL DMA operation
113 * agParam2: Pointer to pass context handle for IOCTL DMA operation
114 * agParam3: Pointer to pass context handle for IOCTL DMA operation
115 *
116 * Return:
117 *
118 * IOCTL_CALL_SUCCESS The requested operation completed successfully.
119 * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
120 * Detail error code is function specific and
121 * defined by the specific IOCTL function.
122 * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
123 *
124 *
125 *****************************************************************************/
126 osGLOBAL bit32 tdipFWProfileIoctl(
127 tiRoot_t *tiRoot,
128 tiIOCTLPayload_t *agIOCTLPayload,
129 void *agParam1,
130 void *agParam2,
131 void *agParam3
132 )
133 {
134
135 bit32 status = IOCTL_CALL_SUCCESS;
136 bit32 bufAddrUpper = 0;
137 bit32 bufAddrLower = 0;
138 tdFWProfile_t *fwProfile;
139
140 void *osMemHandle = agNULL;
141 void *buffer = agNULL;
142 agsaFwProfile_t fwProfileInfo = {0};
143
144 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
145 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
146 agsaRoot_t *agRoot = &tdsaAllShared->agRootInt;
147
148 fwProfile = (tdFWProfile_t *)&agIOCTLPayload->FunctionSpecificArea[0];
149
150
151 fwProfileInfo.processor = fwProfile->processor;
152 fwProfileInfo.cmd = fwProfile->cmd;
153 fwProfileInfo.len = fwProfile->len;
154 fwProfileInfo.tcid = fwProfile->tcid;
155 if(fwProfile->cmd == START_CODE_PROFILE)
156 {
157 fwProfileInfo.codeStartAdd = fwProfile->codeStartAdd;
158 fwProfileInfo.codeEndAdd = fwProfile->codeEndAdd;
159 }
160 if((fwProfile->cmd == STOP_TIMER_PROFILE) || (fwProfile->cmd == STOP_CODE_PROFILE))
161 {
162 if(fwProfile->len != 0)
163 {
164 if(ostiAllocMemory( tiRoot,
165 &osMemHandle,
166 (void **)&buffer,
167 &bufAddrUpper,
168 &bufAddrLower,
169 8,
170 fwProfile->len,
171 agFALSE))
172 {
173 return IOCTL_CALL_FAIL;
174 }
175 osti_memset((void *)buffer, 0, fwProfile->len);
176 }
177 fwProfileInfo.agSgl.sgLower = bufAddrLower;
178 fwProfileInfo.agSgl.sgUpper = bufAddrUpper;
179 fwProfileInfo.agSgl.len = fwProfile->len;
180 fwProfileInfo.agSgl.extReserved = 0;
181 tdsaAllShared->tdFWProfileEx.buffer = osMemHandle;
182 tdsaAllShared->tdFWProfileEx.virtAddr = buffer;
183 tdsaAllShared->tdFWProfileEx.len = fwProfile->len;
184 }
185 tdsaAllShared->tdFWProfileEx.tdFWProfile = fwProfile;
186 tdsaAllShared->tdFWProfileEx.param1 = agParam1;
187 tdsaAllShared->tdFWProfileEx.param2 = agParam2;
188 tdsaAllShared->tdFWProfileEx.payload = agIOCTLPayload;
189 tdsaAllShared->tdFWProfileEx.inProgress = 1;
190 status = saFwProfile(agRoot,
191 agNULL,
192 0,
193 &fwProfileInfo
194 );
195 if(status)
196 {
197 if((fwProfile->cmd == STOP_TIMER_PROFILE) || (fwProfile->cmd == STOP_CODE_PROFILE))
198 ostiFreeMemory(tiRoot, osMemHandle, fwProfile->len);
199 status = IOCTL_CALL_FAIL;
200 }
201 else
202 status = IOCTL_CALL_PENDING;
203 return status;
204 }
205
206
207 #endif
208
209 /*****************************************************************************
210 *
211 * tdipFWControlIoctl
212 *
213 * Purpose: This routine is called to process the FW control IOCTL function.
214 * This function is used for both target and initiator.
215 *
216 * Parameters:
217 * tiRoot: Pointer to driver instance
218 * agIOCTLPayload: Pointer to the IOCTL payload.
219 * agParam1: Pointer to pass context handle for IOCTL DMA operation
220 * agParam2: Pointer to pass context handle for IOCTL DMA operation
221 * agParam3: Pointer to pass context handle for IOCTL DMA operation
222 *
223 * Return:
224 *
225 * IOCTL_CALL_SUCCESS The requested operation completed successfully.
226 * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
227 * Detail error code is function specific and
228 * defined by the specific IOCTL function.
229 * IOCTL_CALL_PENDING This request is asynchronous and completed
230 * in some other context.
231 * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
232 *
233 *
234 *****************************************************************************/
235 osGLOBAL bit32 tdipFWControlIoctl(
236 tiRoot_t *tiRoot,
237 tiIOCTLPayload_t *agIOCTLPayload,
238 void *agParam1,
239 void *agParam2,
240 void *agParam3
241 ) {
242
243 bit32 status = IOCTL_CALL_PENDING;
244 bit32 bufAddrUpper = 0;
245 bit32 bufAddrLower = 0;
246 tdFWControl_t *fwControl;
247 void *osMemHandle = agNULL;
248 void *buffer = agNULL;
249 agsaUpdateFwFlash_t flashUpdateInfo;
250 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
251 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
252 agsaRoot_t *agRoot = &tdsaAllShared->agRootInt;
253
254 if( agIOCTLPayload->Length <
255 ( agFieldOffset(tiIOCTLPayload_t, FunctionSpecificArea) +
256 sizeof(tdFWControl_t) ) ) {
257 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
258 status = IOCTL_CALL_FAIL;
259 return status;
260 }
261 fwControl = (tdFWControl_t *)&agIOCTLPayload->FunctionSpecificArea[0];
262
263 if(fwControl->len != 0)
264 {
265 if(ostiAllocMemory( tiRoot,
266 &osMemHandle,
267 (void **)&buffer,
268 &bufAddrUpper,
269 &bufAddrLower,
270 8,
271 fwControl->len,
272 agFALSE) )
273 return IOCTL_CALL_FAIL;
274 }
275 osti_memset( (void *)buffer, 0, fwControl->len );
276 osti_memcpy( (void *)buffer,
277 fwControl->buffer,
278 fwControl->len );
279 flashUpdateInfo.agSgl.sgLower = bufAddrLower;
280 flashUpdateInfo.agSgl.sgUpper = bufAddrUpper;
281 flashUpdateInfo.agSgl.len = fwControl->len;
282 flashUpdateInfo.agSgl.extReserved = 0;
283 flashUpdateInfo.currentImageOffset = fwControl->offset;
284 flashUpdateInfo.currentImageLen = fwControl->len;
285 flashUpdateInfo.totalImageLen = fwControl->size;
286 switch (agIOCTLPayload->MinorFunction)
287 {
288 case IOCTL_MN_FW_DOWNLOAD_DATA:
289 {
290 TI_DBG6(("tdipFWControlIoctl: calling saFwFlashUpdate\n"));
291 tdsaAllShared->tdFWControlEx.tdFWControl = fwControl;
292 tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
293 tdsaAllShared->tdFWControlEx.param1 = agParam1;
294 tdsaAllShared->tdFWControlEx.param2 = agParam2;
295 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
296 tdsaAllShared->tdFWControlEx.inProgress = 1;
297 status = saFwFlashUpdate( agRoot,
298 agNULL,
299 0,
300 &flashUpdateInfo );
301 if(status) {
302 status = IOCTL_CALL_FAIL;
303 fwControl->retcode = IOCTL_CALL_TIMEOUT;
304 }
305 else {
306 status = IOCTL_CALL_PENDING;
307 }
308 break;
309 }
310 default:
311 status = IOCTL_CALL_INVALID_CODE;
312 TI_DBG1( ("tdipFWControlIoctl: ERROR: Wrong IOCTL code %d\n",
313 agIOCTLPayload->MinorFunction) );
314 ostiFreeMemory(tiRoot, osMemHandle, fwControl->len);
315 return status;
316 } /* end IOCTL switch */
317 return status;
318 } /* tdipFWControlIoctl */
319
320
321 /*****************************************************************************
322 *
323 * tiCOMMgntIOCTL
324 *
325 * Purpose: This routine is a TISA API for processing the PMC specific
326 * IOCTL function.
327 *
328 * Each IOCTL function is identified by the IOCTL header
329 * specified in the data payload as the following:
330 * Field Description
331 * ----- -----------
332 * Signature PMC IOCTL signature.
333 * #define PMC_IOCTL_SIGNATURE 0x1234
334 * MajorFunction Major function number.
335 * MinorFunction Minor function number.
336 * Length Length of this structure in bytes.
337 * Status Return status for this IOCTL function.
338 * FunctionSpecificArea Variable length function specific area.
339 *
340 * Parameters:
341 * tiRoot: Pointer to driver instance
342 * agIOCTLPayload: Pointer to the IOCTL payload.
343 * agParam1: Pointer to pass context handle for IOCTL DMA operation
344 * agParam2: Pointer to pass context handle for IOCTL DMA operation
345 * agParam3: Pointer to pass context handle for IOCTL DMA operation
346 *
347 * Return:
348 *
349 * IOCTL_CALL_SUCCESS The requested operation completed successfully.
350 * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
351 * Detail error code is function specific and
352 * defined by the specific IOCTL function.
353 * IOCTL_CALL_PENDING This request is asynchronous and completed
354 * in some other context.
355 * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
356 * IOCTL_CALL_INVALID_DEVICE Invalid target or destination device.
357 *
358 * Note:
359 * Used ostiAllocMemory() OS layer callback function to allocate memory
360 * for DMA operaion. Then use ostiFreeMemory() to deallocate the memory.
361 *
362 *****************************************************************************/
363 osGLOBAL bit32
364 tiCOMMgntIOCTL(
365 tiRoot_t *tiRoot,
366 tiIOCTLPayload_t *agIOCTLPayload,
367 void *agParam1,
368 void *agParam2,
369 void *agParam3
370 )
371 {
372 bit32 status = IOCTL_CALL_INVALID_CODE;
373 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
374 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
375 agsaRoot_t *agRoot = &(tdsaAllShared->agRootNonInt);
376 bit32 EventLogLength = 0;
377 bit32 EventLogOption;
378 bit32 ReadLength = 0;
379 bit32 Offset = 0;
380 bit32 RequestLength = 0; /* user request on how much data to pass to application */
381 agsaContext_t *agContext = NULL;
382 bit8 *loc = NULL;
383
384 TI_DBG3(("tiCOMMgntIOCTL: start\n"));
385
386 TI_DBG3(("tiCOMMgntIOCTL: tiRoot %p agIOCTLPayload %p agParam1 %p agParam2 %p agParam3 %p\n",
387 tiRoot,agIOCTLPayload,agParam1,agParam2,agParam3 ));
388
389 TI_DBG3(("tiCOMMgntIOCTL: Signature %X\ntiCOMMgntIOCTL: MajorFunction 0x%X\ntiCOMMgntIOCTL: MinorFunction 0x%X\ntiCOMMgntIOCTL: Length 0x%X\ntiCOMMgntIOCTL: Status 0x%X\ntiCOMMgntIOCTL: Reserved 0x%X\ntiCOMMgntIOCTL: FunctionSpecificArea 0x%X\n",
390 agIOCTLPayload->Signature,
391 agIOCTLPayload->MajorFunction,
392 agIOCTLPayload->MinorFunction,
393 agIOCTLPayload->Length,
394 agIOCTLPayload->Status,
395 agIOCTLPayload->Reserved,
396 agIOCTLPayload->FunctionSpecificArea[0] ));
397
398 /* PMC IOCTL signatures matched ? */
399 if(agIOCTLPayload->Signature != PMC_IOCTL_SIGNATURE)
400 {
401 TI_DBG1(("tiCOMMgntIOCTL:agIOCTLPayload->Signature %x IOCTL_CALL_INVALID_CODE\n",agIOCTLPayload->Signature ));
402 status = IOCTL_CALL_INVALID_CODE;
403 return (status);
404 }
405
406 switch (agIOCTLPayload->MajorFunction)
407 {
408 //TODO: make the card identification more robust. For now - just to keep going with FW download
409 #ifdef IOCTL_INTERRUPT_TIME_CONFIG
410 case IOCTL_MJ_CARD_PARAMETER:
411 {
412 switch( agIOCTLPayload->MinorFunction )
413 {
414 case IOCTL_MN_CARD_GET_INTERRUPT_CONFIG:
415 {
416 agsaInterruptConfigPage_t *pInterruptConfig = (agsaInterruptConfigPage_t *)&agIOCTLPayload->FunctionSpecificArea[0];
417 status = saGetControllerConfig(agRoot,
418 0,
419 AGSA_INTERRUPT_CONFIGURATION_PAGE,
420 pInterruptConfig->vectorMask0,
421 pInterruptConfig->vectorMask1,
422 agParam2);
423 if(status == AGSA_RC_SUCCESS) {
424 status = IOCTL_CALL_PENDING;
425 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
426 } else {
427 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
428 }
429 break;
430 }
431 case IOCTL_MN_CARD_GET_TIMER_CONFIG:
432 status = saGetControllerConfig(agRoot, 0, AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE, 0, 0, agParam2);
433 if(status == AGSA_RC_SUCCESS) {
434 status = IOCTL_CALL_PENDING;
435 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
436 } else {
437 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
438 }
439 break;
440 }
441 break;
442 }
443 #endif /* IOCTL_INTERRUPT_TIME_CONFIG */
444 case IOCTL_MJ_INI_DRIVER_IDENTIFY:
445 {
446 status=IOCTL_CALL_SUCCESS;
447 break;
448 }
449 case IOCTL_MJ_GET_DEVICE_LUN:
450 status = tdsaGetNumOfLUNIOCTL(tiRoot,agIOCTLPayload, agParam1, agParam2, agParam3);
451 if(status == IOCTL_CALL_SUCCESS)
452 {
453 status = IOCTL_CALL_PENDING;
454 }
455 break;
456 case IOCTL_MJ_SMP_REQUEST:
457 status = tdsaSendSMPIoctl(tiRoot, agIOCTLPayload,
458 agParam1,agParam2,agParam3);
459 break;
460
461 case IOCTL_MJ_FW_CONTROL:
462 {
463 //ostiIOCTLClearSignal (tiRoot, &agParam1, &agParam2, &agParam3);
464 status = tdipFWControlIoctl( tiRoot, agIOCTLPayload,
465 agParam1, agParam2, agParam3);
466
467 break;
468 }
469 //#ifdef EVENT_LOG_INFO_TESTING
470 /* Reserved field in tiIOCTLPayload_t is used as offset */
471 case IOCTL_MJ_GET_EVENT_LOG1:
472 {
473 switch (agIOCTLPayload->MinorFunction)
474 {
475 case IOCTL_MN_FW_GET_TRACE_BUFFER:
476 {
477 agsaControllerEventLog_t EventLog;
478 saGetControllerEventLogInfo(agRoot, &EventLog);
479 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GET_EVENT_LOG1 Length %d\n", agIOCTLPayload->Length));
480 RequestLength = agIOCTLPayload->Length;
481 Offset = agIOCTLPayload->Reserved;
482 EventLogLength = EventLog.eventLog1.totalLength;
483 EventLogOption = EventLog.eventLog1Option;
484 if (EventLogLength <= Offset)
485 {
486 TI_DBG1(("tiCOMMgntIOCTL: 1 out of range Requestlength %d Offset %d event log length %d\n", RequestLength, Offset, EventLogLength));
487 // out of range
488 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
489 agIOCTLPayload->Length = 0;
490 if(EventLogOption == 0)
491 {
492 agIOCTLPayload->Status = IOCTL_ERR_FW_EVENTLOG_DISABLED;
493 }
494 status=IOCTL_CALL_SUCCESS;
495 return status;
496 }
497 ReadLength = MIN(EventLogLength - Offset, RequestLength);
498 loc = (bit8 *)EventLog.eventLog1.virtPtr + Offset;
499 osti_memcpy(&(agIOCTLPayload->FunctionSpecificArea), loc, ReadLength);
500 // tdhexdump("IOCTL_MJ_GET_EVENT_LOG1 first 32bytes", (bit8 *)&(agIOCTLPayload->FunctionSpecificArea), 32);
501 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
502 agIOCTLPayload->Length = (bit16)ReadLength;
503 status=IOCTL_CALL_SUCCESS;
504 break;
505 }
506 case IOCTL_MN_FW_GET_EVENT_FLASH_LOG1:
507 {
508 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MN_FW_GET_EVENT_FLASH_LOG1\n"));
509 status = tdsaRegDumpGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
510 break;
511 }
512 }
513 break;
514 }
515
516 case IOCTL_MJ_GET_EVENT_LOG2:
517 {
518 switch (agIOCTLPayload->MinorFunction)
519 {
520 case IOCTL_MN_FW_GET_TRACE_BUFFER:
521 {
522 agsaControllerEventLog_t EventLog;
523 saGetControllerEventLogInfo(agRoot, &EventLog);
524 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GET_EVENT_LOG2 Length %d\n", agIOCTLPayload->Length));
525 RequestLength = agIOCTLPayload->Length;
526 Offset = agIOCTLPayload->Reserved;
527 EventLogLength = EventLog.eventLog2.totalLength;
528 EventLogOption = EventLog.eventLog2Option;
529 if (EventLogLength <= Offset)
530 {
531 TI_DBG1(("tiCOMMgntIOCTL: 2 out of range Requestlength %d Offset %d event log length %d\n", RequestLength, Offset, EventLogLength));
532 /* out of range */
533 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
534 agIOCTLPayload->Length = 0;
535 if(EventLogOption == 0)
536 {
537 agIOCTLPayload->Status = IOCTL_ERR_FW_EVENTLOG_DISABLED;
538 }
539 status=IOCTL_CALL_SUCCESS;
540 return status;
541 }
542 ReadLength = MIN(EventLogLength - Offset, RequestLength);
543 loc = (bit8 *)EventLog.eventLog2.virtPtr + Offset;
544 osti_memcpy(&(agIOCTLPayload->FunctionSpecificArea), loc, ReadLength);
545 // tdhexdump("IOCTL_MJ_GET_EVENT_LOG2 first 32bytes", (bit8 *)&(agIOCTLPayload->FunctionSpecificArea), 32);
546 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
547 agIOCTLPayload->Length = (bit16)ReadLength;
548 status=IOCTL_CALL_SUCCESS;
549 break;
550 }
551 case IOCTL_MN_FW_GET_EVENT_FLASH_LOG2:
552 {
553 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MN_FW_GET_EVENT_FLASH_LOG2\n"));
554 status = tdsaRegDumpGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
555 break;
556 }
557 }
558 break;
559 }
560
561
562 case IOCTL_MJ_FW_INFO:
563 {
564 agsaControllerInfo_t ControllerInfo;
565 saGetControllerInfo(agRoot, &ControllerInfo);
566 TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_FW_INFO Length %d\n", agIOCTLPayload->Length));
567 RequestLength = agIOCTLPayload->Length;
568 Offset = agIOCTLPayload->Reserved;
569 if (RequestLength == 0)
570 {
571 TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_FW_INFO: No more Data!\n"));
572 /* out of range */
573 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
574 agIOCTLPayload->Length = 0;
575 status=IOCTL_CALL_SUCCESS;
576 return status;
577 }
578
579 osti_memcpy((bit8*)&(agIOCTLPayload->FunctionSpecificArea), (bit8*)&ControllerInfo, sizeof(agsaControllerInfo_t));
580
581 TI_DBG1(("tiCOMMgntIOCTL:IOCTL_MJ_FW_INFO ControllerInfo signature 0x%X\n",ControllerInfo.signature));
582 TI_DBG1(("tiCOMMgntIOCTL:IOCTL_MJ_FW_INFO ControllerInfo PCILinkRate 0x%X\n",ControllerInfo.PCILinkRate));
583 TI_DBG1(("tiCOMMgntIOCTL:IOCTL_MJ_FW_INFO ControllerInfo PCIWidth 0x%X\n",ControllerInfo.PCIWidth));
584 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
585 status=IOCTL_CALL_SUCCESS;
586 break;
587
588 }
589
590 case IOCTL_MJ_GET_FW_REV:
591 {
592 agsaControllerInfo_t ControllerInfo;
593 saGetControllerInfo(agRoot, &ControllerInfo);
594 TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_FW_REV Length %d\n", agIOCTLPayload->Length));
595 RequestLength = agIOCTLPayload->Length;
596 Offset = agIOCTLPayload->Reserved;
597 if (RequestLength == 0)
598 {
599 TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_GET_FW_REV: No more Data!\n"));
600 /* out of range */
601 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
602 agIOCTLPayload->Length = 0;
603 status=IOCTL_CALL_SUCCESS;
604 return status;
605 }
606
607 osti_memcpy((bit8*)&(agIOCTLPayload->FunctionSpecificArea), (bit8*)&ControllerInfo.fwRevision, sizeof(bit32));
608 loc = (bit8 *)&(agIOCTLPayload->FunctionSpecificArea)+ sizeof(bit32);
609 osti_memcpy(loc, (bit8*)&ControllerInfo.sdkRevision, sizeof(bit32));
610
611 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
612 status=IOCTL_CALL_SUCCESS;
613 break;
614
615 }
616
617 #ifdef SPC_ENABLE_PROFILE
618 case IOCTL_MJ_FW_PROFILE:
619 {
620 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_FW_PROFILE\n"));
621 status = tdipFWProfileIoctl( tiRoot, agIOCTLPayload,
622 agParam1, agParam2, agParam3);
623 break;
624 }
625 #endif /* SPC_ENABLE_PROFILE */
626
627 case IOCTL_MJ_GET_CORE_DUMP:
628 {
629 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GET_CORE_DUMP\n"));
630 if (tiIS_SPC(agRoot))
631 {
632 status = tdsaRegDumpGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
633 }
634 else
635 {
636 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
637 status = IOCTL_CALL_SUCCESS;
638 }
639 break;
640 }
641 //#endif
642 case IOCTL_MJ_NVMD_SET:
643 {
644 bit8 nvmDev;
645 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_NVMD_SET\n"));
646 nvmDev = (bit8) agIOCTLPayload->Status;
647 agIOCTLPayload->Status = 0;
648 status = tdsaNVMDSetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, &nvmDev);
649 break;
650 }
651 #if 0
652 case IOCTL_MJ_GPIO:
653 {
654 bit32 sVid =0;
655 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GPIO\n"));
656
657 /* Get Subsystem vendor */
658 sVid = ostiChipConfigReadBit32(tiRoot,0x2C);
659 sVid = sVid & 0xFFFF;
660
661 /* GPIO is only intended for chip down design
662 * therefore it's only applies to 8H/SPCv product family
663 */
664 if(sVid == 0x9005)
665 return IOCTL_CALL_INVALID_DEVICE;
666
667 status = tdsaGpioSetup(tiRoot, agContext, agIOCTLPayload, agParam1, agParam2);
668 if(status == IOCTL_CALL_SUCCESS)
669 status = IOCTL_CALL_PENDING; /* Wait for response from the Controller */
670 else
671 return status;
672
673 break;
674 }
675 #endif
676
677 case IOCTL_MJ_SGPIO:
678 {
679 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_SGPIO\n"));
680 status = tdsaSGpioIoctlSetup(tiRoot, agContext, agIOCTLPayload, agParam1, agParam2);
681 break;
682 }
683
684 case IOCTL_MJ_NVMD_GET:
685 {
686 bit8 nvmDev;
687 TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_NVMD_GET\n"));
688 nvmDev = (bit8) agIOCTLPayload->Status;
689 agIOCTLPayload->Status = 0;
690 status = tdsaNVMDGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, &nvmDev);
691 break;
692 }
693
694 case IOCTL_MJ_GET_FORENSIC_DATA:
695 {
696 TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_FORENSIC_DATA\n"));
697 status = tdsaForensicDataGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
698 break;
699 }
700 case IOCTL_MJ_GET_DEVICE_INFO:
701 {
702 TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_DEVICE_INFO\n"));
703 status = tdsaDeviceInfoGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
704 break;
705 }
706
707 case IOCTL_MJ_GET_IO_ERROR_STATISTIC:
708 {
709 TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_IO_ERROR_STATISTIC\n"));
710 status = tdsaIoErrorStatisticGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
711 break;
712 }
713
714 case IOCTL_MJ_GET_IO_EVENT_STATISTIC:
715 {
716 TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_IO_EVENT_STATISTIC\n"));
717 status = tdsaIoEventStatisticGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
718 break;
719 }
720
721 case IOCTL_MJ_SEND_BIST:
722 {
723 TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_SEND_BIST\n"));
724 status = tdsaSendBISTIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
725 break;
726 }
727
728 #if 0
729 case IOCTL_MJ_SET_OR_GET_REGISTER:
730 {
731 TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_SET_OR_GET_REGISTER\n"));
732 status = tdsaRegisterIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
733 break;
734 }
735
736 #endif
737 case IOCTL_MJ_PHY_DETAILS:
738 {
739 PhyDetails_t *PhyDetails = (PhyDetails_t*)&agIOCTLPayload->FunctionSpecificArea;
740 agsaRoot_t *agRoot = &(tdsaAllShared->agRootNonInt);
741 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
742 bit8 *sasAddressHi;
743 bit8 *sasAddressLo;
744 bit8 sas_dev_type;
745 int i = 0;
746
747 tiIniGetDirectSataSasAddr(tiRoot, i , &sasAddressHi, &sasAddressLo);
748 for( i = 0; i < saRoot->phyCount ; i++)
749 {
750 PhyDetails[i].attached_phy = saRoot->phys[i].sasIdentify.phyIdentifier;
751 /* deice types
752 * SAS
753 * 0x01 - Sas end device
754 * 0x02 - Expander device
755 * SATA
756 * 0x11 - Sata
757 * NO DEVICE 0x00
758 */
759 sas_dev_type = (saRoot->phys[i].sasIdentify.deviceType_addressFrameType & 0x70 ) >> 4 ;
760 if ((saRoot->phys[i].status == 1) && (sas_dev_type == 0)){ //status 1 - Phy Up
761 //Sata phy
762 PhyDetails[i].attached_dev_type = SAS_PHY_SATA_DEVICE;//0x11 for sata end device
763 osti_memcpy(&PhyDetails[i].attached_sasAddressHi, tdsaAllShared->Ports[i].SASID.sasAddressHi, sizeof(bit32));
764 osti_memcpy(&PhyDetails[i].attached_sasAddressLo, tdsaAllShared->Ports[i].SASID.sasAddressLo, sizeof(bit32));
765 PhyDetails[i].attached_sasAddressLo[3] += i + 16;
766 }
767 else {
768 PhyDetails[i].attached_dev_type = sas_dev_type;
769 osti_memcpy(&PhyDetails[i].attached_sasAddressHi, saRoot->phys[i].sasIdentify.sasAddressHi, sizeof(bit32));
770 osti_memcpy(&PhyDetails[i].attached_sasAddressLo, saRoot->phys[i].sasIdentify.sasAddressLo, sizeof(bit32));
771 }
772 osti_memcpy(&PhyDetails[i].sasAddressLo,&(tdsaAllShared->Ports[i].SASID.sasAddressLo), sizeof(bit32));
773 osti_memcpy(&PhyDetails[i].sasAddressHi,&(tdsaAllShared->Ports[i].SASID.sasAddressHi), sizeof(bit32));
774 }
775
776 // osti_memcpy(&agIoctlPayload->FunctionSpecificArea,&PhyInfo, sizeof(agsaSGpioReqResponse_t));
777 // printk("Ioctl success\n");
778 return IOCTL_CALL_SUCCESS;
779 }
780
781 case IOCTL_MJ_PHY_GENERAL_STATUS:
782 {
783 agsaPhyGeneralState_t *PhyData=NULL;
784 bit32 ret = AGSA_RC_FAILURE;
785 PhyData = (agsaPhyGeneralState_t*) &agIOCTLPayload->FunctionSpecificArea[0];
786
787 PhyData->Reserved2 = 0;
788 /* Validate the length */
789 if (agIOCTLPayload->Length < sizeof(agsaPhyGeneralState_t))
790 {
791 status = IOCTL_CALL_FAIL;
792 break;
793 }
794
795 tdsaAllShared->tdFWControlEx.param1 = agParam1;
796 tdsaAllShared->tdFWControlEx.param2 = agParam2;
797 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
798 tdsaAllShared->tdFWControlEx.inProgress = 1;
799 //tdsaAllShared->tdFWControlEx.usrAddr = PhyData;
800
801 ret = tdsaGetPhyGeneralStatusIoctl(tiRoot,PhyData);
802 if(ret == AGSA_RC_FAILURE)
803 {
804 status = IOCTL_CALL_FAIL;
805 tdsaAllShared->tdFWControlEx.payload = NULL;
806 tdsaAllShared->tdFWControlEx.inProgress = 0;
807 break;
808 }
809 else if(ret == IOCTL_ERR_STATUS_NOT_SUPPORTED)
810 {
811
812 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
813 status = IOCTL_CALL_SUCCESS;
814 break;
815 }
816
817 //status = IOCTL_CALL_PENDING;
818 status = IOCTL_CALL_PENDING;
819 }
820
821 break;
822 #if 1
823 case IOCTL_MJ_GET_PHY_PROFILE:
824 {
825 TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_GET_PHY_PROFILE %p %p %p\n",agParam1,agParam2,agParam3));
826 status = tdsaPhyProfileIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
827 break;
828 }
829 #endif
830 case IOCTL_MJ_LL_TRACING:
831 {
832 void * stu = &agIOCTLPayload->FunctionSpecificArea[0];
833 switch(agIOCTLPayload->MinorFunction)
834 {
835
836 case IOCTL_MN_LL_RESET_TRACE_INDEX:
837 {
838
839 #ifdef SA_ENABLE_TRACE_FUNCTIONS
840 TSTMTID_TRACE_BUFFER_RESET *llist = (TSTMTID_TRACE_BUFFER_RESET *)stu;
841 hpTraceBufferParms_t BufferParms;
842 TI_DBG5(("tdReturnIOCTL_Info: hpIOCTL_ResetTraceIndex\n"));
843
844 BufferParms.TraceCompiled = 0;
845 BufferParms.TraceWrap = 0;
846 BufferParms.CurrentTraceIndexWrapCount = 0;
847 BufferParms.BufferSize = 0;
848 BufferParms.CurrentIndex = 0;
849 BufferParms.pTrace = NULL;
850 BufferParms.pTraceIndexWrapCount = NULL;
851 BufferParms.pTraceMask = NULL;
852 BufferParms.pCurrentTraceIndex = NULL;
853
854 smTraceGetInfo(agRoot,&BufferParms);
855 TI_DBG5(("tdReturnIOCTL_Info: pTrace %p\n",BufferParms.pTrace));
856 TI_DBG5(("tdReturnIOCTL_Info: pCurrentTraceIndex %p %X\n",BufferParms.pCurrentTraceIndex,*BufferParms.pCurrentTraceIndex));
857 TI_DBG5(("tdReturnIOCTL_Info: pTraceIndexWrapCount %p %X\n",BufferParms.pTraceIndexWrapCount,*BufferParms.pTraceIndexWrapCount));
858 TI_DBG5(("tdReturnIOCTL_Info: pTraceMask %p %X\n",BufferParms.pTraceMask,*BufferParms.pTraceMask));
859
860 if( llist->Flag != 0)
861 {
862 if( llist->TraceMask != *BufferParms.pTraceMask)
863 {
864 smTraceSetMask(agRoot, llist->TraceMask );
865 }
866 }
867 if( llist->Reset)
868 {
869
870 *BufferParms.pCurrentTraceIndex = 0;
871 smResetTraceBuffer(agRoot);
872
873 *BufferParms.pCurrentTraceIndex = 0;
874 *BufferParms.pTraceIndexWrapCount =0;
875 llist->TraceMask = *BufferParms.pTraceMask;
876 }
877 #endif /* SA_ENABLE_TRACE_FUNCTIONS */
878 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
879 status = IOCTL_CALL_SUCCESS;
880
881 }
882 break;
883
884 case IOCTL_MN_LL_GET_TRACE_BUFFER_INFO:
885 {
886 hpTraceBufferParms_t BufferParms;
887 TSTMTID_TRACE_BUFFER_INFO *llist = (TSTMTID_TRACE_BUFFER_INFO *)stu;
888 TI_DBG5(("tdReturnIOCTL_Info: hpIOCTL_GetTraceBufferInfo\n"));
889
890
891 BufferParms.TraceCompiled = 0;
892 BufferParms.TraceWrap = 0;
893 BufferParms.CurrentTraceIndexWrapCount = 0;
894 BufferParms.BufferSize = 0;
895 BufferParms.CurrentIndex = 0;
896 BufferParms.pTrace = NULL;
897 BufferParms.pTraceMask = NULL;
898 #ifdef SA_ENABLE_TRACE_FUNCTIONS
899 smTraceGetInfo(agRoot,&BufferParms);
900 #endif /* SA_ENABLE_TRACE_FUNCTIONS not enabled */
901 llist->TraceCompiled = BufferParms.TraceCompiled;
902 llist->BufferSize = BufferParms.BufferSize;
903 llist->CurrentIndex = BufferParms.CurrentIndex ;
904 llist->CurrentTraceIndexWrapCount = BufferParms.CurrentTraceIndexWrapCount;
905 llist->TraceWrap = BufferParms.TraceWrap;
906 if(BufferParms.pTraceMask != NULL)
907 {
908 llist->TraceMask = *BufferParms.pTraceMask;
909 }
910 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
911 status = IOCTL_CALL_SUCCESS;
912 }
913 break;
914
915 case IOCTL_MN_LL_GET_TRACE_BUFFER:
916 {
917 #ifdef SA_ENABLE_TRACE_FUNCTIONS
918 TSTMTID_TRACE_BUFFER_FETCH *llist = (TSTMTID_TRACE_BUFFER_FETCH *)stu;
919
920 hpTraceBufferParms_t BufferParms;
921 bit32 c= 0;
922
923 BufferParms.TraceCompiled = 0;
924 BufferParms.TraceWrap = 0;
925 BufferParms.CurrentTraceIndexWrapCount = 0;
926 BufferParms.BufferSize = 0;
927 BufferParms.CurrentIndex = 0;
928 BufferParms.pTrace = NULL;
929 smTraceGetInfo(agRoot,&BufferParms);
930
931 TI_DBG6(("tdReturnIOCTL_Info: hpIOCTL_GetTraceBuffer\n"));
932
933 if(llist->LowFence != LowFence32Bits)
934 {
935 break;
936 }
937 if(llist->HighFence != HighFence32Bits)
938 {
939 break;
940 }
941
942 if(llist->BufferOffsetBegin + FetchBufferSIZE > BufferParms.BufferSize )
943 {
944 }
945
946 for ( c=0; c < FetchBufferSIZE;c++)
947 {
948 llist->Data[c] = *(BufferParms.pTrace+( c + llist->BufferOffsetBegin));
949 }
950 #endif /* SA_ENABLE_TRACE_FUNCTIONS not enabled */
951 }
952 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
953 status = IOCTL_CALL_SUCCESS;
954 break;
955 }
956 break;
957 }
958
959 #ifdef SA_LL_API_TEST
960 case IOCTL_MJ_LL_API_TEST:
961 {
962 status = tdLlApiTestIoctl( tiRoot, agIOCTLPayload,
963 agParam1,agParam2,agParam3 );
964 break;
965 }
966
967 #endif /* SA_LL_API_TEST */
968
969 case IOCTL_MJ_MODE_CTL_PAGE:
970 {
971 /* The SPCv controller has some options accessed via mode pages */
972 tiEncryptDekConfigPage_t *pModePage= (tiEncryptDekConfigPage_t *) &agIOCTLPayload->FunctionSpecificArea[0];
973 bit32 pageLength = 0;
974 bit32 pageCode;
975 bit32 modeOperation;
976
977 pageCode = pModePage->pageCode & 0xFF;
978 modeOperation = *(bit32 *) agParam2;
979
980 switch(modeOperation)
981 {
982
983 case tiModePageSet:
984 switch (pageCode)
985 {
986 case TI_ENCRYPTION_DEK_CONFIG_PAGE:
987 pageLength = sizeof(tiEncryptDekConfigPage_t);
988 break;
989
990 case TI_ENCRYPTION_CONTROL_PARM_PAGE:
991 pageLength = sizeof(tiEncryptControlParamPage_t);
992 break;
993
994 case TI_ENCRYPTION_GENERAL_CONFIG_PAGE:
995 /* Pages are currently unsupported */
996 pageLength = 0;
997 break;
998 }
999
1000 status = saSetControllerConfig(agRoot, 0, pageCode, pageLength, pModePage, (agsaContext_t *)agIOCTLPayload);
1001 break;
1002
1003 case tiModePageGet:
1004 status = saGetControllerConfig(agRoot, 0, pageCode, 0, 0, (agsaContext_t *)agIOCTLPayload);
1005 break;
1006
1007 default:
1008 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
1009 }
1010 }
1011 break;
1012 #ifdef PHY_RESTART_TEST
1013 case IOCTL_MJ_PORT_START:
1014 {
1015 bit32 portID, tiStatus;
1016 bit32 *data = (bit32*) &agIOCTLPayload->FunctionSpecificArea[0];
1017 portID = *data;
1018
1019 tiStatus = tiCOMPortStart(tiRoot, portID, tdsaAllShared->Ports[portID].tiPortalContext, 0);
1020
1021 if (tiStatus == tiSuccess)
1022 {
1023 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1024 }
1025 else
1026 {
1027 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1028 }
1029 status = IOCTL_CALL_SUCCESS;
1030 break;
1031 }
1032
1033 case IOCTL_MJ_PORT_STOP:
1034 {
1035 bit32 portID, tiStatus;
1036 bit32 *data = (bit32*) &agIOCTLPayload->FunctionSpecificArea[0];
1037 portID = *data;
1038
1039 tiStatus = tiCOMPortStop(tiRoot, tdsaAllShared->Ports[portID].tiPortalContext);
1040 if (tiStatus == tiSuccess)
1041 {
1042 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1043 }
1044 else
1045 {
1046 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1047 }
1048
1049 status = IOCTL_CALL_SUCCESS;
1050 break;
1051 }
1052 #endif
1053 case IOCTL_MJ_SEND_TMF:
1054 switch(agIOCTLPayload->MinorFunction)
1055 {
1056 case IOCTL_MN_TMF_DEVICE_RESET:
1057 status = tdsaSendTMFIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, AG_TARGET_WARM_RESET);
1058 break;
1059 case IOCTL_MN_TMF_LUN_RESET:
1060 status = tdsaSendTMFIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, AG_LOGICAL_UNIT_RESET);
1061 break;
1062 }
1063 break;
1064 case IOCTL_MJ_GET_DRIVER_VERSION:
1065 osti_sprintf(agIOCTLPayload->FunctionSpecificArea, "%s", AGTIAPI_DRIVER_VERSION);
1066 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1067 status=IOCTL_CALL_SUCCESS;
1068 break;
1069 default:
1070 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
1071 break;
1072 }
1073
1074 return status;
1075 }
1076
1077 #if 0
1078 /*****************************************************************************
1079 *
1080 * tdsaGpioSetup
1081 *
1082 * Purpose: This routine is called to set Gpio parameters to the controller.
1083 *
1084 * Parameters:
1085 * tiRoot: Pointer to driver instance
1086 * agsaContext_t :
1087 * tiIOCTLPayload_t : ioctl header with payload gpio info
1088 * agParam1,agParam2 : Generic parameters
1089 *
1090 * Return: status
1091 *
1092 *
1093 *****************************************************************************/
1094 osGLOBAL bit32
1095 tdsaGpioSetup(
1096 tiRoot_t *tiRoot,
1097 agsaContext_t *agContext,
1098 tiIOCTLPayload_t *agIOCTLPayload,
1099 void *agParam1,
1100 void *agParam2
1101 )
1102 {
1103
1104 tdsaTimerRequest_t *osIoctlTimer;
1105 agsaGpioEventSetupInfo_t *gpioEventSetupInfo;
1106 agsaGpioWriteSetupInfo_t *gpioWriteSetupInfo;
1107 agsaGpioPinSetupInfo_t *gpioPinSetupInfo;
1108 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1109 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1110 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
1111 bit32 status = IOCTL_CALL_SUCCESS;
1112
1113 TI_DBG3(("tdsaGpioSetup: start\n"));
1114
1115 if(tiRoot == agNULL || agIOCTLPayload == agNULL )
1116 return IOCTL_CALL_FAIL;
1117
1118 osIoctlTimer = &tdsaAllShared->osIoctlTimer;
1119 tdsaInitTimerRequest(tiRoot, osIoctlTimer);
1120 tdIoctlStartTimer(tiRoot, osIoctlTimer); /* Start the timout handler for both ioctl and controller response */
1121 tdsaAllShared->tdFWControlEx.virtAddr = (bit8 *)osIoctlTimer;
1122
1123 tdsaAllShared->tdFWControlEx.usrAddr = (bit8 *)&agIOCTLPayload->FunctionSpecificArea[0];
1124 tdsaAllShared->tdFWControlEx.param1 = agParam1;
1125 tdsaAllShared->tdFWControlEx.param2 = agParam2;
1126 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
1127 tdsaAllShared->tdFWControlEx.inProgress = 1;
1128
1129 switch (agIOCTLPayload->MinorFunction)
1130 {
1131
1132 case IOCTL_MN_GPIO_PINSETUP:
1133 {
1134 TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_PINSETUP\n"));
1135 gpioPinSetupInfo =(agsaGpioPinSetupInfo_t *)&agIOCTLPayload->FunctionSpecificArea[0];
1136 status = saGpioPinSetup(agRoot, agContext, 0, gpioPinSetupInfo);
1137
1138 break;
1139 }
1140 case IOCTL_MN_GPIO_EVENTSETUP:
1141 {
1142 TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_EVENTSETUP\n"));
1143 gpioEventSetupInfo = (agsaGpioEventSetupInfo_t *)&agIOCTLPayload->FunctionSpecificArea[0];
1144 status = saGpioEventSetup(agRoot, agContext, 0, gpioEventSetupInfo);
1145
1146 break;
1147 }
1148
1149 case IOCTL_MN_GPIO_READ:
1150 {
1151 TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_READ\n"));
1152 status = saGpioRead(agRoot, agContext, 0);
1153
1154 break;
1155 }
1156
1157 case IOCTL_MN_GPIO_WRITE:
1158 {
1159 TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_WRITE\n"));
1160 gpioWriteSetupInfo = (agsaGpioWriteSetupInfo_t *)&agIOCTLPayload->FunctionSpecificArea[0];
1161 status = saGpioWrite(agRoot, agContext, 0, gpioWriteSetupInfo->gpioWritemask, gpioWriteSetupInfo->gpioWriteVal);
1162
1163 break;
1164 }
1165
1166 default :
1167 return status;
1168 }
1169
1170 if(status != AGSA_RC_SUCCESS)
1171 {
1172 status = IOCTL_CALL_FAIL;
1173 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1174
1175 tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
1176 if (osIoctlTimer->timerRunning == agTRUE)
1177 {
1178 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
1179 tdsaKillTimer(tiRoot, osIoctlTimer);
1180
1181 }else{
1182 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
1183 }
1184 }
1185
1186 TI_DBG3(("tdsaGpioPinSetup: End\n"));
1187 return status;
1188
1189 }
1190 #endif
1191
1192 /*****************************************************************************
1193 *
1194 * ostiGetGpioIOCTLRsp
1195 *
1196 * Purpose: This routine is called for Get Gpio IOCTL reaponse has been received.
1197 *
1198 * Parameters:
1199 * tiRoot: Pointer to driver instance
1200 * payloadRsp: Pointer to the FW download IOMB's payload.
1201 *
1202 * Return: none
1203 *
1204 *
1205 *****************************************************************************/
1206
1207 osGLOBAL void ostiGetGpioIOCTLRsp(
1208 tiRoot_t *tiRoot,
1209 bit32 status,
1210 bit32 gpioReadValue,
1211 agsaGpioPinSetupInfo_t *gpioPinSetupInfo,
1212 agsaGpioEventSetupInfo_t *gpioEventSetupInfo
1213 )
1214 {
1215 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1216 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1217 tiIOCTLPayload_t *agIoctlPayload ;
1218 agsaGpioReadInfo_t *gpioReadInfo;
1219
1220 tdsaTimerRequest_t *osIoctlTimer;
1221 osIoctlTimer = (tdsaTimerRequest_t *)tdsaAllShared->tdFWControlEx.virtAddr;
1222
1223 TI_DBG2(("ostiGetGpioIOCTLRsp: start, status = %d \n", status));
1224
1225 agIoctlPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1226
1227 if(agIoctlPayload == agNULL){
1228 return;
1229 }
1230
1231 agIoctlPayload->Status =(bit16) status;
1232
1233 if( (status != IOCTL_CALL_TIMEOUT) && (osIoctlTimer != NULL))
1234 {
1235 tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
1236 if (osIoctlTimer->timerRunning == agTRUE)
1237 {
1238 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
1239 tdsaKillTimer(tiRoot, osIoctlTimer);
1240
1241 }else{
1242 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
1243 }
1244 }else {
1245 tdsaAllShared->tdFWControlEx.inProgress = 0;
1246 agIoctlPayload->Status = (bit16)status;
1247 ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
1248 tdsaAllShared->tdFWControlEx.param2, NULL);
1249 return;
1250 }
1251
1252 if(status == SUCCESS)
1253 TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response from OUTBuf"));
1254 else {
1255 tdsaAllShared->tdFWControlEx.inProgress = 0;
1256 ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
1257 tdsaAllShared->tdFWControlEx.param2, NULL);
1258 return;
1259 }
1260
1261 switch (agIoctlPayload->MinorFunction)
1262 {
1263
1264 case IOCTL_MN_GPIO_PINSETUP:
1265 {
1266 TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response for IOCTL_MN_GPIO_PINSETUP"));
1267
1268 break;
1269 }
1270 case IOCTL_MN_GPIO_EVENTSETUP:
1271 {
1272 TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response for IOCTL_MN_GPIO_EVENTSETUP"));
1273
1274 break;
1275 }
1276
1277 case IOCTL_MN_GPIO_WRITE:
1278 {
1279 TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response for IOCTL_MN_GPIO_WRITE"));
1280
1281 break;
1282 }
1283
1284 case IOCTL_MN_GPIO_READ:
1285 {
1286 gpioReadInfo = ( agsaGpioReadInfo_t *)tdsaAllShared->tdFWControlEx.usrAddr;
1287
1288 gpioReadInfo->gpioReadValue = gpioReadValue;
1289 gpioReadInfo->gpioInputEnabled = gpioPinSetupInfo->gpioInputEnabled ; /* GPIOIE */
1290 gpioReadInfo->gpioEventLevelChangePart1 = gpioPinSetupInfo->gpioTypePart1; /* GPIEVCHANGE (pins 11-0) */
1291 gpioReadInfo->gpioEventLevelChangePart2 = gpioPinSetupInfo->gpioTypePart2; /* GPIEVCHANGE (pins 23-20) */
1292 gpioReadInfo->gpioEventRisingEdgePart1 = 0xFFF & gpioEventSetupInfo->gpioEventRisingEdge; /* GPIEVRISE (pins 11-0) */
1293 gpioReadInfo->gpioEventRisingEdgePart2 = 0x00F00000 & (gpioEventSetupInfo->gpioEventRisingEdge); /* GPIEVRISE (pins 23-20) */
1294 gpioReadInfo->gpioEventFallingEdgePart1 = 0xFFF & gpioEventSetupInfo->gpioEventFallingEdge; /* GPIEVALL (pins 11-0) */
1295 gpioReadInfo->gpioEventFallingEdgePart2 = 0x00F00000 & gpioEventSetupInfo->gpioEventFallingEdge; /* GPIEVALL (pins 23-20 */
1296
1297 break;
1298 }
1299
1300 default :
1301 break;
1302 }
1303
1304 if(tdsaAllShared->tdFWControlEx.inProgress)
1305 {
1306 tdsaAllShared->tdFWControlEx.inProgress = 0;
1307 ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
1308 tdsaAllShared->tdFWControlEx.param2, NULL);
1309 }
1310 TI_DBG2(("ostiGetGpioIOCTLRsp: end \n"));
1311
1312 return ;
1313 }
1314
1315 /*****************************************************************************
1316 *
1317 * tdsaSGpioIoctlSetup
1318 *
1319 * Purpose: This routine is called to send SGPIO request to the controller.
1320 *
1321 * Parameters:
1322 * tiRoot: Pointer to driver instance
1323 * agsaContext_t: Context for this request
1324 * tiIOCTLPayload_t: ioctl header with payload sgpio info
1325 * agParam1,agParam2: Generic parameters
1326 *
1327 * Return: status
1328 *
1329 *
1330 *****************************************************************************/
1331 osGLOBAL bit32
1332 tdsaSGpioIoctlSetup(
1333 tiRoot_t *tiRoot,
1334 agsaContext_t *agContext,
1335 tiIOCTLPayload_t *agIOCTLPayload,
1336 void *agParam1,
1337 void *agParam2
1338 )
1339 {
1340 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1341 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1342 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
1343 bit32 status = IOCTL_CALL_FAIL;
1344 agsaSGpioReqResponse_t *pSGpioReq = (agsaSGpioReqResponse_t *)&agIOCTLPayload->FunctionSpecificArea[0];
1345
1346 TI_DBG3(("tdsaSGpioIoctlSetup: start\n"));
1347
1348 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1349
1350 do
1351 {
1352 if (tiRoot == agNULL || agIOCTLPayload == agNULL)
1353 {
1354 break;
1355 }
1356
1357 /* Validate the length */
1358 if (agIOCTLPayload->Length < sizeof(agsaSGpioReqResponse_t))
1359 {
1360 TI_DBG3(("Invalid length\n"));
1361 break;
1362 }
1363
1364 /* Validate the SMP Frame Type, Function and Register Type fields */
1365 if ((pSGpioReq->smpFrameType != SMP_REQUEST) || \
1366 ((pSGpioReq->function != SMP_READ_GPIO_REGISTER) && (pSGpioReq->function != SMP_WRITE_GPIO_REGISTER)) || \
1367 (pSGpioReq->registerType > AGSA_SGPIO_GENERAL_PURPOSE_TRANSMIT_REG))
1368 {
1369 TI_DBG4(("Invalid Parameter\n"));
1370 break;
1371 }
1372
1373 /* Specific validation for configuration register type */
1374 if (AGSA_SGPIO_CONFIG_REG == pSGpioReq->registerType)
1375 {
1376 if ((pSGpioReq->registerIndex > 0x01) || \
1377 ((0x00 == pSGpioReq->registerIndex) && (pSGpioReq->registerCount > 0x02)) || \
1378 ((0x01 == pSGpioReq->registerIndex) && (pSGpioReq->registerCount > 0x01)))
1379 {
1380 break;
1381 }
1382 }
1383
1384 /* Use FW control place in shared structure to keep the necessary information */
1385 tdsaAllShared->tdFWControlEx.param1 = agParam1;
1386 tdsaAllShared->tdFWControlEx.param2 = agParam2;
1387 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
1388 tdsaAllShared->tdFWControlEx.inProgress = 1;
1389
1390 status = saSgpio(agRoot, agContext, 0, pSGpioReq);
1391 if (status != AGSA_RC_SUCCESS)
1392 {
1393 break;
1394 }
1395
1396 status = IOCTL_CALL_PENDING;
1397
1398 } while (0);
1399
1400 TI_DBG3(("tdsaGpioPinSetup: End\n"));
1401 return status;
1402 }
1403
1404 /*****************************************************************************
1405 *
1406 * ostiSgpioIoctlRsp
1407 *
1408 * Purpose: This routine is called when a SGPIO IOCTL response is received.
1409 *
1410 * Parameters:
1411 * tiRoot: Pointer to driver instance
1412 * pSgpioResponse: Pointer to the SGPIO response
1413 *
1414 * Return: none
1415 *
1416 *
1417 *****************************************************************************/
1418 osGLOBAL void ostiSgpioIoctlRsp(
1419 tiRoot_t *tiRoot,
1420 agsaSGpioReqResponse_t *pSgpioResponse
1421 )
1422 {
1423 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1424 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1425 tiIOCTLPayload_t *agIoctlPayload = agNULL;
1426
1427 TI_DBG3(("ostiSgpioIoctlRsp: start\n"));
1428
1429 if (tdsaAllShared->tdFWControlEx.inProgress)
1430 {
1431 agIoctlPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1432 if (agIoctlPayload)
1433 {
1434 tdsaAllShared->tdFWControlEx.payload = NULL;
1435 osti_memcpy(&agIoctlPayload->FunctionSpecificArea[0], pSgpioResponse, sizeof(agsaSGpioReqResponse_t));
1436 agIoctlPayload->Status = IOCTL_ERR_STATUS_OK;
1437 sgpioResponseSet = 1;
1438 }
1439 tdsaAllShared->sgpioResponseSet = 1; //Sunitha:Check if needed?
1440
1441 ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
1442 tdsaAllShared->tdFWControlEx.param2, agNULL);
1443
1444 tdsaAllShared->tdFWControlEx.inProgress = 0;
1445 }
1446
1447 TI_DBG3(("ostiSgpioIoctlRsp: end\n"));
1448 }
1449 /*****************************************************************************
1450 *
1451 * ostiCOMMgntIOCTLRsp
1452 *
1453 * Purpose: This routine is called when FW control IOCTL reaponse has been received.
1454 * This function is used for both target and initiator.
1455 *
1456 * Parameters:
1457 * tiRoot: Pointer to driver instance
1458 * payloadRsp: Pointer to the FW download IOMB's payload.
1459 *
1460 * Return: none
1461 *
1462 *
1463 *
1464 *****************************************************************************/
1465
1466 osGLOBAL void ostiCOMMgntIOCTLRsp(
1467 tiRoot_t *tiRoot,
1468 bit32 status
1469 )
1470 {
1471 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1472 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1473
1474 TI_DBG1(("ostiCOMMgntIOCTLRsp: status 0x%x\n",status));
1475 (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
1476
1477 ostiFreeMemory(tiRoot,
1478 tdsaAllShared->tdFWControlEx.buffer,
1479 tdsaAllShared->tdFWControlEx.tdFWControl->len);
1480
1481 ostiIOCTLSetSignal(tiRoot,
1482 tdsaAllShared->tdFWControlEx.param1,
1483 tdsaAllShared->tdFWControlEx.param2,
1484 NULL);
1485 }
1486
1487
1488 /*****************************************************************************
1489 *
1490 * ostiRegDumpIOCTLRsp
1491 *
1492 * Purpose: This routine is called when Register Dump from flash IOCTL reaponse has been received.
1493 * This function is used for both target and initiator.
1494 *
1495 * Parameters:
1496 * tiRoot: Pointer to driver instance
1497 * payloadRsp: Pointer to the FW download IOMB's payload.
1498 *
1499 * Return: none
1500 *
1501 *
1502 *
1503 *****************************************************************************/
1504
1505 osGLOBAL void ostiRegDumpIOCTLRsp(
1506 tiRoot_t *tiRoot,
1507 bit32 status
1508 )
1509 {
1510 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1511 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1512
1513 TI_DBG1(("ostiRegDumpIOCTLRsp: start\n"));
1514 // (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
1515 osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
1516 (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
1517 tdsaAllShared->tdFWControlEx.len);
1518
1519 ostiFreeMemory(tiRoot,
1520 tdsaAllShared->tdFWControlEx.buffer,
1521 tdsaAllShared->tdFWControlEx.len);
1522
1523 ostiIOCTLSetSignal(tiRoot,
1524 tdsaAllShared->tdFWControlEx.param1,
1525 tdsaAllShared->tdFWControlEx.param2,
1526 NULL);
1527 }
1528
1529 /*****************************************************************************
1530 *
1531 * ostiSetNVMDIOCTLRsp
1532 *
1533 * Purpose: This routine is called for Set NVMD IOCTL reaponse has been received.
1534 * This function is used for both target and initiator.
1535 *
1536 * Parameters:
1537 * tiRoot: Pointer to driver instance
1538 * payloadRsp: Pointer to the FW download IOMB's payload.
1539 *
1540 * Return: none
1541 *
1542 *
1543 *
1544 *****************************************************************************/
1545
1546 osGLOBAL void ostiSetNVMDIOCTLRsp(
1547 tiRoot_t *tiRoot,
1548 bit32 status
1549 )
1550 {
1551 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1552 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1553 tiIOCTLPayload_t *agIOCTLPayload;
1554
1555 if(status)
1556 {
1557 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1558 agIOCTLPayload->Status = (bit16)status;
1559 }
1560
1561 TI_DBG1(("ostiSetNVMDIOCTLRsp: start, status = %d\n", status));
1562 // (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
1563 ostiFreeMemory(tiRoot,
1564 tdsaAllShared->tdFWControlEx.buffer,
1565 tdsaAllShared->tdFWControlEx.len);
1566
1567 ostiIOCTLSetSignal(tiRoot,
1568 tdsaAllShared->tdFWControlEx.param1,
1569 tdsaAllShared->tdFWControlEx.param2,
1570 NULL);
1571 }
1572 #ifdef SPC_ENABLE_PROFILE
1573 /*****************************************************************************
1574 *
1575 * ostiFWProfileIOCTLRsp
1576 *
1577 * Purpose: This routine is called for Fw Profile IOCTL reaponse has been received.
1578 * This function is used for both target and initiator.
1579 *
1580 * Parameters:
1581 * tiRoot: Pointer to driver instance
1582 * status:
1583 *
1584 * Return: none
1585 *
1586 *
1587 *
1588 *****************************************************************************/
1589
1590 osGLOBAL void ostiFWProfileIOCTLRsp(
1591 tiRoot_t *tiRoot,
1592 bit32 status,
1593 bit32 len)
1594 {
1595 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1596 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1597 tdFWProfile_t *fwProfile;
1598
1599 TI_DBG1(("ostiFWProfileIOCTLRsp: start\n"));
1600 fwProfile = (tdFWProfile_t *)tdsaAllShared->tdFWProfileEx.tdFWProfile;
1601 // (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
1602 if (status == AGSA_RC_SUCCESS)
1603 {
1604 if((fwProfile->cmd == STOP_TIMER_PROFILE) || (fwProfile->cmd == STOP_CODE_PROFILE))
1605 {
1606 osti_memcpy((void *)(fwProfile->buffer),
1607 (void *)(tdsaAllShared->tdFWProfileEx.virtAddr),
1608 len);
1609
1610 ostiFreeMemory(tiRoot,
1611 tdsaAllShared->tdFWProfileEx.buffer,
1612 tdsaAllShared->tdFWProfileEx.len);
1613 }
1614 }
1615 fwProfile->status = status;
1616 fwProfile->len = len;
1617 ostiIOCTLSetSignal(tiRoot,
1618 tdsaAllShared->tdFWProfileEx.param1,
1619 tdsaAllShared->tdFWProfileEx.param2,
1620 NULL);
1621 }
1622 #endif
1623 /*****************************************************************************
1624 *
1625 * ostiGetNVMDIOCTLRsp
1626 *
1627 * Purpose: This routine is called for Get NVMD IOCTL reaponse has been received.
1628 * This function is used for both target and initiator.
1629 *
1630 * Parameters:
1631 * tiRoot: Pointer to driver instance
1632 * payloadRsp: Pointer to the FW download IOMB's payload.
1633 *
1634 * Return: none
1635 *
1636 *
1637 *
1638 *****************************************************************************/
1639
1640 osGLOBAL void ostiGetNVMDIOCTLRsp(
1641 tiRoot_t *tiRoot,
1642 bit32 status
1643 )
1644 {
1645 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1646 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1647 tiIOCTLPayload_t *agIOCTLPayload;
1648
1649 if(status)
1650 {
1651 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1652 agIOCTLPayload->Status = (bit16)status;
1653 }
1654
1655 TI_DBG1(("ostiGetNVMDIOCTLRsp: start, status = %d\n", status));
1656 tdsaAllShared->NvmdResponseSet = 1;
1657
1658 if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
1659 {
1660 osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
1661 (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
1662 tdsaAllShared->tdFWControlEx.len);
1663
1664 ostiFreeMemory(tiRoot,
1665 tdsaAllShared->tdFWControlEx.buffer,
1666 tdsaAllShared->tdFWControlEx.len);
1667
1668 ostiIOCTLSetSignal(tiRoot,
1669 tdsaAllShared->tdFWControlEx.param1,
1670 tdsaAllShared->tdFWControlEx.param2,
1671 NULL);
1672 }
1673 }
1674
1675
1676 /*****************************************************************************
1677 *
1678 * ostiGetPhyProfileIOCTLRsp
1679 *
1680 * Purpose: This routine is called for phy response has been received.
1681 * This function is used for both target and initiator.
1682 *
1683 * Parameters:
1684 * tiRoot: Pointer to driver instance
1685 * payloadRsp: Pointer to the IOMB's payload.
1686 *
1687 * Return: none
1688 *
1689 *
1690 *
1691 *****************************************************************************/
1692
1693 osGLOBAL void ostiGetPhyProfileIOCTLRsp(
1694 tiRoot_t *tiRoot,
1695 bit32 status
1696 )
1697 {
1698 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1699 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1700 tiIOCTLPayload_t *agIOCTLPayload;
1701 tdPhyCount_t *PhyBlob = agNULL;
1702 if(status)
1703 {
1704 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1705 agIOCTLPayload->Status = (bit16)status;
1706
1707 PhyBlob = (tdPhyCount_t*)&agIOCTLPayload->FunctionSpecificArea[0];
1708 if(PhyBlob)
1709 {
1710 // PhyBlob->Phy |= 0x800;
1711 if(PhyBlob->phyResetProblem == 0 )
1712 {
1713 PhyBlob->phyResetProblem = -1;
1714 }
1715 TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->Phy 0x%x\n",PhyBlob->Phy));
1716 TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->BW_rx 0x%x\n",PhyBlob->BW_rx));
1717 TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->BW_tx 0x%x\n",PhyBlob->BW_tx));
1718 TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->InvalidDword 0x%x\n",PhyBlob->InvalidDword));
1719 TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->runningDisparityError 0x%x\n",PhyBlob->runningDisparityError));
1720 TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->codeViolation 0x%x\n",PhyBlob->codeViolation));
1721 TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->phyResetProblem 0x%x\n",PhyBlob->phyResetProblem));
1722 TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->inboundCRCError 0x%x\n",PhyBlob->inboundCRCError));
1723
1724 }
1725
1726
1727 }
1728
1729 TI_DBG1(("ostiGetPhyProfileIOCTLRsp: start, status = %d\n", status));
1730 TI_DBG1(("ostiGetPhyProfileIOCTLRsp: start, len = %d %p %p\n", tdsaAllShared->tdFWControlEx.len,tdsaAllShared->tdFWControlEx.usrAddr,tdsaAllShared->tdFWControlEx.virtAddr));
1731
1732 // osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
1733 // (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
1734 // tdsaAllShared->tdFWControlEx.len);
1735
1736 ostiFreeMemory(tiRoot,
1737 tdsaAllShared->tdFWControlEx.buffer,
1738 tdsaAllShared->tdFWControlEx.len);
1739
1740 ostiIOCTLSetSignal(tiRoot,
1741 tdsaAllShared->tdFWControlEx.param1,
1742 tdsaAllShared->tdFWControlEx.param2,
1743 NULL);
1744 }
1745
1746
1747 /*****************************************************************************
1748 *
1749 * ostiGenEventIOCTLRsp
1750 *
1751 * Purpose: This routine is called when General Event happened while waiting for IOCTL response.
1752 * This function is used for both target and initiator.
1753 *
1754 * Parameters:
1755 * tiRoot: Pointer to driver instance
1756 * payloadRsp: Pointer to the FW download IOMB's payload.
1757 *
1758 * Return: none
1759 *
1760 *
1761 *
1762 *****************************************************************************/
1763
1764 osGLOBAL void ostiGenEventIOCTLRsp(
1765 tiRoot_t *tiRoot,
1766 bit32 status
1767 )
1768 {
1769 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1770 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1771 tiIOCTLPayload_t *agIOCTLPayload;
1772
1773 TI_DBG1(("ostiGenEventIOCTLRsp: start\n"));
1774
1775 if(tdsaAllShared->tdFWControlEx.inProgress) /*Free only if our IOCTL is in progress*/
1776 {
1777 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1778 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1779 (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1780
1781 ostiFreeMemory(tiRoot,
1782 tdsaAllShared->tdFWControlEx.buffer,
1783 tdsaAllShared->tdFWControlEx.len);
1784
1785 ostiIOCTLSetSignal(tiRoot,
1786 tdsaAllShared->tdFWControlEx.param1,
1787 tdsaAllShared->tdFWControlEx.param2,
1788 NULL);
1789 tdsaAllShared->tdFWControlEx.inProgress = 0;
1790 }
1791 #ifdef SPC_ENABLE_PROFILE
1792 if(tdsaAllShared->tdFWProfileEx.inProgress)
1793 {
1794 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWProfileEx.payload);
1795 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1796 if(tdsaAllShared->tdFWProfileEx.virtAddr != NULL) /*Free only if our IOCTL is in progress*/
1797 {
1798 ostiFreeMemory(tiRoot,
1799 tdsaAllShared->tdFWProfileEx.buffer,
1800 tdsaAllShared->tdFWProfileEx.len);
1801 tdsaAllShared->tdFWProfileEx.virtAddr = NULL;
1802 }
1803 ostiIOCTLSetSignal(tiRoot,
1804 tdsaAllShared->tdFWProfileEx.param1,
1805 tdsaAllShared->tdFWProfileEx.param2,
1806 NULL);
1807 tdsaAllShared->tdFWProfileEx.inProgress = 0;
1808
1809 }
1810 #endif /*SPC_ENABLE_PROFILE*/
1811
1812 }
1813
1814 osGLOBAL void
1815 ostiGetDeviceInfoIOCTLRsp(
1816 tiRoot_t *tiRoot,
1817 bit32 status,
1818 void *param
1819 )
1820 {
1821 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1822 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1823 tiIOCTLPayload_t *agIOCTLPayload = agNULL;
1824 tdDeviceInfoPayload_t *pTDDeviceInfo = agNULL;
1825 agsaDeviceInfo_t *pSADeviceInfo = agNULL;
1826
1827 TI_DBG1(("ostiGetDeviceInfoIOCTLRsp: start\n"));
1828
1829 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1830 pSADeviceInfo = (agsaDeviceInfo_t*)param;
1831 pTDDeviceInfo = (tdDeviceInfoPayload_t*)agIOCTLPayload->FunctionSpecificArea;
1832
1833 if (pSADeviceInfo != agNULL)
1834 {
1835 /* fill the device information in IOCTL payload */
1836 osti_memcpy(&pTDDeviceInfo->devInfo.sasAddressHi, pSADeviceInfo->sasAddressHi, sizeof(bit32));
1837 osti_memcpy(&pTDDeviceInfo->devInfo.sasAddressLo, pSADeviceInfo->sasAddressLo, sizeof(bit32));
1838
1839 pTDDeviceInfo->devInfo.sasAddressHi = DMA_BEBIT32_TO_BIT32(pTDDeviceInfo->devInfo.sasAddressHi);
1840 pTDDeviceInfo->devInfo.sasAddressLo = DMA_BEBIT32_TO_BIT32(pTDDeviceInfo->devInfo.sasAddressLo);
1841
1842 pTDDeviceInfo->devInfo.deviceType = (pSADeviceInfo->devType_S_Rate & 0x30) >> 4;
1843 pTDDeviceInfo->devInfo.linkRate = pSADeviceInfo->devType_S_Rate & 0x0F;
1844
1845 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1846 }
1847 else
1848 {
1849 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INVALID_DEVICE;
1850 }
1851
1852 if(tdsaAllShared->tdFWControlEx.inProgress) /*Free only if our IOCTL is in progress*/
1853 {
1854 ostiIOCTLSetSignal(tiRoot,
1855 tdsaAllShared->tdFWControlEx.param1,
1856 tdsaAllShared->tdFWControlEx.param2,
1857 NULL);
1858 tdsaAllShared->tdFWControlEx.inProgress = 0;
1859 }
1860 }
1861
1862
1863 #ifdef INITIATOR_DRIVER
1864 osGLOBAL void
1865 ostiGetIoErrorStatsIOCTLRsp(
1866 tiRoot_t *tiRoot,
1867 bit32 status,
1868 void *param
1869 )
1870 {
1871 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1872 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1873 itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
1874 tiIOCTLPayload_t *agIOCTLPayload = agNULL;
1875 tdIoErrorStatisticPayload_t *pIoErrorPayload = agNULL;
1876 agsaIOErrorEventStats_t *pIoErrorCount = agNULL;
1877
1878 OS_ASSERT(sizeof(agsaIOErrorEventStats_t) == sizeof(tdIoErrorEventStatisticIOCTL_t), "agsaIOErrorEventStats_t tdIoErrorEventStatisticIOCTL_t\n");
1879 TI_DBG1(("ostiGetIoErrorStatsIOCTLRsp: start\n"));
1880
1881 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1882 pIoErrorPayload = (tdIoErrorStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
1883 pIoErrorCount = (agsaIOErrorEventStats_t*)param;
1884
1885 osti_memcpy(&pIoErrorPayload->IoError, pIoErrorCount, sizeof(agsaIOErrorEventStats_t));
1886 /*copy SCSI status and sense key count from OS layer to TD layer*/
1887 osti_memcpy(&pIoErrorPayload->ScsiStatusCounter, &Initiator->ScsiStatusCounts, sizeof(tdSCSIStatusCount_t));
1888 osti_memcpy(&pIoErrorPayload->SenseKeyCounter, &Initiator->SenseKeyCounter, sizeof(tdSenseKeyCount_t));
1889 if (pIoErrorPayload->flag)
1890 {
1891 osti_memset(&Initiator->ScsiStatusCounts, 0,sizeof(tdSCSIStatusCount_t) );
1892 osti_memset(&Initiator->SenseKeyCounter, 0,sizeof(tdSenseKeyCount_t) );
1893 }
1894
1895 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1896 }
1897 #endif /* INITIATOR_DRIVER */
1898
1899 osGLOBAL void
1900 ostiGetIoEventStatsIOCTLRsp(
1901 tiRoot_t *tiRoot,
1902 bit32 status,
1903 void *param
1904 )
1905 {
1906 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1907 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1908 tiIOCTLPayload_t *agIOCTLPayload = agNULL;
1909 tdIoEventStatisticPayload_t *pIoEventPayload = agNULL;
1910 agsaIOErrorEventStats_t *pIoEventCount = agNULL;
1911
1912 TI_DBG1(("ostiGetIoEventStatsIOCTLRsp: start\n"));
1913
1914 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1915 pIoEventPayload = (tdIoEventStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
1916 pIoEventCount = (agsaIOErrorEventStats_t*)param;
1917
1918 osti_memcpy(&pIoEventPayload->IoEvent, pIoEventCount, sizeof(agsaIOErrorEventStats_t));
1919
1920 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1921 }
1922
1923 osGLOBAL void
1924 ostiGetForensicDataIOCTLRsp(
1925 tiRoot_t *tiRoot,
1926 bit32 status,
1927 void *param
1928 )
1929 {
1930 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1931 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1932 tiIOCTLPayload_t *agIOCTLPayload = agNULL;
1933 tdForensicDataPayload_t *pForensicDataPayload = agNULL;
1934 agsaForensicData_t *pForensicData = agNULL;
1935
1936 TI_DBG3(("ostiGetForensicDataIOCTLRsp: start, status = %d\n", status));
1937
1938 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1939 pForensicDataPayload = (tdForensicDataPayload_t*)agIOCTLPayload->FunctionSpecificArea;
1940 pForensicData = (agsaForensicData_t*)param;
1941
1942 if (agNULL == agIOCTLPayload)
1943 {
1944 return;
1945 }
1946
1947 if (FORENSIC_DATA_TYPE_CHECK_FATAL == pForensicData->DataType)
1948 {
1949 agIOCTLPayload->Status = (bit16)status;
1950 return;
1951 }
1952
1953 if (status == AGSA_RC_SUCCESS)
1954 {
1955 switch (pForensicData->DataType)
1956 {
1957 case FORENSIC_DATA_TYPE_NON_FATAL:
1958 case FORENSIC_DATA_TYPE_FATAL:
1959 pForensicDataPayload->dataBuffer.directOffset = pForensicData->BufferType.dataBuf.directOffset;
1960 pForensicDataPayload->dataBuffer.readLen = pForensicData->BufferType.dataBuf.readLen;
1961 break;
1962 case FORENSIC_DATA_TYPE_GSM_SPACE:
1963 pForensicDataPayload->gsmBuffer.directOffset = pForensicData->BufferType.gsmBuf.directOffset;
1964 pForensicDataPayload->gsmBuffer.readLen = pForensicData->BufferType.gsmBuf.readLen;
1965 break;
1966
1967 case FORENSIC_DATA_TYPE_QUEUE:
1968 break;
1969
1970 default:
1971 TI_DBG1(("ostiGetForensicDataIOCTLRsp: forensic data type error %d\n", pForensicData->DataType));
1972 break;
1973 }
1974 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1975 }
1976 else if(status == IOCTL_ERROR_NO_FATAL_ERROR)
1977 {
1978 agIOCTLPayload->Status = (bit16)status;
1979 }
1980 else
1981 {
1982 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1983 }
1984
1985 /*Free only if our IOCTL is in progress*/
1986 if(tdsaAllShared->tdFWControlEx.inProgress)
1987 {
1988 TI_DBG3(("ostiGetForensicDataIOCTLRsp: Waiting for the signal \n"));
1989 ostiIOCTLSetSignal(tiRoot,
1990 tdsaAllShared->tdFWControlEx.param1,
1991 tdsaAllShared->tdFWControlEx.param2,
1992 NULL);
1993 TI_DBG3(("ostiGetForensicDataIOCTLRsp: Signal wait completed \n"));
1994 tdsaAllShared->tdFWControlEx.inProgress = 0;
1995 }
1996 }
1997
1998 /*****************************************************************************
1999 *
2000 * tdsaRegDumpGetIoctl
2001 *
2002 * Purpose: This routine is called to get Register Dump information.
2003 * This function is used for both target and initiator.
2004 *
2005 * Parameters:
2006 * tiRoot: Pointer to driver instance
2007 * agIOCTLPayload: Pointer to the IOCTL payload.
2008 * agParam1: Pointer to pass context handle for IOCTL DMA operation
2009 * agParam2: Pointer to pass context handle for IOCTL DMA operation
2010 * agParam3: Pointer to pass context handle for IOCTL DMA operation
2011 *
2012 * Return:
2013 *
2014 * IOCTL_CALL_SUCCESS The requested operation completed successfully.
2015 * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
2016 * Detail error code is function specific and
2017 * defined by the specific IOCTL function.
2018 * IOCTL_CALL_PENDING This request is asynchronous and completed
2019 * in some other context.
2020 * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
2021 *
2022 *
2023 *****************************************************************************/
2024 osGLOBAL bit32
2025 tdsaRegDumpGetIoctl(
2026 tiRoot_t *tiRoot,
2027 tiIOCTLPayload_t *agIOCTLPayload,
2028 void *agParam1,
2029 void *agParam2,
2030 void *agParam3
2031 )
2032 {
2033 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2034 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2035 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
2036 // agsaControllerStatus_t RegDump;
2037 bit32 Offset = 0;
2038 bit32 RequestLength = 0; /* user request on how much data to pass to application */
2039 agsaRegDumpInfo_t regDumpInfo;
2040 void *buffer = agNULL;
2041 void *osMemHandle = agNULL;
2042 bit32 status = IOCTL_CALL_SUCCESS;
2043 bit32 CoreDumpLength = 16384; /* change it once data is available */
2044 bit32 EventLogOffset = 65536;
2045
2046 ///saGetControllerStatus(agRoot, &RegDump);
2047 /* length of FSA as provided by application */
2048 RequestLength = agIOCTLPayload->Length;
2049 /// FunctionSpecificOffset = 0; /* Offset into the FunctionSpecificArea of payload */
2050 /* offset into core dump that was passed from application */
2051 Offset = agIOCTLPayload->Reserved;
2052
2053 if((CoreDumpLength <= Offset)&&
2054 (agIOCTLPayload->MinorFunction != IOCTL_MN_FW_GET_EVENT_FLASH_LOG1)&&
2055 (agIOCTLPayload->MinorFunction != IOCTL_MN_FW_GET_EVENT_FLASH_LOG2))
2056 {
2057 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
2058 agIOCTLPayload->Length = 0;
2059 status=IOCTL_CALL_SUCCESS;
2060 return status;
2061 }
2062 regDumpInfo.regDumpOffset = Offset;
2063 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
2064 /* dump either aap1 or iop registers */
2065 switch(agIOCTLPayload->MinorFunction){
2066
2067 /*Coredump*/
2068 case IOCTL_MN_FW_GET_CORE_DUMP_AAP1:
2069 //CoreDumpBAROffset = RegDump.fatalErrorInfo.regDumpOffset0; /* get this from mpi config table */
2070 //CoreDumpLength = RegDump.fatalErrorInfo.regDumpLen0;
2071 /*changes for added Call back*/
2072 tdsaAllShared->tdFWControlEx.param1 = agParam1;
2073 tdsaAllShared->tdFWControlEx.param2 = agParam2;
2074 regDumpInfo.regDumpSrc = 0;
2075 regDumpInfo.regDumpNum = 0;
2076 regDumpInfo.directLen = RequestLength;
2077 regDumpInfo.directData = &agIOCTLPayload->FunctionSpecificArea[0];
2078 /*changes for added Call back*/
2079 //status = IOCTL_CALL_SUCCESS;
2080 tdsaAllShared->tdFWControlEx.inProgress = 1;
2081 status = IOCTL_CALL_PENDING;
2082 break;
2083 case IOCTL_MN_FW_GET_CORE_DUMP_IOP:
2084 //CoreDumpBAROffset = RegDump.fatalErrorInfo.regDumpOffset1; /* get this from mpi config table */
2085 //CoreDumpLength = RegDump.fatalErrorInfo.regDumpLen1;
2086 /*changes for added Call back*/
2087 tdsaAllShared->tdFWControlEx.param1 = agParam1;
2088 tdsaAllShared->tdFWControlEx.param2 = agParam2;
2089 regDumpInfo.regDumpSrc = 0;
2090 regDumpInfo.regDumpNum = 1;
2091 regDumpInfo.directLen = RequestLength;
2092 regDumpInfo.directData = &agIOCTLPayload->FunctionSpecificArea[0];
2093 /*changes for added Call back*/
2094 //status = IOCTL_CALL_SUCCESS;
2095 tdsaAllShared->tdFWControlEx.inProgress = 1;
2096 status = IOCTL_CALL_PENDING;
2097 break;
2098 case IOCTL_MN_FW_GET_CORE_DUMP_FLASH_AAP1:
2099 regDumpInfo.regDumpSrc = 1;
2100 regDumpInfo.regDumpNum = 0;
2101 if(RequestLength != 0)
2102 {
2103 if(ostiAllocMemory( tiRoot,
2104 &osMemHandle,
2105 (void **)&buffer,
2106 &(regDumpInfo.indirectAddrUpper32),
2107 &(regDumpInfo.indirectAddrLower32),
2108 8,
2109 RequestLength,
2110 agFALSE))
2111 return IOCTL_CALL_FAIL;
2112 }
2113 osti_memset((void *)buffer, 0, RequestLength);
2114 regDumpInfo.indirectLen = RequestLength;
2115
2116 // use FW control place in shared structure to keep the neccesary information
2117 tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2118 tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2119 tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2120 tdsaAllShared->tdFWControlEx.len = RequestLength;
2121 tdsaAllShared->tdFWControlEx.param1 = agParam1;
2122 tdsaAllShared->tdFWControlEx.param2 = agParam2;
2123 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2124 tdsaAllShared->tdFWControlEx.inProgress = 1;
2125 status = IOCTL_CALL_PENDING;
2126 break;
2127 case IOCTL_MN_FW_GET_CORE_DUMP_FLASH_IOP:
2128 regDumpInfo.regDumpSrc = 1;
2129 regDumpInfo.regDumpNum = 1;
2130 if(RequestLength != 0)
2131 {
2132 if(ostiAllocMemory( tiRoot,
2133 &osMemHandle,
2134 (void **)&buffer,
2135 &(regDumpInfo.indirectAddrUpper32),
2136 &(regDumpInfo.indirectAddrLower32),
2137 8,
2138 RequestLength,
2139 agFALSE))
2140 return IOCTL_CALL_FAIL;
2141 }
2142 osti_memset((void *)buffer, 0, RequestLength);
2143 regDumpInfo.indirectLen = RequestLength;
2144
2145 // use FW control place in shared structure to keep the neccesary information
2146 tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2147 tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2148 tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2149 tdsaAllShared->tdFWControlEx.len = RequestLength;
2150 tdsaAllShared->tdFWControlEx.param1 = agParam1;
2151 tdsaAllShared->tdFWControlEx.param2 = agParam2;
2152 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2153 tdsaAllShared->tdFWControlEx.inProgress = 1;
2154 status = IOCTL_CALL_PENDING;
2155 break;
2156 /*EventLog from Flash*/
2157 case IOCTL_MN_FW_GET_EVENT_FLASH_LOG1: //aap1 Eventlog
2158 if(CoreDumpLength + EventLogOffset <= Offset)
2159 {
2160 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
2161 agIOCTLPayload->Length = 0;
2162 status=IOCTL_CALL_SUCCESS;
2163 return status;
2164 }
2165 regDumpInfo.regDumpSrc = 1;
2166 regDumpInfo.regDumpNum = 0;
2167 if(RequestLength != 0)
2168 {
2169 if(ostiAllocMemory( tiRoot,
2170 &osMemHandle,
2171 (void **)&buffer,
2172 &(regDumpInfo.indirectAddrUpper32),
2173 &(regDumpInfo.indirectAddrLower32),
2174 8,
2175 RequestLength,
2176 agFALSE))
2177 return IOCTL_CALL_FAIL;
2178 }
2179 osti_memset((void *)buffer, 0, RequestLength);
2180 regDumpInfo.indirectLen = RequestLength;
2181
2182 // use FW control place in shared structure to keep the neccesary information
2183 tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2184 tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2185 tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2186 tdsaAllShared->tdFWControlEx.len = RequestLength;
2187 tdsaAllShared->tdFWControlEx.param1 = agParam1;
2188 tdsaAllShared->tdFWControlEx.param2 = agParam2;
2189 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2190 tdsaAllShared->tdFWControlEx.inProgress = 1;
2191 status = IOCTL_CALL_PENDING;
2192 break;
2193 case IOCTL_MN_FW_GET_EVENT_FLASH_LOG2: //iop Eventlog
2194 if(CoreDumpLength + EventLogOffset <= Offset)
2195 {
2196 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
2197 agIOCTLPayload->Length = 0;
2198 status=IOCTL_CALL_SUCCESS;
2199 return status;
2200 }
2201 regDumpInfo.regDumpSrc = 1;
2202 regDumpInfo.regDumpNum = 1;
2203 if(RequestLength != 0)
2204 {
2205 if(ostiAllocMemory( tiRoot,
2206 &osMemHandle,
2207 (void **)&buffer,
2208 &(regDumpInfo.indirectAddrUpper32),
2209 &(regDumpInfo.indirectAddrLower32),
2210 8,
2211 RequestLength,
2212 agFALSE))
2213 return IOCTL_CALL_FAIL;
2214 }
2215 osti_memset((void *)buffer, 0, RequestLength);
2216 regDumpInfo.indirectLen = RequestLength;
2217
2218 // use FW control place in shared structure to keep the neccesary information
2219 tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2220 tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2221 tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2222 tdsaAllShared->tdFWControlEx.len = RequestLength;
2223 tdsaAllShared->tdFWControlEx.param1 = agParam1;
2224 tdsaAllShared->tdFWControlEx.param2 = agParam2;
2225 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2226 tdsaAllShared->tdFWControlEx.inProgress = 1;
2227 status = IOCTL_CALL_PENDING;
2228 break;
2229 default:
2230 status = IOCTL_CALL_INVALID_CODE;
2231 TI_DBG1(("tiCOMMgntIOCTL: ERROR: Wrong IOCTL code %d\n", agIOCTLPayload->MinorFunction));
2232 break;
2233 }
2234 if(saGetRegisterDump(agRoot, agNULL, 0, ®DumpInfo) != AGSA_RC_SUCCESS)
2235 {
2236 status = IOCTL_CALL_FAIL;
2237 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
2238 }
2239
2240 return status;
2241 }
2242
2243 osGLOBAL void
2244 ostiCOMMgntVPDSetIOCTLRsp(
2245 tiRoot_t *tiRoot,
2246 bit32 status
2247 )
2248 {
2249 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2250 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2251 // agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
2252
2253 TI_DBG1(("ostiCOMMgntVPDSetIOCTLRsp: start\n"));
2254 (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
2255
2256 ostiFreeMemory(tiRoot,
2257 tdsaAllShared->tdFWControlEx.buffer,
2258 tdsaAllShared->tdFWControlEx.len);
2259
2260 ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
2261 tdsaAllShared->tdFWControlEx.param2,
2262 NULL);
2263 }
2264
2265 /*****************************************************************************
2266 *
2267 * tdsaNVMDSetIoctl
2268 *
2269 * Purpose: This routine is called to set Config. SEEPROM information.
2270 * This function is used for both target and initiator.
2271 *
2272 * Parameters:
2273 * tiRoot: Pointer to driver instance
2274 * agIOCTLPayload: Pointer to the IOCTL payload.
2275 * agParam1: Pointer to pass context handle for IOCTL DMA operation
2276 * agParam2: Pointer to pass context handle for IOCTL DMA operation
2277 * agParam3: Pointer to pass context handle for IOCTL DMA operation
2278 *
2279 * Return:
2280 *
2281 * IOCTL_CALL_SUCCESS The requested operation completed successfully.
2282 * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
2283 * Detail error code is function specific and
2284 * defined by the specific IOCTL function.
2285 * IOCTL_CALL_PENDING This request is asynchronous and completed
2286 * in some other context.
2287 * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
2288 *
2289 *
2290 *****************************************************************************/
2291 osGLOBAL bit32
2292 tdsaNVMDSetIoctl(
2293 tiRoot_t *tiRoot,
2294 tiIOCTLPayload_t *agIOCTLPayload,
2295 void *agParam1,
2296 void *agParam2,
2297 void *agParam3
2298 )
2299 {
2300 bit32 RequestLength = 0;
2301 bit32 bufAddrUpper = 0;
2302 bit32 bufAddrLower = 0;
2303 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2304 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2305 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
2306 void *buffer = agNULL;
2307 void *osMemHandle = agNULL;
2308 bit32 status = IOCTL_CALL_SUCCESS;
2309 agsaNVMDData_t nvmdInfo;
2310
2311
2312 TI_DBG2(("tdsaNVMDSetIoctl: start\n"));
2313
2314 RequestLength = agIOCTLPayload->Length;
2315
2316 osti_memset(&nvmdInfo, 0, sizeof(agsaNVMDData_t));
2317
2318 switch(agIOCTLPayload->MinorFunction)
2319 {
2320 case IOCTL_MN_NVMD_SET_CONFIG:
2321
2322 //nvmdInfo.NVMDevice = 1;
2323 nvmdInfo.NVMDevice = *((bit8*)agParam3);
2324 nvmdInfo.signature = 0xFEDCBA98;
2325 nvmdInfo.dataOffsetAddress = agIOCTLPayload->Reserved;
2326 nvmdInfo.indirectPayload = 1;
2327 nvmdInfo.indirectLen = RequestLength;
2328
2329 if (nvmdInfo.NVMDevice == 0) {
2330 nvmdInfo.TWIDeviceAddress = 0xa0;
2331 nvmdInfo.TWIBusNumber = 0;
2332 nvmdInfo.TWIDevicePageSize = 0;
2333 nvmdInfo.TWIDeviceAddressSize = 1;
2334 }
2335
2336 if(RequestLength != 0)
2337 {
2338 if(ostiAllocMemory( tiRoot,
2339 &osMemHandle,
2340 (void **)&buffer,
2341 &bufAddrUpper,
2342 &bufAddrLower,
2343 8,
2344 RequestLength,
2345 agFALSE))
2346 return IOCTL_CALL_FAIL;
2347 }
2348 else
2349 {
2350 return IOCTL_CALL_FAIL;
2351 }
2352
2353 osti_memset((void *)buffer, 0, RequestLength);
2354
2355 osti_memcpy((void *)buffer,
2356 agIOCTLPayload->FunctionSpecificArea,
2357 RequestLength);
2358
2359 nvmdInfo.indirectAddrLower32 = bufAddrLower;
2360 nvmdInfo.indirectAddrUpper32 = bufAddrUpper;
2361 // use FW control place in shared structure to keep the neccesary information
2362 tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2363 tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2364 tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2365 tdsaAllShared->tdFWControlEx.len = RequestLength;
2366 tdsaAllShared->tdFWControlEx.param1 = agParam1;
2367 tdsaAllShared->tdFWControlEx.param2 = agParam2;
2368 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2369 tdsaAllShared->tdFWControlEx.inProgress = 1;
2370 status = IOCTL_CALL_PENDING;
2371 break;
2372 default:
2373 status = IOCTL_CALL_INVALID_CODE;
2374 TI_DBG1(("tdsaNVMDSetIoctl: ERROR: Wrong IOCTL code %d\n", agIOCTLPayload->MinorFunction));
2375 break;
2376 }
2377
2378 if(saSetNVMDCommand(agRoot, agNULL, 0, &nvmdInfo) != AGSA_RC_SUCCESS)
2379 {
2380 status = IOCTL_CALL_FAIL;
2381 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
2382 }
2383
2384 return status;
2385
2386 }
2387
2388 /*****************************************************************************
2389 *
2390 * tdsaNVMDGetIoctl
2391 *
2392 * Purpose: This routine is called to get Config. SEEPROM information.
2393 * This function is used for both target and initiator.
2394 *
2395 * Parameters:
2396 * tiRoot: Pointer to driver instance
2397 * agIOCTLPayload: Pointer to the IOCTL payload.
2398 * agParam1: Pointer to pass context handle for IOCTL DMA operation
2399 * agParam2: Pointer to pass context handle for IOCTL DMA operation
2400 * agParam3: Pointer to pass context handle for IOCTL DMA operation
2401 *
2402 * Return:
2403 *
2404 * IOCTL_CALL_SUCCESS The requested operation completed successfully.
2405 * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
2406 * Detail error code is function specific and
2407 * defined by the specific IOCTL function.
2408 * IOCTL_CALL_PENDING This request is asynchronous and completed
2409 * in some other context.
2410 * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
2411 *
2412 *
2413 *****************************************************************************/
2414 osGLOBAL bit32
2415 tdsaNVMDGetIoctl(
2416 tiRoot_t *tiRoot,
2417 tiIOCTLPayload_t *agIOCTLPayload,
2418 void *agParam1,
2419 void *agParam2,
2420 void *agParam3
2421 )
2422 {
2423 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2424 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2425 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
2426 void *buffer = agNULL;
2427 void *osMemHandle = agNULL;
2428 bit32 status = IOCTL_CALL_SUCCESS;
2429 agsaNVMDData_t nvmdInfo;
2430 bit32 Offset = 0;
2431 bit32 RequestLength = 0;
2432 bit32 ostiMemoryStatus = 0;
2433 bit32 i,j;
2434 bit8* seepromBuffer;
2435 bit8* phySettingsBuffer;
2436
2437
2438 TI_DBG2(("tdsaNVMDGetIoctl: start\n"));
2439
2440 RequestLength = agIOCTLPayload->Length;
2441 Offset = agIOCTLPayload->Reserved;
2442
2443 osti_memset(&nvmdInfo, 0, sizeof(agsaNVMDData_t));
2444 /* This condition is not valid for direct read so commenting */
2445 /*if(!tiIS_SPC(agRoot)) {
2446 if( RequestLength <= Offset ) //4096-max seeprom size
2447 {
2448 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
2449 agIOCTLPayload->Length = 0;
2450 status=IOCTL_CALL_SUCCESS;
2451 return status;
2452 }
2453 }*/
2454
2455 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
2456
2457 switch(agIOCTLPayload->MinorFunction)
2458 {
2459 case IOCTL_MN_NVMD_GET_CONFIG:
2460
2461 // nvmdInfo.NVMDevice = 1;
2462 nvmdInfo.NVMDevice = *((bit8*)agParam3);
2463 nvmdInfo.signature = 0xFEDCBA98;
2464 nvmdInfo.dataOffsetAddress = Offset;
2465 nvmdInfo.indirectPayload = 1;
2466 nvmdInfo.indirectLen = RequestLength;
2467
2468 if (nvmdInfo.NVMDevice == 0) {
2469 nvmdInfo.TWIDeviceAddress = 0xa0;
2470 nvmdInfo.TWIBusNumber = 0;
2471 nvmdInfo.TWIDevicePageSize = 0;
2472 nvmdInfo.TWIDeviceAddressSize = 1;
2473 }
2474
2475 if(RequestLength != 0)
2476 {
2477 ostiMemoryStatus = ostiAllocMemory( tiRoot,
2478 &osMemHandle,
2479 (void **)&buffer,
2480 &(nvmdInfo.indirectAddrUpper32),
2481 &(nvmdInfo.indirectAddrLower32),
2482 8,
2483 RequestLength,
2484 agFALSE);
2485 if((ostiMemoryStatus != tiSuccess) && (buffer == agNULL))
2486 return IOCTL_CALL_FAIL;
2487 }
2488 else
2489 {
2490 return IOCTL_CALL_FAIL;
2491 }
2492 osti_memset((void *)buffer, 0, RequestLength);
2493
2494 // use FW control place in shared structure to keep the neccesary information
2495 tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2496 tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2497 tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2498 tdsaAllShared->tdFWControlEx.len = RequestLength;
2499 tdsaAllShared->tdFWControlEx.param1 = agParam1;
2500 tdsaAllShared->tdFWControlEx.param2 = agParam2;
2501 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2502 tdsaAllShared->tdFWControlEx.inProgress = 1;
2503 status = IOCTL_CALL_PENDING;
2504 break;
2505 default:
2506 status = IOCTL_CALL_INVALID_CODE;
2507 TI_DBG1(("tiCOMMgntIOCTL: ERROR: Wrong IOCTL code %d\n", agIOCTLPayload->MinorFunction));
2508 break;
2509 }
2510 tdsaAllShared->NvmdResponseSet = 0;
2511
2512 if(saGetNVMDCommand(agRoot, agNULL, 0, &nvmdInfo) != AGSA_RC_SUCCESS)
2513 {
2514 status = IOCTL_CALL_FAIL;
2515 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
2516 return status;
2517 }
2518 /* Copy the SAS address */
2519 if(agParam1 == agNULL)
2520
2521 {
2522 while(!tdsaAllShared->NvmdResponseSet)
2523 {
2524 // tiCOMDelayedInterruptHandler(tiRoot, 0, 1, tiNonInterruptContext);
2525 }
2526 if(nvmdInfo.NVMDevice == 4 || nvmdInfo.NVMDevice == 1)
2527 {
2528 seepromBuffer = buffer;
2529 /*Get Initiator SAS address*/
2530
2531 if(tiIS_SPC(agRoot))
2532 {
2533 for(j=0,i=ADAPTER_WWN_SPC_START_OFFSET; i<= ADAPTER_WWN_SPC_END_OFFSET; i++,j++)
2534 agIOCTLPayload->FunctionSpecificArea[j] = seepromBuffer[i];
2535 }
2536 else
2537 {
2538 for(j=0,i=ADAPTER_WWN_START_OFFSET; i<= ADAPTER_WWN_END_OFFSET; i++,j++)
2539 agIOCTLPayload->FunctionSpecificArea[j] = seepromBuffer[i];
2540 }
2541 }
2542 /* Copy the Phy settings */
2543 else if(nvmdInfo.NVMDevice == 6)
2544 {
2545 phySettingsBuffer = buffer;
2546 for(i=0; i<PHY_SETTINGS_LEN; i++)
2547 agIOCTLPayload->FunctionSpecificArea[i] = phySettingsBuffer[i];
2548 }
2549 tdsaAllShared->NvmdResponseSet = 0;
2550 ostiFreeMemory(tiRoot, tdsaAllShared->tdFWControlEx.buffer, tdsaAllShared->tdFWControlEx.len);
2551
2552 }
2553 return status;
2554
2555 }
2556
2557 /*****************************************************************************
2558 *
2559 * tdsaDeviceInfoGetIoctl
2560 *
2561 * Purpose: This routine is called to get the specified device information.
2562 *
2563 * Parameters:
2564 * tiRoot: Pointer to driver instance
2565 * agIOCTLPayload: Pointer to the IOCTL payload.
2566 * agParam1: Pointer to pass context handle for IOCTL DMA operation
2567 * agParam2: Pointer to pass context handle for IOCTL DMA operation
2568 * agParam3: Pointer to pass context handle for IOCTL DMA operation
2569 *
2570 * Return:
2571 *
2572 * IOCTL_CALL_SUCCESS The requested operation completed successfully.
2573 * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
2574 * Detail error code is function specific and
2575 * defined by the specific IOCTL function.
2576 * IOCTL_CALL_PENDING This request is asynchronous and completed
2577 * in some other context.
2578 * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
2579 *
2580 *
2581 *****************************************************************************/
2582 osGLOBAL bit32
2583 tdsaDeviceInfoGetIoctl(
2584 tiRoot_t *tiRoot,
2585 tiIOCTLPayload_t *agIOCTLPayload,
2586 void *agParam1,
2587 void *agParam2,
2588 void *agParam3
2589 )
2590 {
2591 tdsaDeviceData_t *oneDeviceData = agNULL;
2592 tiDeviceHandle_t *tiDeviceHandle = agNULL;
2593 tdDeviceInfoPayload_t *pDeviceInfo = agNULL;
2594 /*agsaDevHandle_t *agDevHandle = agNULL;*/
2595 bit32 status = IOCTL_CALL_SUCCESS;
2596
2597 pDeviceInfo = (tdDeviceInfoPayload_t*)agIOCTLPayload->FunctionSpecificArea;
2598
2599 TI_DBG3(("tdsaDeviceInfoGetIoctl: %d:%3d:%d %p %p %p\n",
2600 (bit8)pDeviceInfo->PathId,
2601 (bit8)pDeviceInfo->TargetId,
2602 (bit8)pDeviceInfo->Lun,
2603 agParam1,
2604 agParam2,
2605 agParam3));
2606
2607 tiDeviceHandle = ostiMapToDevHandle(tiRoot,
2608 (bit8)pDeviceInfo->PathId,
2609 (bit8)pDeviceInfo->TargetId,
2610 (bit8)pDeviceInfo->Lun
2611 );
2612
2613 if (tiDeviceHandle == agNULL)
2614 {
2615 TI_DBG1(("tdsaDeviceInfoGetIoctl: tiDeviceHandle is NULL !!!! SCSI address = %d:%3d:%d\n",
2616 pDeviceInfo->PathId, pDeviceInfo->TargetId, pDeviceInfo->Lun));
2617 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INVALID_DEVICE;
2618 status = IOCTL_CALL_FAIL;
2619 return status;
2620 }
2621
2622 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2623 if(oneDeviceData == agNULL)
2624 {
2625 TI_DBG1(("tdsaDeviceInfoGetIoctl: tiDeviceHandle=%p DeviceData is NULL!!! SCSI address = %d:%3d:%d\n",
2626 tiDeviceHandle, pDeviceInfo->PathId, pDeviceInfo->TargetId, pDeviceInfo->Lun));
2627 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INVALID_DEVICE;
2628 status = IOCTL_CALL_FAIL;
2629 return status;
2630 }
2631
2632 /* for hotplug */
2633 if (oneDeviceData->valid != agTRUE || oneDeviceData->registered != agTRUE ||
2634 oneDeviceData->tdPortContext == agNULL )
2635 {
2636 TI_DBG1(("tdsaDeviceInfoGetIoctl: tiDeviceHandle=%p did %d DeviceData was removed!!! SCSI address = %d:%3d:%d\n",
2637 tiDeviceHandle, oneDeviceData->id, pDeviceInfo->PathId, pDeviceInfo->TargetId, pDeviceInfo->Lun));
2638 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INVALID_DEVICE;
2639 status = IOCTL_CALL_FAIL;
2640 return status;
2641 }
2642
2643 /* fill the device information in IOCTL payload */
2644 pDeviceInfo->devInfo.phyId = oneDeviceData->phyID;
2645 osti_memcpy(&pDeviceInfo->devInfo.sasAddressHi, oneDeviceData->agDeviceInfo.sasAddressHi, sizeof(bit32));
2646 osti_memcpy(&pDeviceInfo->devInfo.sasAddressLo, oneDeviceData->agDeviceInfo.sasAddressLo, sizeof(bit32));
2647
2648 pDeviceInfo->devInfo.sasAddressHi = DMA_BEBIT32_TO_BIT32(pDeviceInfo->devInfo.sasAddressHi);
2649 pDeviceInfo->devInfo.sasAddressLo = DMA_BEBIT32_TO_BIT32(pDeviceInfo->devInfo.sasAddressLo);
2650
2651 pDeviceInfo->devInfo.deviceType = (oneDeviceData->agDeviceInfo.devType_S_Rate & 0x30) >> 4;
2652 pDeviceInfo->devInfo.linkRate = oneDeviceData->agDeviceInfo.devType_S_Rate & 0x0F;
2653
2654 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
2655
2656 TI_DBG3(("tdsaDeviceInfoGetIoctl:IOCTL_CALL_SUCCESS\n"));
2657
2658 /*saGetDeviceInfo(agRoot, agNULL, 0, 0, agDevHandle);*/
2659
2660 status = IOCTL_CALL_SUCCESS;
2661
2662 return status;
2663 }
2664 /*****************************************************************************
2665 *
2666 * tdsaIoErrorStatisticGetIoctl
2667 *
2668 * Purpose: This routine is called to get the IO error statistic.
2669 *
2670 * Parameters:
2671 * tiRoot: Pointer to driver instance
2672 * agIOCTLPayload: Pointer to the IOCTL payload.
2673 * agParam1: Pointer to pass context handle for IOCTL DMA operation
2674 * agParam2: Pointer to pass context handle for IOCTL DMA operation
2675 * agParam3: Pointer to pass context handle for IOCTL DMA operation
2676 *
2677 * Return:
2678 *
2679 * IOCTL_CALL_SUCCESS The requested operation completed successfully.
2680 * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
2681 * Detail error code is function specific and
2682 * defined by the specific IOCTL function.
2683 * IOCTL_CALL_PENDING This request is asynchronous and completed
2684 * in some other context.
2685 * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
2686 *
2687 *
2688 *****************************************************************************/
2689 osGLOBAL bit32
2690 tdsaIoErrorStatisticGetIoctl(
2691 tiRoot_t *tiRoot,
2692 tiIOCTLPayload_t *agIOCTLPayload,
2693 void *agParam1,
2694 void *agParam2,
2695 void *agParam3
2696 )
2697 {
2698 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2699 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2700 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
2701 tdIoErrorStatisticPayload_t *pIoErrorPayload = agNULL;
2702 bit32 status = IOCTL_CALL_SUCCESS;
2703
2704 pIoErrorPayload = (tdIoErrorStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
2705
2706 tdsaAllShared->tdFWControlEx.buffer = agNULL;
2707 tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
2708 tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2709 tdsaAllShared->tdFWControlEx.len = 0;
2710 tdsaAllShared->tdFWControlEx.param1 = agParam1;
2711 tdsaAllShared->tdFWControlEx.param2 = agParam2;
2712 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2713 tdsaAllShared->tdFWControlEx.inProgress = 0;
2714
2715 saGetIOErrorStats(agRoot, agNULL, pIoErrorPayload->flag);
2716
2717 return status;
2718 }
2719
2720 /*****************************************************************************
2721 *
2722 * tdsaIoEventStatisticGetIoctl
2723 *
2724 * Purpose: This routine is called to get the IO event statistic.
2725 *
2726 * Parameters:
2727 * tiRoot: Pointer to driver instance
2728 * agIOCTLPayload: Pointer to the IOCTL payload.
2729 * agParam1: Pointer to pass context handle for IOCTL DMA operation
2730 * agParam2: Pointer to pass context handle for IOCTL DMA operation
2731 * agParam3: Pointer to pass context handle for IOCTL DMA operation
2732 *
2733 * Return:
2734 *
2735 * IOCTL_CALL_SUCCESS The requested operation completed successfully.
2736 * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
2737 * Detail error code is function specific and
2738 * defined by the specific IOCTL function.
2739 * IOCTL_CALL_PENDING This request is asynchronous and completed
2740 * in some other context.
2741 * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
2742 *
2743 *
2744 *****************************************************************************/
2745 osGLOBAL bit32
2746 tdsaIoEventStatisticGetIoctl(
2747 tiRoot_t *tiRoot,
2748 tiIOCTLPayload_t *agIOCTLPayload,
2749 void *agParam1,
2750 void *agParam2,
2751 void *agParam3
2752 )
2753 {
2754 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2755 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2756 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
2757 tdIoEventStatisticPayload_t *pIoEventPayload = agNULL;
2758 bit32 status = IOCTL_CALL_SUCCESS;
2759
2760 pIoEventPayload = (tdIoEventStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
2761
2762 tdsaAllShared->tdFWControlEx.buffer = agNULL;
2763 tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
2764 tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2765 tdsaAllShared->tdFWControlEx.len = 0;
2766 tdsaAllShared->tdFWControlEx.param1 = agParam1;
2767 tdsaAllShared->tdFWControlEx.param2 = agParam2;
2768 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2769 tdsaAllShared->tdFWControlEx.inProgress = 0;
2770
2771 saGetIOEventStats(agRoot, agNULL, pIoEventPayload->flag);
2772
2773 return status;
2774 }
2775
2776 /*****************************************************************************
2777 *
2778 * tdsaRegisterIoctl
2779 *
2780 * Purpose: This routine is called to get Forensic Data.
2781 *
2782 * Parameters:
2783 * tiRoot: Pointer to driver instance
2784 * agIOCTLPayload: Pointer to the IOCTL payload.
2785 * agParam1: Pointer to pass context handle for IOCTL DMA operation
2786 * agParam2: Pointer to pass context handle for IOCTL DMA operation
2787 * agParam3: Pointer to pass context handle for IOCTL DMA operation
2788 *
2789 * Return:
2790 *
2791 * IOCTL_CALL_SUCCESS The requested operation completed successfully.
2792 * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
2793 * Detail error code is function specific and
2794 * defined by the specific IOCTL function.
2795 * IOCTL_CALL_PENDING This request is asynchronous and completed
2796 * in some other context.
2797 * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
2798 *
2799 *
2800 *****************************************************************************/
2801 osGLOBAL bit32
2802 tdsaRegisterIoctl(
2803 tiRoot_t *tiRoot,
2804 tiIOCTLPayload_t *agIOCTLPayload,
2805 void *agParam1,
2806 void *agParam2,
2807 void *agParam3
2808 )
2809 {
2810 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2811 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2812 // agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
2813 tdRegisterPayload_t *pRegisterPayload = agNULL;
2814 bit32 status = IOCTL_CALL_SUCCESS;
2815
2816 pRegisterPayload = (tdRegisterPayload_t*)agIOCTLPayload->FunctionSpecificArea;
2817
2818 tdsaAllShared->tdFWControlEx.buffer = agNULL;
2819 tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
2820 tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2821 tdsaAllShared->tdFWControlEx.len = 0;
2822 tdsaAllShared->tdFWControlEx.param1 = agParam1;
2823 tdsaAllShared->tdFWControlEx.param2 = agParam2;
2824 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2825 tdsaAllShared->tdFWControlEx.inProgress = 0;
2826
2827 TI_DBG1(("tdsaRegisterIoctl: Flag %d RegAddr 0x%x RegValue 0x%x\n",
2828 pRegisterPayload->flag, pRegisterPayload->RegAddr, pRegisterPayload->RegValue));
2829
2830 if (pRegisterPayload->flag)
2831 {
2832 /* set register */
2833 ostiChipWriteBit32Ext(tiRoot, 0, pRegisterPayload->RegAddr, pRegisterPayload->RegValue);
2834 }
2835 else
2836 {
2837 /* get register */
2838 pRegisterPayload->RegValue = ostiChipReadBit32Ext(tiRoot, 0, pRegisterPayload->RegAddr);
2839 }
2840 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
2841 return status;
2842 }
2843
2844 osGLOBAL bit32
2845 tdsaGetPhyGeneralStatusIoctl(
2846 tiRoot_t *tiRoot,
2847 agsaPhyGeneralState_t *PhyData
2848 )
2849 {
2850 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2851 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2852 agsaRoot_t *agRoot = &(tdsaAllShared->agRootNonInt);
2853 // agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2854 // bit8 totalValidPhys;
2855 bit32 status = AGSA_RC_SUCCESS;
2856 bit32 i = 0;
2857 agsaControllerInfo_t ControllerInfo;
2858 saGetControllerInfo(agRoot,&ControllerInfo);
2859
2860 TI_DBG3(("tdsaGetPhyGeneralStatusIoctl: start\n"));
2861 do
2862 {
2863 if(tIsSPC(agRoot)||tIsSPCHIL(agRoot))
2864 {
2865 status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
2866 break;
2867 }
2868
2869 PhyData->Reserved1 = ControllerInfo.phyCount;
2870 for(i=0;i<PhyData->Reserved1;i++)
2871 {
2872 status = saGetPhyProfile( agRoot,agNULL,tdsaRotateQnumber(tiRoot, agNULL), AGSA_SAS_PHY_GENERAL_STATUS_PAGE,i);
2873 if(status == AGSA_RC_FAILURE)
2874 {
2875 break;
2876 }
2877 }
2878 }while(0);
2879 TI_DBG3(("tdsaGetPhyGeneralStatusIoctl: End\n"));
2880 return status;
2881 }
2882 /*****************************************************************************
2883 *
2884 * ostiGetPhyGeneralStatusRsp
2885 *
2886 * Purpose: This routine is called when a PhyStatus IOCTL response is received.
2887 *
2888 * Parameters:
2889 * tiRoot: Pointer to driver instance
2890 * agsaSASPhyGeneralStatusPage_t: Status of the phy.
2891 * bit32: phyID
2892 *
2893 * Return: none
2894 *
2895 *
2896 *****************************************************************************/
2897 osGLOBAL void ostiGetPhyGeneralStatusRsp(
2898 tiRoot_t *tiRoot,
2899 agsaSASPhyGeneralStatusPage_t *GenStatus,
2900 bit32 phyID
2901 )
2902 {
2903
2904 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2905 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2906 tiIOCTLPayload_t *agIoctlPayload = agNULL;
2907 agsaPhyGeneralState_t *pSetPhyStatusRes = agNULL;
2908
2909
2910 TI_DBG1(("ostiGetPhyGeneralStatusRsp: start\n"));
2911
2912 if (tdsaAllShared->tdFWControlEx.inProgress)
2913 {
2914 agIoctlPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
2915 if ((agIoctlPayload) && (PMC_IOCTL_SIGNATURE == agIoctlPayload->Signature)&&
2916 (IOCTL_MJ_PHY_GENERAL_STATUS == agIoctlPayload->MajorFunction))
2917 {
2918 pSetPhyStatusRes = (agsaPhyGeneralState_t*) &agIoctlPayload->FunctionSpecificArea[0];
2919 osti_memcpy(&pSetPhyStatusRes->PhyGenData[phyID], GenStatus, sizeof(agsaSASPhyGeneralStatusPage_t));
2920 pSetPhyStatusRes->Reserved2++;
2921 if(pSetPhyStatusRes->Reserved1 == pSetPhyStatusRes->Reserved2)
2922 {
2923 tdsaAllShared->tdFWControlEx.payload = NULL;
2924 ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
2925 tdsaAllShared->tdFWControlEx.param2, agNULL);
2926 tdsaAllShared->tdFWControlEx.inProgress = 0;
2927 agIoctlPayload->Status = IOCTL_ERR_STATUS_OK;
2928
2929 }
2930 }
2931 }
2932
2933 TI_DBG1(("ostiGetPhyGeneralStatusRsp: end\n"));
2934 }
2935
2936
2937 osGLOBAL bit32
2938 tdsaPhyProfileIoctl(
2939 tiRoot_t *tiRoot,
2940 tiIOCTLPayload_t *agIOCTLPayload,
2941 void *agParam1,
2942 void *agParam2,
2943 void *agParam3
2944 )
2945 {
2946 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2947 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2948 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
2949 void *buffer = agNULL;
2950 void *osMemHandle = agNULL;
2951 bit32 status = IOCTL_CALL_SUCCESS;
2952 bit32 retcode = AGSA_RC_FAILURE;
2953 bit32 RequestLength= agIOCTLPayload->Length;
2954 bit32 bufAddrUpper = 0;
2955 bit32 bufAddrLower = 0;
2956
2957 tdPhyCount_t *PhyBlob = (tdPhyCount_t*)&agIOCTLPayload->FunctionSpecificArea[0];
2958
2959
2960 if(ostiAllocMemory( tiRoot,
2961 &osMemHandle,
2962 (void **)&buffer,
2963 &bufAddrUpper,
2964 &bufAddrLower,
2965 RequestLength,
2966 RequestLength,
2967 agTRUE))
2968 return IOCTL_CALL_FAIL;
2969
2970
2971 tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2972 tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2973 tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2974 tdsaAllShared->tdFWControlEx.len = 32;
2975 tdsaAllShared->tdFWControlEx.param1 = agParam1;
2976 tdsaAllShared->tdFWControlEx.param2 = agParam2;
2977 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2978 tdsaAllShared->tdFWControlEx.inProgress = 1;
2979
2980 TI_DBG1(("tdsaPhyProfileIoctl: MinorFunction %d\n",agIOCTLPayload->MinorFunction));
2981 // PhyBlob->Phy |= 0x100;
2982
2983 if( tiIS_SPC(agRoot) )
2984 {
2985 TI_DBG1(("tdsaPhyProfileIoctl: SPC operation 0x%x PHY %d\n",agIOCTLPayload->MinorFunction,PhyBlob->Phy));
2986 retcode = saLocalPhyControl(agRoot,agNULL,0 ,PhyBlob->Phy ,agIOCTLPayload->MinorFunction , agNULL);
2987 if(retcode == AGSA_RC_SUCCESS)
2988 {
2989 status = IOCTL_CALL_PENDING;
2990 }
2991 }
2992 else
2993 {
2994 TI_DBG1(("tdsaPhyProfileIoctl: SPCv operation 0x%x PHY %d\n",agIOCTLPayload->MinorFunction,PhyBlob->Phy));
2995 retcode = saGetPhyProfile( agRoot,agNULL,0,agIOCTLPayload->MinorFunction , PhyBlob->Phy);
2996
2997 if(retcode == AGSA_RC_SUCCESS)
2998 {
2999 status = IOCTL_CALL_PENDING;
3000 }
3001
3002 }
3003
3004 TI_DBG2(("tdsaPhyProfileIoctl: after\n"));
3005
3006
3007 return status;
3008 }
3009
3010 /*****************************************************************************
3011 *
3012 * tdsaForensicDataGetIoctl
3013 *
3014 * Purpose: This routine is called to get Forensic Data.
3015 *
3016 * Parameters:
3017 * tiRoot: Pointer to driver instance
3018 * agIOCTLPayload: Pointer to the IOCTL payload.
3019 * agParam1: Pointer to pass context handle for IOCTL DMA operation
3020 * agParam2: Pointer to pass context handle for IOCTL DMA operation
3021 * agParam3: Pointer to pass context handle for IOCTL DMA operation
3022 *
3023 * Return:
3024 *
3025 * IOCTL_CALL_SUCCESS The requested operation completed successfully.
3026 * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
3027 * Detail error code is function specific and
3028 * defined by the specific IOCTL function.
3029 * IOCTL_CALL_PENDING This request is asynchronous and completed
3030 * in some other context.
3031 * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
3032 *
3033 *
3034 *****************************************************************************/
3035 osGLOBAL bit32
3036 tdsaForensicDataGetIoctl(
3037 tiRoot_t *tiRoot,
3038 tiIOCTLPayload_t *agIOCTLPayload,
3039 void *agParam1,
3040 void *agParam2,
3041 void *agParam3
3042 )
3043 {
3044 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3045 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3046 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
3047 tdForensicDataPayload_t *pForensicDataPayload = agNULL;
3048 agsaForensicData_t ForensicData;
3049 bit32 status = IOCTL_CALL_SUCCESS;
3050
3051 pForensicDataPayload = (tdForensicDataPayload_t*)agIOCTLPayload->FunctionSpecificArea;
3052
3053 tdsaAllShared->tdFWControlEx.buffer = agNULL;
3054 tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
3055 tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
3056 tdsaAllShared->tdFWControlEx.len = 0;
3057 tdsaAllShared->tdFWControlEx.param1 = agParam1;
3058 tdsaAllShared->tdFWControlEx.param2 = agParam2;
3059 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
3060 tdsaAllShared->tdFWControlEx.inProgress = 0;
3061
3062 osti_memset(&ForensicData, 0, sizeof(agsaForensicData_t));
3063
3064 ForensicData.DataType = pForensicDataPayload->DataType;
3065
3066 switch (ForensicData.DataType)
3067 {
3068 case FORENSIC_DATA_TYPE_NON_FATAL:
3069 case FORENSIC_DATA_TYPE_FATAL:
3070 ForensicData.BufferType.dataBuf.directLen = pForensicDataPayload->dataBuffer.directLen;
3071 ForensicData.BufferType.dataBuf.directOffset = pForensicDataPayload->dataBuffer.directOffset;
3072 ForensicData.BufferType.dataBuf.readLen = pForensicDataPayload->dataBuffer.readLen;
3073 ForensicData.BufferType.dataBuf.directData = (void*)pForensicDataPayload->dataBuffer.directData;
3074 break;
3075 case FORENSIC_DATA_TYPE_GSM_SPACE:
3076 ForensicData.BufferType.gsmBuf.directLen = pForensicDataPayload->gsmBuffer.directLen;
3077 ForensicData.BufferType.gsmBuf.directOffset = pForensicDataPayload->gsmBuffer.directOffset;
3078 ForensicData.BufferType.dataBuf.readLen = pForensicDataPayload->gsmBuffer.readLen;
3079 ForensicData.BufferType.gsmBuf.directData = (void*)pForensicDataPayload->gsmBuffer.directData;
3080 break;
3081
3082 case FORENSIC_DATA_TYPE_IB_QUEUE:
3083 ForensicData.BufferType.queueBuf.directLen = pForensicDataPayload->queueBuffer.directLen;
3084 //ForensicData.BufferType.queueBuf.queueType = pForensicDataPayload->queueBuffer.queueType;
3085 ForensicData.BufferType.queueBuf.queueType = FORENSIC_DATA_TYPE_IB_QUEUE;
3086 ForensicData.BufferType.queueBuf.queueIndex = pForensicDataPayload->queueBuffer.queueIndex;
3087 ForensicData.BufferType.queueBuf.directData = (void*)pForensicDataPayload->queueBuffer.directData;
3088 break;
3089 case FORENSIC_DATA_TYPE_OB_QUEUE:
3090 ForensicData.BufferType.queueBuf.directLen = pForensicDataPayload->queueBuffer.directLen;
3091 ForensicData.BufferType.queueBuf.queueType = FORENSIC_DATA_TYPE_OB_QUEUE;
3092 ForensicData.BufferType.queueBuf.queueIndex = pForensicDataPayload->queueBuffer.queueIndex;
3093 ForensicData.BufferType.queueBuf.directData = (void*)pForensicDataPayload->queueBuffer.directData;
3094 break;
3095
3096 default:
3097 TI_DBG1(("tdsaGetForensicDataIoctl: forensic data type error %d\n", pForensicDataPayload->DataType));
3098 status = IOCTL_CALL_INVALID_CODE;
3099 return status;
3100 }
3101
3102 if ( saGetForensicData(agRoot, agNULL, &ForensicData) != AGSA_RC_SUCCESS )
3103 {
3104 status = IOCTL_CALL_FAIL;
3105 }
3106
3107 return status;
3108 }
3109
3110 osGLOBAL bit32
3111 tdsaSendSMPIoctl(
3112 tiRoot_t *tiRoot,
3113 tiIOCTLPayload_t *agIOCTLPayload,
3114 void *agParam1,
3115 void *agParam2,
3116 void *agParam3
3117 )
3118 {
3119 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3120 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3121 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
3122 void *reqBuffer = agNULL;
3123 void *respBuffer = agNULL;
3124 void *osMemHandle = agNULL;
3125 bit32 status = IOCTL_CALL_SUCCESS;
3126 // bit32 Offset = 0;
3127 // bit32 RequestLength = 0;
3128 bit32 ostiMemoryStatus = 0;
3129 smp_pass_through_req_t *smp_pass_through_req;
3130
3131 tiDeviceHandle_t *devHandle;
3132 agsaSMPFrame_t agSMPFrame;
3133 tdsaDeviceData_t *oneDeviceData = agNULL;
3134 bit32 i;
3135
3136 TI_DBG2(("tdsaSendSMPIoctl: start\n"));
3137
3138 smp_pass_through_req = (smp_pass_through_req_t*)agIOCTLPayload->FunctionSpecificArea;
3139
3140 for(i=0;i<8;i++)
3141 TI_DBG2(("SAS Address[%d]:%x",i,smp_pass_through_req->exp_sas_addr[i]));
3142 TI_DBG2(("SAS Request Length:%d",smp_pass_through_req->smp_req_len));
3143 TI_DBG2(("SAS Response Length:%d",smp_pass_through_req->smp_resp_len));
3144 for(i=0;i<smp_pass_through_req->smp_req_len;i++)
3145 TI_DBG2(("SAS request + %d:%x",i,smp_pass_through_req->smp_req_resp[i]));
3146
3147 devHandle = ostiGetDevHandleFromSasAddr(tiRoot, smp_pass_through_req->exp_sas_addr);
3148 if(devHandle == NULL)
3149 {
3150 status = IOCTL_CALL_FAIL;
3151 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3152 return status;
3153 }
3154
3155
3156
3157 //agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
3158 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_RESPONDING;
3159
3160
3161
3162 if((ostiMemoryStatus != tiSuccess) && (reqBuffer == agNULL ))
3163 return IOCTL_CALL_FAIL;
3164
3165
3166 tdsaAllShared->tdFWControlEx.param3 = osMemHandle;
3167
3168
3169 agSMPFrame.outFrameBuf = smp_pass_through_req->smp_req_resp;
3170 agSMPFrame.expectedRespLen = smp_pass_through_req->smp_resp_len;
3171 agSMPFrame.inFrameLen = smp_pass_through_req->smp_resp_len - 4;
3172
3173 if(!(smp_pass_through_req->smp_req_len - 8) && !tiIS_SPC(agRoot))
3174 {
3175 agSMPFrame.flag = 1; // Direct request Indirect response
3176 agSMPFrame.outFrameLen = smp_pass_through_req->smp_req_len - 4; //Exclude header
3177 }
3178 else
3179 {
3180
3181 agSMPFrame.flag = 3; //Indirect request and Indirect response
3182 ostiMemoryStatus = ostiAllocMemory( tiRoot,
3183 &osMemHandle,
3184 (void **)&reqBuffer,
3185 &(agSMPFrame.outFrameAddrUpper32),
3186 &(agSMPFrame.outFrameAddrLower32),
3187 8,
3188 smp_pass_through_req->smp_req_len,
3189 agFALSE);
3190 tdsaAllShared->tdFWControlEx.param3 = osMemHandle;
3191 if(tiIS_SPC(agRoot))
3192 {
3193 agSMPFrame.outFrameLen = smp_pass_through_req->smp_req_len - 4; //Exclude crc
3194 osti_memcpy((void *)reqBuffer, (void *)(smp_pass_through_req->smp_req_resp), smp_pass_through_req->smp_req_len);
3195 }
3196 else
3197 {
3198 agSMPFrame.outFrameLen = smp_pass_through_req->smp_req_len - 8; //Exclude header and crc
3199 osti_memcpy((void *)reqBuffer, (void *)(smp_pass_through_req->smp_req_resp + 4), smp_pass_through_req->smp_req_len - 4);
3200 }
3201 }
3202
3203 ostiMemoryStatus = ostiAllocMemory( tiRoot,
3204 &osMemHandle,
3205 (void **)&respBuffer,
3206 &(agSMPFrame.inFrameAddrUpper32),
3207 &(agSMPFrame.inFrameAddrLower32),
3208 8,
3209 smp_pass_through_req->smp_resp_len + 4,
3210 agFALSE);
3211 if((ostiMemoryStatus != tiSuccess) && (respBuffer == agNULL ))
3212 return IOCTL_CALL_FAIL;
3213
3214
3215 osti_memset((void *)respBuffer, 0, smp_pass_through_req->smp_resp_len);
3216
3217 // use FW control place in shared structure to keep the neccesary information
3218 tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
3219 tdsaAllShared->tdFWControlEx.virtAddr = respBuffer;
3220 tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)smp_pass_through_req->smp_req_resp + smp_pass_through_req->smp_req_len;
3221 tdsaAllShared->tdFWControlEx.len = smp_pass_through_req->smp_resp_len;
3222 tdsaAllShared->tdFWControlEx.param1 = agParam1;
3223 tdsaAllShared->tdFWControlEx.param2 = agParam2;
3224 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
3225 tdsaAllShared->tdFWControlEx.inProgress = 1;
3226 status = IOCTL_CALL_PENDING;
3227
3228 oneDeviceData = (tdsaDeviceData_t *)devHandle->tdData;
3229 if(saSendSMPIoctl(agRoot, oneDeviceData->agDevHandle, 0, &agSMPFrame, &ossaSMPIoctlCompleted) != AGSA_RC_SUCCESS)
3230 {
3231 status = IOCTL_CALL_FAIL;
3232 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3233 }
3234 return status;
3235 }
3236
3237 osGLOBAL void ostiSendSMPIOCTLRsp(
3238 tiRoot_t *tiRoot,
3239 bit32 status
3240 )
3241 {
3242 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3243 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3244 tiIOCTLPayload_t *agIOCTLPayload;
3245
3246 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
3247 agIOCTLPayload->Status = (bit16)status;
3248
3249 TI_DBG1(("ostiSendSMPIOCTLRsp: start, status = %d\n", status));
3250
3251 // if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
3252 // {
3253 osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
3254 (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
3255 tdsaAllShared->tdFWControlEx.len);
3256 // }
3257 ostiFreeMemory(tiRoot,
3258 tdsaAllShared->tdFWControlEx.buffer,
3259 tdsaAllShared->tdFWControlEx.len);
3260 ostiFreeMemory(tiRoot,
3261 tdsaAllShared->tdFWControlEx.param3,
3262 tdsaAllShared->tdFWControlEx.len);
3263 //if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
3264 // {
3265 ostiIOCTLComplete(tiRoot,
3266 tdsaAllShared->tdFWControlEx.param1,
3267 tdsaAllShared->tdFWControlEx.param2,
3268 NULL);
3269 // }
3270 }
3271
3272
3273
3274
3275 /*****************************************************************************
3276 *
3277 * tdsaSendBISTIoctl
3278 *
3279 * Purpose: This routine is called to get Forensic Data.
3280 *
3281 * Parameters:
3282 * tiRoot: Pointer to driver instance
3283 * agIOCTLPayload: Pointer to the IOCTL payload.
3284 * agParam1: Pointer to pass context handle for IOCTL DMA operation
3285 * agParam2: Pointer to pass context handle for IOCTL DMA operation
3286 * agParam3: Pointer to pass context handle for IOCTL DMA operation
3287 *
3288 * Return:
3289 *
3290 * IOCTL_CALL_SUCCESS The requested operation completed successfully.
3291 * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
3292 * Detail error code is function specific and
3293 * defined by the specific IOCTL function.
3294 * IOCTL_CALL_PENDING This request is asynchronous and completed
3295 * in some other context.
3296 * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
3297 *
3298 *
3299 *****************************************************************************/
3300 osGLOBAL bit32
3301 tdsaSendBISTIoctl(
3302 tiRoot_t *tiRoot,
3303 tiIOCTLPayload_t *agIOCTLPayload,
3304 void *agParam1,
3305 void *agParam2,
3306 void *agParam3
3307 )
3308 {
3309 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3310 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3311 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
3312 tdBistPayload_t *pBistPayload;
3313 // bit32 length = 0;
3314 // bit32 status = IOCTL_CALL_SUCCESS;
3315 bit32 status = IOCTL_CALL_FAIL;
3316
3317 pBistPayload = (tdBistPayload_t*)agIOCTLPayload->FunctionSpecificArea;
3318
3319 tdsaAllShared->tdFWControlEx.buffer = agNULL;
3320 tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
3321 tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
3322 tdsaAllShared->tdFWControlEx.len = 0;
3323 tdsaAllShared->tdFWControlEx.param1 = agParam1;
3324 tdsaAllShared->tdFWControlEx.param2 = agParam2;
3325 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
3326 tdsaAllShared->tdFWControlEx.inProgress = 0;
3327
3328 TI_DBG1(("tdsaSendBISTIoctl: Type %d Length %d Data %p\n",
3329 pBistPayload->testType,
3330 pBistPayload->testLength,
3331 pBistPayload->testData ));
3332
3333
3334 // pBistPayload->testtype = AGSA_BIST_TEST;
3335
3336 if( pBistPayload->testType == AGSA_BIST_TEST)
3337 {
3338 if( pBistPayload->testLength != sizeof(agsaEncryptSelfTestBitMap_t))
3339 {
3340 return status;
3341 }
3342 }
3343 else if( pBistPayload->testType == AGSA_SHA_TEST)
3344 {
3345 if( pBistPayload->testLength != sizeof(agsaEncryptSHATestDescriptor_t) )
3346 {
3347 return status;
3348 }
3349 }
3350 else if( pBistPayload->testType == AGSA_HMAC_TEST )
3351 {
3352 if( pBistPayload->testLength != sizeof(agsaEncryptHMACTestDescriptor_t))
3353 {
3354 return status;
3355 }
3356 }
3357
3358 /*
3359 GLOBAL bit32 saEncryptSelftestExecute(
3360 agsaRoot_t *agRoot,
3361 agsaContext_t *agContext,
3362 bit32 queueNum,
3363 bit32 type,
3364 bit32 length,
3365 void *TestDescriptor);
3366
3367 */
3368 if ( saEncryptSelftestExecute(agRoot,
3369 agNULL,
3370 0,
3371 pBistPayload->testType,
3372 pBistPayload->testLength,
3373 pBistPayload->testData ) != AGSA_RC_SUCCESS )
3374 {
3375 status = IOCTL_CALL_FAIL;
3376 }
3377
3378 return status;
3379 }
3380
3381
3382 osGLOBAL bit32
3383 tdsaSendTMFIoctl( tiRoot_t *tiRoot,
3384 tiIOCTLPayload_t *agIOCTLPayload,
3385 void *agParam1,
3386 void *agParam2,
3387 unsigned long resetType
3388 )
3389 {
3390 bit32 status;
3391 tmf_pass_through_req_t *tmf_req = (tmf_pass_through_req_t*)agIOCTLPayload->FunctionSpecificArea;
3392 #if !(defined(__FreeBSD__))
3393 status = ostiSendResetDeviceIoctl(tiRoot, agParam2, tmf_req->pathId, tmf_req->targetId, tmf_req->lun, resetType);
3394 #endif
3395 TI_DBG3(("Status returned from ostiSendResetDeviceIoctl is %d\n",status));
3396 if(status != IOCTL_CALL_SUCCESS)
3397 {
3398 agIOCTLPayload->Status = status;
3399 return status;
3400 }
3401 status = IOCTL_CALL_SUCCESS;
3402 return status;
3403 }
3404
3405
3406 #ifdef VPD_TESTING
3407 /* temporary to test saSetVPDCommand() and saGetVPDCommand */
3408 osGLOBAL bit32
3409 tdsaVPDSet(
3410 tiRoot_t *tiRoot
3411 )
3412 {
3413 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3414 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3415 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
3416 bit32 status = IOCTL_CALL_SUCCESS;
3417 agsaVPD_t VPDInfo;
3418 bit32 ret = AGSA_RC_SUCCESS;
3419
3420 bit32 bufAddrUpper = 0;
3421 bit32 bufAddrLower = 0;
3422 tdVPDControl_t *VPDControl;
3423
3424 void *osMemHandle = agNULL;
3425 void *buffer;
3426 bit32 timeCount=0;
3427 bit8 ioctlErr=0;
3428 bit8 VPDPayload[32];
3429 bit8 i;
3430 TI_DBG2(("tdsaVPDSet: start\n"));
3431
3432 for(i=0;i<sizeof(VPDPayload);i++)
3433 {
3434 VPDPayload[i] = i;
3435 }
3436 if(ostiAllocMemory( tiRoot,
3437 &osMemHandle,
3438 (void **)&buffer,
3439 &bufAddrUpper,
3440 &bufAddrLower,
3441 8,
3442 sizeof(VPDPayload),
3443 agFALSE))
3444 {
3445 return tiError;
3446 }
3447 osti_memcpy((void *)buffer,
3448 VPDPayload,
3449 sizeof(VPDPayload));
3450
3451
3452 osti_memset(&VPDInfo, 0, sizeof(agsaVPD_t));
3453 #ifdef NOT_YET /* direct mode worked */
3454 /* For now, only direct mode */
3455 VPDInfo.indirectMode = 0; /* direct mode */
3456 VPDInfo.VPDDevice = 1; /* SEEPROM-1 */
3457 VPDInfo.directLen = (bit8)sizeof(VPDPayload);
3458 VPDInfo.VPDOffset = 0;
3459 VPDInfo.directData = buffer;
3460 VPDInfo.indirectAddrUpper32 = bufAddrUpper;
3461 VPDInfo.indirectAddrLower32 = bufAddrLower;
3462 VPDInfo.indirectLen = sizeof(VPDPayload);
3463 #endif
3464
3465 /* indirect mode */
3466 VPDInfo.indirectMode = 1; /* indirect mode */
3467 VPDInfo.VPDDevice = 1; /* SEEPROM-1 */
3468 VPDInfo.directLen = 0;
3469 VPDInfo.VPDOffset = 0;
3470 VPDInfo.directData = agNULL;
3471 VPDInfo.indirectAddrUpper32 = bufAddrUpper;
3472 VPDInfo.indirectAddrLower32 = bufAddrLower;
3473 VPDInfo.indirectLen = sizeof(VPDPayload);
3474
3475 tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
3476 tdsaAllShared->tdFWControlEx.param1 = agParam1;
3477 tdsaAllShared->tdFWControlEx.param2 = agParam2;
3478
3479 /* for testing only */
3480 tdsaAllShared->addrUpper = bufAddrUpper;
3481 tdsaAllShared->addrLower = bufAddrLower;
3482
3483 ret = saSetVPDCommand(agRoot, agNULL, 0, &VPDInfo);
3484
3485 if (ret == AGSA_RC_SUCCESS)
3486 {
3487 status = tiSuccess;
3488 }
3489 else
3490 {
3491 status = tiError;
3492 }
3493
3494 ostiFreeMemory(tiRoot, osMemHandle, sizeof(VPDPayload));
3495 return status;
3496 }
3497
3498 /* temporary to test saSetVPDCommand() and saGetVPDCommand */
3499 osGLOBAL bit32
3500 tdsaVPDGet(tiRoot_t *tiRoot)
3501 {
3502 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3503 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3504 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
3505 bit32 status = IOCTL_CALL_SUCCESS;
3506 agsaVPD_t VPDInfo;
3507 bit32 ret = AGSA_RC_SUCCESS;
3508
3509
3510 TI_DBG2(("tdsaVPDGet: start\n"));
3511
3512 osti_memset(&VPDInfo, 0, sizeof(agsaVPD_t));
3513
3514 /* direct mode worked */
3515 VPDInfo.indirectMode = 0; /* direct mode */
3516 VPDInfo.VPDDevice = 1; /* SEEPROM-1*/
3517 VPDInfo.directLen = 32;
3518 VPDInfo.VPDOffset = 0;
3519 VPDInfo.directData = agNULL;
3520 VPDInfo.indirectAddrUpper32 = 0;
3521 VPDInfo.indirectAddrLower32 = 0;
3522 VPDInfo.indirectLen = 0;
3523
3524
3525 #ifdef NOT_YET /* worked; can't read VPD in ossaGetVPDResponseCB() because of indirect */
3526 VPDInfo.indirectMode = 1; /* direct mode */
3527 VPDInfo.VPDDevice = 1; /* SEEPROM-1*/
3528 VPDInfo.directLen = 0;
3529 VPDInfo.VPDOffset = 0;
3530 VPDInfo.directData = agNULL;
3531 VPDInfo.indirectAddrUpper32 = tdsaAllShared->addrUpper;
3532 VPDInfo.indirectAddrLower32 = tdsaAllShared->addrLower;
3533 VPDInfo.indirectLen = 32;
3534 #endif
3535 ret = saGetVPDCommand(agRoot, agNULL, 0, &VPDInfo);
3536
3537 if (ret == AGSA_RC_SUCCESS)
3538 {
3539 status = tiSuccess;
3540 }
3541 else
3542 {
3543 status = tiError;
3544 }
3545 return status;
3546 }
3547 #endif
3548 /*****************************************************************************
3549 *
3550 * tdsaGetNumOfLUNIOCTL
3551 *
3552 * Purpose: This routine is called to send Report LUN SSP command request.
3553 *
3554 * Parameters:
3555 * tiRoot: Pointer to driver instance
3556 * tiIOCTLPayload_t: Status of the Controller Reset.
3557 * agParam1: Void pointer to device extension
3558 * agParam2: Void pointer to SRB
3559 * agParam3: NULL
3560 *
3561 * Return: status
3562 *
3563 *
3564 *****************************************************************************/
3565 osGLOBAL bit32
3566 tdsaGetNumOfLUNIOCTL(
3567 tiRoot_t *tiRoot,
3568 tiIOCTLPayload_t *agIOCTLPayload,
3569 void *agParam1,
3570 void *agParam2,
3571 void *agParam3
3572 )
3573 {
3574 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3575 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3576 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
3577 tdDeviceLUNInfoIOCTL_t *pDeviceLUNInfo = agNULL;
3578 tiDeviceHandle_t *devHandle = agNULL;
3579 void *tiRequestBody = agNULL;
3580 tiIORequest_t *tiIORequest = agNULL;
3581 bit32 status = IOCTL_CALL_SUCCESS;
3582
3583 TI_DBG2(("tdsaGetNumOfLUNIOCTL: Start\n"));
3584 do
3585 {
3586 pDeviceLUNInfo = (tdDeviceLUNInfoIOCTL_t*)agIOCTLPayload->FunctionSpecificArea;
3587
3588 if (agIOCTLPayload->Length < sizeof(tdDeviceLUNInfoIOCTL_t))
3589 {
3590 status = IOCTL_CALL_FAIL;
3591 break;
3592 }
3593 if(!pDeviceLUNInfo->tiDeviceHandle)
3594 {
3595 status = IOCTL_CALL_FAIL;
3596 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3597 break;
3598 }
3599 devHandle = (tiDeviceHandle_t*)pDeviceLUNInfo->tiDeviceHandle;
3600 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
3601
3602 status = ostiNumOfLUNIOCTLreq(tiRoot,agParam1,agParam2,&tiRequestBody,&tiIORequest);
3603
3604
3605 if(status != AGSA_RC_SUCCESS)
3606 {
3607 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3608 break;
3609 }
3610 status = tiNumOfLunIOCTLreq(tiRoot,tiIORequest,devHandle,tiRequestBody,agIOCTLPayload,agParam1,agParam2);
3611
3612 if(status != AGSA_RC_SUCCESS)
3613 {
3614 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3615 break;
3616 }
3617 // ostiIOCTLWaitForSignal (tiRoot, agParam1, agParam2, agParam3);
3618
3619 }while(0);
3620 TI_DBG2(("tdsaGetNumOfLUNIOCTL: End\n"));
3621 return status;
3622 }
3623
3624
3625 /*****************************************************************************
3626 *
3627 * ostiNumOfLUNIOCTLRsp
3628 *
3629 * Purpose: This routine is called when a Report LUN SSP command response id recieved.
3630 *
3631 * Parameters:
3632 * tiRoot: Pointer to driver instance
3633 * bit32 status
3634 *
3635 * Return: none
3636 *
3637 *
3638 *****************************************************************************/
3639 osGLOBAL void ostiNumOfLUNIOCTLRsp(
3640 tiRoot_t *tiRoot,
3641 bit32 status
3642 )
3643 {
3644 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3645 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3646 tiIOCTLPayload_t *agIOCTLPayload;
3647 tdDeviceLUNInfoIOCTL_t *pDeviceLUNInfo = NULL;
3648 bit32 count = 0;
3649 bit32 numOfLUN =0;
3650
3651 TI_DBG1(("ostiNumOfLUNIOCTLRsp: start, status = %d\n", status));
3652
3653 if(tdsaAllShared->tdFWControlEx.inProgress == 1)
3654 {
3655 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
3656 if ((agIOCTLPayload) && (PMC_IOCTL_SIGNATURE == agIOCTLPayload->Signature)&&
3657 (IOCTL_MJ_GET_DEVICE_LUN == agIOCTLPayload->MajorFunction))
3658 {
3659 agIOCTLPayload->Status = (bit16)status;
3660 pDeviceLUNInfo = (tdDeviceLUNInfoIOCTL_t*)agIOCTLPayload->FunctionSpecificArea;
3661 numOfLUN = ((tdsaAllShared->tdFWControlEx.virtAddr[0] << 24)|(tdsaAllShared->tdFWControlEx.virtAddr[1] << 16)|\
3662 (tdsaAllShared->tdFWControlEx.virtAddr[2] << 8)|(tdsaAllShared->tdFWControlEx.virtAddr[3]));
3663 numOfLUN = numOfLUN/8;
3664 pDeviceLUNInfo->numOfLun = numOfLUN;
3665 // ostiFreeMemory(tiRoot,
3666 // tdsaAllShared->tdFWControlEx.virtAddr,
3667 // tdsaAllShared->tdFWControlEx.len);
3668 // if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
3669 // {
3670 ostiIOCTLSetSignal(tiRoot,
3671 tdsaAllShared->tdFWControlEx.param1,
3672 tdsaAllShared->tdFWControlEx.param2,
3673 NULL);
3674 tdsaAllShared->tdFWControlEx.payload = NULL;
3675 // }
3676
3677 tdsaAllShared->tdFWControlEx.inProgress = 0;
3678 }
3679 }
3680 TI_DBG1(("ostiNumOfLUNIOCTLRsp: End\n"));
3681 }
3682
Cache object: 149e06708a1358f759c3bfc4ae88192e
|