summaryrefslogtreecommitdiff
path: root/wilink_6_1/stad/src/AirLink_Managment/SwitchChannel.c
diff options
context:
space:
mode:
Diffstat (limited to 'wilink_6_1/stad/src/AirLink_Managment/SwitchChannel.c')
-rw-r--r--wilink_6_1/stad/src/AirLink_Managment/SwitchChannel.c1535
1 files changed, 1535 insertions, 0 deletions
diff --git a/wilink_6_1/stad/src/AirLink_Managment/SwitchChannel.c b/wilink_6_1/stad/src/AirLink_Managment/SwitchChannel.c
new file mode 100644
index 0000000..0e5739a
--- /dev/null
+++ b/wilink_6_1/stad/src/AirLink_Managment/SwitchChannel.c
@@ -0,0 +1,1535 @@
+/*
+ * SwitchChannel.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 SwitchChannel.c
+ * \brief SwitchChannel module interface
+ *
+ * \see SwitchChannelApi.h
+ */
+
+/****************************************************************************************************/
+/* */
+/* MODULE: SwitchChannel.c */
+/* PURPOSE: SwitchChannel module interface. */
+/* This module perform SwitchChannel (Dynamic Frequency Selection) */
+/* according to AP command. The object responsibles for switching channel after*/
+/* the requires time and quieting the channel for the required duration */
+/* time. */
+/****************************************************************************************************/
+
+#define __FILE_ID__ FILE_ID_7
+#include "tidef.h"
+#include "report.h"
+#include "osApi.h"
+#include "paramOut.h"
+#include "SwitchChannelApi.h"
+#include "DataCtrl_Api.h"
+#include "regulatoryDomainApi.h"
+#include "apConn.h"
+#include "siteMgrApi.h"
+#include "PowerMgr_API.h"
+#include "healthMonitor.h"
+#include "TWDriver.h"
+#include "DrvMainModules.h"
+
+/* allocation vector */
+#define SC_INIT_BIT (1)
+#define SC_SM_INIT_BIT (2)
+
+#define SC_SWITCH_CHANNEL_CMD_LEN 3
+#define SC_SWITCH_CHANNEL_MODE_NOT_TX_SUS 0
+#define SC_SWITCH_CHANNEL_MODE_TX_SUS 1
+
+
+#define SC_CHANNEL_INVALID TI_FALSE
+#define SC_CHANNEL_VALID TI_TRUE
+
+/* Enumerations */
+
+/** state machine states */
+typedef enum
+{
+ SC_STATE_IDLE = 0,
+ SC_STATE_WAIT_4_CMD = 1,
+ SC_STATE_WAIT_4_SCR = 2,
+ SC_STATE_SC_IN_PROG = 3,
+ SC_STATE_LAST = 4
+} switchChannel_smStates;
+
+/** State machine events */
+typedef enum
+{
+ SC_EVENT_START = 0,
+ SC_EVENT_STOP = 1,
+ SC_EVENT_SC_CMD = 2,
+ SC_EVENT_SCR_RUN = 3,
+ SC_EVENT_SCR_FAIL = 4,
+ SC_EVENT_SC_CMPLT = 5,
+ SC_EVENT_FW_RESET = 6,
+ SC_EVENT_LAST = 7
+} switchChannel_smEvents;
+
+
+#define SC_NUM_STATES SC_STATE_LAST
+#define SC_NUM_EVENTS SC_EVENT_LAST
+
+
+/* Structures */
+typedef struct
+{
+
+ /* SwitchChannel parameters that can be configured externally */
+ TI_BOOL dot11SpectrumManagementRequired;
+
+ /* Internal SwitchChannel parameters */
+ TI_UINT8 currentState;
+ dot11_CHANNEL_SWITCH_t curChannelSwitchCmdParams;
+ TI_UINT32 SCRRequestTimestamp;
+ TI_UINT8 currentChannel;
+ TI_BOOL switchChannelStarted;
+
+#ifdef TI_DBG
+ /* switchChannelCmd for debug */
+ dot11_CHANNEL_SWITCH_t debugChannelSwitchCmdParams;
+ TI_UINT8 ignoreCancelSwitchChannelCmd;
+#endif
+
+ /* SwitchChannel SM */
+ fsm_stateMachine_t *pSwitchChannelSm;
+
+ /* SwitchChannel handles to other objects */
+ TI_HANDLE hTWD;
+ TI_HANDLE hSiteMgr;
+ TI_HANDLE hSCR;
+ TI_HANDLE hRegulatoryDomain;
+ TI_HANDLE hPowerMngr;
+ TI_HANDLE hApConn;
+ TI_HANDLE hReport;
+ TI_HANDLE hOs;
+
+} switchChannel_t;
+
+
+
+
+/* External data definitions */
+
+/* Local functions definitions */
+
+/* Global variables */
+
+
+/********************************************************************************/
+/* Internal functions prototypes. */
+/********************************************************************************/
+
+
+/* SM functions */
+static TI_STATUS switchChannel_smStartSwitchChannelCmd(void *pData);
+static TI_STATUS switchChannel_smReqSCR_UpdateCmd(void *pData);
+static TI_STATUS switchChannel_smSwitchChannelCmplt(void *pData);
+static TI_STATUS switchChannel_smFwResetWhileSCInProg(void *pData);
+static TI_STATUS switchChannel_smScrFailWhileWait4Scr(void *pData);
+static TI_STATUS switchChannel_smNop(void *pData);
+static TI_STATUS switchChannel_smUnexpected(void *pData);
+static TI_STATUS switchChannel_smStopWhileWait4Cmd(void *pData);
+static TI_STATUS switchChannel_smStopWhileWait4Scr(void *pData);
+static TI_STATUS switchChannel_smStopWhileSwitchChannelInProg(void *pData);
+static TI_STATUS switchChannel_smStart(void *pData);
+
+
+/* other functions */
+static void release_module(switchChannel_t *pSwitchChannel, TI_UINT32 initVec);
+static TI_STATUS switchChannel_smEvent(TI_UINT8 *currState, TI_UINT8 event, void* data);
+static void switchChannel_zeroDatabase(switchChannel_t *pSwitchChannel);
+void switchChannel_SwitchChannelCmdCompleteReturn(TI_HANDLE hSwitchChannel);
+void switchChannel_scrStatusCB(TI_HANDLE hSwitchChannel, EScrClientRequestStatus requestStatus,
+ EScrResourceId eResource, EScePendReason pendReason );
+#ifdef TI_DBG
+static void switchChannel_recvCmd4Debug(TI_HANDLE hSwitchChannel, dot11_CHANNEL_SWITCH_t *channelSwitch, TI_BOOL BeaconPacket, TI_UINT8 channel);
+#endif
+
+
+/********************************************************************************/
+/* Interface functions Implementation. */
+/********************************************************************************/
+
+
+/************************************************************************
+ * switchChannel_create *
+ ************************************************************************/
+/**
+*
+* \b Description:
+*
+* This procedure is called by the config manager when the driver is created.
+* It creates the SwitchChannel object.
+*
+* \b ARGS:
+*
+* I - hOs - OS context \n
+*
+* \b RETURNS:
+*
+* Handle to the SwitchChannel object.
+*
+* \sa
+*/
+TI_HANDLE switchChannel_create(TI_HANDLE hOs)
+{
+ switchChannel_t *pSwitchChannel = NULL;
+ TI_UINT32 initVec = 0;
+ TI_STATUS status;
+
+ /* allocating the SwitchChannel object */
+ pSwitchChannel = os_memoryAlloc(hOs,sizeof(switchChannel_t));
+
+ if (pSwitchChannel == NULL)
+ return NULL;
+
+ initVec |= (1 << SC_INIT_BIT);
+
+ os_memoryZero(hOs, pSwitchChannel, sizeof(switchChannel_t));
+
+ pSwitchChannel->hOs = hOs;
+
+ status = fsm_Create(hOs, &pSwitchChannel->pSwitchChannelSm, SC_NUM_STATES, SC_NUM_EVENTS);
+ if (status != TI_OK)
+ {
+ release_module(pSwitchChannel, initVec);
+ WLAN_OS_REPORT(("FATAL ERROR: switchChannel_create(): Error Creating pSwitchChannelSm - Aborting\n"));
+ return NULL;
+ }
+ initVec |= (1 << SC_SM_INIT_BIT);
+
+ return(pSwitchChannel);
+}
+
+/************************************************************************
+ * switchChannel_init *
+ ************************************************************************/
+/**
+*
+* \b Description:
+*
+* This procedure is called by the DrvMain when the driver is initialized.
+* It initializes the SwitchChannel object's variables and handlers and creates the SwitchChannel SM.
+*
+* \b ARGS:
+*
+* I - pStadHandles - The driver modules handles \n
+*
+* \b RETURNS:
+*
+* void
+*
+* \sa
+*/
+void switchChannel_init (TStadHandlesList *pStadHandles)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t *)(pStadHandles->hSwitchChannel);
+
+ /** Roaming State Machine matrix */
+ fsm_actionCell_t switchChannel_SM[SC_NUM_STATES][SC_NUM_EVENTS] =
+ {
+ /* next state and actions for IDLE state */
+ { {SC_STATE_WAIT_4_CMD, switchChannel_smStart}, /* START */
+ {SC_STATE_IDLE, switchChannel_smNop}, /* STOP */
+ {SC_STATE_IDLE, switchChannel_smNop}, /* SC_CMD */
+ {SC_STATE_IDLE, switchChannel_smUnexpected}, /* SCR_RUN */
+ {SC_STATE_IDLE, switchChannel_smUnexpected}, /* SCR_FAIL */
+ {SC_STATE_IDLE, switchChannel_smUnexpected}, /* SC_CMPLT */
+ {SC_STATE_IDLE, switchChannel_smUnexpected} /* FW_RESET */
+ },
+
+ /* next state and actions for WAIT_4_CMD state */
+ { {SC_STATE_WAIT_4_CMD, switchChannel_smNop}, /* START */
+ {SC_STATE_IDLE, switchChannel_smStopWhileWait4Cmd}, /* STOP */
+ {SC_STATE_WAIT_4_SCR, switchChannel_smReqSCR_UpdateCmd}, /* SC_CMD */
+ {SC_STATE_WAIT_4_CMD, switchChannel_smUnexpected}, /* SCR_RUN */
+ {SC_STATE_WAIT_4_CMD, switchChannel_smUnexpected}, /* SCR_FAIL */
+ {SC_STATE_WAIT_4_CMD, switchChannel_smUnexpected}, /* SC_CMPLT */
+ {SC_STATE_WAIT_4_CMD, switchChannel_smUnexpected} /* FW_RESET */
+
+ },
+
+ /* next state and actions for WAIT_4_SCR state */
+ { {SC_STATE_WAIT_4_SCR, switchChannel_smUnexpected}, /* START */
+ {SC_STATE_IDLE, switchChannel_smStopWhileWait4Scr}, /* STOP */
+ {SC_STATE_WAIT_4_SCR, switchChannel_smNop}, /* SC_CMD */
+ {SC_STATE_SC_IN_PROG, switchChannel_smStartSwitchChannelCmd}, /* SCR_RUN */
+ {SC_STATE_WAIT_4_CMD, switchChannel_smScrFailWhileWait4Scr}, /* SCR_FAIL */
+ {SC_STATE_WAIT_4_SCR, switchChannel_smUnexpected} , /* SC_CMPLT */
+ {SC_STATE_WAIT_4_CMD, switchChannel_smUnexpected} /* FW_RESET */
+
+ },
+
+ /* next state and actions for switchChannel_IN_PROG state */
+ { {SC_STATE_SC_IN_PROG, switchChannel_smUnexpected}, /* START */
+ {SC_STATE_IDLE, switchChannel_smStopWhileSwitchChannelInProg}, /* STOP */
+ {SC_STATE_SC_IN_PROG, switchChannel_smNop}, /* SC_CMD */
+ {SC_STATE_SC_IN_PROG, switchChannel_smUnexpected}, /* SCR_RUN */
+ {SC_STATE_WAIT_4_CMD, switchChannel_smUnexpected}, /* SCR_FAIL */
+ {SC_STATE_WAIT_4_CMD, switchChannel_smSwitchChannelCmplt}, /* SC_CMPLT */
+ {SC_STATE_WAIT_4_CMD, switchChannel_smFwResetWhileSCInProg} /* FW_RESET */
+ }
+ };
+
+ fsm_Config(pSwitchChannel->pSwitchChannelSm,
+ &switchChannel_SM[0][0],
+ SC_NUM_STATES,
+ SC_NUM_EVENTS,
+ switchChannel_smEvent, pSwitchChannel->hOs);
+
+ /* init handlers */
+ pSwitchChannel->hTWD = pStadHandles->hTWD;
+ pSwitchChannel->hSiteMgr = pStadHandles->hSiteMgr;
+ pSwitchChannel->hSCR = pStadHandles->hSCR;
+ pSwitchChannel->hRegulatoryDomain = pStadHandles->hRegulatoryDomain;
+ pSwitchChannel->hApConn = pStadHandles->hAPConnection;
+ pSwitchChannel->hReport = pStadHandles->hReport;
+ pSwitchChannel->hOs = pStadHandles->hOs;
+}
+
+
+TI_STATUS switchChannel_SetDefaults (TI_HANDLE hSwitchChannel, SwitchChannelInitParams_t *SwitchChannelInitParams)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t *)hSwitchChannel;
+
+ /* init variables */
+ pSwitchChannel->dot11SpectrumManagementRequired = SwitchChannelInitParams->dot11SpectrumManagementRequired;
+ pSwitchChannel->currentState = SC_STATE_IDLE;
+ pSwitchChannel->currentChannel = 0;
+ pSwitchChannel->switchChannelStarted = TI_FALSE;
+
+ /* register to SCR */
+ scr_registerClientCB(pSwitchChannel->hSCR, SCR_CID_SWITCH_CHANNEL,
+ switchChannel_scrStatusCB, pSwitchChannel);
+
+ /* register to Switch Channel Complete event in HAL */
+ TWD_RegisterEvent (pSwitchChannel->hTWD,
+ TWD_OWN_EVENT_SWITCH_CHANNEL_CMPLT,
+ (void *)switchChannel_SwitchChannelCmdCompleteReturn,
+ pSwitchChannel);
+
+ TWD_EnableEvent (pSwitchChannel->hTWD, TWD_OWN_EVENT_SWITCH_CHANNEL_CMPLT);
+#ifdef TI_DBG
+ /* for debug */
+ pSwitchChannel->debugChannelSwitchCmdParams.hdr[0] = CHANNEL_SWITCH_ANNOUNCEMENT_IE_ID;
+ pSwitchChannel->debugChannelSwitchCmdParams.hdr[1] = SC_SWITCH_CHANNEL_CMD_LEN;
+ pSwitchChannel->ignoreCancelSwitchChannelCmd = 0;
+#endif
+ TRACE0(pSwitchChannel->hReport, REPORT_SEVERITY_INIT, ".....SwitchChannel configured successfully\n");
+
+ return TI_OK;
+}
+
+
+/************************************************************************
+ * switchChannel_stop *
+ ************************************************************************/
+/**
+*
+* \b Description:
+*
+* This procedure is called by the SME when the state is changed from CONNECTED.
+* It generates a STOP event to the SwitchChannel SM.
+*
+* \b ARGS:
+*
+* I - hSwitchChannel - SwitchChannel context \n
+*
+* \b RETURNS:
+*
+* TI_OK on success, TI_NOK otherwise
+*
+* \sa
+*/
+TI_STATUS switchChannel_stop(TI_HANDLE hSwitchChannel)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t *)hSwitchChannel;
+
+ pSwitchChannel->switchChannelStarted = TI_FALSE;
+ return (switchChannel_smEvent((TI_UINT8*)&pSwitchChannel->currentState, SC_EVENT_STOP, pSwitchChannel));
+
+}
+
+/************************************************************************
+ * switchChannel_start *
+ ************************************************************************/
+/**
+*
+* \b Description:
+*
+* This procedure is called by the SME when the state is changed to CONNECTED.
+* It generates a START event to the SwitchChannel SM.
+*
+* \b ARGS:
+*
+* I - hSwitchChannel - SwitchChannel context \n
+*
+* \b RETURNS:
+*
+* TI_OK on success, TI_NOK otherwise
+*
+* \sa
+*/
+TI_STATUS switchChannel_start(TI_HANDLE hSwitchChannel)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t *)hSwitchChannel;
+ pSwitchChannel->switchChannelStarted = TI_TRUE;
+
+ return (switchChannel_smEvent((TI_UINT8*)&pSwitchChannel->currentState, SC_EVENT_START, pSwitchChannel));
+
+}
+
+
+/************************************************************************
+ * switchChannel_unload *
+ ************************************************************************/
+/**
+*
+* \b Description:
+*
+* This procedure is called by the config manager when the driver is unloaded.
+* It frees any memory allocated and timers.
+*
+* \b ARGS:
+*
+* I - hSwitchChannel - SwitchChannel context \n
+*
+* \b RETURNS:
+*
+* TI_OK on success, TI_NOK otherwise
+*
+* \sa
+*/
+TI_STATUS switchChannel_unload(TI_HANDLE hSwitchChannel)
+{
+ TI_UINT32 initVec;
+ switchChannel_t *pSwitchChannel = (switchChannel_t *)hSwitchChannel;
+
+ if (pSwitchChannel == NULL)
+ return TI_OK;
+
+ initVec = 0xff;
+ release_module(pSwitchChannel, initVec);
+
+ return TI_OK;
+}
+
+
+/************************************************************************
+ * switchChannel_recvCmd *
+ ************************************************************************/
+/*DESCRIPTION: This function is called by MLME Parser upon receiving of
+ Beacon, Probe Response or Action with Switch Channel command,
+ or beacon/
+ performs the following:
+ - Initializes the switching channel procedure.
+ - Setting timer to the actual switching time(if needed)
+
+INPUT: hSwitchChannel - SwitchChannel handle.
+ switchMode - indicates whether to stop transmission
+ until the scheduled channel switch.
+ newChannelNum - indicates the number of the new channel.
+ durationTime - indicates the time (expressed in ms) until
+ the scheduled channel switch should accure.
+
+OUTPUT: None
+
+RETURN: TI_OK on success, TI_NOK otherwise
+
+************************************************************************/
+
+void switchChannel_recvCmd(TI_HANDLE hSwitchChannel, dot11_CHANNEL_SWITCH_t *channelSwitch, TI_UINT8 channel)
+{
+
+ switchChannel_t *pSwitchChannel = (switchChannel_t *)hSwitchChannel;
+ paramInfo_t param;
+
+ if (pSwitchChannel==NULL)
+ {
+ return;
+ }
+
+ param.paramType = REGULATORY_DOMAIN_DFS_CHANNELS_RANGE;
+ regulatoryDomain_getParam(pSwitchChannel->hRegulatoryDomain, &param);
+
+ if (!pSwitchChannel->dot11SpectrumManagementRequired ||
+ (channel < param.content.DFS_ChannelRange.minDFS_channelNum) ||
+ (channel > param.content.DFS_ChannelRange.maxDFS_channelNum))
+ { /* Do not parse Switch Channel IE, when SpectrumManagement is disabled,
+ or the channel is non-DFS channel */
+ return;
+ }
+#ifdef TI_DBG
+ /* for debug purposes only */
+ if (pSwitchChannel->ignoreCancelSwitchChannelCmd != 0)
+ {
+ return;
+ }
+#endif
+
+ if (channelSwitch == NULL)
+ { /* No SC IE, update regDomain */
+ param.paramType = REGULATORY_DOMAIN_UPDATE_CHANNEL_VALIDITY;
+ param.content.channel = channel;
+ regulatoryDomain_setParam(pSwitchChannel->hRegulatoryDomain, &param);
+ }
+ else
+ { /* SC IE exists */
+ TRACE3(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_recvFrame, SwitchChannel cmd was found, channel no=%d, mode=%d, TBTT=%d \n", channelSwitch->channelNumber, channelSwitch->channelSwitchMode, channelSwitch->channelSwitchCount);
+
+ /* Checking channel number validity */
+ param.content.channel = channelSwitch->channelNumber;
+ param.paramType = REGULATORY_DOMAIN_IS_CHANNEL_SUPPORTED;
+ regulatoryDomain_getParam(pSwitchChannel->hRegulatoryDomain,&param);
+ if ( ( !param.content.bIsChannelSupprted ) ||
+ (channelSwitch->channelSwitchCount == 0) ||
+ (channelSwitch->channelSwitchMode == SC_SWITCH_CHANNEL_MODE_TX_SUS))
+ { /* Trigger Roaming, if TX mode is disabled, the new channel number is invalid,
+ or the TBTT count is 0 */
+ TRACE0(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "report Roaming trigger\n");
+ if (channelSwitch->channelSwitchMode == SC_SWITCH_CHANNEL_MODE_TX_SUS)
+ {
+ param.paramType = REGULATORY_DOMAIN_SET_CHANNEL_VALIDITY;
+ param.content.channelValidity.channelNum = channel;
+ param.content.channelValidity.channelValidity = TI_FALSE;
+ regulatoryDomain_setParam(pSwitchChannel->hRegulatoryDomain, &param);
+ }
+ apConn_reportRoamingEvent(pSwitchChannel->hApConn, ROAMING_TRIGGER_SWITCH_CHANNEL, NULL);
+ }
+ else
+ { /* Invoke Switch Channel command */
+ /* update the new SCC params */
+ pSwitchChannel->curChannelSwitchCmdParams.channelNumber = channelSwitch->channelNumber;
+ pSwitchChannel->curChannelSwitchCmdParams.channelSwitchCount = channelSwitch->channelSwitchCount;
+ pSwitchChannel->curChannelSwitchCmdParams.channelSwitchMode = channelSwitch->channelSwitchMode;
+ switchChannel_smEvent((TI_UINT8*)&pSwitchChannel->currentState, SC_EVENT_SC_CMD, pSwitchChannel);
+ }
+
+ }
+
+}
+
+
+/************************************************************************
+ * switchChannel_powerSaveStatusReturn *
+ ************************************************************************/
+/**
+*
+* \b Description:
+*
+* This procedure is called when power save status is returned
+*
+* \b ARGS:
+*
+* I/O - hSwitchChannel - SwitchChannel context \n
+*
+* \b RETURNS:
+*
+* TI_OK on success, TI_NOK otherwise.
+*
+* \sa
+*/
+void switchChannel_SwitchChannelCmdCompleteReturn(TI_HANDLE hSwitchChannel)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)hSwitchChannel;
+
+ if (pSwitchChannel == NULL)
+ {
+ return;
+ }
+ TRACE0(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_SwitchChannelCmdCompleteReturn \n");
+
+ switchChannel_smEvent((TI_UINT8*)&pSwitchChannel->currentState, SC_EVENT_SC_CMPLT, pSwitchChannel);
+
+}
+
+/************************************************************************
+ * switchChannel_enableDisableSpectrumMngmt *
+ ************************************************************************/
+/**
+*
+* \b Description:
+*
+* This procedure enables or disables the spectrum management
+*
+* \b ARGS:
+*
+* I - hSwitchChannel - SwitchChannel context \n
+* I - enableDisable - TI_TRUE - Enable, TI_FALSE - Disable
+*
+* \b RETURNS:
+*
+* TI_OK on success, TI_NOK otherwise.
+*
+* \sa
+*/
+void switchChannel_enableDisableSpectrumMngmt(TI_HANDLE hSwitchChannel, TI_BOOL enableDisable)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)hSwitchChannel;
+
+
+ if (hSwitchChannel == NULL)
+ {
+ return;
+ }
+ TRACE1(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_enableDisableSpectrumMngmt, enableDisable=%d \n", enableDisable);
+
+ pSwitchChannel->dot11SpectrumManagementRequired = enableDisable;
+
+ if (enableDisable)
+ { /* Enable SC, if it was started invoke start event.
+ otherwise, wait for a start event */
+ if (pSwitchChannel->switchChannelStarted)
+ {
+ switchChannel_smEvent((TI_UINT8*)&pSwitchChannel->currentState, SC_EVENT_START, pSwitchChannel);
+ }
+ }
+ else
+ { /* Disable SC */
+ switchChannel_smEvent((TI_UINT8*)&pSwitchChannel->currentState, SC_EVENT_STOP, pSwitchChannel);
+ }
+
+}
+
+
+
+/************************************************************************
+ * SwitchChannel internal functions *
+ ************************************************************************/
+
+/************************************************************************
+ * switchChannel_smEvent *
+ ************************************************************************/
+/**
+*
+* \b Description:
+*
+* SwitchChannel state machine transition function
+*
+* \b ARGS:
+*
+* I/O - currentState - current state in the state machine\n
+* I - event - specific event for the state machine\n
+* I - pData - Data for state machine action function\n
+*
+* \b RETURNS:
+*
+* TI_OK on success, TI_NOK otherwise.
+*
+* \sa
+*/
+static TI_STATUS switchChannel_smEvent(TI_UINT8 *currState, TI_UINT8 event, void* data)
+{
+ TI_STATUS status;
+ TI_UINT8 nextState;
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)data;
+
+
+ status = fsm_GetNextState(pSwitchChannel->pSwitchChannelSm, *currState, event, &nextState);
+ if (status != TI_OK)
+ {
+ TRACE0(pSwitchChannel->hReport, REPORT_SEVERITY_ERROR, "switchChannel_smEvent, fsm_GetNextState error\n");
+ return(TI_NOK);
+ }
+
+ TRACE3(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_smEvent: <currentState = %d, event = %d> --> nextState = %d\n", *currState, event, nextState);
+
+ status = fsm_Event(pSwitchChannel->pSwitchChannelSm, currState, event, (void *)pSwitchChannel);
+
+ if (status != TI_OK)
+ {
+ TRACE0(pSwitchChannel->hReport, REPORT_SEVERITY_ERROR, "switchChannel_smEvent fsm_Event error\n");
+ TRACE3(pSwitchChannel->hReport, REPORT_SEVERITY_ERROR, "switchChannel_smEvent: <currentState = %d, event = %d> --> nextState = %d\n", *currState, event, nextState);
+ }
+ return status;
+
+}
+
+
+/************************************************************************
+ * switchChannel_smStart *
+ ************************************************************************/
+/**
+*
+*
+* \b Description:
+*
+* This function is called when the station becomes connected.
+ * update the current channel.
+*
+* \b ARGS:
+*
+* I - pData - pointer to the SwitchChannel SM context \n
+*
+* \b RETURNS:
+*
+* TI_OK if successful, TI_NOK otherwise.
+*
+*
+*************************************************************************/
+static TI_STATUS switchChannel_smStart(void *pData)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)pData;
+ paramInfo_t param;
+
+ if (pSwitchChannel == NULL)
+ {
+ return TI_NOK;
+ }
+
+ /* get the current channel number */
+ param.paramType = SITE_MGR_CURRENT_CHANNEL_PARAM;
+ siteMgr_getParam(pSwitchChannel->hSiteMgr, &param);
+ pSwitchChannel->currentChannel = param.content.siteMgrCurrentChannel;
+
+ TRACE1(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_smStart, channelNo=%d\n", pSwitchChannel->currentChannel);
+ return TI_OK;
+
+}
+
+/************************************************************************
+ * switchChannel_smReqSCR_UpdateCmd *
+ ************************************************************************/
+/**
+*
+*
+* \b Description:
+*
+* Update the Switch Channel command parameters.
+ * Request SCR and wait for SCR return.
+ * if tx status suspend
+ * update regulatory Domain
+ * update tx
+ * start periodic timer
+
+*
+* \b ARGS:
+*
+* I - pData - pointer to the SwitchChannel SM context \n
+*
+* \b RETURNS:
+*
+* TI_OK if successful, TI_NOK otherwise.
+*
+*
+*************************************************************************/
+static TI_STATUS switchChannel_smReqSCR_UpdateCmd(void *pData)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)pData;
+ EScrClientRequestStatus scrStatus;
+ EScePendReason scrPendReason;
+
+ if (pSwitchChannel == NULL)
+ {
+ return TI_NOK;
+ }
+ TRACE3(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_smReqSCR_UpdateCmd, channelNo=%d, TBTT = %d, Mode = %d\n", pSwitchChannel->curChannelSwitchCmdParams.channelNumber, pSwitchChannel->curChannelSwitchCmdParams.channelSwitchCount, pSwitchChannel->curChannelSwitchCmdParams.channelSwitchMode);
+
+
+ /* Save the TS when requesting SCR */
+ pSwitchChannel->SCRRequestTimestamp = os_timeStampMs(pSwitchChannel->hOs);
+
+ scrStatus = scr_clientRequest(pSwitchChannel->hSCR, SCR_CID_SWITCH_CHANNEL,
+ SCR_RESOURCE_SERVING_CHANNEL, &scrPendReason);
+ if ((scrStatus != SCR_CRS_RUN) && (scrStatus != SCR_CRS_PEND))
+ {
+ TRACE1(pSwitchChannel->hReport, REPORT_SEVERITY_ERROR, "switchChannel_smReqSCR_UpdateCmd():Abort the switch channel, request Roaming, scrStatus=%d\n", scrStatus);
+ return (switchChannel_smEvent((TI_UINT8*)&pSwitchChannel->currentState, SC_EVENT_SCR_FAIL, pSwitchChannel));
+
+ }
+ if (scrStatus == SCR_CRS_RUN)
+ {
+ switchChannel_scrStatusCB(pSwitchChannel, scrStatus, SCR_RESOURCE_SERVING_CHANNEL, scrPendReason);
+ }
+ else if ((scrPendReason==SCR_PR_OTHER_CLIENT_RUNNING) ||
+ (scrPendReason==SCR_PR_DIFFERENT_GROUP_RUNNING) )
+ { /* No use to wait for the SCR, invoke FAIL */
+ return (switchChannel_smEvent((TI_UINT8*)&pSwitchChannel->currentState, SC_EVENT_SCR_FAIL, pSwitchChannel));
+ }
+ /* wait for the SCR callback function to be called */
+ return TI_OK;
+
+}
+
+
+/************************************************************************
+ * switchChannel_scrStatusCB *
+ ************************************************************************/
+/**
+*
+*
+* \b Description:
+*
+* This function is called by the SCR when:
+ * the resource is reserved for the SwitchChannel - SCR_CRS_RUN
+ * recovery occurred - SCR_CRS_ABORT
+ * other = ERROR
+*
+* \b ARGS:
+*
+* I - hSwitchChannel - pointer to the SwitchChannel SM context \n
+* I - requestStatus - the SCR request status \n
+* I - eResource - the resource for which the CB is issued \n
+* I - pendReason - The SCR pend status in case of pend reply \n
+*
+* \b RETURNS:
+*
+* None.
+*
+*
+*************************************************************************/
+void switchChannel_scrStatusCB(TI_HANDLE hSwitchChannel, EScrClientRequestStatus requestStatus,
+ EScrResourceId eResource, EScePendReason pendReason )
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)hSwitchChannel;
+ switchChannel_smEvents scEvent;
+
+ if (pSwitchChannel == NULL)
+ {
+ return;
+ }
+
+ switch (requestStatus)
+ {
+ case SCR_CRS_RUN:
+ scEvent = SC_EVENT_SCR_RUN;
+ break;
+ case SCR_CRS_FW_RESET:
+ scEvent = SC_EVENT_FW_RESET;
+ break;
+ case SCR_CRS_PEND:
+ scEvent = SC_EVENT_SCR_FAIL;
+ break;
+ case SCR_CRS_ABORT:
+ default:
+ TRACE2(pSwitchChannel->hReport, REPORT_SEVERITY_ERROR, "switchChannel_scrStatusCB scrStatus = %d, pendReason=%d\n", requestStatus, pendReason);
+ scEvent = SC_EVENT_SCR_FAIL;
+ break;
+ }
+
+ switchChannel_smEvent((TI_UINT8*)&pSwitchChannel->currentState, scEvent, pSwitchChannel);
+
+}
+
+
+
+/************************************************************************
+ * switchChannel_smStartSwitchChannelCmd *
+ ************************************************************************/
+/**
+*
+*
+* \b Description:
+*
+* This function is called once SwitchChannel command was received and the SCR
+ * request returned with reason RUN.
+ * In this case perform the following:
+ * Set CMD to FW
+
+
+*
+* \b ARGS:
+*
+* I - pData - pointer to the SwitchChannel SM context \n
+*
+* \b RETURNS:
+*
+* TI_OK if successful, TI_NOK otherwise.
+*
+*
+*************************************************************************/
+static TI_STATUS switchChannel_smStartSwitchChannelCmd(void *pData)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t *)pData;
+ TSwitchChannelParams pSwitchChannelCmd;
+ TI_UINT32 switchChannelTimeDuration;
+ paramInfo_t param;
+
+ if (pSwitchChannel == NULL)
+ {
+ return TI_NOK;
+ }
+
+ param.paramType = SITE_MGR_BEACON_INTERVAL_PARAM;
+ siteMgr_getParam(pSwitchChannel->hSiteMgr, &param);
+
+ switchChannelTimeDuration = pSwitchChannel->curChannelSwitchCmdParams.channelSwitchCount * param.content.beaconInterval * 1024 / 1000;
+ if ( (switchChannelTimeDuration!=0) &&
+ ((os_timeStampMs(pSwitchChannel->hOs) - pSwitchChannel->SCRRequestTimestamp) >= switchChannelTimeDuration ))
+ { /* There's no time to perfrom the SCC, set the Count to 1 */
+ pSwitchChannel->curChannelSwitchCmdParams.channelSwitchCount = 1;
+ }
+
+ apConn_indicateSwitchChannelInProgress(pSwitchChannel->hApConn);
+
+ pSwitchChannelCmd.channelNumber = pSwitchChannel->curChannelSwitchCmdParams.channelNumber;
+ pSwitchChannelCmd.switchTime = pSwitchChannel->curChannelSwitchCmdParams.channelSwitchCount;
+ pSwitchChannelCmd.txFlag = pSwitchChannel->curChannelSwitchCmdParams.channelSwitchMode;
+ pSwitchChannelCmd.flush = 0;
+ TWD_CmdSwitchChannel (pSwitchChannel->hTWD, &pSwitchChannelCmd);
+
+ TRACE4(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "TWD_CmdSwitchChannel:Set the cmd in HAL. Params:\n channelNumber=%d, switchTime=%d, txFlag=%d, flush=%d \n", pSwitchChannelCmd.channelNumber, pSwitchChannelCmd.switchTime, pSwitchChannelCmd.txFlag, pSwitchChannelCmd.flush);
+
+ return TI_OK;
+
+}
+
+/************************************************************************
+ * switchChannel_smFwResetWhileSCInProg *
+ ************************************************************************/
+/**
+*
+*
+* \b Description:
+*
+* This function is called when Switch Channel command is cancelled.
+ * In this case update TX nad regulatory Domain adn HAL.
+ * Release the SCR and exit PS.
+*
+* \b ARGS:
+*
+* I - pData - pointer to the SwitchChannel SM context \n
+*
+* \b RETURNS:
+*
+* TI_OK if successful, TI_NOK otherwise.
+*
+*
+*************************************************************************/
+static TI_STATUS switchChannel_smFwResetWhileSCInProg(void *pData)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t *)pData;
+ paramInfo_t param;
+
+ if (pSwitchChannel == NULL)
+ {
+ return TI_NOK;
+ }
+ TRACE0(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_smFwResetWhileSCInProg \n");
+
+ /* Update new current channel */
+ param.paramType = SITE_MGR_CURRENT_CHANNEL_PARAM;
+ param.content.siteMgrCurrentChannel = pSwitchChannel->curChannelSwitchCmdParams.channelNumber;
+ siteMgr_setParam(pSwitchChannel->hSiteMgr, &param);
+
+ apConn_indicateSwitchChannelFinished(pSwitchChannel->hApConn);
+
+ switchChannel_zeroDatabase(pSwitchChannel);
+
+ /* release the SCR */
+ scr_clientComplete(pSwitchChannel->hSCR, SCR_CID_SWITCH_CHANNEL, SCR_RESOURCE_SERVING_CHANNEL);
+
+ return TI_OK;
+
+}
+
+
+/************************************************************************
+ * switchChannel_smSwitchChannelCmplt *
+ ************************************************************************/
+/**
+*
+*
+* \b Description:
+*
+* This function is called when SwitchChannel command completed in FW.
+ * In this case release SCR and update current channel.
+ * If TX was sus, it will be enabled only after first Beacon is recieved.
+ * Exit PS.
+*
+* \b ARGS:
+*
+* I - pData - pointer to the SwitchChannel SM context \n
+*
+* \b RETURNS:
+*
+* TI_OK if successful, TI_NOK otherwise.
+*
+*
+*************************************************************************/
+static TI_STATUS switchChannel_smSwitchChannelCmplt(void *pData)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t *)pData;
+ paramInfo_t param;
+
+ if (pSwitchChannel == NULL)
+ {
+ return TI_NOK;
+ }
+
+ /* Update new current channel */
+ param.paramType = SITE_MGR_CURRENT_CHANNEL_PARAM;
+ param.content.siteMgrCurrentChannel = pSwitchChannel->curChannelSwitchCmdParams.channelNumber;
+ siteMgr_setParam(pSwitchChannel->hSiteMgr, &param);
+
+ TRACE1(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_smSwitchChannelCmplt, new channelNum = %d\n", pSwitchChannel->currentChannel);
+
+ apConn_indicateSwitchChannelFinished(pSwitchChannel->hApConn);
+ switchChannel_zeroDatabase(pSwitchChannel);
+
+ /* release the SCR */
+ scr_clientComplete(pSwitchChannel->hSCR, SCR_CID_SWITCH_CHANNEL, SCR_RESOURCE_SERVING_CHANNEL);
+
+ return TI_OK;
+
+}
+
+
+
+/************************************************************************
+ * switchChannel_smScrFailWhileWait4Scr *
+ ************************************************************************/
+/**
+*
+*
+* \b Description:
+*
+* This function is called when recovery occurred, while waiting for SCR due
+ * to previous switch channel command.
+ * Exit PS
+ * Release SCR.
+*
+* \b ARGS:
+*
+* I - pData - pointer to the SwitchChannel SM context \n
+*
+* \b RETURNS:
+*
+* TI_OK if successful, TI_NOK otherwise.
+*
+*
+*************************************************************************/
+static TI_STATUS switchChannel_smScrFailWhileWait4Scr(void *pData)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)pData;
+
+ if (pSwitchChannel == NULL)
+ {
+ return TI_NOK;
+ }
+
+ TRACE0(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_smScrFailWhileWait4Scr\n");
+
+ switchChannel_zeroDatabase(pSwitchChannel);
+
+ /* release the SCR is not required !!! */
+ scr_clientComplete(pSwitchChannel->hSCR, SCR_CID_SWITCH_CHANNEL, SCR_RESOURCE_SERVING_CHANNEL);
+
+ return TI_OK;
+}
+
+/************************************************************************
+ * switchChannel_smStopWhileWait4Cmd *
+ ************************************************************************/
+/**
+*
+*
+* \b Description:
+*
+* This function is called when the station becomes Disconnected and the current
+* state is Wait4Cmd. In this case perfrom:
+ * Stop the timer
+ * Enable TX if it was disabled
+ * Zero the current command parameters
+ * Stop the timer
+*
+* \b ARGS:
+*
+* I - pData - pointer to the SwitchChannel SM context \n
+*
+* \b RETURNS:
+*
+* TI_OK if successful, TI_NOK otherwise.
+*
+*
+*************************************************************************/
+static TI_STATUS switchChannel_smStopWhileWait4Cmd(void *pData)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)pData;
+
+ if (pSwitchChannel == NULL)
+ {
+ return TI_NOK;
+ }
+
+ TRACE0(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_smStopWhileWait4Cmd\n");
+
+ switchChannel_zeroDatabase(pSwitchChannel);
+
+ return TI_OK;
+}
+
+/************************************************************************
+ * switchChannel_smStopWhileWait4Scr *
+ ************************************************************************/
+/**
+*
+*
+* \b Description:
+*
+* This function is called when the station becomes Disconnected and the current
+* state is Wait4Scr. In this case perfrom:
+ * Stop the timer
+ * Enable TX if it was disabled
+ * Zero the current command parameters
+ * Complete SCR
+*
+* \b ARGS:
+*
+* I - pData - pointer to the SwitchChannel SM context \n
+*
+* \b RETURNS:
+*
+* TI_OK if successful, TI_NOK otherwise.
+*
+*
+*************************************************************************/
+static TI_STATUS switchChannel_smStopWhileWait4Scr(void *pData)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)pData;
+
+ if (pSwitchChannel == NULL)
+ {
+ return TI_NOK;
+ }
+
+ TRACE0(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_smStopWhileWait4Scr\n");
+
+
+ switchChannel_zeroDatabase(pSwitchChannel);
+
+ /* release the SCR */
+ scr_clientComplete(pSwitchChannel->hSCR, SCR_CID_SWITCH_CHANNEL, SCR_RESOURCE_SERVING_CHANNEL);
+
+ return TI_OK;
+}
+
+/************************************************************************
+ * switchChannel_smStopWhileSwitchChannelInProg *
+ ************************************************************************/
+/**
+*
+*
+* \b Description:
+*
+* This function is called when the station becomes Disconnected and the current
+* state is SwitchChannelInProg. In this case perfrom:
+ * Stop the timer
+ * Enable TX if it was disabled
+ * Zero the current command parameters
+ * resume self test
+ * Complete SCR
+ * Exit PS
+*
+* \b ARGS:
+*
+* I - pData - pointer to the SwitchChannel SM context \n
+*
+* \b RETURNS:
+*
+* TI_OK if successful, TI_NOK otherwise.
+*
+*
+*************************************************************************/
+static TI_STATUS switchChannel_smStopWhileSwitchChannelInProg(void *pData)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)pData;
+
+ if (pSwitchChannel == NULL)
+ {
+ return TI_NOK;
+ }
+
+ TRACE0(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_smStopWhileSwitchChannelInProg\n");
+
+ /* Exit PS */
+ /*PowerMgr_exitFromDriverMode(pSwitchChannel->hPowerMngr, "SwitchChannel");*/
+
+ apConn_indicateSwitchChannelFinished(pSwitchChannel->hApConn);
+
+ TWD_CmdSwitchChannelCancel (pSwitchChannel->hTWD, pSwitchChannel->currentChannel);
+ switchChannel_zeroDatabase(pSwitchChannel);
+
+ /* release the SCR */
+ scr_clientComplete(pSwitchChannel->hSCR, SCR_CID_SWITCH_CHANNEL, SCR_RESOURCE_SERVING_CHANNEL);
+
+ return TI_OK;
+}
+
+
+
+
+/************************************************************************
+ * switchChannel_zeroDatabase *
+ ************************************************************************/
+/**
+*
+*
+* \b Description:
+*
+* This function is called when the SwitchChannel internal database should be zero.
+ * The following parameters are zerod:
+ * SwitchChannelChannelRange - the timestamps and validity state of channels
+ * curChannelSwitchCmdParams - the current switch channel command parameters
+*
+* \b ARGS:
+*
+* I - pSwitchChannel - pointer to the SwitchChannel SM context \n
+* I - channelNum - channel number \n
+* I - timestamp - required timestamp \n
+*
+* \b RETURNS:
+*
+* None.
+*
+*
+*************************************************************************/
+static void switchChannel_zeroDatabase(switchChannel_t *pSwitchChannel)
+{
+
+ TRACE0(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_zeroDatabase\n");
+
+
+ pSwitchChannel->curChannelSwitchCmdParams.channelNumber = 0;
+ pSwitchChannel->curChannelSwitchCmdParams.channelSwitchCount = 0;
+ pSwitchChannel->curChannelSwitchCmdParams.channelSwitchMode = SC_SWITCH_CHANNEL_MODE_NOT_TX_SUS;
+ pSwitchChannel->currentChannel = 0;
+
+}
+
+/***********************************************************************
+ * release_module
+ ***********************************************************************/
+/*
+DESCRIPTION: Called by the destroy function or by the create function (on failure)
+ Go over the vector, for each bit that is set, release the corresponding module.
+
+INPUT: pSwitchChannel - SwitchChannel pointer.
+ initVec - Vector that contains a bit set for each module thah had been initiualized
+
+OUTPUT:
+
+RETURN: TI_OK on success, TI_NOK otherwise
+
+************************************************************************/
+static void release_module(switchChannel_t *pSwitchChannel, TI_UINT32 initVec)
+{
+ if (pSwitchChannel == NULL)
+ {
+ return;
+ }
+ if (initVec & (1 << SC_SM_INIT_BIT))
+ {
+ fsm_Unload(pSwitchChannel->hOs, pSwitchChannel->pSwitchChannelSm);
+ }
+
+ if (initVec & (1 << SC_INIT_BIT))
+ {
+ os_memoryFree(pSwitchChannel->hOs, pSwitchChannel, sizeof(switchChannel_t));
+ }
+
+ initVec = 0;
+}
+
+
+/**
+*
+* switchChannel_smNop - Do nothing
+*
+* \b Description:
+*
+* Do nothing in the SM.
+*
+* \b ARGS:
+*
+* I - pData - pointer to the SwitchChannel SM context \n
+*
+* \b RETURNS:
+*
+* TI_OK if successful, TI_NOK otherwise.
+*
+*
+*/
+static TI_STATUS switchChannel_smNop(void *pData)
+{
+ switchChannel_t *pSwitchChannel;
+
+ pSwitchChannel = (switchChannel_t*)pData;
+ if (pSwitchChannel == NULL)
+ {
+ return TI_NOK;
+ }
+ TRACE0(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, " switchChannel_smNop\n");
+
+ return TI_OK;
+}
+
+/**
+*
+* switchChannel_smUnexpected - Unexpected event
+*
+* \b Description:
+*
+* Unexpected event in the SM.
+*
+* \b ARGS:
+*
+* I - pData - pointer to the SwitchChannel SM context \n
+*
+* \b RETURNS:
+*
+* TI_OK if successful, TI_NOK otherwise.
+*
+*
+*/
+static TI_STATUS switchChannel_smUnexpected(void *pData)
+{
+ switchChannel_t *pSwitchChannel;
+
+ pSwitchChannel = (switchChannel_t*)pData;
+ if (pSwitchChannel == NULL)
+ {
+ return TI_NOK;
+ }
+ TRACE1(pSwitchChannel->hReport, REPORT_SEVERITY_ERROR, " switchChannel_smUnexpected, state = %d\n", pSwitchChannel->currentState);
+
+ return TI_NOK;
+}
+
+/*******************************************************************************
+*********** Debug functions ***********
+*******************************************************************************/
+#ifdef TI_DBG
+
+/************************************************************************
+ * switchChannel_recvCmd *
+ ************************************************************************/
+/*DESCRIPTION: This function is called by MLME Parser upon receiving of
+ Beacon, Probe Response or Action with Switch Channel command,
+ or beacon/
+ performs the following:
+ - Initializes the switching channel procedure.
+ - Setting timer to the actual switching time(if needed)
+
+INPUT: hSwitchChannel - SwitchChannel handle.
+ switchMode - indicates whether to stop transmission
+ until the scheduled channel switch.
+ newChannelNum - indicates the number of the new channel.
+ durationTime - indicates the time (expressed in ms) until
+ the scheduled channel switch should accure.
+
+OUTPUT: None
+
+RETURN: TI_OK on success, TI_NOK otherwise
+
+************************************************************************/
+
+static void switchChannel_recvCmd4Debug(TI_HANDLE hSwitchChannel, dot11_CHANNEL_SWITCH_t *channelSwitch, TI_BOOL BeaconPacket, TI_UINT8 channel)
+{
+
+ switchChannel_t *pSwitchChannel = (switchChannel_t *)hSwitchChannel;
+ paramInfo_t param;
+
+ if (pSwitchChannel==NULL)
+ {
+ return;
+ }
+
+
+ /* The following is for debug purposes only
+ It will be operated when the Switch Channel cmd is opertated from debug CLI */
+ if (pSwitchChannel->ignoreCancelSwitchChannelCmd != 0)
+ {
+ if (pSwitchChannel->ignoreCancelSwitchChannelCmd == 1)
+ {
+ /* update the new SCC params */
+ pSwitchChannel->curChannelSwitchCmdParams.channelNumber = channelSwitch->channelNumber;
+ pSwitchChannel->curChannelSwitchCmdParams.channelSwitchCount = channelSwitch->channelSwitchCount;
+ pSwitchChannel->curChannelSwitchCmdParams.channelSwitchMode = channelSwitch->channelSwitchMode;
+
+ pSwitchChannel->ignoreCancelSwitchChannelCmd = 2;
+ }
+ else if (channelSwitch->channelSwitchCount>0)
+ {
+ channelSwitch->channelSwitchCount --;
+ }
+ else
+ {
+ pSwitchChannel->ignoreCancelSwitchChannelCmd = 0;
+ }
+
+
+ /* search in the buffer pointer to the beginning of the
+ Switch Cahnnel Announcement IE according to the IE ID */
+
+ /* SC IE exists on the serving channel */
+ TRACE3(pSwitchChannel->hReport, REPORT_SEVERITY_INFORMATION, "switchChannel_recvFrame, SwitchChannel cmd was found, channel no=%d, mode=%d, TBTT=%d \n", channelSwitch->channelNumber, channelSwitch->channelSwitchMode, channelSwitch->channelSwitchCount);
+
+ /* Checking channel number validity */
+ param.content.channel = channelSwitch->channelNumber;
+ param.paramType = REGULATORY_DOMAIN_IS_CHANNEL_SUPPORTED;
+ regulatoryDomain_getParam(pSwitchChannel->hRegulatoryDomain,&param);
+ if (( !param.content.bIsChannelSupprted ) ||
+ (channelSwitch->channelSwitchCount == 0) ||
+ (channelSwitch->channelSwitchMode == SC_SWITCH_CHANNEL_MODE_TX_SUS))
+ { /* Trigger Roaming, if TX mode is disabled, the new channel number is invalid,
+ or the TBTT count is 0 */
+ apConn_reportRoamingEvent(pSwitchChannel->hApConn, ROAMING_TRIGGER_SWITCH_CHANNEL, NULL);
+ }
+ else
+ { /* Invoke Switch Channel command */
+ /* update the new SCC params */
+ pSwitchChannel->curChannelSwitchCmdParams.channelNumber = channelSwitch->channelNumber;
+ pSwitchChannel->curChannelSwitchCmdParams.channelSwitchCount = channelSwitch->channelSwitchCount;
+ pSwitchChannel->curChannelSwitchCmdParams.channelSwitchMode = channelSwitch->channelSwitchMode;
+ switchChannel_smEvent((TI_UINT8*)&pSwitchChannel->currentState, SC_EVENT_SC_CMD, pSwitchChannel);
+ }
+ }
+
+}
+
+void switchChannelDebug_setCmdParams(TI_HANDLE hSwitchChannel, SC_switchChannelCmdParam_e switchChannelCmdParam, TI_UINT8 param)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)hSwitchChannel;
+
+ if (pSwitchChannel == NULL)
+ {
+ return;
+ }
+
+ switch (switchChannelCmdParam)
+ {
+ case SC_SWITCH_CHANNEL_NUM:
+ WLAN_OS_REPORT(("SwitchChannelDebug_setSwitchChannelCmdParams, channelNum=%d \n ", param));
+ pSwitchChannel->debugChannelSwitchCmdParams.channelNumber = param;
+ break;
+ case SC_SWITCH_CHANNEL_TBTT:
+ WLAN_OS_REPORT(("SwitchChannelDebug_setSwitchChannelCmdParams, channelSwitchCount=%d \n ", param));
+ pSwitchChannel->debugChannelSwitchCmdParams.channelSwitchCount = param;
+ break;
+ case SC_SWITCH_CHANNEL_MODE:
+ WLAN_OS_REPORT(("SwitchChannelDebug_setSwitchChannelCmdParams, channelSwitchMode=%d \n ", param));
+ pSwitchChannel->debugChannelSwitchCmdParams.channelSwitchMode = param;
+ break;
+ default:
+ WLAN_OS_REPORT(("ERROR: SwitchChannelDebug_setSwitchChannelCmdParams, wrong switchChannelCmdParam=%d \n ",
+ switchChannelCmdParam));
+ break;
+ }
+
+}
+void switchChannelDebug_SwitchChannelCmdTest(TI_HANDLE hSwitchChannel, TI_BOOL BeaconPacket)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)hSwitchChannel;
+
+ if (pSwitchChannel == NULL)
+ {
+ return;
+ }
+
+ WLAN_OS_REPORT(("SwitchChannelDebug_SwitchChannelCmdTest, BeaconPacket=%d \n cmd params: channelNumber=%d, channelSwitchCount=%d, channelSwitchMode=%d \n",
+ BeaconPacket,
+ pSwitchChannel->debugChannelSwitchCmdParams.channelNumber,
+ pSwitchChannel->debugChannelSwitchCmdParams.channelSwitchCount,
+ pSwitchChannel->debugChannelSwitchCmdParams.channelSwitchMode));
+
+
+ pSwitchChannel->ignoreCancelSwitchChannelCmd= 1;
+ switchChannel_recvCmd4Debug(hSwitchChannel, &pSwitchChannel->debugChannelSwitchCmdParams, BeaconPacket, pSwitchChannel->currentChannel);
+}
+
+void switchChannelDebug_CancelSwitchChannelCmdTest(TI_HANDLE hSwitchChannel, TI_BOOL BeaconPacket)
+{
+
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)hSwitchChannel;
+
+ if (pSwitchChannel == NULL)
+ {
+ return;
+ }
+
+ WLAN_OS_REPORT(("SwitchChannelDebug_SwitchChannelCmdTest, BeaconPacket=%d \n",BeaconPacket));
+
+ pSwitchChannel->ignoreCancelSwitchChannelCmd= 0;
+ switchChannel_recvCmd4Debug(hSwitchChannel, NULL, BeaconPacket, pSwitchChannel->currentChannel);
+}
+
+
+void switchChannelDebug_printStatus(TI_HANDLE hSwitchChannel)
+{
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)hSwitchChannel;
+
+ if (pSwitchChannel == NULL)
+ {
+ return;
+ }
+
+ WLAN_OS_REPORT(("SwitchChannel debug params are: channelNumber=%d, channelSwitchCount=%d , channelSwitchMode=%d \n",
+ pSwitchChannel->debugChannelSwitchCmdParams.channelNumber,
+ pSwitchChannel->debugChannelSwitchCmdParams.channelSwitchCount,
+ pSwitchChannel->debugChannelSwitchCmdParams.channelSwitchMode));
+
+ WLAN_OS_REPORT(("SwitchChannel state=%d, currentChannel=%d \n", pSwitchChannel->currentState, pSwitchChannel->currentChannel));
+
+
+}
+
+void switchChannelDebug_setChannelValidity(TI_HANDLE hSwitchChannel, TI_UINT8 channelNum, TI_BOOL validity)
+{
+ paramInfo_t param;
+
+ switchChannel_t *pSwitchChannel = (switchChannel_t*)hSwitchChannel;
+
+ if (pSwitchChannel == NULL)
+ {
+ return;
+ }
+
+ param.paramType = REGULATORY_DOMAIN_SET_CHANNEL_VALIDITY;
+ param.content.channelValidity.channelNum = channelNum;
+ param.content.channelValidity.channelValidity = validity;
+ regulatoryDomain_setParam(pSwitchChannel->hRegulatoryDomain, &param);
+
+}
+
+#endif /* TI_DBG */
+
+
+
+
+
+