| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312 |
- /*
- ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/scan_fsm.c#2
- */
- /*! \file "scan_fsm.c"
- \brief This file defines the state transition function for SCAN FSM.
- The SCAN FSM is part of SCAN MODULE and responsible for performing basic SCAN
- behavior as metioned in IEEE 802.11 2007 11.1.3.1 & 11.1.3.2 .
- */
- /*
- ** Log: scan_fsm.c
- **
- ** 08 15 2013 cp.wu
- ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
- ** enlarge match_ssid_num to 16 for PNO support
- **
- ** 08 09 2013 cp.wu
- ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
- ** 1. integrate scheduled scan functionality
- ** 2. condition compilation for linux-3.4 & linux-3.8 compatibility
- ** 3. correct CMD queue access to reduce lock scope
- **
- ** 02 19 2013 cp.wu
- ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
- ** take use of GET_BSS_INFO_BY_INDEX() and MAX_BSS_INDEX macros
- ** for correctly indexing of BSS-INFO pointers
- **
- ** 02 05 2013 cp.wu
- ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
- ** 1. change to use long format (FT=1) for initial command
- ** 2. fix a typo
- **
- ** 01 22 2013 cp.wu
- ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
- ** .add driver side NLO state machine
- **
- ** 01 22 2013 cp.wu
- ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
- ** modification for ucBssIndex migration
- **
- ** 01 03 2013 cp.wu
- ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
- ** carry timeout value and channel dwell time value to scan module
- **
- ** 09 17 2012 cm.chang
- ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
- ** Duplicate source from MT6620 v2.3 driver branch
- ** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base)
- **
- ** 08 31 2012 cp.wu
- ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
- ** do not use fgIsP2PRegistered for checking but use network index
- *
- * 06 13 2012 yuche.tsai
- * NULL
- * Update maintrunk driver.
- * Add support for driver compose assoc request frame.
- *
- * 11 24 2011 wh.su
- * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
- * Adjust code for DBG and CONFIG_XLOG.
- *
- * 11 14 2011 yuche.tsai
- * [WCXRP00001095] [Volunteer Patch][Driver] Always Scan before enable Hot-Spot.
- * Fix bug when unregister P2P network..
- *
- * 11 11 2011 wh.su
- * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
- * modify the xlog related code.
- *
- * 11 02 2011 wh.su
- * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
- * adding the code for XLOG.
- *
- * 08 11 2011 cp.wu
- * [WCXRP00000830] [MT6620 Wi-Fi][Firmware] Use MDRDY counter to detect empty channel for shortening scan time
- * sparse channel detection:
- * driver: collect sparse channel information with scan-done event
- *
- * 07 18 2011 cp.wu
- * [WCXRP00000858] [MT5931][Driver][Firmware] Add support for scan to search
- * for more than one SSID in a single scanning request
- * free mailbox message afte parsing is completed.
- *
- * 07 18 2011 cp.wu
- * [WCXRP00000858] [MT5931][Driver][Firmware] Add support for scan to search
- * for more than one SSID in a single scanning request
- * add framework in driver domain for supporting new SCAN_REQ_V2 for more than 1 SSID support
- * as well as uProbeDelay in NDIS 6.x driver model
- *
- * 04 18 2011 terry.wu
- * [WCXRP00000660] [MT6620 Wi-Fi][Driver] Remove flag CFG_WIFI_DIRECT_MOVED
- * Remove flag CFG_WIFI_DIRECT_MOVED.
- *
- * 03 29 2011 cp.wu
- * [WCXRP00000604] [MT6620 Wi-Fi][Driver] Surpress Klockwork Warning
- * surpress klock warning with code path rewritten
- *
- * 03 18 2011 cm.chang
- * [WCXRP00000576] [MT6620 Wi-Fi][Driver][FW] Remove P2P compile option in scan req/cancel command
- * As CR title
- *
- * 02 18 2011 yuche.tsai
- * [WCXRP00000478] [Volunteer Patch][MT6620][Driver] Probe request frame
- * during search phase do not contain P2P wildcard SSID.
- * Take P2P wildcard SSID into consideration.
- *
- * 01 27 2011 yuche.tsai
- * [WCXRP00000399] [Volunteer Patch][MT6620/MT5931][Driver] Fix scan side effect after P2P module separate.
- * Fix scan channel extension issue when p2p module is not registered.
- *
- * 01 26 2011 yuche.tsai
- * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
- * .
- *
- * 01 25 2011 yuche.tsai
- * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
- * Fix Compile Error when DBG is disabled.
- *
- * 12 07 2010 cm.chang
- * [WCXRP00000238] MT6620 Wi-Fi][Driver][FW] Support regulation domain setting from NVRAM and supplicant
- * 1. Country code is from NVRAM or supplicant
- * 2. Change band definition in CMD/EVENT.
- *
- * 09 03 2010 kevin.huang
- * NULL
- * Refine #include sequence and solve recursive/nested #include issue
- *
- * 08 30 2010 cp.wu
- * NULL
- * eliminate klockwork errors
- *
- * 08 16 2010 cp.wu
- * NULL
- * add interface for RLM to trigger OBSS-SCAN.
- *
- * 08 16 2010 yuche.tsai
- * NULL
- * Fix bug for processing queued scan request.
- *
- * 08 11 2010 yuche.tsai
- * NULL
- * Add a function for returning channel.
- *
- * 08 05 2010 yuche.tsai
- * NULL
- * Update SCAN FSM for support P2P Device discovery scan.
- *
- * 08 03 2010 cp.wu
- * NULL
- * surpress compilation warning.
- *
- * 07 26 2010 yuche.tsai
- *
- * Add option of channel extension while cancelling scan request.
- *
- * 07 21 2010 yuche.tsai
- *
- * Add P2P Scan & Scan Result Parsing & Saving.
- *
- * 07 20 2010 cp.wu
- *
- * pass band information for scan in an efficient way by mapping ENUM_BAND_T into UINT_8..
- *
- * 07 19 2010 cp.wu
- *
- * due to FW/DRV won't be sync. precisely, some strict assertions should be eased.
- *
- * 07 19 2010 cp.wu
- *
- * [WPD00003833] [MT6620 and MT5931] Driver migration.
- * SCN module is now able to handle multiple concurrent scanning requests
- *
- * 07 16 2010 cp.wu
- *
- * [WPD00003833] [MT6620 and MT5931] Driver migration.
- * bugfix for SCN migration
- * 1) modify QUEUE_CONCATENATE_QUEUES() so it could be used to concatence with an empty queue
- * 2) before AIS issues scan request, network(BSS) needs to be activated first
- * 3) only invoke COPY_SSID when using specified SSID for scan
- *
- * 07 15 2010 cp.wu
- *
- * [WPD00003833] [MT6620 and MT5931] Driver migration.
- * driver no longer generates probe request frames
- *
- * 07 14 2010 cp.wu
- *
- * [WPD00003833] [MT6620 and MT5931] Driver migration.
- * pass band with channel number information as scan parameter
- *
- * 07 14 2010 cp.wu
- *
- * [WPD00003833] [MT6620 and MT5931] Driver migration.
- * remove timer in DRV-SCN.
- *
- * 07 09 2010 cp.wu
- *
- * 1) separate AIS_FSM state for two kinds of scanning. (OID triggered scan, and scan-for-connection)
- * 2) eliminate PRE_BSS_DESC_T, Beacon/PrebResp is now parsed in single pass
- * 3) implment DRV-SCN module, currently only accepts single scan request,
- * other request will be directly dropped by returning BUSY
- *
- * 07 08 2010 cp.wu
- *
- * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
- *
- * 07 08 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * take use of RLM module for parsing/generating HT IEs for 11n capability
- *
- * 07 02 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * when returning to SCAN_IDLE state, send a correct message to source FSM.
- *
- * 07 01 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * implementation of DRV-SCN and related mailbox message handling.
- *
- * 06 22 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * comment out RLM APIs by CFG_RLM_MIGRATION.
- *
- * 06 21 2010 cp.wu
- * [WPD00003833][MT6620 and MT5931] Driver migration
- * add scan_fsm into building.
- *
- * 05 14 2010 kevin.huang
- * [BORA00000794][WIFISYS][New Feature]Power Management Support
- * Refine the order of Stop TX Queue and Switch Channel
- *
- * 05 12 2010 kevin.huang
- * [BORA00000794][WIFISYS][New Feature]Power Management Support
- * Update pause/resume/flush API to new Bitmap API
- *
- * 05 12 2010 kevin.huang
- * [BORA00000794][WIFISYS][New Feature]Power Management Support
- * Add Power Management - Legacy PS-POLL support.
- *
- * 03 18 2010 kevin.huang
- * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
- * Ignore the PROBE_DELAY state if the value of Probe Delay == 0
- *
- * 03 10 2010 kevin.huang
- * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
- * Add Channel Manager for arbitration of JOIN and SCAN Req
- *
- * 02 23 2010 kevin.huang
- * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
- * Add support scan channel 1~14 and update scan result's frequency infou1rwduu`wvpghlqg|n`slk+mpdkb
- *
- * 01 08 2010 kevin.huang
- * [BORA00000018]Integrate WIFI part into BORA for the 1st time
- * Add set RX Filter to receive BCN from different BSSID during SCAN
- *
- * 12 18 2009 cm.chang
- * [BORA00000018]Integrate WIFI part into BORA for the 1st time
- * .
- *
- * Nov 25 2009 mtk01461
- * [BORA00000018] Integrate WIFI part into BORA for the 1st time
- * Remove flag of CFG_TEST_MGMT_FSM
- *
- * Nov 20 2009 mtk01461
- * [BORA00000018] Integrate WIFI part into BORA for the 1st time
- * Change parameter of scanSendProbeReqFrames()
- *
- * Nov 16 2009 mtk01461
- * [BORA00000018] Integrate WIFI part into BORA for the 1st time
- * Update scnFsmSteps()
- *
- * Nov 5 2009 mtk01461
- * [BORA00000018] Integrate WIFI part into BORA for the 1st time
- * Fix typo
- *
- * Nov 5 2009 mtk01461
- * [BORA00000018] Integrate WIFI part into BORA for the 1st time
- *
- */
- /*******************************************************************************
- * C O M P I L E R F L A G S
- ********************************************************************************
- */
- /*******************************************************************************
- * E X T E R N A L R E F E R E N C E S
- ********************************************************************************
- */
- #include "precomp.h"
- #define CURRENT_PSCN_VERSION 1
- #define RSSI_MARGIN_DEFAULT 5
- #define MAX_PERIOD 200000
- /*******************************************************************************
- * C O N S T A N T S
- ********************************************************************************
- */
- /*******************************************************************************
- * D A T A T Y P E S
- ********************************************************************************
- */
- /*******************************************************************************
- * P U B L I C D A T A
- ********************************************************************************
- */
- /*******************************************************************************
- * P R I V A T E D A T A
- ********************************************************************************
- */
- #if DBG
- /*lint -save -e64 Type mismatch */
- static PUINT_8 apucDebugScanState[SCAN_STATE_NUM] = {
- (PUINT_8) DISP_STRING("SCAN_STATE_IDLE"),
- (PUINT_8) DISP_STRING("SCAN_STATE_SCANNING"),
- };
- /*lint -restore */
- #endif /* DBG */
- /*******************************************************************************
- * M A C R O S
- ********************************************************************************
- */
- /*******************************************************************************
- * F U N C T I O N D E C L A R A T I O N S
- ********************************************************************************
- */
- /*******************************************************************************
- * F U N C T I O N S
- ********************************************************************************
- */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID scnFsmSteps(IN P_ADAPTER_T prAdapter, IN ENUM_SCAN_STATE_T eNextState)
- {
- P_SCAN_INFO_T prScanInfo;
- P_SCAN_PARAM_T prScanParam;
- P_MSG_HDR_T prMsgHdr;
- BOOLEAN fgIsTransition = (BOOLEAN) FALSE;
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prScanParam = &prScanInfo->rScanParam;
- do {
- #if DBG
- DBGLOG(SCN, STATE, "TRANSITION: [%s] -> [%s]\n",
- apucDebugScanState[prScanInfo->eCurrentState], apucDebugScanState[eNextState]);
- #else
- DBGLOG(SCN, STATE, "[%d] TRANSITION: [%d] -> [%d]\n",
- DBG_SCN_IDX, prScanInfo->eCurrentState, eNextState);
- #endif
- /* NOTE(Kevin): This is the only place to change the eCurrentState(except initial) */
- prScanInfo->eCurrentState = eNextState;
- fgIsTransition = (BOOLEAN) FALSE;
- switch (prScanInfo->eCurrentState) {
- case SCAN_STATE_IDLE:
- /* check for pending scanning requests */
- if (!LINK_IS_EMPTY(&(prScanInfo->rPendingMsgList))) {
- /* load next message from pending list as scan parameters */
- LINK_REMOVE_HEAD(&(prScanInfo->rPendingMsgList), prMsgHdr, P_MSG_HDR_T);
- if (prMsgHdr->eMsgId == MID_AIS_SCN_SCAN_REQ
- || prMsgHdr->eMsgId == MID_BOW_SCN_SCAN_REQ
- || prMsgHdr->eMsgId == MID_P2P_SCN_SCAN_REQ
- || prMsgHdr->eMsgId == MID_RLM_SCN_SCAN_REQ) {
- scnFsmHandleScanMsg(prAdapter, (P_MSG_SCN_SCAN_REQ) prMsgHdr);
- eNextState = SCAN_STATE_SCANNING;
- fgIsTransition = TRUE;
- } else if (prMsgHdr->eMsgId == MID_AIS_SCN_SCAN_REQ_V2
- || prMsgHdr->eMsgId == MID_BOW_SCN_SCAN_REQ_V2
- || prMsgHdr->eMsgId == MID_P2P_SCN_SCAN_REQ_V2
- || prMsgHdr->eMsgId == MID_RLM_SCN_SCAN_REQ_V2) {
- scnFsmHandleScanMsgV2(prAdapter, (P_MSG_SCN_SCAN_REQ_V2) prMsgHdr);
- eNextState = SCAN_STATE_SCANNING;
- fgIsTransition = TRUE;
- } else {
- /* should not happen */
- ASSERT(0);
- }
- /* switch to next state */
- cnmMemFree(prAdapter, prMsgHdr);
- }
- break;
- case SCAN_STATE_SCANNING:
- if (prScanParam->fgIsScanV2 == FALSE)
- scnSendScanReq(prAdapter);
- else
- scnSendScanReqV2(prAdapter);
- cnmTimerStartTimer(prAdapter, &prScanInfo->rScanDoneTimer,
- SEC_TO_MSEC(AIS_SCN_DONE_TIMEOUT_SEC));
- /* prScanInfo->ucScanDoneTimeoutCnt = 0; */
- break;
- default:
- ASSERT(0);
- break;
- }
- } while (fgIsTransition);
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief Generate CMD_ID_SCAN_REQ command
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID scnSendScanReq(IN P_ADAPTER_T prAdapter)
- {
- P_SCAN_INFO_T prScanInfo;
- P_SCAN_PARAM_T prScanParam;
- CMD_SCAN_REQ rCmdScanReq;
- UINT_32 i;
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prScanParam = &prScanInfo->rScanParam;
- /* send command packet for scan */
- kalMemZero(&rCmdScanReq, sizeof(CMD_SCAN_REQ));
- rCmdScanReq.ucSeqNum = prScanParam->ucSeqNum;
- rCmdScanReq.ucBssIndex = prScanParam->ucBssIndex;
- rCmdScanReq.ucScanType = (UINT_8) prScanParam->eScanType;
- rCmdScanReq.ucSSIDType = prScanParam->ucSSIDType;
- if (prScanParam->ucSSIDNum == 1) {
- COPY_SSID(rCmdScanReq.aucSSID,
- rCmdScanReq.ucSSIDLength,
- prScanParam->aucSpecifiedSSID[0], prScanParam->ucSpecifiedSSIDLen[0]);
- }
- rCmdScanReq.ucChannelType = (UINT_8) prScanParam->eScanChannel;
- if (prScanParam->eScanChannel == SCAN_CHANNEL_SPECIFIED) {
- /* P2P would use:
- * 1. Specified Listen Channel of passive scan for LISTEN state.
- * 2. Specified Listen Channel of Target Device of active scan for SEARCH state. (Target != NULL)
- */
- rCmdScanReq.ucChannelListNum = prScanParam->ucChannelListNum;
- for (i = 0; i < rCmdScanReq.ucChannelListNum; i++) {
- rCmdScanReq.arChannelList[i].ucBand = (UINT_8) prScanParam->arChnlInfoList[i].eBand;
- rCmdScanReq.arChannelList[i].ucChannelNum =
- (UINT_8) prScanParam->arChnlInfoList[i].ucChannelNum;
- }
- }
- rCmdScanReq.u2ChannelDwellTime = prScanParam->u2ChannelDwellTime;
- rCmdScanReq.u2TimeoutValue = prScanParam->u2TimeoutValue;
- if (prScanParam->u2IELen <= MAX_IE_LENGTH)
- rCmdScanReq.u2IELen = prScanParam->u2IELen;
- else
- rCmdScanReq.u2IELen = MAX_IE_LENGTH;
- if (prScanParam->u2IELen)
- kalMemCopy(rCmdScanReq.aucIE, prScanParam->aucIE, sizeof(UINT_8) * rCmdScanReq.u2IELen);
- wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SCAN_REQ,
- TRUE,
- FALSE,
- FALSE,
- NULL,
- NULL,
- OFFSET_OF(CMD_SCAN_REQ, aucIE) + rCmdScanReq.u2IELen, (PUINT_8)&rCmdScanReq, NULL, 0);
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief Generate CMD_ID_SCAN_REQ_V2 command
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID scnSendScanReqV2(IN P_ADAPTER_T prAdapter)
- {
- P_SCAN_INFO_T prScanInfo;
- P_SCAN_PARAM_T prScanParam;
- CMD_SCAN_REQ_V2 rCmdScanReq;
- UINT_32 i;
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prScanParam = &prScanInfo->rScanParam;
- /* send command packet for scan */
- kalMemZero(&rCmdScanReq, sizeof(CMD_SCAN_REQ_V2));
- rCmdScanReq.ucSeqNum = prScanParam->ucSeqNum;
- rCmdScanReq.ucBssIndex = prScanParam->ucBssIndex;
- rCmdScanReq.ucScanType = (UINT_8) prScanParam->eScanType;
- rCmdScanReq.ucSSIDType = prScanParam->ucSSIDType;
- for (i = 0; i < prScanParam->ucSSIDNum; i++) {
- COPY_SSID(rCmdScanReq.arSSID[i].aucSsid,
- rCmdScanReq.arSSID[i].u4SsidLen,
- prScanParam->aucSpecifiedSSID[i], prScanParam->ucSpecifiedSSIDLen[i]);
- }
- rCmdScanReq.u2ProbeDelayTime = (UINT_8) prScanParam->u2ProbeDelayTime;
- rCmdScanReq.ucChannelType = (UINT_8) prScanParam->eScanChannel;
- if (prScanParam->eScanChannel == SCAN_CHANNEL_SPECIFIED) {
- /* P2P would use:
- * 1. Specified Listen Channel of passive scan for LISTEN state.
- * 2. Specified Listen Channel of Target Device of active scan for SEARCH state. (Target != NULL)
- */
- rCmdScanReq.ucChannelListNum = prScanParam->ucChannelListNum;
- for (i = 0; i < rCmdScanReq.ucChannelListNum; i++) {
- rCmdScanReq.arChannelList[i].ucBand = (UINT_8) prScanParam->arChnlInfoList[i].eBand;
- rCmdScanReq.arChannelList[i].ucChannelNum =
- (UINT_8) prScanParam->arChnlInfoList[i].ucChannelNum;
- }
- }
- rCmdScanReq.u2ChannelDwellTime = prScanParam->u2ChannelDwellTime;
- rCmdScanReq.u2TimeoutValue = prScanParam->u2TimeoutValue;
- if (prScanParam->u2IELen <= MAX_IE_LENGTH)
- rCmdScanReq.u2IELen = prScanParam->u2IELen;
- else
- rCmdScanReq.u2IELen = MAX_IE_LENGTH;
- if (prScanParam->u2IELen)
- kalMemCopy(rCmdScanReq.aucIE, prScanParam->aucIE, sizeof(UINT_8) * rCmdScanReq.u2IELen);
- wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SCAN_REQ_V2,
- TRUE,
- FALSE,
- FALSE,
- NULL,
- NULL,
- OFFSET_OF(CMD_SCAN_REQ_V2, aucIE) + rCmdScanReq.u2IELen, (PUINT_8)&rCmdScanReq, NULL, 0);
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID scnFsmMsgStart(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_SCAN_INFO_T prScanInfo;
- P_SCAN_PARAM_T prScanParam;
- ASSERT(prMsgHdr);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prScanParam = &prScanInfo->rScanParam;
- if (prScanInfo->eCurrentState == SCAN_STATE_IDLE) {
- if (prMsgHdr->eMsgId == MID_AIS_SCN_SCAN_REQ
- || prMsgHdr->eMsgId == MID_BOW_SCN_SCAN_REQ
- || prMsgHdr->eMsgId == MID_P2P_SCN_SCAN_REQ || prMsgHdr->eMsgId == MID_RLM_SCN_SCAN_REQ) {
- scnFsmHandleScanMsg(prAdapter, (P_MSG_SCN_SCAN_REQ) prMsgHdr);
- } else if (prMsgHdr->eMsgId == MID_AIS_SCN_SCAN_REQ_V2
- || prMsgHdr->eMsgId == MID_BOW_SCN_SCAN_REQ_V2
- || prMsgHdr->eMsgId == MID_P2P_SCN_SCAN_REQ_V2
- || prMsgHdr->eMsgId == MID_RLM_SCN_SCAN_REQ_V2) {
- scnFsmHandleScanMsgV2(prAdapter, (P_MSG_SCN_SCAN_REQ_V2) prMsgHdr);
- } else {
- /* should not deliver to this function */
- ASSERT(0);
- }
- cnmMemFree(prAdapter, prMsgHdr);
- scnFsmSteps(prAdapter, SCAN_STATE_SCANNING);
- } else {
- LINK_INSERT_TAIL(&prScanInfo->rPendingMsgList, &prMsgHdr->rLinkEntry);
- }
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID scnFsmMsgAbort(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_MSG_SCN_SCAN_CANCEL prScanCancel;
- P_SCAN_INFO_T prScanInfo;
- P_SCAN_PARAM_T prScanParam;
- CMD_SCAN_CANCEL rCmdScanCancel;
- ASSERT(prMsgHdr);
- prScanCancel = (P_MSG_SCN_SCAN_CANCEL) prMsgHdr;
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prScanParam = &prScanInfo->rScanParam;
- if (prScanInfo->eCurrentState != SCAN_STATE_IDLE) {
- if (prScanCancel->ucSeqNum == prScanParam->ucSeqNum &&
- prScanCancel->ucBssIndex == prScanParam->ucBssIndex) {
- /* send cancel message to firmware domain */
- rCmdScanCancel.ucSeqNum = prScanParam->ucSeqNum;
- rCmdScanCancel.ucIsExtChannel = (UINT_8) prScanCancel->fgIsChannelExt;
- wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SCAN_CANCEL,
- TRUE,
- FALSE,
- FALSE,
- NULL, NULL, sizeof(CMD_SCAN_CANCEL), (PUINT_8)&rCmdScanCancel, NULL, 0);
- /* generate scan-done event for caller */
- scnFsmGenerateScanDoneMsg(prAdapter,
- prScanParam->ucSeqNum,
- prScanParam->ucBssIndex, SCAN_STATUS_CANCELLED);
- /* switch to next pending scan */
- scnFsmSteps(prAdapter, SCAN_STATE_IDLE);
- } else {
- scnFsmRemovePendingMsg(prAdapter, prScanCancel->ucSeqNum, prScanCancel->ucBssIndex);
- }
- }
- cnmMemFree(prAdapter, prMsgHdr);
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief Scan Message Parsing (Legacy)
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID scnFsmHandleScanMsg(IN P_ADAPTER_T prAdapter, IN P_MSG_SCN_SCAN_REQ prScanReqMsg)
- {
- P_SCAN_INFO_T prScanInfo;
- P_SCAN_PARAM_T prScanParam;
- UINT_32 i;
- ASSERT(prAdapter);
- ASSERT(prScanReqMsg);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prScanParam = &prScanInfo->rScanParam;
- prScanParam->eScanType = prScanReqMsg->eScanType;
- prScanParam->ucBssIndex = prScanReqMsg->ucBssIndex;
- prScanParam->ucSSIDType = prScanReqMsg->ucSSIDType;
- if (prScanParam->ucSSIDType & (SCAN_REQ_SSID_SPECIFIED | SCAN_REQ_SSID_P2P_WILDCARD)) {
- prScanParam->ucSSIDNum = 1;
- COPY_SSID(prScanParam->aucSpecifiedSSID[0],
- prScanParam->ucSpecifiedSSIDLen[0], prScanReqMsg->aucSSID, prScanReqMsg->ucSSIDLength);
- /* reset SSID length to zero for rest array entries */
- for (i = 1; i < SCN_SSID_MAX_NUM; i++)
- prScanParam->ucSpecifiedSSIDLen[i] = 0;
- } else {
- prScanParam->ucSSIDNum = 0;
- for (i = 0; i < SCN_SSID_MAX_NUM; i++)
- prScanParam->ucSpecifiedSSIDLen[i] = 0;
- }
- prScanParam->u2ProbeDelayTime = 0;
- prScanParam->eScanChannel = prScanReqMsg->eScanChannel;
- if (prScanParam->eScanChannel == SCAN_CHANNEL_SPECIFIED) {
- if (prScanReqMsg->ucChannelListNum <= MAXIMUM_OPERATION_CHANNEL_LIST)
- prScanParam->ucChannelListNum = prScanReqMsg->ucChannelListNum;
- else
- prScanParam->ucChannelListNum = MAXIMUM_OPERATION_CHANNEL_LIST;
- kalMemCopy(prScanParam->arChnlInfoList,
- prScanReqMsg->arChnlInfoList, sizeof(RF_CHANNEL_INFO_T) * prScanParam->ucChannelListNum);
- }
- if (prScanReqMsg->u2IELen <= MAX_IE_LENGTH)
- prScanParam->u2IELen = prScanReqMsg->u2IELen;
- else
- prScanParam->u2IELen = MAX_IE_LENGTH;
- if (prScanParam->u2IELen)
- kalMemCopy(prScanParam->aucIE, prScanReqMsg->aucIE, prScanParam->u2IELen);
- prScanParam->u2ChannelDwellTime = prScanReqMsg->u2ChannelDwellTime;
- prScanParam->u2TimeoutValue = prScanReqMsg->u2TimeoutValue;
- prScanParam->ucSeqNum = prScanReqMsg->ucSeqNum;
- if (prScanReqMsg->rMsgHdr.eMsgId == MID_RLM_SCN_SCAN_REQ)
- prScanParam->fgIsObssScan = TRUE;
- else
- prScanParam->fgIsObssScan = FALSE;
- prScanParam->fgIsScanV2 = FALSE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief Scan Message Parsing - V2 with multiple SSID support
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID scnFsmHandleScanMsgV2(IN P_ADAPTER_T prAdapter, IN P_MSG_SCN_SCAN_REQ_V2 prScanReqMsg)
- {
- P_SCAN_INFO_T prScanInfo;
- P_SCAN_PARAM_T prScanParam;
- UINT_32 i;
- ASSERT(prAdapter);
- ASSERT(prScanReqMsg);
- ASSERT(prScanReqMsg->ucSSIDNum <= SCN_SSID_MAX_NUM);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prScanParam = &prScanInfo->rScanParam;
- prScanParam->eScanType = prScanReqMsg->eScanType;
- prScanParam->ucBssIndex = prScanReqMsg->ucBssIndex;
- prScanParam->ucSSIDType = prScanReqMsg->ucSSIDType;
- prScanParam->ucSSIDNum = prScanReqMsg->ucSSIDNum;
- for (i = 0; i < prScanReqMsg->ucSSIDNum; i++) {
- COPY_SSID(prScanParam->aucSpecifiedSSID[i],
- prScanParam->ucSpecifiedSSIDLen[i],
- prScanReqMsg->prSsid[i].aucSsid, (UINT_8) prScanReqMsg->prSsid[i].u4SsidLen);
- }
- prScanParam->u2ProbeDelayTime = prScanReqMsg->u2ProbeDelay;
- prScanParam->eScanChannel = prScanReqMsg->eScanChannel;
- if (prScanParam->eScanChannel == SCAN_CHANNEL_SPECIFIED) {
- if (prScanReqMsg->ucChannelListNum <= MAXIMUM_OPERATION_CHANNEL_LIST)
- prScanParam->ucChannelListNum = prScanReqMsg->ucChannelListNum;
- else
- prScanParam->ucChannelListNum = MAXIMUM_OPERATION_CHANNEL_LIST;
- kalMemCopy(prScanParam->arChnlInfoList,
- prScanReqMsg->arChnlInfoList, sizeof(RF_CHANNEL_INFO_T) * prScanParam->ucChannelListNum);
- }
- if (prScanReqMsg->u2IELen <= MAX_IE_LENGTH)
- prScanParam->u2IELen = prScanReqMsg->u2IELen;
- else
- prScanParam->u2IELen = MAX_IE_LENGTH;
- if (prScanParam->u2IELen)
- kalMemCopy(prScanParam->aucIE, prScanReqMsg->aucIE, prScanParam->u2IELen);
- prScanParam->u2ChannelDwellTime = prScanReqMsg->u2ChannelDwellTime;
- prScanParam->u2TimeoutValue = prScanReqMsg->u2TimeoutValue;
- prScanParam->ucSeqNum = prScanReqMsg->ucSeqNum;
- if (prScanReqMsg->rMsgHdr.eMsgId == MID_RLM_SCN_SCAN_REQ)
- prScanParam->fgIsObssScan = TRUE;
- else
- prScanParam->fgIsObssScan = FALSE;
- prScanParam->fgIsScanV2 = TRUE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief Remove pending scan request
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID scnFsmRemovePendingMsg(IN P_ADAPTER_T prAdapter, IN UINT_8 ucSeqNum, IN UINT_8 ucBssIndex)
- {
- P_SCAN_INFO_T prScanInfo;
- P_SCAN_PARAM_T prScanParam;
- P_MSG_HDR_T prPendingMsgHdr, prPendingMsgHdrNext, prRemoveMsgHdr = NULL;
- P_LINK_ENTRY_T prRemoveLinkEntry = NULL;
- BOOLEAN fgIsRemovingScan = FALSE;
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prScanParam = &prScanInfo->rScanParam;
- /* traverse through rPendingMsgList for removal */
- LINK_FOR_EACH_ENTRY_SAFE(prPendingMsgHdr,
- prPendingMsgHdrNext, &(prScanInfo->rPendingMsgList), rLinkEntry, MSG_HDR_T) {
- if (prPendingMsgHdr->eMsgId == MID_AIS_SCN_SCAN_REQ
- || prPendingMsgHdr->eMsgId == MID_BOW_SCN_SCAN_REQ
- || prPendingMsgHdr->eMsgId == MID_P2P_SCN_SCAN_REQ
- || prPendingMsgHdr->eMsgId == MID_RLM_SCN_SCAN_REQ) {
- P_MSG_SCN_SCAN_REQ prScanReqMsg = (P_MSG_SCN_SCAN_REQ) prPendingMsgHdr;
- if (ucSeqNum == prScanReqMsg->ucSeqNum && ucBssIndex == prScanReqMsg->ucBssIndex) {
- prRemoveLinkEntry = &(prScanReqMsg->rMsgHdr.rLinkEntry);
- prRemoveMsgHdr = prPendingMsgHdr;
- fgIsRemovingScan = TRUE;
- }
- } else if (prPendingMsgHdr->eMsgId == MID_AIS_SCN_SCAN_REQ_V2
- || prPendingMsgHdr->eMsgId == MID_BOW_SCN_SCAN_REQ_V2
- || prPendingMsgHdr->eMsgId == MID_P2P_SCN_SCAN_REQ_V2
- || prPendingMsgHdr->eMsgId == MID_RLM_SCN_SCAN_REQ_V2) {
- P_MSG_SCN_SCAN_REQ_V2 prScanReqMsgV2 = (P_MSG_SCN_SCAN_REQ_V2) prPendingMsgHdr;
- if (ucSeqNum == prScanReqMsgV2->ucSeqNum && ucBssIndex == prScanReqMsgV2->ucBssIndex) {
- prRemoveLinkEntry = &(prScanReqMsgV2->rMsgHdr.rLinkEntry);
- prRemoveMsgHdr = prPendingMsgHdr;
- fgIsRemovingScan = TRUE;
- }
- }
- if (prRemoveLinkEntry) {
- if (fgIsRemovingScan == TRUE) {
- /* generate scan-done event for caller */
- scnFsmGenerateScanDoneMsg(prAdapter, ucSeqNum, ucBssIndex, SCAN_STATUS_CANCELLED);
- }
- /* remove from pending list */
- LINK_REMOVE_KNOWN_ENTRY(&(prScanInfo->rPendingMsgList), prRemoveLinkEntry);
- cnmMemFree(prAdapter, prRemoveMsgHdr);
- break;
- }
- }
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID scnEventScanDone(IN P_ADAPTER_T prAdapter, IN P_EVENT_SCAN_DONE prScanDone, BOOLEAN fgIsNewVersion)
- {
- P_SCAN_INFO_T prScanInfo;
- P_SCAN_PARAM_T prScanParam;
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prScanParam = &prScanInfo->rScanParam;
- cnmTimerStopTimer(prAdapter, &prScanInfo->rScanDoneTimer);
- prScanInfo->ucScanDoneTimeoutCnt = 0;
- if (fgIsNewVersion)
- DBGLOG(SCN, INFO,
- "New scnEventScanDone Version%d! ChanCount=%d,CurState=%d, PNO=%d\n",
- prScanDone->ucScanDoneVersion, prScanDone->ucCompleteChanCount,
- prScanDone->ucCurrentState, prScanDone->fgIsPNOenabled);
- else
- DBGLOG(SCN, INFO, "Old scnEventScanDone Version\n");
- /* buffer empty channel information */
- if (prScanParam->eScanChannel == SCAN_CHANNEL_FULL || prScanParam->eScanChannel == SCAN_CHANNEL_2G4) {
- if (prScanDone->ucSparseChannelValid) {
- prScanInfo->fgIsSparseChannelValid = TRUE;
- prScanInfo->rSparseChannel.eBand = (ENUM_BAND_T) prScanDone->rSparseChannel.ucBand;
- prScanInfo->rSparseChannel.ucChannelNum = prScanDone->rSparseChannel.ucChannelNum;
- } else {
- prScanInfo->fgIsSparseChannelValid = FALSE;
- }
- }
- if (prScanInfo->eCurrentState == SCAN_STATE_SCANNING && prScanDone->ucSeqNum == prScanParam->ucSeqNum) {
- /* generate scan-done event for caller */
- scnFsmGenerateScanDoneMsg(prAdapter, prScanParam->ucSeqNum, prScanParam->ucBssIndex, SCAN_STATUS_DONE);
- /* switch to next pending scan */
- scnFsmSteps(prAdapter, SCAN_STATE_IDLE);
- } else {
- DBGLOG(SCN, WARN, "Unexpected SCAN-DONE event: SeqNum = %d, Current State = %d\n",
- prScanDone->ucSeqNum, prScanInfo->eCurrentState);
- }
- } /* end of scnEventScanDone */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID
- scnFsmGenerateScanDoneMsg(IN P_ADAPTER_T prAdapter,
- IN UINT_8 ucSeqNum, IN UINT_8 ucBssIndex, IN ENUM_SCAN_STATUS eScanStatus)
- {
- P_SCAN_INFO_T prScanInfo;
- P_SCAN_PARAM_T prScanParam;
- P_MSG_SCN_SCAN_DONE prScanDoneMsg;
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prScanParam = &prScanInfo->rScanParam;
- prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_DONE));
- if (!prScanDoneMsg) {
- ASSERT(0); /* Can't indicate SCAN FSM Complete */
- return;
- }
- if (prScanParam->fgIsObssScan == TRUE) {
- prScanDoneMsg->rMsgHdr.eMsgId = MID_SCN_RLM_SCAN_DONE;
- } else {
- switch (GET_BSS_INFO_BY_INDEX(prAdapter, ucBssIndex)->eNetworkType) {
- case NETWORK_TYPE_AIS:
- prScanDoneMsg->rMsgHdr.eMsgId = MID_SCN_AIS_SCAN_DONE;
- break;
- case NETWORK_TYPE_P2P:
- prScanDoneMsg->rMsgHdr.eMsgId = MID_SCN_P2P_SCAN_DONE;
- break;
- case NETWORK_TYPE_BOW:
- prScanDoneMsg->rMsgHdr.eMsgId = MID_SCN_BOW_SCAN_DONE;
- break;
- default:
- DBGLOG(SCN, LOUD,
- "Unexpected Network Type: %d\n",
- GET_BSS_INFO_BY_INDEX(prAdapter, ucBssIndex)->eNetworkType);
- ASSERT(0);
- break;
- }
- }
- prScanDoneMsg->ucSeqNum = ucSeqNum;
- prScanDoneMsg->ucBssIndex = ucBssIndex;
- prScanDoneMsg->eScanStatus = eScanStatus;
- mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prScanDoneMsg, MSG_SEND_METHOD_BUF);
- } /* end of scnFsmGenerateScanDoneMsg() */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief Query for most sparse channel
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN scnQuerySparseChannel(IN P_ADAPTER_T prAdapter, P_ENUM_BAND_T prSparseBand, PUINT_8 pucSparseChannel)
- {
- P_SCAN_INFO_T prScanInfo;
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- if (prScanInfo->fgIsSparseChannelValid == TRUE) {
- if (prSparseBand)
- *prSparseBand = prScanInfo->rSparseChannel.eBand;
- if (pucSparseChannel)
- *pucSparseChannel = prScanInfo->rSparseChannel.ucChannelNum;
- return TRUE;
- } else {
- return FALSE;
- }
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief Event handler for NLO done event
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID scnEventNloDone(IN P_ADAPTER_T prAdapter, IN P_EVENT_NLO_DONE_T prNloDone)
- {
- P_SCAN_INFO_T prScanInfo;
- P_NLO_PARAM_T prNloParam;
- P_SCAN_PARAM_T prScanParam;
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prNloParam = &prScanInfo->rNloParam;
- prScanParam = &prNloParam->rScanParam;
- if (prScanInfo->fgNloScanning == TRUE && prNloDone->ucSeqNum == prScanParam->ucSeqNum) {
- DBGLOG(SCN, INFO, "scnEventNloDone reporting to uplayer\n");
- kalSchedScanResults(prAdapter->prGlueInfo);
- if (prNloParam->fgStopAfterIndication == TRUE)
- prScanInfo->fgNloScanning = FALSE;
- } else {
- DBGLOG(SCN, INFO, "Unexpected NLO-DONE event: SeqNum = %d, Current State = %d\n",
- prNloDone->ucSeqNum, prScanInfo->eCurrentState);
- }
- }
- #if 0
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief OID handler for starting scheduled scan
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN
- scnFsmSchedScanRequest(IN P_ADAPTER_T prAdapter,
- IN UINT_8 ucSsidNum,
- IN P_PARAM_SSID_T prSsid, IN UINT_32 u4IeLength, IN PUINT_8 pucIe, IN UINT_16 u2Interval)
- {
- P_SCAN_INFO_T prScanInfo;
- P_NLO_PARAM_T prNloParam;
- P_SCAN_PARAM_T prScanParam;
- P_CMD_NLO_REQ prCmdNloReq;
- UINT_32 i, j;
- ASSERT(prAdapter);
- DBGLOG(SCN, INFO, "scnFsmSchedScanRequest\n");
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prNloParam = &prScanInfo->rNloParam;
- prScanParam = &prNloParam->rScanParam;
- /* ASSERT(prScanInfo->fgNloScanning == FALSE); */
- if (prScanInfo->fgNloScanning) {
- DBGLOG(SCN, INFO, ("prScanInfo->fgNloScanning already scanning\n"));
- return FALSE;
- }
- prScanInfo->fgNloScanning = TRUE;
- /* 1. load parameters */
- prScanParam->ucSeqNum++;
- prScanParam->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
- prNloParam->fgStopAfterIndication = TRUE;
- prNloParam->ucFastScanIteration = 0;
- if (u2Interval < SCAN_NLO_DEFAULT_INTERVAL) {
- u2Interval = SCAN_NLO_DEFAULT_INTERVAL;
- DBGLOG(SCN, INFO, "force interval to SCAN_NLO_DEFAULT_INTERVAL\n");
- }
- prAdapter->prAisBssInfo->fgIsPNOEnable = TRUE;
- if (!IS_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex)) {
- SET_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
- DBGLOG(SCN, INFO, "ACTIVE AIS from INACTIVE to enable PNO\n");
- /* sync with firmware */
- nicActivateNetwork(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
- }
- prNloParam->u2FastScanPeriod = u2Interval;
- prNloParam->u2SlowScanPeriod = u2Interval;
- if (prScanParam->ucSSIDNum > CFG_SCAN_SSID_MAX_NUM)
- prScanParam->ucSSIDNum = CFG_SCAN_SSID_MAX_NUM;
- else
- prScanParam->ucSSIDNum = ucSsidNum;
- if (prNloParam->ucMatchSSIDNum > CFG_SCAN_SSID_MATCH_MAX_NUM)
- prNloParam->ucMatchSSIDNum = CFG_SCAN_SSID_MATCH_MAX_NUM;
- else
- prNloParam->ucMatchSSIDNum = ucSsidNum;
- for (i = 0; i < prNloParam->ucMatchSSIDNum; i++) {
- if (i < CFG_SCAN_SSID_MAX_NUM) {
- COPY_SSID(prScanParam->aucSpecifiedSSID[i],
- prScanParam->ucSpecifiedSSIDLen[i], prSsid[i].aucSsid, (UINT_8) prSsid[i].u4SsidLen);
- }
- COPY_SSID(prNloParam->aucMatchSSID[i],
- prNloParam->ucMatchSSIDLen[i], prSsid[i].aucSsid, (UINT_8) prSsid[i].u4SsidLen);
- /* for linux the Ciper,Auth Algo will be zero */
- prNloParam->aucCipherAlgo[i] = 0;
- prNloParam->au2AuthAlgo[i] = 0;
- for (j = 0; j < SCN_NLO_NETWORK_CHANNEL_NUM; j++)
- prNloParam->aucChannelHint[i][j] = 0;
- }
- /* 2. prepare command for sending */
- prCmdNloReq = (P_CMD_NLO_REQ) cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_NLO_REQ) + prScanParam->u2IELen);
- if (!prCmdNloReq) {
- ASSERT(0); /* Can't initiate NLO operation */
- return FALSE;
- }
- /* 3. send command packet for NLO operation */
- kalMemZero(prCmdNloReq, sizeof(CMD_NLO_REQ));
- prCmdNloReq->ucSeqNum = prScanParam->ucSeqNum;
- prCmdNloReq->ucBssIndex = prScanParam->ucBssIndex;
- prCmdNloReq->fgStopAfterIndication = prNloParam->fgStopAfterIndication;
- prCmdNloReq->ucFastScanIteration = prNloParam->ucFastScanIteration;
- prCmdNloReq->u2FastScanPeriod = prNloParam->u2FastScanPeriod;
- prCmdNloReq->u2SlowScanPeriod = prNloParam->u2SlowScanPeriod;
- prCmdNloReq->ucEntryNum = prNloParam->ucMatchSSIDNum;
- #ifdef LINUX
- prCmdNloReq->ucFlag = SCAN_NLO_CHECK_SSID_ONLY;
- DBGLOG(SCN, INFO, "LINUX only check SSID for PNO SCAN\n");
- #endif
- for (i = 0; i < prNloParam->ucMatchSSIDNum; i++) {
- COPY_SSID(prCmdNloReq->arNetworkList[i].aucSSID,
- prCmdNloReq->arNetworkList[i].ucSSIDLength,
- prNloParam->aucMatchSSID[i], prNloParam->ucMatchSSIDLen[i]);
- prCmdNloReq->arNetworkList[i].ucCipherAlgo = prNloParam->aucCipherAlgo[i];
- prCmdNloReq->arNetworkList[i].u2AuthAlgo = prNloParam->au2AuthAlgo[i];
- DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].aucSSID %s\n", prCmdNloReq->arNetworkList[i].aucSSID);
- DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].ucSSIDLength %d\n",
- prCmdNloReq->arNetworkList[i].ucSSIDLength);
- DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].ucCipherAlgo %d\n",
- prCmdNloReq->arNetworkList[i].ucCipherAlgo);
- DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].u2AuthAlgo %d\n",
- prCmdNloReq->arNetworkList[i].u2AuthAlgo);
- for (j = 0; j < SCN_NLO_NETWORK_CHANNEL_NUM; j++)
- prCmdNloReq->arNetworkList[i].ucNumChannelHint[j] = prNloParam->aucChannelHint[i][j];
- }
- if (prScanParam->u2IELen <= MAX_IE_LENGTH)
- prCmdNloReq->u2IELen = prScanParam->u2IELen;
- else
- prCmdNloReq->u2IELen = MAX_IE_LENGTH;
- if (prScanParam->u2IELen)
- kalMemCopy(prCmdNloReq->aucIE, prScanParam->aucIE, sizeof(UINT_8) * prCmdNloReq->u2IELen);
- if (wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_NLO_REQ,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_NLO_REQ) + prCmdNloReq->u2IELen,
- (PUINT_8) prCmdNloReq, NULL, 0) != WLAN_STATUS_FAILURE) {
- cnmMemFree(prAdapter, (PVOID) prCmdNloReq);
- } else {
- cnmMemFree(prAdapter, (PVOID) prCmdNloReq);
- return FALSE;
- }
- return TRUE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief OID handler for stopping scheduled scan
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN scnFsmSchedScanStopRequest(IN P_ADAPTER_T prAdapter)
- {
- P_SCAN_INFO_T prScanInfo;
- P_NLO_PARAM_T prNloParam;
- P_SCAN_PARAM_T prScanParam;
- CMD_NLO_CANCEL rCmdNloCancel;
- WLAN_STATUS rStatus;
- ASSERT(prAdapter);
- DBGLOG(SCN, INFO, "scnFsmSchedScanStopRequest\n");
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prNloParam = &prScanInfo->rNloParam;
- prScanParam = &prNloParam->rScanParam;
- if (prAdapter->prAisBssInfo->fgIsNetRequestInActive && prAdapter->prAisBssInfo->fgIsPNOEnable) {
- UNSET_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
- DBGLOG(SCN, INFO, "INACTIVE AIS from ACTIVE to DISABLE PNO\n");
- /* sync with firmware */
- nicDeactivateNetwork(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
- } else {
- DBGLOG(SCN, INFO,
- "fgIsNetRequestInActive %d, fgIsPNOEnable %d\n",
- prAdapter->prAisBssInfo->fgIsNetRequestInActive, prAdapter->prAisBssInfo->fgIsPNOEnable);
- }
- prAdapter->prAisBssInfo->fgIsPNOEnable = FALSE;
- /* send cancel message to firmware domain */
- rCmdNloCancel.ucSeqNum = prScanParam->ucSeqNum;
- rStatus = wlanSendSetQueryCmd(prAdapter, CMD_ID_SET_NLO_CANCEL, TRUE, FALSE, TRUE, nicCmdEventSetStopSchedScan,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_NLO_CANCEL), (PUINT_8) &rCmdNloCancel, NULL, 0);
- prScanInfo->fgNloScanning = FALSE;
- if (rStatus != WLAN_STATUS_FAILURE)
- return TRUE;
- else
- return FALSE;
- }
- #endif
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for starting scheduled scan
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN
- scnFsmSchedScanRequest(IN P_ADAPTER_T prAdapter,
- IN UINT_8 ucSsidNum,
- IN P_PARAM_SSID_T prSsid, IN UINT_32 u4IeLength, IN PUINT_8 pucIe, IN UINT_16 u2Interval)
- {
- P_SCAN_INFO_T prScanInfo;
- P_NLO_PARAM_T prNloParam;
- P_SCAN_PARAM_T prScanParam;
- P_CMD_NLO_REQ prCmdNloReq;
- UINT_32 i, j;
- ASSERT(prAdapter);
- DBGLOG(SCN, INFO, "scnFsmSchedScanRequest\n");
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prNloParam = &prScanInfo->rNloParam;
- prScanParam = &prNloParam->rScanParam;
- /* ASSERT(prScanInfo->fgNloScanning == FALSE); */
- if (prScanInfo->fgNloScanning) {
- DBGLOG(SCN, INFO, "prScanInfo->fgNloScanning == FALSE already scanning\n");
- return FALSE;
- }
- prScanInfo->fgNloScanning = TRUE;
- /* 1. load parameters */
- prScanParam->ucSeqNum++;
- prScanParam->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
- prNloParam->fgStopAfterIndication = TRUE;
- prNloParam->ucFastScanIteration = 0;
- if (u2Interval < SCAN_NLO_DEFAULT_INTERVAL) {
- u2Interval = SCAN_NLO_DEFAULT_INTERVAL;
- DBGLOG(SCN, INFO, "force interval to SCAN_NLO_DEFAULT_INTERVAL\n");
- }
- prAdapter->prAisBssInfo->fgIsPNOEnable = TRUE;
- #if !CFG_SUPPORT_SCN_PSCN
- if (!IS_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex)) {
- SET_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
- DBGLOG(SCN, INFO, "ACTIVE AIS from INACTIVE to enable PNO\n");
- /* sync with firmware */
- nicActivateNetwork(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
- }
- #endif
- prNloParam->u2FastScanPeriod = u2Interval;
- prNloParam->u2SlowScanPeriod = u2Interval;
- if (prScanParam->ucSSIDNum > CFG_SCAN_SSID_MAX_NUM)
- prScanParam->ucSSIDNum = CFG_SCAN_SSID_MAX_NUM;
- else
- prScanParam->ucSSIDNum = ucSsidNum;
- if (prNloParam->ucMatchSSIDNum > CFG_SCAN_SSID_MATCH_MAX_NUM)
- prNloParam->ucMatchSSIDNum = CFG_SCAN_SSID_MATCH_MAX_NUM;
- else
- prNloParam->ucMatchSSIDNum = ucSsidNum;
- for (i = 0; i < prNloParam->ucMatchSSIDNum; i++) {
- if (i < CFG_SCAN_SSID_MAX_NUM) {
- COPY_SSID(prScanParam->aucSpecifiedSSID[i],
- prScanParam->ucSpecifiedSSIDLen[i], prSsid[i].aucSsid, (UINT_8) prSsid[i].u4SsidLen);
- }
- COPY_SSID(prNloParam->aucMatchSSID[i],
- prNloParam->ucMatchSSIDLen[i], prSsid[i].aucSsid, (UINT_8) prSsid[i].u4SsidLen);
- /* for linux the Ciper,Auth Algo will be zero */
- prNloParam->aucCipherAlgo[i] = 0;
- prNloParam->au2AuthAlgo[i] = 0;
- for (j = 0; j < SCN_NLO_NETWORK_CHANNEL_NUM; j++)
- prNloParam->aucChannelHint[i][j] = 0;
- }
- /* 2. prepare command for sending */
- prCmdNloReq = (P_CMD_NLO_REQ) cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_NLO_REQ) + prScanParam->u2IELen);
- if (!prCmdNloReq) {
- ASSERT(0); /* Can't initiate NLO operation */
- return FALSE;
- }
- /* 3. send command packet for NLO operation */
- kalMemZero(prCmdNloReq, sizeof(CMD_NLO_REQ));
- prCmdNloReq->ucSeqNum = prScanParam->ucSeqNum;
- prCmdNloReq->ucBssIndex = prScanParam->ucBssIndex;
- prCmdNloReq->fgStopAfterIndication = prNloParam->fgStopAfterIndication;
- prCmdNloReq->ucFastScanIteration = prNloParam->ucFastScanIteration;
- prCmdNloReq->u2FastScanPeriod = prNloParam->u2FastScanPeriod;
- prCmdNloReq->u2SlowScanPeriod = prNloParam->u2SlowScanPeriod;
- prCmdNloReq->ucEntryNum = prNloParam->ucMatchSSIDNum;
- #ifdef LINUX
- prCmdNloReq->ucFlag = SCAN_NLO_CHECK_SSID_ONLY;
- DBGLOG(SCN, INFO, "LINUX only check SSID for PNO SCAN\n");
- #endif
- for (i = 0; i < prNloParam->ucMatchSSIDNum; i++) {
- COPY_SSID(prCmdNloReq->arNetworkList[i].aucSSID,
- prCmdNloReq->arNetworkList[i].ucSSIDLength,
- prNloParam->aucMatchSSID[i], prNloParam->ucMatchSSIDLen[i]);
- prCmdNloReq->arNetworkList[i].ucCipherAlgo = prNloParam->aucCipherAlgo[i];
- prCmdNloReq->arNetworkList[i].u2AuthAlgo = prNloParam->au2AuthAlgo[i];
- DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].aucSSID %s\n", prCmdNloReq->arNetworkList[i].aucSSID);
- DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].ucSSIDLength %d\n",
- prCmdNloReq->arNetworkList[i].ucSSIDLength);
- DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].ucCipherAlgo %d\n",
- prCmdNloReq->arNetworkList[i].ucCipherAlgo);
- DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].u2AuthAlgo %d\n",
- prCmdNloReq->arNetworkList[i].u2AuthAlgo);
- for (j = 0; j < SCN_NLO_NETWORK_CHANNEL_NUM; j++)
- prCmdNloReq->arNetworkList[i].ucNumChannelHint[j] = prNloParam->aucChannelHint[i][j];
- }
- if (prScanParam->u2IELen <= MAX_IE_LENGTH)
- prCmdNloReq->u2IELen = prScanParam->u2IELen;
- else
- prCmdNloReq->u2IELen = MAX_IE_LENGTH;
- if (prScanParam->u2IELen)
- kalMemCopy(prCmdNloReq->aucIE, prScanParam->aucIE, sizeof(UINT_8) * prCmdNloReq->u2IELen);
- #if !CFG_SUPPORT_SCN_PSCN
- if (wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_NLO_REQ,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetCommon,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_NLO_REQ) + prCmdNloReq->u2IELen,
- (PUINT_8) prCmdNloReq, NULL, 0) != WLAN_STATUS_FAILURE)
- return TRUE;
- else
- return FALSE;
- #else
- scnPSCNFsm(prAdapter, PSCN_RESET, prCmdNloReq, NULL, NULL, NULL, FALSE, FALSE, FALSE, FALSE);
- #endif
- cnmMemFree(prAdapter, (PVOID) prCmdNloReq);
- return TRUE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for stopping scheduled scan
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN scnFsmSchedScanStopRequest(IN P_ADAPTER_T prAdapter)
- {
- P_SCAN_INFO_T prScanInfo;
- P_NLO_PARAM_T prNloParam;
- P_SCAN_PARAM_T prScanParam;
- CMD_NLO_CANCEL rCmdNloCancel;
- ASSERT(prAdapter);
- DBGLOG(SCN, INFO, "scnFsmSchedScanStopRequest\n");
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prNloParam = &prScanInfo->rNloParam;
- prScanParam = &prNloParam->rScanParam;
- if (prAdapter->prAisBssInfo->fgIsNetRequestInActive && prAdapter->prAisBssInfo->fgIsPNOEnable) {
- UNSET_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
- DBGLOG(SCN, INFO, "INACTIVE AIS from ACTIVE to DISABLE PNO\n");
- /* sync with firmware */
- nicDeactivateNetwork(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
- } else {
- DBGLOG(SCN, INFO, "fgIsNetRequestInActive %d, fgIsPNOEnable %d\n",
- prAdapter->prAisBssInfo->fgIsNetRequestInActive, prAdapter->prAisBssInfo->fgIsPNOEnable);
- }
- prAdapter->prAisBssInfo->fgIsPNOEnable = FALSE;
- /* send cancel message to firmware domain */
- rCmdNloCancel.ucSeqNum = prScanParam->ucSeqNum;
- #if !CFG_SUPPORT_SCN_PSCN
- if (wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_NLO_CANCEL,
- TRUE,
- FALSE,
- TRUE,
- nicCmdEventSetStopSchedScan,
- nicOidCmdTimeoutCommon,
- sizeof(CMD_NLO_CANCEL), (PUINT_8) (&rCmdNloCancel), NULL, 0) != WLAN_STATUS_FAILURE)
- return TRUE;
- else
- return FALSE;
- #else
- scnPSCNFsm(prAdapter, PSCN_RESET, NULL, NULL, NULL, NULL, TRUE, FALSE, FALSE, FALSE);
- prScanInfo->fgNloScanning = FALSE;
- return TRUE;
- #endif
- }
- #if CFG_SUPPORT_GSCN
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for Set PSCN action
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN scnFsmPSCNAction(IN P_ADAPTER_T prAdapter, IN UINT_8 ucPscanAct)
- {
- CMD_SET_PSCAN_ENABLE rCmdPscnAction;
- P_SCAN_INFO_T prScanInfo;
- rCmdPscnAction.ucPscanAct = ucPscanAct;
- DBGLOG(SCN, INFO, "scnFsmPSCNAction Act = %d\n", ucPscanAct);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- if (ucPscanAct == DISABLE)
- prScanInfo->fgPscnOnnning = FALSE;
- if (ucPscanAct == ENABLE)
- prScanInfo->fgPscnOnnning = TRUE;
- wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_PSCN_ENABLE,
- TRUE,
- FALSE, TRUE, NULL, NULL, sizeof(CMD_SET_PSCAN_ENABLE),
- (PUINT_8) (&rCmdPscnAction), NULL, 0);
- DBGLOG(SCN, INFO, "scnFsmPSCNAction Act = %d is Set to FW\n", ucPscanAct);
- return TRUE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for Set PSCN param
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN scnFsmPSCNSetParam(IN P_ADAPTER_T prAdapter, IN P_CMD_SET_PSCAN_PARAM prCmdPscnParam)
- {
- UINT_8 i, j;
- DEBUGFUNC("scnFsmPSCNSetParam()");
- DBGLOG(SCN, INFO, "scnFsmPSCNSetParam\n");
- ASSERT(prAdapter);
- prCmdPscnParam->u4BasePeriod = prCmdPscnParam->u4BasePeriod;
- #if 1
- DBGLOG(SCN, INFO,
- "rCmdPscnParam.rCmdGscnParam : u4BasePeriod[%u], ucNumScnToCache[%u], u4BufferThreshold[%u], u4NumBuckets[%u],fgGSCN[%d] fgNLO[%d] fgBatch[%d]\n",
- prCmdPscnParam->rCmdGscnReq.u4BasePeriod,
- prCmdPscnParam->rCmdGscnReq.ucNumScnToCache,
- prCmdPscnParam->rCmdGscnReq.u4BufferThreshold,
- prCmdPscnParam->rCmdGscnReq.u4NumBuckets, prCmdPscnParam->fgGScnEnable,
- prCmdPscnParam->fgNLOScnEnable, prCmdPscnParam->fgBatchScnEnable);
- i = j = 0;
- for (i = 0; i < prCmdPscnParam->rCmdGscnReq.u4NumBuckets; i++) {
- DBGLOG(SCN, INFO,
- "rCmdPscnParam.rCmdGscnReq.arChannelBucket[%d] : band[%u], arChannelBucket[%u] ucNumChannels[%u], ucBucketFreqMultiple[%u] ucReportFlag[%u]\n",
- i, prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].eBand,
- prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].u2BucketIndex,
- prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucNumChannels,
- prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucBucketFreqMultiple,
- prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucReportFlag);
- DBGLOG(SCN, INFO, "rCmdPscnParam.rCmdGscnParam.arChannelBucket[%d] has channel: ", i);
- for (j = 0; j < prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucNumChannels; j++) {
- DBGLOG(SCN, INFO, " %d, ",
- prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].arChannelList[j].ucChannel);
- }
- DBGLOG(SCN, INFO, "\n");
- }
- #endif
- if (1 /*prScanInfo->fgPscnOnnning == FALSE */) {
- wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_PSCAN_PARAM,
- TRUE,
- FALSE,
- TRUE, NULL, NULL, sizeof(CMD_SET_PSCAN_PARAM), (PUINT_8) prCmdPscnParam, NULL, 0);
- DBGLOG(SCN, INFO, "CMD_ID_SET_PSCAN_PARAM is set to FW !!!!!!!!!!\n");
- return TRUE;
- } else
- return FALSE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for Set hotlist
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN scnFsmPSCNSetHotlist(IN P_ADAPTER_T prAdapter, IN P_CMD_SET_PSCAN_ADD_HOTLIST_BSSID prCmdPscnAddHotlist)
- {
- CMD_SET_PSCAN_ADD_HOTLIST_BSSID rCmdPscnAddHotlist;
- P_SCAN_INFO_T prScanInfo;
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- memcpy(&rCmdPscnAddHotlist.aucMacAddr, &(prCmdPscnAddHotlist->aucMacAddr), sizeof(MAC_ADDR_LEN));
- /* rCmdPscnAddHotlist.aucMacAddr = prCmdPscnAddHotlist->aucMacAddr; */
- rCmdPscnAddHotlist.ucFlags = prCmdPscnAddHotlist->ucFlags;
- if (prScanInfo->fgPscnOnnning && prScanInfo->prPscnParam->fgGScnEnable) {
- wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_PSCN_ADD_HOTLIST_BSSID,
- TRUE,
- FALSE,
- TRUE,
- NULL,
- NULL,
- sizeof(CMD_SET_PSCAN_ADD_HOTLIST_BSSID), (PUINT_8) (&rCmdPscnAddHotlist), NULL, 0);
- } else {
- /* debug msg, No PSCN, Sched SCAN no need to add the hotlist ??? */
- return FALSE;
- }
- return TRUE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for Set CMD_ID_SET_PSCN_ADD_SW_BSSID
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN scnFsmPSCNAddSWCBssId(IN P_ADAPTER_T prAdapter, IN P_CMD_SET_PSCAN_ADD_SWC_BSSID prCmdPscnAddSWCBssId)
- {
- CMD_SET_PSCAN_ADD_SWC_BSSID rCmdPscnAddSWCBssId;
- P_SCAN_INFO_T prScanInfo;
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- memcpy(&rCmdPscnAddSWCBssId.aucMacAddr, &(prCmdPscnAddSWCBssId->aucMacAddr), sizeof(MAC_ADDR_LEN));
- /* rCmdPscnAddSWCBssId.aucMacAddr = prCmdPscnAddSWCBssId->aucMacAddr; */
- rCmdPscnAddSWCBssId.i4RssiHighThreshold = prCmdPscnAddSWCBssId->i4RssiHighThreshold;
- rCmdPscnAddSWCBssId.i4RssiLowThreshold = prCmdPscnAddSWCBssId->i4RssiLowThreshold;
- if (prScanInfo->fgPscnOnnning && prScanInfo->prPscnParam->fgGScnEnable) {
- wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_PSCN_ADD_SW_BSSID,
- TRUE,
- FALSE,
- TRUE,
- NULL,
- NULL,
- sizeof(CMD_SET_PSCAN_ADD_SWC_BSSID), (PUINT_8) (&rCmdPscnAddSWCBssId), NULL, 0);
- } else {
- /* debug msg, No PSCN, Sched SCAN no need to add the hotlist ??? */
- return FALSE;
- }
- return TRUE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for Set CMD_ID_SET_PSCN_MAC_ADDR
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN scnFsmPSCNSetMacAddr(IN P_ADAPTER_T prAdapter, IN P_CMD_SET_PSCAN_MAC_ADDR prCmdPscnSetMacAddr)
- {
- CMD_SET_PSCAN_MAC_ADDR rCmdPscnSetMacAddr;
- P_SCAN_INFO_T prScanInfo;
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- /* rCmdPscnSetMacAddr.aucMacAddr = prCmdPscnSetMacAddr->aucMacAddr; */
- memcpy(&rCmdPscnSetMacAddr.aucMacAddr, &(prCmdPscnSetMacAddr->aucMacAddr), sizeof(MAC_ADDR_LEN));
- rCmdPscnSetMacAddr.ucFlags = prCmdPscnSetMacAddr->ucFlags;
- rCmdPscnSetMacAddr.ucVersion = prCmdPscnSetMacAddr->ucVersion;
- if (1 /* (prScanInfo->fgPscnOnnning == TRUE */) {
- wlanSendSetQueryCmd(prAdapter,
- CMD_ID_SET_PSCN_MAC_ADDR,
- TRUE,
- FALSE,
- TRUE,
- NULL,
- NULL, sizeof(CMD_SET_PSCAN_MAC_ADDR), (PUINT_8) (&rCmdPscnSetMacAddr), NULL, 0);
- } else {
- /* debug msg, No PSCN, Sched SCAN no need to add the hotlist ??? */
- return FALSE;
- }
- return TRUE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for Set GSCN param
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN scnSetGSCNParam(IN P_ADAPTER_T prAdapter, IN P_PARAM_WIFI_GSCAN_CMD_PARAMS prCmdGscnParam)
- {
- CMD_GSCN_REQ_T rCmdGscnParam;
- P_SCAN_INFO_T prScanInfo;
- UINT_8 ucChannelBuckIndex = 0;
- UINT_8 i = 0;
- DBGLOG(SCN, INFO, "scnSetGSCNParam\n");
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- rCmdGscnParam.u4NumBuckets = prCmdGscnParam->num_buckets;
- rCmdGscnParam.u4BasePeriod = prCmdGscnParam->base_period;
- DBGLOG(SCN, INFO, "u4BasePeriod[%d], u4NumBuckets[%d]: ", rCmdGscnParam.u4BasePeriod,
- rCmdGscnParam.u4NumBuckets);
- DBGLOG(SCN, INFO, "\n");
- for (ucChannelBuckIndex = 0; ucChannelBuckIndex < prCmdGscnParam->num_buckets; ucChannelBuckIndex++) {
- DBGLOG(SCN, INFO, "assign channels to bucket[%d]:\n", ucChannelBuckIndex);
- for (i = 0; i < prCmdGscnParam->buckets[ucChannelBuckIndex].num_channels; i++) {
- rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].arChannelList[i].ucChannel =
- (UINT_8) nicFreq2ChannelNum(prCmdGscnParam->buckets[ucChannelBuckIndex].
- channels[i].channel * 1000);
- rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].arChannelList[i].ucPassive =
- (UINT_8) prCmdGscnParam->buckets[ucChannelBuckIndex].channels[i].passive;
- rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].arChannelList[i].u4DwellTimeMs =
- (UINT_8) prCmdGscnParam->buckets[ucChannelBuckIndex].channels[i].dwellTimeMs;
- DBGLOG(SCN, INFO, " [ucChannel %d, ucPassive %d, u4DwellTimeMs %d\n",
- rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].arChannelList[i].ucChannel,
- rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].arChannelList[i].ucPassive,
- rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].arChannelList[i].u4DwellTimeMs);
- }
- rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].u2BucketIndex =
- (UINT_16) prCmdGscnParam->buckets[ucChannelBuckIndex].bucket;
- rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].eBand =
- prCmdGscnParam->buckets[ucChannelBuckIndex].band;
- rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].ucBucketFreqMultiple =
- (prCmdGscnParam->buckets[ucChannelBuckIndex].period / prCmdGscnParam->base_period);
- rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].ucNumChannels =
- prCmdGscnParam->buckets[ucChannelBuckIndex].num_channels;
- rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].ucReportFlag =
- prCmdGscnParam->buckets[ucChannelBuckIndex].report_events;
- /* TODO: This is not make sense at all, always return true*/
- }
- DBGLOG(SCN, INFO, "scnSetGSCNParam ---> scnPSCNFsm PSCN_RESET\n");
- DBGLOG(SCN, INFO, "/* setup new PSCN cmd */\n");
- DBGLOG(SCN, INFO, "scnSetGSCNParam ---> scnPSCNFsm PSCN_RESET\n");
- DBGLOG(SCN, INFO, "/* setup new PSCN cmd */\n");
- scnPSCNFsm(prAdapter, PSCN_RESET, NULL, NULL, &rCmdGscnParam, NULL, FALSE, FALSE, FALSE, FALSE);
- DBGLOG(SCN, INFO, "scnSetGSCNParam <-----\n");
- return TRUE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for Combine PNO Scan params into PSCAN param
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID
- scnSubCombineNLOtoPSCN(IN P_ADAPTER_T prAdapter,
- IN P_CMD_NLO_REQ prNewCmdNloReq, IN P_CMD_SET_PSCAN_PARAM prCmdPscnParam)
- {
- P_SCAN_INFO_T prScanInfo;
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- DBGLOG(SCN, INFO, " scnSubCombineNLOtoPSCN\n");
- ASSERT(prAdapter);
- if (prNewCmdNloReq) {
- prCmdPscnParam->fgNLOScnEnable = TRUE;
- memcpy(&prCmdPscnParam->rCmdNloReq, prNewCmdNloReq, sizeof(CMD_NLO_REQ));
- } else if (prScanInfo->prPscnParam->fgNLOScnEnable) {
- memcpy(&prCmdPscnParam->rCmdNloReq, &prScanInfo->prPscnParam->rCurrentCmdNloReq, sizeof(CMD_NLO_REQ));
- } else
- prCmdPscnParam->fgNLOScnEnable = FALSE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for Combine Batcht Scan params into PSCAN param
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID
- scnSubCombineBatchSCNtoPSCN(IN P_ADAPTER_T prAdapter,
- IN P_CMD_BATCH_REQ_T prNewCmdBatchReq, IN P_CMD_SET_PSCAN_PARAM prCmdPscnParam)
- {
- P_SCAN_INFO_T prScanInfo;
- DBGLOG(SCN, INFO, " scnSubCombineBatchSCNtoPSCN\n");
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- if (prNewCmdBatchReq) {
- prCmdPscnParam->fgBatchScnEnable = TRUE;
- memcpy(&prCmdPscnParam->rCmdBatchReq, prNewCmdBatchReq, sizeof(CMD_BATCH_REQ_T));
- } else if (prScanInfo->prPscnParam->fgBatchScnEnable) {
- memcpy(&prCmdPscnParam->rCmdBatchReq, &prScanInfo->prPscnParam->rCurrentCmdBatchReq,
- sizeof(CMD_BATCH_REQ_T));
- } else
- prCmdPscnParam->fgBatchScnEnable = FALSE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for Combine GSCN Scan params into PSCAN param
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID
- scnSubCombineGSCNtoPSCN(IN P_ADAPTER_T prAdapter,
- IN P_CMD_GSCN_REQ_T prNewCmdGscnReq,
- IN P_CMD_GSCN_SCN_COFIG_T prNewCmdGscnConfig, IN P_CMD_SET_PSCAN_PARAM prCmdPscnParam)
- {
- P_SCAN_INFO_T prScanInfo;
- UINT_32 ucPeriodMin = MAX_PERIOD;
- DBGLOG(SCN, INFO, " scnSubCombineGSCNtoPSCN\n");
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prCmdPscnParam->fgGScnEnable = FALSE;
- DBGLOG(SCN, INFO, "scnSubCombineGSCNtoPSCN fgGScnParamSet %d fgGScnConfigSet %d\n",
- prScanInfo->fgGScnParamSet, prScanInfo->fgGScnConfigSet);
- if (prNewCmdGscnReq) {
- DBGLOG(SCN, INFO, "setup prNewCmdGscnReq\n");
- prScanInfo->fgGScnParamSet = TRUE;
- memcpy(&prCmdPscnParam->rCmdGscnReq, prNewCmdGscnReq, sizeof(CMD_GSCN_REQ_T));
- if (ucPeriodMin > prNewCmdGscnReq->u4BasePeriod)
- prCmdPscnParam->u4BasePeriod = prNewCmdGscnReq->u4BasePeriod;
- } else if (prScanInfo->fgGScnParamSet) {
- DBGLOG(SCN, INFO, "no new prNewCmdGscnReq but there is a old one\n");
- memcpy(&prCmdPscnParam->rCmdGscnReq, &prScanInfo->prPscnParam->rCurrentCmdGscnReq,
- sizeof(CMD_GSCN_REQ_T));
- } else
- prScanInfo->fgGScnParamSet = FALSE;
- if (prNewCmdGscnConfig) {
- DBGLOG(SCN, INFO, "set up prNewCmdGscnConfig\n");
- memcpy(prCmdPscnParam, prScanInfo->prPscnParam, sizeof(CMD_SET_PSCAN_PARAM));
- prScanInfo->fgGScnConfigSet = TRUE;
- prCmdPscnParam->rCmdGscnReq.u4BufferThreshold = prNewCmdGscnConfig->u4BufferThreshold;
- prCmdPscnParam->rCmdGscnReq.ucNumScnToCache = (UINT_8) prNewCmdGscnConfig->u4NumScnToCache;
- prCmdPscnParam->rCmdGscnReq.u4MaxApPerScan = (UINT_8) prNewCmdGscnConfig->ucNumApPerScn;
- } else if (prScanInfo->fgGScnConfigSet) {
- DBGLOG(SCN, INFO, "no new prNewCmdGscnConfig but there is a old one\n");
- memcpy(prCmdPscnParam, prScanInfo->prPscnParam, sizeof(CMD_SET_PSCAN_PARAM));
- } else
- prScanInfo->fgGScnConfigSet = FALSE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for Combine GSCN Scan params into PSCAN param
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID
- scnRemoveFromPSCN(IN P_ADAPTER_T prAdapter,
- IN BOOLEAN fgRemoveNLOfromPSCN,
- IN BOOLEAN fgRemoveBatchSCNfromPSCN,
- IN BOOLEAN fgRemoveGSCNfromPSCN, IN P_CMD_SET_PSCAN_PARAM prCmdPscnParam)
- {
- UINT_8 ucPscanAct = DISABLE;
- P_SCAN_INFO_T prScanInfo;
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- {
- DBGLOG(SCN, INFO, "remove NLO or Batch or GSCN from PSCN--->\n");
- if (fgRemoveNLOfromPSCN) {
- DBGLOG(SCN, INFO, "DisableNLO\n");
- memcpy(prCmdPscnParam, prScanInfo->prPscnParam, sizeof(CMD_SET_PSCAN_PARAM));
- prCmdPscnParam->fgNLOScnEnable = FALSE;
- kalMemZero(&prCmdPscnParam->rCmdNloReq, sizeof(CMD_NLO_REQ));
- kalMemZero(&prScanInfo->prPscnParam->rCurrentCmdNloReq, sizeof(CMD_NLO_REQ));
- }
- if (fgRemoveBatchSCNfromPSCN) {
- DBGLOG(SCN, INFO, "DisableBatch\n");
- memcpy(prCmdPscnParam, prScanInfo->prPscnParam, sizeof(CMD_SET_PSCAN_PARAM));
- prCmdPscnParam->fgBatchScnEnable = FALSE;
- kalMemZero(&prCmdPscnParam->rCmdBatchReq, sizeof(CMD_BATCH_REQ_T));
- kalMemZero(&prScanInfo->prPscnParam->rCurrentCmdBatchReq, sizeof(CMD_BATCH_REQ_T));
- }
- if (fgRemoveGSCNfromPSCN) {
- DBGLOG(SCN, INFO, "DisableGSCN\n");
- memcpy(prCmdPscnParam, prScanInfo->prPscnParam, sizeof(CMD_SET_PSCAN_PARAM));
- prCmdPscnParam->fgGScnEnable = FALSE;
- prScanInfo->fgGScnParamSet = FALSE;
- prScanInfo->fgGScnConfigSet = FALSE;
- kalMemZero(&prCmdPscnParam->rCmdGscnReq, sizeof(CMD_GSCN_REQ_T));
- kalMemZero(&prScanInfo->prPscnParam->rCurrentCmdGscnReq, sizeof(CMD_GSCN_REQ_T));
- }
- if (!fgRemoveNLOfromPSCN && !fgRemoveBatchSCNfromPSCN && !fgRemoveGSCNfromPSCN) {
- /* prCmdPscnParam->fgIsPeriodicallyScn = FALSE; */
- prScanInfo->fgPscnOnnning = FALSE;
- scnFsmPSCNSetParam(prAdapter, prCmdPscnParam);
- ucPscanAct = DISABLE;
- scnFsmPSCNAction(prAdapter, ucPscanAct);
- DBGLOG(SCN, INFO,
- "(!fgRemoveNLOfromPSCN && !fgRemoveBatchSCNfromPSCN && !fgRemoveGSCNfromPSCN)<-----\n");
- } else {
- /* prCmdPscnParam->fgIsPeriodicallyScn = TRUE; */
- scnFsmPSCNSetParam(prAdapter, prCmdPscnParam);
- DBGLOG(SCN, INFO, " disable NLO or GSCN or Batch bu fgIsPeriodicallyScn = TRUE <-----\n");
- }
- }
- }
- #if 1
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for Combine GSCN , Batch, PNO Scan params into PSCAN param
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN
- scnCombineParamsIntoPSCN(IN P_ADAPTER_T prAdapter,
- IN P_CMD_NLO_REQ prNewCmdNloReq,
- IN P_CMD_BATCH_REQ_T prNewCmdBatchReq,
- IN P_CMD_GSCN_REQ_T prNewCmdGscnReq,
- IN P_CMD_GSCN_SCN_COFIG_T prNewCmdGscnConfig,
- IN BOOLEAN fgRemoveNLOfromPSCN,
- IN BOOLEAN fgRemoveBatchSCNfromPSCN, IN BOOLEAN fgRemoveGSCNfromPSCN)
- {
- P_SCAN_INFO_T prScanInfo;
- /* CMD_SET_PSCAN_PARAM rCmdPscnParam; */
- P_CMD_SET_PSCAN_PARAM prCmdPscnParam;
- UINT_8 i, j = 0;
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prCmdPscnParam = (P_CMD_SET_PSCAN_PARAM) kalMemAlloc(sizeof(CMD_SET_PSCAN_PARAM), VIR_MEM_TYPE);
- if (!prCmdPscnParam) {
- DBGLOG(INIT, INFO, "Can not alloc memory for PARAM_WIFI_GSCAN_CMD_PARAMS\n");
- return -ENOMEM;
- }
- prCmdPscnParam->ucVersion = CURRENT_PSCN_VERSION;
- DBGLOG(SCN, INFO, "scnCombineParamsIntoPSCN\n");
- if (fgRemoveNLOfromPSCN || fgRemoveBatchSCNfromPSCN || fgRemoveGSCNfromPSCN) {
- DBGLOG(INIT, TRACE, "remove NLO or Batch or GSCN from PSCN--->\n");
- scnRemoveFromPSCN(prAdapter,
- fgRemoveNLOfromPSCN, fgRemoveBatchSCNfromPSCN, fgRemoveGSCNfromPSCN, prCmdPscnParam);
- } else {
- DBGLOG(SCN, INFO, "combine GSCN or Batch or NLO to PSCN --->\n");
- scnSubCombineNLOtoPSCN(prAdapter, prNewCmdNloReq, prCmdPscnParam);
- scnSubCombineBatchSCNtoPSCN(prAdapter, prNewCmdBatchReq, prCmdPscnParam);
- scnSubCombineGSCNtoPSCN(prAdapter, prNewCmdGscnReq, prNewCmdGscnConfig, prCmdPscnParam);
- /* scnFsmPSCNSetParam(prAdapter, prCmdPscnParam); */
- DBGLOG(SCN, INFO, "combine GSCN or Batch or NLO to PSCN <---\n");
- DBGLOG(SCN, INFO,
- "rCmdPscnParam.rCmdGscnParam : u4BasePeriod[%u], ucNumScnToCache[%u], u4BufferThreshold[%u], u4NumBuckets[%u],fgGSCN[%d] fgNLO[%d] fgBatch[%d]\n",
- prCmdPscnParam->rCmdGscnReq.u4BasePeriod,
- prCmdPscnParam->rCmdGscnReq.ucNumScnToCache,
- prCmdPscnParam->rCmdGscnReq.u4BufferThreshold,
- prCmdPscnParam->rCmdGscnReq.u4NumBuckets, prCmdPscnParam->fgGScnEnable,
- prCmdPscnParam->fgNLOScnEnable, prCmdPscnParam->fgBatchScnEnable);
- for (i = 0; i < prCmdPscnParam->rCmdGscnReq.u4NumBuckets; i++) {
- DBGLOG(SCN, INFO,
- "rCmdPscnParam.rCmdGscnReq.arChannelBucket[%d] : band[%u], arChannelBucket[%u] ucNumChannels[%u], ucBucketFreqMultiple[%u] ucReportFlag[%u]\n",
- i, prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].eBand,
- prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].u2BucketIndex,
- prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucNumChannels,
- prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucBucketFreqMultiple,
- prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucReportFlag);
- DBGLOG(SCN, INFO, "rCmdPscnParam.rCmdGscnParam.arChannelBucket[%d] has channel: ", i);
- for (j = 0; j < prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucNumChannels; j++) {
- DBGLOG(SCN, INFO, " %d, ",
- prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].arChannelList[j].ucChannel);
- }
- DBGLOG(SCN, INFO, "\n");
- }
- }
- memcpy(prScanInfo->prPscnParam, prCmdPscnParam, sizeof(CMD_SET_PSCAN_PARAM));
- DBGLOG(INIT, TRACE, "scnCombineParamsIntoPSCN <----\n");
- return TRUE;
- }
- #endif
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for Set CMD_ID_SET_PSCN_MAC_ADDR
- *
- * \param[in]
- *
- * \return none Since it return none, why doesn't use void instead of BOOLEAN
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN scnFsmSetGSCNConfig(IN P_ADAPTER_T prAdapter, IN P_CMD_GSCN_SCN_COFIG_T prCmdGscnScnConfig)
- {
- CMD_GSCN_SCN_COFIG_T rCmdGscnScnConfig;
- P_SCAN_INFO_T prScanInfo;
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- memcpy(&rCmdGscnScnConfig, prCmdGscnScnConfig, sizeof(CMD_GSCN_SCN_COFIG_T));
- DBGLOG(SCN, INFO,
- "rCmdGscnScnConfig: u4BufferThreshold; [%d] ucNumApPerScn [%d] ucNumScnToCache [%d]\n",
- rCmdGscnScnConfig.u4BufferThreshold, rCmdGscnScnConfig.ucNumApPerScn, rCmdGscnScnConfig.u4NumScnToCache);
- scnPSCNFsm(prAdapter, PSCN_RESET, NULL, NULL, NULL, &rCmdGscnScnConfig, FALSE, FALSE, FALSE, FALSE);
- return TRUE;
- }
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief handler for Set CMD_ID_SET_PSCN_MAC_ADDR
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- BOOLEAN scnFsmGetGSCNResult(IN P_ADAPTER_T prAdapter, IN P_CMD_GET_GSCAN_RESULT_T prGetGscnScnResultCmd)
- {
- CMD_GET_GSCAN_RESULT_T rGetGscnScnResultCmd;
- P_SCAN_INFO_T prScanInfo;
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- memcpy(&rGetGscnScnResultCmd, prGetGscnScnResultCmd, sizeof(CMD_GET_GSCAN_RESULT_T));
- DBGLOG(SCN, INFO, "rGetGscnScnResultCmd: ucGetNum [%d] fgFlush [%d]\n",
- rGetGscnScnResultCmd.u4Num, rGetGscnScnResultCmd.ucFlush);
- ASSERT(prAdapter);
- prScanInfo->fgGscnGetResWaiting = TRUE;
- if (prScanInfo->fgPscnOnnning && prScanInfo->prPscnParam->fgGScnEnable) {
- wlanSendSetQueryCmd(prAdapter,
- CMD_ID_GET_GSCAN_RESULT,
- TRUE,
- FALSE,
- TRUE,
- NULL,
- NULL, sizeof(CMD_GET_GSCAN_RESULT_T), (PUINT_8) (&rGetGscnScnResultCmd), NULL, 0);
- DBGLOG(SCN, INFO,
- "SET to FW !! rGetGscnScnResultCmd: ucGetNum [%d] fgFlush [%d]\n",
- rGetGscnScnResultCmd.u4Num, rGetGscnScnResultCmd.ucFlush);
- } else {
- /* debug msg, No PSCN, Sched SCAN GSCN ongoing ??? */
- return FALSE;
- }
- return FALSE;
- }
- BOOLEAN
- scnPSCNFsm(IN P_ADAPTER_T prAdapter,
- ENUM_PSCAN_STATE_T eNextPSCNState,
- IN P_CMD_NLO_REQ prCmdNloReq,
- IN P_CMD_BATCH_REQ_T prCmdBatchReq,
- IN P_CMD_GSCN_REQ_T prCmdGscnReq,
- IN P_CMD_GSCN_SCN_COFIG_T prNewCmdGscnConfig,
- IN BOOLEAN fgRemoveNLOfromPSCN,
- IN BOOLEAN fgRemoveBatchSCNfromPSCN, IN BOOLEAN fgRemoveGSCNfromPSCN, IN BOOLEAN fgEnableGSCN)
- {
- P_SCAN_INFO_T prScanInfo;
- BOOLEAN fgTransitionState = FALSE;
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- ASSERT(prScanInfo);
- ASSERT(prAdapter);
- do {
- fgTransitionState = FALSE;
- DBGLOG(SCN, INFO, "scnPSCNFsmt eCurrentPSCNState %d\n", prScanInfo->eCurrentPSCNState);
- switch (prScanInfo->eCurrentPSCNState) {
- case PSCN_IDLE:
- DBGLOG(SCN, INFO, "PSCN_IDLE\n");
- if (eNextPSCNState == PSCN_RESET) {
- if (fgRemoveNLOfromPSCN || fgRemoveBatchSCNfromPSCN || fgRemoveGSCNfromPSCN) {
- DBGLOG(SCN, INFO, "Unexpected remove NLO/BATCH/GSCN request\n");
- eNextPSCNState = PSCN_IDLE;
- break;
- }
- if (prCmdNloReq || prCmdBatchReq) { /* */
- DBGLOG(SCN, INFO, "PSCN_IDLE->PSCN_RESET,.... scnFsmPSCNActionDISABLE\n");
- /*TBD check PSCAN is ongoing */
- scnFsmPSCNAction(prAdapter, DISABLE);
- break;
- }
- } else if (eNextPSCNState == PSCN_SCANNING) {
- if (fgEnableGSCN) {
- if (prScanInfo->fgPscnOnnning)
- scnFsmPSCNAction(prAdapter, DISABLE);
- if (prScanInfo->fgGScnParamSet) {
- DBGLOG(SCN, INFO,
- "PSCN_IDLE->PSCN_SCANNING,.... scnFsmPSCNActionENABLE\n");
- prScanInfo->prPscnParam->fgGScnEnable = TRUE;
- scnFsmPSCNSetParam(prAdapter, (P_CMD_SET_PSCAN_PARAM)
- prScanInfo->prPscnParam);
- scnFsmPSCNAction(prAdapter, ENABLE);
- eNextPSCNState = PSCN_SCANNING;
- }
- }
- }
- break;
- case PSCN_RESET:
- DBGLOG(SCN, INFO, "PSCN_RESET\n");
- scnCombineParamsIntoPSCN(prAdapter,
- prCmdNloReq,
- prCmdBatchReq,
- prCmdGscnReq,
- prNewCmdGscnConfig,
- fgRemoveNLOfromPSCN, fgRemoveBatchSCNfromPSCN, fgRemoveGSCNfromPSCN);
- if (!prScanInfo->prPscnParam->fgNLOScnEnable
- && !prScanInfo->prPscnParam->fgBatchScnEnable && !prScanInfo->prPscnParam->fgGScnEnable) {
- DBGLOG(SCN, INFO,
- "PSCN_RESET->PSCN_IDLE,.... fgNLOScnEnable/fgBatchScnEnable/fgGScnEnable false\n");
- eNextPSCNState = PSCN_IDLE;
- } else {
- if (prScanInfo->prPscnParam->fgNLOScnEnable
- || prScanInfo->prPscnParam->fgBatchScnEnable) {
- scnFsmPSCNSetParam(prAdapter, (P_CMD_SET_PSCAN_PARAM) prScanInfo->prPscnParam);
- scnFsmPSCNAction(prAdapter, ENABLE);
- eNextPSCNState = PSCN_SCANNING;
- DBGLOG(SCN, INFO,
- "PSCN_RESET->PSCN_SCANNING,.... fgNLOScnEnable/fgBatchScnEnable ENABLE\n");
- }
- }
- break;
- case PSCN_SCANNING:
- DBGLOG(SCN, INFO, "PSCN_SCANNING\n");
- if (eNextPSCNState == PSCN_RESET) {
- if (fgRemoveNLOfromPSCN || fgRemoveBatchSCNfromPSCN || fgRemoveGSCNfromPSCN) {
- DBGLOG(SCN, INFO,
- "PSCN_SCANNING->PSCN_RESET,.... fgRemoveNLOfromPSCN/fgRemoveBatchSCNfromPSCN/fgRemoveGSCNfromPSCN\n");
- scnFsmPSCNAction(prAdapter, DISABLE);
- break;
- }
- if (prCmdNloReq || prCmdBatchReq || prCmdGscnReq || prNewCmdGscnConfig) {
- DBGLOG(SCN, INFO,
- "PSCN_SCANNING->PSCN_RESET,.... prCmdNloReq/prCmdBatchReq/prCmdGscnReq/prNewCmdGscnConfig\n");
- scnFsmPSCNAction(prAdapter, DISABLE);
- break;
- }
- } else if (eNextPSCNState == PSCN_SCANNING) {
- if (fgEnableGSCN) {
- if (prScanInfo->prPscnParam->fgGScnEnable && (!prScanInfo->fgPscnOnnning)) {
- DBGLOG(SCN, INFO,
- "PSCN_SCANNING->PSCN_SCANNING,.... fgGScnEnable/!fgPscnOnnning\n");
- /* scnFsmPSCNAction(prAdapter, ENABLE); */
- eNextPSCNState = PSCN_SCANNING;
- } else {
- DBGLOG(SCN, INFO,
- "PSCN_SCANNING->PSCN_SCANNING,.... fgGScnEnable/!fgPscnOnnning\n");
- }
- }
- }
- eNextPSCNState = PSCN_SCANNING;
- break;
- default:
- DBGLOG(SCN, INFO, "Unexpected state\n");
- ASSERT(0);
- break;
- }
- DBGLOG(SCN, INFO, "eCurrentState %d , eNextPSCNState %d\n",
- prScanInfo->eCurrentPSCNState, eNextPSCNState);
- if (prScanInfo->eCurrentPSCNState != eNextPSCNState)
- fgTransitionState = TRUE;
- prScanInfo->eCurrentPSCNState = eNextPSCNState;
- } while (fgTransitionState);
- return prScanInfo->eCurrentState;
- }
- VOID scnGscnGetResultReplyCheck(P_ADAPTER_T prAdapter)
- {
- P_SCAN_INFO_T prScanInfo;
- UINT_32 ucCounter = 0;
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- cnmTimerStartTimer(prAdapter, &prScanInfo->rWaitForGscanResutsTimer, SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
- while (prScanInfo->fgGscnGetResWaiting) {
- if (ucCounter > 1000)
- DBGLOG(SCN, INFO, "%s wait for Results are replyed \r\n", __func__);
- ucCounter++;
- }
- }
- VOID scnGscnGetResultReplyCheckTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr)
- {
- P_SCAN_INFO_T prScanInfo;
- ASSERT(prAdapter);
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- prScanInfo->fgGscnGetResWaiting = FALSE;
- DBGLOG(SCN, INFO, "%s wait for Results are replyed timeout\r\n", __func__);
- }
- #endif
- VOID scnScanDoneTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr)
- {
- P_SCAN_INFO_T prScanInfo;
- prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
- DBGLOG(SCN, WARN, "scnScanDoneTimeout %d \r\n", prScanInfo->ucScanDoneTimeoutCnt);
- prScanInfo->ucScanDoneTimeoutCnt++;
- /* whole chip reset check */
- if (prScanInfo->ucScanDoneTimeoutCnt > SCAN_DONE_TIMEOUT_THRESHOLD) {
- DBGLOG(SCN, ERROR,
- " meet SCAN_DONE_TIMEOUT_THRESHOLD %d, trigger whole chip reset !! \r\n",
- SCAN_DONE_TIMEOUT_THRESHOLD);
- #if CFG_CHIP_RESET_SUPPORT
- glResetTrigger(prAdapter);
- #endif
- }
- }
|