Home | History | Annotate | Download | only in smeSm
      1 /****************************************************************************
      2 **+-----------------------------------------------------------------------+**
      3 **|                                                                       |**
      4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
      5 **| All rights reserved.                                                  |**
      6 **|                                                                       |**
      7 **| Redistribution and use in source and binary forms, with or without    |**
      8 **| modification, are permitted provided that the following conditions    |**
      9 **| are met:                                                              |**
     10 **|                                                                       |**
     11 **|  * Redistributions of source code must retain the above copyright     |**
     12 **|    notice, this list of conditions and the following disclaimer.      |**
     13 **|  * Redistributions in binary form must reproduce the above copyright  |**
     14 **|    notice, this list of conditions and the following disclaimer in    |**
     15 **|    the documentation and/or other materials provided with the         |**
     16 **|    distribution.                                                      |**
     17 **|  * Neither the name Texas Instruments nor the names of its            |**
     18 **|    contributors may be used to endorse or promote products derived    |**
     19 **|    from this software without specific prior written permission.      |**
     20 **|                                                                       |**
     21 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
     22 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
     23 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
     24 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
     25 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
     26 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
     27 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
     28 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
     29 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
     30 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
     31 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
     32 **|                                                                       |**
     33 **+-----------------------------------------------------------------------+**
     34 ****************************************************************************/
     35 
     36 /** \file smeSmApi.c
     37  *  \brief SME SM API implementation
     38  *
     39  *  The state machine itself is implemented in the file	smeSm.c.
     40  *
     41  *  \see smeSmApi.h
     42  */
     43 
     44 #include "report.h"
     45 #include "osTIType.h"
     46 #include "osApi.h"
     47 #include "smeSm.h"
     48 #include "smeApi.h"
     49 #include "smeSmApi.h"
     50 #include "utils.h"
     51 #include "802_11Defs.h"
     52 #include "regulatoryDomainApi.h"
     53 #include "siteMgrApi.h"
     54 #include "connApi.h"
     55 #include "EvHandler.h"
     56 #include "TI_IPC_Api.h"
     57 
     58 
     59 #define WLAN_INTER_SCAN_DELTA 10
     60 
     61 /* State machine definitions */
     62 #define SME_INIT_BIT			1
     63 #define SM_INIT_BIT				2
     64 #define TIMER_INIT_BIT			3
     65 
     66 /* Local functions prototypes */
     67 
     68 static void release_module(smeSm_t *pSmeSm, UINT32 initVec);
     69 
     70 void smeSm_InterScanTimeoutCB(TI_HANDLE     hSmeSm);
     71 
     72 
     73 /* Interface functions Implementation */
     74 
     75 /************************************************************************
     76  *                        smeSm_create								*
     77  ************************************************************************
     78 DESCRIPTION: SME SM module creation function, called by the config mgr in creation phase
     79 				performs the following:
     80 				-	Allocate the SME SM handle
     81 				-	Create the SME state machine
     82 
     83 INPUT:      hOs -			Handle to OS
     84 
     85 
     86 OUTPUT:
     87 
     88 RETURN:     Handle to the SME SM module on success, NULL otherwise
     89 
     90 ************************************************************************/
     91 TI_HANDLE smeSm_create(TI_HANDLE hOs)
     92 {
     93 	smeSm_t			*pSmeSm;
     94 	UINT32			initVec;
     95 
     96 	initVec = 0;
     97 
     98 	pSmeSm = os_memoryAlloc(hOs, sizeof(smeSm_t));
     99 	if (pSmeSm == NULL)
    100 		return NULL;
    101 	os_memoryZero(hOs, pSmeSm, sizeof(smeSm_t)); /* Dm: Fix */
    102 
    103 	initVec |= (1 << SME_INIT_BIT);
    104 
    105 	pSmeSm->pFsm = smeSm_smCreate(hOs);
    106 	if (pSmeSm->pFsm == NULL)
    107 	{
    108 		release_module(pSmeSm, initVec);
    109 		return NULL;
    110 	}
    111 
    112 	initVec |= (1 << SM_INIT_BIT);
    113 
    114 	pSmeSm->hOs	= hOs;
    115 
    116 	pSmeSm->interScanTimeoutTimer = os_timerCreate(hOs, smeSm_InterScanTimeoutCB, pSmeSm);
    117 	if(pSmeSm->interScanTimeoutTimer == NULL)
    118 	{
    119 		release_module(pSmeSm, initVec);
    120 	    WLAN_OS_REPORT(("FATAL ERROR: smeSm_create(): Error Creating smeSm - Aborting\n"));
    121 		return NULL;
    122 	}
    123 	initVec |= (1 << TIMER_INIT_BIT);
    124 
    125 	return(pSmeSm);
    126 }
    127 
    128 /************************************************************************
    129  *                        smeSm_config									*
    130  ************************************************************************
    131 DESCRIPTION: SME SM module configuration function, called by the config mgr in configuration phase
    132 				performs the following:
    133 				-	Reset & initiailzes local variables
    134 				-	Init the handles to be used by the module
    135 
    136 INPUT:      hSmeSm	-	SME SM handle
    137 			List of handles to be used by the module
    138 
    139 OUTPUT:
    140 
    141 RETURN:     OK on success, NOK otherwise
    142 
    143 ************************************************************************/
    144 TI_STATUS smeSm_config(TI_HANDLE		hSmeSm,
    145 					TI_HANDLE		    hConn,
    146 					TI_HANDLE		    hScanCncn,
    147 					TI_HANDLE		    hSiteMgr,
    148 					TI_HANDLE		    hHalCtrl,
    149 					TI_HANDLE		    hReport,
    150 					TI_HANDLE 		    hOs,
    151                     TI_HANDLE		    hEvHandler,
    152 					TI_HANDLE		    hScr,
    153 					TI_HANDLE		    hApConn,
    154 					TI_HANDLE		    hCurrBss,
    155 					TI_HANDLE		    hPowerMgr,
    156                     TI_HANDLE           hRegulatoryDomain,
    157 					smeInitParams_t*	smeInitParams)
    158 
    159 {
    160 	TI_STATUS status;
    161 	int index;
    162 
    163 	smeSm_t *pSmeSm = (smeSm_t *)hSmeSm;
    164 
    165 	pSmeSm->state = SME_SM_STATE_IDLE;
    166 	pSmeSm->hConn			= hConn;
    167 	pSmeSm->hScanCncn		= hScanCncn;
    168 	pSmeSm->hSiteMgr		= hSiteMgr;
    169 	pSmeSm->hHalCtrl		= hHalCtrl;
    170 	pSmeSm->hReport			= hReport;
    171 	pSmeSm->hOs				= hOs;
    172     pSmeSm->hEvHandler  	= hEvHandler;
    173 	pSmeSm->hScr			= hScr;
    174 	pSmeSm->hApConn			= hApConn;
    175 	pSmeSm->hCurrBss		= hCurrBss;
    176 	pSmeSm->hPowerMgr		= hPowerMgr;
    177     pSmeSm->hRegulatoryDomain = hRegulatoryDomain;
    178 
    179 	/* interscan timeout values */
    180 	pSmeSm->scanEnabled				= (scanEnabledOptions_e)smeInitParams->EnableFirstConnScan;
    181     pSmeSm->interScanTimeoutMin 	= smeInitParams->InterScanIntervalMin;
    182     pSmeSm->interScanTimeoutMax 	= smeInitParams->InterScanIntervalMax;
    183     pSmeSm->interScanTimeoutDelta 	= smeInitParams->InterScanIntervalDelta;
    184     pSmeSm->shutDownStatus = 0;
    185 
    186 
    187 	/*
    188 	 *    Setting scan parameters for band 2.4Ghtz
    189 	 */
    190 	os_memoryCopy(hOs, &(pSmeSm->scanParamsBG), &(smeInitParams->scanParamsBG), sizeof(sme_scan_Params_t));
    191 	/* The channel list is represented as char string terminate in zeros. */
    192 
    193 	for( index = 0;
    194 		 ((index < MAX_NUMBER_OF_CHANNELS_PER_SCAN )&&(pSmeSm->scanParamsBG.channelsList[index] != 0));
    195 		 index++ );
    196 
    197 	pSmeSm->scanParamsBG.numOfChannels = index;
    198 
    199 	/*
    200 	 *    Setting scan parameters for band 5.0Ghtz
    201 	 */
    202 	os_memoryCopy(hOs, &(pSmeSm->scanParamsA), &(smeInitParams->scanParamsA), sizeof(sme_scan_Params_t));
    203 
    204 	for( index = 0;
    205 		 ((index < MAX_NUMBER_OF_CHANNELS_PER_SCAN )&&(pSmeSm->scanParamsA.channelsList[index] != 0));
    206 		 index++ );
    207 
    208 	pSmeSm->scanParamsA.numOfChannels = index;
    209 
    210 
    211 
    212     /* register to scan result callback */
    213     scanConcentrator_registerScanResultCB( pSmeSm->hScanCncn, SCAN_SCC_DRIVER, smeSm_scanComplete, hSmeSm );
    214 
    215 	status = smeSm_smConfig(pSmeSm);
    216 
    217 	if (status != OK)
    218 		WLAN_REPORT_INIT(hReport, SME_SM_MODULE_LOG,  (".....Sme state machine configuration Failure\n"));
    219 	else
    220 		WLAN_REPORT_INIT(hReport, SME_SM_MODULE_LOG,  (".....Sme state machine configuration Success\n"));
    221 
    222 	return status;
    223 }
    224 
    225 /************************************************************************
    226  *                        smeSm_getDriverShutdownStatus									*
    227  ************************************************************************
    228 DESCRIPTION: Return shutdown status of driver.
    229 
    230 INPUT:      hSmeSm	-	SME SM handle.
    231 
    232 OUTPUT:
    233 
    234 RETURN:     shutdown status of driver (SME/HAL)
    235 
    236 ************************************************************************/
    237 UINT8 smeSm_getDriverShutdownStatus (TI_HANDLE		hSmeSm)
    238 {
    239 	smeSm_t			*pSmeSm = (smeSm_t *)hSmeSm;
    240     return (pSmeSm->shutDownStatus);
    241 }
    242 
    243 
    244 /************************************************************************
    245  *                        smeSm_unLoad									*
    246  ************************************************************************
    247 DESCRIPTION: SME SM module unload function, called by the config mgr in the unlod phase
    248 				performs the following:
    249 				-	Free all memory allocated by the module
    250 
    251 INPUT:      hSmeSm	-	SME SM handle.
    252 
    253 
    254 OUTPUT:
    255 
    256 RETURN:     OK on success, NOK otherwise
    257 
    258 ************************************************************************/
    259 TI_STATUS smeSm_unLoad(TI_HANDLE		hSmeSm)
    260 {
    261 	UINT32			initVec;
    262 	smeSm_t			*pSmeSm = (smeSm_t *)hSmeSm;
    263 
    264 	if (!pSmeSm)
    265 		return OK;
    266 
    267 	initVec = 0xFFFF;
    268 	release_module(pSmeSm, initVec);
    269 
    270 	return OK;
    271 }
    272 
    273 /***********************************************************************
    274  *                        smeSm_start
    275  ***********************************************************************
    276 DESCRIPTION: Called by the configuration module in order to start the driver
    277 			 Calls the SME SM with a start event
    278 
    279 INPUT:      hSmeSm	-	SME SM handle.
    280 
    281 OUTPUT:
    282 
    283 RETURN:     OK on success, NOK otherwise
    284 
    285 ************************************************************************/
    286 TI_STATUS smeSm_start(TI_HANDLE		hSmeSm)
    287 {
    288 	smeSm_t *pSmeSm = (smeSm_t *)hSmeSm;
    289 
    290 	pSmeSm->radioOn = TRUE;
    291     pSmeSm->immediateShutdownRequired = FALSE;
    292 
    293 	return smeSm_SMEvent(&pSmeSm->state, SME_SM_EVENT_START, pSmeSm);
    294 }
    295 
    296 
    297 
    298 /***********************************************************************
    299  *                        smeSm_restart
    300  ***********************************************************************
    301 DESCRIPTION: Called by the configuration module in order to start the driver
    302 			 Calls the SME SM with a start event
    303 
    304 INPUT:      hSmeSm	-	SME SM handle.
    305 
    306 OUTPUT:
    307 
    308 RETURN:     OK on success, NOK otherwise
    309 
    310 ************************************************************************/
    311 TI_STATUS smeSm_reselect(TI_HANDLE		hSmeSm)
    312 {
    313 	smeSm_t *pSmeSm = (smeSm_t *)hSmeSm;
    314 	paramInfo_t			param;
    315 
    316 	/* For new SSID reset interScanTimeout */
    317 	pSmeSm->interScanTimeout = pSmeSm->interScanTimeoutMin;
    318 
    319 	/*
    320 		Junk SSID is used for disabling connection attempts, if it is
    321 	   set the driver will be stopped at "inter scan" state.
    322 	*/
    323 
    324 	param.paramType = SITE_MGR_DESIRED_SSID_PARAM;
    325 	siteMgr_getParam(pSmeSm->hSiteMgr, &param);
    326 
    327 	if (utils_isJunkSSID(&param.content.siteMgrDesiredSSID))
    328 	{
    329 		pSmeSm->connectEnabled    = FALSE;
    330 
    331 		WLAN_REPORT_INFORMATION(pSmeSm->hReport, SME_SM_MODULE_LOG,
    332 					("Sme Set JUNK SSID\n"));
    333 
    334 		if( pSmeSm->state == SME_SM_STATE_SCANNING )
    335 			/* If in scanning stop the scan, the disconnect event will
    336 			   be sent by the scan complete function. */
    337 			scanConcentrator_stopScan( pSmeSm->hScanCncn, SCAN_SCC_DRIVER );
    338 		else
    339 			smeSm_SMEvent(&pSmeSm->state, SME_SM_EVENT_DISCONNECT, pSmeSm);
    340 	}
    341 	else
    342 	{
    343 		pSmeSm->connectEnabled    = TRUE;
    344 		smeSm_SMEvent(&pSmeSm->state, SME_SM_EVENT_RESELECT, pSmeSm);
    345 	}
    346 
    347 	return OK;
    348 }
    349 
    350 
    351 /***********************************************************************
    352  *                        smeSm_stop
    353  ***********************************************************************
    354 DESCRIPTION: Called by the configuration module in order to stop the driver
    355 			 Calls the SME SM with a stop event
    356 
    357 INPUT:      hSmeSm	-	SME SM handle.
    358 
    359 OUTPUT:
    360 
    361 RETURN:     OK on success, NOK otherwise
    362 
    363 ************************************************************************/
    364 TI_STATUS smeSm_stop(TI_HANDLE		hSmeSm)
    365 {
    366 	smeSm_t *pSmeSm = (smeSm_t *)hSmeSm;
    367 
    368 	pSmeSm->radioOn = FALSE;
    369     pSmeSm->immediateShutdownRequired = FALSE;
    370 
    371 	return smeSm_SMEvent(&pSmeSm->state, SME_SM_EVENT_STOP, pSmeSm);
    372 }
    373 
    374 /***********************************************************************
    375  *                        smeSm_stopAndShutdown
    376  ***********************************************************************
    377 DESCRIPTION: Called by the configuration module in order to stop the driver
    378 			 Calls the SME SM with a stop event
    379 
    380 INPUT:      hSmeSm	-	SME SM handle.
    381 
    382 OUTPUT:
    383 
    384 RETURN:     OK on success, NOK otherwise
    385 
    386 ************************************************************************/
    387 void smeSm_stopAndShutdown(TI_HANDLE		hSmeSm)
    388 {
    389 	smeSm_t *pSmeSm = (smeSm_t *)hSmeSm;
    390 
    391 	pSmeSm->radioOn = FALSE;
    392     pSmeSm->immediateShutdownRequired = TRUE;
    393 
    394 	smeSm_SMEvent(&pSmeSm->state, SME_SM_EVENT_STOP, pSmeSm);
    395 }
    396 
    397 /***********************************************************************
    398  *                        smeSm_scanComplete
    399  ***********************************************************************
    400 DESCRIPTION: Called by the site manager When scan is completed
    401 			 Calls the SME SM with a scan complete event
    402 
    403 INPUT:      hSmeSm	-	SME SM handle.
    404 
    405 OUTPUT:
    406 
    407 RETURN:     OK on success, NOK otherwise
    408 
    409 ************************************************************************/
    410 void smeSm_scanComplete( TI_HANDLE hSmeSm, scan_cncnResultStatus_e status,
    411                          scan_frameInfo_t *frameInfo, UINT16 SPSStatus )
    412 {
    413 	smeSm_t *pSmeSm = (smeSm_t *)hSmeSm;
    414 
    415     /* if this call is due to a scan result received, simply store it in the site mngr */
    416 	if ( SCAN_CRS_RECEIVED_FRAME == status )
    417     {
    418 		siteMgr_updateSite( pSmeSm->hSiteMgr, frameInfo->bssId, frameInfo->parsedIEs, frameInfo->channel, frameInfo->band, FALSE);
    419         if ( BEACON == frameInfo->parsedIEs->subType )
    420         {
    421             siteMgr_saveBeaconBuffer( pSmeSm->hSiteMgr, frameInfo->bssId, frameInfo->buffer, frameInfo->bufferLength );
    422         }
    423         else
    424         {
    425             siteMgr_saveProbeRespBuffer( pSmeSm->hSiteMgr, frameInfo->bssId, frameInfo->buffer, frameInfo->bufferLength );
    426         }
    427 #ifdef TI_DBG
    428 		/* update statistics - count one more result that was received */
    429 		pSmeSm->smeStats.currentNumberOfScanResults++;
    430 #endif
    431         return;
    432     }
    433 
    434 #ifdef TI_DBG
    435 	/* update statistics - update scan results histogram */
    436 	if ( SCAN_RESULT_HISTOGRAM_SIZE <= pSmeSm->smeStats.currentNumberOfScanResults )
    437 	{
    438 		pSmeSm->smeStats.scanResulCountHistogram[ SCAN_RESULT_HISTOGRAM_SIZE -1 ]++;
    439 	}
    440 	else
    441 	{
    442 		pSmeSm->smeStats.scanResulCountHistogram[ pSmeSm->smeStats.currentNumberOfScanResults ]++;
    443 	}
    444 	pSmeSm->smeStats.currentNumberOfScanResults = 0;
    445 #endif
    446 
    447 	WLAN_REPORT_INFORMATION(pSmeSm->hReport, SME_SM_MODULE_LOG,
    448 				("smeSm_scanComplete\n"));
    449 
    450     siteMgr_removeNotReceivedSites(pSmeSm->hSiteMgr);
    451 
    452 	if ( pSmeSm->connectEnabled )
    453     {
    454 	    /* check for rescan and perform scan when it is on */
    455 		if ( TRUE == pSmeSm->reScanFlag )
    456         {
    457 		    WLAN_REPORT_INFORMATION( pSmeSm->hReport, SME_SM_MODULE_LOG,
    458                                      ("SME_SM: doing additional scan due to reScanFlag = ON\n") );
    459 		    pSmeSm->reScanFlag = FALSE;
    460 			sme_startScan(pSmeSm);
    461 		}
    462         /* check for dual band rescan */
    463 		else if ( TRUE == pSmeSm->dualBandReScanFlag )
    464         {
    465 		    WLAN_REPORT_INFORMATION( pSmeSm->hReport, SME_SM_MODULE_LOG,
    466                                      ("SME_SM: doing additional scan due to dualBandReScanFlag = ON\n") );
    467 			sme_startScan(pSmeSm);
    468         }
    469         else
    470         {
    471 			smeSm_SMEvent(&pSmeSm->state, SME_SM_EVENT_SCAN_COMPLETE, pSmeSm);
    472 		}
    473 	}
    474 	else
    475     {
    476 		/* If connection is disabled then send disconnect event, the SM will
    477 		 * move into inter scan state
    478 		 */
    479 		pSmeSm->reScanFlag = FALSE;	/* (Just to make sure) */
    480         pSmeSm->dualBandReScanFlag = FALSE;
    481 		smeSm_SMEvent(&pSmeSm->state, SME_SM_EVENT_DISCONNECT, pSmeSm);
    482 	}
    483 }
    484 
    485 
    486 /***********************************************************************
    487  *                        smeSm_reportConnStatus
    488  ***********************************************************************
    489 DESCRIPTION: Called by the connection module when connection status changes
    490 			 Calls the SME SM with a connection suceess or connection failure based on the status
    491 
    492 INPUT:      hSmeSm		-	SME SM handle.
    493 			statusType	-	Connection status
    494 			uStatusCode -	extra information to statusType (usually status code of the packet)
    495 
    496 OUTPUT:
    497 
    498 RETURN:     OK on success, NOK otherwise
    499 
    500 ************************************************************************/
    501 TI_STATUS smeSm_reportConnStatus(TI_HANDLE	hSmeSm, mgmtStatus_e statusType, UINT32 uStatusCode)
    502 {
    503 	smeSm_t *pSmeSm = (smeSm_t *)hSmeSm;
    504 
    505 	WLAN_REPORT_INFORMATION(pSmeSm->hReport, SME_SM_MODULE_LOG,
    506 		("%s statusType = %d, uStatusCode = %d \n",__FUNCTION__, statusType, uStatusCode));
    507 
    508 	switch(statusType)
    509 	{
    510 		case STATUS_SUCCESSFUL:
    511 			return smeSm_SMEvent(&pSmeSm->state, SME_SM_EVENT_CONN_SUCCESS, pSmeSm);
    512 
    513 		/*
    514 		*  The next section handles connection failures, all cases are sending same event to SM.
    515 		*/
    516 		case		STATUS_AUTH_REJECT:
    517 		case		STATUS_ASSOC_REJECT:
    518 		case		STATUS_SECURITY_FAILURE:
    519 		case		STATUS_AP_DEAUTHENTICATE:
    520 		case		STATUS_AP_DISASSOCIATE:
    521 		case		STATUS_ROAMING_TRIGGER:
    522 			pSmeSm->DisAssoc.mgmtStatus  = statusType;
    523 			pSmeSm->DisAssoc.uStatusCode = uStatusCode;
    524 			/* Note that in case of unspecified status we won't update the status. This is done since this function could be called twice */
    525 			/* for example: apConn called this function and than SME called conn_stop and this function is called again					  */
    526 		case		STATUS_UNSPECIFIED:
    527 
    528 			return smeSm_SMEvent(&pSmeSm->state, SME_SM_EVENT_CONN_FAILURE, pSmeSm);
    529 
    530 	default:
    531 		WLAN_REPORT_WARNING(pSmeSm->hReport, SME_SM_MODULE_LOG,
    532 			("%s unknown statusType = %d\n",__FUNCTION__, statusType));
    533 
    534 		break;
    535 	}
    536 
    537 	return OK;
    538 }
    539 
    540 /***********************************************************************
    541  *                        smeSm_reportSelectStatus
    542  ***********************************************************************
    543 DESCRIPTION: Called by the selection function
    544 			 Calls the SME SM with a selection suceess or selection failure based on the status
    545 
    546 INPUT:      hSmeSm	-	SME SM handle.
    547 			status	-	selection status
    548 
    549 OUTPUT:
    550 
    551 RETURN:     OK on success, NOK otherwise
    552 
    553 ************************************************************************/
    554 TI_STATUS smeSm_reportSelectStatus(TI_HANDLE		hSmeSm,
    555 								mgmtStatus_e	status)
    556 {
    557 	smeSm_t *pSmeSm = (smeSm_t *)hSmeSm;
    558 
    559 	if (status == SELECT_STATUS_SUCCESS)
    560 		return smeSm_SMEvent(&pSmeSm->state, SME_SM_EVENT_SELECT_SUCCESS, pSmeSm);
    561 	else
    562 		return smeSm_SMEvent(&pSmeSm->state, SME_SM_EVENT_SELECT_FAILURE, pSmeSm);
    563 }
    564 
    565 
    566 /***********************************************************************
    567  *                        smeSm_startScan
    568  ***********************************************************************
    569 DESCRIPTION: Timer callback, on expiration of which, scan started
    570 
    571 INPUT:      hSmeSm	-	SME SM handle.
    572 
    573 OUTPUT:
    574 
    575 RETURN:     OK on success, NOK otherwise
    576 
    577 ************************************************************************/
    578 void smeSm_InterScanTimeoutCB(TI_HANDLE     hSmeSm)
    579 {
    580 	smeSm_t *pSmeSm = (smeSm_t *)hSmeSm;
    581 
    582 	if ( pSmeSm->connectEnabled )
    583 	{
    584 		pSmeSm->interScanTimeout += pSmeSm->interScanTimeoutDelta;
    585 
    586 		if( pSmeSm->interScanTimeout > pSmeSm->interScanTimeoutMax )
    587 			pSmeSm->interScanTimeout = pSmeSm->interScanTimeoutMax;
    588 
    589 		smeSm_SMEvent(&pSmeSm->state, SME_SM_EVENT_RESELECT, pSmeSm);
    590 	}
    591 }
    592 
    593 
    594 /***********************************************************************
    595  *                        release_module
    596  ***********************************************************************
    597 DESCRIPTION:	Called by the un load function
    598 				Go over the vector, for each bit that is set, release the corresponding module.
    599 
    600 INPUT:      hConn	-	SME SM handle.
    601 			pSmeSm	-	Vector that contains a bit set for each module thah had been initiualized
    602 
    603 OUTPUT:
    604 
    605 RETURN:     OK on success, NOK otherwise
    606 
    607 ************************************************************************/
    608 static void release_module(smeSm_t *pSmeSm, UINT32 initVec)
    609 {
    610 
    611 	if (initVec & (1 << SM_INIT_BIT))
    612 		smeSm_smUnLoad(pSmeSm->hOs, pSmeSm->pFsm);
    613 
    614 	if (initVec & (1 << TIMER_INIT_BIT))
    615 	{
    616 		os_timerStop(pSmeSm->hOs, pSmeSm->interScanTimeoutTimer);
    617 		utils_nullTimerDestroy(pSmeSm->hOs, pSmeSm->interScanTimeoutTimer);
    618 	}
    619 
    620 	if (initVec & (1 << SME_INIT_BIT))
    621 		utils_nullMemoryFree(pSmeSm->hOs, pSmeSm, sizeof(smeSm_t));
    622 
    623 
    624 	initVec = 0;
    625 }
    626 
    627 /***********************************************************************
    628  *                        smeSm_setParam
    629  ***********************************************************************
    630 DESCRIPTION: SME SM set param function, called by the following:
    631 				-	config mgr in order to set a parameter from the OS abstraction layer.
    632 				-	Form inside the driver
    633 
    634 INPUT:      hSmeSm	-	SME SM handle.
    635 			pParam	-	Pointer to the parameter
    636 
    637 OUTPUT:
    638 
    639 RETURN:     OK on success, NOK otherwise
    640 
    641 ************************************************************************/
    642 TI_STATUS smeSm_setParam(TI_HANDLE			hSmeSm,
    643 						paramInfo_t		*pParam)
    644 {
    645 	smeSm_t *pSmeSm = (smeSm_t *)hSmeSm;
    646 
    647 	switch(pParam->paramType)
    648 	{
    649 	case SME_SCAN_ENABLED_PARAM:
    650 		if (pSmeSm->scanEnabled != pParam->content.smeSMScanEnabled)
    651 		{
    652 			if ((pParam->content.smeSMScanEnabled == SCAN_ENABLED) &&
    653 				(pSmeSm->scanEnabled == SKIP_NEXT_SCAN))
    654 			{
    655 				/* Requested to st scanEnable to TRUE;
    656 				  if we are about to skip the nextcoming scan, ignore the request */
    657 				break;
    658 			}
    659 			if ((pParam->content.smeSMScanEnabled == SKIP_NEXT_SCAN) &&
    660 				(pSmeSm->scanEnabled == SCAN_DISABLED))
    661 			{
    662 				/* Requested to st scanEnable to SKIP_NEXT_SCAN
    663 				   while it is currently set to FALSE - error, ignore the request */
    664 				WLAN_REPORT_ERROR( pSmeSm->hReport, SME_SM_MODULE_LOG,
    665 								   ("Set param, error changing scan enabled param from %d to %d\n",
    666 									pSmeSm->scanEnabled, pParam->content.smeSMScanEnabled));
    667 				break;
    668 			}
    669 			pSmeSm->scanEnabled = pParam->content.smeSMScanEnabled;
    670 		}
    671 		break;
    672 
    673 	default:
    674 		WLAN_REPORT_ERROR( pSmeSm->hReport, SME_SM_MODULE_LOG,
    675 						   ("Set param, Params is not supported, %d\n\n", pParam->paramType));
    676 		return PARAM_NOT_SUPPORTED;
    677 	}
    678 
    679 	return OK;
    680 }
    681 
    682 /***********************************************************************
    683  *                        smeSm_getParam
    684  ***********************************************************************
    685 DESCRIPTION: SME SM get param function, called by the following:
    686 			-	config mgr in order to get a parameter from the OS abstraction layer.
    687 			-	Fomr inside the dirver
    688 
    689 INPUT:      hSmeSm	-	SME SM handle.
    690 			pParam	-	Pointer to the parameter
    691 
    692 OUTPUT:
    693 
    694 RETURN:     OK on success, NOK otherwise
    695 
    696 ************************************************************************/
    697 TI_STATUS smeSm_getParam(TI_HANDLE			hSmeSm,
    698 						paramInfo_t		*pParam)
    699 {
    700 	smeSm_t *pSmeSm = (smeSm_t *)hSmeSm;
    701 
    702 	switch(pParam->paramType)
    703 	{
    704 	case SITE_MGR_CONNECTION_STATUS_PARAM:
    705 		switch (pSmeSm->state)
    706 		{
    707 		case SME_SM_STATE_IDLE:
    708 		case SME_SM_STATE_INTER_SCAN:
    709 			pParam->content.smeSmConnectionStatus = eDot11Idle;
    710 			break;
    711 		case SME_SM_STATE_SCANNING:
    712 			pParam->content.smeSmConnectionStatus = eDot11Scaning;
    713 			break;
    714 		case SME_SM_STATE_CONNECTING:
    715 			pParam->content.smeSmConnectionStatus = eDot11Connecting;
    716 			break;
    717 		default:
    718 			pParam->content.smeSmConnectionStatus = eDot11Associated;
    719 			break;
    720 		}
    721 		break;
    722 
    723 	case SME_SM_STATE_PARAM:
    724 		pParam->content.smeSmState = pSmeSm->state;
    725 		break;
    726 
    727 	case SME_SCAN_ENABLED_PARAM:
    728 		pParam->content.smeSMScanEnabled = pSmeSm->scanEnabled;
    729 		break;
    730 
    731 	default:
    732 		WLAN_REPORT_ERROR(pSmeSm->hReport, SME_SM_MODULE_LOG, ("Get param, Params is not supported, %d\n\n", pParam->paramType));
    733 		return PARAM_NOT_SUPPORTED;
    734 	}
    735 
    736 	return OK;
    737 }
    738