14e1bc9a0SAchim Leubner /*******************************************************************************
24e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
34e1bc9a0SAchim Leubner *
44e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
54e1bc9a0SAchim Leubner *that the following conditions are met:
64e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
74e1bc9a0SAchim Leubner *following disclaimer.
84e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
94e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
104e1bc9a0SAchim Leubner *with the distribution.
114e1bc9a0SAchim Leubner *
124e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
134e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
144e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
154e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
164e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
174e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
184e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
194e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
204e1bc9a0SAchim Leubner
214e1bc9a0SAchim Leubner ********************************************************************************/
224e1bc9a0SAchim Leubner /*******************************************************************************/
234e1bc9a0SAchim Leubner /** \file
244e1bc9a0SAchim Leubner *
254e1bc9a0SAchim Leubner *
264e1bc9a0SAchim Leubner * This file contains Management IOCTL APIs
274e1bc9a0SAchim Leubner *
284e1bc9a0SAchim Leubner */
294e1bc9a0SAchim Leubner #include <sys/cdefs.h>
304e1bc9a0SAchim Leubner #include <dev/pms/config.h>
314e1bc9a0SAchim Leubner
324e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osenv.h>
334e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/ostypes.h>
344e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osdebug.h>
354e1bc9a0SAchim Leubner
364e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/sa.h>
374e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
384e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
394e1bc9a0SAchim Leubner
404e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/titypes.h>
414e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
424e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/tiapi.h>
434e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
444e1bc9a0SAchim Leubner
454e1bc9a0SAchim Leubner #ifdef FDS_SM
464e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sat/api/sm.h>
474e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sat/api/smapi.h>
484e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
494e1bc9a0SAchim Leubner #endif
504e1bc9a0SAchim Leubner
514e1bc9a0SAchim Leubner #ifdef FDS_DM
524e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dm.h>
534e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dmapi.h>
544e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
554e1bc9a0SAchim Leubner #endif
564e1bc9a0SAchim Leubner
574e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
584e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osstring.h>
594e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
604e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/spc/mpidebug.h>
614e1bc9a0SAchim Leubner
624e1bc9a0SAchim Leubner #ifdef INITIATOR_DRIVER
634e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
644e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
654e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
664e1bc9a0SAchim Leubner #endif
674e1bc9a0SAchim Leubner
684e1bc9a0SAchim Leubner #ifdef TARGET_DRIVER
694e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
704e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
714e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
724e1bc9a0SAchim Leubner #endif
734e1bc9a0SAchim Leubner
744e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
754e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
764e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/tdioctl.h>
774e1bc9a0SAchim Leubner
784e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/spc/sadefs.h>
794e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/spc/spcdefs.h>
804e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/spc/mpi.h>
814e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/spc/sallist.h>
824e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/spc/satypes.h>
834e1bc9a0SAchim Leubner
844e1bc9a0SAchim Leubner
854e1bc9a0SAchim Leubner #define agFieldOffset(baseType,fieldName) \
864e1bc9a0SAchim Leubner /*lint -e545 */ \
874e1bc9a0SAchim Leubner ((bit32)((bitptr)(&(((baseType *)0)->fieldName)))) \
884e1bc9a0SAchim Leubner
894e1bc9a0SAchim Leubner #ifdef SA_LL_API_TEST
904e1bc9a0SAchim Leubner osGLOBAL bit32 tdLlApiTestIoctl(tiRoot_t *tiRoot,
914e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
924e1bc9a0SAchim Leubner void *agParam1,
934e1bc9a0SAchim Leubner void *agParam2,
944e1bc9a0SAchim Leubner void *agParam3);
954e1bc9a0SAchim Leubner #endif /* SA_LL_API_TEST */
964e1bc9a0SAchim Leubner
974e1bc9a0SAchim Leubner
984e1bc9a0SAchim Leubner extern bit32 volatile sgpioResponseSet;
994e1bc9a0SAchim Leubner
1004e1bc9a0SAchim Leubner #ifdef SPC_ENABLE_PROFILE
1014e1bc9a0SAchim Leubner /*****************************************************************************
1024e1bc9a0SAchim Leubner *
1034e1bc9a0SAchim Leubner * tdipFWProfileIoctl
1044e1bc9a0SAchim Leubner *
1054e1bc9a0SAchim Leubner * Purpose: This routine is called to process the FW Profile IOCTL function.
1064e1bc9a0SAchim Leubner * This function is used for both target and initiator.
1074e1bc9a0SAchim Leubner *
1084e1bc9a0SAchim Leubner * Parameters:
1094e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
1104e1bc9a0SAchim Leubner * agIOCTLPayload: Pointer to the IOCTL payload.
1114e1bc9a0SAchim Leubner * agParam1: Pointer to pass context handle for IOCTL DMA operation
1124e1bc9a0SAchim Leubner * agParam2: Pointer to pass context handle for IOCTL DMA operation
1134e1bc9a0SAchim Leubner * agParam3: Pointer to pass context handle for IOCTL DMA operation
1144e1bc9a0SAchim Leubner *
1154e1bc9a0SAchim Leubner * Return:
1164e1bc9a0SAchim Leubner *
1174e1bc9a0SAchim Leubner * IOCTL_CALL_SUCCESS The requested operation completed successfully.
1184e1bc9a0SAchim Leubner * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
1194e1bc9a0SAchim Leubner * Detail error code is function specific and
1204e1bc9a0SAchim Leubner * defined by the specific IOCTL function.
1214e1bc9a0SAchim Leubner * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
1224e1bc9a0SAchim Leubner *
1234e1bc9a0SAchim Leubner *
1244e1bc9a0SAchim Leubner *****************************************************************************/
tdipFWProfileIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)1254e1bc9a0SAchim Leubner osGLOBAL bit32 tdipFWProfileIoctl(
1264e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
1274e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
1284e1bc9a0SAchim Leubner void *agParam1,
1294e1bc9a0SAchim Leubner void *agParam2,
1304e1bc9a0SAchim Leubner void *agParam3
1314e1bc9a0SAchim Leubner )
1324e1bc9a0SAchim Leubner {
1334e1bc9a0SAchim Leubner
1344e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
1354e1bc9a0SAchim Leubner bit32 bufAddrUpper = 0;
1364e1bc9a0SAchim Leubner bit32 bufAddrLower = 0;
1374e1bc9a0SAchim Leubner tdFWProfile_t *fwProfile;
1384e1bc9a0SAchim Leubner
1394e1bc9a0SAchim Leubner void *osMemHandle = agNULL;
1404e1bc9a0SAchim Leubner void *buffer = agNULL;
1414e1bc9a0SAchim Leubner agsaFwProfile_t fwProfileInfo = {0};
1424e1bc9a0SAchim Leubner
1434e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1444e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1454e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &tdsaAllShared->agRootInt;
1464e1bc9a0SAchim Leubner
1474e1bc9a0SAchim Leubner fwProfile = (tdFWProfile_t *)&agIOCTLPayload->FunctionSpecificArea[0];
1484e1bc9a0SAchim Leubner
1494e1bc9a0SAchim Leubner
1504e1bc9a0SAchim Leubner fwProfileInfo.processor = fwProfile->processor;
1514e1bc9a0SAchim Leubner fwProfileInfo.cmd = fwProfile->cmd;
1524e1bc9a0SAchim Leubner fwProfileInfo.len = fwProfile->len;
1534e1bc9a0SAchim Leubner fwProfileInfo.tcid = fwProfile->tcid;
1544e1bc9a0SAchim Leubner if(fwProfile->cmd == START_CODE_PROFILE)
1554e1bc9a0SAchim Leubner {
1564e1bc9a0SAchim Leubner fwProfileInfo.codeStartAdd = fwProfile->codeStartAdd;
1574e1bc9a0SAchim Leubner fwProfileInfo.codeEndAdd = fwProfile->codeEndAdd;
1584e1bc9a0SAchim Leubner }
1594e1bc9a0SAchim Leubner if((fwProfile->cmd == STOP_TIMER_PROFILE) || (fwProfile->cmd == STOP_CODE_PROFILE))
1604e1bc9a0SAchim Leubner {
1614e1bc9a0SAchim Leubner if(fwProfile->len != 0)
1624e1bc9a0SAchim Leubner {
1634e1bc9a0SAchim Leubner if(ostiAllocMemory( tiRoot,
1644e1bc9a0SAchim Leubner &osMemHandle,
1654e1bc9a0SAchim Leubner (void **)&buffer,
1664e1bc9a0SAchim Leubner &bufAddrUpper,
1674e1bc9a0SAchim Leubner &bufAddrLower,
1684e1bc9a0SAchim Leubner 8,
1694e1bc9a0SAchim Leubner fwProfile->len,
1704e1bc9a0SAchim Leubner agFALSE))
1714e1bc9a0SAchim Leubner {
1724e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
1734e1bc9a0SAchim Leubner }
1744e1bc9a0SAchim Leubner osti_memset((void *)buffer, 0, fwProfile->len);
1754e1bc9a0SAchim Leubner }
1764e1bc9a0SAchim Leubner fwProfileInfo.agSgl.sgLower = bufAddrLower;
1774e1bc9a0SAchim Leubner fwProfileInfo.agSgl.sgUpper = bufAddrUpper;
1784e1bc9a0SAchim Leubner fwProfileInfo.agSgl.len = fwProfile->len;
1794e1bc9a0SAchim Leubner fwProfileInfo.agSgl.extReserved = 0;
1804e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.buffer = osMemHandle;
1814e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.virtAddr = buffer;
1824e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.len = fwProfile->len;
1834e1bc9a0SAchim Leubner }
1844e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.tdFWProfile = fwProfile;
1854e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.param1 = agParam1;
1864e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.param2 = agParam2;
1874e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.payload = agIOCTLPayload;
1884e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.inProgress = 1;
1894e1bc9a0SAchim Leubner status = saFwProfile(agRoot,
1904e1bc9a0SAchim Leubner agNULL,
1914e1bc9a0SAchim Leubner 0,
1924e1bc9a0SAchim Leubner &fwProfileInfo
1934e1bc9a0SAchim Leubner );
1944e1bc9a0SAchim Leubner if(status)
1954e1bc9a0SAchim Leubner {
1964e1bc9a0SAchim Leubner if((fwProfile->cmd == STOP_TIMER_PROFILE) || (fwProfile->cmd == STOP_CODE_PROFILE))
1974e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot, osMemHandle, fwProfile->len);
1984e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
1994e1bc9a0SAchim Leubner }
2004e1bc9a0SAchim Leubner else
2014e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
2024e1bc9a0SAchim Leubner return status;
2034e1bc9a0SAchim Leubner }
2044e1bc9a0SAchim Leubner
2054e1bc9a0SAchim Leubner
2064e1bc9a0SAchim Leubner #endif
2074e1bc9a0SAchim Leubner
2084e1bc9a0SAchim Leubner /*****************************************************************************
2094e1bc9a0SAchim Leubner *
2104e1bc9a0SAchim Leubner * tdipFWControlIoctl
2114e1bc9a0SAchim Leubner *
2124e1bc9a0SAchim Leubner * Purpose: This routine is called to process the FW control IOCTL function.
2134e1bc9a0SAchim Leubner * This function is used for both target and initiator.
2144e1bc9a0SAchim Leubner *
2154e1bc9a0SAchim Leubner * Parameters:
2164e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
2174e1bc9a0SAchim Leubner * agIOCTLPayload: Pointer to the IOCTL payload.
2184e1bc9a0SAchim Leubner * agParam1: Pointer to pass context handle for IOCTL DMA operation
2194e1bc9a0SAchim Leubner * agParam2: Pointer to pass context handle for IOCTL DMA operation
2204e1bc9a0SAchim Leubner * agParam3: Pointer to pass context handle for IOCTL DMA operation
2214e1bc9a0SAchim Leubner *
2224e1bc9a0SAchim Leubner * Return:
2234e1bc9a0SAchim Leubner *
2244e1bc9a0SAchim Leubner * IOCTL_CALL_SUCCESS The requested operation completed successfully.
2254e1bc9a0SAchim Leubner * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
2264e1bc9a0SAchim Leubner * Detail error code is function specific and
2274e1bc9a0SAchim Leubner * defined by the specific IOCTL function.
2284e1bc9a0SAchim Leubner * IOCTL_CALL_PENDING This request is asynchronous and completed
2294e1bc9a0SAchim Leubner * in some other context.
2304e1bc9a0SAchim Leubner * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
2314e1bc9a0SAchim Leubner *
2324e1bc9a0SAchim Leubner *
2334e1bc9a0SAchim Leubner *****************************************************************************/
tdipFWControlIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)2344e1bc9a0SAchim Leubner osGLOBAL bit32 tdipFWControlIoctl(
2354e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
2364e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
2374e1bc9a0SAchim Leubner void *agParam1,
2384e1bc9a0SAchim Leubner void *agParam2,
2394e1bc9a0SAchim Leubner void *agParam3
2404e1bc9a0SAchim Leubner ) {
2414e1bc9a0SAchim Leubner
2424e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_PENDING;
2434e1bc9a0SAchim Leubner bit32 bufAddrUpper = 0;
2444e1bc9a0SAchim Leubner bit32 bufAddrLower = 0;
2454e1bc9a0SAchim Leubner tdFWControl_t *fwControl;
2464e1bc9a0SAchim Leubner void *osMemHandle = agNULL;
2474e1bc9a0SAchim Leubner void *buffer = agNULL;
2484e1bc9a0SAchim Leubner agsaUpdateFwFlash_t flashUpdateInfo;
2494e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2504e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2514e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &tdsaAllShared->agRootInt;
2524e1bc9a0SAchim Leubner
2534e1bc9a0SAchim Leubner if( agIOCTLPayload->Length <
2544e1bc9a0SAchim Leubner ( agFieldOffset(tiIOCTLPayload_t, FunctionSpecificArea) +
2554e1bc9a0SAchim Leubner sizeof(tdFWControl_t) ) ) {
2564e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
2574e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
2584e1bc9a0SAchim Leubner return status;
2594e1bc9a0SAchim Leubner }
2604e1bc9a0SAchim Leubner fwControl = (tdFWControl_t *)&agIOCTLPayload->FunctionSpecificArea[0];
2614e1bc9a0SAchim Leubner
2624e1bc9a0SAchim Leubner if(fwControl->len != 0)
2634e1bc9a0SAchim Leubner {
2644e1bc9a0SAchim Leubner if(ostiAllocMemory( tiRoot,
2654e1bc9a0SAchim Leubner &osMemHandle,
2664e1bc9a0SAchim Leubner (void **)&buffer,
2674e1bc9a0SAchim Leubner &bufAddrUpper,
2684e1bc9a0SAchim Leubner &bufAddrLower,
2694e1bc9a0SAchim Leubner 8,
2704e1bc9a0SAchim Leubner fwControl->len,
2714e1bc9a0SAchim Leubner agFALSE) )
2724e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
2734e1bc9a0SAchim Leubner }
2744e1bc9a0SAchim Leubner osti_memset( (void *)buffer, 0, fwControl->len );
2754e1bc9a0SAchim Leubner osti_memcpy( (void *)buffer,
2764e1bc9a0SAchim Leubner fwControl->buffer,
2774e1bc9a0SAchim Leubner fwControl->len );
2784e1bc9a0SAchim Leubner flashUpdateInfo.agSgl.sgLower = bufAddrLower;
2794e1bc9a0SAchim Leubner flashUpdateInfo.agSgl.sgUpper = bufAddrUpper;
2804e1bc9a0SAchim Leubner flashUpdateInfo.agSgl.len = fwControl->len;
2814e1bc9a0SAchim Leubner flashUpdateInfo.agSgl.extReserved = 0;
2824e1bc9a0SAchim Leubner flashUpdateInfo.currentImageOffset = fwControl->offset;
2834e1bc9a0SAchim Leubner flashUpdateInfo.currentImageLen = fwControl->len;
2844e1bc9a0SAchim Leubner flashUpdateInfo.totalImageLen = fwControl->size;
2854e1bc9a0SAchim Leubner switch (agIOCTLPayload->MinorFunction)
2864e1bc9a0SAchim Leubner {
2874e1bc9a0SAchim Leubner case IOCTL_MN_FW_DOWNLOAD_DATA:
2884e1bc9a0SAchim Leubner {
2894e1bc9a0SAchim Leubner TI_DBG6(("tdipFWControlIoctl: calling saFwFlashUpdate\n"));
2904e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.tdFWControl = fwControl;
2914e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2924e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
2934e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
2944e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2954e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
2964e1bc9a0SAchim Leubner status = saFwFlashUpdate( agRoot,
2974e1bc9a0SAchim Leubner agNULL,
2984e1bc9a0SAchim Leubner 0,
2994e1bc9a0SAchim Leubner &flashUpdateInfo );
3004e1bc9a0SAchim Leubner if(status) {
3014e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
3024e1bc9a0SAchim Leubner fwControl->retcode = IOCTL_CALL_TIMEOUT;
3034e1bc9a0SAchim Leubner }
3044e1bc9a0SAchim Leubner else {
3054e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
3064e1bc9a0SAchim Leubner }
3074e1bc9a0SAchim Leubner break;
3084e1bc9a0SAchim Leubner }
3094e1bc9a0SAchim Leubner default:
3104e1bc9a0SAchim Leubner status = IOCTL_CALL_INVALID_CODE;
3114e1bc9a0SAchim Leubner TI_DBG1( ("tdipFWControlIoctl: ERROR: Wrong IOCTL code %d\n",
3124e1bc9a0SAchim Leubner agIOCTLPayload->MinorFunction) );
3134e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot, osMemHandle, fwControl->len);
3144e1bc9a0SAchim Leubner return status;
3154e1bc9a0SAchim Leubner } /* end IOCTL switch */
3164e1bc9a0SAchim Leubner return status;
3174e1bc9a0SAchim Leubner } /* tdipFWControlIoctl */
3184e1bc9a0SAchim Leubner
3194e1bc9a0SAchim Leubner
3204e1bc9a0SAchim Leubner /*****************************************************************************
3214e1bc9a0SAchim Leubner *
3224e1bc9a0SAchim Leubner * tiCOMMgntIOCTL
3234e1bc9a0SAchim Leubner *
3244e1bc9a0SAchim Leubner * Purpose: This routine is a TISA API for processing the PMC specific
3254e1bc9a0SAchim Leubner * IOCTL function.
3264e1bc9a0SAchim Leubner *
3274e1bc9a0SAchim Leubner * Each IOCTL function is identified by the IOCTL header
3284e1bc9a0SAchim Leubner * specified in the data payload as the following:
3294e1bc9a0SAchim Leubner * Field Description
3304e1bc9a0SAchim Leubner * ----- -----------
3314e1bc9a0SAchim Leubner * Signature PMC IOCTL signature.
3324e1bc9a0SAchim Leubner * #define PMC_IOCTL_SIGNATURE 0x1234
3334e1bc9a0SAchim Leubner * MajorFunction Major function number.
3344e1bc9a0SAchim Leubner * MinorFunction Minor function number.
3354e1bc9a0SAchim Leubner * Length Length of this structure in bytes.
3364e1bc9a0SAchim Leubner * Status Return status for this IOCTL function.
3374e1bc9a0SAchim Leubner * FunctionSpecificArea Variable length function specific area.
3384e1bc9a0SAchim Leubner *
3394e1bc9a0SAchim Leubner * Parameters:
3404e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
3414e1bc9a0SAchim Leubner * agIOCTLPayload: Pointer to the IOCTL payload.
3424e1bc9a0SAchim Leubner * agParam1: Pointer to pass context handle for IOCTL DMA operation
3434e1bc9a0SAchim Leubner * agParam2: Pointer to pass context handle for IOCTL DMA operation
3444e1bc9a0SAchim Leubner * agParam3: Pointer to pass context handle for IOCTL DMA operation
3454e1bc9a0SAchim Leubner *
3464e1bc9a0SAchim Leubner * Return:
3474e1bc9a0SAchim Leubner *
3484e1bc9a0SAchim Leubner * IOCTL_CALL_SUCCESS The requested operation completed successfully.
3494e1bc9a0SAchim Leubner * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
3504e1bc9a0SAchim Leubner * Detail error code is function specific and
3514e1bc9a0SAchim Leubner * defined by the specific IOCTL function.
3524e1bc9a0SAchim Leubner * IOCTL_CALL_PENDING This request is asynchronous and completed
3534e1bc9a0SAchim Leubner * in some other context.
3544e1bc9a0SAchim Leubner * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
3554e1bc9a0SAchim Leubner * IOCTL_CALL_INVALID_DEVICE Invalid target or destination device.
3564e1bc9a0SAchim Leubner *
3574e1bc9a0SAchim Leubner * Note:
3584e1bc9a0SAchim Leubner * Used ostiAllocMemory() OS layer callback function to allocate memory
3594e1bc9a0SAchim Leubner * for DMA operaion. Then use ostiFreeMemory() to deallocate the memory.
3604e1bc9a0SAchim Leubner *
3614e1bc9a0SAchim Leubner *****************************************************************************/
3624e1bc9a0SAchim Leubner osGLOBAL bit32
tiCOMMgntIOCTL(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)3634e1bc9a0SAchim Leubner tiCOMMgntIOCTL(
3644e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
3654e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
3664e1bc9a0SAchim Leubner void *agParam1,
3674e1bc9a0SAchim Leubner void *agParam2,
3684e1bc9a0SAchim Leubner void *agParam3
3694e1bc9a0SAchim Leubner )
3704e1bc9a0SAchim Leubner {
3714e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_INVALID_CODE;
3724e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3734e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3744e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootNonInt);
3754e1bc9a0SAchim Leubner bit32 EventLogLength = 0;
3764e1bc9a0SAchim Leubner bit32 EventLogOption;
3774e1bc9a0SAchim Leubner bit32 ReadLength = 0;
3784e1bc9a0SAchim Leubner bit32 Offset = 0;
3794e1bc9a0SAchim Leubner bit32 RequestLength = 0; /* user request on how much data to pass to application */
3804e1bc9a0SAchim Leubner agsaContext_t *agContext = NULL;
381*4d24901aSPedro F. Giffuni bit8 *loc = NULL;
3824e1bc9a0SAchim Leubner
3834e1bc9a0SAchim Leubner TI_DBG3(("tiCOMMgntIOCTL: start\n"));
3844e1bc9a0SAchim Leubner
3854e1bc9a0SAchim Leubner TI_DBG3(("tiCOMMgntIOCTL: tiRoot %p agIOCTLPayload %p agParam1 %p agParam2 %p agParam3 %p\n",
3864e1bc9a0SAchim Leubner tiRoot,agIOCTLPayload,agParam1,agParam2,agParam3 ));
3874e1bc9a0SAchim Leubner
3884e1bc9a0SAchim Leubner 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",
3894e1bc9a0SAchim Leubner agIOCTLPayload->Signature,
3904e1bc9a0SAchim Leubner agIOCTLPayload->MajorFunction,
3914e1bc9a0SAchim Leubner agIOCTLPayload->MinorFunction,
3924e1bc9a0SAchim Leubner agIOCTLPayload->Length,
3934e1bc9a0SAchim Leubner agIOCTLPayload->Status,
3944e1bc9a0SAchim Leubner agIOCTLPayload->Reserved,
3954e1bc9a0SAchim Leubner agIOCTLPayload->FunctionSpecificArea[0] ));
3964e1bc9a0SAchim Leubner
3974e1bc9a0SAchim Leubner /* PMC IOCTL signatures matched ? */
3984e1bc9a0SAchim Leubner if(agIOCTLPayload->Signature != PMC_IOCTL_SIGNATURE)
3994e1bc9a0SAchim Leubner {
4004e1bc9a0SAchim Leubner TI_DBG1(("tiCOMMgntIOCTL:agIOCTLPayload->Signature %x IOCTL_CALL_INVALID_CODE\n",agIOCTLPayload->Signature ));
4014e1bc9a0SAchim Leubner status = IOCTL_CALL_INVALID_CODE;
4024e1bc9a0SAchim Leubner return (status);
4034e1bc9a0SAchim Leubner }
4044e1bc9a0SAchim Leubner
4054e1bc9a0SAchim Leubner switch (agIOCTLPayload->MajorFunction)
4064e1bc9a0SAchim Leubner {
4074e1bc9a0SAchim Leubner //TODO: make the card identification more robust. For now - just to keep going with FW download
4084e1bc9a0SAchim Leubner #ifdef IOCTL_INTERRUPT_TIME_CONFIG
4094e1bc9a0SAchim Leubner case IOCTL_MJ_CARD_PARAMETER:
4104e1bc9a0SAchim Leubner {
4114e1bc9a0SAchim Leubner switch( agIOCTLPayload->MinorFunction )
4124e1bc9a0SAchim Leubner {
4134e1bc9a0SAchim Leubner case IOCTL_MN_CARD_GET_INTERRUPT_CONFIG:
4144e1bc9a0SAchim Leubner {
4154e1bc9a0SAchim Leubner agsaInterruptConfigPage_t *pInterruptConfig = (agsaInterruptConfigPage_t *)&agIOCTLPayload->FunctionSpecificArea[0];
4164e1bc9a0SAchim Leubner status = saGetControllerConfig(agRoot,
4174e1bc9a0SAchim Leubner 0,
4184e1bc9a0SAchim Leubner AGSA_INTERRUPT_CONFIGURATION_PAGE,
4194e1bc9a0SAchim Leubner pInterruptConfig->vectorMask0,
4204e1bc9a0SAchim Leubner pInterruptConfig->vectorMask1,
4214e1bc9a0SAchim Leubner agParam2);
4224e1bc9a0SAchim Leubner if(status == AGSA_RC_SUCCESS) {
4234e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
4244e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
4254e1bc9a0SAchim Leubner } else {
4264e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
4274e1bc9a0SAchim Leubner }
4284e1bc9a0SAchim Leubner break;
4294e1bc9a0SAchim Leubner }
4304e1bc9a0SAchim Leubner case IOCTL_MN_CARD_GET_TIMER_CONFIG:
4314e1bc9a0SAchim Leubner status = saGetControllerConfig(agRoot, 0, AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE, 0, 0, agParam2);
4324e1bc9a0SAchim Leubner if(status == AGSA_RC_SUCCESS) {
4334e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
4344e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
4354e1bc9a0SAchim Leubner } else {
4364e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
4374e1bc9a0SAchim Leubner }
4384e1bc9a0SAchim Leubner break;
4394e1bc9a0SAchim Leubner }
4404e1bc9a0SAchim Leubner break;
4414e1bc9a0SAchim Leubner }
4424e1bc9a0SAchim Leubner #endif /* IOCTL_INTERRUPT_TIME_CONFIG */
4434e1bc9a0SAchim Leubner case IOCTL_MJ_INI_DRIVER_IDENTIFY:
4444e1bc9a0SAchim Leubner {
4454e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
4464e1bc9a0SAchim Leubner break;
4474e1bc9a0SAchim Leubner }
4484e1bc9a0SAchim Leubner case IOCTL_MJ_GET_DEVICE_LUN:
4494e1bc9a0SAchim Leubner status = tdsaGetNumOfLUNIOCTL(tiRoot,agIOCTLPayload, agParam1, agParam2, agParam3);
4504e1bc9a0SAchim Leubner if(status == IOCTL_CALL_SUCCESS)
4514e1bc9a0SAchim Leubner {
4524e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
4534e1bc9a0SAchim Leubner }
4544e1bc9a0SAchim Leubner break;
4554e1bc9a0SAchim Leubner case IOCTL_MJ_SMP_REQUEST:
4564e1bc9a0SAchim Leubner status = tdsaSendSMPIoctl(tiRoot, agIOCTLPayload,
4574e1bc9a0SAchim Leubner agParam1,agParam2,agParam3);
4584e1bc9a0SAchim Leubner break;
4594e1bc9a0SAchim Leubner
4604e1bc9a0SAchim Leubner case IOCTL_MJ_FW_CONTROL:
4614e1bc9a0SAchim Leubner {
4624e1bc9a0SAchim Leubner //ostiIOCTLClearSignal (tiRoot, &agParam1, &agParam2, &agParam3);
4634e1bc9a0SAchim Leubner status = tdipFWControlIoctl( tiRoot, agIOCTLPayload,
4644e1bc9a0SAchim Leubner agParam1, agParam2, agParam3);
4654e1bc9a0SAchim Leubner
4664e1bc9a0SAchim Leubner break;
4674e1bc9a0SAchim Leubner }
4684e1bc9a0SAchim Leubner //#ifdef EVENT_LOG_INFO_TESTING
4694e1bc9a0SAchim Leubner /* Reserved field in tiIOCTLPayload_t is used as offset */
4704e1bc9a0SAchim Leubner case IOCTL_MJ_GET_EVENT_LOG1:
4714e1bc9a0SAchim Leubner {
4724e1bc9a0SAchim Leubner switch (agIOCTLPayload->MinorFunction)
4734e1bc9a0SAchim Leubner {
4744e1bc9a0SAchim Leubner case IOCTL_MN_FW_GET_TRACE_BUFFER:
4754e1bc9a0SAchim Leubner {
4764e1bc9a0SAchim Leubner agsaControllerEventLog_t EventLog;
4774e1bc9a0SAchim Leubner saGetControllerEventLogInfo(agRoot, &EventLog);
4784e1bc9a0SAchim Leubner TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GET_EVENT_LOG1 Length %d\n", agIOCTLPayload->Length));
4794e1bc9a0SAchim Leubner RequestLength = agIOCTLPayload->Length;
4804e1bc9a0SAchim Leubner Offset = agIOCTLPayload->Reserved;
4814e1bc9a0SAchim Leubner EventLogLength = EventLog.eventLog1.totalLength;
4824e1bc9a0SAchim Leubner EventLogOption = EventLog.eventLog1Option;
4834e1bc9a0SAchim Leubner if (EventLogLength <= Offset)
4844e1bc9a0SAchim Leubner {
4854e1bc9a0SAchim Leubner TI_DBG1(("tiCOMMgntIOCTL: 1 out of range Requestlength %d Offset %d event log length %d\n", RequestLength, Offset, EventLogLength));
4864e1bc9a0SAchim Leubner // out of range
4874e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
4884e1bc9a0SAchim Leubner agIOCTLPayload->Length = 0;
4894e1bc9a0SAchim Leubner if(EventLogOption == 0)
4904e1bc9a0SAchim Leubner {
4914e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_FW_EVENTLOG_DISABLED;
4924e1bc9a0SAchim Leubner }
4934e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
4944e1bc9a0SAchim Leubner return status;
4954e1bc9a0SAchim Leubner }
4964e1bc9a0SAchim Leubner ReadLength = MIN(EventLogLength - Offset, RequestLength);
4974e1bc9a0SAchim Leubner loc = (bit8 *)EventLog.eventLog1.virtPtr + Offset;
4984e1bc9a0SAchim Leubner osti_memcpy(&(agIOCTLPayload->FunctionSpecificArea), loc, ReadLength);
4994e1bc9a0SAchim Leubner // tdhexdump("IOCTL_MJ_GET_EVENT_LOG1 first 32bytes", (bit8 *)&(agIOCTLPayload->FunctionSpecificArea), 32);
5004e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
5014e1bc9a0SAchim Leubner agIOCTLPayload->Length = (bit16)ReadLength;
5024e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
5034e1bc9a0SAchim Leubner break;
5044e1bc9a0SAchim Leubner }
5054e1bc9a0SAchim Leubner case IOCTL_MN_FW_GET_EVENT_FLASH_LOG1:
5064e1bc9a0SAchim Leubner {
5074e1bc9a0SAchim Leubner TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MN_FW_GET_EVENT_FLASH_LOG1\n"));
5084e1bc9a0SAchim Leubner status = tdsaRegDumpGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
5094e1bc9a0SAchim Leubner break;
5104e1bc9a0SAchim Leubner }
5114e1bc9a0SAchim Leubner }
5124e1bc9a0SAchim Leubner break;
5134e1bc9a0SAchim Leubner }
5144e1bc9a0SAchim Leubner
5154e1bc9a0SAchim Leubner case IOCTL_MJ_GET_EVENT_LOG2:
5164e1bc9a0SAchim Leubner {
5174e1bc9a0SAchim Leubner switch (agIOCTLPayload->MinorFunction)
5184e1bc9a0SAchim Leubner {
5194e1bc9a0SAchim Leubner case IOCTL_MN_FW_GET_TRACE_BUFFER:
5204e1bc9a0SAchim Leubner {
5214e1bc9a0SAchim Leubner agsaControllerEventLog_t EventLog;
5224e1bc9a0SAchim Leubner saGetControllerEventLogInfo(agRoot, &EventLog);
5234e1bc9a0SAchim Leubner TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GET_EVENT_LOG2 Length %d\n", agIOCTLPayload->Length));
5244e1bc9a0SAchim Leubner RequestLength = agIOCTLPayload->Length;
5254e1bc9a0SAchim Leubner Offset = agIOCTLPayload->Reserved;
5264e1bc9a0SAchim Leubner EventLogLength = EventLog.eventLog2.totalLength;
5274e1bc9a0SAchim Leubner EventLogOption = EventLog.eventLog2Option;
5284e1bc9a0SAchim Leubner if (EventLogLength <= Offset)
5294e1bc9a0SAchim Leubner {
5304e1bc9a0SAchim Leubner TI_DBG1(("tiCOMMgntIOCTL: 2 out of range Requestlength %d Offset %d event log length %d\n", RequestLength, Offset, EventLogLength));
5314e1bc9a0SAchim Leubner /* out of range */
5324e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
5334e1bc9a0SAchim Leubner agIOCTLPayload->Length = 0;
5344e1bc9a0SAchim Leubner if(EventLogOption == 0)
5354e1bc9a0SAchim Leubner {
5364e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_FW_EVENTLOG_DISABLED;
5374e1bc9a0SAchim Leubner }
5384e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
5394e1bc9a0SAchim Leubner return status;
5404e1bc9a0SAchim Leubner }
5414e1bc9a0SAchim Leubner ReadLength = MIN(EventLogLength - Offset, RequestLength);
5424e1bc9a0SAchim Leubner loc = (bit8 *)EventLog.eventLog2.virtPtr + Offset;
5434e1bc9a0SAchim Leubner osti_memcpy(&(agIOCTLPayload->FunctionSpecificArea), loc, ReadLength);
5444e1bc9a0SAchim Leubner // tdhexdump("IOCTL_MJ_GET_EVENT_LOG2 first 32bytes", (bit8 *)&(agIOCTLPayload->FunctionSpecificArea), 32);
5454e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
5464e1bc9a0SAchim Leubner agIOCTLPayload->Length = (bit16)ReadLength;
5474e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
5484e1bc9a0SAchim Leubner break;
5494e1bc9a0SAchim Leubner }
5504e1bc9a0SAchim Leubner case IOCTL_MN_FW_GET_EVENT_FLASH_LOG2:
5514e1bc9a0SAchim Leubner {
5524e1bc9a0SAchim Leubner TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MN_FW_GET_EVENT_FLASH_LOG2\n"));
5534e1bc9a0SAchim Leubner status = tdsaRegDumpGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
5544e1bc9a0SAchim Leubner break;
5554e1bc9a0SAchim Leubner }
5564e1bc9a0SAchim Leubner }
5574e1bc9a0SAchim Leubner break;
5584e1bc9a0SAchim Leubner }
5594e1bc9a0SAchim Leubner
5604e1bc9a0SAchim Leubner
5614e1bc9a0SAchim Leubner case IOCTL_MJ_FW_INFO:
5624e1bc9a0SAchim Leubner {
5634e1bc9a0SAchim Leubner agsaControllerInfo_t ControllerInfo;
5644e1bc9a0SAchim Leubner saGetControllerInfo(agRoot, &ControllerInfo);
5654e1bc9a0SAchim Leubner TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_FW_INFO Length %d\n", agIOCTLPayload->Length));
5664e1bc9a0SAchim Leubner RequestLength = agIOCTLPayload->Length;
5674e1bc9a0SAchim Leubner Offset = agIOCTLPayload->Reserved;
5684e1bc9a0SAchim Leubner if (RequestLength == 0)
5694e1bc9a0SAchim Leubner {
5704e1bc9a0SAchim Leubner TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_FW_INFO: No more Data!\n"));
5714e1bc9a0SAchim Leubner /* out of range */
5724e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
5734e1bc9a0SAchim Leubner agIOCTLPayload->Length = 0;
5744e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
5754e1bc9a0SAchim Leubner return status;
5764e1bc9a0SAchim Leubner }
5774e1bc9a0SAchim Leubner
5784e1bc9a0SAchim Leubner osti_memcpy((bit8*)&(agIOCTLPayload->FunctionSpecificArea), (bit8*)&ControllerInfo, sizeof(agsaControllerInfo_t));
5794e1bc9a0SAchim Leubner
5804e1bc9a0SAchim Leubner TI_DBG1(("tiCOMMgntIOCTL:IOCTL_MJ_FW_INFO ControllerInfo signature 0x%X\n",ControllerInfo.signature));
5814e1bc9a0SAchim Leubner TI_DBG1(("tiCOMMgntIOCTL:IOCTL_MJ_FW_INFO ControllerInfo PCILinkRate 0x%X\n",ControllerInfo.PCILinkRate));
5824e1bc9a0SAchim Leubner TI_DBG1(("tiCOMMgntIOCTL:IOCTL_MJ_FW_INFO ControllerInfo PCIWidth 0x%X\n",ControllerInfo.PCIWidth));
5834e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
5844e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
5854e1bc9a0SAchim Leubner break;
5864e1bc9a0SAchim Leubner
5874e1bc9a0SAchim Leubner }
5884e1bc9a0SAchim Leubner
5894e1bc9a0SAchim Leubner case IOCTL_MJ_GET_FW_REV:
5904e1bc9a0SAchim Leubner {
5914e1bc9a0SAchim Leubner agsaControllerInfo_t ControllerInfo;
5924e1bc9a0SAchim Leubner saGetControllerInfo(agRoot, &ControllerInfo);
5934e1bc9a0SAchim Leubner TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_FW_REV Length %d\n", agIOCTLPayload->Length));
5944e1bc9a0SAchim Leubner RequestLength = agIOCTLPayload->Length;
5954e1bc9a0SAchim Leubner Offset = agIOCTLPayload->Reserved;
5964e1bc9a0SAchim Leubner if (RequestLength == 0)
5974e1bc9a0SAchim Leubner {
5984e1bc9a0SAchim Leubner TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_GET_FW_REV: No more Data!\n"));
5994e1bc9a0SAchim Leubner /* out of range */
6004e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
6014e1bc9a0SAchim Leubner agIOCTLPayload->Length = 0;
6024e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
6034e1bc9a0SAchim Leubner return status;
6044e1bc9a0SAchim Leubner }
6054e1bc9a0SAchim Leubner
6064e1bc9a0SAchim Leubner osti_memcpy((bit8*)&(agIOCTLPayload->FunctionSpecificArea), (bit8*)&ControllerInfo.fwRevision, sizeof(bit32));
6074e1bc9a0SAchim Leubner loc = (bit8 *)&(agIOCTLPayload->FunctionSpecificArea)+ sizeof(bit32);
6084e1bc9a0SAchim Leubner osti_memcpy(loc, (bit8*)&ControllerInfo.sdkRevision, sizeof(bit32));
6094e1bc9a0SAchim Leubner
6104e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
6114e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
6124e1bc9a0SAchim Leubner break;
6134e1bc9a0SAchim Leubner
6144e1bc9a0SAchim Leubner }
6154e1bc9a0SAchim Leubner
6164e1bc9a0SAchim Leubner #ifdef SPC_ENABLE_PROFILE
6174e1bc9a0SAchim Leubner case IOCTL_MJ_FW_PROFILE:
6184e1bc9a0SAchim Leubner {
6194e1bc9a0SAchim Leubner TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_FW_PROFILE\n"));
6204e1bc9a0SAchim Leubner status = tdipFWProfileIoctl( tiRoot, agIOCTLPayload,
6214e1bc9a0SAchim Leubner agParam1, agParam2, agParam3);
6224e1bc9a0SAchim Leubner break;
6234e1bc9a0SAchim Leubner }
6244e1bc9a0SAchim Leubner #endif /* SPC_ENABLE_PROFILE */
6254e1bc9a0SAchim Leubner
6264e1bc9a0SAchim Leubner case IOCTL_MJ_GET_CORE_DUMP:
6274e1bc9a0SAchim Leubner {
6284e1bc9a0SAchim Leubner TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GET_CORE_DUMP\n"));
6294e1bc9a0SAchim Leubner if (tiIS_SPC(agRoot))
6304e1bc9a0SAchim Leubner {
6314e1bc9a0SAchim Leubner status = tdsaRegDumpGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
6324e1bc9a0SAchim Leubner }
6334e1bc9a0SAchim Leubner else
6344e1bc9a0SAchim Leubner {
6354e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
6364e1bc9a0SAchim Leubner status = IOCTL_CALL_SUCCESS;
6374e1bc9a0SAchim Leubner }
6384e1bc9a0SAchim Leubner break;
6394e1bc9a0SAchim Leubner }
6404e1bc9a0SAchim Leubner //#endif
6414e1bc9a0SAchim Leubner case IOCTL_MJ_NVMD_SET:
6424e1bc9a0SAchim Leubner {
6434e1bc9a0SAchim Leubner bit8 nvmDev;
6444e1bc9a0SAchim Leubner TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_NVMD_SET\n"));
6454e1bc9a0SAchim Leubner nvmDev = (bit8) agIOCTLPayload->Status;
6464e1bc9a0SAchim Leubner agIOCTLPayload->Status = 0;
6474e1bc9a0SAchim Leubner status = tdsaNVMDSetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, &nvmDev);
6484e1bc9a0SAchim Leubner break;
6494e1bc9a0SAchim Leubner }
6504e1bc9a0SAchim Leubner #if 0
6514e1bc9a0SAchim Leubner case IOCTL_MJ_GPIO:
6524e1bc9a0SAchim Leubner {
6534e1bc9a0SAchim Leubner bit32 sVid =0;
6544e1bc9a0SAchim Leubner TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GPIO\n"));
6554e1bc9a0SAchim Leubner
6564e1bc9a0SAchim Leubner /* Get Subsystem vendor */
6574e1bc9a0SAchim Leubner sVid = ostiChipConfigReadBit32(tiRoot,0x2C);
6584e1bc9a0SAchim Leubner sVid = sVid & 0xFFFF;
6594e1bc9a0SAchim Leubner
6604e1bc9a0SAchim Leubner /* GPIO is only intended for chip down design
6614e1bc9a0SAchim Leubner * therefore it's only applies to 8H/SPCv product family
6624e1bc9a0SAchim Leubner */
6634e1bc9a0SAchim Leubner if(sVid == 0x9005)
6644e1bc9a0SAchim Leubner return IOCTL_CALL_INVALID_DEVICE;
6654e1bc9a0SAchim Leubner
6664e1bc9a0SAchim Leubner status = tdsaGpioSetup(tiRoot, agContext, agIOCTLPayload, agParam1, agParam2);
6674e1bc9a0SAchim Leubner if(status == IOCTL_CALL_SUCCESS)
6684e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING; /* Wait for response from the Controller */
6694e1bc9a0SAchim Leubner else
6704e1bc9a0SAchim Leubner return status;
6714e1bc9a0SAchim Leubner
6724e1bc9a0SAchim Leubner break;
6734e1bc9a0SAchim Leubner }
6744e1bc9a0SAchim Leubner #endif
6754e1bc9a0SAchim Leubner
6764e1bc9a0SAchim Leubner case IOCTL_MJ_SGPIO:
6774e1bc9a0SAchim Leubner {
6784e1bc9a0SAchim Leubner TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_SGPIO\n"));
6794e1bc9a0SAchim Leubner status = tdsaSGpioIoctlSetup(tiRoot, agContext, agIOCTLPayload, agParam1, agParam2);
6804e1bc9a0SAchim Leubner break;
6814e1bc9a0SAchim Leubner }
6824e1bc9a0SAchim Leubner
6834e1bc9a0SAchim Leubner case IOCTL_MJ_NVMD_GET:
6844e1bc9a0SAchim Leubner {
6854e1bc9a0SAchim Leubner bit8 nvmDev;
6864e1bc9a0SAchim Leubner TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_NVMD_GET\n"));
6874e1bc9a0SAchim Leubner nvmDev = (bit8) agIOCTLPayload->Status;
6884e1bc9a0SAchim Leubner agIOCTLPayload->Status = 0;
6894e1bc9a0SAchim Leubner status = tdsaNVMDGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, &nvmDev);
6904e1bc9a0SAchim Leubner break;
6914e1bc9a0SAchim Leubner }
6924e1bc9a0SAchim Leubner
6934e1bc9a0SAchim Leubner case IOCTL_MJ_GET_FORENSIC_DATA:
6944e1bc9a0SAchim Leubner {
6954e1bc9a0SAchim Leubner TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_FORENSIC_DATA\n"));
6964e1bc9a0SAchim Leubner status = tdsaForensicDataGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
6974e1bc9a0SAchim Leubner break;
6984e1bc9a0SAchim Leubner }
6994e1bc9a0SAchim Leubner case IOCTL_MJ_GET_DEVICE_INFO:
7004e1bc9a0SAchim Leubner {
7014e1bc9a0SAchim Leubner TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_DEVICE_INFO\n"));
7024e1bc9a0SAchim Leubner status = tdsaDeviceInfoGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
7034e1bc9a0SAchim Leubner break;
7044e1bc9a0SAchim Leubner }
7054e1bc9a0SAchim Leubner
7064e1bc9a0SAchim Leubner case IOCTL_MJ_GET_IO_ERROR_STATISTIC:
7074e1bc9a0SAchim Leubner {
7084e1bc9a0SAchim Leubner TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_IO_ERROR_STATISTIC\n"));
7094e1bc9a0SAchim Leubner status = tdsaIoErrorStatisticGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
7104e1bc9a0SAchim Leubner break;
7114e1bc9a0SAchim Leubner }
7124e1bc9a0SAchim Leubner
7134e1bc9a0SAchim Leubner case IOCTL_MJ_GET_IO_EVENT_STATISTIC:
7144e1bc9a0SAchim Leubner {
7154e1bc9a0SAchim Leubner TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_IO_EVENT_STATISTIC\n"));
7164e1bc9a0SAchim Leubner status = tdsaIoEventStatisticGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
7174e1bc9a0SAchim Leubner break;
7184e1bc9a0SAchim Leubner }
7194e1bc9a0SAchim Leubner
7204e1bc9a0SAchim Leubner case IOCTL_MJ_SEND_BIST:
7214e1bc9a0SAchim Leubner {
7224e1bc9a0SAchim Leubner TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_SEND_BIST\n"));
7234e1bc9a0SAchim Leubner status = tdsaSendBISTIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
7244e1bc9a0SAchim Leubner break;
7254e1bc9a0SAchim Leubner }
7264e1bc9a0SAchim Leubner
7274e1bc9a0SAchim Leubner #if 0
7284e1bc9a0SAchim Leubner case IOCTL_MJ_SET_OR_GET_REGISTER:
7294e1bc9a0SAchim Leubner {
7304e1bc9a0SAchim Leubner TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_SET_OR_GET_REGISTER\n"));
7314e1bc9a0SAchim Leubner status = tdsaRegisterIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
7324e1bc9a0SAchim Leubner break;
7334e1bc9a0SAchim Leubner }
7344e1bc9a0SAchim Leubner
7354e1bc9a0SAchim Leubner #endif
7364e1bc9a0SAchim Leubner case IOCTL_MJ_PHY_DETAILS:
7374e1bc9a0SAchim Leubner {
7384e1bc9a0SAchim Leubner PhyDetails_t *PhyDetails = (PhyDetails_t*)&agIOCTLPayload->FunctionSpecificArea;
7394e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootNonInt);
7404e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7414e1bc9a0SAchim Leubner bit8 *sasAddressHi;
7424e1bc9a0SAchim Leubner bit8 *sasAddressLo;
7434e1bc9a0SAchim Leubner bit8 sas_dev_type;
7444e1bc9a0SAchim Leubner int i = 0;
7454e1bc9a0SAchim Leubner
7464e1bc9a0SAchim Leubner tiIniGetDirectSataSasAddr(tiRoot, i , &sasAddressHi, &sasAddressLo);
7474e1bc9a0SAchim Leubner for( i = 0; i < saRoot->phyCount ; i++)
7484e1bc9a0SAchim Leubner {
7494e1bc9a0SAchim Leubner PhyDetails[i].attached_phy = saRoot->phys[i].sasIdentify.phyIdentifier;
7504e1bc9a0SAchim Leubner /* deice types
7514e1bc9a0SAchim Leubner * SAS
7524e1bc9a0SAchim Leubner * 0x01 - Sas end device
7534e1bc9a0SAchim Leubner * 0x02 - Expander device
7544e1bc9a0SAchim Leubner * SATA
7554e1bc9a0SAchim Leubner * 0x11 - Sata
7564e1bc9a0SAchim Leubner * NO DEVICE 0x00
7574e1bc9a0SAchim Leubner */
7584e1bc9a0SAchim Leubner sas_dev_type = (saRoot->phys[i].sasIdentify.deviceType_addressFrameType & 0x70 ) >> 4 ;
7594e1bc9a0SAchim Leubner if ((saRoot->phys[i].status == 1) && (sas_dev_type == 0)){ //status 1 - Phy Up
7604e1bc9a0SAchim Leubner //Sata phy
7614e1bc9a0SAchim Leubner PhyDetails[i].attached_dev_type = SAS_PHY_SATA_DEVICE;//0x11 for sata end device
7624e1bc9a0SAchim Leubner osti_memcpy(&PhyDetails[i].attached_sasAddressHi, tdsaAllShared->Ports[i].SASID.sasAddressHi, sizeof(bit32));
7634e1bc9a0SAchim Leubner osti_memcpy(&PhyDetails[i].attached_sasAddressLo, tdsaAllShared->Ports[i].SASID.sasAddressLo, sizeof(bit32));
7644e1bc9a0SAchim Leubner PhyDetails[i].attached_sasAddressLo[3] += i + 16;
7654e1bc9a0SAchim Leubner }
7664e1bc9a0SAchim Leubner else {
7674e1bc9a0SAchim Leubner PhyDetails[i].attached_dev_type = sas_dev_type;
7684e1bc9a0SAchim Leubner osti_memcpy(&PhyDetails[i].attached_sasAddressHi, saRoot->phys[i].sasIdentify.sasAddressHi, sizeof(bit32));
7694e1bc9a0SAchim Leubner osti_memcpy(&PhyDetails[i].attached_sasAddressLo, saRoot->phys[i].sasIdentify.sasAddressLo, sizeof(bit32));
7704e1bc9a0SAchim Leubner }
7714e1bc9a0SAchim Leubner osti_memcpy(&PhyDetails[i].sasAddressLo,&(tdsaAllShared->Ports[i].SASID.sasAddressLo), sizeof(bit32));
7724e1bc9a0SAchim Leubner osti_memcpy(&PhyDetails[i].sasAddressHi,&(tdsaAllShared->Ports[i].SASID.sasAddressHi), sizeof(bit32));
7734e1bc9a0SAchim Leubner }
7744e1bc9a0SAchim Leubner
7754e1bc9a0SAchim Leubner // osti_memcpy(&agIoctlPayload->FunctionSpecificArea,&PhyInfo, sizeof(agsaSGpioReqResponse_t));
7764e1bc9a0SAchim Leubner // printk("Ioctl success\n");
7774e1bc9a0SAchim Leubner return IOCTL_CALL_SUCCESS;
7784e1bc9a0SAchim Leubner }
7794e1bc9a0SAchim Leubner
7804e1bc9a0SAchim Leubner case IOCTL_MJ_PHY_GENERAL_STATUS:
7814e1bc9a0SAchim Leubner {
7824e1bc9a0SAchim Leubner agsaPhyGeneralState_t *PhyData=NULL;
7834e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_FAILURE;
7844e1bc9a0SAchim Leubner PhyData = (agsaPhyGeneralState_t*) &agIOCTLPayload->FunctionSpecificArea[0];
7854e1bc9a0SAchim Leubner
7864e1bc9a0SAchim Leubner PhyData->Reserved2 = 0;
7874e1bc9a0SAchim Leubner /* Validate the length */
7884e1bc9a0SAchim Leubner if (agIOCTLPayload->Length < sizeof(agsaPhyGeneralState_t))
7894e1bc9a0SAchim Leubner {
7904e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
7914e1bc9a0SAchim Leubner break;
7924e1bc9a0SAchim Leubner }
7934e1bc9a0SAchim Leubner
7944e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
7954e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
7964e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
7974e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
7984e1bc9a0SAchim Leubner //tdsaAllShared->tdFWControlEx.usrAddr = PhyData;
7994e1bc9a0SAchim Leubner
8004e1bc9a0SAchim Leubner ret = tdsaGetPhyGeneralStatusIoctl(tiRoot,PhyData);
8014e1bc9a0SAchim Leubner if(ret == AGSA_RC_FAILURE)
8024e1bc9a0SAchim Leubner {
8034e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
8044e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = NULL;
8054e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
8064e1bc9a0SAchim Leubner break;
8074e1bc9a0SAchim Leubner }
8084e1bc9a0SAchim Leubner else if(ret == IOCTL_ERR_STATUS_NOT_SUPPORTED)
8094e1bc9a0SAchim Leubner {
8104e1bc9a0SAchim Leubner
8114e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
8124e1bc9a0SAchim Leubner status = IOCTL_CALL_SUCCESS;
8134e1bc9a0SAchim Leubner break;
8144e1bc9a0SAchim Leubner }
8154e1bc9a0SAchim Leubner
8164e1bc9a0SAchim Leubner //status = IOCTL_CALL_PENDING;
8174e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
8184e1bc9a0SAchim Leubner }
8194e1bc9a0SAchim Leubner
8204e1bc9a0SAchim Leubner break;
8214e1bc9a0SAchim Leubner #if 1
8224e1bc9a0SAchim Leubner case IOCTL_MJ_GET_PHY_PROFILE:
8234e1bc9a0SAchim Leubner {
8244e1bc9a0SAchim Leubner TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_GET_PHY_PROFILE %p %p %p\n",agParam1,agParam2,agParam3));
8254e1bc9a0SAchim Leubner status = tdsaPhyProfileIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
8264e1bc9a0SAchim Leubner break;
8274e1bc9a0SAchim Leubner }
8284e1bc9a0SAchim Leubner #endif
8294e1bc9a0SAchim Leubner case IOCTL_MJ_LL_TRACING:
8304e1bc9a0SAchim Leubner {
8314e1bc9a0SAchim Leubner void * stu = &agIOCTLPayload->FunctionSpecificArea[0];
8324e1bc9a0SAchim Leubner switch(agIOCTLPayload->MinorFunction)
8334e1bc9a0SAchim Leubner {
8344e1bc9a0SAchim Leubner
8354e1bc9a0SAchim Leubner case IOCTL_MN_LL_RESET_TRACE_INDEX:
8364e1bc9a0SAchim Leubner {
8374e1bc9a0SAchim Leubner
8384e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS
8394e1bc9a0SAchim Leubner TSTMTID_TRACE_BUFFER_RESET *llist = (TSTMTID_TRACE_BUFFER_RESET *)stu;
8404e1bc9a0SAchim Leubner hpTraceBufferParms_t BufferParms;
8414e1bc9a0SAchim Leubner TI_DBG5(("tdReturnIOCTL_Info: hpIOCTL_ResetTraceIndex\n"));
8424e1bc9a0SAchim Leubner
8434e1bc9a0SAchim Leubner BufferParms.TraceCompiled = 0;
8444e1bc9a0SAchim Leubner BufferParms.TraceWrap = 0;
8454e1bc9a0SAchim Leubner BufferParms.CurrentTraceIndexWrapCount = 0;
8464e1bc9a0SAchim Leubner BufferParms.BufferSize = 0;
8474e1bc9a0SAchim Leubner BufferParms.CurrentIndex = 0;
8484e1bc9a0SAchim Leubner BufferParms.pTrace = NULL;
8494e1bc9a0SAchim Leubner BufferParms.pTraceIndexWrapCount = NULL;
8504e1bc9a0SAchim Leubner BufferParms.pTraceMask = NULL;
8514e1bc9a0SAchim Leubner BufferParms.pCurrentTraceIndex = NULL;
8524e1bc9a0SAchim Leubner
8534e1bc9a0SAchim Leubner smTraceGetInfo(agRoot,&BufferParms);
8544e1bc9a0SAchim Leubner TI_DBG5(("tdReturnIOCTL_Info: pTrace %p\n",BufferParms.pTrace));
8554e1bc9a0SAchim Leubner TI_DBG5(("tdReturnIOCTL_Info: pCurrentTraceIndex %p %X\n",BufferParms.pCurrentTraceIndex,*BufferParms.pCurrentTraceIndex));
8564e1bc9a0SAchim Leubner TI_DBG5(("tdReturnIOCTL_Info: pTraceIndexWrapCount %p %X\n",BufferParms.pTraceIndexWrapCount,*BufferParms.pTraceIndexWrapCount));
8574e1bc9a0SAchim Leubner TI_DBG5(("tdReturnIOCTL_Info: pTraceMask %p %X\n",BufferParms.pTraceMask,*BufferParms.pTraceMask));
8584e1bc9a0SAchim Leubner
8594e1bc9a0SAchim Leubner if( llist->Flag != 0)
8604e1bc9a0SAchim Leubner {
8614e1bc9a0SAchim Leubner if( llist->TraceMask != *BufferParms.pTraceMask)
8624e1bc9a0SAchim Leubner {
8634e1bc9a0SAchim Leubner smTraceSetMask(agRoot, llist->TraceMask );
8644e1bc9a0SAchim Leubner }
8654e1bc9a0SAchim Leubner }
8664e1bc9a0SAchim Leubner if( llist->Reset)
8674e1bc9a0SAchim Leubner {
8684e1bc9a0SAchim Leubner
8694e1bc9a0SAchim Leubner *BufferParms.pCurrentTraceIndex = 0;
8704e1bc9a0SAchim Leubner smResetTraceBuffer(agRoot);
8714e1bc9a0SAchim Leubner
8724e1bc9a0SAchim Leubner *BufferParms.pCurrentTraceIndex = 0;
8734e1bc9a0SAchim Leubner *BufferParms.pTraceIndexWrapCount =0;
8744e1bc9a0SAchim Leubner llist->TraceMask = *BufferParms.pTraceMask;
8754e1bc9a0SAchim Leubner }
8764e1bc9a0SAchim Leubner #endif /* SA_ENABLE_TRACE_FUNCTIONS */
8774e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
8784e1bc9a0SAchim Leubner status = IOCTL_CALL_SUCCESS;
8794e1bc9a0SAchim Leubner
8804e1bc9a0SAchim Leubner }
8814e1bc9a0SAchim Leubner break;
8824e1bc9a0SAchim Leubner
8834e1bc9a0SAchim Leubner case IOCTL_MN_LL_GET_TRACE_BUFFER_INFO:
8844e1bc9a0SAchim Leubner {
8854e1bc9a0SAchim Leubner hpTraceBufferParms_t BufferParms;
8864e1bc9a0SAchim Leubner TSTMTID_TRACE_BUFFER_INFO *llist = (TSTMTID_TRACE_BUFFER_INFO *)stu;
8874e1bc9a0SAchim Leubner TI_DBG5(("tdReturnIOCTL_Info: hpIOCTL_GetTraceBufferInfo\n"));
8884e1bc9a0SAchim Leubner
8894e1bc9a0SAchim Leubner
8904e1bc9a0SAchim Leubner BufferParms.TraceCompiled = 0;
8914e1bc9a0SAchim Leubner BufferParms.TraceWrap = 0;
8924e1bc9a0SAchim Leubner BufferParms.CurrentTraceIndexWrapCount = 0;
8934e1bc9a0SAchim Leubner BufferParms.BufferSize = 0;
8944e1bc9a0SAchim Leubner BufferParms.CurrentIndex = 0;
8954e1bc9a0SAchim Leubner BufferParms.pTrace = NULL;
8964e1bc9a0SAchim Leubner BufferParms.pTraceMask = NULL;
8974e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS
8984e1bc9a0SAchim Leubner smTraceGetInfo(agRoot,&BufferParms);
8994e1bc9a0SAchim Leubner #endif /* SA_ENABLE_TRACE_FUNCTIONS not enabled */
9004e1bc9a0SAchim Leubner llist->TraceCompiled = BufferParms.TraceCompiled;
9014e1bc9a0SAchim Leubner llist->BufferSize = BufferParms.BufferSize;
9024e1bc9a0SAchim Leubner llist->CurrentIndex = BufferParms.CurrentIndex ;
9034e1bc9a0SAchim Leubner llist->CurrentTraceIndexWrapCount = BufferParms.CurrentTraceIndexWrapCount;
9044e1bc9a0SAchim Leubner llist->TraceWrap = BufferParms.TraceWrap;
9054e1bc9a0SAchim Leubner if(BufferParms.pTraceMask != NULL)
9064e1bc9a0SAchim Leubner {
9074e1bc9a0SAchim Leubner llist->TraceMask = *BufferParms.pTraceMask;
9084e1bc9a0SAchim Leubner }
9094e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
9104e1bc9a0SAchim Leubner status = IOCTL_CALL_SUCCESS;
9114e1bc9a0SAchim Leubner }
9124e1bc9a0SAchim Leubner break;
9134e1bc9a0SAchim Leubner
9144e1bc9a0SAchim Leubner case IOCTL_MN_LL_GET_TRACE_BUFFER:
9154e1bc9a0SAchim Leubner {
9164e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS
9174e1bc9a0SAchim Leubner TSTMTID_TRACE_BUFFER_FETCH *llist = (TSTMTID_TRACE_BUFFER_FETCH *)stu;
9184e1bc9a0SAchim Leubner
9194e1bc9a0SAchim Leubner hpTraceBufferParms_t BufferParms;
9204e1bc9a0SAchim Leubner bit32 c= 0;
9214e1bc9a0SAchim Leubner
9224e1bc9a0SAchim Leubner BufferParms.TraceCompiled = 0;
9234e1bc9a0SAchim Leubner BufferParms.TraceWrap = 0;
9244e1bc9a0SAchim Leubner BufferParms.CurrentTraceIndexWrapCount = 0;
9254e1bc9a0SAchim Leubner BufferParms.BufferSize = 0;
9264e1bc9a0SAchim Leubner BufferParms.CurrentIndex = 0;
9274e1bc9a0SAchim Leubner BufferParms.pTrace = NULL;
9284e1bc9a0SAchim Leubner smTraceGetInfo(agRoot,&BufferParms);
9294e1bc9a0SAchim Leubner
9304e1bc9a0SAchim Leubner TI_DBG6(("tdReturnIOCTL_Info: hpIOCTL_GetTraceBuffer\n"));
9314e1bc9a0SAchim Leubner
9324e1bc9a0SAchim Leubner if(llist->LowFence != LowFence32Bits)
9334e1bc9a0SAchim Leubner {
9344e1bc9a0SAchim Leubner break;
9354e1bc9a0SAchim Leubner }
9364e1bc9a0SAchim Leubner if(llist->HighFence != HighFence32Bits)
9374e1bc9a0SAchim Leubner {
9384e1bc9a0SAchim Leubner break;
9394e1bc9a0SAchim Leubner }
9404e1bc9a0SAchim Leubner
9414e1bc9a0SAchim Leubner if(llist->BufferOffsetBegin + FetchBufferSIZE > BufferParms.BufferSize )
9424e1bc9a0SAchim Leubner {
9434e1bc9a0SAchim Leubner }
9444e1bc9a0SAchim Leubner
9454e1bc9a0SAchim Leubner for ( c=0; c < FetchBufferSIZE;c++)
9464e1bc9a0SAchim Leubner {
9474e1bc9a0SAchim Leubner llist->Data[c] = *(BufferParms.pTrace+( c + llist->BufferOffsetBegin));
9484e1bc9a0SAchim Leubner }
9494e1bc9a0SAchim Leubner #endif /* SA_ENABLE_TRACE_FUNCTIONS not enabled */
9504e1bc9a0SAchim Leubner }
9514e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
9524e1bc9a0SAchim Leubner status = IOCTL_CALL_SUCCESS;
9534e1bc9a0SAchim Leubner break;
9544e1bc9a0SAchim Leubner }
9554e1bc9a0SAchim Leubner break;
9564e1bc9a0SAchim Leubner }
9574e1bc9a0SAchim Leubner
9584e1bc9a0SAchim Leubner #ifdef SA_LL_API_TEST
9594e1bc9a0SAchim Leubner case IOCTL_MJ_LL_API_TEST:
9604e1bc9a0SAchim Leubner {
9614e1bc9a0SAchim Leubner status = tdLlApiTestIoctl( tiRoot, agIOCTLPayload,
9624e1bc9a0SAchim Leubner agParam1,agParam2,agParam3 );
9634e1bc9a0SAchim Leubner break;
9644e1bc9a0SAchim Leubner }
9654e1bc9a0SAchim Leubner
9664e1bc9a0SAchim Leubner #endif /* SA_LL_API_TEST */
9674e1bc9a0SAchim Leubner
9684e1bc9a0SAchim Leubner case IOCTL_MJ_MODE_CTL_PAGE:
9694e1bc9a0SAchim Leubner {
9704e1bc9a0SAchim Leubner /* The SPCv controller has some options accessed via mode pages */
9714e1bc9a0SAchim Leubner tiEncryptDekConfigPage_t *pModePage= (tiEncryptDekConfigPage_t *) &agIOCTLPayload->FunctionSpecificArea[0];
9724e1bc9a0SAchim Leubner bit32 pageLength = 0;
9734e1bc9a0SAchim Leubner bit32 pageCode;
9744e1bc9a0SAchim Leubner bit32 modeOperation;
9754e1bc9a0SAchim Leubner
9764e1bc9a0SAchim Leubner pageCode = pModePage->pageCode & 0xFF;
9774e1bc9a0SAchim Leubner modeOperation = *(bit32 *) agParam2;
9784e1bc9a0SAchim Leubner
9794e1bc9a0SAchim Leubner switch(modeOperation)
9804e1bc9a0SAchim Leubner {
9814e1bc9a0SAchim Leubner
9824e1bc9a0SAchim Leubner case tiModePageSet:
9834e1bc9a0SAchim Leubner switch (pageCode)
9844e1bc9a0SAchim Leubner {
9854e1bc9a0SAchim Leubner case TI_ENCRYPTION_DEK_CONFIG_PAGE:
9864e1bc9a0SAchim Leubner pageLength = sizeof(tiEncryptDekConfigPage_t);
9874e1bc9a0SAchim Leubner break;
9884e1bc9a0SAchim Leubner
9894e1bc9a0SAchim Leubner case TI_ENCRYPTION_CONTROL_PARM_PAGE:
9904e1bc9a0SAchim Leubner pageLength = sizeof(tiEncryptControlParamPage_t);
9914e1bc9a0SAchim Leubner break;
9924e1bc9a0SAchim Leubner
9934e1bc9a0SAchim Leubner case TI_ENCRYPTION_GENERAL_CONFIG_PAGE:
9944e1bc9a0SAchim Leubner /* Pages are currently unsupported */
9954e1bc9a0SAchim Leubner pageLength = 0;
9964e1bc9a0SAchim Leubner break;
9974e1bc9a0SAchim Leubner }
9984e1bc9a0SAchim Leubner
9994e1bc9a0SAchim Leubner status = saSetControllerConfig(agRoot, 0, pageCode, pageLength, pModePage, (agsaContext_t *)agIOCTLPayload);
10004e1bc9a0SAchim Leubner break;
10014e1bc9a0SAchim Leubner
10024e1bc9a0SAchim Leubner case tiModePageGet:
10034e1bc9a0SAchim Leubner status = saGetControllerConfig(agRoot, 0, pageCode, 0, 0, (agsaContext_t *)agIOCTLPayload);
10044e1bc9a0SAchim Leubner break;
10054e1bc9a0SAchim Leubner
10064e1bc9a0SAchim Leubner default:
10074e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
10084e1bc9a0SAchim Leubner }
10094e1bc9a0SAchim Leubner }
10104e1bc9a0SAchim Leubner break;
10114e1bc9a0SAchim Leubner #ifdef PHY_RESTART_TEST
10124e1bc9a0SAchim Leubner case IOCTL_MJ_PORT_START:
10134e1bc9a0SAchim Leubner {
10144e1bc9a0SAchim Leubner bit32 portID, tiStatus;
10154e1bc9a0SAchim Leubner bit32 *data = (bit32*) &agIOCTLPayload->FunctionSpecificArea[0];
10164e1bc9a0SAchim Leubner portID = *data;
10174e1bc9a0SAchim Leubner
10184e1bc9a0SAchim Leubner tiStatus = tiCOMPortStart(tiRoot, portID, tdsaAllShared->Ports[portID].tiPortalContext, 0);
10194e1bc9a0SAchim Leubner
10204e1bc9a0SAchim Leubner if (tiStatus == tiSuccess)
10214e1bc9a0SAchim Leubner {
10224e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
10234e1bc9a0SAchim Leubner }
10244e1bc9a0SAchim Leubner else
10254e1bc9a0SAchim Leubner {
10264e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
10274e1bc9a0SAchim Leubner }
10284e1bc9a0SAchim Leubner status = IOCTL_CALL_SUCCESS;
10294e1bc9a0SAchim Leubner break;
10304e1bc9a0SAchim Leubner }
10314e1bc9a0SAchim Leubner
10324e1bc9a0SAchim Leubner case IOCTL_MJ_PORT_STOP:
10334e1bc9a0SAchim Leubner {
10344e1bc9a0SAchim Leubner bit32 portID, tiStatus;
10354e1bc9a0SAchim Leubner bit32 *data = (bit32*) &agIOCTLPayload->FunctionSpecificArea[0];
10364e1bc9a0SAchim Leubner portID = *data;
10374e1bc9a0SAchim Leubner
10384e1bc9a0SAchim Leubner tiStatus = tiCOMPortStop(tiRoot, tdsaAllShared->Ports[portID].tiPortalContext);
10394e1bc9a0SAchim Leubner if (tiStatus == tiSuccess)
10404e1bc9a0SAchim Leubner {
10414e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
10424e1bc9a0SAchim Leubner }
10434e1bc9a0SAchim Leubner else
10444e1bc9a0SAchim Leubner {
10454e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
10464e1bc9a0SAchim Leubner }
10474e1bc9a0SAchim Leubner
10484e1bc9a0SAchim Leubner status = IOCTL_CALL_SUCCESS;
10494e1bc9a0SAchim Leubner break;
10504e1bc9a0SAchim Leubner }
10514e1bc9a0SAchim Leubner #endif
10524e1bc9a0SAchim Leubner case IOCTL_MJ_SEND_TMF:
10534e1bc9a0SAchim Leubner switch(agIOCTLPayload->MinorFunction)
10544e1bc9a0SAchim Leubner {
10554e1bc9a0SAchim Leubner case IOCTL_MN_TMF_DEVICE_RESET:
10564e1bc9a0SAchim Leubner status = tdsaSendTMFIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, AG_TARGET_WARM_RESET);
10574e1bc9a0SAchim Leubner break;
10584e1bc9a0SAchim Leubner case IOCTL_MN_TMF_LUN_RESET:
10594e1bc9a0SAchim Leubner status = tdsaSendTMFIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, AG_LOGICAL_UNIT_RESET);
10604e1bc9a0SAchim Leubner break;
10614e1bc9a0SAchim Leubner }
10624e1bc9a0SAchim Leubner break;
10634e1bc9a0SAchim Leubner case IOCTL_MJ_GET_DRIVER_VERSION:
10644e1bc9a0SAchim Leubner osti_sprintf(agIOCTLPayload->FunctionSpecificArea, "%s", AGTIAPI_DRIVER_VERSION);
10654e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
10664e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
10674e1bc9a0SAchim Leubner break;
10684e1bc9a0SAchim Leubner default:
10694e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
10704e1bc9a0SAchim Leubner break;
10714e1bc9a0SAchim Leubner }
10724e1bc9a0SAchim Leubner
10734e1bc9a0SAchim Leubner return status;
10744e1bc9a0SAchim Leubner }
10754e1bc9a0SAchim Leubner
10764e1bc9a0SAchim Leubner #if 0
10774e1bc9a0SAchim Leubner /*****************************************************************************
10784e1bc9a0SAchim Leubner *
10794e1bc9a0SAchim Leubner * tdsaGpioSetup
10804e1bc9a0SAchim Leubner *
10814e1bc9a0SAchim Leubner * Purpose: This routine is called to set Gpio parameters to the controller.
10824e1bc9a0SAchim Leubner *
10834e1bc9a0SAchim Leubner * Parameters:
10844e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
10854e1bc9a0SAchim Leubner * agsaContext_t :
10864e1bc9a0SAchim Leubner * tiIOCTLPayload_t : ioctl header with payload gpio info
10874e1bc9a0SAchim Leubner * agParam1,agParam2 : Generic parameters
10884e1bc9a0SAchim Leubner *
10894e1bc9a0SAchim Leubner * Return: status
10904e1bc9a0SAchim Leubner *
10914e1bc9a0SAchim Leubner *
10924e1bc9a0SAchim Leubner *****************************************************************************/
10934e1bc9a0SAchim Leubner osGLOBAL bit32
10944e1bc9a0SAchim Leubner tdsaGpioSetup(
10954e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
10964e1bc9a0SAchim Leubner agsaContext_t *agContext,
10974e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
10984e1bc9a0SAchim Leubner void *agParam1,
10994e1bc9a0SAchim Leubner void *agParam2
11004e1bc9a0SAchim Leubner )
11014e1bc9a0SAchim Leubner {
11024e1bc9a0SAchim Leubner
11034e1bc9a0SAchim Leubner tdsaTimerRequest_t *osIoctlTimer;
11044e1bc9a0SAchim Leubner agsaGpioEventSetupInfo_t *gpioEventSetupInfo;
11054e1bc9a0SAchim Leubner agsaGpioWriteSetupInfo_t *gpioWriteSetupInfo;
11064e1bc9a0SAchim Leubner agsaGpioPinSetupInfo_t *gpioPinSetupInfo;
11074e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
11084e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
11094e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
11104e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
11114e1bc9a0SAchim Leubner
11124e1bc9a0SAchim Leubner TI_DBG3(("tdsaGpioSetup: start\n"));
11134e1bc9a0SAchim Leubner
11144e1bc9a0SAchim Leubner if(tiRoot == agNULL || agIOCTLPayload == agNULL )
11154e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
11164e1bc9a0SAchim Leubner
11174e1bc9a0SAchim Leubner osIoctlTimer = &tdsaAllShared->osIoctlTimer;
11184e1bc9a0SAchim Leubner tdsaInitTimerRequest(tiRoot, osIoctlTimer);
11194e1bc9a0SAchim Leubner tdIoctlStartTimer(tiRoot, osIoctlTimer); /* Start the timout handler for both ioctl and controller response */
11204e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = (bit8 *)osIoctlTimer;
11214e1bc9a0SAchim Leubner
11224e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8 *)&agIOCTLPayload->FunctionSpecificArea[0];
11234e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
11244e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
11254e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
11264e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
11274e1bc9a0SAchim Leubner
11284e1bc9a0SAchim Leubner switch (agIOCTLPayload->MinorFunction)
11294e1bc9a0SAchim Leubner {
11304e1bc9a0SAchim Leubner
11314e1bc9a0SAchim Leubner case IOCTL_MN_GPIO_PINSETUP:
11324e1bc9a0SAchim Leubner {
11334e1bc9a0SAchim Leubner TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_PINSETUP\n"));
11344e1bc9a0SAchim Leubner gpioPinSetupInfo =(agsaGpioPinSetupInfo_t *)&agIOCTLPayload->FunctionSpecificArea[0];
11354e1bc9a0SAchim Leubner status = saGpioPinSetup(agRoot, agContext, 0, gpioPinSetupInfo);
11364e1bc9a0SAchim Leubner
11374e1bc9a0SAchim Leubner break;
11384e1bc9a0SAchim Leubner }
11394e1bc9a0SAchim Leubner case IOCTL_MN_GPIO_EVENTSETUP:
11404e1bc9a0SAchim Leubner {
11414e1bc9a0SAchim Leubner TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_EVENTSETUP\n"));
11424e1bc9a0SAchim Leubner gpioEventSetupInfo = (agsaGpioEventSetupInfo_t *)&agIOCTLPayload->FunctionSpecificArea[0];
11434e1bc9a0SAchim Leubner status = saGpioEventSetup(agRoot, agContext, 0, gpioEventSetupInfo);
11444e1bc9a0SAchim Leubner
11454e1bc9a0SAchim Leubner break;
11464e1bc9a0SAchim Leubner }
11474e1bc9a0SAchim Leubner
11484e1bc9a0SAchim Leubner case IOCTL_MN_GPIO_READ:
11494e1bc9a0SAchim Leubner {
11504e1bc9a0SAchim Leubner TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_READ\n"));
11514e1bc9a0SAchim Leubner status = saGpioRead(agRoot, agContext, 0);
11524e1bc9a0SAchim Leubner
11534e1bc9a0SAchim Leubner break;
11544e1bc9a0SAchim Leubner }
11554e1bc9a0SAchim Leubner
11564e1bc9a0SAchim Leubner case IOCTL_MN_GPIO_WRITE:
11574e1bc9a0SAchim Leubner {
11584e1bc9a0SAchim Leubner TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_WRITE\n"));
11594e1bc9a0SAchim Leubner gpioWriteSetupInfo = (agsaGpioWriteSetupInfo_t *)&agIOCTLPayload->FunctionSpecificArea[0];
11604e1bc9a0SAchim Leubner status = saGpioWrite(agRoot, agContext, 0, gpioWriteSetupInfo->gpioWritemask, gpioWriteSetupInfo->gpioWriteVal);
11614e1bc9a0SAchim Leubner
11624e1bc9a0SAchim Leubner break;
11634e1bc9a0SAchim Leubner }
11644e1bc9a0SAchim Leubner
11654e1bc9a0SAchim Leubner default :
11664e1bc9a0SAchim Leubner return status;
11674e1bc9a0SAchim Leubner }
11684e1bc9a0SAchim Leubner
11694e1bc9a0SAchim Leubner if(status != AGSA_RC_SUCCESS)
11704e1bc9a0SAchim Leubner {
11714e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
11724e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
11734e1bc9a0SAchim Leubner
11744e1bc9a0SAchim Leubner tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
11754e1bc9a0SAchim Leubner if (osIoctlTimer->timerRunning == agTRUE)
11764e1bc9a0SAchim Leubner {
11774e1bc9a0SAchim Leubner tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
11784e1bc9a0SAchim Leubner tdsaKillTimer(tiRoot, osIoctlTimer);
11794e1bc9a0SAchim Leubner
11804e1bc9a0SAchim Leubner }else{
11814e1bc9a0SAchim Leubner tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
11824e1bc9a0SAchim Leubner }
11834e1bc9a0SAchim Leubner }
11844e1bc9a0SAchim Leubner
11854e1bc9a0SAchim Leubner TI_DBG3(("tdsaGpioPinSetup: End\n"));
11864e1bc9a0SAchim Leubner return status;
11874e1bc9a0SAchim Leubner
11884e1bc9a0SAchim Leubner }
11894e1bc9a0SAchim Leubner #endif
11904e1bc9a0SAchim Leubner
11914e1bc9a0SAchim Leubner /*****************************************************************************
11924e1bc9a0SAchim Leubner *
11934e1bc9a0SAchim Leubner * ostiGetGpioIOCTLRsp
11944e1bc9a0SAchim Leubner *
11954e1bc9a0SAchim Leubner * Purpose: This routine is called for Get Gpio IOCTL reaponse has been received.
11964e1bc9a0SAchim Leubner *
11974e1bc9a0SAchim Leubner * Parameters:
11984e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
11994e1bc9a0SAchim Leubner * payloadRsp: Pointer to the FW download IOMB's payload.
12004e1bc9a0SAchim Leubner *
12014e1bc9a0SAchim Leubner * Return: none
12024e1bc9a0SAchim Leubner *
12034e1bc9a0SAchim Leubner *
12044e1bc9a0SAchim Leubner *****************************************************************************/
12054e1bc9a0SAchim Leubner
ostiGetGpioIOCTLRsp(tiRoot_t * tiRoot,bit32 status,bit32 gpioReadValue,agsaGpioPinSetupInfo_t * gpioPinSetupInfo,agsaGpioEventSetupInfo_t * gpioEventSetupInfo)12064e1bc9a0SAchim Leubner osGLOBAL void ostiGetGpioIOCTLRsp(
12074e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
12084e1bc9a0SAchim Leubner bit32 status,
12094e1bc9a0SAchim Leubner bit32 gpioReadValue,
12104e1bc9a0SAchim Leubner agsaGpioPinSetupInfo_t *gpioPinSetupInfo,
12114e1bc9a0SAchim Leubner agsaGpioEventSetupInfo_t *gpioEventSetupInfo
12124e1bc9a0SAchim Leubner )
12134e1bc9a0SAchim Leubner {
12144e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
12154e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
12164e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIoctlPayload ;
12174e1bc9a0SAchim Leubner agsaGpioReadInfo_t *gpioReadInfo;
12184e1bc9a0SAchim Leubner
12194e1bc9a0SAchim Leubner tdsaTimerRequest_t *osIoctlTimer;
12204e1bc9a0SAchim Leubner osIoctlTimer = (tdsaTimerRequest_t *)tdsaAllShared->tdFWControlEx.virtAddr;
12214e1bc9a0SAchim Leubner
12224e1bc9a0SAchim Leubner TI_DBG2(("ostiGetGpioIOCTLRsp: start, status = %d \n", status));
12234e1bc9a0SAchim Leubner
12244e1bc9a0SAchim Leubner agIoctlPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
12254e1bc9a0SAchim Leubner
12264e1bc9a0SAchim Leubner if(agIoctlPayload == agNULL){
12274e1bc9a0SAchim Leubner return;
12284e1bc9a0SAchim Leubner }
12294e1bc9a0SAchim Leubner
12304e1bc9a0SAchim Leubner agIoctlPayload->Status =(bit16) status;
12314e1bc9a0SAchim Leubner
12324e1bc9a0SAchim Leubner if( (status != IOCTL_CALL_TIMEOUT) && (osIoctlTimer != NULL))
12334e1bc9a0SAchim Leubner {
12344e1bc9a0SAchim Leubner tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
12354e1bc9a0SAchim Leubner if (osIoctlTimer->timerRunning == agTRUE)
12364e1bc9a0SAchim Leubner {
12374e1bc9a0SAchim Leubner tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
12384e1bc9a0SAchim Leubner tdsaKillTimer(tiRoot, osIoctlTimer);
12394e1bc9a0SAchim Leubner
12404e1bc9a0SAchim Leubner }else{
12414e1bc9a0SAchim Leubner tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
12424e1bc9a0SAchim Leubner }
12434e1bc9a0SAchim Leubner }else {
12444e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
12454e1bc9a0SAchim Leubner agIoctlPayload->Status = (bit16)status;
12464e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
12474e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2, NULL);
12484e1bc9a0SAchim Leubner return;
12494e1bc9a0SAchim Leubner }
12504e1bc9a0SAchim Leubner
12514e1bc9a0SAchim Leubner if(status == SUCCESS)
12524e1bc9a0SAchim Leubner TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response from OUTBuf"));
12534e1bc9a0SAchim Leubner else {
12544e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
12554e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
12564e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2, NULL);
12574e1bc9a0SAchim Leubner return;
12584e1bc9a0SAchim Leubner }
12594e1bc9a0SAchim Leubner
12604e1bc9a0SAchim Leubner switch (agIoctlPayload->MinorFunction)
12614e1bc9a0SAchim Leubner {
12624e1bc9a0SAchim Leubner
12634e1bc9a0SAchim Leubner case IOCTL_MN_GPIO_PINSETUP:
12644e1bc9a0SAchim Leubner {
12654e1bc9a0SAchim Leubner TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response for IOCTL_MN_GPIO_PINSETUP"));
12664e1bc9a0SAchim Leubner
12674e1bc9a0SAchim Leubner break;
12684e1bc9a0SAchim Leubner }
12694e1bc9a0SAchim Leubner case IOCTL_MN_GPIO_EVENTSETUP:
12704e1bc9a0SAchim Leubner {
12714e1bc9a0SAchim Leubner TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response for IOCTL_MN_GPIO_EVENTSETUP"));
12724e1bc9a0SAchim Leubner
12734e1bc9a0SAchim Leubner break;
12744e1bc9a0SAchim Leubner }
12754e1bc9a0SAchim Leubner
12764e1bc9a0SAchim Leubner case IOCTL_MN_GPIO_WRITE:
12774e1bc9a0SAchim Leubner {
12784e1bc9a0SAchim Leubner TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response for IOCTL_MN_GPIO_WRITE"));
12794e1bc9a0SAchim Leubner
12804e1bc9a0SAchim Leubner break;
12814e1bc9a0SAchim Leubner }
12824e1bc9a0SAchim Leubner
12834e1bc9a0SAchim Leubner case IOCTL_MN_GPIO_READ:
12844e1bc9a0SAchim Leubner {
12854e1bc9a0SAchim Leubner gpioReadInfo = ( agsaGpioReadInfo_t *)tdsaAllShared->tdFWControlEx.usrAddr;
12864e1bc9a0SAchim Leubner
12874e1bc9a0SAchim Leubner gpioReadInfo->gpioReadValue = gpioReadValue;
12884e1bc9a0SAchim Leubner gpioReadInfo->gpioInputEnabled = gpioPinSetupInfo->gpioInputEnabled ; /* GPIOIE */
12894e1bc9a0SAchim Leubner gpioReadInfo->gpioEventLevelChangePart1 = gpioPinSetupInfo->gpioTypePart1; /* GPIEVCHANGE (pins 11-0) */
12904e1bc9a0SAchim Leubner gpioReadInfo->gpioEventLevelChangePart2 = gpioPinSetupInfo->gpioTypePart2; /* GPIEVCHANGE (pins 23-20) */
12914e1bc9a0SAchim Leubner gpioReadInfo->gpioEventRisingEdgePart1 = 0xFFF & gpioEventSetupInfo->gpioEventRisingEdge; /* GPIEVRISE (pins 11-0) */
12924e1bc9a0SAchim Leubner gpioReadInfo->gpioEventRisingEdgePart2 = 0x00F00000 & (gpioEventSetupInfo->gpioEventRisingEdge); /* GPIEVRISE (pins 23-20) */
12934e1bc9a0SAchim Leubner gpioReadInfo->gpioEventFallingEdgePart1 = 0xFFF & gpioEventSetupInfo->gpioEventFallingEdge; /* GPIEVALL (pins 11-0) */
12944e1bc9a0SAchim Leubner gpioReadInfo->gpioEventFallingEdgePart2 = 0x00F00000 & gpioEventSetupInfo->gpioEventFallingEdge; /* GPIEVALL (pins 23-20 */
12954e1bc9a0SAchim Leubner
12964e1bc9a0SAchim Leubner break;
12974e1bc9a0SAchim Leubner }
12984e1bc9a0SAchim Leubner
12994e1bc9a0SAchim Leubner default :
13004e1bc9a0SAchim Leubner break;
13014e1bc9a0SAchim Leubner }
13024e1bc9a0SAchim Leubner
13034e1bc9a0SAchim Leubner if(tdsaAllShared->tdFWControlEx.inProgress)
13044e1bc9a0SAchim Leubner {
13054e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
13064e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
13074e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2, NULL);
13084e1bc9a0SAchim Leubner }
13094e1bc9a0SAchim Leubner TI_DBG2(("ostiGetGpioIOCTLRsp: end \n"));
13104e1bc9a0SAchim Leubner
13114e1bc9a0SAchim Leubner return ;
13124e1bc9a0SAchim Leubner }
13134e1bc9a0SAchim Leubner
13144e1bc9a0SAchim Leubner /*****************************************************************************
13154e1bc9a0SAchim Leubner *
13164e1bc9a0SAchim Leubner * tdsaSGpioIoctlSetup
13174e1bc9a0SAchim Leubner *
13184e1bc9a0SAchim Leubner * Purpose: This routine is called to send SGPIO request to the controller.
13194e1bc9a0SAchim Leubner *
13204e1bc9a0SAchim Leubner * Parameters:
13214e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
13224e1bc9a0SAchim Leubner * agsaContext_t: Context for this request
13234e1bc9a0SAchim Leubner * tiIOCTLPayload_t: ioctl header with payload sgpio info
13244e1bc9a0SAchim Leubner * agParam1,agParam2: Generic parameters
13254e1bc9a0SAchim Leubner *
13264e1bc9a0SAchim Leubner * Return: status
13274e1bc9a0SAchim Leubner *
13284e1bc9a0SAchim Leubner *
13294e1bc9a0SAchim Leubner *****************************************************************************/
13304e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaSGpioIoctlSetup(tiRoot_t * tiRoot,agsaContext_t * agContext,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2)13314e1bc9a0SAchim Leubner tdsaSGpioIoctlSetup(
13324e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
13334e1bc9a0SAchim Leubner agsaContext_t *agContext,
13344e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
13354e1bc9a0SAchim Leubner void *agParam1,
13364e1bc9a0SAchim Leubner void *agParam2
13374e1bc9a0SAchim Leubner )
13384e1bc9a0SAchim Leubner {
13394e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
13404e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
13414e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
13424e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_FAIL;
13434e1bc9a0SAchim Leubner agsaSGpioReqResponse_t *pSGpioReq = (agsaSGpioReqResponse_t *)&agIOCTLPayload->FunctionSpecificArea[0];
13444e1bc9a0SAchim Leubner
13454e1bc9a0SAchim Leubner TI_DBG3(("tdsaSGpioIoctlSetup: start\n"));
13464e1bc9a0SAchim Leubner
13474e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
13484e1bc9a0SAchim Leubner
13494e1bc9a0SAchim Leubner do
13504e1bc9a0SAchim Leubner {
13514e1bc9a0SAchim Leubner if (tiRoot == agNULL || agIOCTLPayload == agNULL)
13524e1bc9a0SAchim Leubner {
13534e1bc9a0SAchim Leubner break;
13544e1bc9a0SAchim Leubner }
13554e1bc9a0SAchim Leubner
13564e1bc9a0SAchim Leubner /* Validate the length */
13574e1bc9a0SAchim Leubner if (agIOCTLPayload->Length < sizeof(agsaSGpioReqResponse_t))
13584e1bc9a0SAchim Leubner {
13594e1bc9a0SAchim Leubner TI_DBG3(("Invalid length\n"));
13604e1bc9a0SAchim Leubner break;
13614e1bc9a0SAchim Leubner }
13624e1bc9a0SAchim Leubner
13634e1bc9a0SAchim Leubner /* Validate the SMP Frame Type, Function and Register Type fields */
13644e1bc9a0SAchim Leubner if ((pSGpioReq->smpFrameType != SMP_REQUEST) || \
13654e1bc9a0SAchim Leubner ((pSGpioReq->function != SMP_READ_GPIO_REGISTER) && (pSGpioReq->function != SMP_WRITE_GPIO_REGISTER)) || \
13664e1bc9a0SAchim Leubner (pSGpioReq->registerType > AGSA_SGPIO_GENERAL_PURPOSE_TRANSMIT_REG))
13674e1bc9a0SAchim Leubner {
13684e1bc9a0SAchim Leubner TI_DBG4(("Invalid Parameter\n"));
13694e1bc9a0SAchim Leubner break;
13704e1bc9a0SAchim Leubner }
13714e1bc9a0SAchim Leubner
13724e1bc9a0SAchim Leubner /* Specific validation for configuration register type */
13734e1bc9a0SAchim Leubner if (AGSA_SGPIO_CONFIG_REG == pSGpioReq->registerType)
13744e1bc9a0SAchim Leubner {
13754e1bc9a0SAchim Leubner if ((pSGpioReq->registerIndex > 0x01) || \
13764e1bc9a0SAchim Leubner ((0x00 == pSGpioReq->registerIndex) && (pSGpioReq->registerCount > 0x02)) || \
13774e1bc9a0SAchim Leubner ((0x01 == pSGpioReq->registerIndex) && (pSGpioReq->registerCount > 0x01)))
13784e1bc9a0SAchim Leubner {
13794e1bc9a0SAchim Leubner break;
13804e1bc9a0SAchim Leubner }
13814e1bc9a0SAchim Leubner }
13824e1bc9a0SAchim Leubner
13834e1bc9a0SAchim Leubner /* Use FW control place in shared structure to keep the necessary information */
13844e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
13854e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
13864e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
13874e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
13884e1bc9a0SAchim Leubner
13894e1bc9a0SAchim Leubner status = saSgpio(agRoot, agContext, 0, pSGpioReq);
13904e1bc9a0SAchim Leubner if (status != AGSA_RC_SUCCESS)
13914e1bc9a0SAchim Leubner {
13924e1bc9a0SAchim Leubner break;
13934e1bc9a0SAchim Leubner }
13944e1bc9a0SAchim Leubner
13954e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
13964e1bc9a0SAchim Leubner
13974e1bc9a0SAchim Leubner } while (0);
13984e1bc9a0SAchim Leubner
13994e1bc9a0SAchim Leubner TI_DBG3(("tdsaGpioPinSetup: End\n"));
14004e1bc9a0SAchim Leubner return status;
14014e1bc9a0SAchim Leubner }
14024e1bc9a0SAchim Leubner
14034e1bc9a0SAchim Leubner /*****************************************************************************
14044e1bc9a0SAchim Leubner *
14054e1bc9a0SAchim Leubner * ostiSgpioIoctlRsp
14064e1bc9a0SAchim Leubner *
14074e1bc9a0SAchim Leubner * Purpose: This routine is called when a SGPIO IOCTL response is received.
14084e1bc9a0SAchim Leubner *
14094e1bc9a0SAchim Leubner * Parameters:
14104e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
14114e1bc9a0SAchim Leubner * pSgpioResponse: Pointer to the SGPIO response
14124e1bc9a0SAchim Leubner *
14134e1bc9a0SAchim Leubner * Return: none
14144e1bc9a0SAchim Leubner *
14154e1bc9a0SAchim Leubner *
14164e1bc9a0SAchim Leubner *****************************************************************************/
ostiSgpioIoctlRsp(tiRoot_t * tiRoot,agsaSGpioReqResponse_t * pSgpioResponse)14174e1bc9a0SAchim Leubner osGLOBAL void ostiSgpioIoctlRsp(
14184e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
14194e1bc9a0SAchim Leubner agsaSGpioReqResponse_t *pSgpioResponse
14204e1bc9a0SAchim Leubner )
14214e1bc9a0SAchim Leubner {
14224e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
14234e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
14244e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIoctlPayload = agNULL;
14254e1bc9a0SAchim Leubner
14264e1bc9a0SAchim Leubner TI_DBG3(("ostiSgpioIoctlRsp: start\n"));
14274e1bc9a0SAchim Leubner
14284e1bc9a0SAchim Leubner if (tdsaAllShared->tdFWControlEx.inProgress)
14294e1bc9a0SAchim Leubner {
14304e1bc9a0SAchim Leubner agIoctlPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
14314e1bc9a0SAchim Leubner if (agIoctlPayload)
14324e1bc9a0SAchim Leubner {
14334e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = NULL;
14344e1bc9a0SAchim Leubner osti_memcpy(&agIoctlPayload->FunctionSpecificArea[0], pSgpioResponse, sizeof(agsaSGpioReqResponse_t));
14354e1bc9a0SAchim Leubner agIoctlPayload->Status = IOCTL_ERR_STATUS_OK;
14364e1bc9a0SAchim Leubner sgpioResponseSet = 1;
14374e1bc9a0SAchim Leubner }
14384e1bc9a0SAchim Leubner tdsaAllShared->sgpioResponseSet = 1; //Sunitha:Check if needed?
14394e1bc9a0SAchim Leubner
14404e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
14414e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2, agNULL);
14424e1bc9a0SAchim Leubner
14434e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
14444e1bc9a0SAchim Leubner }
14454e1bc9a0SAchim Leubner
14464e1bc9a0SAchim Leubner TI_DBG3(("ostiSgpioIoctlRsp: end\n"));
14474e1bc9a0SAchim Leubner }
14484e1bc9a0SAchim Leubner /*****************************************************************************
14494e1bc9a0SAchim Leubner *
14504e1bc9a0SAchim Leubner * ostiCOMMgntIOCTLRsp
14514e1bc9a0SAchim Leubner *
14524e1bc9a0SAchim Leubner * Purpose: This routine is called when FW control IOCTL reaponse has been received.
14534e1bc9a0SAchim Leubner * This function is used for both target and initiator.
14544e1bc9a0SAchim Leubner *
14554e1bc9a0SAchim Leubner * Parameters:
14564e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
14574e1bc9a0SAchim Leubner * payloadRsp: Pointer to the FW download IOMB's payload.
14584e1bc9a0SAchim Leubner *
14594e1bc9a0SAchim Leubner * Return: none
14604e1bc9a0SAchim Leubner *
14614e1bc9a0SAchim Leubner *
14624e1bc9a0SAchim Leubner *
14634e1bc9a0SAchim Leubner *****************************************************************************/
14644e1bc9a0SAchim Leubner
ostiCOMMgntIOCTLRsp(tiRoot_t * tiRoot,bit32 status)14654e1bc9a0SAchim Leubner osGLOBAL void ostiCOMMgntIOCTLRsp(
14664e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
14674e1bc9a0SAchim Leubner bit32 status
14684e1bc9a0SAchim Leubner )
14694e1bc9a0SAchim Leubner {
14704e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
14714e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
14724e1bc9a0SAchim Leubner
14734e1bc9a0SAchim Leubner TI_DBG1(("ostiCOMMgntIOCTLRsp: status 0x%x\n",status));
14744e1bc9a0SAchim Leubner (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
14754e1bc9a0SAchim Leubner
14764e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot,
14774e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer,
14784e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.tdFWControl->len);
14794e1bc9a0SAchim Leubner
14804e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot,
14814e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1,
14824e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2,
14834e1bc9a0SAchim Leubner NULL);
14844e1bc9a0SAchim Leubner }
14854e1bc9a0SAchim Leubner
14864e1bc9a0SAchim Leubner
14874e1bc9a0SAchim Leubner /*****************************************************************************
14884e1bc9a0SAchim Leubner *
14894e1bc9a0SAchim Leubner * ostiRegDumpIOCTLRsp
14904e1bc9a0SAchim Leubner *
14914e1bc9a0SAchim Leubner * Purpose: This routine is called when Register Dump from flash IOCTL reaponse has been received.
14924e1bc9a0SAchim Leubner * This function is used for both target and initiator.
14934e1bc9a0SAchim Leubner *
14944e1bc9a0SAchim Leubner * Parameters:
14954e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
14964e1bc9a0SAchim Leubner * payloadRsp: Pointer to the FW download IOMB's payload.
14974e1bc9a0SAchim Leubner *
14984e1bc9a0SAchim Leubner * Return: none
14994e1bc9a0SAchim Leubner *
15004e1bc9a0SAchim Leubner *
15014e1bc9a0SAchim Leubner *
15024e1bc9a0SAchim Leubner *****************************************************************************/
15034e1bc9a0SAchim Leubner
ostiRegDumpIOCTLRsp(tiRoot_t * tiRoot,bit32 status)15044e1bc9a0SAchim Leubner osGLOBAL void ostiRegDumpIOCTLRsp(
15054e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
15064e1bc9a0SAchim Leubner bit32 status
15074e1bc9a0SAchim Leubner )
15084e1bc9a0SAchim Leubner {
15094e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
15104e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
15114e1bc9a0SAchim Leubner
15124e1bc9a0SAchim Leubner TI_DBG1(("ostiRegDumpIOCTLRsp: start\n"));
15134e1bc9a0SAchim Leubner // (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
15144e1bc9a0SAchim Leubner osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
15154e1bc9a0SAchim Leubner (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
15164e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len);
15174e1bc9a0SAchim Leubner
15184e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot,
15194e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer,
15204e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len);
15214e1bc9a0SAchim Leubner
15224e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot,
15234e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1,
15244e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2,
15254e1bc9a0SAchim Leubner NULL);
15264e1bc9a0SAchim Leubner }
15274e1bc9a0SAchim Leubner
15284e1bc9a0SAchim Leubner /*****************************************************************************
15294e1bc9a0SAchim Leubner *
15304e1bc9a0SAchim Leubner * ostiSetNVMDIOCTLRsp
15314e1bc9a0SAchim Leubner *
15324e1bc9a0SAchim Leubner * Purpose: This routine is called for Set NVMD IOCTL reaponse has been received.
15334e1bc9a0SAchim Leubner * This function is used for both target and initiator.
15344e1bc9a0SAchim Leubner *
15354e1bc9a0SAchim Leubner * Parameters:
15364e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
15374e1bc9a0SAchim Leubner * payloadRsp: Pointer to the FW download IOMB's payload.
15384e1bc9a0SAchim Leubner *
15394e1bc9a0SAchim Leubner * Return: none
15404e1bc9a0SAchim Leubner *
15414e1bc9a0SAchim Leubner *
15424e1bc9a0SAchim Leubner *
15434e1bc9a0SAchim Leubner *****************************************************************************/
15444e1bc9a0SAchim Leubner
ostiSetNVMDIOCTLRsp(tiRoot_t * tiRoot,bit32 status)15454e1bc9a0SAchim Leubner osGLOBAL void ostiSetNVMDIOCTLRsp(
15464e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
15474e1bc9a0SAchim Leubner bit32 status
15484e1bc9a0SAchim Leubner )
15494e1bc9a0SAchim Leubner {
15504e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
15514e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
15524e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload;
15534e1bc9a0SAchim Leubner
15544e1bc9a0SAchim Leubner if(status)
15554e1bc9a0SAchim Leubner {
15564e1bc9a0SAchim Leubner agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
15574e1bc9a0SAchim Leubner agIOCTLPayload->Status = (bit16)status;
15584e1bc9a0SAchim Leubner }
15594e1bc9a0SAchim Leubner
15604e1bc9a0SAchim Leubner TI_DBG1(("ostiSetNVMDIOCTLRsp: start, status = %d\n", status));
15614e1bc9a0SAchim Leubner // (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
15624e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot,
15634e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer,
15644e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len);
15654e1bc9a0SAchim Leubner
15664e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot,
15674e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1,
15684e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2,
15694e1bc9a0SAchim Leubner NULL);
15704e1bc9a0SAchim Leubner }
15714e1bc9a0SAchim Leubner #ifdef SPC_ENABLE_PROFILE
15724e1bc9a0SAchim Leubner /*****************************************************************************
15734e1bc9a0SAchim Leubner *
15744e1bc9a0SAchim Leubner * ostiFWProfileIOCTLRsp
15754e1bc9a0SAchim Leubner *
15764e1bc9a0SAchim Leubner * Purpose: This routine is called for Fw Profile IOCTL reaponse has been received.
15774e1bc9a0SAchim Leubner * This function is used for both target and initiator.
15784e1bc9a0SAchim Leubner *
15794e1bc9a0SAchim Leubner * Parameters:
15804e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
15814e1bc9a0SAchim Leubner * status:
15824e1bc9a0SAchim Leubner *
15834e1bc9a0SAchim Leubner * Return: none
15844e1bc9a0SAchim Leubner *
15854e1bc9a0SAchim Leubner *
15864e1bc9a0SAchim Leubner *
15874e1bc9a0SAchim Leubner *****************************************************************************/
15884e1bc9a0SAchim Leubner
ostiFWProfileIOCTLRsp(tiRoot_t * tiRoot,bit32 status,bit32 len)15894e1bc9a0SAchim Leubner osGLOBAL void ostiFWProfileIOCTLRsp(
15904e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
15914e1bc9a0SAchim Leubner bit32 status,
15924e1bc9a0SAchim Leubner bit32 len)
15934e1bc9a0SAchim Leubner {
15944e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
15954e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
15964e1bc9a0SAchim Leubner tdFWProfile_t *fwProfile;
15974e1bc9a0SAchim Leubner
15984e1bc9a0SAchim Leubner TI_DBG1(("ostiFWProfileIOCTLRsp: start\n"));
15994e1bc9a0SAchim Leubner fwProfile = (tdFWProfile_t *)tdsaAllShared->tdFWProfileEx.tdFWProfile;
16004e1bc9a0SAchim Leubner // (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
16014e1bc9a0SAchim Leubner if (status == AGSA_RC_SUCCESS)
16024e1bc9a0SAchim Leubner {
16034e1bc9a0SAchim Leubner if((fwProfile->cmd == STOP_TIMER_PROFILE) || (fwProfile->cmd == STOP_CODE_PROFILE))
16044e1bc9a0SAchim Leubner {
16054e1bc9a0SAchim Leubner osti_memcpy((void *)(fwProfile->buffer),
16064e1bc9a0SAchim Leubner (void *)(tdsaAllShared->tdFWProfileEx.virtAddr),
16074e1bc9a0SAchim Leubner len);
16084e1bc9a0SAchim Leubner
16094e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot,
16104e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.buffer,
16114e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.len);
16124e1bc9a0SAchim Leubner }
16134e1bc9a0SAchim Leubner }
16144e1bc9a0SAchim Leubner fwProfile->status = status;
16154e1bc9a0SAchim Leubner fwProfile->len = len;
16164e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot,
16174e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.param1,
16184e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.param2,
16194e1bc9a0SAchim Leubner NULL);
16204e1bc9a0SAchim Leubner }
16214e1bc9a0SAchim Leubner #endif
16224e1bc9a0SAchim Leubner /*****************************************************************************
16234e1bc9a0SAchim Leubner *
16244e1bc9a0SAchim Leubner * ostiGetNVMDIOCTLRsp
16254e1bc9a0SAchim Leubner *
16264e1bc9a0SAchim Leubner * Purpose: This routine is called for Get NVMD IOCTL reaponse has been received.
16274e1bc9a0SAchim Leubner * This function is used for both target and initiator.
16284e1bc9a0SAchim Leubner *
16294e1bc9a0SAchim Leubner * Parameters:
16304e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
16314e1bc9a0SAchim Leubner * payloadRsp: Pointer to the FW download IOMB's payload.
16324e1bc9a0SAchim Leubner *
16334e1bc9a0SAchim Leubner * Return: none
16344e1bc9a0SAchim Leubner *
16354e1bc9a0SAchim Leubner *
16364e1bc9a0SAchim Leubner *
16374e1bc9a0SAchim Leubner *****************************************************************************/
16384e1bc9a0SAchim Leubner
ostiGetNVMDIOCTLRsp(tiRoot_t * tiRoot,bit32 status)16394e1bc9a0SAchim Leubner osGLOBAL void ostiGetNVMDIOCTLRsp(
16404e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
16414e1bc9a0SAchim Leubner bit32 status
16424e1bc9a0SAchim Leubner )
16434e1bc9a0SAchim Leubner {
16444e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
16454e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
16464e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload;
16474e1bc9a0SAchim Leubner
16484e1bc9a0SAchim Leubner if(status)
16494e1bc9a0SAchim Leubner {
16504e1bc9a0SAchim Leubner agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
16514e1bc9a0SAchim Leubner agIOCTLPayload->Status = (bit16)status;
16524e1bc9a0SAchim Leubner }
16534e1bc9a0SAchim Leubner
16544e1bc9a0SAchim Leubner TI_DBG1(("ostiGetNVMDIOCTLRsp: start, status = %d\n", status));
16554e1bc9a0SAchim Leubner tdsaAllShared->NvmdResponseSet = 1;
16564e1bc9a0SAchim Leubner
16574e1bc9a0SAchim Leubner if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
16584e1bc9a0SAchim Leubner {
16594e1bc9a0SAchim Leubner osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
16604e1bc9a0SAchim Leubner (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
16614e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len);
16624e1bc9a0SAchim Leubner
16634e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot,
16644e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer,
16654e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len);
16664e1bc9a0SAchim Leubner
16674e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot,
16684e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1,
16694e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2,
16704e1bc9a0SAchim Leubner NULL);
16714e1bc9a0SAchim Leubner }
16724e1bc9a0SAchim Leubner }
16734e1bc9a0SAchim Leubner
16744e1bc9a0SAchim Leubner
16754e1bc9a0SAchim Leubner /*****************************************************************************
16764e1bc9a0SAchim Leubner *
16774e1bc9a0SAchim Leubner * ostiGetPhyProfileIOCTLRsp
16784e1bc9a0SAchim Leubner *
16794e1bc9a0SAchim Leubner * Purpose: This routine is called for phy response has been received.
16804e1bc9a0SAchim Leubner * This function is used for both target and initiator.
16814e1bc9a0SAchim Leubner *
16824e1bc9a0SAchim Leubner * Parameters:
16834e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
16844e1bc9a0SAchim Leubner * payloadRsp: Pointer to the IOMB's payload.
16854e1bc9a0SAchim Leubner *
16864e1bc9a0SAchim Leubner * Return: none
16874e1bc9a0SAchim Leubner *
16884e1bc9a0SAchim Leubner *
16894e1bc9a0SAchim Leubner *
16904e1bc9a0SAchim Leubner *****************************************************************************/
16914e1bc9a0SAchim Leubner
ostiGetPhyProfileIOCTLRsp(tiRoot_t * tiRoot,bit32 status)16924e1bc9a0SAchim Leubner osGLOBAL void ostiGetPhyProfileIOCTLRsp(
16934e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
16944e1bc9a0SAchim Leubner bit32 status
16954e1bc9a0SAchim Leubner )
16964e1bc9a0SAchim Leubner {
16974e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
16984e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
16994e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload;
17004e1bc9a0SAchim Leubner tdPhyCount_t *PhyBlob = agNULL;
17014e1bc9a0SAchim Leubner if(status)
17024e1bc9a0SAchim Leubner {
17034e1bc9a0SAchim Leubner agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
17044e1bc9a0SAchim Leubner agIOCTLPayload->Status = (bit16)status;
17054e1bc9a0SAchim Leubner
17064e1bc9a0SAchim Leubner PhyBlob = (tdPhyCount_t*)&agIOCTLPayload->FunctionSpecificArea[0];
17074e1bc9a0SAchim Leubner if(PhyBlob)
17084e1bc9a0SAchim Leubner {
17094e1bc9a0SAchim Leubner // PhyBlob->Phy |= 0x800;
17104e1bc9a0SAchim Leubner if(PhyBlob->phyResetProblem == 0 )
17114e1bc9a0SAchim Leubner {
17124e1bc9a0SAchim Leubner PhyBlob->phyResetProblem = -1;
17134e1bc9a0SAchim Leubner }
17144e1bc9a0SAchim Leubner TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->Phy 0x%x\n",PhyBlob->Phy));
17154e1bc9a0SAchim Leubner TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->BW_rx 0x%x\n",PhyBlob->BW_rx));
17164e1bc9a0SAchim Leubner TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->BW_tx 0x%x\n",PhyBlob->BW_tx));
17174e1bc9a0SAchim Leubner TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->InvalidDword 0x%x\n",PhyBlob->InvalidDword));
17184e1bc9a0SAchim Leubner TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->runningDisparityError 0x%x\n",PhyBlob->runningDisparityError));
17194e1bc9a0SAchim Leubner TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->codeViolation 0x%x\n",PhyBlob->codeViolation));
17204e1bc9a0SAchim Leubner TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->phyResetProblem 0x%x\n",PhyBlob->phyResetProblem));
17214e1bc9a0SAchim Leubner TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->inboundCRCError 0x%x\n",PhyBlob->inboundCRCError));
17224e1bc9a0SAchim Leubner
17234e1bc9a0SAchim Leubner }
17244e1bc9a0SAchim Leubner
17254e1bc9a0SAchim Leubner
17264e1bc9a0SAchim Leubner }
17274e1bc9a0SAchim Leubner
17284e1bc9a0SAchim Leubner TI_DBG1(("ostiGetPhyProfileIOCTLRsp: start, status = %d\n", status));
17294e1bc9a0SAchim Leubner TI_DBG1(("ostiGetPhyProfileIOCTLRsp: start, len = %d %p %p\n", tdsaAllShared->tdFWControlEx.len,tdsaAllShared->tdFWControlEx.usrAddr,tdsaAllShared->tdFWControlEx.virtAddr));
17304e1bc9a0SAchim Leubner
17314e1bc9a0SAchim Leubner // osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
17324e1bc9a0SAchim Leubner // (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
17334e1bc9a0SAchim Leubner // tdsaAllShared->tdFWControlEx.len);
17344e1bc9a0SAchim Leubner
17354e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot,
17364e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer,
17374e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len);
17384e1bc9a0SAchim Leubner
17394e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot,
17404e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1,
17414e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2,
17424e1bc9a0SAchim Leubner NULL);
17434e1bc9a0SAchim Leubner }
17444e1bc9a0SAchim Leubner
17454e1bc9a0SAchim Leubner
17464e1bc9a0SAchim Leubner /*****************************************************************************
17474e1bc9a0SAchim Leubner *
17484e1bc9a0SAchim Leubner * ostiGenEventIOCTLRsp
17494e1bc9a0SAchim Leubner *
17504e1bc9a0SAchim Leubner * Purpose: This routine is called when General Event happened while waiting for IOCTL response.
17514e1bc9a0SAchim Leubner * This function is used for both target and initiator.
17524e1bc9a0SAchim Leubner *
17534e1bc9a0SAchim Leubner * Parameters:
17544e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
17554e1bc9a0SAchim Leubner * payloadRsp: Pointer to the FW download IOMB's payload.
17564e1bc9a0SAchim Leubner *
17574e1bc9a0SAchim Leubner * Return: none
17584e1bc9a0SAchim Leubner *
17594e1bc9a0SAchim Leubner *
17604e1bc9a0SAchim Leubner *
17614e1bc9a0SAchim Leubner *****************************************************************************/
17624e1bc9a0SAchim Leubner
ostiGenEventIOCTLRsp(tiRoot_t * tiRoot,bit32 status)17634e1bc9a0SAchim Leubner osGLOBAL void ostiGenEventIOCTLRsp(
17644e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
17654e1bc9a0SAchim Leubner bit32 status
17664e1bc9a0SAchim Leubner )
17674e1bc9a0SAchim Leubner {
17684e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
17694e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
17704e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload;
17714e1bc9a0SAchim Leubner
17724e1bc9a0SAchim Leubner TI_DBG1(("ostiGenEventIOCTLRsp: start\n"));
17734e1bc9a0SAchim Leubner
17744e1bc9a0SAchim Leubner if(tdsaAllShared->tdFWControlEx.inProgress) /*Free only if our IOCTL is in progress*/
17754e1bc9a0SAchim Leubner {
17764e1bc9a0SAchim Leubner agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
17774e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
17784e1bc9a0SAchim Leubner (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = IOCTL_ERR_STATUS_INTERNAL_ERROR;
17794e1bc9a0SAchim Leubner
17804e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot,
17814e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer,
17824e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len);
17834e1bc9a0SAchim Leubner
17844e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot,
17854e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1,
17864e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2,
17874e1bc9a0SAchim Leubner NULL);
17884e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
17894e1bc9a0SAchim Leubner }
17904e1bc9a0SAchim Leubner #ifdef SPC_ENABLE_PROFILE
17914e1bc9a0SAchim Leubner if(tdsaAllShared->tdFWProfileEx.inProgress)
17924e1bc9a0SAchim Leubner {
17934e1bc9a0SAchim Leubner agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWProfileEx.payload);
17944e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
17954e1bc9a0SAchim Leubner if(tdsaAllShared->tdFWProfileEx.virtAddr != NULL) /*Free only if our IOCTL is in progress*/
17964e1bc9a0SAchim Leubner {
17974e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot,
17984e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.buffer,
17994e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.len);
18004e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.virtAddr = NULL;
18014e1bc9a0SAchim Leubner }
18024e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot,
18034e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.param1,
18044e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.param2,
18054e1bc9a0SAchim Leubner NULL);
18064e1bc9a0SAchim Leubner tdsaAllShared->tdFWProfileEx.inProgress = 0;
18074e1bc9a0SAchim Leubner
18084e1bc9a0SAchim Leubner }
18094e1bc9a0SAchim Leubner #endif /*SPC_ENABLE_PROFILE*/
18104e1bc9a0SAchim Leubner
18114e1bc9a0SAchim Leubner }
18124e1bc9a0SAchim Leubner
18134e1bc9a0SAchim Leubner osGLOBAL void
ostiGetDeviceInfoIOCTLRsp(tiRoot_t * tiRoot,bit32 status,void * param)18144e1bc9a0SAchim Leubner ostiGetDeviceInfoIOCTLRsp(
18154e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
18164e1bc9a0SAchim Leubner bit32 status,
18174e1bc9a0SAchim Leubner void *param
18184e1bc9a0SAchim Leubner )
18194e1bc9a0SAchim Leubner {
18204e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
18214e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
18224e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload = agNULL;
18234e1bc9a0SAchim Leubner tdDeviceInfoPayload_t *pTDDeviceInfo = agNULL;
18244e1bc9a0SAchim Leubner agsaDeviceInfo_t *pSADeviceInfo = agNULL;
18254e1bc9a0SAchim Leubner
18264e1bc9a0SAchim Leubner TI_DBG1(("ostiGetDeviceInfoIOCTLRsp: start\n"));
18274e1bc9a0SAchim Leubner
18284e1bc9a0SAchim Leubner agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
18294e1bc9a0SAchim Leubner pSADeviceInfo = (agsaDeviceInfo_t*)param;
18304e1bc9a0SAchim Leubner pTDDeviceInfo = (tdDeviceInfoPayload_t*)agIOCTLPayload->FunctionSpecificArea;
18314e1bc9a0SAchim Leubner
18324e1bc9a0SAchim Leubner if (pSADeviceInfo != agNULL)
18334e1bc9a0SAchim Leubner {
18344e1bc9a0SAchim Leubner /* fill the device information in IOCTL payload */
18354e1bc9a0SAchim Leubner osti_memcpy(&pTDDeviceInfo->devInfo.sasAddressHi, pSADeviceInfo->sasAddressHi, sizeof(bit32));
18364e1bc9a0SAchim Leubner osti_memcpy(&pTDDeviceInfo->devInfo.sasAddressLo, pSADeviceInfo->sasAddressLo, sizeof(bit32));
18374e1bc9a0SAchim Leubner
18384e1bc9a0SAchim Leubner pTDDeviceInfo->devInfo.sasAddressHi = DMA_BEBIT32_TO_BIT32(pTDDeviceInfo->devInfo.sasAddressHi);
18394e1bc9a0SAchim Leubner pTDDeviceInfo->devInfo.sasAddressLo = DMA_BEBIT32_TO_BIT32(pTDDeviceInfo->devInfo.sasAddressLo);
18404e1bc9a0SAchim Leubner
18414e1bc9a0SAchim Leubner pTDDeviceInfo->devInfo.deviceType = (pSADeviceInfo->devType_S_Rate & 0x30) >> 4;
18424e1bc9a0SAchim Leubner pTDDeviceInfo->devInfo.linkRate = pSADeviceInfo->devType_S_Rate & 0x0F;
18434e1bc9a0SAchim Leubner
18444e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
18454e1bc9a0SAchim Leubner }
18464e1bc9a0SAchim Leubner else
18474e1bc9a0SAchim Leubner {
18484e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INVALID_DEVICE;
18494e1bc9a0SAchim Leubner }
18504e1bc9a0SAchim Leubner
18514e1bc9a0SAchim Leubner if(tdsaAllShared->tdFWControlEx.inProgress) /*Free only if our IOCTL is in progress*/
18524e1bc9a0SAchim Leubner {
18534e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot,
18544e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1,
18554e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2,
18564e1bc9a0SAchim Leubner NULL);
18574e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
18584e1bc9a0SAchim Leubner }
18594e1bc9a0SAchim Leubner }
18604e1bc9a0SAchim Leubner
18614e1bc9a0SAchim Leubner
18624e1bc9a0SAchim Leubner #ifdef INITIATOR_DRIVER
18634e1bc9a0SAchim Leubner osGLOBAL void
ostiGetIoErrorStatsIOCTLRsp(tiRoot_t * tiRoot,bit32 status,void * param)18644e1bc9a0SAchim Leubner ostiGetIoErrorStatsIOCTLRsp(
18654e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
18664e1bc9a0SAchim Leubner bit32 status,
18674e1bc9a0SAchim Leubner void *param
18684e1bc9a0SAchim Leubner )
18694e1bc9a0SAchim Leubner {
18704e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
18714e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
18724e1bc9a0SAchim Leubner itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
18734e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload = agNULL;
18744e1bc9a0SAchim Leubner tdIoErrorStatisticPayload_t *pIoErrorPayload = agNULL;
18754e1bc9a0SAchim Leubner agsaIOErrorEventStats_t *pIoErrorCount = agNULL;
18764e1bc9a0SAchim Leubner
18774e1bc9a0SAchim Leubner OS_ASSERT(sizeof(agsaIOErrorEventStats_t) == sizeof(tdIoErrorEventStatisticIOCTL_t), "agsaIOErrorEventStats_t tdIoErrorEventStatisticIOCTL_t\n");
18784e1bc9a0SAchim Leubner TI_DBG1(("ostiGetIoErrorStatsIOCTLRsp: start\n"));
18794e1bc9a0SAchim Leubner
18804e1bc9a0SAchim Leubner agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
18814e1bc9a0SAchim Leubner pIoErrorPayload = (tdIoErrorStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
18824e1bc9a0SAchim Leubner pIoErrorCount = (agsaIOErrorEventStats_t*)param;
18834e1bc9a0SAchim Leubner
18844e1bc9a0SAchim Leubner osti_memcpy(&pIoErrorPayload->IoError, pIoErrorCount, sizeof(agsaIOErrorEventStats_t));
18854e1bc9a0SAchim Leubner /*copy SCSI status and sense key count from OS layer to TD layer*/
18864e1bc9a0SAchim Leubner osti_memcpy(&pIoErrorPayload->ScsiStatusCounter, &Initiator->ScsiStatusCounts, sizeof(tdSCSIStatusCount_t));
18874e1bc9a0SAchim Leubner osti_memcpy(&pIoErrorPayload->SenseKeyCounter, &Initiator->SenseKeyCounter, sizeof(tdSenseKeyCount_t));
18884e1bc9a0SAchim Leubner if (pIoErrorPayload->flag)
18894e1bc9a0SAchim Leubner {
18904e1bc9a0SAchim Leubner osti_memset(&Initiator->ScsiStatusCounts, 0,sizeof(tdSCSIStatusCount_t) );
18914e1bc9a0SAchim Leubner osti_memset(&Initiator->SenseKeyCounter, 0,sizeof(tdSenseKeyCount_t) );
18924e1bc9a0SAchim Leubner }
18934e1bc9a0SAchim Leubner
18944e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
18954e1bc9a0SAchim Leubner }
18964e1bc9a0SAchim Leubner #endif /* INITIATOR_DRIVER */
18974e1bc9a0SAchim Leubner
18984e1bc9a0SAchim Leubner osGLOBAL void
ostiGetIoEventStatsIOCTLRsp(tiRoot_t * tiRoot,bit32 status,void * param)18994e1bc9a0SAchim Leubner ostiGetIoEventStatsIOCTLRsp(
19004e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
19014e1bc9a0SAchim Leubner bit32 status,
19024e1bc9a0SAchim Leubner void *param
19034e1bc9a0SAchim Leubner )
19044e1bc9a0SAchim Leubner {
19054e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
19064e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
19074e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload = agNULL;
19084e1bc9a0SAchim Leubner tdIoEventStatisticPayload_t *pIoEventPayload = agNULL;
19094e1bc9a0SAchim Leubner agsaIOErrorEventStats_t *pIoEventCount = agNULL;
19104e1bc9a0SAchim Leubner
19114e1bc9a0SAchim Leubner TI_DBG1(("ostiGetIoEventStatsIOCTLRsp: start\n"));
19124e1bc9a0SAchim Leubner
19134e1bc9a0SAchim Leubner agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
19144e1bc9a0SAchim Leubner pIoEventPayload = (tdIoEventStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
19154e1bc9a0SAchim Leubner pIoEventCount = (agsaIOErrorEventStats_t*)param;
19164e1bc9a0SAchim Leubner
19174e1bc9a0SAchim Leubner osti_memcpy(&pIoEventPayload->IoEvent, pIoEventCount, sizeof(agsaIOErrorEventStats_t));
19184e1bc9a0SAchim Leubner
19194e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
19204e1bc9a0SAchim Leubner }
19214e1bc9a0SAchim Leubner
19224e1bc9a0SAchim Leubner osGLOBAL void
ostiGetForensicDataIOCTLRsp(tiRoot_t * tiRoot,bit32 status,void * param)19234e1bc9a0SAchim Leubner ostiGetForensicDataIOCTLRsp(
19244e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
19254e1bc9a0SAchim Leubner bit32 status,
19264e1bc9a0SAchim Leubner void *param
19274e1bc9a0SAchim Leubner )
19284e1bc9a0SAchim Leubner {
19294e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
19304e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
19314e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload = agNULL;
19324e1bc9a0SAchim Leubner tdForensicDataPayload_t *pForensicDataPayload = agNULL;
19334e1bc9a0SAchim Leubner agsaForensicData_t *pForensicData = agNULL;
19344e1bc9a0SAchim Leubner
19354e1bc9a0SAchim Leubner TI_DBG3(("ostiGetForensicDataIOCTLRsp: start, status = %d\n", status));
19364e1bc9a0SAchim Leubner
19374e1bc9a0SAchim Leubner agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
19384e1bc9a0SAchim Leubner pForensicDataPayload = (tdForensicDataPayload_t*)agIOCTLPayload->FunctionSpecificArea;
19394e1bc9a0SAchim Leubner pForensicData = (agsaForensicData_t*)param;
19404e1bc9a0SAchim Leubner
19414e1bc9a0SAchim Leubner if (agNULL == agIOCTLPayload)
19424e1bc9a0SAchim Leubner {
19434e1bc9a0SAchim Leubner return;
19444e1bc9a0SAchim Leubner }
19454e1bc9a0SAchim Leubner
19464e1bc9a0SAchim Leubner if (FORENSIC_DATA_TYPE_CHECK_FATAL == pForensicData->DataType)
19474e1bc9a0SAchim Leubner {
19484e1bc9a0SAchim Leubner agIOCTLPayload->Status = (bit16)status;
19494e1bc9a0SAchim Leubner return;
19504e1bc9a0SAchim Leubner }
19514e1bc9a0SAchim Leubner
19524e1bc9a0SAchim Leubner if (status == AGSA_RC_SUCCESS)
19534e1bc9a0SAchim Leubner {
19544e1bc9a0SAchim Leubner switch (pForensicData->DataType)
19554e1bc9a0SAchim Leubner {
19564e1bc9a0SAchim Leubner case FORENSIC_DATA_TYPE_NON_FATAL:
19574e1bc9a0SAchim Leubner case FORENSIC_DATA_TYPE_FATAL:
19584e1bc9a0SAchim Leubner pForensicDataPayload->dataBuffer.directOffset = pForensicData->BufferType.dataBuf.directOffset;
19594e1bc9a0SAchim Leubner pForensicDataPayload->dataBuffer.readLen = pForensicData->BufferType.dataBuf.readLen;
19604e1bc9a0SAchim Leubner break;
19614e1bc9a0SAchim Leubner case FORENSIC_DATA_TYPE_GSM_SPACE:
19624e1bc9a0SAchim Leubner pForensicDataPayload->gsmBuffer.directOffset = pForensicData->BufferType.gsmBuf.directOffset;
19634e1bc9a0SAchim Leubner pForensicDataPayload->gsmBuffer.readLen = pForensicData->BufferType.gsmBuf.readLen;
19644e1bc9a0SAchim Leubner break;
19654e1bc9a0SAchim Leubner
19664e1bc9a0SAchim Leubner case FORENSIC_DATA_TYPE_QUEUE:
19674e1bc9a0SAchim Leubner break;
19684e1bc9a0SAchim Leubner
19694e1bc9a0SAchim Leubner default:
19704e1bc9a0SAchim Leubner TI_DBG1(("ostiGetForensicDataIOCTLRsp: forensic data type error %d\n", pForensicData->DataType));
19714e1bc9a0SAchim Leubner break;
19724e1bc9a0SAchim Leubner }
19734e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
19744e1bc9a0SAchim Leubner }
19754e1bc9a0SAchim Leubner else if(status == IOCTL_ERROR_NO_FATAL_ERROR)
19764e1bc9a0SAchim Leubner {
19774e1bc9a0SAchim Leubner agIOCTLPayload->Status = (bit16)status;
19784e1bc9a0SAchim Leubner }
19794e1bc9a0SAchim Leubner else
19804e1bc9a0SAchim Leubner {
19814e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
19824e1bc9a0SAchim Leubner }
19834e1bc9a0SAchim Leubner
19844e1bc9a0SAchim Leubner /*Free only if our IOCTL is in progress*/
19854e1bc9a0SAchim Leubner if(tdsaAllShared->tdFWControlEx.inProgress)
19864e1bc9a0SAchim Leubner {
19874e1bc9a0SAchim Leubner TI_DBG3(("ostiGetForensicDataIOCTLRsp: Waiting for the signal \n"));
19884e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot,
19894e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1,
19904e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2,
19914e1bc9a0SAchim Leubner NULL);
19924e1bc9a0SAchim Leubner TI_DBG3(("ostiGetForensicDataIOCTLRsp: Signal wait completed \n"));
19934e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
19944e1bc9a0SAchim Leubner }
19954e1bc9a0SAchim Leubner }
19964e1bc9a0SAchim Leubner
19974e1bc9a0SAchim Leubner /*****************************************************************************
19984e1bc9a0SAchim Leubner *
19994e1bc9a0SAchim Leubner * tdsaRegDumpGetIoctl
20004e1bc9a0SAchim Leubner *
20014e1bc9a0SAchim Leubner * Purpose: This routine is called to get Register Dump information.
20024e1bc9a0SAchim Leubner * This function is used for both target and initiator.
20034e1bc9a0SAchim Leubner *
20044e1bc9a0SAchim Leubner * Parameters:
20054e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
20064e1bc9a0SAchim Leubner * agIOCTLPayload: Pointer to the IOCTL payload.
20074e1bc9a0SAchim Leubner * agParam1: Pointer to pass context handle for IOCTL DMA operation
20084e1bc9a0SAchim Leubner * agParam2: Pointer to pass context handle for IOCTL DMA operation
20094e1bc9a0SAchim Leubner * agParam3: Pointer to pass context handle for IOCTL DMA operation
20104e1bc9a0SAchim Leubner *
20114e1bc9a0SAchim Leubner * Return:
20124e1bc9a0SAchim Leubner *
20134e1bc9a0SAchim Leubner * IOCTL_CALL_SUCCESS The requested operation completed successfully.
20144e1bc9a0SAchim Leubner * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
20154e1bc9a0SAchim Leubner * Detail error code is function specific and
20164e1bc9a0SAchim Leubner * defined by the specific IOCTL function.
20174e1bc9a0SAchim Leubner * IOCTL_CALL_PENDING This request is asynchronous and completed
20184e1bc9a0SAchim Leubner * in some other context.
20194e1bc9a0SAchim Leubner * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
20204e1bc9a0SAchim Leubner *
20214e1bc9a0SAchim Leubner *
20224e1bc9a0SAchim Leubner *****************************************************************************/
20234e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaRegDumpGetIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)20244e1bc9a0SAchim Leubner tdsaRegDumpGetIoctl(
20254e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
20264e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
20274e1bc9a0SAchim Leubner void *agParam1,
20284e1bc9a0SAchim Leubner void *agParam2,
20294e1bc9a0SAchim Leubner void *agParam3
20304e1bc9a0SAchim Leubner )
20314e1bc9a0SAchim Leubner {
20324e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
20334e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
20344e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
20354e1bc9a0SAchim Leubner // agsaControllerStatus_t RegDump;
20364e1bc9a0SAchim Leubner bit32 Offset = 0;
20374e1bc9a0SAchim Leubner bit32 RequestLength = 0; /* user request on how much data to pass to application */
20384e1bc9a0SAchim Leubner agsaRegDumpInfo_t regDumpInfo;
20394e1bc9a0SAchim Leubner void *buffer = agNULL;
20404e1bc9a0SAchim Leubner void *osMemHandle = agNULL;
20414e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
20424e1bc9a0SAchim Leubner bit32 CoreDumpLength = 16384; /* change it once data is available */
20434e1bc9a0SAchim Leubner bit32 EventLogOffset = 65536;
20444e1bc9a0SAchim Leubner
20454e1bc9a0SAchim Leubner ///saGetControllerStatus(agRoot, &RegDump);
20464e1bc9a0SAchim Leubner /* length of FSA as provided by application */
20474e1bc9a0SAchim Leubner RequestLength = agIOCTLPayload->Length;
20484e1bc9a0SAchim Leubner /// FunctionSpecificOffset = 0; /* Offset into the FunctionSpecificArea of payload */
20494e1bc9a0SAchim Leubner /* offset into core dump that was passed from application */
20504e1bc9a0SAchim Leubner Offset = agIOCTLPayload->Reserved;
20514e1bc9a0SAchim Leubner
20524e1bc9a0SAchim Leubner if((CoreDumpLength <= Offset)&&
20534e1bc9a0SAchim Leubner (agIOCTLPayload->MinorFunction != IOCTL_MN_FW_GET_EVENT_FLASH_LOG1)&&
20544e1bc9a0SAchim Leubner (agIOCTLPayload->MinorFunction != IOCTL_MN_FW_GET_EVENT_FLASH_LOG2))
20554e1bc9a0SAchim Leubner {
20564e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
20574e1bc9a0SAchim Leubner agIOCTLPayload->Length = 0;
20584e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
20594e1bc9a0SAchim Leubner return status;
20604e1bc9a0SAchim Leubner }
20614e1bc9a0SAchim Leubner regDumpInfo.regDumpOffset = Offset;
20624e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
20634e1bc9a0SAchim Leubner /* dump either aap1 or iop registers */
20644e1bc9a0SAchim Leubner switch(agIOCTLPayload->MinorFunction){
20654e1bc9a0SAchim Leubner
20664e1bc9a0SAchim Leubner /*Coredump*/
20674e1bc9a0SAchim Leubner case IOCTL_MN_FW_GET_CORE_DUMP_AAP1:
20684e1bc9a0SAchim Leubner //CoreDumpBAROffset = RegDump.fatalErrorInfo.regDumpOffset0; /* get this from mpi config table */
20694e1bc9a0SAchim Leubner //CoreDumpLength = RegDump.fatalErrorInfo.regDumpLen0;
20704e1bc9a0SAchim Leubner /*changes for added Call back*/
20714e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
20724e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
20734e1bc9a0SAchim Leubner regDumpInfo.regDumpSrc = 0;
20744e1bc9a0SAchim Leubner regDumpInfo.regDumpNum = 0;
20754e1bc9a0SAchim Leubner regDumpInfo.directLen = RequestLength;
20764e1bc9a0SAchim Leubner regDumpInfo.directData = &agIOCTLPayload->FunctionSpecificArea[0];
20774e1bc9a0SAchim Leubner /*changes for added Call back*/
20784e1bc9a0SAchim Leubner //status = IOCTL_CALL_SUCCESS;
20794e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
20804e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
20814e1bc9a0SAchim Leubner break;
20824e1bc9a0SAchim Leubner case IOCTL_MN_FW_GET_CORE_DUMP_IOP:
20834e1bc9a0SAchim Leubner //CoreDumpBAROffset = RegDump.fatalErrorInfo.regDumpOffset1; /* get this from mpi config table */
20844e1bc9a0SAchim Leubner //CoreDumpLength = RegDump.fatalErrorInfo.regDumpLen1;
20854e1bc9a0SAchim Leubner /*changes for added Call back*/
20864e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
20874e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
20884e1bc9a0SAchim Leubner regDumpInfo.regDumpSrc = 0;
20894e1bc9a0SAchim Leubner regDumpInfo.regDumpNum = 1;
20904e1bc9a0SAchim Leubner regDumpInfo.directLen = RequestLength;
20914e1bc9a0SAchim Leubner regDumpInfo.directData = &agIOCTLPayload->FunctionSpecificArea[0];
20924e1bc9a0SAchim Leubner /*changes for added Call back*/
20934e1bc9a0SAchim Leubner //status = IOCTL_CALL_SUCCESS;
20944e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
20954e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
20964e1bc9a0SAchim Leubner break;
20974e1bc9a0SAchim Leubner case IOCTL_MN_FW_GET_CORE_DUMP_FLASH_AAP1:
20984e1bc9a0SAchim Leubner regDumpInfo.regDumpSrc = 1;
20994e1bc9a0SAchim Leubner regDumpInfo.regDumpNum = 0;
21004e1bc9a0SAchim Leubner if(RequestLength != 0)
21014e1bc9a0SAchim Leubner {
21024e1bc9a0SAchim Leubner if(ostiAllocMemory( tiRoot,
21034e1bc9a0SAchim Leubner &osMemHandle,
21044e1bc9a0SAchim Leubner (void **)&buffer,
21054e1bc9a0SAchim Leubner &(regDumpInfo.indirectAddrUpper32),
21064e1bc9a0SAchim Leubner &(regDumpInfo.indirectAddrLower32),
21074e1bc9a0SAchim Leubner 8,
21084e1bc9a0SAchim Leubner RequestLength,
21094e1bc9a0SAchim Leubner agFALSE))
21104e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
21114e1bc9a0SAchim Leubner }
21124e1bc9a0SAchim Leubner osti_memset((void *)buffer, 0, RequestLength);
21134e1bc9a0SAchim Leubner regDumpInfo.indirectLen = RequestLength;
21144e1bc9a0SAchim Leubner
21154e1bc9a0SAchim Leubner // use FW control place in shared structure to keep the neccesary information
21164e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
21174e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = buffer;
21184e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
21194e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len = RequestLength;
21204e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
21214e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
21224e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
21234e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
21244e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
21254e1bc9a0SAchim Leubner break;
21264e1bc9a0SAchim Leubner case IOCTL_MN_FW_GET_CORE_DUMP_FLASH_IOP:
21274e1bc9a0SAchim Leubner regDumpInfo.regDumpSrc = 1;
21284e1bc9a0SAchim Leubner regDumpInfo.regDumpNum = 1;
21294e1bc9a0SAchim Leubner if(RequestLength != 0)
21304e1bc9a0SAchim Leubner {
21314e1bc9a0SAchim Leubner if(ostiAllocMemory( tiRoot,
21324e1bc9a0SAchim Leubner &osMemHandle,
21334e1bc9a0SAchim Leubner (void **)&buffer,
21344e1bc9a0SAchim Leubner &(regDumpInfo.indirectAddrUpper32),
21354e1bc9a0SAchim Leubner &(regDumpInfo.indirectAddrLower32),
21364e1bc9a0SAchim Leubner 8,
21374e1bc9a0SAchim Leubner RequestLength,
21384e1bc9a0SAchim Leubner agFALSE))
21394e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
21404e1bc9a0SAchim Leubner }
21414e1bc9a0SAchim Leubner osti_memset((void *)buffer, 0, RequestLength);
21424e1bc9a0SAchim Leubner regDumpInfo.indirectLen = RequestLength;
21434e1bc9a0SAchim Leubner
21444e1bc9a0SAchim Leubner // use FW control place in shared structure to keep the neccesary information
21454e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
21464e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = buffer;
21474e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
21484e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len = RequestLength;
21494e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
21504e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
21514e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
21524e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
21534e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
21544e1bc9a0SAchim Leubner break;
21554e1bc9a0SAchim Leubner /*EventLog from Flash*/
21564e1bc9a0SAchim Leubner case IOCTL_MN_FW_GET_EVENT_FLASH_LOG1: //aap1 Eventlog
21574e1bc9a0SAchim Leubner if(CoreDumpLength + EventLogOffset <= Offset)
21584e1bc9a0SAchim Leubner {
21594e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
21604e1bc9a0SAchim Leubner agIOCTLPayload->Length = 0;
21614e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
21624e1bc9a0SAchim Leubner return status;
21634e1bc9a0SAchim Leubner }
21644e1bc9a0SAchim Leubner regDumpInfo.regDumpSrc = 1;
21654e1bc9a0SAchim Leubner regDumpInfo.regDumpNum = 0;
21664e1bc9a0SAchim Leubner if(RequestLength != 0)
21674e1bc9a0SAchim Leubner {
21684e1bc9a0SAchim Leubner if(ostiAllocMemory( tiRoot,
21694e1bc9a0SAchim Leubner &osMemHandle,
21704e1bc9a0SAchim Leubner (void **)&buffer,
21714e1bc9a0SAchim Leubner &(regDumpInfo.indirectAddrUpper32),
21724e1bc9a0SAchim Leubner &(regDumpInfo.indirectAddrLower32),
21734e1bc9a0SAchim Leubner 8,
21744e1bc9a0SAchim Leubner RequestLength,
21754e1bc9a0SAchim Leubner agFALSE))
21764e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
21774e1bc9a0SAchim Leubner }
21784e1bc9a0SAchim Leubner osti_memset((void *)buffer, 0, RequestLength);
21794e1bc9a0SAchim Leubner regDumpInfo.indirectLen = RequestLength;
21804e1bc9a0SAchim Leubner
21814e1bc9a0SAchim Leubner // use FW control place in shared structure to keep the neccesary information
21824e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
21834e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = buffer;
21844e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
21854e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len = RequestLength;
21864e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
21874e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
21884e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
21894e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
21904e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
21914e1bc9a0SAchim Leubner break;
21924e1bc9a0SAchim Leubner case IOCTL_MN_FW_GET_EVENT_FLASH_LOG2: //iop Eventlog
21934e1bc9a0SAchim Leubner if(CoreDumpLength + EventLogOffset <= Offset)
21944e1bc9a0SAchim Leubner {
21954e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
21964e1bc9a0SAchim Leubner agIOCTLPayload->Length = 0;
21974e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
21984e1bc9a0SAchim Leubner return status;
21994e1bc9a0SAchim Leubner }
22004e1bc9a0SAchim Leubner regDumpInfo.regDumpSrc = 1;
22014e1bc9a0SAchim Leubner regDumpInfo.regDumpNum = 1;
22024e1bc9a0SAchim Leubner if(RequestLength != 0)
22034e1bc9a0SAchim Leubner {
22044e1bc9a0SAchim Leubner if(ostiAllocMemory( tiRoot,
22054e1bc9a0SAchim Leubner &osMemHandle,
22064e1bc9a0SAchim Leubner (void **)&buffer,
22074e1bc9a0SAchim Leubner &(regDumpInfo.indirectAddrUpper32),
22084e1bc9a0SAchim Leubner &(regDumpInfo.indirectAddrLower32),
22094e1bc9a0SAchim Leubner 8,
22104e1bc9a0SAchim Leubner RequestLength,
22114e1bc9a0SAchim Leubner agFALSE))
22124e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
22134e1bc9a0SAchim Leubner }
22144e1bc9a0SAchim Leubner osti_memset((void *)buffer, 0, RequestLength);
22154e1bc9a0SAchim Leubner regDumpInfo.indirectLen = RequestLength;
22164e1bc9a0SAchim Leubner
22174e1bc9a0SAchim Leubner // use FW control place in shared structure to keep the neccesary information
22184e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
22194e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = buffer;
22204e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
22214e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len = RequestLength;
22224e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
22234e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
22244e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
22254e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
22264e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
22274e1bc9a0SAchim Leubner break;
22284e1bc9a0SAchim Leubner default:
22294e1bc9a0SAchim Leubner status = IOCTL_CALL_INVALID_CODE;
22304e1bc9a0SAchim Leubner TI_DBG1(("tiCOMMgntIOCTL: ERROR: Wrong IOCTL code %d\n", agIOCTLPayload->MinorFunction));
22314e1bc9a0SAchim Leubner break;
22324e1bc9a0SAchim Leubner }
22334e1bc9a0SAchim Leubner if(saGetRegisterDump(agRoot, agNULL, 0, ®DumpInfo) != AGSA_RC_SUCCESS)
22344e1bc9a0SAchim Leubner {
22354e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
22364e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
22374e1bc9a0SAchim Leubner }
22384e1bc9a0SAchim Leubner
22394e1bc9a0SAchim Leubner return status;
22404e1bc9a0SAchim Leubner }
22414e1bc9a0SAchim Leubner
22424e1bc9a0SAchim Leubner osGLOBAL void
ostiCOMMgntVPDSetIOCTLRsp(tiRoot_t * tiRoot,bit32 status)22434e1bc9a0SAchim Leubner ostiCOMMgntVPDSetIOCTLRsp(
22444e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
22454e1bc9a0SAchim Leubner bit32 status
22464e1bc9a0SAchim Leubner )
22474e1bc9a0SAchim Leubner {
22484e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
22494e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
22504e1bc9a0SAchim Leubner // agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
22514e1bc9a0SAchim Leubner
22524e1bc9a0SAchim Leubner TI_DBG1(("ostiCOMMgntVPDSetIOCTLRsp: start\n"));
22534e1bc9a0SAchim Leubner (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
22544e1bc9a0SAchim Leubner
22554e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot,
22564e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer,
22574e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len);
22584e1bc9a0SAchim Leubner
22594e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
22604e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2,
22614e1bc9a0SAchim Leubner NULL);
22624e1bc9a0SAchim Leubner }
22634e1bc9a0SAchim Leubner
22644e1bc9a0SAchim Leubner /*****************************************************************************
22654e1bc9a0SAchim Leubner *
22664e1bc9a0SAchim Leubner * tdsaNVMDSetIoctl
22674e1bc9a0SAchim Leubner *
22684e1bc9a0SAchim Leubner * Purpose: This routine is called to set Config. SEEPROM information.
22694e1bc9a0SAchim Leubner * This function is used for both target and initiator.
22704e1bc9a0SAchim Leubner *
22714e1bc9a0SAchim Leubner * Parameters:
22724e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
22734e1bc9a0SAchim Leubner * agIOCTLPayload: Pointer to the IOCTL payload.
22744e1bc9a0SAchim Leubner * agParam1: Pointer to pass context handle for IOCTL DMA operation
22754e1bc9a0SAchim Leubner * agParam2: Pointer to pass context handle for IOCTL DMA operation
22764e1bc9a0SAchim Leubner * agParam3: Pointer to pass context handle for IOCTL DMA operation
22774e1bc9a0SAchim Leubner *
22784e1bc9a0SAchim Leubner * Return:
22794e1bc9a0SAchim Leubner *
22804e1bc9a0SAchim Leubner * IOCTL_CALL_SUCCESS The requested operation completed successfully.
22814e1bc9a0SAchim Leubner * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
22824e1bc9a0SAchim Leubner * Detail error code is function specific and
22834e1bc9a0SAchim Leubner * defined by the specific IOCTL function.
22844e1bc9a0SAchim Leubner * IOCTL_CALL_PENDING This request is asynchronous and completed
22854e1bc9a0SAchim Leubner * in some other context.
22864e1bc9a0SAchim Leubner * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
22874e1bc9a0SAchim Leubner *
22884e1bc9a0SAchim Leubner *
22894e1bc9a0SAchim Leubner *****************************************************************************/
22904e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaNVMDSetIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)22914e1bc9a0SAchim Leubner tdsaNVMDSetIoctl(
22924e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
22934e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
22944e1bc9a0SAchim Leubner void *agParam1,
22954e1bc9a0SAchim Leubner void *agParam2,
22964e1bc9a0SAchim Leubner void *agParam3
22974e1bc9a0SAchim Leubner )
22984e1bc9a0SAchim Leubner {
22994e1bc9a0SAchim Leubner bit32 RequestLength = 0;
23004e1bc9a0SAchim Leubner bit32 bufAddrUpper = 0;
23014e1bc9a0SAchim Leubner bit32 bufAddrLower = 0;
23024e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
23034e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
23044e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
23054e1bc9a0SAchim Leubner void *buffer = agNULL;
23064e1bc9a0SAchim Leubner void *osMemHandle = agNULL;
23074e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
23084e1bc9a0SAchim Leubner agsaNVMDData_t nvmdInfo;
23094e1bc9a0SAchim Leubner
23104e1bc9a0SAchim Leubner
23114e1bc9a0SAchim Leubner TI_DBG2(("tdsaNVMDSetIoctl: start\n"));
23124e1bc9a0SAchim Leubner
23134e1bc9a0SAchim Leubner RequestLength = agIOCTLPayload->Length;
23144e1bc9a0SAchim Leubner
23154e1bc9a0SAchim Leubner osti_memset(&nvmdInfo, 0, sizeof(agsaNVMDData_t));
23164e1bc9a0SAchim Leubner
23174e1bc9a0SAchim Leubner switch(agIOCTLPayload->MinorFunction)
23184e1bc9a0SAchim Leubner {
23194e1bc9a0SAchim Leubner case IOCTL_MN_NVMD_SET_CONFIG:
23204e1bc9a0SAchim Leubner
23214e1bc9a0SAchim Leubner //nvmdInfo.NVMDevice = 1;
23224e1bc9a0SAchim Leubner nvmdInfo.NVMDevice = *((bit8*)agParam3);
23234e1bc9a0SAchim Leubner nvmdInfo.signature = 0xFEDCBA98;
23244e1bc9a0SAchim Leubner nvmdInfo.dataOffsetAddress = agIOCTLPayload->Reserved;
23254e1bc9a0SAchim Leubner nvmdInfo.indirectPayload = 1;
23264e1bc9a0SAchim Leubner nvmdInfo.indirectLen = RequestLength;
23274e1bc9a0SAchim Leubner
23284e1bc9a0SAchim Leubner if (nvmdInfo.NVMDevice == 0) {
23294e1bc9a0SAchim Leubner nvmdInfo.TWIDeviceAddress = 0xa0;
23304e1bc9a0SAchim Leubner nvmdInfo.TWIBusNumber = 0;
23314e1bc9a0SAchim Leubner nvmdInfo.TWIDevicePageSize = 0;
23324e1bc9a0SAchim Leubner nvmdInfo.TWIDeviceAddressSize = 1;
23334e1bc9a0SAchim Leubner }
23344e1bc9a0SAchim Leubner
23354e1bc9a0SAchim Leubner if(RequestLength != 0)
23364e1bc9a0SAchim Leubner {
23374e1bc9a0SAchim Leubner if(ostiAllocMemory( tiRoot,
23384e1bc9a0SAchim Leubner &osMemHandle,
23394e1bc9a0SAchim Leubner (void **)&buffer,
23404e1bc9a0SAchim Leubner &bufAddrUpper,
23414e1bc9a0SAchim Leubner &bufAddrLower,
23424e1bc9a0SAchim Leubner 8,
23434e1bc9a0SAchim Leubner RequestLength,
23444e1bc9a0SAchim Leubner agFALSE))
23454e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
23464e1bc9a0SAchim Leubner }
23474e1bc9a0SAchim Leubner else
23484e1bc9a0SAchim Leubner {
23494e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
23504e1bc9a0SAchim Leubner }
23514e1bc9a0SAchim Leubner
23524e1bc9a0SAchim Leubner osti_memset((void *)buffer, 0, RequestLength);
23534e1bc9a0SAchim Leubner
23544e1bc9a0SAchim Leubner osti_memcpy((void *)buffer,
23554e1bc9a0SAchim Leubner agIOCTLPayload->FunctionSpecificArea,
23564e1bc9a0SAchim Leubner RequestLength);
23574e1bc9a0SAchim Leubner
23584e1bc9a0SAchim Leubner nvmdInfo.indirectAddrLower32 = bufAddrLower;
23594e1bc9a0SAchim Leubner nvmdInfo.indirectAddrUpper32 = bufAddrUpper;
23604e1bc9a0SAchim Leubner // use FW control place in shared structure to keep the neccesary information
23614e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
23624e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = buffer;
23634e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
23644e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len = RequestLength;
23654e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
23664e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
23674e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
23684e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
23694e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
23704e1bc9a0SAchim Leubner break;
23714e1bc9a0SAchim Leubner default:
23724e1bc9a0SAchim Leubner status = IOCTL_CALL_INVALID_CODE;
23734e1bc9a0SAchim Leubner TI_DBG1(("tdsaNVMDSetIoctl: ERROR: Wrong IOCTL code %d\n", agIOCTLPayload->MinorFunction));
23744e1bc9a0SAchim Leubner break;
23754e1bc9a0SAchim Leubner }
23764e1bc9a0SAchim Leubner
23774e1bc9a0SAchim Leubner if(saSetNVMDCommand(agRoot, agNULL, 0, &nvmdInfo) != AGSA_RC_SUCCESS)
23784e1bc9a0SAchim Leubner {
23794e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
23804e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
23814e1bc9a0SAchim Leubner }
23824e1bc9a0SAchim Leubner
23834e1bc9a0SAchim Leubner return status;
23844e1bc9a0SAchim Leubner
23854e1bc9a0SAchim Leubner }
23864e1bc9a0SAchim Leubner
23874e1bc9a0SAchim Leubner /*****************************************************************************
23884e1bc9a0SAchim Leubner *
23894e1bc9a0SAchim Leubner * tdsaNVMDGetIoctl
23904e1bc9a0SAchim Leubner *
23914e1bc9a0SAchim Leubner * Purpose: This routine is called to get Config. SEEPROM information.
23924e1bc9a0SAchim Leubner * This function is used for both target and initiator.
23934e1bc9a0SAchim Leubner *
23944e1bc9a0SAchim Leubner * Parameters:
23954e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
23964e1bc9a0SAchim Leubner * agIOCTLPayload: Pointer to the IOCTL payload.
23974e1bc9a0SAchim Leubner * agParam1: Pointer to pass context handle for IOCTL DMA operation
23984e1bc9a0SAchim Leubner * agParam2: Pointer to pass context handle for IOCTL DMA operation
23994e1bc9a0SAchim Leubner * agParam3: Pointer to pass context handle for IOCTL DMA operation
24004e1bc9a0SAchim Leubner *
24014e1bc9a0SAchim Leubner * Return:
24024e1bc9a0SAchim Leubner *
24034e1bc9a0SAchim Leubner * IOCTL_CALL_SUCCESS The requested operation completed successfully.
24044e1bc9a0SAchim Leubner * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
24054e1bc9a0SAchim Leubner * Detail error code is function specific and
24064e1bc9a0SAchim Leubner * defined by the specific IOCTL function.
24074e1bc9a0SAchim Leubner * IOCTL_CALL_PENDING This request is asynchronous and completed
24084e1bc9a0SAchim Leubner * in some other context.
24094e1bc9a0SAchim Leubner * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
24104e1bc9a0SAchim Leubner *
24114e1bc9a0SAchim Leubner *
24124e1bc9a0SAchim Leubner *****************************************************************************/
24134e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaNVMDGetIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)24144e1bc9a0SAchim Leubner tdsaNVMDGetIoctl(
24154e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
24164e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
24174e1bc9a0SAchim Leubner void *agParam1,
24184e1bc9a0SAchim Leubner void *agParam2,
24194e1bc9a0SAchim Leubner void *agParam3
24204e1bc9a0SAchim Leubner )
24214e1bc9a0SAchim Leubner {
24224e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
24234e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
24244e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
24254e1bc9a0SAchim Leubner void *buffer = agNULL;
24264e1bc9a0SAchim Leubner void *osMemHandle = agNULL;
24274e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
24284e1bc9a0SAchim Leubner agsaNVMDData_t nvmdInfo;
24294e1bc9a0SAchim Leubner bit32 Offset = 0;
24304e1bc9a0SAchim Leubner bit32 RequestLength = 0;
24314e1bc9a0SAchim Leubner bit32 ostiMemoryStatus = 0;
24324e1bc9a0SAchim Leubner bit32 i,j;
24334e1bc9a0SAchim Leubner bit8* seepromBuffer;
24344e1bc9a0SAchim Leubner bit8* phySettingsBuffer;
24354e1bc9a0SAchim Leubner
24364e1bc9a0SAchim Leubner
24374e1bc9a0SAchim Leubner TI_DBG2(("tdsaNVMDGetIoctl: start\n"));
24384e1bc9a0SAchim Leubner
24394e1bc9a0SAchim Leubner RequestLength = agIOCTLPayload->Length;
24404e1bc9a0SAchim Leubner Offset = agIOCTLPayload->Reserved;
24414e1bc9a0SAchim Leubner
24424e1bc9a0SAchim Leubner osti_memset(&nvmdInfo, 0, sizeof(agsaNVMDData_t));
24434e1bc9a0SAchim Leubner /* This condition is not valid for direct read so commenting */
24444e1bc9a0SAchim Leubner /*if(!tiIS_SPC(agRoot)) {
24454e1bc9a0SAchim Leubner if( RequestLength <= Offset ) //4096-max seeprom size
24464e1bc9a0SAchim Leubner {
24474e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
24484e1bc9a0SAchim Leubner agIOCTLPayload->Length = 0;
24494e1bc9a0SAchim Leubner status=IOCTL_CALL_SUCCESS;
24504e1bc9a0SAchim Leubner return status;
24514e1bc9a0SAchim Leubner }
24524e1bc9a0SAchim Leubner }*/
24534e1bc9a0SAchim Leubner
24544e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
24554e1bc9a0SAchim Leubner
24564e1bc9a0SAchim Leubner switch(agIOCTLPayload->MinorFunction)
24574e1bc9a0SAchim Leubner {
24584e1bc9a0SAchim Leubner case IOCTL_MN_NVMD_GET_CONFIG:
24594e1bc9a0SAchim Leubner
24604e1bc9a0SAchim Leubner // nvmdInfo.NVMDevice = 1;
24614e1bc9a0SAchim Leubner nvmdInfo.NVMDevice = *((bit8*)agParam3);
24624e1bc9a0SAchim Leubner nvmdInfo.signature = 0xFEDCBA98;
24634e1bc9a0SAchim Leubner nvmdInfo.dataOffsetAddress = Offset;
24644e1bc9a0SAchim Leubner nvmdInfo.indirectPayload = 1;
24654e1bc9a0SAchim Leubner nvmdInfo.indirectLen = RequestLength;
24664e1bc9a0SAchim Leubner
24674e1bc9a0SAchim Leubner if (nvmdInfo.NVMDevice == 0) {
24684e1bc9a0SAchim Leubner nvmdInfo.TWIDeviceAddress = 0xa0;
24694e1bc9a0SAchim Leubner nvmdInfo.TWIBusNumber = 0;
24704e1bc9a0SAchim Leubner nvmdInfo.TWIDevicePageSize = 0;
24714e1bc9a0SAchim Leubner nvmdInfo.TWIDeviceAddressSize = 1;
24724e1bc9a0SAchim Leubner }
24734e1bc9a0SAchim Leubner
24744e1bc9a0SAchim Leubner if(RequestLength != 0)
24754e1bc9a0SAchim Leubner {
24764e1bc9a0SAchim Leubner ostiMemoryStatus = ostiAllocMemory( tiRoot,
24774e1bc9a0SAchim Leubner &osMemHandle,
24784e1bc9a0SAchim Leubner (void **)&buffer,
24794e1bc9a0SAchim Leubner &(nvmdInfo.indirectAddrUpper32),
24804e1bc9a0SAchim Leubner &(nvmdInfo.indirectAddrLower32),
24814e1bc9a0SAchim Leubner 8,
24824e1bc9a0SAchim Leubner RequestLength,
24834e1bc9a0SAchim Leubner agFALSE);
24844e1bc9a0SAchim Leubner if((ostiMemoryStatus != tiSuccess) && (buffer == agNULL))
24854e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
24864e1bc9a0SAchim Leubner }
24874e1bc9a0SAchim Leubner else
24884e1bc9a0SAchim Leubner {
24894e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
24904e1bc9a0SAchim Leubner }
24914e1bc9a0SAchim Leubner osti_memset((void *)buffer, 0, RequestLength);
24924e1bc9a0SAchim Leubner
24934e1bc9a0SAchim Leubner // use FW control place in shared structure to keep the neccesary information
24944e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
24954e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = buffer;
24964e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
24974e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len = RequestLength;
24984e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
24994e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
25004e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
25014e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
25024e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
25034e1bc9a0SAchim Leubner break;
25044e1bc9a0SAchim Leubner default:
25054e1bc9a0SAchim Leubner status = IOCTL_CALL_INVALID_CODE;
25064e1bc9a0SAchim Leubner TI_DBG1(("tiCOMMgntIOCTL: ERROR: Wrong IOCTL code %d\n", agIOCTLPayload->MinorFunction));
25074e1bc9a0SAchim Leubner break;
25084e1bc9a0SAchim Leubner }
25094e1bc9a0SAchim Leubner tdsaAllShared->NvmdResponseSet = 0;
25104e1bc9a0SAchim Leubner
25114e1bc9a0SAchim Leubner if(saGetNVMDCommand(agRoot, agNULL, 0, &nvmdInfo) != AGSA_RC_SUCCESS)
25124e1bc9a0SAchim Leubner {
25134e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
25144e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
25154e1bc9a0SAchim Leubner return status;
25164e1bc9a0SAchim Leubner }
25174e1bc9a0SAchim Leubner /* Copy the SAS address */
25184e1bc9a0SAchim Leubner if(agParam1 == agNULL)
25194e1bc9a0SAchim Leubner
25204e1bc9a0SAchim Leubner {
25214e1bc9a0SAchim Leubner while(!tdsaAllShared->NvmdResponseSet)
25224e1bc9a0SAchim Leubner {
25234e1bc9a0SAchim Leubner // tiCOMDelayedInterruptHandler(tiRoot, 0, 1, tiNonInterruptContext);
25244e1bc9a0SAchim Leubner }
25254e1bc9a0SAchim Leubner if(nvmdInfo.NVMDevice == 4 || nvmdInfo.NVMDevice == 1)
25264e1bc9a0SAchim Leubner {
25274e1bc9a0SAchim Leubner seepromBuffer = buffer;
25284e1bc9a0SAchim Leubner /*Get Initiator SAS address*/
25294e1bc9a0SAchim Leubner
25304e1bc9a0SAchim Leubner if(tiIS_SPC(agRoot))
25314e1bc9a0SAchim Leubner {
25324e1bc9a0SAchim Leubner for(j=0,i=ADAPTER_WWN_SPC_START_OFFSET; i<= ADAPTER_WWN_SPC_END_OFFSET; i++,j++)
25334e1bc9a0SAchim Leubner agIOCTLPayload->FunctionSpecificArea[j] = seepromBuffer[i];
25344e1bc9a0SAchim Leubner }
25354e1bc9a0SAchim Leubner else
25364e1bc9a0SAchim Leubner {
25374e1bc9a0SAchim Leubner for(j=0,i=ADAPTER_WWN_START_OFFSET; i<= ADAPTER_WWN_END_OFFSET; i++,j++)
25384e1bc9a0SAchim Leubner agIOCTLPayload->FunctionSpecificArea[j] = seepromBuffer[i];
25394e1bc9a0SAchim Leubner }
25404e1bc9a0SAchim Leubner }
25414e1bc9a0SAchim Leubner /* Copy the Phy settings */
25424e1bc9a0SAchim Leubner else if(nvmdInfo.NVMDevice == 6)
25434e1bc9a0SAchim Leubner {
25444e1bc9a0SAchim Leubner phySettingsBuffer = buffer;
25454e1bc9a0SAchim Leubner for(i=0; i<PHY_SETTINGS_LEN; i++)
25464e1bc9a0SAchim Leubner agIOCTLPayload->FunctionSpecificArea[i] = phySettingsBuffer[i];
25474e1bc9a0SAchim Leubner }
25484e1bc9a0SAchim Leubner tdsaAllShared->NvmdResponseSet = 0;
25494e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot, tdsaAllShared->tdFWControlEx.buffer, tdsaAllShared->tdFWControlEx.len);
25504e1bc9a0SAchim Leubner
25514e1bc9a0SAchim Leubner }
25524e1bc9a0SAchim Leubner return status;
25534e1bc9a0SAchim Leubner
25544e1bc9a0SAchim Leubner }
25554e1bc9a0SAchim Leubner
25564e1bc9a0SAchim Leubner /*****************************************************************************
25574e1bc9a0SAchim Leubner *
25584e1bc9a0SAchim Leubner * tdsaDeviceInfoGetIoctl
25594e1bc9a0SAchim Leubner *
25604e1bc9a0SAchim Leubner * Purpose: This routine is called to get the specified device information.
25614e1bc9a0SAchim Leubner *
25624e1bc9a0SAchim Leubner * Parameters:
25634e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
25644e1bc9a0SAchim Leubner * agIOCTLPayload: Pointer to the IOCTL payload.
25654e1bc9a0SAchim Leubner * agParam1: Pointer to pass context handle for IOCTL DMA operation
25664e1bc9a0SAchim Leubner * agParam2: Pointer to pass context handle for IOCTL DMA operation
25674e1bc9a0SAchim Leubner * agParam3: Pointer to pass context handle for IOCTL DMA operation
25684e1bc9a0SAchim Leubner *
25694e1bc9a0SAchim Leubner * Return:
25704e1bc9a0SAchim Leubner *
25714e1bc9a0SAchim Leubner * IOCTL_CALL_SUCCESS The requested operation completed successfully.
25724e1bc9a0SAchim Leubner * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
25734e1bc9a0SAchim Leubner * Detail error code is function specific and
25744e1bc9a0SAchim Leubner * defined by the specific IOCTL function.
25754e1bc9a0SAchim Leubner * IOCTL_CALL_PENDING This request is asynchronous and completed
25764e1bc9a0SAchim Leubner * in some other context.
25774e1bc9a0SAchim Leubner * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
25784e1bc9a0SAchim Leubner *
25794e1bc9a0SAchim Leubner *
25804e1bc9a0SAchim Leubner *****************************************************************************/
25814e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaDeviceInfoGetIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)25824e1bc9a0SAchim Leubner tdsaDeviceInfoGetIoctl(
25834e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
25844e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
25854e1bc9a0SAchim Leubner void *agParam1,
25864e1bc9a0SAchim Leubner void *agParam2,
25874e1bc9a0SAchim Leubner void *agParam3
25884e1bc9a0SAchim Leubner )
25894e1bc9a0SAchim Leubner {
25904e1bc9a0SAchim Leubner tdsaDeviceData_t *oneDeviceData = agNULL;
25914e1bc9a0SAchim Leubner tiDeviceHandle_t *tiDeviceHandle = agNULL;
25924e1bc9a0SAchim Leubner tdDeviceInfoPayload_t *pDeviceInfo = agNULL;
25934e1bc9a0SAchim Leubner /*agsaDevHandle_t *agDevHandle = agNULL;*/
25944e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
25954e1bc9a0SAchim Leubner
25964e1bc9a0SAchim Leubner pDeviceInfo = (tdDeviceInfoPayload_t*)agIOCTLPayload->FunctionSpecificArea;
25974e1bc9a0SAchim Leubner
25984e1bc9a0SAchim Leubner TI_DBG3(("tdsaDeviceInfoGetIoctl: %d:%3d:%d %p %p %p\n",
25994e1bc9a0SAchim Leubner (bit8)pDeviceInfo->PathId,
26004e1bc9a0SAchim Leubner (bit8)pDeviceInfo->TargetId,
26014e1bc9a0SAchim Leubner (bit8)pDeviceInfo->Lun,
26024e1bc9a0SAchim Leubner agParam1,
26034e1bc9a0SAchim Leubner agParam2,
26044e1bc9a0SAchim Leubner agParam3));
26054e1bc9a0SAchim Leubner
26064e1bc9a0SAchim Leubner tiDeviceHandle = ostiMapToDevHandle(tiRoot,
26074e1bc9a0SAchim Leubner (bit8)pDeviceInfo->PathId,
26084e1bc9a0SAchim Leubner (bit8)pDeviceInfo->TargetId,
26094e1bc9a0SAchim Leubner (bit8)pDeviceInfo->Lun
26104e1bc9a0SAchim Leubner );
26114e1bc9a0SAchim Leubner
26124e1bc9a0SAchim Leubner if (tiDeviceHandle == agNULL)
26134e1bc9a0SAchim Leubner {
26144e1bc9a0SAchim Leubner TI_DBG1(("tdsaDeviceInfoGetIoctl: tiDeviceHandle is NULL !!!! SCSI address = %d:%3d:%d\n",
26154e1bc9a0SAchim Leubner pDeviceInfo->PathId, pDeviceInfo->TargetId, pDeviceInfo->Lun));
26164e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INVALID_DEVICE;
26174e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
26184e1bc9a0SAchim Leubner return status;
26194e1bc9a0SAchim Leubner }
26204e1bc9a0SAchim Leubner
26214e1bc9a0SAchim Leubner oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
26224e1bc9a0SAchim Leubner if(oneDeviceData == agNULL)
26234e1bc9a0SAchim Leubner {
26244e1bc9a0SAchim Leubner TI_DBG1(("tdsaDeviceInfoGetIoctl: tiDeviceHandle=%p DeviceData is NULL!!! SCSI address = %d:%3d:%d\n",
26254e1bc9a0SAchim Leubner tiDeviceHandle, pDeviceInfo->PathId, pDeviceInfo->TargetId, pDeviceInfo->Lun));
26264e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INVALID_DEVICE;
26274e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
26284e1bc9a0SAchim Leubner return status;
26294e1bc9a0SAchim Leubner }
26304e1bc9a0SAchim Leubner
26314e1bc9a0SAchim Leubner /* for hotplug */
26324e1bc9a0SAchim Leubner if (oneDeviceData->valid != agTRUE || oneDeviceData->registered != agTRUE ||
26334e1bc9a0SAchim Leubner oneDeviceData->tdPortContext == agNULL )
26344e1bc9a0SAchim Leubner {
26354e1bc9a0SAchim Leubner TI_DBG1(("tdsaDeviceInfoGetIoctl: tiDeviceHandle=%p did %d DeviceData was removed!!! SCSI address = %d:%3d:%d\n",
26364e1bc9a0SAchim Leubner tiDeviceHandle, oneDeviceData->id, pDeviceInfo->PathId, pDeviceInfo->TargetId, pDeviceInfo->Lun));
26374e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INVALID_DEVICE;
26384e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
26394e1bc9a0SAchim Leubner return status;
26404e1bc9a0SAchim Leubner }
26414e1bc9a0SAchim Leubner
26424e1bc9a0SAchim Leubner /* fill the device information in IOCTL payload */
26434e1bc9a0SAchim Leubner pDeviceInfo->devInfo.phyId = oneDeviceData->phyID;
26444e1bc9a0SAchim Leubner osti_memcpy(&pDeviceInfo->devInfo.sasAddressHi, oneDeviceData->agDeviceInfo.sasAddressHi, sizeof(bit32));
26454e1bc9a0SAchim Leubner osti_memcpy(&pDeviceInfo->devInfo.sasAddressLo, oneDeviceData->agDeviceInfo.sasAddressLo, sizeof(bit32));
26464e1bc9a0SAchim Leubner
26474e1bc9a0SAchim Leubner pDeviceInfo->devInfo.sasAddressHi = DMA_BEBIT32_TO_BIT32(pDeviceInfo->devInfo.sasAddressHi);
26484e1bc9a0SAchim Leubner pDeviceInfo->devInfo.sasAddressLo = DMA_BEBIT32_TO_BIT32(pDeviceInfo->devInfo.sasAddressLo);
26494e1bc9a0SAchim Leubner
26504e1bc9a0SAchim Leubner pDeviceInfo->devInfo.deviceType = (oneDeviceData->agDeviceInfo.devType_S_Rate & 0x30) >> 4;
26514e1bc9a0SAchim Leubner pDeviceInfo->devInfo.linkRate = oneDeviceData->agDeviceInfo.devType_S_Rate & 0x0F;
26524e1bc9a0SAchim Leubner
26534e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
26544e1bc9a0SAchim Leubner
26554e1bc9a0SAchim Leubner TI_DBG3(("tdsaDeviceInfoGetIoctl:IOCTL_CALL_SUCCESS\n"));
26564e1bc9a0SAchim Leubner
26574e1bc9a0SAchim Leubner /*saGetDeviceInfo(agRoot, agNULL, 0, 0, agDevHandle);*/
26584e1bc9a0SAchim Leubner
26594e1bc9a0SAchim Leubner status = IOCTL_CALL_SUCCESS;
26604e1bc9a0SAchim Leubner
26614e1bc9a0SAchim Leubner return status;
26624e1bc9a0SAchim Leubner }
26634e1bc9a0SAchim Leubner /*****************************************************************************
26644e1bc9a0SAchim Leubner *
26654e1bc9a0SAchim Leubner * tdsaIoErrorStatisticGetIoctl
26664e1bc9a0SAchim Leubner *
26674e1bc9a0SAchim Leubner * Purpose: This routine is called to get the IO error statistic.
26684e1bc9a0SAchim Leubner *
26694e1bc9a0SAchim Leubner * Parameters:
26704e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
26714e1bc9a0SAchim Leubner * agIOCTLPayload: Pointer to the IOCTL payload.
26724e1bc9a0SAchim Leubner * agParam1: Pointer to pass context handle for IOCTL DMA operation
26734e1bc9a0SAchim Leubner * agParam2: Pointer to pass context handle for IOCTL DMA operation
26744e1bc9a0SAchim Leubner * agParam3: Pointer to pass context handle for IOCTL DMA operation
26754e1bc9a0SAchim Leubner *
26764e1bc9a0SAchim Leubner * Return:
26774e1bc9a0SAchim Leubner *
26784e1bc9a0SAchim Leubner * IOCTL_CALL_SUCCESS The requested operation completed successfully.
26794e1bc9a0SAchim Leubner * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
26804e1bc9a0SAchim Leubner * Detail error code is function specific and
26814e1bc9a0SAchim Leubner * defined by the specific IOCTL function.
26824e1bc9a0SAchim Leubner * IOCTL_CALL_PENDING This request is asynchronous and completed
26834e1bc9a0SAchim Leubner * in some other context.
26844e1bc9a0SAchim Leubner * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
26854e1bc9a0SAchim Leubner *
26864e1bc9a0SAchim Leubner *
26874e1bc9a0SAchim Leubner *****************************************************************************/
26884e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaIoErrorStatisticGetIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)26894e1bc9a0SAchim Leubner tdsaIoErrorStatisticGetIoctl(
26904e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
26914e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
26924e1bc9a0SAchim Leubner void *agParam1,
26934e1bc9a0SAchim Leubner void *agParam2,
26944e1bc9a0SAchim Leubner void *agParam3
26954e1bc9a0SAchim Leubner )
26964e1bc9a0SAchim Leubner {
26974e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
26984e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
26994e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
27004e1bc9a0SAchim Leubner tdIoErrorStatisticPayload_t *pIoErrorPayload = agNULL;
27014e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
27024e1bc9a0SAchim Leubner
27034e1bc9a0SAchim Leubner pIoErrorPayload = (tdIoErrorStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
27044e1bc9a0SAchim Leubner
27054e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = agNULL;
27064e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
27074e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
27084e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len = 0;
27094e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
27104e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
27114e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
27124e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
27134e1bc9a0SAchim Leubner
27144e1bc9a0SAchim Leubner saGetIOErrorStats(agRoot, agNULL, pIoErrorPayload->flag);
27154e1bc9a0SAchim Leubner
27164e1bc9a0SAchim Leubner return status;
27174e1bc9a0SAchim Leubner }
27184e1bc9a0SAchim Leubner
27194e1bc9a0SAchim Leubner /*****************************************************************************
27204e1bc9a0SAchim Leubner *
27214e1bc9a0SAchim Leubner * tdsaIoEventStatisticGetIoctl
27224e1bc9a0SAchim Leubner *
27234e1bc9a0SAchim Leubner * Purpose: This routine is called to get the IO event statistic.
27244e1bc9a0SAchim Leubner *
27254e1bc9a0SAchim Leubner * Parameters:
27264e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
27274e1bc9a0SAchim Leubner * agIOCTLPayload: Pointer to the IOCTL payload.
27284e1bc9a0SAchim Leubner * agParam1: Pointer to pass context handle for IOCTL DMA operation
27294e1bc9a0SAchim Leubner * agParam2: Pointer to pass context handle for IOCTL DMA operation
27304e1bc9a0SAchim Leubner * agParam3: Pointer to pass context handle for IOCTL DMA operation
27314e1bc9a0SAchim Leubner *
27324e1bc9a0SAchim Leubner * Return:
27334e1bc9a0SAchim Leubner *
27344e1bc9a0SAchim Leubner * IOCTL_CALL_SUCCESS The requested operation completed successfully.
27354e1bc9a0SAchim Leubner * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
27364e1bc9a0SAchim Leubner * Detail error code is function specific and
27374e1bc9a0SAchim Leubner * defined by the specific IOCTL function.
27384e1bc9a0SAchim Leubner * IOCTL_CALL_PENDING This request is asynchronous and completed
27394e1bc9a0SAchim Leubner * in some other context.
27404e1bc9a0SAchim Leubner * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
27414e1bc9a0SAchim Leubner *
27424e1bc9a0SAchim Leubner *
27434e1bc9a0SAchim Leubner *****************************************************************************/
27444e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaIoEventStatisticGetIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)27454e1bc9a0SAchim Leubner tdsaIoEventStatisticGetIoctl(
27464e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
27474e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
27484e1bc9a0SAchim Leubner void *agParam1,
27494e1bc9a0SAchim Leubner void *agParam2,
27504e1bc9a0SAchim Leubner void *agParam3
27514e1bc9a0SAchim Leubner )
27524e1bc9a0SAchim Leubner {
27534e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
27544e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
27554e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
27564e1bc9a0SAchim Leubner tdIoEventStatisticPayload_t *pIoEventPayload = agNULL;
27574e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
27584e1bc9a0SAchim Leubner
27594e1bc9a0SAchim Leubner pIoEventPayload = (tdIoEventStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
27604e1bc9a0SAchim Leubner
27614e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = agNULL;
27624e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
27634e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
27644e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len = 0;
27654e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
27664e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
27674e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
27684e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
27694e1bc9a0SAchim Leubner
27704e1bc9a0SAchim Leubner saGetIOEventStats(agRoot, agNULL, pIoEventPayload->flag);
27714e1bc9a0SAchim Leubner
27724e1bc9a0SAchim Leubner return status;
27734e1bc9a0SAchim Leubner }
27744e1bc9a0SAchim Leubner
27754e1bc9a0SAchim Leubner /*****************************************************************************
27764e1bc9a0SAchim Leubner *
27774e1bc9a0SAchim Leubner * tdsaRegisterIoctl
27784e1bc9a0SAchim Leubner *
27794e1bc9a0SAchim Leubner * Purpose: This routine is called to get Forensic Data.
27804e1bc9a0SAchim Leubner *
27814e1bc9a0SAchim Leubner * Parameters:
27824e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
27834e1bc9a0SAchim Leubner * agIOCTLPayload: Pointer to the IOCTL payload.
27844e1bc9a0SAchim Leubner * agParam1: Pointer to pass context handle for IOCTL DMA operation
27854e1bc9a0SAchim Leubner * agParam2: Pointer to pass context handle for IOCTL DMA operation
27864e1bc9a0SAchim Leubner * agParam3: Pointer to pass context handle for IOCTL DMA operation
27874e1bc9a0SAchim Leubner *
27884e1bc9a0SAchim Leubner * Return:
27894e1bc9a0SAchim Leubner *
27904e1bc9a0SAchim Leubner * IOCTL_CALL_SUCCESS The requested operation completed successfully.
27914e1bc9a0SAchim Leubner * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
27924e1bc9a0SAchim Leubner * Detail error code is function specific and
27934e1bc9a0SAchim Leubner * defined by the specific IOCTL function.
27944e1bc9a0SAchim Leubner * IOCTL_CALL_PENDING This request is asynchronous and completed
27954e1bc9a0SAchim Leubner * in some other context.
27964e1bc9a0SAchim Leubner * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
27974e1bc9a0SAchim Leubner *
27984e1bc9a0SAchim Leubner *
27994e1bc9a0SAchim Leubner *****************************************************************************/
28004e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaRegisterIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)28014e1bc9a0SAchim Leubner tdsaRegisterIoctl(
28024e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
28034e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
28044e1bc9a0SAchim Leubner void *agParam1,
28054e1bc9a0SAchim Leubner void *agParam2,
28064e1bc9a0SAchim Leubner void *agParam3
28074e1bc9a0SAchim Leubner )
28084e1bc9a0SAchim Leubner {
28094e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
28104e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
28114e1bc9a0SAchim Leubner // agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
28124e1bc9a0SAchim Leubner tdRegisterPayload_t *pRegisterPayload = agNULL;
28134e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
28144e1bc9a0SAchim Leubner
28154e1bc9a0SAchim Leubner pRegisterPayload = (tdRegisterPayload_t*)agIOCTLPayload->FunctionSpecificArea;
28164e1bc9a0SAchim Leubner
28174e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = agNULL;
28184e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
28194e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
28204e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len = 0;
28214e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
28224e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
28234e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
28244e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
28254e1bc9a0SAchim Leubner
28264e1bc9a0SAchim Leubner TI_DBG1(("tdsaRegisterIoctl: Flag %d RegAddr 0x%x RegValue 0x%x\n",
28274e1bc9a0SAchim Leubner pRegisterPayload->flag, pRegisterPayload->RegAddr, pRegisterPayload->RegValue));
28284e1bc9a0SAchim Leubner
28294e1bc9a0SAchim Leubner if (pRegisterPayload->flag)
28304e1bc9a0SAchim Leubner {
28314e1bc9a0SAchim Leubner /* set register */
28324e1bc9a0SAchim Leubner ostiChipWriteBit32Ext(tiRoot, 0, pRegisterPayload->RegAddr, pRegisterPayload->RegValue);
28334e1bc9a0SAchim Leubner }
28344e1bc9a0SAchim Leubner else
28354e1bc9a0SAchim Leubner {
28364e1bc9a0SAchim Leubner /* get register */
28374e1bc9a0SAchim Leubner pRegisterPayload->RegValue = ostiChipReadBit32Ext(tiRoot, 0, pRegisterPayload->RegAddr);
28384e1bc9a0SAchim Leubner }
28394e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
28404e1bc9a0SAchim Leubner return status;
28414e1bc9a0SAchim Leubner }
28424e1bc9a0SAchim Leubner
28434e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaGetPhyGeneralStatusIoctl(tiRoot_t * tiRoot,agsaPhyGeneralState_t * PhyData)28444e1bc9a0SAchim Leubner tdsaGetPhyGeneralStatusIoctl(
28454e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
28464e1bc9a0SAchim Leubner agsaPhyGeneralState_t *PhyData
28474e1bc9a0SAchim Leubner )
28484e1bc9a0SAchim Leubner {
28494e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
28504e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
28514e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootNonInt);
28524e1bc9a0SAchim Leubner // agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
28534e1bc9a0SAchim Leubner // bit8 totalValidPhys;
28544e1bc9a0SAchim Leubner bit32 status = AGSA_RC_SUCCESS;
28554e1bc9a0SAchim Leubner bit32 i = 0;
28564e1bc9a0SAchim Leubner agsaControllerInfo_t ControllerInfo;
28574e1bc9a0SAchim Leubner saGetControllerInfo(agRoot,&ControllerInfo);
28584e1bc9a0SAchim Leubner
28594e1bc9a0SAchim Leubner TI_DBG3(("tdsaGetPhyGeneralStatusIoctl: start\n"));
28604e1bc9a0SAchim Leubner do
28614e1bc9a0SAchim Leubner {
28624e1bc9a0SAchim Leubner if(tIsSPC(agRoot)||tIsSPCHIL(agRoot))
28634e1bc9a0SAchim Leubner {
28644e1bc9a0SAchim Leubner status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
28654e1bc9a0SAchim Leubner break;
28664e1bc9a0SAchim Leubner }
28674e1bc9a0SAchim Leubner
28684e1bc9a0SAchim Leubner PhyData->Reserved1 = ControllerInfo.phyCount;
28694e1bc9a0SAchim Leubner for(i=0;i<PhyData->Reserved1;i++)
28704e1bc9a0SAchim Leubner {
28714e1bc9a0SAchim Leubner status = saGetPhyProfile( agRoot,agNULL,tdsaRotateQnumber(tiRoot, agNULL), AGSA_SAS_PHY_GENERAL_STATUS_PAGE,i);
28724e1bc9a0SAchim Leubner if(status == AGSA_RC_FAILURE)
28734e1bc9a0SAchim Leubner {
28744e1bc9a0SAchim Leubner break;
28754e1bc9a0SAchim Leubner }
28764e1bc9a0SAchim Leubner }
28774e1bc9a0SAchim Leubner }while(0);
28784e1bc9a0SAchim Leubner TI_DBG3(("tdsaGetPhyGeneralStatusIoctl: End\n"));
28794e1bc9a0SAchim Leubner return status;
28804e1bc9a0SAchim Leubner }
28814e1bc9a0SAchim Leubner /*****************************************************************************
28824e1bc9a0SAchim Leubner *
28834e1bc9a0SAchim Leubner * ostiGetPhyGeneralStatusRsp
28844e1bc9a0SAchim Leubner *
28854e1bc9a0SAchim Leubner * Purpose: This routine is called when a PhyStatus IOCTL response is received.
28864e1bc9a0SAchim Leubner *
28874e1bc9a0SAchim Leubner * Parameters:
28884e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
28894e1bc9a0SAchim Leubner * agsaSASPhyGeneralStatusPage_t: Status of the phy.
28904e1bc9a0SAchim Leubner * bit32: phyID
28914e1bc9a0SAchim Leubner *
28924e1bc9a0SAchim Leubner * Return: none
28934e1bc9a0SAchim Leubner *
28944e1bc9a0SAchim Leubner *
28954e1bc9a0SAchim Leubner *****************************************************************************/
ostiGetPhyGeneralStatusRsp(tiRoot_t * tiRoot,agsaSASPhyGeneralStatusPage_t * GenStatus,bit32 phyID)28964e1bc9a0SAchim Leubner osGLOBAL void ostiGetPhyGeneralStatusRsp(
28974e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
28984e1bc9a0SAchim Leubner agsaSASPhyGeneralStatusPage_t *GenStatus,
28994e1bc9a0SAchim Leubner bit32 phyID
29004e1bc9a0SAchim Leubner )
29014e1bc9a0SAchim Leubner {
29024e1bc9a0SAchim Leubner
29034e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
29044e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
29054e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIoctlPayload = agNULL;
29064e1bc9a0SAchim Leubner agsaPhyGeneralState_t *pSetPhyStatusRes = agNULL;
29074e1bc9a0SAchim Leubner
29084e1bc9a0SAchim Leubner
29094e1bc9a0SAchim Leubner TI_DBG1(("ostiGetPhyGeneralStatusRsp: start\n"));
29104e1bc9a0SAchim Leubner
29114e1bc9a0SAchim Leubner if (tdsaAllShared->tdFWControlEx.inProgress)
29124e1bc9a0SAchim Leubner {
29134e1bc9a0SAchim Leubner agIoctlPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
29144e1bc9a0SAchim Leubner if ((agIoctlPayload) && (PMC_IOCTL_SIGNATURE == agIoctlPayload->Signature)&&
29154e1bc9a0SAchim Leubner (IOCTL_MJ_PHY_GENERAL_STATUS == agIoctlPayload->MajorFunction))
29164e1bc9a0SAchim Leubner {
29174e1bc9a0SAchim Leubner pSetPhyStatusRes = (agsaPhyGeneralState_t*) &agIoctlPayload->FunctionSpecificArea[0];
29184e1bc9a0SAchim Leubner osti_memcpy(&pSetPhyStatusRes->PhyGenData[phyID], GenStatus, sizeof(agsaSASPhyGeneralStatusPage_t));
29194e1bc9a0SAchim Leubner pSetPhyStatusRes->Reserved2++;
29204e1bc9a0SAchim Leubner if(pSetPhyStatusRes->Reserved1 == pSetPhyStatusRes->Reserved2)
29214e1bc9a0SAchim Leubner {
29224e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = NULL;
29234e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
29244e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2, agNULL);
29254e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
29264e1bc9a0SAchim Leubner agIoctlPayload->Status = IOCTL_ERR_STATUS_OK;
29274e1bc9a0SAchim Leubner
29284e1bc9a0SAchim Leubner }
29294e1bc9a0SAchim Leubner }
29304e1bc9a0SAchim Leubner }
29314e1bc9a0SAchim Leubner
29324e1bc9a0SAchim Leubner TI_DBG1(("ostiGetPhyGeneralStatusRsp: end\n"));
29334e1bc9a0SAchim Leubner }
29344e1bc9a0SAchim Leubner
29354e1bc9a0SAchim Leubner
29364e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaPhyProfileIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)29374e1bc9a0SAchim Leubner tdsaPhyProfileIoctl(
29384e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
29394e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
29404e1bc9a0SAchim Leubner void *agParam1,
29414e1bc9a0SAchim Leubner void *agParam2,
29424e1bc9a0SAchim Leubner void *agParam3
29434e1bc9a0SAchim Leubner )
29444e1bc9a0SAchim Leubner {
29454e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
29464e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
29474e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
29484e1bc9a0SAchim Leubner void *buffer = agNULL;
29494e1bc9a0SAchim Leubner void *osMemHandle = agNULL;
29504e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
29514e1bc9a0SAchim Leubner bit32 retcode = AGSA_RC_FAILURE;
29524e1bc9a0SAchim Leubner bit32 RequestLength= agIOCTLPayload->Length;
29534e1bc9a0SAchim Leubner bit32 bufAddrUpper = 0;
29544e1bc9a0SAchim Leubner bit32 bufAddrLower = 0;
29554e1bc9a0SAchim Leubner
29564e1bc9a0SAchim Leubner tdPhyCount_t *PhyBlob = (tdPhyCount_t*)&agIOCTLPayload->FunctionSpecificArea[0];
29574e1bc9a0SAchim Leubner
29584e1bc9a0SAchim Leubner
29594e1bc9a0SAchim Leubner if(ostiAllocMemory( tiRoot,
29604e1bc9a0SAchim Leubner &osMemHandle,
29614e1bc9a0SAchim Leubner (void **)&buffer,
29624e1bc9a0SAchim Leubner &bufAddrUpper,
29634e1bc9a0SAchim Leubner &bufAddrLower,
29644e1bc9a0SAchim Leubner RequestLength,
29654e1bc9a0SAchim Leubner RequestLength,
29664e1bc9a0SAchim Leubner agTRUE))
29674e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
29684e1bc9a0SAchim Leubner
29694e1bc9a0SAchim Leubner
29704e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
29714e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = buffer;
29724e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
29734e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len = 32;
29744e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
29754e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
29764e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
29774e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
29784e1bc9a0SAchim Leubner
29794e1bc9a0SAchim Leubner TI_DBG1(("tdsaPhyProfileIoctl: MinorFunction %d\n",agIOCTLPayload->MinorFunction));
29804e1bc9a0SAchim Leubner // PhyBlob->Phy |= 0x100;
29814e1bc9a0SAchim Leubner
29824e1bc9a0SAchim Leubner if( tiIS_SPC(agRoot) )
29834e1bc9a0SAchim Leubner {
29844e1bc9a0SAchim Leubner TI_DBG1(("tdsaPhyProfileIoctl: SPC operation 0x%x PHY %d\n",agIOCTLPayload->MinorFunction,PhyBlob->Phy));
29854e1bc9a0SAchim Leubner retcode = saLocalPhyControl(agRoot,agNULL,0 ,PhyBlob->Phy ,agIOCTLPayload->MinorFunction , agNULL);
29864e1bc9a0SAchim Leubner if(retcode == AGSA_RC_SUCCESS)
29874e1bc9a0SAchim Leubner {
29884e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
29894e1bc9a0SAchim Leubner }
29904e1bc9a0SAchim Leubner }
29914e1bc9a0SAchim Leubner else
29924e1bc9a0SAchim Leubner {
29934e1bc9a0SAchim Leubner TI_DBG1(("tdsaPhyProfileIoctl: SPCv operation 0x%x PHY %d\n",agIOCTLPayload->MinorFunction,PhyBlob->Phy));
29944e1bc9a0SAchim Leubner retcode = saGetPhyProfile( agRoot,agNULL,0,agIOCTLPayload->MinorFunction , PhyBlob->Phy);
29954e1bc9a0SAchim Leubner
29964e1bc9a0SAchim Leubner if(retcode == AGSA_RC_SUCCESS)
29974e1bc9a0SAchim Leubner {
29984e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
29994e1bc9a0SAchim Leubner }
30004e1bc9a0SAchim Leubner
30014e1bc9a0SAchim Leubner }
30024e1bc9a0SAchim Leubner
30034e1bc9a0SAchim Leubner TI_DBG2(("tdsaPhyProfileIoctl: after\n"));
30044e1bc9a0SAchim Leubner
30054e1bc9a0SAchim Leubner
30064e1bc9a0SAchim Leubner return status;
30074e1bc9a0SAchim Leubner }
30084e1bc9a0SAchim Leubner
30094e1bc9a0SAchim Leubner /*****************************************************************************
30104e1bc9a0SAchim Leubner *
30114e1bc9a0SAchim Leubner * tdsaForensicDataGetIoctl
30124e1bc9a0SAchim Leubner *
30134e1bc9a0SAchim Leubner * Purpose: This routine is called to get Forensic Data.
30144e1bc9a0SAchim Leubner *
30154e1bc9a0SAchim Leubner * Parameters:
30164e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
30174e1bc9a0SAchim Leubner * agIOCTLPayload: Pointer to the IOCTL payload.
30184e1bc9a0SAchim Leubner * agParam1: Pointer to pass context handle for IOCTL DMA operation
30194e1bc9a0SAchim Leubner * agParam2: Pointer to pass context handle for IOCTL DMA operation
30204e1bc9a0SAchim Leubner * agParam3: Pointer to pass context handle for IOCTL DMA operation
30214e1bc9a0SAchim Leubner *
30224e1bc9a0SAchim Leubner * Return:
30234e1bc9a0SAchim Leubner *
30244e1bc9a0SAchim Leubner * IOCTL_CALL_SUCCESS The requested operation completed successfully.
30254e1bc9a0SAchim Leubner * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
30264e1bc9a0SAchim Leubner * Detail error code is function specific and
30274e1bc9a0SAchim Leubner * defined by the specific IOCTL function.
30284e1bc9a0SAchim Leubner * IOCTL_CALL_PENDING This request is asynchronous and completed
30294e1bc9a0SAchim Leubner * in some other context.
30304e1bc9a0SAchim Leubner * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
30314e1bc9a0SAchim Leubner *
30324e1bc9a0SAchim Leubner *
30334e1bc9a0SAchim Leubner *****************************************************************************/
30344e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaForensicDataGetIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)30354e1bc9a0SAchim Leubner tdsaForensicDataGetIoctl(
30364e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
30374e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
30384e1bc9a0SAchim Leubner void *agParam1,
30394e1bc9a0SAchim Leubner void *agParam2,
30404e1bc9a0SAchim Leubner void *agParam3
30414e1bc9a0SAchim Leubner )
30424e1bc9a0SAchim Leubner {
30434e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
30444e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
30454e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
30464e1bc9a0SAchim Leubner tdForensicDataPayload_t *pForensicDataPayload = agNULL;
30474e1bc9a0SAchim Leubner agsaForensicData_t ForensicData;
30484e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
30494e1bc9a0SAchim Leubner
30504e1bc9a0SAchim Leubner pForensicDataPayload = (tdForensicDataPayload_t*)agIOCTLPayload->FunctionSpecificArea;
30514e1bc9a0SAchim Leubner
30524e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = agNULL;
30534e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
30544e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
30554e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len = 0;
30564e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
30574e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
30584e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
30594e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
30604e1bc9a0SAchim Leubner
30614e1bc9a0SAchim Leubner osti_memset(&ForensicData, 0, sizeof(agsaForensicData_t));
30624e1bc9a0SAchim Leubner
30634e1bc9a0SAchim Leubner ForensicData.DataType = pForensicDataPayload->DataType;
30644e1bc9a0SAchim Leubner
30654e1bc9a0SAchim Leubner switch (ForensicData.DataType)
30664e1bc9a0SAchim Leubner {
30674e1bc9a0SAchim Leubner case FORENSIC_DATA_TYPE_NON_FATAL:
30684e1bc9a0SAchim Leubner case FORENSIC_DATA_TYPE_FATAL:
30694e1bc9a0SAchim Leubner ForensicData.BufferType.dataBuf.directLen = pForensicDataPayload->dataBuffer.directLen;
30704e1bc9a0SAchim Leubner ForensicData.BufferType.dataBuf.directOffset = pForensicDataPayload->dataBuffer.directOffset;
30714e1bc9a0SAchim Leubner ForensicData.BufferType.dataBuf.readLen = pForensicDataPayload->dataBuffer.readLen;
30724e1bc9a0SAchim Leubner ForensicData.BufferType.dataBuf.directData = (void*)pForensicDataPayload->dataBuffer.directData;
30734e1bc9a0SAchim Leubner break;
30744e1bc9a0SAchim Leubner case FORENSIC_DATA_TYPE_GSM_SPACE:
30754e1bc9a0SAchim Leubner ForensicData.BufferType.gsmBuf.directLen = pForensicDataPayload->gsmBuffer.directLen;
30764e1bc9a0SAchim Leubner ForensicData.BufferType.gsmBuf.directOffset = pForensicDataPayload->gsmBuffer.directOffset;
30774e1bc9a0SAchim Leubner ForensicData.BufferType.dataBuf.readLen = pForensicDataPayload->gsmBuffer.readLen;
30784e1bc9a0SAchim Leubner ForensicData.BufferType.gsmBuf.directData = (void*)pForensicDataPayload->gsmBuffer.directData;
30794e1bc9a0SAchim Leubner break;
30804e1bc9a0SAchim Leubner
30814e1bc9a0SAchim Leubner case FORENSIC_DATA_TYPE_IB_QUEUE:
30824e1bc9a0SAchim Leubner ForensicData.BufferType.queueBuf.directLen = pForensicDataPayload->queueBuffer.directLen;
30834e1bc9a0SAchim Leubner //ForensicData.BufferType.queueBuf.queueType = pForensicDataPayload->queueBuffer.queueType;
30844e1bc9a0SAchim Leubner ForensicData.BufferType.queueBuf.queueType = FORENSIC_DATA_TYPE_IB_QUEUE;
30854e1bc9a0SAchim Leubner ForensicData.BufferType.queueBuf.queueIndex = pForensicDataPayload->queueBuffer.queueIndex;
30864e1bc9a0SAchim Leubner ForensicData.BufferType.queueBuf.directData = (void*)pForensicDataPayload->queueBuffer.directData;
30874e1bc9a0SAchim Leubner break;
30884e1bc9a0SAchim Leubner case FORENSIC_DATA_TYPE_OB_QUEUE:
30894e1bc9a0SAchim Leubner ForensicData.BufferType.queueBuf.directLen = pForensicDataPayload->queueBuffer.directLen;
30904e1bc9a0SAchim Leubner ForensicData.BufferType.queueBuf.queueType = FORENSIC_DATA_TYPE_OB_QUEUE;
30914e1bc9a0SAchim Leubner ForensicData.BufferType.queueBuf.queueIndex = pForensicDataPayload->queueBuffer.queueIndex;
30924e1bc9a0SAchim Leubner ForensicData.BufferType.queueBuf.directData = (void*)pForensicDataPayload->queueBuffer.directData;
30934e1bc9a0SAchim Leubner break;
30944e1bc9a0SAchim Leubner
30954e1bc9a0SAchim Leubner default:
30964e1bc9a0SAchim Leubner TI_DBG1(("tdsaGetForensicDataIoctl: forensic data type error %d\n", pForensicDataPayload->DataType));
30974e1bc9a0SAchim Leubner status = IOCTL_CALL_INVALID_CODE;
30984e1bc9a0SAchim Leubner return status;
30994e1bc9a0SAchim Leubner }
31004e1bc9a0SAchim Leubner
31014e1bc9a0SAchim Leubner if ( saGetForensicData(agRoot, agNULL, &ForensicData) != AGSA_RC_SUCCESS )
31024e1bc9a0SAchim Leubner {
31034e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
31044e1bc9a0SAchim Leubner }
31054e1bc9a0SAchim Leubner
31064e1bc9a0SAchim Leubner return status;
31074e1bc9a0SAchim Leubner }
31084e1bc9a0SAchim Leubner
31094e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaSendSMPIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)31104e1bc9a0SAchim Leubner tdsaSendSMPIoctl(
31114e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
31124e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
31134e1bc9a0SAchim Leubner void *agParam1,
31144e1bc9a0SAchim Leubner void *agParam2,
31154e1bc9a0SAchim Leubner void *agParam3
31164e1bc9a0SAchim Leubner )
31174e1bc9a0SAchim Leubner {
31184e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
31194e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
31204e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
31214e1bc9a0SAchim Leubner void *reqBuffer = agNULL;
31224e1bc9a0SAchim Leubner void *respBuffer = agNULL;
31234e1bc9a0SAchim Leubner void *osMemHandle = agNULL;
31244e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
31254e1bc9a0SAchim Leubner // bit32 Offset = 0;
31264e1bc9a0SAchim Leubner // bit32 RequestLength = 0;
31274e1bc9a0SAchim Leubner bit32 ostiMemoryStatus = 0;
31284e1bc9a0SAchim Leubner smp_pass_through_req_t *smp_pass_through_req;
31294e1bc9a0SAchim Leubner
31304e1bc9a0SAchim Leubner tiDeviceHandle_t *devHandle;
31314e1bc9a0SAchim Leubner agsaSMPFrame_t agSMPFrame;
31324e1bc9a0SAchim Leubner tdsaDeviceData_t *oneDeviceData = agNULL;
31334e1bc9a0SAchim Leubner bit32 i;
31344e1bc9a0SAchim Leubner
31354e1bc9a0SAchim Leubner TI_DBG2(("tdsaSendSMPIoctl: start\n"));
31364e1bc9a0SAchim Leubner
31374e1bc9a0SAchim Leubner smp_pass_through_req = (smp_pass_through_req_t*)agIOCTLPayload->FunctionSpecificArea;
31384e1bc9a0SAchim Leubner
31394e1bc9a0SAchim Leubner for(i=0;i<8;i++)
31404e1bc9a0SAchim Leubner TI_DBG2(("SAS Address[%d]:%x",i,smp_pass_through_req->exp_sas_addr[i]));
31414e1bc9a0SAchim Leubner TI_DBG2(("SAS Request Length:%d",smp_pass_through_req->smp_req_len));
31424e1bc9a0SAchim Leubner TI_DBG2(("SAS Response Length:%d",smp_pass_through_req->smp_resp_len));
31434e1bc9a0SAchim Leubner for(i=0;i<smp_pass_through_req->smp_req_len;i++)
31444e1bc9a0SAchim Leubner TI_DBG2(("SAS request + %d:%x",i,smp_pass_through_req->smp_req_resp[i]));
31454e1bc9a0SAchim Leubner
31464e1bc9a0SAchim Leubner devHandle = ostiGetDevHandleFromSasAddr(tiRoot, smp_pass_through_req->exp_sas_addr);
31474e1bc9a0SAchim Leubner if(devHandle == NULL)
31484e1bc9a0SAchim Leubner {
31494e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
31504e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
31514e1bc9a0SAchim Leubner return status;
31524e1bc9a0SAchim Leubner }
31534e1bc9a0SAchim Leubner
31544e1bc9a0SAchim Leubner
31554e1bc9a0SAchim Leubner
31564e1bc9a0SAchim Leubner //agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
31574e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_RESPONDING;
31584e1bc9a0SAchim Leubner
31594e1bc9a0SAchim Leubner
31604e1bc9a0SAchim Leubner
31614e1bc9a0SAchim Leubner if((ostiMemoryStatus != tiSuccess) && (reqBuffer == agNULL ))
31624e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
31634e1bc9a0SAchim Leubner
31644e1bc9a0SAchim Leubner
31654e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param3 = osMemHandle;
31664e1bc9a0SAchim Leubner
31674e1bc9a0SAchim Leubner
31684e1bc9a0SAchim Leubner agSMPFrame.outFrameBuf = smp_pass_through_req->smp_req_resp;
31694e1bc9a0SAchim Leubner agSMPFrame.expectedRespLen = smp_pass_through_req->smp_resp_len;
31704e1bc9a0SAchim Leubner agSMPFrame.inFrameLen = smp_pass_through_req->smp_resp_len - 4;
31714e1bc9a0SAchim Leubner
31724e1bc9a0SAchim Leubner if(!(smp_pass_through_req->smp_req_len - 8) && !tiIS_SPC(agRoot))
31734e1bc9a0SAchim Leubner {
31744e1bc9a0SAchim Leubner agSMPFrame.flag = 1; // Direct request Indirect response
31754e1bc9a0SAchim Leubner agSMPFrame.outFrameLen = smp_pass_through_req->smp_req_len - 4; //Exclude header
31764e1bc9a0SAchim Leubner }
31774e1bc9a0SAchim Leubner else
31784e1bc9a0SAchim Leubner {
31794e1bc9a0SAchim Leubner
31804e1bc9a0SAchim Leubner agSMPFrame.flag = 3; //Indirect request and Indirect response
31814e1bc9a0SAchim Leubner ostiMemoryStatus = ostiAllocMemory( tiRoot,
31824e1bc9a0SAchim Leubner &osMemHandle,
31834e1bc9a0SAchim Leubner (void **)&reqBuffer,
31844e1bc9a0SAchim Leubner &(agSMPFrame.outFrameAddrUpper32),
31854e1bc9a0SAchim Leubner &(agSMPFrame.outFrameAddrLower32),
31864e1bc9a0SAchim Leubner 8,
31874e1bc9a0SAchim Leubner smp_pass_through_req->smp_req_len,
31884e1bc9a0SAchim Leubner agFALSE);
31894e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param3 = osMemHandle;
31904e1bc9a0SAchim Leubner if(tiIS_SPC(agRoot))
31914e1bc9a0SAchim Leubner {
31924e1bc9a0SAchim Leubner agSMPFrame.outFrameLen = smp_pass_through_req->smp_req_len - 4; //Exclude crc
31934e1bc9a0SAchim Leubner osti_memcpy((void *)reqBuffer, (void *)(smp_pass_through_req->smp_req_resp), smp_pass_through_req->smp_req_len);
31944e1bc9a0SAchim Leubner }
31954e1bc9a0SAchim Leubner else
31964e1bc9a0SAchim Leubner {
31974e1bc9a0SAchim Leubner agSMPFrame.outFrameLen = smp_pass_through_req->smp_req_len - 8; //Exclude header and crc
31984e1bc9a0SAchim Leubner osti_memcpy((void *)reqBuffer, (void *)(smp_pass_through_req->smp_req_resp + 4), smp_pass_through_req->smp_req_len - 4);
31994e1bc9a0SAchim Leubner }
32004e1bc9a0SAchim Leubner }
32014e1bc9a0SAchim Leubner
32024e1bc9a0SAchim Leubner ostiMemoryStatus = ostiAllocMemory( tiRoot,
32034e1bc9a0SAchim Leubner &osMemHandle,
32044e1bc9a0SAchim Leubner (void **)&respBuffer,
32054e1bc9a0SAchim Leubner &(agSMPFrame.inFrameAddrUpper32),
32064e1bc9a0SAchim Leubner &(agSMPFrame.inFrameAddrLower32),
32074e1bc9a0SAchim Leubner 8,
32084e1bc9a0SAchim Leubner smp_pass_through_req->smp_resp_len + 4,
32094e1bc9a0SAchim Leubner agFALSE);
32104e1bc9a0SAchim Leubner if((ostiMemoryStatus != tiSuccess) && (respBuffer == agNULL ))
32114e1bc9a0SAchim Leubner return IOCTL_CALL_FAIL;
32124e1bc9a0SAchim Leubner
32134e1bc9a0SAchim Leubner
32144e1bc9a0SAchim Leubner osti_memset((void *)respBuffer, 0, smp_pass_through_req->smp_resp_len);
32154e1bc9a0SAchim Leubner
32164e1bc9a0SAchim Leubner // use FW control place in shared structure to keep the neccesary information
32174e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
32184e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = respBuffer;
32194e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)smp_pass_through_req->smp_req_resp + smp_pass_through_req->smp_req_len;
32204e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len = smp_pass_through_req->smp_resp_len;
32214e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
32224e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
32234e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
32244e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 1;
32254e1bc9a0SAchim Leubner status = IOCTL_CALL_PENDING;
32264e1bc9a0SAchim Leubner
32274e1bc9a0SAchim Leubner oneDeviceData = (tdsaDeviceData_t *)devHandle->tdData;
32284e1bc9a0SAchim Leubner if(saSendSMPIoctl(agRoot, oneDeviceData->agDevHandle, 0, &agSMPFrame, &ossaSMPIoctlCompleted) != AGSA_RC_SUCCESS)
32294e1bc9a0SAchim Leubner {
32304e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
32314e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
32324e1bc9a0SAchim Leubner }
32334e1bc9a0SAchim Leubner return status;
32344e1bc9a0SAchim Leubner }
32354e1bc9a0SAchim Leubner
ostiSendSMPIOCTLRsp(tiRoot_t * tiRoot,bit32 status)32364e1bc9a0SAchim Leubner osGLOBAL void ostiSendSMPIOCTLRsp(
32374e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
32384e1bc9a0SAchim Leubner bit32 status
32394e1bc9a0SAchim Leubner )
32404e1bc9a0SAchim Leubner {
32414e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
32424e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
32434e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload;
32444e1bc9a0SAchim Leubner
32454e1bc9a0SAchim Leubner agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
32464e1bc9a0SAchim Leubner agIOCTLPayload->Status = (bit16)status;
32474e1bc9a0SAchim Leubner
32484e1bc9a0SAchim Leubner TI_DBG1(("ostiSendSMPIOCTLRsp: start, status = %d\n", status));
32494e1bc9a0SAchim Leubner
32504e1bc9a0SAchim Leubner // if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
32514e1bc9a0SAchim Leubner // {
32524e1bc9a0SAchim Leubner osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
32534e1bc9a0SAchim Leubner (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
32544e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len);
32554e1bc9a0SAchim Leubner // }
32564e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot,
32574e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer,
32584e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len);
32594e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot,
32604e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param3,
32614e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len);
32624e1bc9a0SAchim Leubner //if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
32634e1bc9a0SAchim Leubner // {
32644e1bc9a0SAchim Leubner ostiIOCTLComplete(tiRoot,
32654e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1,
32664e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2,
32674e1bc9a0SAchim Leubner NULL);
32684e1bc9a0SAchim Leubner // }
32694e1bc9a0SAchim Leubner }
32704e1bc9a0SAchim Leubner
32714e1bc9a0SAchim Leubner
32724e1bc9a0SAchim Leubner
32734e1bc9a0SAchim Leubner
32744e1bc9a0SAchim Leubner /*****************************************************************************
32754e1bc9a0SAchim Leubner *
32764e1bc9a0SAchim Leubner * tdsaSendBISTIoctl
32774e1bc9a0SAchim Leubner *
32784e1bc9a0SAchim Leubner * Purpose: This routine is called to get Forensic Data.
32794e1bc9a0SAchim Leubner *
32804e1bc9a0SAchim Leubner * Parameters:
32814e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
32824e1bc9a0SAchim Leubner * agIOCTLPayload: Pointer to the IOCTL payload.
32834e1bc9a0SAchim Leubner * agParam1: Pointer to pass context handle for IOCTL DMA operation
32844e1bc9a0SAchim Leubner * agParam2: Pointer to pass context handle for IOCTL DMA operation
32854e1bc9a0SAchim Leubner * agParam3: Pointer to pass context handle for IOCTL DMA operation
32864e1bc9a0SAchim Leubner *
32874e1bc9a0SAchim Leubner * Return:
32884e1bc9a0SAchim Leubner *
32894e1bc9a0SAchim Leubner * IOCTL_CALL_SUCCESS The requested operation completed successfully.
32904e1bc9a0SAchim Leubner * IOCTL_CALL_FAIL Fail to complete the IOCTL request.
32914e1bc9a0SAchim Leubner * Detail error code is function specific and
32924e1bc9a0SAchim Leubner * defined by the specific IOCTL function.
32934e1bc9a0SAchim Leubner * IOCTL_CALL_PENDING This request is asynchronous and completed
32944e1bc9a0SAchim Leubner * in some other context.
32954e1bc9a0SAchim Leubner * IOCTL_CALL_INVALID_CODE This IOCTL function is not recognized.
32964e1bc9a0SAchim Leubner *
32974e1bc9a0SAchim Leubner *
32984e1bc9a0SAchim Leubner *****************************************************************************/
32994e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaSendBISTIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)33004e1bc9a0SAchim Leubner tdsaSendBISTIoctl(
33014e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
33024e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
33034e1bc9a0SAchim Leubner void *agParam1,
33044e1bc9a0SAchim Leubner void *agParam2,
33054e1bc9a0SAchim Leubner void *agParam3
33064e1bc9a0SAchim Leubner )
33074e1bc9a0SAchim Leubner {
33084e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
33094e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
33104e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
33114e1bc9a0SAchim Leubner tdBistPayload_t *pBistPayload;
33124e1bc9a0SAchim Leubner // bit32 length = 0;
33134e1bc9a0SAchim Leubner // bit32 status = IOCTL_CALL_SUCCESS;
33144e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_FAIL;
33154e1bc9a0SAchim Leubner
33164e1bc9a0SAchim Leubner pBistPayload = (tdBistPayload_t*)agIOCTLPayload->FunctionSpecificArea;
33174e1bc9a0SAchim Leubner
33184e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = agNULL;
33194e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
33204e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
33214e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.len = 0;
33224e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
33234e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
33244e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
33254e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
33264e1bc9a0SAchim Leubner
33274e1bc9a0SAchim Leubner TI_DBG1(("tdsaSendBISTIoctl: Type %d Length %d Data %p\n",
33284e1bc9a0SAchim Leubner pBistPayload->testType,
33294e1bc9a0SAchim Leubner pBistPayload->testLength,
33304e1bc9a0SAchim Leubner pBistPayload->testData ));
33314e1bc9a0SAchim Leubner
33324e1bc9a0SAchim Leubner
33334e1bc9a0SAchim Leubner // pBistPayload->testtype = AGSA_BIST_TEST;
33344e1bc9a0SAchim Leubner
33354e1bc9a0SAchim Leubner if( pBistPayload->testType == AGSA_BIST_TEST)
33364e1bc9a0SAchim Leubner {
33374e1bc9a0SAchim Leubner if( pBistPayload->testLength != sizeof(agsaEncryptSelfTestBitMap_t))
33384e1bc9a0SAchim Leubner {
33394e1bc9a0SAchim Leubner return status;
33404e1bc9a0SAchim Leubner }
33414e1bc9a0SAchim Leubner }
33424e1bc9a0SAchim Leubner else if( pBistPayload->testType == AGSA_SHA_TEST)
33434e1bc9a0SAchim Leubner {
33444e1bc9a0SAchim Leubner if( pBistPayload->testLength != sizeof(agsaEncryptSHATestDescriptor_t) )
33454e1bc9a0SAchim Leubner {
33464e1bc9a0SAchim Leubner return status;
33474e1bc9a0SAchim Leubner }
33484e1bc9a0SAchim Leubner }
33494e1bc9a0SAchim Leubner else if( pBistPayload->testType == AGSA_HMAC_TEST )
33504e1bc9a0SAchim Leubner {
33514e1bc9a0SAchim Leubner if( pBistPayload->testLength != sizeof(agsaEncryptHMACTestDescriptor_t))
33524e1bc9a0SAchim Leubner {
33534e1bc9a0SAchim Leubner return status;
33544e1bc9a0SAchim Leubner }
33554e1bc9a0SAchim Leubner }
33564e1bc9a0SAchim Leubner
33574e1bc9a0SAchim Leubner /*
33584e1bc9a0SAchim Leubner GLOBAL bit32 saEncryptSelftestExecute(
33594e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
33604e1bc9a0SAchim Leubner agsaContext_t *agContext,
33614e1bc9a0SAchim Leubner bit32 queueNum,
33624e1bc9a0SAchim Leubner bit32 type,
33634e1bc9a0SAchim Leubner bit32 length,
33644e1bc9a0SAchim Leubner void *TestDescriptor);
33654e1bc9a0SAchim Leubner
33664e1bc9a0SAchim Leubner */
33674e1bc9a0SAchim Leubner if ( saEncryptSelftestExecute(agRoot,
33684e1bc9a0SAchim Leubner agNULL,
33694e1bc9a0SAchim Leubner 0,
33704e1bc9a0SAchim Leubner pBistPayload->testType,
33714e1bc9a0SAchim Leubner pBistPayload->testLength,
33724e1bc9a0SAchim Leubner pBistPayload->testData ) != AGSA_RC_SUCCESS )
33734e1bc9a0SAchim Leubner {
33744e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
33754e1bc9a0SAchim Leubner }
33764e1bc9a0SAchim Leubner
33774e1bc9a0SAchim Leubner return status;
33784e1bc9a0SAchim Leubner }
33794e1bc9a0SAchim Leubner
33804e1bc9a0SAchim Leubner
33814e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaSendTMFIoctl(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,unsigned long resetType)33824e1bc9a0SAchim Leubner tdsaSendTMFIoctl( tiRoot_t *tiRoot,
33834e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
33844e1bc9a0SAchim Leubner void *agParam1,
33854e1bc9a0SAchim Leubner void *agParam2,
33864e1bc9a0SAchim Leubner unsigned long resetType
33874e1bc9a0SAchim Leubner )
33884e1bc9a0SAchim Leubner {
33894e1bc9a0SAchim Leubner bit32 status;
33904e1bc9a0SAchim Leubner tmf_pass_through_req_t *tmf_req = (tmf_pass_through_req_t*)agIOCTLPayload->FunctionSpecificArea;
33914e1bc9a0SAchim Leubner #if !(defined(__FreeBSD__))
33924e1bc9a0SAchim Leubner status = ostiSendResetDeviceIoctl(tiRoot, agParam2, tmf_req->pathId, tmf_req->targetId, tmf_req->lun, resetType);
33934e1bc9a0SAchim Leubner #endif
33944e1bc9a0SAchim Leubner TI_DBG3(("Status returned from ostiSendResetDeviceIoctl is %d\n",status));
33954e1bc9a0SAchim Leubner if(status != IOCTL_CALL_SUCCESS)
33964e1bc9a0SAchim Leubner {
33974e1bc9a0SAchim Leubner agIOCTLPayload->Status = status;
33984e1bc9a0SAchim Leubner return status;
33994e1bc9a0SAchim Leubner }
34004e1bc9a0SAchim Leubner status = IOCTL_CALL_SUCCESS;
34014e1bc9a0SAchim Leubner return status;
34024e1bc9a0SAchim Leubner }
34034e1bc9a0SAchim Leubner
34044e1bc9a0SAchim Leubner
34054e1bc9a0SAchim Leubner #ifdef VPD_TESTING
34064e1bc9a0SAchim Leubner /* temporary to test saSetVPDCommand() and saGetVPDCommand */
34074e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaVPDSet(tiRoot_t * tiRoot)34084e1bc9a0SAchim Leubner tdsaVPDSet(
34094e1bc9a0SAchim Leubner tiRoot_t *tiRoot
34104e1bc9a0SAchim Leubner )
34114e1bc9a0SAchim Leubner {
34124e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
34134e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
34144e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
34154e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
34164e1bc9a0SAchim Leubner agsaVPD_t VPDInfo;
34174e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
34184e1bc9a0SAchim Leubner
34194e1bc9a0SAchim Leubner bit32 bufAddrUpper = 0;
34204e1bc9a0SAchim Leubner bit32 bufAddrLower = 0;
34214e1bc9a0SAchim Leubner tdVPDControl_t *VPDControl;
34224e1bc9a0SAchim Leubner
34234e1bc9a0SAchim Leubner void *osMemHandle = agNULL;
34244e1bc9a0SAchim Leubner void *buffer;
34254e1bc9a0SAchim Leubner bit32 timeCount=0;
34264e1bc9a0SAchim Leubner bit8 ioctlErr=0;
34274e1bc9a0SAchim Leubner bit8 VPDPayload[32];
34284e1bc9a0SAchim Leubner bit8 i;
34294e1bc9a0SAchim Leubner TI_DBG2(("tdsaVPDSet: start\n"));
34304e1bc9a0SAchim Leubner
34314e1bc9a0SAchim Leubner for(i=0;i<sizeof(VPDPayload);i++)
34324e1bc9a0SAchim Leubner {
34334e1bc9a0SAchim Leubner VPDPayload[i] = i;
34344e1bc9a0SAchim Leubner }
34354e1bc9a0SAchim Leubner if(ostiAllocMemory( tiRoot,
34364e1bc9a0SAchim Leubner &osMemHandle,
34374e1bc9a0SAchim Leubner (void **)&buffer,
34384e1bc9a0SAchim Leubner &bufAddrUpper,
34394e1bc9a0SAchim Leubner &bufAddrLower,
34404e1bc9a0SAchim Leubner 8,
34414e1bc9a0SAchim Leubner sizeof(VPDPayload),
34424e1bc9a0SAchim Leubner agFALSE))
34434e1bc9a0SAchim Leubner {
34444e1bc9a0SAchim Leubner return tiError;
34454e1bc9a0SAchim Leubner }
34464e1bc9a0SAchim Leubner osti_memcpy((void *)buffer,
34474e1bc9a0SAchim Leubner VPDPayload,
34484e1bc9a0SAchim Leubner sizeof(VPDPayload));
34494e1bc9a0SAchim Leubner
34504e1bc9a0SAchim Leubner
34514e1bc9a0SAchim Leubner osti_memset(&VPDInfo, 0, sizeof(agsaVPD_t));
34524e1bc9a0SAchim Leubner #ifdef NOT_YET /* direct mode worked */
34534e1bc9a0SAchim Leubner /* For now, only direct mode */
34544e1bc9a0SAchim Leubner VPDInfo.indirectMode = 0; /* direct mode */
34554e1bc9a0SAchim Leubner VPDInfo.VPDDevice = 1; /* SEEPROM-1 */
34564e1bc9a0SAchim Leubner VPDInfo.directLen = (bit8)sizeof(VPDPayload);
34574e1bc9a0SAchim Leubner VPDInfo.VPDOffset = 0;
34584e1bc9a0SAchim Leubner VPDInfo.directData = buffer;
34594e1bc9a0SAchim Leubner VPDInfo.indirectAddrUpper32 = bufAddrUpper;
34604e1bc9a0SAchim Leubner VPDInfo.indirectAddrLower32 = bufAddrLower;
34614e1bc9a0SAchim Leubner VPDInfo.indirectLen = sizeof(VPDPayload);
34624e1bc9a0SAchim Leubner #endif
34634e1bc9a0SAchim Leubner
34644e1bc9a0SAchim Leubner /* indirect mode */
34654e1bc9a0SAchim Leubner VPDInfo.indirectMode = 1; /* indirect mode */
34664e1bc9a0SAchim Leubner VPDInfo.VPDDevice = 1; /* SEEPROM-1 */
34674e1bc9a0SAchim Leubner VPDInfo.directLen = 0;
34684e1bc9a0SAchim Leubner VPDInfo.VPDOffset = 0;
34694e1bc9a0SAchim Leubner VPDInfo.directData = agNULL;
34704e1bc9a0SAchim Leubner VPDInfo.indirectAddrUpper32 = bufAddrUpper;
34714e1bc9a0SAchim Leubner VPDInfo.indirectAddrLower32 = bufAddrLower;
34724e1bc9a0SAchim Leubner VPDInfo.indirectLen = sizeof(VPDPayload);
34734e1bc9a0SAchim Leubner
34744e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
34754e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1 = agParam1;
34764e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2 = agParam2;
34774e1bc9a0SAchim Leubner
34784e1bc9a0SAchim Leubner /* for testing only */
34794e1bc9a0SAchim Leubner tdsaAllShared->addrUpper = bufAddrUpper;
34804e1bc9a0SAchim Leubner tdsaAllShared->addrLower = bufAddrLower;
34814e1bc9a0SAchim Leubner
34824e1bc9a0SAchim Leubner ret = saSetVPDCommand(agRoot, agNULL, 0, &VPDInfo);
34834e1bc9a0SAchim Leubner
34844e1bc9a0SAchim Leubner if (ret == AGSA_RC_SUCCESS)
34854e1bc9a0SAchim Leubner {
34864e1bc9a0SAchim Leubner status = tiSuccess;
34874e1bc9a0SAchim Leubner }
34884e1bc9a0SAchim Leubner else
34894e1bc9a0SAchim Leubner {
34904e1bc9a0SAchim Leubner status = tiError;
34914e1bc9a0SAchim Leubner }
34924e1bc9a0SAchim Leubner
34934e1bc9a0SAchim Leubner ostiFreeMemory(tiRoot, osMemHandle, sizeof(VPDPayload));
34944e1bc9a0SAchim Leubner return status;
34954e1bc9a0SAchim Leubner }
34964e1bc9a0SAchim Leubner
34974e1bc9a0SAchim Leubner /* temporary to test saSetVPDCommand() and saGetVPDCommand */
34984e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaVPDGet(tiRoot_t * tiRoot)34994e1bc9a0SAchim Leubner tdsaVPDGet(tiRoot_t *tiRoot)
35004e1bc9a0SAchim Leubner {
35014e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
35024e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
35034e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
35044e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
35054e1bc9a0SAchim Leubner agsaVPD_t VPDInfo;
35064e1bc9a0SAchim Leubner bit32 ret = AGSA_RC_SUCCESS;
35074e1bc9a0SAchim Leubner
35084e1bc9a0SAchim Leubner
35094e1bc9a0SAchim Leubner TI_DBG2(("tdsaVPDGet: start\n"));
35104e1bc9a0SAchim Leubner
35114e1bc9a0SAchim Leubner osti_memset(&VPDInfo, 0, sizeof(agsaVPD_t));
35124e1bc9a0SAchim Leubner
35134e1bc9a0SAchim Leubner /* direct mode worked */
35144e1bc9a0SAchim Leubner VPDInfo.indirectMode = 0; /* direct mode */
35154e1bc9a0SAchim Leubner VPDInfo.VPDDevice = 1; /* SEEPROM-1*/
35164e1bc9a0SAchim Leubner VPDInfo.directLen = 32;
35174e1bc9a0SAchim Leubner VPDInfo.VPDOffset = 0;
35184e1bc9a0SAchim Leubner VPDInfo.directData = agNULL;
35194e1bc9a0SAchim Leubner VPDInfo.indirectAddrUpper32 = 0;
35204e1bc9a0SAchim Leubner VPDInfo.indirectAddrLower32 = 0;
35214e1bc9a0SAchim Leubner VPDInfo.indirectLen = 0;
35224e1bc9a0SAchim Leubner
35234e1bc9a0SAchim Leubner
35244e1bc9a0SAchim Leubner #ifdef NOT_YET /* worked; can't read VPD in ossaGetVPDResponseCB() because of indirect */
35254e1bc9a0SAchim Leubner VPDInfo.indirectMode = 1; /* direct mode */
35264e1bc9a0SAchim Leubner VPDInfo.VPDDevice = 1; /* SEEPROM-1*/
35274e1bc9a0SAchim Leubner VPDInfo.directLen = 0;
35284e1bc9a0SAchim Leubner VPDInfo.VPDOffset = 0;
35294e1bc9a0SAchim Leubner VPDInfo.directData = agNULL;
35304e1bc9a0SAchim Leubner VPDInfo.indirectAddrUpper32 = tdsaAllShared->addrUpper;
35314e1bc9a0SAchim Leubner VPDInfo.indirectAddrLower32 = tdsaAllShared->addrLower;
35324e1bc9a0SAchim Leubner VPDInfo.indirectLen = 32;
35334e1bc9a0SAchim Leubner #endif
35344e1bc9a0SAchim Leubner ret = saGetVPDCommand(agRoot, agNULL, 0, &VPDInfo);
35354e1bc9a0SAchim Leubner
35364e1bc9a0SAchim Leubner if (ret == AGSA_RC_SUCCESS)
35374e1bc9a0SAchim Leubner {
35384e1bc9a0SAchim Leubner status = tiSuccess;
35394e1bc9a0SAchim Leubner }
35404e1bc9a0SAchim Leubner else
35414e1bc9a0SAchim Leubner {
35424e1bc9a0SAchim Leubner status = tiError;
35434e1bc9a0SAchim Leubner }
35444e1bc9a0SAchim Leubner return status;
35454e1bc9a0SAchim Leubner }
35464e1bc9a0SAchim Leubner #endif
35474e1bc9a0SAchim Leubner /*****************************************************************************
35484e1bc9a0SAchim Leubner *
35494e1bc9a0SAchim Leubner * tdsaGetNumOfLUNIOCTL
35504e1bc9a0SAchim Leubner *
35514e1bc9a0SAchim Leubner * Purpose: This routine is called to send Report LUN SSP command request.
35524e1bc9a0SAchim Leubner *
35534e1bc9a0SAchim Leubner * Parameters:
35544e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
35554e1bc9a0SAchim Leubner * tiIOCTLPayload_t: Status of the Controller Reset.
35564e1bc9a0SAchim Leubner * agParam1: Void pointer to device extension
35574e1bc9a0SAchim Leubner * agParam2: Void pointer to SRB
35584e1bc9a0SAchim Leubner * agParam3: NULL
35594e1bc9a0SAchim Leubner *
35604e1bc9a0SAchim Leubner * Return: status
35614e1bc9a0SAchim Leubner *
35624e1bc9a0SAchim Leubner *
35634e1bc9a0SAchim Leubner *****************************************************************************/
35644e1bc9a0SAchim Leubner osGLOBAL bit32
tdsaGetNumOfLUNIOCTL(tiRoot_t * tiRoot,tiIOCTLPayload_t * agIOCTLPayload,void * agParam1,void * agParam2,void * agParam3)35654e1bc9a0SAchim Leubner tdsaGetNumOfLUNIOCTL(
35664e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
35674e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload,
35684e1bc9a0SAchim Leubner void *agParam1,
35694e1bc9a0SAchim Leubner void *agParam2,
35704e1bc9a0SAchim Leubner void *agParam3
35714e1bc9a0SAchim Leubner )
35724e1bc9a0SAchim Leubner {
35734e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
35744e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
35754e1bc9a0SAchim Leubner agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
35764e1bc9a0SAchim Leubner tdDeviceLUNInfoIOCTL_t *pDeviceLUNInfo = agNULL;
35774e1bc9a0SAchim Leubner tiDeviceHandle_t *devHandle = agNULL;
35784e1bc9a0SAchim Leubner void *tiRequestBody = agNULL;
35794e1bc9a0SAchim Leubner tiIORequest_t *tiIORequest = agNULL;
35804e1bc9a0SAchim Leubner bit32 status = IOCTL_CALL_SUCCESS;
35814e1bc9a0SAchim Leubner
35824e1bc9a0SAchim Leubner TI_DBG2(("tdsaGetNumOfLUNIOCTL: Start\n"));
35834e1bc9a0SAchim Leubner do
35844e1bc9a0SAchim Leubner {
35854e1bc9a0SAchim Leubner pDeviceLUNInfo = (tdDeviceLUNInfoIOCTL_t*)agIOCTLPayload->FunctionSpecificArea;
35864e1bc9a0SAchim Leubner
35874e1bc9a0SAchim Leubner if (agIOCTLPayload->Length < sizeof(tdDeviceLUNInfoIOCTL_t))
35884e1bc9a0SAchim Leubner {
35894e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
35904e1bc9a0SAchim Leubner break;
35914e1bc9a0SAchim Leubner }
35924e1bc9a0SAchim Leubner if(!pDeviceLUNInfo->tiDeviceHandle)
35934e1bc9a0SAchim Leubner {
35944e1bc9a0SAchim Leubner status = IOCTL_CALL_FAIL;
35954e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
35964e1bc9a0SAchim Leubner break;
35974e1bc9a0SAchim Leubner }
35984e1bc9a0SAchim Leubner devHandle = (tiDeviceHandle_t*)pDeviceLUNInfo->tiDeviceHandle;
35994e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
36004e1bc9a0SAchim Leubner
36014e1bc9a0SAchim Leubner status = ostiNumOfLUNIOCTLreq(tiRoot,agParam1,agParam2,&tiRequestBody,&tiIORequest);
36024e1bc9a0SAchim Leubner
36034e1bc9a0SAchim Leubner
36044e1bc9a0SAchim Leubner if(status != AGSA_RC_SUCCESS)
36054e1bc9a0SAchim Leubner {
36064e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
36074e1bc9a0SAchim Leubner break;
36084e1bc9a0SAchim Leubner }
36094e1bc9a0SAchim Leubner status = tiNumOfLunIOCTLreq(tiRoot,tiIORequest,devHandle,tiRequestBody,agIOCTLPayload,agParam1,agParam2);
36104e1bc9a0SAchim Leubner
36114e1bc9a0SAchim Leubner if(status != AGSA_RC_SUCCESS)
36124e1bc9a0SAchim Leubner {
36134e1bc9a0SAchim Leubner agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
36144e1bc9a0SAchim Leubner break;
36154e1bc9a0SAchim Leubner }
36164e1bc9a0SAchim Leubner // ostiIOCTLWaitForSignal (tiRoot, agParam1, agParam2, agParam3);
36174e1bc9a0SAchim Leubner
36184e1bc9a0SAchim Leubner }while(0);
36194e1bc9a0SAchim Leubner TI_DBG2(("tdsaGetNumOfLUNIOCTL: End\n"));
36204e1bc9a0SAchim Leubner return status;
36214e1bc9a0SAchim Leubner }
36224e1bc9a0SAchim Leubner
36234e1bc9a0SAchim Leubner
36244e1bc9a0SAchim Leubner /*****************************************************************************
36254e1bc9a0SAchim Leubner *
36264e1bc9a0SAchim Leubner * ostiNumOfLUNIOCTLRsp
36274e1bc9a0SAchim Leubner *
36284e1bc9a0SAchim Leubner * Purpose: This routine is called when a Report LUN SSP command response id recieved.
36294e1bc9a0SAchim Leubner *
36304e1bc9a0SAchim Leubner * Parameters:
36314e1bc9a0SAchim Leubner * tiRoot: Pointer to driver instance
36324e1bc9a0SAchim Leubner * bit32 status
36334e1bc9a0SAchim Leubner *
36344e1bc9a0SAchim Leubner * Return: none
36354e1bc9a0SAchim Leubner *
36364e1bc9a0SAchim Leubner *
36374e1bc9a0SAchim Leubner *****************************************************************************/
ostiNumOfLUNIOCTLRsp(tiRoot_t * tiRoot,bit32 status)36384e1bc9a0SAchim Leubner osGLOBAL void ostiNumOfLUNIOCTLRsp(
36394e1bc9a0SAchim Leubner tiRoot_t *tiRoot,
36404e1bc9a0SAchim Leubner bit32 status
36414e1bc9a0SAchim Leubner )
36424e1bc9a0SAchim Leubner {
36434e1bc9a0SAchim Leubner tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
36444e1bc9a0SAchim Leubner tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
36454e1bc9a0SAchim Leubner tiIOCTLPayload_t *agIOCTLPayload;
36464e1bc9a0SAchim Leubner tdDeviceLUNInfoIOCTL_t *pDeviceLUNInfo = NULL;
36474e1bc9a0SAchim Leubner bit32 count = 0;
36484e1bc9a0SAchim Leubner bit32 numOfLUN =0;
36494e1bc9a0SAchim Leubner
36504e1bc9a0SAchim Leubner TI_DBG1(("ostiNumOfLUNIOCTLRsp: start, status = %d\n", status));
36514e1bc9a0SAchim Leubner
36524e1bc9a0SAchim Leubner if(tdsaAllShared->tdFWControlEx.inProgress == 1)
36534e1bc9a0SAchim Leubner {
36544e1bc9a0SAchim Leubner agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
36554e1bc9a0SAchim Leubner if ((agIOCTLPayload) && (PMC_IOCTL_SIGNATURE == agIOCTLPayload->Signature)&&
36564e1bc9a0SAchim Leubner (IOCTL_MJ_GET_DEVICE_LUN == agIOCTLPayload->MajorFunction))
36574e1bc9a0SAchim Leubner {
36584e1bc9a0SAchim Leubner agIOCTLPayload->Status = (bit16)status;
36594e1bc9a0SAchim Leubner pDeviceLUNInfo = (tdDeviceLUNInfoIOCTL_t*)agIOCTLPayload->FunctionSpecificArea;
36604e1bc9a0SAchim Leubner numOfLUN = ((tdsaAllShared->tdFWControlEx.virtAddr[0] << 24)|(tdsaAllShared->tdFWControlEx.virtAddr[1] << 16)|\
36614e1bc9a0SAchim Leubner (tdsaAllShared->tdFWControlEx.virtAddr[2] << 8)|(tdsaAllShared->tdFWControlEx.virtAddr[3]));
36624e1bc9a0SAchim Leubner numOfLUN = numOfLUN/8;
36634e1bc9a0SAchim Leubner pDeviceLUNInfo->numOfLun = numOfLUN;
36644e1bc9a0SAchim Leubner // ostiFreeMemory(tiRoot,
36654e1bc9a0SAchim Leubner // tdsaAllShared->tdFWControlEx.virtAddr,
36664e1bc9a0SAchim Leubner // tdsaAllShared->tdFWControlEx.len);
36674e1bc9a0SAchim Leubner // if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
36684e1bc9a0SAchim Leubner // {
36694e1bc9a0SAchim Leubner ostiIOCTLSetSignal(tiRoot,
36704e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param1,
36714e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.param2,
36724e1bc9a0SAchim Leubner NULL);
36734e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.payload = NULL;
36744e1bc9a0SAchim Leubner // }
36754e1bc9a0SAchim Leubner
36764e1bc9a0SAchim Leubner tdsaAllShared->tdFWControlEx.inProgress = 0;
36774e1bc9a0SAchim Leubner }
36784e1bc9a0SAchim Leubner }
36794e1bc9a0SAchim Leubner TI_DBG1(("ostiNumOfLUNIOCTLRsp: End\n"));
36804e1bc9a0SAchim Leubner }
36814e1bc9a0SAchim Leubner
3682