/*
* scrDbg.c
*
* Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name Texas Instruments nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/** \file scrDbg.c
* \brief This file include the SCR debug module implementation
*
* \see scrDbg.h, scrApi.h
*/
#include "tidef.h"
#include "scrDbg.h"
#include "osApi.h"
#include "report.h"
#define MAX_DESC_LENGTH 50
char clientDesc[ SCR_CID_NO_CLIENT + 1 ][ MAX_DESC_LENGTH ] =
{
"SCR_CID_APP_SCAN",
"SCR_CID_DRIVER_FG_SCAN",
"SCR_CID_CONT_SCAN",
"SCR_CID_XCC_MEASURE",
"SCR_CID_BASIC_MEASURE",
"SCR_CID_CONNECT",
"SCR_CID_IMMED_SCAN",
"SCR_CID_SWITCH_CHAN",
"SCR_CID_NUM_OF_CLIENTS",
"SCR_CID_NO_CLIENT"
};
char requestStatusDesc[ 4 ][ MAX_DESC_LENGTH ] =
{
"SCR_CRS_RUN",
"SCR_CRS_PEND",
"SCR_CRS_ABORT",
"SCR_CRS_FW_RESET"
};
char pendReasonDesc[ SCR_PR_NONE + 1 ][ MAX_DESC_LENGTH ] =
{
"SCR_PR_OTHER_CLIENT_ABORTING",
"SCR_PR_OTHER_CLIENT_RUNNING",
"SCR_PR_DIFFERENT_GROUP_RUNNING",
"SCR_PR_NONE"
};
char groupDesc[ SCR_GID_NUM_OF_GROUPS ][ MAX_DESC_LENGTH ] =
{
"SCR_GID_IDLE",
"SCR_GID_DRV_SCAN",
"SCR_GID_APP_SCAN",
"SCR_GID_CONNECT",
"SCR_GID_CONNECTED",
"SCR_GID_ROAMING"
};
char stateDesc[ SCR_CS_ABORTING + 1 ][ MAX_DESC_LENGTH ] =
{
"SCR_CS_IDLE",
"SCR_CS_PENDING",
"SCR_CS_RUNNING",
"SCR_CS_ABORTING"
};
char modeDesc[ SCR_MID_NUM_OF_MODES][ MAX_DESC_LENGTH ] =
{
"SCR_MID_NORMAL",
"SCR_MID_SG",
};
char resourceDesc[ SCR_RESOURCE_NUM_OF_RESOURCES ][ MAX_DESC_LENGTH ]=
{
"SCR_RESOURCE_SERVING_CHANNEL",
"SCR_RESOURCE_PERIODIC_SCAN"
};
/**
* \\n
* \date 01-May-2005\n
* \brief Main SCR debug function
*
* Function Scope \e Public.\n
* \param hScr - handle to the SCR object.\n
* \param funcType - the specific debug function.\n
* \param pParam - parameters for the debug function.\n
*/
void scrDebugFunction( TI_HANDLE hScr, TI_UINT32 funcType, void *pParam )
{
switch (funcType)
{
case DBG_SCR_PRINT_HELP:
printScrDbgFunctions();
break;
case DBG_SCR_CLIENT_REQUEST_SERVING_CHANNEL:
requestAsClient( hScr, *((EScrClientId*)pParam), SCR_RESOURCE_SERVING_CHANNEL );
break;
case DBG_SCR_CLIENT_RELEASE_SERVING_CHANNEL:
releaseAsClient( hScr, *((EScrClientId*)pParam), SCR_RESOURCE_SERVING_CHANNEL );
break;
case DBG_SCR_CLIENT_REQUEST_PERIODIC_SCAN:
requestAsClient( hScr, *((EScrClientId*)pParam), SCR_RESOURCE_PERIODIC_SCAN );
break;
case DBG_SCR_CLIENT_RELEASE_PERIODIC_SCAN:
releaseAsClient( hScr, *((EScrClientId*)pParam), SCR_RESOURCE_PERIODIC_SCAN );
break;
case DBG_SCR_SET_GROUP:
changeGroup( hScr, *((EScrGroupId*)pParam) );
break;
case DBG_SCR_PRINT_OBJECT:
printSCRObject( hScr );
break;
case DBG_SCR_SET_MODE:
changeMode(hScr, *((EScrModeId*)pParam));
break;
default:
WLAN_OS_REPORT(("Invalid function type in SCR debug function: %d\n", funcType));
break;
}
}
/**
* \\n
* \date 01-May-2005\n
* \brief Prints SCR debug menu
*
* Function Scope \e Public.\n
*/
void printScrDbgFunctions(void)
{
WLAN_OS_REPORT((" SCR Debug Functions \n"));
WLAN_OS_REPORT(("-------------------------\n"));
WLAN_OS_REPORT(("1700 - Print the SCR Debug Help\n"));
WLAN_OS_REPORT(("1701 <client> - Request SCR as one shot scan (set client 0-7).\n"));
WLAN_OS_REPORT(("1702 <client> - Release SCR as one shot scan (set client 0-7).\n"));
WLAN_OS_REPORT(("1703 <client> - Request SCR as periodic scan (set client 0-7).\n"));
WLAN_OS_REPORT(("1704 <client> - Release SCR as periodic scan (set client 0-7).\n"));
WLAN_OS_REPORT(("1705 - Change SCR group\n"));
WLAN_OS_REPORT(("1706 - Print SCR object\n"));
WLAN_OS_REPORT(("1707 - Change SCR mode\n"));
}
/**
* \\n
* \date 29-March-2005\n
* \brief Request the SCR with a given client ID.\n
*
* Function Scope \e Public.\n
* \param hScr - handle to the SCR object.\n
* \param client - the client to request as.\n\
* \param eResource - the requested resource.\n
*/
void requestAsClient( TI_HANDLE hScr, EScrClientId client, EScrResourceId eResource )
{
EScePendReason pendReason;
EScrClientRequestStatus requestStatus;
requestStatus = scr_clientRequest( hScr, client, eResource, &pendReason );
WLAN_OS_REPORT(("Resource %s was requested as client %s, result %s, pend reason %s\n",
resourceDesc[ eResource ], clientDesc[ client ], requestStatusDesc[ requestStatus ],
pendReasonDesc[ pendReason ]));
}
/**
* \\n
* \date 01-May-2005\n
* \brief Stops continuous scan process.\n
*
* Function Scope \e Public.\n
* \param hScr - handle to the SCR object.\n
* \param client - the client to release as.\n
* \param eResource - the released resource.\n
*/
void releaseAsClient( TI_HANDLE hScr, EScrClientId client, EScrResourceId eResource )
{
scr_clientComplete( hScr, client, eResource );
WLAN_OS_REPORT(("Resource %s was released as client %s\n",
resourceDesc[ eResource ], clientDesc[ client ]));
}
/**
* \\n
* \date 01-May-2005\n
* \brief Change the SCR group.\n
*
* Function Scope \e Public.\n
* \param hScr - handle to the SCR object.\n
* \param group - the group to change to.\n
*/
void changeGroup( TI_HANDLE hScr, EScrGroupId group )
{
scr_setGroup( hScr, group );
WLAN_OS_REPORT(("SCR group was changed to %s\n",
groupDesc[ group ]));
}
/**
* \\n
* \date 23-Nov-2005\n
* \brief Change the SCR mode.\n
*
* Function Scope \e Public.\n
* \param hScr - handle to the SCR object.\n
* \param mode - the mode to change to.\n
*/
void changeMode( TI_HANDLE hScr, EScrModeId mode )
{
scr_setMode( hScr, mode );
WLAN_OS_REPORT(("SCR mode was changed to %s\n",
modeDesc[ mode ]));
}
/**
* \\n
* \date 15-June-2005\n
* \brief Prints the SCR object.\n
*
* Function Scope \e Public.\n
* \param hScr - handle to the SCR object.\n
*/
void printSCRObject( TI_HANDLE hScr )
{
#ifdef REPORT_LOG
TScr* pScr = (TScr*)hScr;
int i;
WLAN_OS_REPORT( ("SCR current group:%s, mode: %s, serving channel owner:%s, periodic scan owner: %s "
"within request:%s\n",
groupDesc[ pScr->currentGroup ],modeDesc[ pScr->currentMode ],
clientDesc[ pScr->runningClient[ SCR_RESOURCE_SERVING_CHANNEL ] ],
clientDesc[ pScr->runningClient[ SCR_RESOURCE_PERIODIC_SCAN ] ],
(TI_TRUE == pScr->statusNotficationPending ? "Yes" : "No" )) );
WLAN_OS_REPORT( ("%-22s %-15s %-15s %-15s %-15s\n", "Client", "State (SC)", "State (PS)", "Pend Reason (SC)", "Pend Reason (PS)") );
WLAN_OS_REPORT( ("----------------------------------------------------------------------\n"));
for ( i = 0; i < SCR_CID_NUM_OF_CLIENTS; i++ )
{
WLAN_OS_REPORT( ("%-22s %-15s %-15s %-15s %-15s \n",
clientDesc[ i ], stateDesc[ pScr->clientArray[ i ].state[ SCR_RESOURCE_SERVING_CHANNEL ] ],
stateDesc[ pScr->clientArray[ i ].state[ SCR_RESOURCE_PERIODIC_SCAN ] ],
pendReasonDesc[ pScr->clientArray[ i ].currentPendingReason[ SCR_RESOURCE_SERVING_CHANNEL ] ],
pendReasonDesc[ pScr->clientArray[ i ].currentPendingReason[ SCR_RESOURCE_PERIODIC_SCAN ] ]) );
}
#endif
}