diff options
Diffstat (limited to 'wl1271/stad/src/Sta_Management/scr.c')
-rw-r--r-- | wl1271/stad/src/Sta_Management/scr.c | 933 |
1 files changed, 0 insertions, 933 deletions
diff --git a/wl1271/stad/src/Sta_Management/scr.c b/wl1271/stad/src/Sta_Management/scr.c deleted file mode 100644 index 4d164fe..0000000 --- a/wl1271/stad/src/Sta_Management/scr.c +++ /dev/null @@ -1,933 +0,0 @@ -/* - * scr.c - * - * Copyright(c) 1998 - 2010 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 scr.c - * \brief This file include the SCR module implementation - * - * \see scr.h, scrApi.h - */ - -#define __FILE_ID__ FILE_ID_82 -#include "tidef.h" -#include "report.h" -#include "osApi.h" -#include "scr.h" -#include "DrvMainModules.h" - - -/* - *********************************************************************** - * External data definitions. - *********************************************************************** - */ - -/** - * \brief This array holds configuration values for abort others field for different clients.\n - */ -static EScrClientId abortOthers[ SCR_RESOURCE_NUM_OF_RESOURCES ][ SCR_CID_NUM_OF_CLIENTS ] = -/* APP_SCAN DRV_FG CONT_SCAN XCC_MSR BASIC_MSR CONNECT IMMED_SCN SWITCH_CHNL*/ -{/* Serving channel resource */ - { SCR_CID_NO_CLIENT, SCR_CID_NO_CLIENT, SCR_CID_NO_CLIENT, SCR_CID_NO_CLIENT, SCR_CID_NO_CLIENT, SCR_CID_BASIC_MEASURE, SCR_CID_BASIC_MEASURE, SCR_CID_BASIC_MEASURE }, - /* periodic scan resource */ - { SCR_CID_NO_CLIENT, SCR_CID_APP_SCAN, SCR_CID_NO_CLIENT, SCR_CID_NO_CLIENT, SCR_CID_NO_CLIENT, SCR_CID_DRIVER_FG_SCAN,SCR_CID_NO_CLIENT, SCR_CID_NO_CLIENT } -}; - -/** - * \brief This array holds configuration values for the client status field for different clients and groups. \n - */ -static TI_BOOL clientStatus[ SCR_RESOURCE_NUM_OF_RESOURCES ][ SCR_MID_NUM_OF_MODES ][ SCR_GID_NUM_OF_GROUPS ][ SCR_CID_NUM_OF_CLIENTS ] = - { - {/* serving channel resource */ - {/* This is the table for Normal mode */ - /* client status for idle group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for DRV scan group */ - { TI_TRUE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for APP scan group */ - { TI_TRUE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for connect group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_TRUE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_TRUE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for connected group */ - { TI_TRUE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_TRUE, /**< client status for SCR_CID_CONT_SCAN */ - TI_TRUE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_TRUE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_TRUE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for roaming group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_TRUE, /**< client status for SCR_CID_CONNECT */ - TI_TRUE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ } - }, - - /* This is the table for the Soft gemini mode */ - - { /* client status for idle group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for DRV scan group */ - { TI_TRUE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for APP scan group */ - { TI_TRUE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for connect group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_TRUE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_TRUE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for connected group */ - { TI_TRUE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_TRUE, /**< client status for SCR_CID_CONT_SCAN */ - TI_TRUE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_TRUE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_TRUE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for roaming group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_TRUE, /**< client status for SCR_CID_CONNECT */ - TI_TRUE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ } - } - }, - {/* periodic-scan resource */ - {/* This is the table for Normal mode */ - /* client status for idle group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for DRV scan gorup */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_TRUE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for APP scan gorup */ - { TI_TRUE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for connect group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_TRUE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for connected group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for roaming group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_TRUE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ } - }, - - /* This is the table for the Soft gemini mode */ - - { /* client status for idle group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for DRV scan gorup */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_TRUE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for APP scan gorup */ - { TI_TRUE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for connect group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_TRUE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for connected group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ }, - /* client status for roaming group */ - { TI_FALSE, /**< client status for SCR_CID_APP_SCAN */ - TI_FALSE, /**< client status for SCR_CID_DRIVER_FG_SCAN */ - TI_FALSE, /**< client status for SCR_CID_CONT_SCAN */ - TI_FALSE, /**< client status for SCR_CID_XCC_MEASURE */ - TI_FALSE, /**< client status for SCR_CID_BASIC_MEASURE */ - TI_TRUE, /**< client status for SCR_CID_CONNECT */ - TI_FALSE, /**< client status for SCR_CID_IMMED_SCAN */ - TI_FALSE, /**< client status for SCR_CID_SWITCH_CHANNEL */ } - } - } - }; - - -/** - * \\n - * \date 01-Dec-2004\n - * \brief Creates the SCR object - * - * Function Scope \e Public.\n - * \param hOS - handle to the OS object.\n - * \return a handle to the SCR object.\n - */ -TI_HANDLE scr_create( TI_HANDLE hOS ) -{ - /* allocate the SCR object */ - TScr *pScr = os_memoryAlloc( hOS, sizeof(TScr)); - - if ( NULL == pScr ) - { - WLAN_OS_REPORT( ("ERROR: Failed to create SCR module")); - return NULL; - } - - /* store the OS handle */ - pScr->hOS = hOS; - - return pScr; -} - -/** - * \\n - * \date 01-Dec-2004\n - * \brief Finalizes the SCR object (freeing memory) - * - * Function Scope \e Public.\n - * \param hScr - handle to the SCR object.\n - */ -void scr_release( TI_HANDLE hScr ) -{ - TScr *pScr = (TScr*)hScr; - - os_memoryFree( pScr->hOS, hScr, sizeof(TScr)); -} - -/** - * \\n - * \date 01-Dec-2004\n - * \brief Initializes the SCR object - * - * \param pStadHandles - The driver modules handles - * \return void - */ -void scr_init (TStadHandlesList *pStadHandles) -{ - TScr *pScr = (TScr*)(pStadHandles->hSCR); - TI_UINT32 i, j; - - /* store the report object */ - pScr->hReport = pStadHandles->hReport; - - /* mark current group as idle */ - pScr->currentGroup = SCR_GID_IDLE; - - /* mark current mode as normal */ - pScr->currentMode = SCR_MID_NORMAL; - - /* signal not within request process */ - pScr->statusNotficationPending = TI_FALSE; - - /* mark that no client is currently running */ - for (i = 0; i < SCR_RESOURCE_NUM_OF_RESOURCES; i++) - { - pScr->runningClient[ i ] = SCR_CID_NO_CLIENT; - } - - /* initialize client array */ - for (i = 0; i < SCR_CID_NUM_OF_CLIENTS; i++ ) - { - for (j = 0; j < SCR_RESOURCE_NUM_OF_RESOURCES; j++) - { - pScr->clientArray[ i ].state[ j ] = SCR_CS_IDLE; - pScr->clientArray[ i ].currentPendingReason[ j ] = SCR_PR_NONE; - } - pScr->clientArray[ i ].clientRequestCB = NULL; - pScr->clientArray[ i ].ClientRequestCBObj = NULL; - } - - TRACE0(pScr->hReport, REPORT_SEVERITY_INIT , ".....SCR configured successfully\n"); -} - -/** - * \\n - * \date 01-Dec-2004\n - * \brief Registers the callback function to be used per client. - * - * Function Scope \e Public.\n - * \param hScr - handle to the SCR object.\n - * \param client - the client ID.\n - * \param callbackFunc - the address of the callback function to use.\n - * \param callbackObj - the handle of the object to pass to the callback function (the client object).\n - */ -void scr_registerClientCB( TI_HANDLE hScr, - EScrClientId client, - TScrCB callbackFunc, - TI_HANDLE callbackObj ) -{ - TScr *pScr = (TScr*)hScr; - -#ifdef TI_DBG - if (client >= SCR_CID_NUM_OF_CLIENTS) - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Attempting to register callback for invalid client %d\n", client); - return; - } -#endif - pScr->clientArray[ client ].clientRequestCB = callbackFunc; - pScr->clientArray[ client ].ClientRequestCBObj = callbackObj; -} - -/** - * \\n - * \date 01-Dec-2004\n - * \brief Notifies the running process upon a firmware reset. - * - * Function Scope \e Public.\n - * \param hScr - handle to the SCR object.\n - */ -void scr_notifyFWReset( TI_HANDLE hScr ) -{ - TScr *pScr = (TScr*)hScr; - TI_UINT32 uResourceIndex; - - /* check both resources */ - for (uResourceIndex = 0; uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES; uResourceIndex++) - { - /* if a client is currently running, notify it of the recovery event */ - if ( SCR_CID_NO_CLIENT != pScr->runningClient[ uResourceIndex ] ) - { - TRACE1( pScr->hReport, REPORT_SEVERITY_INFORMATION, "FW reset occured. Client %d Notified.\n", pScr->runningClient[ uResourceIndex ]); - if ( NULL != pScr->clientArray[ pScr->runningClient[ uResourceIndex ] ].clientRequestCB ) - { - pScr->clientArray[ pScr->runningClient[ uResourceIndex ] ].clientRequestCB( pScr->clientArray[ pScr->runningClient[ uResourceIndex ] ].ClientRequestCBObj, - SCR_CRS_FW_RESET, (EScrResourceId)uResourceIndex, SCR_PR_NONE ); - } - else - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Trying to call client %d callback, which is NULL\n", pScr->runningClient[ uResourceIndex ]); - } - } - #ifdef TI_DBG - else - { - TRACE0( pScr->hReport, REPORT_SEVERITY_INFORMATION, "FW reset occured. No client was running.\n"); - } - #endif - } -} - -/** - * \\n - * \date 27-April-2005\n - * \brief Changes the current SCR group.\n - * - * Function Scope \e Public.\n - * \param hScr - handle to the SCR object.\n - * \param newGroup - the new group to use.\n - */ -void scr_setGroup( TI_HANDLE hScr, EScrGroupId newGroup ) -{ - TScr *pScr = (TScr*)hScr; - TI_UINT32 i, uResourceIndex; - EScrClientId highestPending; - - TRACE1( pScr->hReport, REPORT_SEVERITY_INFORMATION, "Setting group %d.\n", newGroup); - -#ifdef TI_DBG - if (newGroup >= SCR_GID_NUM_OF_GROUPS) - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Attempting to set invalid group to %d\n", newGroup); - return; - } -#endif - - /* keep the new group */ - pScr->currentGroup = newGroup; - - /* check both resources */ - for (uResourceIndex = 0; uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES; uResourceIndex++) - { - /* for all pending clients */ - for ( i = 0; i < SCR_CID_NUM_OF_CLIENTS; i++ ) - { - /* if the pending reason has escalated */ - if ( (pScr->clientArray[ i ].state[ uResourceIndex ] == SCR_CS_PENDING) && /* the client is pending */ - (pScr->clientArray[ i ].currentPendingReason[ uResourceIndex ] < SCR_PR_DIFFERENT_GROUP_RUNNING) && /* the client was enabled in the previous group */ - (TI_FALSE == clientStatus[ uResourceIndex ][ pScr->currentMode ][ newGroup ][ i ])) /* the client is not enabled in the new group */ - { - /* mark the new pending reason */ - pScr->clientArray[ i ].currentPendingReason[ uResourceIndex ] = SCR_PR_DIFFERENT_GROUP_RUNNING; - - /* notify the client of the change, using its callback */ - if ( NULL != pScr->clientArray[ i ].clientRequestCB ) - { - pScr->clientArray[ i ].clientRequestCB( pScr->clientArray[ i ].ClientRequestCBObj, - SCR_CRS_PEND, (EScrResourceId)uResourceIndex, SCR_PR_DIFFERENT_GROUP_RUNNING ); - } - else - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Trying to call client %d callback, which is NULL\n", i); - } - } - } - - - /* - * if no client is running call the highest pending client - * (after group change, previously pending clients may be enabled) - */ - if ( SCR_CID_NO_CLIENT == pScr->runningClient[ uResourceIndex ] ) - { - highestPending = scrFindHighest( hScr, SCR_CS_PENDING, uResourceIndex, - (SCR_CID_NUM_OF_CLIENTS - 1), 0 ); - if (( SCR_CID_NO_CLIENT != highestPending ) && (highestPending < SCR_CID_NUM_OF_CLIENTS)) - { - pScr->clientArray[ highestPending ].state[ uResourceIndex ] = SCR_CS_RUNNING; - pScr->clientArray[ highestPending ].currentPendingReason[ uResourceIndex ] = SCR_PR_NONE; - pScr->runningClient[ uResourceIndex ] = (EScrClientId)highestPending; - if ( NULL != pScr->clientArray[ highestPending ].clientRequestCB ) - { - pScr->clientArray[ highestPending ].clientRequestCB( pScr->clientArray[ highestPending ].ClientRequestCBObj, - SCR_CRS_RUN, (EScrResourceId)uResourceIndex, SCR_PR_NONE ); - } - else - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Trying to call client %d callback, which is NULL\n", highestPending); - } - } - } - } -} - -/** - * \\n - * \date 23-Nov-2005\n - * \brief Changes the current SCR mode.\n - * - * Function Scope \e Public.\n - * \param hScr - handle to the SCR object.\n - * \param newMode - the new mode to use.\n - */ -void scr_setMode( TI_HANDLE hScr, EScrModeId newMode ) -{ - TScr *pScr = (TScr*)hScr; -#ifdef SCR_ABORT_NOTIFY_ENABLED - TI_UINT32 i, uResourceIndex; - EScrClientId highestPending; -#endif - - TRACE1( pScr->hReport, REPORT_SEVERITY_INFORMATION, "Setting mode %d.\n", newMode); - -#ifdef TI_DBG - if (newMode >= SCR_MID_NUM_OF_MODES) - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Attempting to set invalid mode to %d\n", newMode); - return; - } -#endif - - /* keep the new mode */ - pScr->currentMode = newMode; - -#ifdef SCR_ABORT_NOTIFY_ENABLED - - for (uResourceIndex = 0; uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES; uResourceIndex++) - { - /* Stage I : if someone is running and shouldn't be running in the new mode - Abort it */ - if ( (SCR_CID_NO_CLIENT != pScr->runningClient[ uResourceIndex ]) && - (TI_FALSE == clientStatus[ uResourceIndex ][ pScr->currentMode ][ pScr->currentGroup ][ pScr->runningClient[ uResourceIndex ] ])) - { - /* abort the running client */ - pScr->clientArray[ pScr->runningClient[ uResourceIndex ] ].state[ uResourceIndex ] = SCR_CS_ABORTING; - if ( NULL != pScr->clientArray[ pScr->runningClient[ uResourceIndex ] ].clientRequestCB ) - { - TRACE2( pScr->hReport, REPORT_SEVERITY_INFORMATION, "Sending abort request to client %d for resource %d\n", pScr->runningClient[ uResourceIndex ], uResourceIndex); - pScr->clientArray[ pScr->runningClient[ uResourceIndex ] ].clientRequestCB( pScr->clientArray[ pScr->runningClient[ uResourceIndex ] ].ClientRequestCBObj, - SCR_CRS_ABORT, - (EScrResourceId)uResourceIndex, - SCR_PR_NONE ); - } - else - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Trying to call client %d callback, which is NULL\n", pScr->runningClient[ uResourceIndex ]); - } - } - - /* Stage II : notify escalated pending reason */ - /* for all pending clients */ - for ( i = 0; i < SCR_CID_NUM_OF_CLIENTS; i++ ) - { - /* if the pending reason has escalated */ - if ( (pScr->clientArray[ i ].state[ uResourceIndex ] == SCR_CS_PENDING) && /* the client is pending */ - (pScr->clientArray[ i ].currentPendingReason[ uResourceIndex ] < SCR_PR_DIFFERENT_GROUP_RUNNING) && /* the client was enabled in the previous group */ - (TI_FALSE == clientStatus[ uResourceIndex ][ pScr->currentMode ][ pScr->currentGroup ][ i ])) /* the client is not enabled in the new group/mode */ - { - /* mark the new pending reason */ - pScr->clientArray[ i ].currentPendingReason[ uResourceIndex ] = SCR_PR_DIFFERENT_GROUP_RUNNING; - - /* notify the client of the change, using its callback */ - if ( NULL != pScr->clientArray[ i ].clientRequestCB ) - { - pScr->clientArray[ i ].clientRequestCB( pScr->clientArray[ i ].ClientRequestCBObj, - SCR_CRS_PEND, (EScrResourceId)uResourceIndex, - SCR_PR_DIFFERENT_GROUP_RUNNING ); - } - else - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Trying to call client %d callback, which is NULL\n", i); - } - } - } - - - /* Stage III : call Highest Pending Client who is enabled in the new mode */ - if ( SCR_CID_NO_CLIENT == pScr->runningClient[ uResourceIndex ] ) - { - highestPending = scrFindHighest( hScr, SCR_CS_PENDING, uResourceIndex, - (SCR_CID_NUM_OF_CLIENTS - 1), 0 ); - if (SCR_CID_NO_CLIENT != highestPending) - { - pScr->clientArray[ highestPending ].state[ uResourceIndex ] = SCR_CS_RUNNING; - pScr->clientArray[ highestPending ].currentPendingReason[ uResourceIndex ] = SCR_PR_NONE; - pScr->runningClient[ uResourceIndex ] = (EScrClientId)highestPending; - if ( NULL != pScr->clientArray[ highestPending ].clientRequestCB ) - { - pScr->clientArray[ highestPending ].clientRequestCB( pScr->clientArray[ highestPending ].ClientRequestCBObj, - SCR_CRS_RUN, (EScrResourceId)uResourceIndex, - SCR_PR_NONE ); - } - else - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Trying to call client %d callback, which is NULL\n", highestPending); - } - } - } - } -#endif /* SCR_ABORT_NOTIFY_ENABLED */ -} - - -/** - * \\n - * \date 01-Dec-2004\n - * \brief Request the channel use by a client - * - * Function Scope \e Public.\n - * \param hScr - handle to the SCR object.\n - * \param client - the client ID requesting the channel.\n - * \param resource - the requested resource.\n - * \param pPendReason - the reason for a pend reply.\n - * \return The request status.\n - * \retval SCR_CRS_REJECT the channel cannot be allocated to this client. - * \retval SCR_CRS_PEND the channel is currently busy, and this client had been placed on the waiting list. - * \retval SCR_CRS_RUN the channel is allocated to this client. - */ -EScrClientRequestStatus scr_clientRequest( TI_HANDLE hScr, EScrClientId client, - EScrResourceId eResource, EScePendReason* pPendReason ) -{ - TScr *pScr = (TScr*)hScr; - - TRACE2( pScr->hReport, REPORT_SEVERITY_INFORMATION, "scr_clientRequest: Client %d requesting the channel for resource %d.\n", client, eResource); - -#ifdef TI_DBG - if (client >= SCR_CID_NUM_OF_CLIENTS) - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Attempting to request SCR for invalid client %d\n", client); - return SCR_CRS_PEND; - } - if (SCR_RESOURCE_NUM_OF_RESOURCES <= eResource) - { - TRACE2( pScr->hReport, REPORT_SEVERITY_ERROR, "Attempting to request SCR by client %d for invalid resource %d\n", client, eResource); - return SCR_CRS_PEND; - } -#endif - - *pPendReason = SCR_PR_NONE; - - /* check if already inside a request - shouldn't happen!!! */ - if ( TI_TRUE == pScr->statusNotficationPending ) - { - TRACE0( pScr->hReport, REPORT_SEVERITY_ERROR, "request call while already in request!\n"); - return SCR_CRS_PEND; - } - - /* check if current running client is requesting */ - if ( client == pScr->runningClient[ eResource ] ) - { - TRACE2( pScr->hReport, REPORT_SEVERITY_WARNING, "Client %d re-requesting SCR for resource %d\n", client, eResource); - return SCR_CRS_RUN; - } - - TRACE5( pScr->hReport, REPORT_SEVERITY_INFORMATION, "scr_clientRequest: is client enabled = %d. eResource=%d,currentMode=%d,currentGroup=%d,client=%d,\n", clientStatus[ eResource ][ pScr->currentMode ][ pScr->currentGroup ][ client ], eResource, pScr->currentMode, pScr->currentGroup, client); - - /* check if the client is enabled in the current group */ - if ( TI_TRUE != clientStatus[ eResource ][ pScr->currentMode ][ pScr->currentGroup ][ client ]) - { - pScr->clientArray[ client ].state[ eResource ] = SCR_CS_PENDING; - pScr->clientArray[ client ].currentPendingReason[ eResource ] - = *pPendReason = SCR_PR_DIFFERENT_GROUP_RUNNING; - return SCR_CRS_PEND; - } - - /* check if a there's no running client at the moment */ - if ( SCR_CID_NO_CLIENT == pScr->runningClient[ eResource ] ) - { - /* no running or aborted client - allow access */ - TRACE2( pScr->hReport, REPORT_SEVERITY_INFORMATION, "Resource %d allocated to client: %d\n", eResource, client); - pScr->clientArray[ client ].state[ eResource ] = SCR_CS_RUNNING; - pScr->runningClient[ eResource ] = client; - return SCR_CRS_RUN; - } - - /* check if any client is aborting at the moment */ - if ( SCR_CS_ABORTING == pScr->clientArray[ pScr->runningClient[ eResource ] ].state[ eResource ] ) - { - /* a client is currently aborting, but there still might be a pending client with higher priority - than the client currently requesting the SCR. If such client exists, the requesting client is - notified that it is pending because of this pending client, rather than the one currently aborting. - */ - EScrClientId highestPending; - highestPending = scrFindHighest( hScr, SCR_CS_PENDING, eResource, - (SCR_CID_NUM_OF_CLIENTS - 1), client ); - if ( (SCR_CID_NO_CLIENT == highestPending) || - (highestPending < client)) - { - /* if the requesting client has higher priority than the current highest priority pending client, - the current highest priority pending client should be notified that its pending reason has - changed (it is no longer waiting for current running client to abort, but for the requesting - client to finish, once the current has aborted */ - if ( (highestPending != SCR_CID_NO_CLIENT) && - (SCR_PR_OTHER_CLIENT_ABORTING == pScr->clientArray[ highestPending ].currentPendingReason[ eResource ])) - { - - if ( NULL != pScr->clientArray[ highestPending ].clientRequestCB ) - { - pScr->clientArray[ highestPending ].clientRequestCB( pScr->clientArray[ highestPending ].ClientRequestCBObj, - SCR_CRS_PEND, eResource, SCR_PR_OTHER_CLIENT_RUNNING ); - } - else - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Trying to call client %d callback, which is NULL\n", highestPending); - } - } - pScr->clientArray[ client ].currentPendingReason[ eResource ] = *pPendReason = SCR_PR_OTHER_CLIENT_ABORTING; - } - else - { - pScr->clientArray[ client ].currentPendingReason[ eResource ] = *pPendReason = SCR_PR_OTHER_CLIENT_RUNNING; - } - pScr->clientArray[ client ].state[ eResource ] = SCR_CS_PENDING; - return SCR_CRS_PEND; - } - - /* check if a client with higher priority is running */ - if (pScr->runningClient[ eResource ] > client) - { - pScr->clientArray[ client ].state[ eResource ] = SCR_CS_PENDING; - pScr->clientArray[ client ].currentPendingReason[ eResource ] = *pPendReason = SCR_PR_OTHER_CLIENT_RUNNING; - return SCR_CRS_PEND; - } - - /* if the client is not supposed to abort lower priority clients */ - if ( (SCR_CID_NO_CLIENT == abortOthers[ eResource ][ client ]) || /* client is not supposed to abort any other client */ - (pScr->runningClient[ eResource ] > abortOthers[ eResource ][ client ])) /* client is not supposed to abort running client */ - { - /* wait for the lower priority client */ - pScr->clientArray[ client ].state[ eResource ] = SCR_CS_PENDING; - pScr->clientArray[ client ].currentPendingReason[ eResource ] = *pPendReason = SCR_PR_OTHER_CLIENT_RUNNING; - return SCR_CRS_PEND; - } - - /* at this point, there is a lower priority client running, that should be aborted: */ - /* mark the requesting client as pending (until the abort process will be completed) */ - pScr->clientArray[ client ].state[ eResource ] = SCR_CS_PENDING; - - /* mark that we are in the middle of a request (if a re-entrance will occur in the complete) */ - pScr->statusNotficationPending = TI_TRUE; - - /* abort the running client */ - pScr->clientArray[ pScr->runningClient[ eResource ] ].state[ eResource ] = SCR_CS_ABORTING; - if ( NULL != pScr->clientArray[ pScr->runningClient[ eResource ] ].clientRequestCB ) - { - TRACE2( pScr->hReport, REPORT_SEVERITY_INFORMATION, "Sending abort request to client %d for resource %d\n", pScr->runningClient[ eResource ], eResource); - pScr->clientArray[ pScr->runningClient[ eResource ] ].clientRequestCB( pScr->clientArray[ pScr->runningClient[ eResource ] ].ClientRequestCBObj, - SCR_CRS_ABORT, eResource, - SCR_PR_NONE ); - } - else - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Trying to call client %d callback, which is NULL\n", pScr->runningClient[ eResource ]); - } - - /* mark that we have finished the request process */ - pScr->statusNotficationPending = TI_FALSE; - - /* return the current status (in case the completion changed the client status to run) */ - if ( SCR_CS_RUNNING == pScr->clientArray[ client ].state[ eResource ] ) - { - TRACE1( pScr->hReport, REPORT_SEVERITY_INFORMATION, "channel allocated to client: %d\n", client); - return SCR_CRS_RUN; - } - else - { - pScr->clientArray[ client ].currentPendingReason[ eResource ] = *pPendReason = SCR_PR_OTHER_CLIENT_ABORTING; - return SCR_CRS_PEND; - } -} - -/** - * \\n - * \date 01-Dec-2004\n - * \brief Notifies the SCR that the client doe not require the channel any longer - * - * This function can be called both by clients that are in possession of the channel, and by - * clients that are pending to use the channel.\n - * Function Scope \e Public.\n - * \param hScr - handle to the SCR object.\n - * \param client - the client releasing the channel.\n - * \param eResource - the resource being released.\n - * \return TI_OK if successful, TI_NOK otherwise.\n - */ -void scr_clientComplete( TI_HANDLE hScr, EScrClientId client, EScrResourceId eResource ) -{ - TScr *pScr = (TScr*)hScr; - EScrClientId highestPending; - - TRACE2( pScr->hReport, REPORT_SEVERITY_INFORMATION, "Client %d releasing resource %d.\n", client, eResource); - -#ifdef TI_DBG - if (client >= SCR_CID_NUM_OF_CLIENTS) - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Attempting to release SCR for invalid client %d\n", client); - return; - } - if (SCR_RESOURCE_NUM_OF_RESOURCES <= eResource) - { - TRACE2( pScr->hReport, REPORT_SEVERITY_ERROR, "Attempting to release invalid resource %d by client %d\n", eResource, client); - return; - } -#endif - - /* mark client state as idle */ - pScr->clientArray[ client ].state[ eResource ] = SCR_CS_IDLE; - pScr->clientArray[ client ].currentPendingReason[ eResource ] = SCR_PR_NONE; - - /* if completing client is running (or aborting) */ - if ( pScr->runningClient[ eResource ] == client ) - { - /* mark no running client */ - pScr->runningClient[ eResource ] = SCR_CID_NO_CLIENT; - - /* find the pending client with highest priority */ - highestPending = scrFindHighest( hScr, SCR_CS_PENDING, eResource, (SCR_CID_NUM_OF_CLIENTS-1), 0 ); - - /* if a pending client exists */ - if (( SCR_CID_NO_CLIENT != highestPending ) && (highestPending < SCR_CID_NUM_OF_CLIENTS)) - { - /* mark the client with highest priority as running */ - pScr->clientArray[ highestPending ].state[ eResource ] = SCR_CS_RUNNING; - pScr->clientArray[ highestPending ].currentPendingReason[ eResource ] = SCR_PR_NONE; - pScr->runningClient[ eResource ] = highestPending; - - /* if the SCR is not called from within a client request (re-entrance) */ - if ( TI_FALSE == pScr->statusNotficationPending ) - { - if ( NULL != pScr->clientArray[ highestPending ].clientRequestCB ) - { - pScr->clientArray[ highestPending ].clientRequestCB( pScr->clientArray[ highestPending ].ClientRequestCBObj, - SCR_CRS_RUN, eResource, SCR_PR_NONE ); - } - else - { - TRACE1( pScr->hReport, REPORT_SEVERITY_ERROR, "Trying to call client %d callback, which is NULL\n", highestPending); - } - } - } - } -} - -/** - * \\n - * \date 01-Dec-2004\n - * \brief Searches the client database for a client with matching state, from startFrom to endAt (inclusive). - * \brief Only searches for clients that are enabled at the current group!!!!\n - * - * Function Scope \e Private.\n - * \param hScr - handle to the SCR object.\n - * \param requiredState - the state to match.\n - * \param eResource - the resource to macth.\n - * \param startFrom - the highest priority to begin searching from.\n - * \param endAt - the lowest priority to include in the search - * \return the client ID if found, SCR_CID_NO_CLIENT if not found.\n - */ -EScrClientId scrFindHighest( TI_HANDLE hScr, - EScrClientState requiredState, - EScrResourceId eResource, - TI_UINT32 startFrom, - TI_UINT32 endAt ) -{ - TScr *pScr = (TScr*)hScr; - TI_INT32 i, iStartFrom, iEndAt; - - /* - * signed indexes are used to avoid an overflow in the for loop when endAt equals zero - * and the unsigned i is "reduced" to overflow to 4 Billion - */ - iStartFrom = (TI_INT32)startFrom; - iEndAt = (TI_INT32)endAt; - - /* loop on all clients, from start to end */ - for ( i = iStartFrom; i >= iEndAt; i-- ) - { - /* check if the client state matches the required state */ - if ( (TI_TRUE == clientStatus[ eResource ][ pScr->currentMode ][ pScr->currentGroup ][ i ]) && /* client is enabled in current group */ - (requiredState == pScr->clientArray[ i ].state[ eResource ])) /* client is in required state */ - { - /* and if so, return the client index */ - return (EScrClientId)i; - } - } - - return SCR_CID_NO_CLIENT; -} |