1 /*******************************************************************************
2 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
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
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.
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
21 ********************************************************************************/
22 /*******************************************************************************/
26 * This file contains Management IOCTL APIs
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31 #include <dev/pms/config.h>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
86 #define agFieldOffset(baseType,fieldName) \
88 ((bit32)((bitptr)(&(((baseType *)0)->fieldName)))) \
91 osGLOBAL bit32 tdLlApiTestIoctl(tiRoot_t *tiRoot,
92 tiIOCTLPayload_t *agIOCTLPayload,
96 #endif /* SA_LL_API_TEST */
99 extern bit32 volatile sgpioResponseSet;
101 #ifdef SPC_ENABLE_PROFILE
102 /*****************************************************************************
106 * Purpose: This routine is called to process the FW Profile IOCTL function.
107 * This function is used for both target and initiator.
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
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.
125 *****************************************************************************/
126 osGLOBAL bit32 tdipFWProfileIoctl(
128 tiIOCTLPayload_t *agIOCTLPayload,
135 bit32 status = IOCTL_CALL_SUCCESS;
136 bit32 bufAddrUpper = 0;
137 bit32 bufAddrLower = 0;
138 tdFWProfile_t *fwProfile;
140 void *osMemHandle = agNULL;
141 void *buffer = agNULL;
142 agsaFwProfile_t fwProfileInfo = {0};
144 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
145 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
146 agsaRoot_t *agRoot = &tdsaAllShared->agRootInt;
148 fwProfile = (tdFWProfile_t *)&agIOCTLPayload->FunctionSpecificArea[0];
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)
157 fwProfileInfo.codeStartAdd = fwProfile->codeStartAdd;
158 fwProfileInfo.codeEndAdd = fwProfile->codeEndAdd;
160 if((fwProfile->cmd == STOP_TIMER_PROFILE) || (fwProfile->cmd == STOP_CODE_PROFILE))
162 if(fwProfile->len != 0)
164 if(ostiAllocMemory( tiRoot,
173 return IOCTL_CALL_FAIL;
175 osti_memset((void *)buffer, 0, fwProfile->len);
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;
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,
197 if((fwProfile->cmd == STOP_TIMER_PROFILE) || (fwProfile->cmd == STOP_CODE_PROFILE))
198 ostiFreeMemory(tiRoot, osMemHandle, fwProfile->len);
199 status = IOCTL_CALL_FAIL;
202 status = IOCTL_CALL_PENDING;
209 /*****************************************************************************
213 * Purpose: This routine is called to process the FW control IOCTL function.
214 * This function is used for both target and initiator.
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
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.
234 *****************************************************************************/
235 osGLOBAL bit32 tdipFWControlIoctl(
237 tiIOCTLPayload_t *agIOCTLPayload,
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;
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;
261 fwControl = (tdFWControl_t *)&agIOCTLPayload->FunctionSpecificArea[0];
263 if(fwControl->len != 0)
265 if(ostiAllocMemory( tiRoot,
273 return IOCTL_CALL_FAIL;
275 osti_memset( (void *)buffer, 0, fwControl->len );
276 osti_memcpy( (void *)buffer,
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)
288 case IOCTL_MN_FW_DOWNLOAD_DATA:
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,
302 status = IOCTL_CALL_FAIL;
303 fwControl->retcode = IOCTL_CALL_TIMEOUT;
306 status = IOCTL_CALL_PENDING;
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);
316 } /* end IOCTL switch */
318 } /* tdipFWControlIoctl */
321 /*****************************************************************************
325 * Purpose: This routine is a TISA API for processing the PMC specific
328 * Each IOCTL function is identified by the IOCTL header
329 * specified in the data payload as the following:
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.
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
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.
359 * Used ostiAllocMemory() OS layer callback function to allocate memory
360 * for DMA operaion. Then use ostiFreeMemory() to deallocate the memory.
362 *****************************************************************************/
366 tiIOCTLPayload_t *agIOCTLPayload,
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;
380 bit32 RequestLength = 0; /* user request on how much data to pass to application */
381 agsaContext_t *agContext = NULL;
384 TI_DBG3(("tiCOMMgntIOCTL: start\n"));
386 TI_DBG3(("tiCOMMgntIOCTL: tiRoot %p agIOCTLPayload %p agParam1 %p agParam2 %p agParam3 %p\n",
387 tiRoot,agIOCTLPayload,agParam1,agParam2,agParam3 ));
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] ));
398 /* PMC IOCTL signatures matched ? */
399 if(agIOCTLPayload->Signature != PMC_IOCTL_SIGNATURE)
401 TI_DBG1(("tiCOMMgntIOCTL:agIOCTLPayload->Signature %x IOCTL_CALL_INVALID_CODE\n",agIOCTLPayload->Signature ));
402 status = IOCTL_CALL_INVALID_CODE;
406 switch (agIOCTLPayload->MajorFunction)
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:
412 switch( agIOCTLPayload->MinorFunction )
414 case IOCTL_MN_CARD_GET_INTERRUPT_CONFIG:
416 agsaInterruptConfigPage_t *pInterruptConfig = (agsaInterruptConfigPage_t *)&agIOCTLPayload->FunctionSpecificArea[0];
417 status = saGetControllerConfig(agRoot,
419 AGSA_INTERRUPT_CONFIGURATION_PAGE,
420 pInterruptConfig->vectorMask0,
421 pInterruptConfig->vectorMask1,
423 if(status == AGSA_RC_SUCCESS) {
424 status = IOCTL_CALL_PENDING;
425 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
427 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
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;
437 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
443 #endif /* IOCTL_INTERRUPT_TIME_CONFIG */
444 case IOCTL_MJ_INI_DRIVER_IDENTIFY:
446 status=IOCTL_CALL_SUCCESS;
449 case IOCTL_MJ_GET_DEVICE_LUN:
450 status = tdsaGetNumOfLUNIOCTL(tiRoot,agIOCTLPayload, agParam1, agParam2, agParam3);
451 if(status == IOCTL_CALL_SUCCESS)
453 status = IOCTL_CALL_PENDING;
456 case IOCTL_MJ_SMP_REQUEST:
457 status = tdsaSendSMPIoctl(tiRoot, agIOCTLPayload,
458 agParam1,agParam2,agParam3);
461 case IOCTL_MJ_FW_CONTROL:
463 //ostiIOCTLClearSignal (tiRoot, &agParam1, &agParam2, &agParam3);
464 status = tdipFWControlIoctl( tiRoot, agIOCTLPayload,
465 agParam1, agParam2, agParam3);
469 //#ifdef EVENT_LOG_INFO_TESTING
470 /* Reserved field in tiIOCTLPayload_t is used as offset */
471 case IOCTL_MJ_GET_EVENT_LOG1:
473 switch (agIOCTLPayload->MinorFunction)
475 case IOCTL_MN_FW_GET_TRACE_BUFFER:
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)
486 TI_DBG1(("tiCOMMgntIOCTL: 1 out of range Requestlength %d Offset %d event log length %d\n", RequestLength, Offset, EventLogLength));
488 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
489 agIOCTLPayload->Length = 0;
490 if(EventLogOption == 0)
492 agIOCTLPayload->Status = IOCTL_ERR_FW_EVENTLOG_DISABLED;
494 status=IOCTL_CALL_SUCCESS;
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;
506 case IOCTL_MN_FW_GET_EVENT_FLASH_LOG1:
508 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MN_FW_GET_EVENT_FLASH_LOG1\n"));
509 status = tdsaRegDumpGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
516 case IOCTL_MJ_GET_EVENT_LOG2:
518 switch (agIOCTLPayload->MinorFunction)
520 case IOCTL_MN_FW_GET_TRACE_BUFFER:
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)
531 TI_DBG1(("tiCOMMgntIOCTL: 2 out of range Requestlength %d Offset %d event log length %d\n", RequestLength, Offset, EventLogLength));
533 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
534 agIOCTLPayload->Length = 0;
535 if(EventLogOption == 0)
537 agIOCTLPayload->Status = IOCTL_ERR_FW_EVENTLOG_DISABLED;
539 status=IOCTL_CALL_SUCCESS;
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;
551 case IOCTL_MN_FW_GET_EVENT_FLASH_LOG2:
553 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MN_FW_GET_EVENT_FLASH_LOG2\n"));
554 status = tdsaRegDumpGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
562 case IOCTL_MJ_FW_INFO:
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)
571 TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_FW_INFO: No more Data!\n"));
573 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
574 agIOCTLPayload->Length = 0;
575 status=IOCTL_CALL_SUCCESS;
579 osti_memcpy((bit8*)&(agIOCTLPayload->FunctionSpecificArea), (bit8*)&ControllerInfo, sizeof(agsaControllerInfo_t));
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;
590 case IOCTL_MJ_GET_FW_REV:
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)
599 TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_GET_FW_REV: No more Data!\n"));
601 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
602 agIOCTLPayload->Length = 0;
603 status=IOCTL_CALL_SUCCESS;
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));
611 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
612 status=IOCTL_CALL_SUCCESS;
617 #ifdef SPC_ENABLE_PROFILE
618 case IOCTL_MJ_FW_PROFILE:
620 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_FW_PROFILE\n"));
621 status = tdipFWProfileIoctl( tiRoot, agIOCTLPayload,
622 agParam1, agParam2, agParam3);
625 #endif /* SPC_ENABLE_PROFILE */
627 case IOCTL_MJ_GET_CORE_DUMP:
629 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GET_CORE_DUMP\n"));
630 if (tiIS_SPC(agRoot))
632 status = tdsaRegDumpGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
636 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
637 status = IOCTL_CALL_SUCCESS;
642 case IOCTL_MJ_NVMD_SET:
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);
655 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GPIO\n"));
657 /* Get Subsystem vendor */
658 sVid = ostiChipConfigReadBit32(tiRoot,0x2C);
659 sVid = sVid & 0xFFFF;
661 /* GPIO is only intended for chip down design
662 * therefore it's only applies to 8H/SPCv product family
665 return IOCTL_CALL_INVALID_DEVICE;
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 */
679 TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_SGPIO\n"));
680 status = tdsaSGpioIoctlSetup(tiRoot, agContext, agIOCTLPayload, agParam1, agParam2);
684 case IOCTL_MJ_NVMD_GET:
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);
694 case IOCTL_MJ_GET_FORENSIC_DATA:
696 TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_FORENSIC_DATA\n"));
697 status = tdsaForensicDataGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
700 case IOCTL_MJ_GET_DEVICE_INFO:
702 TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_DEVICE_INFO\n"));
703 status = tdsaDeviceInfoGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
707 case IOCTL_MJ_GET_IO_ERROR_STATISTIC:
709 TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_IO_ERROR_STATISTIC\n"));
710 status = tdsaIoErrorStatisticGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
714 case IOCTL_MJ_GET_IO_EVENT_STATISTIC:
716 TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_IO_EVENT_STATISTIC\n"));
717 status = tdsaIoEventStatisticGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
721 case IOCTL_MJ_SEND_BIST:
723 TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_SEND_BIST\n"));
724 status = tdsaSendBISTIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
729 case IOCTL_MJ_SET_OR_GET_REGISTER:
731 TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_SET_OR_GET_REGISTER\n"));
732 status = tdsaRegisterIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
737 case IOCTL_MJ_PHY_DETAILS:
739 PhyDetails_t *PhyDetails = (PhyDetails_t*)&agIOCTLPayload->FunctionSpecificArea;
740 agsaRoot_t *agRoot = &(tdsaAllShared->agRootNonInt);
741 agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
747 tiIniGetDirectSataSasAddr(tiRoot, i , &sasAddressHi, &sasAddressLo);
748 for( i = 0; i < saRoot->phyCount ; i++)
750 PhyDetails[i].attached_phy = saRoot->phys[i].sasIdentify.phyIdentifier;
753 * 0x01 - Sas end device
754 * 0x02 - Expander device
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
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;
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));
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));
776 // osti_memcpy(&agIoctlPayload->FunctionSpecificArea,&PhyInfo, sizeof(agsaSGpioReqResponse_t));
777 // printk("Ioctl success\n");
778 return IOCTL_CALL_SUCCESS;
781 case IOCTL_MJ_PHY_GENERAL_STATUS:
783 agsaPhyGeneralState_t *PhyData=NULL;
784 bit32 ret = AGSA_RC_FAILURE;
785 PhyData = (agsaPhyGeneralState_t*) &agIOCTLPayload->FunctionSpecificArea[0];
787 PhyData->Reserved2 = 0;
788 /* Validate the length */
789 if (agIOCTLPayload->Length < sizeof(agsaPhyGeneralState_t))
791 status = IOCTL_CALL_FAIL;
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;
801 ret = tdsaGetPhyGeneralStatusIoctl(tiRoot,PhyData);
802 if(ret == AGSA_RC_FAILURE)
804 status = IOCTL_CALL_FAIL;
805 tdsaAllShared->tdFWControlEx.payload = NULL;
806 tdsaAllShared->tdFWControlEx.inProgress = 0;
809 else if(ret == IOCTL_ERR_STATUS_NOT_SUPPORTED)
812 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
813 status = IOCTL_CALL_SUCCESS;
817 //status = IOCTL_CALL_PENDING;
818 status = IOCTL_CALL_PENDING;
823 case IOCTL_MJ_GET_PHY_PROFILE:
825 TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_GET_PHY_PROFILE %p %p %p\n",agParam1,agParam2,agParam3));
826 status = tdsaPhyProfileIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
830 case IOCTL_MJ_LL_TRACING:
832 void * stu = &agIOCTLPayload->FunctionSpecificArea[0];
833 switch(agIOCTLPayload->MinorFunction)
836 case IOCTL_MN_LL_RESET_TRACE_INDEX:
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"));
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;
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));
860 if( llist->Flag != 0)
862 if( llist->TraceMask != *BufferParms.pTraceMask)
864 smTraceSetMask(agRoot, llist->TraceMask );
870 *BufferParms.pCurrentTraceIndex = 0;
871 smResetTraceBuffer(agRoot);
873 *BufferParms.pCurrentTraceIndex = 0;
874 *BufferParms.pTraceIndexWrapCount =0;
875 llist->TraceMask = *BufferParms.pTraceMask;
877 #endif /* SA_ENABLE_TRACE_FUNCTIONS */
878 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
879 status = IOCTL_CALL_SUCCESS;
884 case IOCTL_MN_LL_GET_TRACE_BUFFER_INFO:
886 hpTraceBufferParms_t BufferParms;
887 TSTMTID_TRACE_BUFFER_INFO *llist = (TSTMTID_TRACE_BUFFER_INFO *)stu;
888 TI_DBG5(("tdReturnIOCTL_Info: hpIOCTL_GetTraceBufferInfo\n"));
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)
908 llist->TraceMask = *BufferParms.pTraceMask;
910 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
911 status = IOCTL_CALL_SUCCESS;
915 case IOCTL_MN_LL_GET_TRACE_BUFFER:
917 #ifdef SA_ENABLE_TRACE_FUNCTIONS
918 TSTMTID_TRACE_BUFFER_FETCH *llist = (TSTMTID_TRACE_BUFFER_FETCH *)stu;
920 hpTraceBufferParms_t BufferParms;
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);
931 TI_DBG6(("tdReturnIOCTL_Info: hpIOCTL_GetTraceBuffer\n"));
933 if(llist->LowFence != LowFence32Bits)
937 if(llist->HighFence != HighFence32Bits)
942 if(llist->BufferOffsetBegin + FetchBufferSIZE > BufferParms.BufferSize )
946 for ( c=0; c < FetchBufferSIZE;c++)
948 llist->Data[c] = *(BufferParms.pTrace+( c + llist->BufferOffsetBegin));
950 #endif /* SA_ENABLE_TRACE_FUNCTIONS not enabled */
952 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
953 status = IOCTL_CALL_SUCCESS;
959 #ifdef SA_LL_API_TEST
960 case IOCTL_MJ_LL_API_TEST:
962 status = tdLlApiTestIoctl( tiRoot, agIOCTLPayload,
963 agParam1,agParam2,agParam3 );
967 #endif /* SA_LL_API_TEST */
969 case IOCTL_MJ_MODE_CTL_PAGE:
971 /* The SPCv controller has some options accessed via mode pages */
972 tiEncryptDekConfigPage_t *pModePage= (tiEncryptDekConfigPage_t *) &agIOCTLPayload->FunctionSpecificArea[0];
973 bit32 pageLength = 0;
977 pageCode = pModePage->pageCode & 0xFF;
978 modeOperation = *(bit32 *) agParam2;
980 switch(modeOperation)
986 case TI_ENCRYPTION_DEK_CONFIG_PAGE:
987 pageLength = sizeof(tiEncryptDekConfigPage_t);
990 case TI_ENCRYPTION_CONTROL_PARM_PAGE:
991 pageLength = sizeof(tiEncryptControlParamPage_t);
994 case TI_ENCRYPTION_GENERAL_CONFIG_PAGE:
995 /* Pages are currently unsupported */
1000 status = saSetControllerConfig(agRoot, 0, pageCode, pageLength, pModePage, (agsaContext_t *)agIOCTLPayload);
1004 status = saGetControllerConfig(agRoot, 0, pageCode, 0, 0, (agsaContext_t *)agIOCTLPayload);
1008 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
1012 #ifdef PHY_RESTART_TEST
1013 case IOCTL_MJ_PORT_START:
1015 bit32 portID, tiStatus;
1016 bit32 *data = (bit32*) &agIOCTLPayload->FunctionSpecificArea[0];
1019 tiStatus = tiCOMPortStart(tiRoot, portID, tdsaAllShared->Ports[portID].tiPortalContext, 0);
1021 if (tiStatus == tiSuccess)
1023 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1027 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1029 status = IOCTL_CALL_SUCCESS;
1033 case IOCTL_MJ_PORT_STOP:
1035 bit32 portID, tiStatus;
1036 bit32 *data = (bit32*) &agIOCTLPayload->FunctionSpecificArea[0];
1039 tiStatus = tiCOMPortStop(tiRoot, tdsaAllShared->Ports[portID].tiPortalContext);
1040 if (tiStatus == tiSuccess)
1042 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1046 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1049 status = IOCTL_CALL_SUCCESS;
1053 case IOCTL_MJ_SEND_TMF:
1054 switch(agIOCTLPayload->MinorFunction)
1056 case IOCTL_MN_TMF_DEVICE_RESET:
1057 status = tdsaSendTMFIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, AG_TARGET_WARM_RESET);
1059 case IOCTL_MN_TMF_LUN_RESET:
1060 status = tdsaSendTMFIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, AG_LOGICAL_UNIT_RESET);
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;
1070 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
1078 /*****************************************************************************
1082 * Purpose: This routine is called to set Gpio parameters to the controller.
1085 * tiRoot: Pointer to driver instance
1087 * tiIOCTLPayload_t : ioctl header with payload gpio info
1088 * agParam1,agParam2 : Generic parameters
1093 *****************************************************************************/
1097 agsaContext_t *agContext,
1098 tiIOCTLPayload_t *agIOCTLPayload,
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;
1113 TI_DBG3(("tdsaGpioSetup: start\n"));
1115 if(tiRoot == agNULL || agIOCTLPayload == agNULL )
1116 return IOCTL_CALL_FAIL;
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;
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;
1129 switch (agIOCTLPayload->MinorFunction)
1132 case IOCTL_MN_GPIO_PINSETUP:
1134 TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_PINSETUP\n"));
1135 gpioPinSetupInfo =(agsaGpioPinSetupInfo_t *)&agIOCTLPayload->FunctionSpecificArea[0];
1136 status = saGpioPinSetup(agRoot, agContext, 0, gpioPinSetupInfo);
1140 case IOCTL_MN_GPIO_EVENTSETUP:
1142 TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_EVENTSETUP\n"));
1143 gpioEventSetupInfo = (agsaGpioEventSetupInfo_t *)&agIOCTLPayload->FunctionSpecificArea[0];
1144 status = saGpioEventSetup(agRoot, agContext, 0, gpioEventSetupInfo);
1149 case IOCTL_MN_GPIO_READ:
1151 TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_READ\n"));
1152 status = saGpioRead(agRoot, agContext, 0);
1157 case IOCTL_MN_GPIO_WRITE:
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);
1170 if(status != AGSA_RC_SUCCESS)
1172 status = IOCTL_CALL_FAIL;
1173 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1175 tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
1176 if (osIoctlTimer->timerRunning == agTRUE)
1178 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
1179 tdsaKillTimer(tiRoot, osIoctlTimer);
1182 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
1186 TI_DBG3(("tdsaGpioPinSetup: End\n"));
1192 /*****************************************************************************
1194 * ostiGetGpioIOCTLRsp
1196 * Purpose: This routine is called for Get Gpio IOCTL reaponse has been received.
1199 * tiRoot: Pointer to driver instance
1200 * payloadRsp: Pointer to the FW download IOMB's payload.
1205 *****************************************************************************/
1207 osGLOBAL void ostiGetGpioIOCTLRsp(
1210 bit32 gpioReadValue,
1211 agsaGpioPinSetupInfo_t *gpioPinSetupInfo,
1212 agsaGpioEventSetupInfo_t *gpioEventSetupInfo
1215 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1216 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1217 tiIOCTLPayload_t *agIoctlPayload ;
1218 agsaGpioReadInfo_t *gpioReadInfo;
1220 tdsaTimerRequest_t *osIoctlTimer;
1221 osIoctlTimer = (tdsaTimerRequest_t *)tdsaAllShared->tdFWControlEx.virtAddr;
1223 TI_DBG2(("ostiGetGpioIOCTLRsp: start, status = %d \n", status));
1225 agIoctlPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1227 if(agIoctlPayload == agNULL){
1231 agIoctlPayload->Status =(bit16) status;
1233 if( (status != IOCTL_CALL_TIMEOUT) && (osIoctlTimer != NULL))
1235 tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
1236 if (osIoctlTimer->timerRunning == agTRUE)
1238 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
1239 tdsaKillTimer(tiRoot, osIoctlTimer);
1242 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
1245 tdsaAllShared->tdFWControlEx.inProgress = 0;
1246 agIoctlPayload->Status = (bit16)status;
1247 ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
1248 tdsaAllShared->tdFWControlEx.param2, NULL);
1252 if(status == SUCCESS)
1253 TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response from OUTBuf"));
1255 tdsaAllShared->tdFWControlEx.inProgress = 0;
1256 ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
1257 tdsaAllShared->tdFWControlEx.param2, NULL);
1261 switch (agIoctlPayload->MinorFunction)
1264 case IOCTL_MN_GPIO_PINSETUP:
1266 TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response for IOCTL_MN_GPIO_PINSETUP"));
1270 case IOCTL_MN_GPIO_EVENTSETUP:
1272 TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response for IOCTL_MN_GPIO_EVENTSETUP"));
1277 case IOCTL_MN_GPIO_WRITE:
1279 TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response for IOCTL_MN_GPIO_WRITE"));
1284 case IOCTL_MN_GPIO_READ:
1286 gpioReadInfo = ( agsaGpioReadInfo_t *)tdsaAllShared->tdFWControlEx.usrAddr;
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 */
1304 if(tdsaAllShared->tdFWControlEx.inProgress)
1306 tdsaAllShared->tdFWControlEx.inProgress = 0;
1307 ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
1308 tdsaAllShared->tdFWControlEx.param2, NULL);
1310 TI_DBG2(("ostiGetGpioIOCTLRsp: end \n"));
1315 /*****************************************************************************
1317 * tdsaSGpioIoctlSetup
1319 * Purpose: This routine is called to send SGPIO request to the controller.
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
1330 *****************************************************************************/
1332 tdsaSGpioIoctlSetup(
1334 agsaContext_t *agContext,
1335 tiIOCTLPayload_t *agIOCTLPayload,
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];
1346 TI_DBG3(("tdsaSGpioIoctlSetup: start\n"));
1348 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1352 if (tiRoot == agNULL || agIOCTLPayload == agNULL)
1357 /* Validate the length */
1358 if (agIOCTLPayload->Length < sizeof(agsaSGpioReqResponse_t))
1360 TI_DBG3(("Invalid length\n"));
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))
1369 TI_DBG4(("Invalid Parameter\n"));
1373 /* Specific validation for configuration register type */
1374 if (AGSA_SGPIO_CONFIG_REG == pSGpioReq->registerType)
1376 if ((pSGpioReq->registerIndex > 0x01) || \
1377 ((0x00 == pSGpioReq->registerIndex) && (pSGpioReq->registerCount > 0x02)) || \
1378 ((0x01 == pSGpioReq->registerIndex) && (pSGpioReq->registerCount > 0x01)))
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;
1390 status = saSgpio(agRoot, agContext, 0, pSGpioReq);
1391 if (status != AGSA_RC_SUCCESS)
1396 status = IOCTL_CALL_PENDING;
1400 TI_DBG3(("tdsaGpioPinSetup: End\n"));
1404 /*****************************************************************************
1408 * Purpose: This routine is called when a SGPIO IOCTL response is received.
1411 * tiRoot: Pointer to driver instance
1412 * pSgpioResponse: Pointer to the SGPIO response
1417 *****************************************************************************/
1418 osGLOBAL void ostiSgpioIoctlRsp(
1420 agsaSGpioReqResponse_t *pSgpioResponse
1423 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1424 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1425 tiIOCTLPayload_t *agIoctlPayload = agNULL;
1427 TI_DBG3(("ostiSgpioIoctlRsp: start\n"));
1429 if (tdsaAllShared->tdFWControlEx.inProgress)
1431 agIoctlPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
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;
1439 tdsaAllShared->sgpioResponseSet = 1; //Sunitha:Check if needed?
1441 ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
1442 tdsaAllShared->tdFWControlEx.param2, agNULL);
1444 tdsaAllShared->tdFWControlEx.inProgress = 0;
1447 TI_DBG3(("ostiSgpioIoctlRsp: end\n"));
1449 /*****************************************************************************
1451 * ostiCOMMgntIOCTLRsp
1453 * Purpose: This routine is called when FW control IOCTL reaponse has been received.
1454 * This function is used for both target and initiator.
1457 * tiRoot: Pointer to driver instance
1458 * payloadRsp: Pointer to the FW download IOMB's payload.
1464 *****************************************************************************/
1466 osGLOBAL void ostiCOMMgntIOCTLRsp(
1471 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1472 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1474 TI_DBG1(("ostiCOMMgntIOCTLRsp: status 0x%x\n",status));
1475 (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
1477 ostiFreeMemory(tiRoot,
1478 tdsaAllShared->tdFWControlEx.buffer,
1479 tdsaAllShared->tdFWControlEx.tdFWControl->len);
1481 ostiIOCTLSetSignal(tiRoot,
1482 tdsaAllShared->tdFWControlEx.param1,
1483 tdsaAllShared->tdFWControlEx.param2,
1488 /*****************************************************************************
1490 * ostiRegDumpIOCTLRsp
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.
1496 * tiRoot: Pointer to driver instance
1497 * payloadRsp: Pointer to the FW download IOMB's payload.
1503 *****************************************************************************/
1505 osGLOBAL void ostiRegDumpIOCTLRsp(
1510 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1511 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
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);
1519 ostiFreeMemory(tiRoot,
1520 tdsaAllShared->tdFWControlEx.buffer,
1521 tdsaAllShared->tdFWControlEx.len);
1523 ostiIOCTLSetSignal(tiRoot,
1524 tdsaAllShared->tdFWControlEx.param1,
1525 tdsaAllShared->tdFWControlEx.param2,
1529 /*****************************************************************************
1531 * ostiSetNVMDIOCTLRsp
1533 * Purpose: This routine is called for Set NVMD IOCTL reaponse has been received.
1534 * This function is used for both target and initiator.
1537 * tiRoot: Pointer to driver instance
1538 * payloadRsp: Pointer to the FW download IOMB's payload.
1544 *****************************************************************************/
1546 osGLOBAL void ostiSetNVMDIOCTLRsp(
1551 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1552 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1553 tiIOCTLPayload_t *agIOCTLPayload;
1557 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1558 agIOCTLPayload->Status = (bit16)status;
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);
1567 ostiIOCTLSetSignal(tiRoot,
1568 tdsaAllShared->tdFWControlEx.param1,
1569 tdsaAllShared->tdFWControlEx.param2,
1572 #ifdef SPC_ENABLE_PROFILE
1573 /*****************************************************************************
1575 * ostiFWProfileIOCTLRsp
1577 * Purpose: This routine is called for Fw Profile IOCTL reaponse has been received.
1578 * This function is used for both target and initiator.
1581 * tiRoot: Pointer to driver instance
1588 *****************************************************************************/
1590 osGLOBAL void ostiFWProfileIOCTLRsp(
1595 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1596 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1597 tdFWProfile_t *fwProfile;
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)
1604 if((fwProfile->cmd == STOP_TIMER_PROFILE) || (fwProfile->cmd == STOP_CODE_PROFILE))
1606 osti_memcpy((void *)(fwProfile->buffer),
1607 (void *)(tdsaAllShared->tdFWProfileEx.virtAddr),
1610 ostiFreeMemory(tiRoot,
1611 tdsaAllShared->tdFWProfileEx.buffer,
1612 tdsaAllShared->tdFWProfileEx.len);
1615 fwProfile->status = status;
1616 fwProfile->len = len;
1617 ostiIOCTLSetSignal(tiRoot,
1618 tdsaAllShared->tdFWProfileEx.param1,
1619 tdsaAllShared->tdFWProfileEx.param2,
1623 /*****************************************************************************
1625 * ostiGetNVMDIOCTLRsp
1627 * Purpose: This routine is called for Get NVMD IOCTL reaponse has been received.
1628 * This function is used for both target and initiator.
1631 * tiRoot: Pointer to driver instance
1632 * payloadRsp: Pointer to the FW download IOMB's payload.
1638 *****************************************************************************/
1640 osGLOBAL void ostiGetNVMDIOCTLRsp(
1645 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1646 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1647 tiIOCTLPayload_t *agIOCTLPayload;
1651 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1652 agIOCTLPayload->Status = (bit16)status;
1655 TI_DBG1(("ostiGetNVMDIOCTLRsp: start, status = %d\n", status));
1656 tdsaAllShared->NvmdResponseSet = 1;
1658 if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
1660 osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
1661 (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
1662 tdsaAllShared->tdFWControlEx.len);
1664 ostiFreeMemory(tiRoot,
1665 tdsaAllShared->tdFWControlEx.buffer,
1666 tdsaAllShared->tdFWControlEx.len);
1668 ostiIOCTLSetSignal(tiRoot,
1669 tdsaAllShared->tdFWControlEx.param1,
1670 tdsaAllShared->tdFWControlEx.param2,
1676 /*****************************************************************************
1678 * ostiGetPhyProfileIOCTLRsp
1680 * Purpose: This routine is called for phy response has been received.
1681 * This function is used for both target and initiator.
1684 * tiRoot: Pointer to driver instance
1685 * payloadRsp: Pointer to the IOMB's payload.
1691 *****************************************************************************/
1693 osGLOBAL void ostiGetPhyProfileIOCTLRsp(
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;
1704 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1705 agIOCTLPayload->Status = (bit16)status;
1707 PhyBlob = (tdPhyCount_t*)&agIOCTLPayload->FunctionSpecificArea[0];
1710 // PhyBlob->Phy |= 0x800;
1711 if(PhyBlob->phyResetProblem == 0 )
1713 PhyBlob->phyResetProblem = -1;
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));
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));
1732 // osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
1733 // (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
1734 // tdsaAllShared->tdFWControlEx.len);
1736 ostiFreeMemory(tiRoot,
1737 tdsaAllShared->tdFWControlEx.buffer,
1738 tdsaAllShared->tdFWControlEx.len);
1740 ostiIOCTLSetSignal(tiRoot,
1741 tdsaAllShared->tdFWControlEx.param1,
1742 tdsaAllShared->tdFWControlEx.param2,
1747 /*****************************************************************************
1749 * ostiGenEventIOCTLRsp
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.
1755 * tiRoot: Pointer to driver instance
1756 * payloadRsp: Pointer to the FW download IOMB's payload.
1762 *****************************************************************************/
1764 osGLOBAL void ostiGenEventIOCTLRsp(
1769 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1770 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1771 tiIOCTLPayload_t *agIOCTLPayload;
1773 TI_DBG1(("ostiGenEventIOCTLRsp: start\n"));
1775 if(tdsaAllShared->tdFWControlEx.inProgress) /*Free only if our IOCTL is in progress*/
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;
1781 ostiFreeMemory(tiRoot,
1782 tdsaAllShared->tdFWControlEx.buffer,
1783 tdsaAllShared->tdFWControlEx.len);
1785 ostiIOCTLSetSignal(tiRoot,
1786 tdsaAllShared->tdFWControlEx.param1,
1787 tdsaAllShared->tdFWControlEx.param2,
1789 tdsaAllShared->tdFWControlEx.inProgress = 0;
1791 #ifdef SPC_ENABLE_PROFILE
1792 if(tdsaAllShared->tdFWProfileEx.inProgress)
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*/
1798 ostiFreeMemory(tiRoot,
1799 tdsaAllShared->tdFWProfileEx.buffer,
1800 tdsaAllShared->tdFWProfileEx.len);
1801 tdsaAllShared->tdFWProfileEx.virtAddr = NULL;
1803 ostiIOCTLSetSignal(tiRoot,
1804 tdsaAllShared->tdFWProfileEx.param1,
1805 tdsaAllShared->tdFWProfileEx.param2,
1807 tdsaAllShared->tdFWProfileEx.inProgress = 0;
1810 #endif /*SPC_ENABLE_PROFILE*/
1815 ostiGetDeviceInfoIOCTLRsp(
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;
1827 TI_DBG1(("ostiGetDeviceInfoIOCTLRsp: start\n"));
1829 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1830 pSADeviceInfo = (agsaDeviceInfo_t*)param;
1831 pTDDeviceInfo = (tdDeviceInfoPayload_t*)agIOCTLPayload->FunctionSpecificArea;
1833 if (pSADeviceInfo != agNULL)
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));
1839 pTDDeviceInfo->devInfo.sasAddressHi = DMA_BEBIT32_TO_BIT32(pTDDeviceInfo->devInfo.sasAddressHi);
1840 pTDDeviceInfo->devInfo.sasAddressLo = DMA_BEBIT32_TO_BIT32(pTDDeviceInfo->devInfo.sasAddressLo);
1842 pTDDeviceInfo->devInfo.deviceType = (pSADeviceInfo->devType_S_Rate & 0x30) >> 4;
1843 pTDDeviceInfo->devInfo.linkRate = pSADeviceInfo->devType_S_Rate & 0x0F;
1845 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1849 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INVALID_DEVICE;
1852 if(tdsaAllShared->tdFWControlEx.inProgress) /*Free only if our IOCTL is in progress*/
1854 ostiIOCTLSetSignal(tiRoot,
1855 tdsaAllShared->tdFWControlEx.param1,
1856 tdsaAllShared->tdFWControlEx.param2,
1858 tdsaAllShared->tdFWControlEx.inProgress = 0;
1863 #ifdef INITIATOR_DRIVER
1865 ostiGetIoErrorStatsIOCTLRsp(
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;
1878 OS_ASSERT(sizeof(agsaIOErrorEventStats_t) == sizeof(tdIoErrorEventStatisticIOCTL_t), "agsaIOErrorEventStats_t tdIoErrorEventStatisticIOCTL_t\n");
1879 TI_DBG1(("ostiGetIoErrorStatsIOCTLRsp: start\n"));
1881 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1882 pIoErrorPayload = (tdIoErrorStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
1883 pIoErrorCount = (agsaIOErrorEventStats_t*)param;
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)
1891 osti_memset(&Initiator->ScsiStatusCounts, 0,sizeof(tdSCSIStatusCount_t) );
1892 osti_memset(&Initiator->SenseKeyCounter, 0,sizeof(tdSenseKeyCount_t) );
1895 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1897 #endif /* INITIATOR_DRIVER */
1900 ostiGetIoEventStatsIOCTLRsp(
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;
1912 TI_DBG1(("ostiGetIoEventStatsIOCTLRsp: start\n"));
1914 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1915 pIoEventPayload = (tdIoEventStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
1916 pIoEventCount = (agsaIOErrorEventStats_t*)param;
1918 osti_memcpy(&pIoEventPayload->IoEvent, pIoEventCount, sizeof(agsaIOErrorEventStats_t));
1920 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1924 ostiGetForensicDataIOCTLRsp(
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;
1936 TI_DBG3(("ostiGetForensicDataIOCTLRsp: start, status = %d\n", status));
1938 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1939 pForensicDataPayload = (tdForensicDataPayload_t*)agIOCTLPayload->FunctionSpecificArea;
1940 pForensicData = (agsaForensicData_t*)param;
1942 if (agNULL == agIOCTLPayload)
1947 if (FORENSIC_DATA_TYPE_CHECK_FATAL == pForensicData->DataType)
1949 agIOCTLPayload->Status = (bit16)status;
1953 if (status == AGSA_RC_SUCCESS)
1955 switch (pForensicData->DataType)
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;
1962 case FORENSIC_DATA_TYPE_GSM_SPACE:
1963 pForensicDataPayload->gsmBuffer.directOffset = pForensicData->BufferType.gsmBuf.directOffset;
1964 pForensicDataPayload->gsmBuffer.readLen = pForensicData->BufferType.gsmBuf.readLen;
1967 case FORENSIC_DATA_TYPE_QUEUE:
1971 TI_DBG1(("ostiGetForensicDataIOCTLRsp: forensic data type error %d\n", pForensicData->DataType));
1974 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1976 else if(status == IOCTL_ERROR_NO_FATAL_ERROR)
1978 agIOCTLPayload->Status = (bit16)status;
1982 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1985 /*Free only if our IOCTL is in progress*/
1986 if(tdsaAllShared->tdFWControlEx.inProgress)
1988 TI_DBG3(("ostiGetForensicDataIOCTLRsp: Waiting for the signal \n"));
1989 ostiIOCTLSetSignal(tiRoot,
1990 tdsaAllShared->tdFWControlEx.param1,
1991 tdsaAllShared->tdFWControlEx.param2,
1993 TI_DBG3(("ostiGetForensicDataIOCTLRsp: Signal wait completed \n"));
1994 tdsaAllShared->tdFWControlEx.inProgress = 0;
1998 /*****************************************************************************
2000 * tdsaRegDumpGetIoctl
2002 * Purpose: This routine is called to get Register Dump information.
2003 * This function is used for both target and initiator.
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
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.
2023 *****************************************************************************/
2025 tdsaRegDumpGetIoctl(
2027 tiIOCTLPayload_t *agIOCTLPayload,
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;
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;
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;
2053 if((CoreDumpLength <= Offset)&&
2054 (agIOCTLPayload->MinorFunction != IOCTL_MN_FW_GET_EVENT_FLASH_LOG1)&&
2055 (agIOCTLPayload->MinorFunction != IOCTL_MN_FW_GET_EVENT_FLASH_LOG2))
2057 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
2058 agIOCTLPayload->Length = 0;
2059 status=IOCTL_CALL_SUCCESS;
2062 regDumpInfo.regDumpOffset = Offset;
2063 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
2064 /* dump either aap1 or iop registers */
2065 switch(agIOCTLPayload->MinorFunction){
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;
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;
2098 case IOCTL_MN_FW_GET_CORE_DUMP_FLASH_AAP1:
2099 regDumpInfo.regDumpSrc = 1;
2100 regDumpInfo.regDumpNum = 0;
2101 if(RequestLength != 0)
2103 if(ostiAllocMemory( tiRoot,
2106 &(regDumpInfo.indirectAddrUpper32),
2107 &(regDumpInfo.indirectAddrLower32),
2111 return IOCTL_CALL_FAIL;
2113 osti_memset((void *)buffer, 0, RequestLength);
2114 regDumpInfo.indirectLen = RequestLength;
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;
2127 case IOCTL_MN_FW_GET_CORE_DUMP_FLASH_IOP:
2128 regDumpInfo.regDumpSrc = 1;
2129 regDumpInfo.regDumpNum = 1;
2130 if(RequestLength != 0)
2132 if(ostiAllocMemory( tiRoot,
2135 &(regDumpInfo.indirectAddrUpper32),
2136 &(regDumpInfo.indirectAddrLower32),
2140 return IOCTL_CALL_FAIL;
2142 osti_memset((void *)buffer, 0, RequestLength);
2143 regDumpInfo.indirectLen = RequestLength;
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;
2156 /*EventLog from Flash*/
2157 case IOCTL_MN_FW_GET_EVENT_FLASH_LOG1: //aap1 Eventlog
2158 if(CoreDumpLength + EventLogOffset <= Offset)
2160 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
2161 agIOCTLPayload->Length = 0;
2162 status=IOCTL_CALL_SUCCESS;
2165 regDumpInfo.regDumpSrc = 1;
2166 regDumpInfo.regDumpNum = 0;
2167 if(RequestLength != 0)
2169 if(ostiAllocMemory( tiRoot,
2172 &(regDumpInfo.indirectAddrUpper32),
2173 &(regDumpInfo.indirectAddrLower32),
2177 return IOCTL_CALL_FAIL;
2179 osti_memset((void *)buffer, 0, RequestLength);
2180 regDumpInfo.indirectLen = RequestLength;
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;
2193 case IOCTL_MN_FW_GET_EVENT_FLASH_LOG2: //iop Eventlog
2194 if(CoreDumpLength + EventLogOffset <= Offset)
2196 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
2197 agIOCTLPayload->Length = 0;
2198 status=IOCTL_CALL_SUCCESS;
2201 regDumpInfo.regDumpSrc = 1;
2202 regDumpInfo.regDumpNum = 1;
2203 if(RequestLength != 0)
2205 if(ostiAllocMemory( tiRoot,
2208 &(regDumpInfo.indirectAddrUpper32),
2209 &(regDumpInfo.indirectAddrLower32),
2213 return IOCTL_CALL_FAIL;
2215 osti_memset((void *)buffer, 0, RequestLength);
2216 regDumpInfo.indirectLen = RequestLength;
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;
2230 status = IOCTL_CALL_INVALID_CODE;
2231 TI_DBG1(("tiCOMMgntIOCTL: ERROR: Wrong IOCTL code %d\n", agIOCTLPayload->MinorFunction));
2234 if(saGetRegisterDump(agRoot, agNULL, 0, ®DumpInfo) != AGSA_RC_SUCCESS)
2236 status = IOCTL_CALL_FAIL;
2237 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
2244 ostiCOMMgntVPDSetIOCTLRsp(
2249 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2250 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2251 // agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
2253 TI_DBG1(("ostiCOMMgntVPDSetIOCTLRsp: start\n"));
2254 (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
2256 ostiFreeMemory(tiRoot,
2257 tdsaAllShared->tdFWControlEx.buffer,
2258 tdsaAllShared->tdFWControlEx.len);
2260 ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
2261 tdsaAllShared->tdFWControlEx.param2,
2265 /*****************************************************************************
2269 * Purpose: This routine is called to set Config. SEEPROM information.
2270 * This function is used for both target and initiator.
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
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.
2290 *****************************************************************************/
2294 tiIOCTLPayload_t *agIOCTLPayload,
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;
2312 TI_DBG2(("tdsaNVMDSetIoctl: start\n"));
2314 RequestLength = agIOCTLPayload->Length;
2316 osti_memset(&nvmdInfo, 0, sizeof(agsaNVMDData_t));
2318 switch(agIOCTLPayload->MinorFunction)
2320 case IOCTL_MN_NVMD_SET_CONFIG:
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;
2329 if (nvmdInfo.NVMDevice == 0) {
2330 nvmdInfo.TWIDeviceAddress = 0xa0;
2331 nvmdInfo.TWIBusNumber = 0;
2332 nvmdInfo.TWIDevicePageSize = 0;
2333 nvmdInfo.TWIDeviceAddressSize = 1;
2336 if(RequestLength != 0)
2338 if(ostiAllocMemory( tiRoot,
2346 return IOCTL_CALL_FAIL;
2350 return IOCTL_CALL_FAIL;
2353 osti_memset((void *)buffer, 0, RequestLength);
2355 osti_memcpy((void *)buffer,
2356 agIOCTLPayload->FunctionSpecificArea,
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;
2373 status = IOCTL_CALL_INVALID_CODE;
2374 TI_DBG1(("tdsaNVMDSetIoctl: ERROR: Wrong IOCTL code %d\n", agIOCTLPayload->MinorFunction));
2378 if(saSetNVMDCommand(agRoot, agNULL, 0, &nvmdInfo) != AGSA_RC_SUCCESS)
2380 status = IOCTL_CALL_FAIL;
2381 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
2388 /*****************************************************************************
2392 * Purpose: This routine is called to get Config. SEEPROM information.
2393 * This function is used for both target and initiator.
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
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.
2413 *****************************************************************************/
2417 tiIOCTLPayload_t *agIOCTLPayload,
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;
2431 bit32 RequestLength = 0;
2432 bit32 ostiMemoryStatus = 0;
2434 bit8* seepromBuffer;
2435 bit8* phySettingsBuffer;
2438 TI_DBG2(("tdsaNVMDGetIoctl: start\n"));
2440 RequestLength = agIOCTLPayload->Length;
2441 Offset = agIOCTLPayload->Reserved;
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
2448 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
2449 agIOCTLPayload->Length = 0;
2450 status=IOCTL_CALL_SUCCESS;
2455 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
2457 switch(agIOCTLPayload->MinorFunction)
2459 case IOCTL_MN_NVMD_GET_CONFIG:
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;
2468 if (nvmdInfo.NVMDevice == 0) {
2469 nvmdInfo.TWIDeviceAddress = 0xa0;
2470 nvmdInfo.TWIBusNumber = 0;
2471 nvmdInfo.TWIDevicePageSize = 0;
2472 nvmdInfo.TWIDeviceAddressSize = 1;
2475 if(RequestLength != 0)
2477 ostiMemoryStatus = ostiAllocMemory( tiRoot,
2480 &(nvmdInfo.indirectAddrUpper32),
2481 &(nvmdInfo.indirectAddrLower32),
2485 if((ostiMemoryStatus != tiSuccess) && (buffer == agNULL))
2486 return IOCTL_CALL_FAIL;
2490 return IOCTL_CALL_FAIL;
2492 osti_memset((void *)buffer, 0, RequestLength);
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;
2506 status = IOCTL_CALL_INVALID_CODE;
2507 TI_DBG1(("tiCOMMgntIOCTL: ERROR: Wrong IOCTL code %d\n", agIOCTLPayload->MinorFunction));
2510 tdsaAllShared->NvmdResponseSet = 0;
2512 if(saGetNVMDCommand(agRoot, agNULL, 0, &nvmdInfo) != AGSA_RC_SUCCESS)
2514 status = IOCTL_CALL_FAIL;
2515 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
2518 /* Copy the SAS address */
2519 if(agParam1 == agNULL)
2522 while(!tdsaAllShared->NvmdResponseSet)
2524 // tiCOMDelayedInterruptHandler(tiRoot, 0, 1, tiNonInterruptContext);
2526 if(nvmdInfo.NVMDevice == 4 || nvmdInfo.NVMDevice == 1)
2528 seepromBuffer = buffer;
2529 /*Get Initiator SAS address*/
2531 if(tiIS_SPC(agRoot))
2533 for(j=0,i=ADAPTER_WWN_SPC_START_OFFSET; i<= ADAPTER_WWN_SPC_END_OFFSET; i++,j++)
2534 agIOCTLPayload->FunctionSpecificArea[j] = seepromBuffer[i];
2538 for(j=0,i=ADAPTER_WWN_START_OFFSET; i<= ADAPTER_WWN_END_OFFSET; i++,j++)
2539 agIOCTLPayload->FunctionSpecificArea[j] = seepromBuffer[i];
2542 /* Copy the Phy settings */
2543 else if(nvmdInfo.NVMDevice == 6)
2545 phySettingsBuffer = buffer;
2546 for(i=0; i<PHY_SETTINGS_LEN; i++)
2547 agIOCTLPayload->FunctionSpecificArea[i] = phySettingsBuffer[i];
2549 tdsaAllShared->NvmdResponseSet = 0;
2550 ostiFreeMemory(tiRoot, tdsaAllShared->tdFWControlEx.buffer, tdsaAllShared->tdFWControlEx.len);
2557 /*****************************************************************************
2559 * tdsaDeviceInfoGetIoctl
2561 * Purpose: This routine is called to get the specified device information.
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
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.
2581 *****************************************************************************/
2583 tdsaDeviceInfoGetIoctl(
2585 tiIOCTLPayload_t *agIOCTLPayload,
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;
2597 pDeviceInfo = (tdDeviceInfoPayload_t*)agIOCTLPayload->FunctionSpecificArea;
2599 TI_DBG3(("tdsaDeviceInfoGetIoctl: %d:%3d:%d %p %p %p\n",
2600 (bit8)pDeviceInfo->PathId,
2601 (bit8)pDeviceInfo->TargetId,
2602 (bit8)pDeviceInfo->Lun,
2607 tiDeviceHandle = ostiMapToDevHandle(tiRoot,
2608 (bit8)pDeviceInfo->PathId,
2609 (bit8)pDeviceInfo->TargetId,
2610 (bit8)pDeviceInfo->Lun
2613 if (tiDeviceHandle == agNULL)
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;
2622 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2623 if(oneDeviceData == agNULL)
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;
2633 if (oneDeviceData->valid != agTRUE || oneDeviceData->registered != agTRUE ||
2634 oneDeviceData->tdPortContext == agNULL )
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;
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));
2648 pDeviceInfo->devInfo.sasAddressHi = DMA_BEBIT32_TO_BIT32(pDeviceInfo->devInfo.sasAddressHi);
2649 pDeviceInfo->devInfo.sasAddressLo = DMA_BEBIT32_TO_BIT32(pDeviceInfo->devInfo.sasAddressLo);
2651 pDeviceInfo->devInfo.deviceType = (oneDeviceData->agDeviceInfo.devType_S_Rate & 0x30) >> 4;
2652 pDeviceInfo->devInfo.linkRate = oneDeviceData->agDeviceInfo.devType_S_Rate & 0x0F;
2654 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
2656 TI_DBG3(("tdsaDeviceInfoGetIoctl:IOCTL_CALL_SUCCESS\n"));
2658 /*saGetDeviceInfo(agRoot, agNULL, 0, 0, agDevHandle);*/
2660 status = IOCTL_CALL_SUCCESS;
2664 /*****************************************************************************
2666 * tdsaIoErrorStatisticGetIoctl
2668 * Purpose: This routine is called to get the IO error statistic.
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
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.
2688 *****************************************************************************/
2690 tdsaIoErrorStatisticGetIoctl(
2692 tiIOCTLPayload_t *agIOCTLPayload,
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;
2704 pIoErrorPayload = (tdIoErrorStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
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;
2715 saGetIOErrorStats(agRoot, agNULL, pIoErrorPayload->flag);
2720 /*****************************************************************************
2722 * tdsaIoEventStatisticGetIoctl
2724 * Purpose: This routine is called to get the IO event statistic.
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
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.
2744 *****************************************************************************/
2746 tdsaIoEventStatisticGetIoctl(
2748 tiIOCTLPayload_t *agIOCTLPayload,
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;
2760 pIoEventPayload = (tdIoEventStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
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;
2771 saGetIOEventStats(agRoot, agNULL, pIoEventPayload->flag);
2776 /*****************************************************************************
2780 * Purpose: This routine is called to get Forensic Data.
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
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.
2800 *****************************************************************************/
2804 tiIOCTLPayload_t *agIOCTLPayload,
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;
2816 pRegisterPayload = (tdRegisterPayload_t*)agIOCTLPayload->FunctionSpecificArea;
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;
2827 TI_DBG1(("tdsaRegisterIoctl: Flag %d RegAddr 0x%x RegValue 0x%x\n",
2828 pRegisterPayload->flag, pRegisterPayload->RegAddr, pRegisterPayload->RegValue));
2830 if (pRegisterPayload->flag)
2833 ostiChipWriteBit32Ext(tiRoot, 0, pRegisterPayload->RegAddr, pRegisterPayload->RegValue);
2838 pRegisterPayload->RegValue = ostiChipReadBit32Ext(tiRoot, 0, pRegisterPayload->RegAddr);
2840 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
2845 tdsaGetPhyGeneralStatusIoctl(
2847 agsaPhyGeneralState_t *PhyData
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;
2857 agsaControllerInfo_t ControllerInfo;
2858 saGetControllerInfo(agRoot,&ControllerInfo);
2860 TI_DBG3(("tdsaGetPhyGeneralStatusIoctl: start\n"));
2863 if(tIsSPC(agRoot)||tIsSPCHIL(agRoot))
2865 status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
2869 PhyData->Reserved1 = ControllerInfo.phyCount;
2870 for(i=0;i<PhyData->Reserved1;i++)
2872 status = saGetPhyProfile( agRoot,agNULL,tdsaRotateQnumber(tiRoot, agNULL), AGSA_SAS_PHY_GENERAL_STATUS_PAGE,i);
2873 if(status == AGSA_RC_FAILURE)
2879 TI_DBG3(("tdsaGetPhyGeneralStatusIoctl: End\n"));
2882 /*****************************************************************************
2884 * ostiGetPhyGeneralStatusRsp
2886 * Purpose: This routine is called when a PhyStatus IOCTL response is received.
2889 * tiRoot: Pointer to driver instance
2890 * agsaSASPhyGeneralStatusPage_t: Status of the phy.
2896 *****************************************************************************/
2897 osGLOBAL void ostiGetPhyGeneralStatusRsp(
2899 agsaSASPhyGeneralStatusPage_t *GenStatus,
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;
2910 TI_DBG1(("ostiGetPhyGeneralStatusRsp: start\n"));
2912 if (tdsaAllShared->tdFWControlEx.inProgress)
2914 agIoctlPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
2915 if ((agIoctlPayload) && (PMC_IOCTL_SIGNATURE == agIoctlPayload->Signature)&&
2916 (IOCTL_MJ_PHY_GENERAL_STATUS == agIoctlPayload->MajorFunction))
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)
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;
2933 TI_DBG1(("ostiGetPhyGeneralStatusRsp: end\n"));
2938 tdsaPhyProfileIoctl(
2940 tiIOCTLPayload_t *agIOCTLPayload,
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;
2957 tdPhyCount_t *PhyBlob = (tdPhyCount_t*)&agIOCTLPayload->FunctionSpecificArea[0];
2960 if(ostiAllocMemory( tiRoot,
2968 return IOCTL_CALL_FAIL;
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;
2980 TI_DBG1(("tdsaPhyProfileIoctl: MinorFunction %d\n",agIOCTLPayload->MinorFunction));
2981 // PhyBlob->Phy |= 0x100;
2983 if( tiIS_SPC(agRoot) )
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)
2989 status = IOCTL_CALL_PENDING;
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);
2997 if(retcode == AGSA_RC_SUCCESS)
2999 status = IOCTL_CALL_PENDING;
3004 TI_DBG2(("tdsaPhyProfileIoctl: after\n"));
3010 /*****************************************************************************
3012 * tdsaForensicDataGetIoctl
3014 * Purpose: This routine is called to get Forensic Data.
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
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.
3034 *****************************************************************************/
3036 tdsaForensicDataGetIoctl(
3038 tiIOCTLPayload_t *agIOCTLPayload,
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;
3051 pForensicDataPayload = (tdForensicDataPayload_t*)agIOCTLPayload->FunctionSpecificArea;
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;
3062 osti_memset(&ForensicData, 0, sizeof(agsaForensicData_t));
3064 ForensicData.DataType = pForensicDataPayload->DataType;
3066 switch (ForensicData.DataType)
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;
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;
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;
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;
3097 TI_DBG1(("tdsaGetForensicDataIoctl: forensic data type error %d\n", pForensicDataPayload->DataType));
3098 status = IOCTL_CALL_INVALID_CODE;
3102 if ( saGetForensicData(agRoot, agNULL, &ForensicData) != AGSA_RC_SUCCESS )
3104 status = IOCTL_CALL_FAIL;
3113 tiIOCTLPayload_t *agIOCTLPayload,
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;
3131 tiDeviceHandle_t *devHandle;
3132 agsaSMPFrame_t agSMPFrame;
3133 tdsaDeviceData_t *oneDeviceData = agNULL;
3136 TI_DBG2(("tdsaSendSMPIoctl: start\n"));
3138 smp_pass_through_req = (smp_pass_through_req_t*)agIOCTLPayload->FunctionSpecificArea;
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]));
3147 devHandle = ostiGetDevHandleFromSasAddr(tiRoot, smp_pass_through_req->exp_sas_addr);
3148 if(devHandle == NULL)
3150 status = IOCTL_CALL_FAIL;
3151 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3157 //agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
3158 agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_RESPONDING;
3162 if((ostiMemoryStatus != tiSuccess) && (reqBuffer == agNULL ))
3163 return IOCTL_CALL_FAIL;
3166 tdsaAllShared->tdFWControlEx.param3 = osMemHandle;
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;
3173 if(!(smp_pass_through_req->smp_req_len - 8) && !tiIS_SPC(agRoot))
3175 agSMPFrame.flag = 1; // Direct request Indirect response
3176 agSMPFrame.outFrameLen = smp_pass_through_req->smp_req_len - 4; //Exclude header
3181 agSMPFrame.flag = 3; //Indirect request and Indirect response
3182 ostiMemoryStatus = ostiAllocMemory( tiRoot,
3184 (void **)&reqBuffer,
3185 &(agSMPFrame.outFrameAddrUpper32),
3186 &(agSMPFrame.outFrameAddrLower32),
3188 smp_pass_through_req->smp_req_len,
3190 tdsaAllShared->tdFWControlEx.param3 = osMemHandle;
3191 if(tiIS_SPC(agRoot))
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);
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);
3203 ostiMemoryStatus = ostiAllocMemory( tiRoot,
3205 (void **)&respBuffer,
3206 &(agSMPFrame.inFrameAddrUpper32),
3207 &(agSMPFrame.inFrameAddrLower32),
3209 smp_pass_through_req->smp_resp_len + 4,
3211 if((ostiMemoryStatus != tiSuccess) && (respBuffer == agNULL ))
3212 return IOCTL_CALL_FAIL;
3215 osti_memset((void *)respBuffer, 0, smp_pass_through_req->smp_resp_len);
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;
3228 oneDeviceData = (tdsaDeviceData_t *)devHandle->tdData;
3229 if(saSendSMPIoctl(agRoot, oneDeviceData->agDevHandle, 0, &agSMPFrame, &ossaSMPIoctlCompleted) != AGSA_RC_SUCCESS)
3231 status = IOCTL_CALL_FAIL;
3232 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3237 osGLOBAL void ostiSendSMPIOCTLRsp(
3242 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3243 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3244 tiIOCTLPayload_t *agIOCTLPayload;
3246 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
3247 agIOCTLPayload->Status = (bit16)status;
3249 TI_DBG1(("ostiSendSMPIOCTLRsp: start, status = %d\n", status));
3251 // if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
3253 osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
3254 (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
3255 tdsaAllShared->tdFWControlEx.len);
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)
3265 ostiIOCTLComplete(tiRoot,
3266 tdsaAllShared->tdFWControlEx.param1,
3267 tdsaAllShared->tdFWControlEx.param2,
3275 /*****************************************************************************
3279 * Purpose: This routine is called to get Forensic Data.
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
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.
3299 *****************************************************************************/
3303 tiIOCTLPayload_t *agIOCTLPayload,
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;
3317 pBistPayload = (tdBistPayload_t*)agIOCTLPayload->FunctionSpecificArea;
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;
3328 TI_DBG1(("tdsaSendBISTIoctl: Type %d Length %d Data %p\n",
3329 pBistPayload->testType,
3330 pBistPayload->testLength,
3331 pBistPayload->testData ));
3334 // pBistPayload->testtype = AGSA_BIST_TEST;
3336 if( pBistPayload->testType == AGSA_BIST_TEST)
3338 if( pBistPayload->testLength != sizeof(agsaEncryptSelfTestBitMap_t))
3343 else if( pBistPayload->testType == AGSA_SHA_TEST)
3345 if( pBistPayload->testLength != sizeof(agsaEncryptSHATestDescriptor_t) )
3350 else if( pBistPayload->testType == AGSA_HMAC_TEST )
3352 if( pBistPayload->testLength != sizeof(agsaEncryptHMACTestDescriptor_t))
3359 GLOBAL bit32 saEncryptSelftestExecute(
3361 agsaContext_t *agContext,
3365 void *TestDescriptor);
3368 if ( saEncryptSelftestExecute(agRoot,
3371 pBistPayload->testType,
3372 pBistPayload->testLength,
3373 pBistPayload->testData ) != AGSA_RC_SUCCESS )
3375 status = IOCTL_CALL_FAIL;
3383 tdsaSendTMFIoctl( tiRoot_t *tiRoot,
3384 tiIOCTLPayload_t *agIOCTLPayload,
3387 unsigned long resetType
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);
3395 TI_DBG3(("Status returned from ostiSendResetDeviceIoctl is %d\n",status));
3396 if(status != IOCTL_CALL_SUCCESS)
3398 agIOCTLPayload->Status = status;
3401 status = IOCTL_CALL_SUCCESS;
3407 /* temporary to test saSetVPDCommand() and saGetVPDCommand */
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;
3418 bit32 ret = AGSA_RC_SUCCESS;
3420 bit32 bufAddrUpper = 0;
3421 bit32 bufAddrLower = 0;
3422 tdVPDControl_t *VPDControl;
3424 void *osMemHandle = agNULL;
3428 bit8 VPDPayload[32];
3430 TI_DBG2(("tdsaVPDSet: start\n"));
3432 for(i=0;i<sizeof(VPDPayload);i++)
3436 if(ostiAllocMemory( tiRoot,
3447 osti_memcpy((void *)buffer,
3449 sizeof(VPDPayload));
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);
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);
3475 tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
3476 tdsaAllShared->tdFWControlEx.param1 = agParam1;
3477 tdsaAllShared->tdFWControlEx.param2 = agParam2;
3479 /* for testing only */
3480 tdsaAllShared->addrUpper = bufAddrUpper;
3481 tdsaAllShared->addrLower = bufAddrLower;
3483 ret = saSetVPDCommand(agRoot, agNULL, 0, &VPDInfo);
3485 if (ret == AGSA_RC_SUCCESS)
3494 ostiFreeMemory(tiRoot, osMemHandle, sizeof(VPDPayload));
3498 /* temporary to test saSetVPDCommand() and saGetVPDCommand */
3500 tdsaVPDGet(tiRoot_t *tiRoot)
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;
3507 bit32 ret = AGSA_RC_SUCCESS;
3510 TI_DBG2(("tdsaVPDGet: start\n"));
3512 osti_memset(&VPDInfo, 0, sizeof(agsaVPD_t));
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;
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;
3535 ret = saGetVPDCommand(agRoot, agNULL, 0, &VPDInfo);
3537 if (ret == AGSA_RC_SUCCESS)
3548 /*****************************************************************************
3550 * tdsaGetNumOfLUNIOCTL
3552 * Purpose: This routine is called to send Report LUN SSP command request.
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
3564 *****************************************************************************/
3566 tdsaGetNumOfLUNIOCTL(
3568 tiIOCTLPayload_t *agIOCTLPayload,
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;
3583 TI_DBG2(("tdsaGetNumOfLUNIOCTL: Start\n"));
3586 pDeviceLUNInfo = (tdDeviceLUNInfoIOCTL_t*)agIOCTLPayload->FunctionSpecificArea;
3588 if (agIOCTLPayload->Length < sizeof(tdDeviceLUNInfoIOCTL_t))
3590 status = IOCTL_CALL_FAIL;
3593 if(!pDeviceLUNInfo->tiDeviceHandle)
3595 status = IOCTL_CALL_FAIL;
3596 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3599 devHandle = (tiDeviceHandle_t*)pDeviceLUNInfo->tiDeviceHandle;
3600 agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
3602 status = ostiNumOfLUNIOCTLreq(tiRoot,agParam1,agParam2,&tiRequestBody,&tiIORequest);
3605 if(status != AGSA_RC_SUCCESS)
3607 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3610 status = tiNumOfLunIOCTLreq(tiRoot,tiIORequest,devHandle,tiRequestBody,agIOCTLPayload,agParam1,agParam2);
3612 if(status != AGSA_RC_SUCCESS)
3614 agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3617 // ostiIOCTLWaitForSignal (tiRoot, agParam1, agParam2, agParam3);
3620 TI_DBG2(("tdsaGetNumOfLUNIOCTL: End\n"));
3625 /*****************************************************************************
3627 * ostiNumOfLUNIOCTLRsp
3629 * Purpose: This routine is called when a Report LUN SSP command response id recieved.
3632 * tiRoot: Pointer to driver instance
3638 *****************************************************************************/
3639 osGLOBAL void ostiNumOfLUNIOCTLRsp(
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;
3651 TI_DBG1(("ostiNumOfLUNIOCTLRsp: start, status = %d\n", status));
3653 if(tdsaAllShared->tdFWControlEx.inProgress == 1)
3655 agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
3656 if ((agIOCTLPayload) && (PMC_IOCTL_SIGNATURE == agIOCTLPayload->Signature)&&
3657 (IOCTL_MJ_GET_DEVICE_LUN == agIOCTLPayload->MajorFunction))
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)
3670 ostiIOCTLSetSignal(tiRoot,
3671 tdsaAllShared->tdFWControlEx.param1,
3672 tdsaAllShared->tdFWControlEx.param2,
3674 tdsaAllShared->tdFWControlEx.payload = NULL;
3677 tdsaAllShared->tdFWControlEx.inProgress = 0;
3680 TI_DBG1(("ostiNumOfLUNIOCTLRsp: End\n"));