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