scan_fsm.c 74 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312
  1. /*
  2. ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/scan_fsm.c#2
  3. */
  4. /*! \file "scan_fsm.c"
  5. \brief This file defines the state transition function for SCAN FSM.
  6. The SCAN FSM is part of SCAN MODULE and responsible for performing basic SCAN
  7. behavior as metioned in IEEE 802.11 2007 11.1.3.1 & 11.1.3.2 .
  8. */
  9. /*
  10. ** Log: scan_fsm.c
  11. **
  12. ** 08 15 2013 cp.wu
  13. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  14. ** enlarge match_ssid_num to 16 for PNO support
  15. **
  16. ** 08 09 2013 cp.wu
  17. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  18. ** 1. integrate scheduled scan functionality
  19. ** 2. condition compilation for linux-3.4 & linux-3.8 compatibility
  20. ** 3. correct CMD queue access to reduce lock scope
  21. **
  22. ** 02 19 2013 cp.wu
  23. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  24. ** take use of GET_BSS_INFO_BY_INDEX() and MAX_BSS_INDEX macros
  25. ** for correctly indexing of BSS-INFO pointers
  26. **
  27. ** 02 05 2013 cp.wu
  28. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  29. ** 1. change to use long format (FT=1) for initial command
  30. ** 2. fix a typo
  31. **
  32. ** 01 22 2013 cp.wu
  33. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  34. ** .add driver side NLO state machine
  35. **
  36. ** 01 22 2013 cp.wu
  37. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  38. ** modification for ucBssIndex migration
  39. **
  40. ** 01 03 2013 cp.wu
  41. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  42. ** carry timeout value and channel dwell time value to scan module
  43. **
  44. ** 09 17 2012 cm.chang
  45. ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
  46. ** Duplicate source from MT6620 v2.3 driver branch
  47. ** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base)
  48. **
  49. ** 08 31 2012 cp.wu
  50. ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
  51. ** do not use fgIsP2PRegistered for checking but use network index
  52. *
  53. * 06 13 2012 yuche.tsai
  54. * NULL
  55. * Update maintrunk driver.
  56. * Add support for driver compose assoc request frame.
  57. *
  58. * 11 24 2011 wh.su
  59. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  60. * Adjust code for DBG and CONFIG_XLOG.
  61. *
  62. * 11 14 2011 yuche.tsai
  63. * [WCXRP00001095] [Volunteer Patch][Driver] Always Scan before enable Hot-Spot.
  64. * Fix bug when unregister P2P network..
  65. *
  66. * 11 11 2011 wh.su
  67. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  68. * modify the xlog related code.
  69. *
  70. * 11 02 2011 wh.su
  71. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  72. * adding the code for XLOG.
  73. *
  74. * 08 11 2011 cp.wu
  75. * [WCXRP00000830] [MT6620 Wi-Fi][Firmware] Use MDRDY counter to detect empty channel for shortening scan time
  76. * sparse channel detection:
  77. * driver: collect sparse channel information with scan-done event
  78. *
  79. * 07 18 2011 cp.wu
  80. * [WCXRP00000858] [MT5931][Driver][Firmware] Add support for scan to search
  81. * for more than one SSID in a single scanning request
  82. * free mailbox message afte parsing is completed.
  83. *
  84. * 07 18 2011 cp.wu
  85. * [WCXRP00000858] [MT5931][Driver][Firmware] Add support for scan to search
  86. * for more than one SSID in a single scanning request
  87. * add framework in driver domain for supporting new SCAN_REQ_V2 for more than 1 SSID support
  88. * as well as uProbeDelay in NDIS 6.x driver model
  89. *
  90. * 04 18 2011 terry.wu
  91. * [WCXRP00000660] [MT6620 Wi-Fi][Driver] Remove flag CFG_WIFI_DIRECT_MOVED
  92. * Remove flag CFG_WIFI_DIRECT_MOVED.
  93. *
  94. * 03 29 2011 cp.wu
  95. * [WCXRP00000604] [MT6620 Wi-Fi][Driver] Surpress Klockwork Warning
  96. * surpress klock warning with code path rewritten
  97. *
  98. * 03 18 2011 cm.chang
  99. * [WCXRP00000576] [MT6620 Wi-Fi][Driver][FW] Remove P2P compile option in scan req/cancel command
  100. * As CR title
  101. *
  102. * 02 18 2011 yuche.tsai
  103. * [WCXRP00000478] [Volunteer Patch][MT6620][Driver] Probe request frame
  104. * during search phase do not contain P2P wildcard SSID.
  105. * Take P2P wildcard SSID into consideration.
  106. *
  107. * 01 27 2011 yuche.tsai
  108. * [WCXRP00000399] [Volunteer Patch][MT6620/MT5931][Driver] Fix scan side effect after P2P module separate.
  109. * Fix scan channel extension issue when p2p module is not registered.
  110. *
  111. * 01 26 2011 yuche.tsai
  112. * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
  113. * .
  114. *
  115. * 01 25 2011 yuche.tsai
  116. * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
  117. * Fix Compile Error when DBG is disabled.
  118. *
  119. * 12 07 2010 cm.chang
  120. * [WCXRP00000238] MT6620 Wi-Fi][Driver][FW] Support regulation domain setting from NVRAM and supplicant
  121. * 1. Country code is from NVRAM or supplicant
  122. * 2. Change band definition in CMD/EVENT.
  123. *
  124. * 09 03 2010 kevin.huang
  125. * NULL
  126. * Refine #include sequence and solve recursive/nested #include issue
  127. *
  128. * 08 30 2010 cp.wu
  129. * NULL
  130. * eliminate klockwork errors
  131. *
  132. * 08 16 2010 cp.wu
  133. * NULL
  134. * add interface for RLM to trigger OBSS-SCAN.
  135. *
  136. * 08 16 2010 yuche.tsai
  137. * NULL
  138. * Fix bug for processing queued scan request.
  139. *
  140. * 08 11 2010 yuche.tsai
  141. * NULL
  142. * Add a function for returning channel.
  143. *
  144. * 08 05 2010 yuche.tsai
  145. * NULL
  146. * Update SCAN FSM for support P2P Device discovery scan.
  147. *
  148. * 08 03 2010 cp.wu
  149. * NULL
  150. * surpress compilation warning.
  151. *
  152. * 07 26 2010 yuche.tsai
  153. *
  154. * Add option of channel extension while cancelling scan request.
  155. *
  156. * 07 21 2010 yuche.tsai
  157. *
  158. * Add P2P Scan & Scan Result Parsing & Saving.
  159. *
  160. * 07 20 2010 cp.wu
  161. *
  162. * pass band information for scan in an efficient way by mapping ENUM_BAND_T into UINT_8..
  163. *
  164. * 07 19 2010 cp.wu
  165. *
  166. * due to FW/DRV won't be sync. precisely, some strict assertions should be eased.
  167. *
  168. * 07 19 2010 cp.wu
  169. *
  170. * [WPD00003833] [MT6620 and MT5931] Driver migration.
  171. * SCN module is now able to handle multiple concurrent scanning requests
  172. *
  173. * 07 16 2010 cp.wu
  174. *
  175. * [WPD00003833] [MT6620 and MT5931] Driver migration.
  176. * bugfix for SCN migration
  177. * 1) modify QUEUE_CONCATENATE_QUEUES() so it could be used to concatence with an empty queue
  178. * 2) before AIS issues scan request, network(BSS) needs to be activated first
  179. * 3) only invoke COPY_SSID when using specified SSID for scan
  180. *
  181. * 07 15 2010 cp.wu
  182. *
  183. * [WPD00003833] [MT6620 and MT5931] Driver migration.
  184. * driver no longer generates probe request frames
  185. *
  186. * 07 14 2010 cp.wu
  187. *
  188. * [WPD00003833] [MT6620 and MT5931] Driver migration.
  189. * pass band with channel number information as scan parameter
  190. *
  191. * 07 14 2010 cp.wu
  192. *
  193. * [WPD00003833] [MT6620 and MT5931] Driver migration.
  194. * remove timer in DRV-SCN.
  195. *
  196. * 07 09 2010 cp.wu
  197. *
  198. * 1) separate AIS_FSM state for two kinds of scanning. (OID triggered scan, and scan-for-connection)
  199. * 2) eliminate PRE_BSS_DESC_T, Beacon/PrebResp is now parsed in single pass
  200. * 3) implment DRV-SCN module, currently only accepts single scan request,
  201. * other request will be directly dropped by returning BUSY
  202. *
  203. * 07 08 2010 cp.wu
  204. *
  205. * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
  206. *
  207. * 07 08 2010 cp.wu
  208. * [WPD00003833][MT6620 and MT5931] Driver migration
  209. * take use of RLM module for parsing/generating HT IEs for 11n capability
  210. *
  211. * 07 02 2010 cp.wu
  212. * [WPD00003833][MT6620 and MT5931] Driver migration
  213. * when returning to SCAN_IDLE state, send a correct message to source FSM.
  214. *
  215. * 07 01 2010 cp.wu
  216. * [WPD00003833][MT6620 and MT5931] Driver migration
  217. * implementation of DRV-SCN and related mailbox message handling.
  218. *
  219. * 06 22 2010 cp.wu
  220. * [WPD00003833][MT6620 and MT5931] Driver migration
  221. * comment out RLM APIs by CFG_RLM_MIGRATION.
  222. *
  223. * 06 21 2010 cp.wu
  224. * [WPD00003833][MT6620 and MT5931] Driver migration
  225. * add scan_fsm into building.
  226. *
  227. * 05 14 2010 kevin.huang
  228. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  229. * Refine the order of Stop TX Queue and Switch Channel
  230. *
  231. * 05 12 2010 kevin.huang
  232. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  233. * Update pause/resume/flush API to new Bitmap API
  234. *
  235. * 05 12 2010 kevin.huang
  236. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  237. * Add Power Management - Legacy PS-POLL support.
  238. *
  239. * 03 18 2010 kevin.huang
  240. * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
  241. * Ignore the PROBE_DELAY state if the value of Probe Delay == 0
  242. *
  243. * 03 10 2010 kevin.huang
  244. * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
  245. * Add Channel Manager for arbitration of JOIN and SCAN Req
  246. *
  247. * 02 23 2010 kevin.huang
  248. * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
  249. * Add support scan channel 1~14 and update scan result's frequency infou1rwduu`wvpghlqg|n`slk+mpdkb
  250. *
  251. * 01 08 2010 kevin.huang
  252. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  253. * Add set RX Filter to receive BCN from different BSSID during SCAN
  254. *
  255. * 12 18 2009 cm.chang
  256. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  257. * .
  258. *
  259. * Nov 25 2009 mtk01461
  260. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  261. * Remove flag of CFG_TEST_MGMT_FSM
  262. *
  263. * Nov 20 2009 mtk01461
  264. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  265. * Change parameter of scanSendProbeReqFrames()
  266. *
  267. * Nov 16 2009 mtk01461
  268. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  269. * Update scnFsmSteps()
  270. *
  271. * Nov 5 2009 mtk01461
  272. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  273. * Fix typo
  274. *
  275. * Nov 5 2009 mtk01461
  276. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  277. *
  278. */
  279. /*******************************************************************************
  280. * C O M P I L E R F L A G S
  281. ********************************************************************************
  282. */
  283. /*******************************************************************************
  284. * E X T E R N A L R E F E R E N C E S
  285. ********************************************************************************
  286. */
  287. #include "precomp.h"
  288. #define CURRENT_PSCN_VERSION 1
  289. #define RSSI_MARGIN_DEFAULT 5
  290. #define MAX_PERIOD 200000
  291. /*******************************************************************************
  292. * C O N S T A N T S
  293. ********************************************************************************
  294. */
  295. /*******************************************************************************
  296. * D A T A T Y P E S
  297. ********************************************************************************
  298. */
  299. /*******************************************************************************
  300. * P U B L I C D A T A
  301. ********************************************************************************
  302. */
  303. /*******************************************************************************
  304. * P R I V A T E D A T A
  305. ********************************************************************************
  306. */
  307. #if DBG
  308. /*lint -save -e64 Type mismatch */
  309. static PUINT_8 apucDebugScanState[SCAN_STATE_NUM] = {
  310. (PUINT_8) DISP_STRING("SCAN_STATE_IDLE"),
  311. (PUINT_8) DISP_STRING("SCAN_STATE_SCANNING"),
  312. };
  313. /*lint -restore */
  314. #endif /* DBG */
  315. /*******************************************************************************
  316. * M A C R O S
  317. ********************************************************************************
  318. */
  319. /*******************************************************************************
  320. * F U N C T I O N D E C L A R A T I O N S
  321. ********************************************************************************
  322. */
  323. /*******************************************************************************
  324. * F U N C T I O N S
  325. ********************************************************************************
  326. */
  327. /*----------------------------------------------------------------------------*/
  328. /*!
  329. * \brief
  330. *
  331. * \param[in]
  332. *
  333. * \return none
  334. */
  335. /*----------------------------------------------------------------------------*/
  336. VOID scnFsmSteps(IN P_ADAPTER_T prAdapter, IN ENUM_SCAN_STATE_T eNextState)
  337. {
  338. P_SCAN_INFO_T prScanInfo;
  339. P_SCAN_PARAM_T prScanParam;
  340. P_MSG_HDR_T prMsgHdr;
  341. BOOLEAN fgIsTransition = (BOOLEAN) FALSE;
  342. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  343. prScanParam = &prScanInfo->rScanParam;
  344. do {
  345. #if DBG
  346. DBGLOG(SCN, STATE, "TRANSITION: [%s] -> [%s]\n",
  347. apucDebugScanState[prScanInfo->eCurrentState], apucDebugScanState[eNextState]);
  348. #else
  349. DBGLOG(SCN, STATE, "[%d] TRANSITION: [%d] -> [%d]\n",
  350. DBG_SCN_IDX, prScanInfo->eCurrentState, eNextState);
  351. #endif
  352. /* NOTE(Kevin): This is the only place to change the eCurrentState(except initial) */
  353. prScanInfo->eCurrentState = eNextState;
  354. fgIsTransition = (BOOLEAN) FALSE;
  355. switch (prScanInfo->eCurrentState) {
  356. case SCAN_STATE_IDLE:
  357. /* check for pending scanning requests */
  358. if (!LINK_IS_EMPTY(&(prScanInfo->rPendingMsgList))) {
  359. /* load next message from pending list as scan parameters */
  360. LINK_REMOVE_HEAD(&(prScanInfo->rPendingMsgList), prMsgHdr, P_MSG_HDR_T);
  361. if (prMsgHdr->eMsgId == MID_AIS_SCN_SCAN_REQ
  362. || prMsgHdr->eMsgId == MID_BOW_SCN_SCAN_REQ
  363. || prMsgHdr->eMsgId == MID_P2P_SCN_SCAN_REQ
  364. || prMsgHdr->eMsgId == MID_RLM_SCN_SCAN_REQ) {
  365. scnFsmHandleScanMsg(prAdapter, (P_MSG_SCN_SCAN_REQ) prMsgHdr);
  366. eNextState = SCAN_STATE_SCANNING;
  367. fgIsTransition = TRUE;
  368. } else if (prMsgHdr->eMsgId == MID_AIS_SCN_SCAN_REQ_V2
  369. || prMsgHdr->eMsgId == MID_BOW_SCN_SCAN_REQ_V2
  370. || prMsgHdr->eMsgId == MID_P2P_SCN_SCAN_REQ_V2
  371. || prMsgHdr->eMsgId == MID_RLM_SCN_SCAN_REQ_V2) {
  372. scnFsmHandleScanMsgV2(prAdapter, (P_MSG_SCN_SCAN_REQ_V2) prMsgHdr);
  373. eNextState = SCAN_STATE_SCANNING;
  374. fgIsTransition = TRUE;
  375. } else {
  376. /* should not happen */
  377. ASSERT(0);
  378. }
  379. /* switch to next state */
  380. cnmMemFree(prAdapter, prMsgHdr);
  381. }
  382. break;
  383. case SCAN_STATE_SCANNING:
  384. if (prScanParam->fgIsScanV2 == FALSE)
  385. scnSendScanReq(prAdapter);
  386. else
  387. scnSendScanReqV2(prAdapter);
  388. cnmTimerStartTimer(prAdapter, &prScanInfo->rScanDoneTimer,
  389. SEC_TO_MSEC(AIS_SCN_DONE_TIMEOUT_SEC));
  390. /* prScanInfo->ucScanDoneTimeoutCnt = 0; */
  391. break;
  392. default:
  393. ASSERT(0);
  394. break;
  395. }
  396. } while (fgIsTransition);
  397. }
  398. /*----------------------------------------------------------------------------*/
  399. /*!
  400. * \brief Generate CMD_ID_SCAN_REQ command
  401. *
  402. * \param[in]
  403. *
  404. * \return none
  405. */
  406. /*----------------------------------------------------------------------------*/
  407. VOID scnSendScanReq(IN P_ADAPTER_T prAdapter)
  408. {
  409. P_SCAN_INFO_T prScanInfo;
  410. P_SCAN_PARAM_T prScanParam;
  411. CMD_SCAN_REQ rCmdScanReq;
  412. UINT_32 i;
  413. ASSERT(prAdapter);
  414. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  415. prScanParam = &prScanInfo->rScanParam;
  416. /* send command packet for scan */
  417. kalMemZero(&rCmdScanReq, sizeof(CMD_SCAN_REQ));
  418. rCmdScanReq.ucSeqNum = prScanParam->ucSeqNum;
  419. rCmdScanReq.ucBssIndex = prScanParam->ucBssIndex;
  420. rCmdScanReq.ucScanType = (UINT_8) prScanParam->eScanType;
  421. rCmdScanReq.ucSSIDType = prScanParam->ucSSIDType;
  422. if (prScanParam->ucSSIDNum == 1) {
  423. COPY_SSID(rCmdScanReq.aucSSID,
  424. rCmdScanReq.ucSSIDLength,
  425. prScanParam->aucSpecifiedSSID[0], prScanParam->ucSpecifiedSSIDLen[0]);
  426. }
  427. rCmdScanReq.ucChannelType = (UINT_8) prScanParam->eScanChannel;
  428. if (prScanParam->eScanChannel == SCAN_CHANNEL_SPECIFIED) {
  429. /* P2P would use:
  430. * 1. Specified Listen Channel of passive scan for LISTEN state.
  431. * 2. Specified Listen Channel of Target Device of active scan for SEARCH state. (Target != NULL)
  432. */
  433. rCmdScanReq.ucChannelListNum = prScanParam->ucChannelListNum;
  434. for (i = 0; i < rCmdScanReq.ucChannelListNum; i++) {
  435. rCmdScanReq.arChannelList[i].ucBand = (UINT_8) prScanParam->arChnlInfoList[i].eBand;
  436. rCmdScanReq.arChannelList[i].ucChannelNum =
  437. (UINT_8) prScanParam->arChnlInfoList[i].ucChannelNum;
  438. }
  439. }
  440. rCmdScanReq.u2ChannelDwellTime = prScanParam->u2ChannelDwellTime;
  441. rCmdScanReq.u2TimeoutValue = prScanParam->u2TimeoutValue;
  442. if (prScanParam->u2IELen <= MAX_IE_LENGTH)
  443. rCmdScanReq.u2IELen = prScanParam->u2IELen;
  444. else
  445. rCmdScanReq.u2IELen = MAX_IE_LENGTH;
  446. if (prScanParam->u2IELen)
  447. kalMemCopy(rCmdScanReq.aucIE, prScanParam->aucIE, sizeof(UINT_8) * rCmdScanReq.u2IELen);
  448. wlanSendSetQueryCmd(prAdapter,
  449. CMD_ID_SCAN_REQ,
  450. TRUE,
  451. FALSE,
  452. FALSE,
  453. NULL,
  454. NULL,
  455. OFFSET_OF(CMD_SCAN_REQ, aucIE) + rCmdScanReq.u2IELen, (PUINT_8)&rCmdScanReq, NULL, 0);
  456. }
  457. /*----------------------------------------------------------------------------*/
  458. /*!
  459. * \brief Generate CMD_ID_SCAN_REQ_V2 command
  460. *
  461. * \param[in]
  462. *
  463. * \return none
  464. */
  465. /*----------------------------------------------------------------------------*/
  466. VOID scnSendScanReqV2(IN P_ADAPTER_T prAdapter)
  467. {
  468. P_SCAN_INFO_T prScanInfo;
  469. P_SCAN_PARAM_T prScanParam;
  470. CMD_SCAN_REQ_V2 rCmdScanReq;
  471. UINT_32 i;
  472. ASSERT(prAdapter);
  473. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  474. prScanParam = &prScanInfo->rScanParam;
  475. /* send command packet for scan */
  476. kalMemZero(&rCmdScanReq, sizeof(CMD_SCAN_REQ_V2));
  477. rCmdScanReq.ucSeqNum = prScanParam->ucSeqNum;
  478. rCmdScanReq.ucBssIndex = prScanParam->ucBssIndex;
  479. rCmdScanReq.ucScanType = (UINT_8) prScanParam->eScanType;
  480. rCmdScanReq.ucSSIDType = prScanParam->ucSSIDType;
  481. for (i = 0; i < prScanParam->ucSSIDNum; i++) {
  482. COPY_SSID(rCmdScanReq.arSSID[i].aucSsid,
  483. rCmdScanReq.arSSID[i].u4SsidLen,
  484. prScanParam->aucSpecifiedSSID[i], prScanParam->ucSpecifiedSSIDLen[i]);
  485. }
  486. rCmdScanReq.u2ProbeDelayTime = (UINT_8) prScanParam->u2ProbeDelayTime;
  487. rCmdScanReq.ucChannelType = (UINT_8) prScanParam->eScanChannel;
  488. if (prScanParam->eScanChannel == SCAN_CHANNEL_SPECIFIED) {
  489. /* P2P would use:
  490. * 1. Specified Listen Channel of passive scan for LISTEN state.
  491. * 2. Specified Listen Channel of Target Device of active scan for SEARCH state. (Target != NULL)
  492. */
  493. rCmdScanReq.ucChannelListNum = prScanParam->ucChannelListNum;
  494. for (i = 0; i < rCmdScanReq.ucChannelListNum; i++) {
  495. rCmdScanReq.arChannelList[i].ucBand = (UINT_8) prScanParam->arChnlInfoList[i].eBand;
  496. rCmdScanReq.arChannelList[i].ucChannelNum =
  497. (UINT_8) prScanParam->arChnlInfoList[i].ucChannelNum;
  498. }
  499. }
  500. rCmdScanReq.u2ChannelDwellTime = prScanParam->u2ChannelDwellTime;
  501. rCmdScanReq.u2TimeoutValue = prScanParam->u2TimeoutValue;
  502. if (prScanParam->u2IELen <= MAX_IE_LENGTH)
  503. rCmdScanReq.u2IELen = prScanParam->u2IELen;
  504. else
  505. rCmdScanReq.u2IELen = MAX_IE_LENGTH;
  506. if (prScanParam->u2IELen)
  507. kalMemCopy(rCmdScanReq.aucIE, prScanParam->aucIE, sizeof(UINT_8) * rCmdScanReq.u2IELen);
  508. wlanSendSetQueryCmd(prAdapter,
  509. CMD_ID_SCAN_REQ_V2,
  510. TRUE,
  511. FALSE,
  512. FALSE,
  513. NULL,
  514. NULL,
  515. OFFSET_OF(CMD_SCAN_REQ_V2, aucIE) + rCmdScanReq.u2IELen, (PUINT_8)&rCmdScanReq, NULL, 0);
  516. }
  517. /*----------------------------------------------------------------------------*/
  518. /*!
  519. * \brief
  520. *
  521. * \param[in]
  522. *
  523. * \return none
  524. */
  525. /*----------------------------------------------------------------------------*/
  526. VOID scnFsmMsgStart(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  527. {
  528. P_SCAN_INFO_T prScanInfo;
  529. P_SCAN_PARAM_T prScanParam;
  530. ASSERT(prMsgHdr);
  531. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  532. prScanParam = &prScanInfo->rScanParam;
  533. if (prScanInfo->eCurrentState == SCAN_STATE_IDLE) {
  534. if (prMsgHdr->eMsgId == MID_AIS_SCN_SCAN_REQ
  535. || prMsgHdr->eMsgId == MID_BOW_SCN_SCAN_REQ
  536. || prMsgHdr->eMsgId == MID_P2P_SCN_SCAN_REQ || prMsgHdr->eMsgId == MID_RLM_SCN_SCAN_REQ) {
  537. scnFsmHandleScanMsg(prAdapter, (P_MSG_SCN_SCAN_REQ) prMsgHdr);
  538. } else if (prMsgHdr->eMsgId == MID_AIS_SCN_SCAN_REQ_V2
  539. || prMsgHdr->eMsgId == MID_BOW_SCN_SCAN_REQ_V2
  540. || prMsgHdr->eMsgId == MID_P2P_SCN_SCAN_REQ_V2
  541. || prMsgHdr->eMsgId == MID_RLM_SCN_SCAN_REQ_V2) {
  542. scnFsmHandleScanMsgV2(prAdapter, (P_MSG_SCN_SCAN_REQ_V2) prMsgHdr);
  543. } else {
  544. /* should not deliver to this function */
  545. ASSERT(0);
  546. }
  547. cnmMemFree(prAdapter, prMsgHdr);
  548. scnFsmSteps(prAdapter, SCAN_STATE_SCANNING);
  549. } else {
  550. LINK_INSERT_TAIL(&prScanInfo->rPendingMsgList, &prMsgHdr->rLinkEntry);
  551. }
  552. }
  553. /*----------------------------------------------------------------------------*/
  554. /*!
  555. * \brief
  556. *
  557. * \param[in]
  558. *
  559. * \return none
  560. */
  561. /*----------------------------------------------------------------------------*/
  562. VOID scnFsmMsgAbort(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  563. {
  564. P_MSG_SCN_SCAN_CANCEL prScanCancel;
  565. P_SCAN_INFO_T prScanInfo;
  566. P_SCAN_PARAM_T prScanParam;
  567. CMD_SCAN_CANCEL rCmdScanCancel;
  568. ASSERT(prMsgHdr);
  569. prScanCancel = (P_MSG_SCN_SCAN_CANCEL) prMsgHdr;
  570. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  571. prScanParam = &prScanInfo->rScanParam;
  572. if (prScanInfo->eCurrentState != SCAN_STATE_IDLE) {
  573. if (prScanCancel->ucSeqNum == prScanParam->ucSeqNum &&
  574. prScanCancel->ucBssIndex == prScanParam->ucBssIndex) {
  575. /* send cancel message to firmware domain */
  576. rCmdScanCancel.ucSeqNum = prScanParam->ucSeqNum;
  577. rCmdScanCancel.ucIsExtChannel = (UINT_8) prScanCancel->fgIsChannelExt;
  578. wlanSendSetQueryCmd(prAdapter,
  579. CMD_ID_SCAN_CANCEL,
  580. TRUE,
  581. FALSE,
  582. FALSE,
  583. NULL, NULL, sizeof(CMD_SCAN_CANCEL), (PUINT_8)&rCmdScanCancel, NULL, 0);
  584. /* generate scan-done event for caller */
  585. scnFsmGenerateScanDoneMsg(prAdapter,
  586. prScanParam->ucSeqNum,
  587. prScanParam->ucBssIndex, SCAN_STATUS_CANCELLED);
  588. /* switch to next pending scan */
  589. scnFsmSteps(prAdapter, SCAN_STATE_IDLE);
  590. } else {
  591. scnFsmRemovePendingMsg(prAdapter, prScanCancel->ucSeqNum, prScanCancel->ucBssIndex);
  592. }
  593. }
  594. cnmMemFree(prAdapter, prMsgHdr);
  595. }
  596. /*----------------------------------------------------------------------------*/
  597. /*!
  598. * \brief Scan Message Parsing (Legacy)
  599. *
  600. * \param[in]
  601. *
  602. * \return none
  603. */
  604. /*----------------------------------------------------------------------------*/
  605. VOID scnFsmHandleScanMsg(IN P_ADAPTER_T prAdapter, IN P_MSG_SCN_SCAN_REQ prScanReqMsg)
  606. {
  607. P_SCAN_INFO_T prScanInfo;
  608. P_SCAN_PARAM_T prScanParam;
  609. UINT_32 i;
  610. ASSERT(prAdapter);
  611. ASSERT(prScanReqMsg);
  612. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  613. prScanParam = &prScanInfo->rScanParam;
  614. prScanParam->eScanType = prScanReqMsg->eScanType;
  615. prScanParam->ucBssIndex = prScanReqMsg->ucBssIndex;
  616. prScanParam->ucSSIDType = prScanReqMsg->ucSSIDType;
  617. if (prScanParam->ucSSIDType & (SCAN_REQ_SSID_SPECIFIED | SCAN_REQ_SSID_P2P_WILDCARD)) {
  618. prScanParam->ucSSIDNum = 1;
  619. COPY_SSID(prScanParam->aucSpecifiedSSID[0],
  620. prScanParam->ucSpecifiedSSIDLen[0], prScanReqMsg->aucSSID, prScanReqMsg->ucSSIDLength);
  621. /* reset SSID length to zero for rest array entries */
  622. for (i = 1; i < SCN_SSID_MAX_NUM; i++)
  623. prScanParam->ucSpecifiedSSIDLen[i] = 0;
  624. } else {
  625. prScanParam->ucSSIDNum = 0;
  626. for (i = 0; i < SCN_SSID_MAX_NUM; i++)
  627. prScanParam->ucSpecifiedSSIDLen[i] = 0;
  628. }
  629. prScanParam->u2ProbeDelayTime = 0;
  630. prScanParam->eScanChannel = prScanReqMsg->eScanChannel;
  631. if (prScanParam->eScanChannel == SCAN_CHANNEL_SPECIFIED) {
  632. if (prScanReqMsg->ucChannelListNum <= MAXIMUM_OPERATION_CHANNEL_LIST)
  633. prScanParam->ucChannelListNum = prScanReqMsg->ucChannelListNum;
  634. else
  635. prScanParam->ucChannelListNum = MAXIMUM_OPERATION_CHANNEL_LIST;
  636. kalMemCopy(prScanParam->arChnlInfoList,
  637. prScanReqMsg->arChnlInfoList, sizeof(RF_CHANNEL_INFO_T) * prScanParam->ucChannelListNum);
  638. }
  639. if (prScanReqMsg->u2IELen <= MAX_IE_LENGTH)
  640. prScanParam->u2IELen = prScanReqMsg->u2IELen;
  641. else
  642. prScanParam->u2IELen = MAX_IE_LENGTH;
  643. if (prScanParam->u2IELen)
  644. kalMemCopy(prScanParam->aucIE, prScanReqMsg->aucIE, prScanParam->u2IELen);
  645. prScanParam->u2ChannelDwellTime = prScanReqMsg->u2ChannelDwellTime;
  646. prScanParam->u2TimeoutValue = prScanReqMsg->u2TimeoutValue;
  647. prScanParam->ucSeqNum = prScanReqMsg->ucSeqNum;
  648. if (prScanReqMsg->rMsgHdr.eMsgId == MID_RLM_SCN_SCAN_REQ)
  649. prScanParam->fgIsObssScan = TRUE;
  650. else
  651. prScanParam->fgIsObssScan = FALSE;
  652. prScanParam->fgIsScanV2 = FALSE;
  653. }
  654. /*----------------------------------------------------------------------------*/
  655. /*!
  656. * \brief Scan Message Parsing - V2 with multiple SSID support
  657. *
  658. * \param[in]
  659. *
  660. * \return none
  661. */
  662. /*----------------------------------------------------------------------------*/
  663. VOID scnFsmHandleScanMsgV2(IN P_ADAPTER_T prAdapter, IN P_MSG_SCN_SCAN_REQ_V2 prScanReqMsg)
  664. {
  665. P_SCAN_INFO_T prScanInfo;
  666. P_SCAN_PARAM_T prScanParam;
  667. UINT_32 i;
  668. ASSERT(prAdapter);
  669. ASSERT(prScanReqMsg);
  670. ASSERT(prScanReqMsg->ucSSIDNum <= SCN_SSID_MAX_NUM);
  671. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  672. prScanParam = &prScanInfo->rScanParam;
  673. prScanParam->eScanType = prScanReqMsg->eScanType;
  674. prScanParam->ucBssIndex = prScanReqMsg->ucBssIndex;
  675. prScanParam->ucSSIDType = prScanReqMsg->ucSSIDType;
  676. prScanParam->ucSSIDNum = prScanReqMsg->ucSSIDNum;
  677. for (i = 0; i < prScanReqMsg->ucSSIDNum; i++) {
  678. COPY_SSID(prScanParam->aucSpecifiedSSID[i],
  679. prScanParam->ucSpecifiedSSIDLen[i],
  680. prScanReqMsg->prSsid[i].aucSsid, (UINT_8) prScanReqMsg->prSsid[i].u4SsidLen);
  681. }
  682. prScanParam->u2ProbeDelayTime = prScanReqMsg->u2ProbeDelay;
  683. prScanParam->eScanChannel = prScanReqMsg->eScanChannel;
  684. if (prScanParam->eScanChannel == SCAN_CHANNEL_SPECIFIED) {
  685. if (prScanReqMsg->ucChannelListNum <= MAXIMUM_OPERATION_CHANNEL_LIST)
  686. prScanParam->ucChannelListNum = prScanReqMsg->ucChannelListNum;
  687. else
  688. prScanParam->ucChannelListNum = MAXIMUM_OPERATION_CHANNEL_LIST;
  689. kalMemCopy(prScanParam->arChnlInfoList,
  690. prScanReqMsg->arChnlInfoList, sizeof(RF_CHANNEL_INFO_T) * prScanParam->ucChannelListNum);
  691. }
  692. if (prScanReqMsg->u2IELen <= MAX_IE_LENGTH)
  693. prScanParam->u2IELen = prScanReqMsg->u2IELen;
  694. else
  695. prScanParam->u2IELen = MAX_IE_LENGTH;
  696. if (prScanParam->u2IELen)
  697. kalMemCopy(prScanParam->aucIE, prScanReqMsg->aucIE, prScanParam->u2IELen);
  698. prScanParam->u2ChannelDwellTime = prScanReqMsg->u2ChannelDwellTime;
  699. prScanParam->u2TimeoutValue = prScanReqMsg->u2TimeoutValue;
  700. prScanParam->ucSeqNum = prScanReqMsg->ucSeqNum;
  701. if (prScanReqMsg->rMsgHdr.eMsgId == MID_RLM_SCN_SCAN_REQ)
  702. prScanParam->fgIsObssScan = TRUE;
  703. else
  704. prScanParam->fgIsObssScan = FALSE;
  705. prScanParam->fgIsScanV2 = TRUE;
  706. }
  707. /*----------------------------------------------------------------------------*/
  708. /*!
  709. * \brief Remove pending scan request
  710. *
  711. * \param[in]
  712. *
  713. * \return none
  714. */
  715. /*----------------------------------------------------------------------------*/
  716. VOID scnFsmRemovePendingMsg(IN P_ADAPTER_T prAdapter, IN UINT_8 ucSeqNum, IN UINT_8 ucBssIndex)
  717. {
  718. P_SCAN_INFO_T prScanInfo;
  719. P_SCAN_PARAM_T prScanParam;
  720. P_MSG_HDR_T prPendingMsgHdr, prPendingMsgHdrNext, prRemoveMsgHdr = NULL;
  721. P_LINK_ENTRY_T prRemoveLinkEntry = NULL;
  722. BOOLEAN fgIsRemovingScan = FALSE;
  723. ASSERT(prAdapter);
  724. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  725. prScanParam = &prScanInfo->rScanParam;
  726. /* traverse through rPendingMsgList for removal */
  727. LINK_FOR_EACH_ENTRY_SAFE(prPendingMsgHdr,
  728. prPendingMsgHdrNext, &(prScanInfo->rPendingMsgList), rLinkEntry, MSG_HDR_T) {
  729. if (prPendingMsgHdr->eMsgId == MID_AIS_SCN_SCAN_REQ
  730. || prPendingMsgHdr->eMsgId == MID_BOW_SCN_SCAN_REQ
  731. || prPendingMsgHdr->eMsgId == MID_P2P_SCN_SCAN_REQ
  732. || prPendingMsgHdr->eMsgId == MID_RLM_SCN_SCAN_REQ) {
  733. P_MSG_SCN_SCAN_REQ prScanReqMsg = (P_MSG_SCN_SCAN_REQ) prPendingMsgHdr;
  734. if (ucSeqNum == prScanReqMsg->ucSeqNum && ucBssIndex == prScanReqMsg->ucBssIndex) {
  735. prRemoveLinkEntry = &(prScanReqMsg->rMsgHdr.rLinkEntry);
  736. prRemoveMsgHdr = prPendingMsgHdr;
  737. fgIsRemovingScan = TRUE;
  738. }
  739. } else if (prPendingMsgHdr->eMsgId == MID_AIS_SCN_SCAN_REQ_V2
  740. || prPendingMsgHdr->eMsgId == MID_BOW_SCN_SCAN_REQ_V2
  741. || prPendingMsgHdr->eMsgId == MID_P2P_SCN_SCAN_REQ_V2
  742. || prPendingMsgHdr->eMsgId == MID_RLM_SCN_SCAN_REQ_V2) {
  743. P_MSG_SCN_SCAN_REQ_V2 prScanReqMsgV2 = (P_MSG_SCN_SCAN_REQ_V2) prPendingMsgHdr;
  744. if (ucSeqNum == prScanReqMsgV2->ucSeqNum && ucBssIndex == prScanReqMsgV2->ucBssIndex) {
  745. prRemoveLinkEntry = &(prScanReqMsgV2->rMsgHdr.rLinkEntry);
  746. prRemoveMsgHdr = prPendingMsgHdr;
  747. fgIsRemovingScan = TRUE;
  748. }
  749. }
  750. if (prRemoveLinkEntry) {
  751. if (fgIsRemovingScan == TRUE) {
  752. /* generate scan-done event for caller */
  753. scnFsmGenerateScanDoneMsg(prAdapter, ucSeqNum, ucBssIndex, SCAN_STATUS_CANCELLED);
  754. }
  755. /* remove from pending list */
  756. LINK_REMOVE_KNOWN_ENTRY(&(prScanInfo->rPendingMsgList), prRemoveLinkEntry);
  757. cnmMemFree(prAdapter, prRemoveMsgHdr);
  758. break;
  759. }
  760. }
  761. }
  762. /*----------------------------------------------------------------------------*/
  763. /*!
  764. * \brief
  765. *
  766. * \param[in]
  767. *
  768. * \return none
  769. */
  770. /*----------------------------------------------------------------------------*/
  771. VOID scnEventScanDone(IN P_ADAPTER_T prAdapter, IN P_EVENT_SCAN_DONE prScanDone, BOOLEAN fgIsNewVersion)
  772. {
  773. P_SCAN_INFO_T prScanInfo;
  774. P_SCAN_PARAM_T prScanParam;
  775. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  776. prScanParam = &prScanInfo->rScanParam;
  777. cnmTimerStopTimer(prAdapter, &prScanInfo->rScanDoneTimer);
  778. prScanInfo->ucScanDoneTimeoutCnt = 0;
  779. if (fgIsNewVersion)
  780. DBGLOG(SCN, INFO,
  781. "New scnEventScanDone Version%d! ChanCount=%d,CurState=%d, PNO=%d\n",
  782. prScanDone->ucScanDoneVersion, prScanDone->ucCompleteChanCount,
  783. prScanDone->ucCurrentState, prScanDone->fgIsPNOenabled);
  784. else
  785. DBGLOG(SCN, INFO, "Old scnEventScanDone Version\n");
  786. /* buffer empty channel information */
  787. if (prScanParam->eScanChannel == SCAN_CHANNEL_FULL || prScanParam->eScanChannel == SCAN_CHANNEL_2G4) {
  788. if (prScanDone->ucSparseChannelValid) {
  789. prScanInfo->fgIsSparseChannelValid = TRUE;
  790. prScanInfo->rSparseChannel.eBand = (ENUM_BAND_T) prScanDone->rSparseChannel.ucBand;
  791. prScanInfo->rSparseChannel.ucChannelNum = prScanDone->rSparseChannel.ucChannelNum;
  792. } else {
  793. prScanInfo->fgIsSparseChannelValid = FALSE;
  794. }
  795. }
  796. if (prScanInfo->eCurrentState == SCAN_STATE_SCANNING && prScanDone->ucSeqNum == prScanParam->ucSeqNum) {
  797. /* generate scan-done event for caller */
  798. scnFsmGenerateScanDoneMsg(prAdapter, prScanParam->ucSeqNum, prScanParam->ucBssIndex, SCAN_STATUS_DONE);
  799. /* switch to next pending scan */
  800. scnFsmSteps(prAdapter, SCAN_STATE_IDLE);
  801. } else {
  802. DBGLOG(SCN, WARN, "Unexpected SCAN-DONE event: SeqNum = %d, Current State = %d\n",
  803. prScanDone->ucSeqNum, prScanInfo->eCurrentState);
  804. }
  805. } /* end of scnEventScanDone */
  806. /*----------------------------------------------------------------------------*/
  807. /*!
  808. * \brief
  809. *
  810. * \param[in]
  811. *
  812. * \return none
  813. */
  814. /*----------------------------------------------------------------------------*/
  815. VOID
  816. scnFsmGenerateScanDoneMsg(IN P_ADAPTER_T prAdapter,
  817. IN UINT_8 ucSeqNum, IN UINT_8 ucBssIndex, IN ENUM_SCAN_STATUS eScanStatus)
  818. {
  819. P_SCAN_INFO_T prScanInfo;
  820. P_SCAN_PARAM_T prScanParam;
  821. P_MSG_SCN_SCAN_DONE prScanDoneMsg;
  822. ASSERT(prAdapter);
  823. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  824. prScanParam = &prScanInfo->rScanParam;
  825. prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_DONE));
  826. if (!prScanDoneMsg) {
  827. ASSERT(0); /* Can't indicate SCAN FSM Complete */
  828. return;
  829. }
  830. if (prScanParam->fgIsObssScan == TRUE) {
  831. prScanDoneMsg->rMsgHdr.eMsgId = MID_SCN_RLM_SCAN_DONE;
  832. } else {
  833. switch (GET_BSS_INFO_BY_INDEX(prAdapter, ucBssIndex)->eNetworkType) {
  834. case NETWORK_TYPE_AIS:
  835. prScanDoneMsg->rMsgHdr.eMsgId = MID_SCN_AIS_SCAN_DONE;
  836. break;
  837. case NETWORK_TYPE_P2P:
  838. prScanDoneMsg->rMsgHdr.eMsgId = MID_SCN_P2P_SCAN_DONE;
  839. break;
  840. case NETWORK_TYPE_BOW:
  841. prScanDoneMsg->rMsgHdr.eMsgId = MID_SCN_BOW_SCAN_DONE;
  842. break;
  843. default:
  844. DBGLOG(SCN, LOUD,
  845. "Unexpected Network Type: %d\n",
  846. GET_BSS_INFO_BY_INDEX(prAdapter, ucBssIndex)->eNetworkType);
  847. ASSERT(0);
  848. break;
  849. }
  850. }
  851. prScanDoneMsg->ucSeqNum = ucSeqNum;
  852. prScanDoneMsg->ucBssIndex = ucBssIndex;
  853. prScanDoneMsg->eScanStatus = eScanStatus;
  854. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prScanDoneMsg, MSG_SEND_METHOD_BUF);
  855. } /* end of scnFsmGenerateScanDoneMsg() */
  856. /*----------------------------------------------------------------------------*/
  857. /*!
  858. * \brief Query for most sparse channel
  859. *
  860. * \param[in]
  861. *
  862. * \return none
  863. */
  864. /*----------------------------------------------------------------------------*/
  865. BOOLEAN scnQuerySparseChannel(IN P_ADAPTER_T prAdapter, P_ENUM_BAND_T prSparseBand, PUINT_8 pucSparseChannel)
  866. {
  867. P_SCAN_INFO_T prScanInfo;
  868. ASSERT(prAdapter);
  869. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  870. if (prScanInfo->fgIsSparseChannelValid == TRUE) {
  871. if (prSparseBand)
  872. *prSparseBand = prScanInfo->rSparseChannel.eBand;
  873. if (pucSparseChannel)
  874. *pucSparseChannel = prScanInfo->rSparseChannel.ucChannelNum;
  875. return TRUE;
  876. } else {
  877. return FALSE;
  878. }
  879. }
  880. /*----------------------------------------------------------------------------*/
  881. /*!
  882. * \brief Event handler for NLO done event
  883. *
  884. * \param[in]
  885. *
  886. * \return none
  887. */
  888. /*----------------------------------------------------------------------------*/
  889. VOID scnEventNloDone(IN P_ADAPTER_T prAdapter, IN P_EVENT_NLO_DONE_T prNloDone)
  890. {
  891. P_SCAN_INFO_T prScanInfo;
  892. P_NLO_PARAM_T prNloParam;
  893. P_SCAN_PARAM_T prScanParam;
  894. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  895. prNloParam = &prScanInfo->rNloParam;
  896. prScanParam = &prNloParam->rScanParam;
  897. if (prScanInfo->fgNloScanning == TRUE && prNloDone->ucSeqNum == prScanParam->ucSeqNum) {
  898. DBGLOG(SCN, INFO, "scnEventNloDone reporting to uplayer\n");
  899. kalSchedScanResults(prAdapter->prGlueInfo);
  900. if (prNloParam->fgStopAfterIndication == TRUE)
  901. prScanInfo->fgNloScanning = FALSE;
  902. } else {
  903. DBGLOG(SCN, INFO, "Unexpected NLO-DONE event: SeqNum = %d, Current State = %d\n",
  904. prNloDone->ucSeqNum, prScanInfo->eCurrentState);
  905. }
  906. }
  907. #if 0
  908. /*----------------------------------------------------------------------------*/
  909. /*!
  910. * \brief OID handler for starting scheduled scan
  911. *
  912. * \param[in]
  913. *
  914. * \return none
  915. */
  916. /*----------------------------------------------------------------------------*/
  917. BOOLEAN
  918. scnFsmSchedScanRequest(IN P_ADAPTER_T prAdapter,
  919. IN UINT_8 ucSsidNum,
  920. IN P_PARAM_SSID_T prSsid, IN UINT_32 u4IeLength, IN PUINT_8 pucIe, IN UINT_16 u2Interval)
  921. {
  922. P_SCAN_INFO_T prScanInfo;
  923. P_NLO_PARAM_T prNloParam;
  924. P_SCAN_PARAM_T prScanParam;
  925. P_CMD_NLO_REQ prCmdNloReq;
  926. UINT_32 i, j;
  927. ASSERT(prAdapter);
  928. DBGLOG(SCN, INFO, "scnFsmSchedScanRequest\n");
  929. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  930. prNloParam = &prScanInfo->rNloParam;
  931. prScanParam = &prNloParam->rScanParam;
  932. /* ASSERT(prScanInfo->fgNloScanning == FALSE); */
  933. if (prScanInfo->fgNloScanning) {
  934. DBGLOG(SCN, INFO, ("prScanInfo->fgNloScanning already scanning\n"));
  935. return FALSE;
  936. }
  937. prScanInfo->fgNloScanning = TRUE;
  938. /* 1. load parameters */
  939. prScanParam->ucSeqNum++;
  940. prScanParam->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  941. prNloParam->fgStopAfterIndication = TRUE;
  942. prNloParam->ucFastScanIteration = 0;
  943. if (u2Interval < SCAN_NLO_DEFAULT_INTERVAL) {
  944. u2Interval = SCAN_NLO_DEFAULT_INTERVAL;
  945. DBGLOG(SCN, INFO, "force interval to SCAN_NLO_DEFAULT_INTERVAL\n");
  946. }
  947. prAdapter->prAisBssInfo->fgIsPNOEnable = TRUE;
  948. if (!IS_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex)) {
  949. SET_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  950. DBGLOG(SCN, INFO, "ACTIVE AIS from INACTIVE to enable PNO\n");
  951. /* sync with firmware */
  952. nicActivateNetwork(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  953. }
  954. prNloParam->u2FastScanPeriod = u2Interval;
  955. prNloParam->u2SlowScanPeriod = u2Interval;
  956. if (prScanParam->ucSSIDNum > CFG_SCAN_SSID_MAX_NUM)
  957. prScanParam->ucSSIDNum = CFG_SCAN_SSID_MAX_NUM;
  958. else
  959. prScanParam->ucSSIDNum = ucSsidNum;
  960. if (prNloParam->ucMatchSSIDNum > CFG_SCAN_SSID_MATCH_MAX_NUM)
  961. prNloParam->ucMatchSSIDNum = CFG_SCAN_SSID_MATCH_MAX_NUM;
  962. else
  963. prNloParam->ucMatchSSIDNum = ucSsidNum;
  964. for (i = 0; i < prNloParam->ucMatchSSIDNum; i++) {
  965. if (i < CFG_SCAN_SSID_MAX_NUM) {
  966. COPY_SSID(prScanParam->aucSpecifiedSSID[i],
  967. prScanParam->ucSpecifiedSSIDLen[i], prSsid[i].aucSsid, (UINT_8) prSsid[i].u4SsidLen);
  968. }
  969. COPY_SSID(prNloParam->aucMatchSSID[i],
  970. prNloParam->ucMatchSSIDLen[i], prSsid[i].aucSsid, (UINT_8) prSsid[i].u4SsidLen);
  971. /* for linux the Ciper,Auth Algo will be zero */
  972. prNloParam->aucCipherAlgo[i] = 0;
  973. prNloParam->au2AuthAlgo[i] = 0;
  974. for (j = 0; j < SCN_NLO_NETWORK_CHANNEL_NUM; j++)
  975. prNloParam->aucChannelHint[i][j] = 0;
  976. }
  977. /* 2. prepare command for sending */
  978. prCmdNloReq = (P_CMD_NLO_REQ) cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_NLO_REQ) + prScanParam->u2IELen);
  979. if (!prCmdNloReq) {
  980. ASSERT(0); /* Can't initiate NLO operation */
  981. return FALSE;
  982. }
  983. /* 3. send command packet for NLO operation */
  984. kalMemZero(prCmdNloReq, sizeof(CMD_NLO_REQ));
  985. prCmdNloReq->ucSeqNum = prScanParam->ucSeqNum;
  986. prCmdNloReq->ucBssIndex = prScanParam->ucBssIndex;
  987. prCmdNloReq->fgStopAfterIndication = prNloParam->fgStopAfterIndication;
  988. prCmdNloReq->ucFastScanIteration = prNloParam->ucFastScanIteration;
  989. prCmdNloReq->u2FastScanPeriod = prNloParam->u2FastScanPeriod;
  990. prCmdNloReq->u2SlowScanPeriod = prNloParam->u2SlowScanPeriod;
  991. prCmdNloReq->ucEntryNum = prNloParam->ucMatchSSIDNum;
  992. #ifdef LINUX
  993. prCmdNloReq->ucFlag = SCAN_NLO_CHECK_SSID_ONLY;
  994. DBGLOG(SCN, INFO, "LINUX only check SSID for PNO SCAN\n");
  995. #endif
  996. for (i = 0; i < prNloParam->ucMatchSSIDNum; i++) {
  997. COPY_SSID(prCmdNloReq->arNetworkList[i].aucSSID,
  998. prCmdNloReq->arNetworkList[i].ucSSIDLength,
  999. prNloParam->aucMatchSSID[i], prNloParam->ucMatchSSIDLen[i]);
  1000. prCmdNloReq->arNetworkList[i].ucCipherAlgo = prNloParam->aucCipherAlgo[i];
  1001. prCmdNloReq->arNetworkList[i].u2AuthAlgo = prNloParam->au2AuthAlgo[i];
  1002. DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].aucSSID %s\n", prCmdNloReq->arNetworkList[i].aucSSID);
  1003. DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].ucSSIDLength %d\n",
  1004. prCmdNloReq->arNetworkList[i].ucSSIDLength);
  1005. DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].ucCipherAlgo %d\n",
  1006. prCmdNloReq->arNetworkList[i].ucCipherAlgo);
  1007. DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].u2AuthAlgo %d\n",
  1008. prCmdNloReq->arNetworkList[i].u2AuthAlgo);
  1009. for (j = 0; j < SCN_NLO_NETWORK_CHANNEL_NUM; j++)
  1010. prCmdNloReq->arNetworkList[i].ucNumChannelHint[j] = prNloParam->aucChannelHint[i][j];
  1011. }
  1012. if (prScanParam->u2IELen <= MAX_IE_LENGTH)
  1013. prCmdNloReq->u2IELen = prScanParam->u2IELen;
  1014. else
  1015. prCmdNloReq->u2IELen = MAX_IE_LENGTH;
  1016. if (prScanParam->u2IELen)
  1017. kalMemCopy(prCmdNloReq->aucIE, prScanParam->aucIE, sizeof(UINT_8) * prCmdNloReq->u2IELen);
  1018. if (wlanSendSetQueryCmd(prAdapter,
  1019. CMD_ID_SET_NLO_REQ,
  1020. TRUE,
  1021. FALSE,
  1022. TRUE,
  1023. nicCmdEventSetCommon,
  1024. nicOidCmdTimeoutCommon,
  1025. sizeof(CMD_NLO_REQ) + prCmdNloReq->u2IELen,
  1026. (PUINT_8) prCmdNloReq, NULL, 0) != WLAN_STATUS_FAILURE) {
  1027. cnmMemFree(prAdapter, (PVOID) prCmdNloReq);
  1028. } else {
  1029. cnmMemFree(prAdapter, (PVOID) prCmdNloReq);
  1030. return FALSE;
  1031. }
  1032. return TRUE;
  1033. }
  1034. /*----------------------------------------------------------------------------*/
  1035. /*!
  1036. * \brief OID handler for stopping scheduled scan
  1037. *
  1038. * \param[in]
  1039. *
  1040. * \return none
  1041. */
  1042. /*----------------------------------------------------------------------------*/
  1043. BOOLEAN scnFsmSchedScanStopRequest(IN P_ADAPTER_T prAdapter)
  1044. {
  1045. P_SCAN_INFO_T prScanInfo;
  1046. P_NLO_PARAM_T prNloParam;
  1047. P_SCAN_PARAM_T prScanParam;
  1048. CMD_NLO_CANCEL rCmdNloCancel;
  1049. WLAN_STATUS rStatus;
  1050. ASSERT(prAdapter);
  1051. DBGLOG(SCN, INFO, "scnFsmSchedScanStopRequest\n");
  1052. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1053. prNloParam = &prScanInfo->rNloParam;
  1054. prScanParam = &prNloParam->rScanParam;
  1055. if (prAdapter->prAisBssInfo->fgIsNetRequestInActive && prAdapter->prAisBssInfo->fgIsPNOEnable) {
  1056. UNSET_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1057. DBGLOG(SCN, INFO, "INACTIVE AIS from ACTIVE to DISABLE PNO\n");
  1058. /* sync with firmware */
  1059. nicDeactivateNetwork(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1060. } else {
  1061. DBGLOG(SCN, INFO,
  1062. "fgIsNetRequestInActive %d, fgIsPNOEnable %d\n",
  1063. prAdapter->prAisBssInfo->fgIsNetRequestInActive, prAdapter->prAisBssInfo->fgIsPNOEnable);
  1064. }
  1065. prAdapter->prAisBssInfo->fgIsPNOEnable = FALSE;
  1066. /* send cancel message to firmware domain */
  1067. rCmdNloCancel.ucSeqNum = prScanParam->ucSeqNum;
  1068. rStatus = wlanSendSetQueryCmd(prAdapter, CMD_ID_SET_NLO_CANCEL, TRUE, FALSE, TRUE, nicCmdEventSetStopSchedScan,
  1069. nicOidCmdTimeoutCommon,
  1070. sizeof(CMD_NLO_CANCEL), (PUINT_8) &rCmdNloCancel, NULL, 0);
  1071. prScanInfo->fgNloScanning = FALSE;
  1072. if (rStatus != WLAN_STATUS_FAILURE)
  1073. return TRUE;
  1074. else
  1075. return FALSE;
  1076. }
  1077. #endif
  1078. /*----------------------------------------------------------------------------*/
  1079. /*!
  1080. * \brief handler for starting scheduled scan
  1081. *
  1082. * \param[in]
  1083. *
  1084. * \return none
  1085. */
  1086. /*----------------------------------------------------------------------------*/
  1087. BOOLEAN
  1088. scnFsmSchedScanRequest(IN P_ADAPTER_T prAdapter,
  1089. IN UINT_8 ucSsidNum,
  1090. IN P_PARAM_SSID_T prSsid, IN UINT_32 u4IeLength, IN PUINT_8 pucIe, IN UINT_16 u2Interval)
  1091. {
  1092. P_SCAN_INFO_T prScanInfo;
  1093. P_NLO_PARAM_T prNloParam;
  1094. P_SCAN_PARAM_T prScanParam;
  1095. P_CMD_NLO_REQ prCmdNloReq;
  1096. UINT_32 i, j;
  1097. ASSERT(prAdapter);
  1098. DBGLOG(SCN, INFO, "scnFsmSchedScanRequest\n");
  1099. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1100. prNloParam = &prScanInfo->rNloParam;
  1101. prScanParam = &prNloParam->rScanParam;
  1102. /* ASSERT(prScanInfo->fgNloScanning == FALSE); */
  1103. if (prScanInfo->fgNloScanning) {
  1104. DBGLOG(SCN, INFO, "prScanInfo->fgNloScanning == FALSE already scanning\n");
  1105. return FALSE;
  1106. }
  1107. prScanInfo->fgNloScanning = TRUE;
  1108. /* 1. load parameters */
  1109. prScanParam->ucSeqNum++;
  1110. prScanParam->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  1111. prNloParam->fgStopAfterIndication = TRUE;
  1112. prNloParam->ucFastScanIteration = 0;
  1113. if (u2Interval < SCAN_NLO_DEFAULT_INTERVAL) {
  1114. u2Interval = SCAN_NLO_DEFAULT_INTERVAL;
  1115. DBGLOG(SCN, INFO, "force interval to SCAN_NLO_DEFAULT_INTERVAL\n");
  1116. }
  1117. prAdapter->prAisBssInfo->fgIsPNOEnable = TRUE;
  1118. #if !CFG_SUPPORT_SCN_PSCN
  1119. if (!IS_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex)) {
  1120. SET_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1121. DBGLOG(SCN, INFO, "ACTIVE AIS from INACTIVE to enable PNO\n");
  1122. /* sync with firmware */
  1123. nicActivateNetwork(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1124. }
  1125. #endif
  1126. prNloParam->u2FastScanPeriod = u2Interval;
  1127. prNloParam->u2SlowScanPeriod = u2Interval;
  1128. if (prScanParam->ucSSIDNum > CFG_SCAN_SSID_MAX_NUM)
  1129. prScanParam->ucSSIDNum = CFG_SCAN_SSID_MAX_NUM;
  1130. else
  1131. prScanParam->ucSSIDNum = ucSsidNum;
  1132. if (prNloParam->ucMatchSSIDNum > CFG_SCAN_SSID_MATCH_MAX_NUM)
  1133. prNloParam->ucMatchSSIDNum = CFG_SCAN_SSID_MATCH_MAX_NUM;
  1134. else
  1135. prNloParam->ucMatchSSIDNum = ucSsidNum;
  1136. for (i = 0; i < prNloParam->ucMatchSSIDNum; i++) {
  1137. if (i < CFG_SCAN_SSID_MAX_NUM) {
  1138. COPY_SSID(prScanParam->aucSpecifiedSSID[i],
  1139. prScanParam->ucSpecifiedSSIDLen[i], prSsid[i].aucSsid, (UINT_8) prSsid[i].u4SsidLen);
  1140. }
  1141. COPY_SSID(prNloParam->aucMatchSSID[i],
  1142. prNloParam->ucMatchSSIDLen[i], prSsid[i].aucSsid, (UINT_8) prSsid[i].u4SsidLen);
  1143. /* for linux the Ciper,Auth Algo will be zero */
  1144. prNloParam->aucCipherAlgo[i] = 0;
  1145. prNloParam->au2AuthAlgo[i] = 0;
  1146. for (j = 0; j < SCN_NLO_NETWORK_CHANNEL_NUM; j++)
  1147. prNloParam->aucChannelHint[i][j] = 0;
  1148. }
  1149. /* 2. prepare command for sending */
  1150. prCmdNloReq = (P_CMD_NLO_REQ) cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_NLO_REQ) + prScanParam->u2IELen);
  1151. if (!prCmdNloReq) {
  1152. ASSERT(0); /* Can't initiate NLO operation */
  1153. return FALSE;
  1154. }
  1155. /* 3. send command packet for NLO operation */
  1156. kalMemZero(prCmdNloReq, sizeof(CMD_NLO_REQ));
  1157. prCmdNloReq->ucSeqNum = prScanParam->ucSeqNum;
  1158. prCmdNloReq->ucBssIndex = prScanParam->ucBssIndex;
  1159. prCmdNloReq->fgStopAfterIndication = prNloParam->fgStopAfterIndication;
  1160. prCmdNloReq->ucFastScanIteration = prNloParam->ucFastScanIteration;
  1161. prCmdNloReq->u2FastScanPeriod = prNloParam->u2FastScanPeriod;
  1162. prCmdNloReq->u2SlowScanPeriod = prNloParam->u2SlowScanPeriod;
  1163. prCmdNloReq->ucEntryNum = prNloParam->ucMatchSSIDNum;
  1164. #ifdef LINUX
  1165. prCmdNloReq->ucFlag = SCAN_NLO_CHECK_SSID_ONLY;
  1166. DBGLOG(SCN, INFO, "LINUX only check SSID for PNO SCAN\n");
  1167. #endif
  1168. for (i = 0; i < prNloParam->ucMatchSSIDNum; i++) {
  1169. COPY_SSID(prCmdNloReq->arNetworkList[i].aucSSID,
  1170. prCmdNloReq->arNetworkList[i].ucSSIDLength,
  1171. prNloParam->aucMatchSSID[i], prNloParam->ucMatchSSIDLen[i]);
  1172. prCmdNloReq->arNetworkList[i].ucCipherAlgo = prNloParam->aucCipherAlgo[i];
  1173. prCmdNloReq->arNetworkList[i].u2AuthAlgo = prNloParam->au2AuthAlgo[i];
  1174. DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].aucSSID %s\n", prCmdNloReq->arNetworkList[i].aucSSID);
  1175. DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].ucSSIDLength %d\n",
  1176. prCmdNloReq->arNetworkList[i].ucSSIDLength);
  1177. DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].ucCipherAlgo %d\n",
  1178. prCmdNloReq->arNetworkList[i].ucCipherAlgo);
  1179. DBGLOG(SCN, INFO, "prCmdNloReq->arNetworkList[i].u2AuthAlgo %d\n",
  1180. prCmdNloReq->arNetworkList[i].u2AuthAlgo);
  1181. for (j = 0; j < SCN_NLO_NETWORK_CHANNEL_NUM; j++)
  1182. prCmdNloReq->arNetworkList[i].ucNumChannelHint[j] = prNloParam->aucChannelHint[i][j];
  1183. }
  1184. if (prScanParam->u2IELen <= MAX_IE_LENGTH)
  1185. prCmdNloReq->u2IELen = prScanParam->u2IELen;
  1186. else
  1187. prCmdNloReq->u2IELen = MAX_IE_LENGTH;
  1188. if (prScanParam->u2IELen)
  1189. kalMemCopy(prCmdNloReq->aucIE, prScanParam->aucIE, sizeof(UINT_8) * prCmdNloReq->u2IELen);
  1190. #if !CFG_SUPPORT_SCN_PSCN
  1191. if (wlanSendSetQueryCmd(prAdapter,
  1192. CMD_ID_SET_NLO_REQ,
  1193. TRUE,
  1194. FALSE,
  1195. TRUE,
  1196. nicCmdEventSetCommon,
  1197. nicOidCmdTimeoutCommon,
  1198. sizeof(CMD_NLO_REQ) + prCmdNloReq->u2IELen,
  1199. (PUINT_8) prCmdNloReq, NULL, 0) != WLAN_STATUS_FAILURE)
  1200. return TRUE;
  1201. else
  1202. return FALSE;
  1203. #else
  1204. scnPSCNFsm(prAdapter, PSCN_RESET, prCmdNloReq, NULL, NULL, NULL, FALSE, FALSE, FALSE, FALSE);
  1205. #endif
  1206. cnmMemFree(prAdapter, (PVOID) prCmdNloReq);
  1207. return TRUE;
  1208. }
  1209. /*----------------------------------------------------------------------------*/
  1210. /*!
  1211. * \brief handler for stopping scheduled scan
  1212. *
  1213. * \param[in]
  1214. *
  1215. * \return none
  1216. */
  1217. /*----------------------------------------------------------------------------*/
  1218. BOOLEAN scnFsmSchedScanStopRequest(IN P_ADAPTER_T prAdapter)
  1219. {
  1220. P_SCAN_INFO_T prScanInfo;
  1221. P_NLO_PARAM_T prNloParam;
  1222. P_SCAN_PARAM_T prScanParam;
  1223. CMD_NLO_CANCEL rCmdNloCancel;
  1224. ASSERT(prAdapter);
  1225. DBGLOG(SCN, INFO, "scnFsmSchedScanStopRequest\n");
  1226. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1227. prNloParam = &prScanInfo->rNloParam;
  1228. prScanParam = &prNloParam->rScanParam;
  1229. if (prAdapter->prAisBssInfo->fgIsNetRequestInActive && prAdapter->prAisBssInfo->fgIsPNOEnable) {
  1230. UNSET_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1231. DBGLOG(SCN, INFO, "INACTIVE AIS from ACTIVE to DISABLE PNO\n");
  1232. /* sync with firmware */
  1233. nicDeactivateNetwork(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1234. } else {
  1235. DBGLOG(SCN, INFO, "fgIsNetRequestInActive %d, fgIsPNOEnable %d\n",
  1236. prAdapter->prAisBssInfo->fgIsNetRequestInActive, prAdapter->prAisBssInfo->fgIsPNOEnable);
  1237. }
  1238. prAdapter->prAisBssInfo->fgIsPNOEnable = FALSE;
  1239. /* send cancel message to firmware domain */
  1240. rCmdNloCancel.ucSeqNum = prScanParam->ucSeqNum;
  1241. #if !CFG_SUPPORT_SCN_PSCN
  1242. if (wlanSendSetQueryCmd(prAdapter,
  1243. CMD_ID_SET_NLO_CANCEL,
  1244. TRUE,
  1245. FALSE,
  1246. TRUE,
  1247. nicCmdEventSetStopSchedScan,
  1248. nicOidCmdTimeoutCommon,
  1249. sizeof(CMD_NLO_CANCEL), (PUINT_8) (&rCmdNloCancel), NULL, 0) != WLAN_STATUS_FAILURE)
  1250. return TRUE;
  1251. else
  1252. return FALSE;
  1253. #else
  1254. scnPSCNFsm(prAdapter, PSCN_RESET, NULL, NULL, NULL, NULL, TRUE, FALSE, FALSE, FALSE);
  1255. prScanInfo->fgNloScanning = FALSE;
  1256. return TRUE;
  1257. #endif
  1258. }
  1259. #if CFG_SUPPORT_GSCN
  1260. /*----------------------------------------------------------------------------*/
  1261. /*!
  1262. * \brief handler for Set PSCN action
  1263. *
  1264. * \param[in]
  1265. *
  1266. * \return none
  1267. */
  1268. /*----------------------------------------------------------------------------*/
  1269. BOOLEAN scnFsmPSCNAction(IN P_ADAPTER_T prAdapter, IN UINT_8 ucPscanAct)
  1270. {
  1271. CMD_SET_PSCAN_ENABLE rCmdPscnAction;
  1272. P_SCAN_INFO_T prScanInfo;
  1273. rCmdPscnAction.ucPscanAct = ucPscanAct;
  1274. DBGLOG(SCN, INFO, "scnFsmPSCNAction Act = %d\n", ucPscanAct);
  1275. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1276. if (ucPscanAct == DISABLE)
  1277. prScanInfo->fgPscnOnnning = FALSE;
  1278. if (ucPscanAct == ENABLE)
  1279. prScanInfo->fgPscnOnnning = TRUE;
  1280. wlanSendSetQueryCmd(prAdapter,
  1281. CMD_ID_SET_PSCN_ENABLE,
  1282. TRUE,
  1283. FALSE, TRUE, NULL, NULL, sizeof(CMD_SET_PSCAN_ENABLE),
  1284. (PUINT_8) (&rCmdPscnAction), NULL, 0);
  1285. DBGLOG(SCN, INFO, "scnFsmPSCNAction Act = %d is Set to FW\n", ucPscanAct);
  1286. return TRUE;
  1287. }
  1288. /*----------------------------------------------------------------------------*/
  1289. /*!
  1290. * \brief handler for Set PSCN param
  1291. * \param[in]
  1292. *
  1293. * \return none
  1294. */
  1295. /*----------------------------------------------------------------------------*/
  1296. BOOLEAN scnFsmPSCNSetParam(IN P_ADAPTER_T prAdapter, IN P_CMD_SET_PSCAN_PARAM prCmdPscnParam)
  1297. {
  1298. UINT_8 i, j;
  1299. DEBUGFUNC("scnFsmPSCNSetParam()");
  1300. DBGLOG(SCN, INFO, "scnFsmPSCNSetParam\n");
  1301. ASSERT(prAdapter);
  1302. prCmdPscnParam->u4BasePeriod = prCmdPscnParam->u4BasePeriod;
  1303. #if 1
  1304. DBGLOG(SCN, INFO,
  1305. "rCmdPscnParam.rCmdGscnParam : u4BasePeriod[%u], ucNumScnToCache[%u], u4BufferThreshold[%u], u4NumBuckets[%u],fgGSCN[%d] fgNLO[%d] fgBatch[%d]\n",
  1306. prCmdPscnParam->rCmdGscnReq.u4BasePeriod,
  1307. prCmdPscnParam->rCmdGscnReq.ucNumScnToCache,
  1308. prCmdPscnParam->rCmdGscnReq.u4BufferThreshold,
  1309. prCmdPscnParam->rCmdGscnReq.u4NumBuckets, prCmdPscnParam->fgGScnEnable,
  1310. prCmdPscnParam->fgNLOScnEnable, prCmdPscnParam->fgBatchScnEnable);
  1311. i = j = 0;
  1312. for (i = 0; i < prCmdPscnParam->rCmdGscnReq.u4NumBuckets; i++) {
  1313. DBGLOG(SCN, INFO,
  1314. "rCmdPscnParam.rCmdGscnReq.arChannelBucket[%d] : band[%u], arChannelBucket[%u] ucNumChannels[%u], ucBucketFreqMultiple[%u] ucReportFlag[%u]\n",
  1315. i, prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].eBand,
  1316. prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].u2BucketIndex,
  1317. prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucNumChannels,
  1318. prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucBucketFreqMultiple,
  1319. prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucReportFlag);
  1320. DBGLOG(SCN, INFO, "rCmdPscnParam.rCmdGscnParam.arChannelBucket[%d] has channel: ", i);
  1321. for (j = 0; j < prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucNumChannels; j++) {
  1322. DBGLOG(SCN, INFO, " %d, ",
  1323. prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].arChannelList[j].ucChannel);
  1324. }
  1325. DBGLOG(SCN, INFO, "\n");
  1326. }
  1327. #endif
  1328. if (1 /*prScanInfo->fgPscnOnnning == FALSE */) {
  1329. wlanSendSetQueryCmd(prAdapter,
  1330. CMD_ID_SET_PSCAN_PARAM,
  1331. TRUE,
  1332. FALSE,
  1333. TRUE, NULL, NULL, sizeof(CMD_SET_PSCAN_PARAM), (PUINT_8) prCmdPscnParam, NULL, 0);
  1334. DBGLOG(SCN, INFO, "CMD_ID_SET_PSCAN_PARAM is set to FW !!!!!!!!!!\n");
  1335. return TRUE;
  1336. } else
  1337. return FALSE;
  1338. }
  1339. /*----------------------------------------------------------------------------*/
  1340. /*!
  1341. * \brief handler for Set hotlist
  1342. *
  1343. * \param[in]
  1344. *
  1345. * \return none
  1346. */
  1347. /*----------------------------------------------------------------------------*/
  1348. BOOLEAN scnFsmPSCNSetHotlist(IN P_ADAPTER_T prAdapter, IN P_CMD_SET_PSCAN_ADD_HOTLIST_BSSID prCmdPscnAddHotlist)
  1349. {
  1350. CMD_SET_PSCAN_ADD_HOTLIST_BSSID rCmdPscnAddHotlist;
  1351. P_SCAN_INFO_T prScanInfo;
  1352. ASSERT(prAdapter);
  1353. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1354. memcpy(&rCmdPscnAddHotlist.aucMacAddr, &(prCmdPscnAddHotlist->aucMacAddr), sizeof(MAC_ADDR_LEN));
  1355. /* rCmdPscnAddHotlist.aucMacAddr = prCmdPscnAddHotlist->aucMacAddr; */
  1356. rCmdPscnAddHotlist.ucFlags = prCmdPscnAddHotlist->ucFlags;
  1357. if (prScanInfo->fgPscnOnnning && prScanInfo->prPscnParam->fgGScnEnable) {
  1358. wlanSendSetQueryCmd(prAdapter,
  1359. CMD_ID_SET_PSCN_ADD_HOTLIST_BSSID,
  1360. TRUE,
  1361. FALSE,
  1362. TRUE,
  1363. NULL,
  1364. NULL,
  1365. sizeof(CMD_SET_PSCAN_ADD_HOTLIST_BSSID), (PUINT_8) (&rCmdPscnAddHotlist), NULL, 0);
  1366. } else {
  1367. /* debug msg, No PSCN, Sched SCAN no need to add the hotlist ??? */
  1368. return FALSE;
  1369. }
  1370. return TRUE;
  1371. }
  1372. /*----------------------------------------------------------------------------*/
  1373. /*!
  1374. * \brief handler for Set CMD_ID_SET_PSCN_ADD_SW_BSSID
  1375. *
  1376. * \param[in]
  1377. *
  1378. * \return none
  1379. */
  1380. /*----------------------------------------------------------------------------*/
  1381. BOOLEAN scnFsmPSCNAddSWCBssId(IN P_ADAPTER_T prAdapter, IN P_CMD_SET_PSCAN_ADD_SWC_BSSID prCmdPscnAddSWCBssId)
  1382. {
  1383. CMD_SET_PSCAN_ADD_SWC_BSSID rCmdPscnAddSWCBssId;
  1384. P_SCAN_INFO_T prScanInfo;
  1385. ASSERT(prAdapter);
  1386. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1387. memcpy(&rCmdPscnAddSWCBssId.aucMacAddr, &(prCmdPscnAddSWCBssId->aucMacAddr), sizeof(MAC_ADDR_LEN));
  1388. /* rCmdPscnAddSWCBssId.aucMacAddr = prCmdPscnAddSWCBssId->aucMacAddr; */
  1389. rCmdPscnAddSWCBssId.i4RssiHighThreshold = prCmdPscnAddSWCBssId->i4RssiHighThreshold;
  1390. rCmdPscnAddSWCBssId.i4RssiLowThreshold = prCmdPscnAddSWCBssId->i4RssiLowThreshold;
  1391. if (prScanInfo->fgPscnOnnning && prScanInfo->prPscnParam->fgGScnEnable) {
  1392. wlanSendSetQueryCmd(prAdapter,
  1393. CMD_ID_SET_PSCN_ADD_SW_BSSID,
  1394. TRUE,
  1395. FALSE,
  1396. TRUE,
  1397. NULL,
  1398. NULL,
  1399. sizeof(CMD_SET_PSCAN_ADD_SWC_BSSID), (PUINT_8) (&rCmdPscnAddSWCBssId), NULL, 0);
  1400. } else {
  1401. /* debug msg, No PSCN, Sched SCAN no need to add the hotlist ??? */
  1402. return FALSE;
  1403. }
  1404. return TRUE;
  1405. }
  1406. /*----------------------------------------------------------------------------*/
  1407. /*!
  1408. * \brief handler for Set CMD_ID_SET_PSCN_MAC_ADDR
  1409. *
  1410. * \param[in]
  1411. *
  1412. * \return none
  1413. */
  1414. /*----------------------------------------------------------------------------*/
  1415. BOOLEAN scnFsmPSCNSetMacAddr(IN P_ADAPTER_T prAdapter, IN P_CMD_SET_PSCAN_MAC_ADDR prCmdPscnSetMacAddr)
  1416. {
  1417. CMD_SET_PSCAN_MAC_ADDR rCmdPscnSetMacAddr;
  1418. P_SCAN_INFO_T prScanInfo;
  1419. ASSERT(prAdapter);
  1420. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1421. /* rCmdPscnSetMacAddr.aucMacAddr = prCmdPscnSetMacAddr->aucMacAddr; */
  1422. memcpy(&rCmdPscnSetMacAddr.aucMacAddr, &(prCmdPscnSetMacAddr->aucMacAddr), sizeof(MAC_ADDR_LEN));
  1423. rCmdPscnSetMacAddr.ucFlags = prCmdPscnSetMacAddr->ucFlags;
  1424. rCmdPscnSetMacAddr.ucVersion = prCmdPscnSetMacAddr->ucVersion;
  1425. if (1 /* (prScanInfo->fgPscnOnnning == TRUE */) {
  1426. wlanSendSetQueryCmd(prAdapter,
  1427. CMD_ID_SET_PSCN_MAC_ADDR,
  1428. TRUE,
  1429. FALSE,
  1430. TRUE,
  1431. NULL,
  1432. NULL, sizeof(CMD_SET_PSCAN_MAC_ADDR), (PUINT_8) (&rCmdPscnSetMacAddr), NULL, 0);
  1433. } else {
  1434. /* debug msg, No PSCN, Sched SCAN no need to add the hotlist ??? */
  1435. return FALSE;
  1436. }
  1437. return TRUE;
  1438. }
  1439. /*----------------------------------------------------------------------------*/
  1440. /*!
  1441. * \brief handler for Set GSCN param
  1442. * \param[in]
  1443. *
  1444. * \return none
  1445. */
  1446. /*----------------------------------------------------------------------------*/
  1447. BOOLEAN scnSetGSCNParam(IN P_ADAPTER_T prAdapter, IN P_PARAM_WIFI_GSCAN_CMD_PARAMS prCmdGscnParam)
  1448. {
  1449. CMD_GSCN_REQ_T rCmdGscnParam;
  1450. P_SCAN_INFO_T prScanInfo;
  1451. UINT_8 ucChannelBuckIndex = 0;
  1452. UINT_8 i = 0;
  1453. DBGLOG(SCN, INFO, "scnSetGSCNParam\n");
  1454. ASSERT(prAdapter);
  1455. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1456. rCmdGscnParam.u4NumBuckets = prCmdGscnParam->num_buckets;
  1457. rCmdGscnParam.u4BasePeriod = prCmdGscnParam->base_period;
  1458. DBGLOG(SCN, INFO, "u4BasePeriod[%d], u4NumBuckets[%d]: ", rCmdGscnParam.u4BasePeriod,
  1459. rCmdGscnParam.u4NumBuckets);
  1460. DBGLOG(SCN, INFO, "\n");
  1461. for (ucChannelBuckIndex = 0; ucChannelBuckIndex < prCmdGscnParam->num_buckets; ucChannelBuckIndex++) {
  1462. DBGLOG(SCN, INFO, "assign channels to bucket[%d]:\n", ucChannelBuckIndex);
  1463. for (i = 0; i < prCmdGscnParam->buckets[ucChannelBuckIndex].num_channels; i++) {
  1464. rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].arChannelList[i].ucChannel =
  1465. (UINT_8) nicFreq2ChannelNum(prCmdGscnParam->buckets[ucChannelBuckIndex].
  1466. channels[i].channel * 1000);
  1467. rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].arChannelList[i].ucPassive =
  1468. (UINT_8) prCmdGscnParam->buckets[ucChannelBuckIndex].channels[i].passive;
  1469. rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].arChannelList[i].u4DwellTimeMs =
  1470. (UINT_8) prCmdGscnParam->buckets[ucChannelBuckIndex].channels[i].dwellTimeMs;
  1471. DBGLOG(SCN, INFO, " [ucChannel %d, ucPassive %d, u4DwellTimeMs %d\n",
  1472. rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].arChannelList[i].ucChannel,
  1473. rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].arChannelList[i].ucPassive,
  1474. rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].arChannelList[i].u4DwellTimeMs);
  1475. }
  1476. rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].u2BucketIndex =
  1477. (UINT_16) prCmdGscnParam->buckets[ucChannelBuckIndex].bucket;
  1478. rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].eBand =
  1479. prCmdGscnParam->buckets[ucChannelBuckIndex].band;
  1480. rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].ucBucketFreqMultiple =
  1481. (prCmdGscnParam->buckets[ucChannelBuckIndex].period / prCmdGscnParam->base_period);
  1482. rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].ucNumChannels =
  1483. prCmdGscnParam->buckets[ucChannelBuckIndex].num_channels;
  1484. rCmdGscnParam.arChannelBucket[ucChannelBuckIndex].ucReportFlag =
  1485. prCmdGscnParam->buckets[ucChannelBuckIndex].report_events;
  1486. /* TODO: This is not make sense at all, always return true*/
  1487. }
  1488. DBGLOG(SCN, INFO, "scnSetGSCNParam ---> scnPSCNFsm PSCN_RESET\n");
  1489. DBGLOG(SCN, INFO, "/* setup new PSCN cmd */\n");
  1490. DBGLOG(SCN, INFO, "scnSetGSCNParam ---> scnPSCNFsm PSCN_RESET\n");
  1491. DBGLOG(SCN, INFO, "/* setup new PSCN cmd */\n");
  1492. scnPSCNFsm(prAdapter, PSCN_RESET, NULL, NULL, &rCmdGscnParam, NULL, FALSE, FALSE, FALSE, FALSE);
  1493. DBGLOG(SCN, INFO, "scnSetGSCNParam <-----\n");
  1494. return TRUE;
  1495. }
  1496. /*----------------------------------------------------------------------------*/
  1497. /*!
  1498. * \brief handler for Combine PNO Scan params into PSCAN param
  1499. * \param[in]
  1500. *
  1501. * \return none
  1502. */
  1503. /*----------------------------------------------------------------------------*/
  1504. VOID
  1505. scnSubCombineNLOtoPSCN(IN P_ADAPTER_T prAdapter,
  1506. IN P_CMD_NLO_REQ prNewCmdNloReq, IN P_CMD_SET_PSCAN_PARAM prCmdPscnParam)
  1507. {
  1508. P_SCAN_INFO_T prScanInfo;
  1509. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1510. DBGLOG(SCN, INFO, " scnSubCombineNLOtoPSCN\n");
  1511. ASSERT(prAdapter);
  1512. if (prNewCmdNloReq) {
  1513. prCmdPscnParam->fgNLOScnEnable = TRUE;
  1514. memcpy(&prCmdPscnParam->rCmdNloReq, prNewCmdNloReq, sizeof(CMD_NLO_REQ));
  1515. } else if (prScanInfo->prPscnParam->fgNLOScnEnable) {
  1516. memcpy(&prCmdPscnParam->rCmdNloReq, &prScanInfo->prPscnParam->rCurrentCmdNloReq, sizeof(CMD_NLO_REQ));
  1517. } else
  1518. prCmdPscnParam->fgNLOScnEnable = FALSE;
  1519. }
  1520. /*----------------------------------------------------------------------------*/
  1521. /*!
  1522. * \brief handler for Combine Batcht Scan params into PSCAN param
  1523. * \param[in]
  1524. *
  1525. * \return none
  1526. */
  1527. /*----------------------------------------------------------------------------*/
  1528. VOID
  1529. scnSubCombineBatchSCNtoPSCN(IN P_ADAPTER_T prAdapter,
  1530. IN P_CMD_BATCH_REQ_T prNewCmdBatchReq, IN P_CMD_SET_PSCAN_PARAM prCmdPscnParam)
  1531. {
  1532. P_SCAN_INFO_T prScanInfo;
  1533. DBGLOG(SCN, INFO, " scnSubCombineBatchSCNtoPSCN\n");
  1534. ASSERT(prAdapter);
  1535. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1536. if (prNewCmdBatchReq) {
  1537. prCmdPscnParam->fgBatchScnEnable = TRUE;
  1538. memcpy(&prCmdPscnParam->rCmdBatchReq, prNewCmdBatchReq, sizeof(CMD_BATCH_REQ_T));
  1539. } else if (prScanInfo->prPscnParam->fgBatchScnEnable) {
  1540. memcpy(&prCmdPscnParam->rCmdBatchReq, &prScanInfo->prPscnParam->rCurrentCmdBatchReq,
  1541. sizeof(CMD_BATCH_REQ_T));
  1542. } else
  1543. prCmdPscnParam->fgBatchScnEnable = FALSE;
  1544. }
  1545. /*----------------------------------------------------------------------------*/
  1546. /*!
  1547. * \brief handler for Combine GSCN Scan params into PSCAN param
  1548. * \param[in]
  1549. *
  1550. * \return none
  1551. */
  1552. /*----------------------------------------------------------------------------*/
  1553. VOID
  1554. scnSubCombineGSCNtoPSCN(IN P_ADAPTER_T prAdapter,
  1555. IN P_CMD_GSCN_REQ_T prNewCmdGscnReq,
  1556. IN P_CMD_GSCN_SCN_COFIG_T prNewCmdGscnConfig, IN P_CMD_SET_PSCAN_PARAM prCmdPscnParam)
  1557. {
  1558. P_SCAN_INFO_T prScanInfo;
  1559. UINT_32 ucPeriodMin = MAX_PERIOD;
  1560. DBGLOG(SCN, INFO, " scnSubCombineGSCNtoPSCN\n");
  1561. ASSERT(prAdapter);
  1562. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1563. prCmdPscnParam->fgGScnEnable = FALSE;
  1564. DBGLOG(SCN, INFO, "scnSubCombineGSCNtoPSCN fgGScnParamSet %d fgGScnConfigSet %d\n",
  1565. prScanInfo->fgGScnParamSet, prScanInfo->fgGScnConfigSet);
  1566. if (prNewCmdGscnReq) {
  1567. DBGLOG(SCN, INFO, "setup prNewCmdGscnReq\n");
  1568. prScanInfo->fgGScnParamSet = TRUE;
  1569. memcpy(&prCmdPscnParam->rCmdGscnReq, prNewCmdGscnReq, sizeof(CMD_GSCN_REQ_T));
  1570. if (ucPeriodMin > prNewCmdGscnReq->u4BasePeriod)
  1571. prCmdPscnParam->u4BasePeriod = prNewCmdGscnReq->u4BasePeriod;
  1572. } else if (prScanInfo->fgGScnParamSet) {
  1573. DBGLOG(SCN, INFO, "no new prNewCmdGscnReq but there is a old one\n");
  1574. memcpy(&prCmdPscnParam->rCmdGscnReq, &prScanInfo->prPscnParam->rCurrentCmdGscnReq,
  1575. sizeof(CMD_GSCN_REQ_T));
  1576. } else
  1577. prScanInfo->fgGScnParamSet = FALSE;
  1578. if (prNewCmdGscnConfig) {
  1579. DBGLOG(SCN, INFO, "set up prNewCmdGscnConfig\n");
  1580. memcpy(prCmdPscnParam, prScanInfo->prPscnParam, sizeof(CMD_SET_PSCAN_PARAM));
  1581. prScanInfo->fgGScnConfigSet = TRUE;
  1582. prCmdPscnParam->rCmdGscnReq.u4BufferThreshold = prNewCmdGscnConfig->u4BufferThreshold;
  1583. prCmdPscnParam->rCmdGscnReq.ucNumScnToCache = (UINT_8) prNewCmdGscnConfig->u4NumScnToCache;
  1584. prCmdPscnParam->rCmdGscnReq.u4MaxApPerScan = (UINT_8) prNewCmdGscnConfig->ucNumApPerScn;
  1585. } else if (prScanInfo->fgGScnConfigSet) {
  1586. DBGLOG(SCN, INFO, "no new prNewCmdGscnConfig but there is a old one\n");
  1587. memcpy(prCmdPscnParam, prScanInfo->prPscnParam, sizeof(CMD_SET_PSCAN_PARAM));
  1588. } else
  1589. prScanInfo->fgGScnConfigSet = FALSE;
  1590. }
  1591. /*----------------------------------------------------------------------------*/
  1592. /*!
  1593. * \brief handler for Combine GSCN Scan params into PSCAN param
  1594. * \param[in]
  1595. *
  1596. * \return none
  1597. */
  1598. /*----------------------------------------------------------------------------*/
  1599. VOID
  1600. scnRemoveFromPSCN(IN P_ADAPTER_T prAdapter,
  1601. IN BOOLEAN fgRemoveNLOfromPSCN,
  1602. IN BOOLEAN fgRemoveBatchSCNfromPSCN,
  1603. IN BOOLEAN fgRemoveGSCNfromPSCN, IN P_CMD_SET_PSCAN_PARAM prCmdPscnParam)
  1604. {
  1605. UINT_8 ucPscanAct = DISABLE;
  1606. P_SCAN_INFO_T prScanInfo;
  1607. ASSERT(prAdapter);
  1608. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1609. {
  1610. DBGLOG(SCN, INFO, "remove NLO or Batch or GSCN from PSCN--->\n");
  1611. if (fgRemoveNLOfromPSCN) {
  1612. DBGLOG(SCN, INFO, "DisableNLO\n");
  1613. memcpy(prCmdPscnParam, prScanInfo->prPscnParam, sizeof(CMD_SET_PSCAN_PARAM));
  1614. prCmdPscnParam->fgNLOScnEnable = FALSE;
  1615. kalMemZero(&prCmdPscnParam->rCmdNloReq, sizeof(CMD_NLO_REQ));
  1616. kalMemZero(&prScanInfo->prPscnParam->rCurrentCmdNloReq, sizeof(CMD_NLO_REQ));
  1617. }
  1618. if (fgRemoveBatchSCNfromPSCN) {
  1619. DBGLOG(SCN, INFO, "DisableBatch\n");
  1620. memcpy(prCmdPscnParam, prScanInfo->prPscnParam, sizeof(CMD_SET_PSCAN_PARAM));
  1621. prCmdPscnParam->fgBatchScnEnable = FALSE;
  1622. kalMemZero(&prCmdPscnParam->rCmdBatchReq, sizeof(CMD_BATCH_REQ_T));
  1623. kalMemZero(&prScanInfo->prPscnParam->rCurrentCmdBatchReq, sizeof(CMD_BATCH_REQ_T));
  1624. }
  1625. if (fgRemoveGSCNfromPSCN) {
  1626. DBGLOG(SCN, INFO, "DisableGSCN\n");
  1627. memcpy(prCmdPscnParam, prScanInfo->prPscnParam, sizeof(CMD_SET_PSCAN_PARAM));
  1628. prCmdPscnParam->fgGScnEnable = FALSE;
  1629. prScanInfo->fgGScnParamSet = FALSE;
  1630. prScanInfo->fgGScnConfigSet = FALSE;
  1631. kalMemZero(&prCmdPscnParam->rCmdGscnReq, sizeof(CMD_GSCN_REQ_T));
  1632. kalMemZero(&prScanInfo->prPscnParam->rCurrentCmdGscnReq, sizeof(CMD_GSCN_REQ_T));
  1633. }
  1634. if (!fgRemoveNLOfromPSCN && !fgRemoveBatchSCNfromPSCN && !fgRemoveGSCNfromPSCN) {
  1635. /* prCmdPscnParam->fgIsPeriodicallyScn = FALSE; */
  1636. prScanInfo->fgPscnOnnning = FALSE;
  1637. scnFsmPSCNSetParam(prAdapter, prCmdPscnParam);
  1638. ucPscanAct = DISABLE;
  1639. scnFsmPSCNAction(prAdapter, ucPscanAct);
  1640. DBGLOG(SCN, INFO,
  1641. "(!fgRemoveNLOfromPSCN && !fgRemoveBatchSCNfromPSCN && !fgRemoveGSCNfromPSCN)<-----\n");
  1642. } else {
  1643. /* prCmdPscnParam->fgIsPeriodicallyScn = TRUE; */
  1644. scnFsmPSCNSetParam(prAdapter, prCmdPscnParam);
  1645. DBGLOG(SCN, INFO, " disable NLO or GSCN or Batch bu fgIsPeriodicallyScn = TRUE <-----\n");
  1646. }
  1647. }
  1648. }
  1649. #if 1
  1650. /*----------------------------------------------------------------------------*/
  1651. /*!
  1652. * \brief handler for Combine GSCN , Batch, PNO Scan params into PSCAN param
  1653. * \param[in]
  1654. *
  1655. * \return none
  1656. */
  1657. /*----------------------------------------------------------------------------*/
  1658. BOOLEAN
  1659. scnCombineParamsIntoPSCN(IN P_ADAPTER_T prAdapter,
  1660. IN P_CMD_NLO_REQ prNewCmdNloReq,
  1661. IN P_CMD_BATCH_REQ_T prNewCmdBatchReq,
  1662. IN P_CMD_GSCN_REQ_T prNewCmdGscnReq,
  1663. IN P_CMD_GSCN_SCN_COFIG_T prNewCmdGscnConfig,
  1664. IN BOOLEAN fgRemoveNLOfromPSCN,
  1665. IN BOOLEAN fgRemoveBatchSCNfromPSCN, IN BOOLEAN fgRemoveGSCNfromPSCN)
  1666. {
  1667. P_SCAN_INFO_T prScanInfo;
  1668. /* CMD_SET_PSCAN_PARAM rCmdPscnParam; */
  1669. P_CMD_SET_PSCAN_PARAM prCmdPscnParam;
  1670. UINT_8 i, j = 0;
  1671. ASSERT(prAdapter);
  1672. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1673. prCmdPscnParam = (P_CMD_SET_PSCAN_PARAM) kalMemAlloc(sizeof(CMD_SET_PSCAN_PARAM), VIR_MEM_TYPE);
  1674. if (!prCmdPscnParam) {
  1675. DBGLOG(INIT, INFO, "Can not alloc memory for PARAM_WIFI_GSCAN_CMD_PARAMS\n");
  1676. return -ENOMEM;
  1677. }
  1678. prCmdPscnParam->ucVersion = CURRENT_PSCN_VERSION;
  1679. DBGLOG(SCN, INFO, "scnCombineParamsIntoPSCN\n");
  1680. if (fgRemoveNLOfromPSCN || fgRemoveBatchSCNfromPSCN || fgRemoveGSCNfromPSCN) {
  1681. DBGLOG(INIT, TRACE, "remove NLO or Batch or GSCN from PSCN--->\n");
  1682. scnRemoveFromPSCN(prAdapter,
  1683. fgRemoveNLOfromPSCN, fgRemoveBatchSCNfromPSCN, fgRemoveGSCNfromPSCN, prCmdPscnParam);
  1684. } else {
  1685. DBGLOG(SCN, INFO, "combine GSCN or Batch or NLO to PSCN --->\n");
  1686. scnSubCombineNLOtoPSCN(prAdapter, prNewCmdNloReq, prCmdPscnParam);
  1687. scnSubCombineBatchSCNtoPSCN(prAdapter, prNewCmdBatchReq, prCmdPscnParam);
  1688. scnSubCombineGSCNtoPSCN(prAdapter, prNewCmdGscnReq, prNewCmdGscnConfig, prCmdPscnParam);
  1689. /* scnFsmPSCNSetParam(prAdapter, prCmdPscnParam); */
  1690. DBGLOG(SCN, INFO, "combine GSCN or Batch or NLO to PSCN <---\n");
  1691. DBGLOG(SCN, INFO,
  1692. "rCmdPscnParam.rCmdGscnParam : u4BasePeriod[%u], ucNumScnToCache[%u], u4BufferThreshold[%u], u4NumBuckets[%u],fgGSCN[%d] fgNLO[%d] fgBatch[%d]\n",
  1693. prCmdPscnParam->rCmdGscnReq.u4BasePeriod,
  1694. prCmdPscnParam->rCmdGscnReq.ucNumScnToCache,
  1695. prCmdPscnParam->rCmdGscnReq.u4BufferThreshold,
  1696. prCmdPscnParam->rCmdGscnReq.u4NumBuckets, prCmdPscnParam->fgGScnEnable,
  1697. prCmdPscnParam->fgNLOScnEnable, prCmdPscnParam->fgBatchScnEnable);
  1698. for (i = 0; i < prCmdPscnParam->rCmdGscnReq.u4NumBuckets; i++) {
  1699. DBGLOG(SCN, INFO,
  1700. "rCmdPscnParam.rCmdGscnReq.arChannelBucket[%d] : band[%u], arChannelBucket[%u] ucNumChannels[%u], ucBucketFreqMultiple[%u] ucReportFlag[%u]\n",
  1701. i, prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].eBand,
  1702. prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].u2BucketIndex,
  1703. prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucNumChannels,
  1704. prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucBucketFreqMultiple,
  1705. prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucReportFlag);
  1706. DBGLOG(SCN, INFO, "rCmdPscnParam.rCmdGscnParam.arChannelBucket[%d] has channel: ", i);
  1707. for (j = 0; j < prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].ucNumChannels; j++) {
  1708. DBGLOG(SCN, INFO, " %d, ",
  1709. prCmdPscnParam->rCmdGscnReq.arChannelBucket[i].arChannelList[j].ucChannel);
  1710. }
  1711. DBGLOG(SCN, INFO, "\n");
  1712. }
  1713. }
  1714. memcpy(prScanInfo->prPscnParam, prCmdPscnParam, sizeof(CMD_SET_PSCAN_PARAM));
  1715. DBGLOG(INIT, TRACE, "scnCombineParamsIntoPSCN <----\n");
  1716. return TRUE;
  1717. }
  1718. #endif
  1719. /*----------------------------------------------------------------------------*/
  1720. /*!
  1721. * \brief handler for Set CMD_ID_SET_PSCN_MAC_ADDR
  1722. *
  1723. * \param[in]
  1724. *
  1725. * \return none Since it return none, why doesn't use void instead of BOOLEAN
  1726. */
  1727. /*----------------------------------------------------------------------------*/
  1728. BOOLEAN scnFsmSetGSCNConfig(IN P_ADAPTER_T prAdapter, IN P_CMD_GSCN_SCN_COFIG_T prCmdGscnScnConfig)
  1729. {
  1730. CMD_GSCN_SCN_COFIG_T rCmdGscnScnConfig;
  1731. P_SCAN_INFO_T prScanInfo;
  1732. ASSERT(prAdapter);
  1733. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1734. memcpy(&rCmdGscnScnConfig, prCmdGscnScnConfig, sizeof(CMD_GSCN_SCN_COFIG_T));
  1735. DBGLOG(SCN, INFO,
  1736. "rCmdGscnScnConfig: u4BufferThreshold; [%d] ucNumApPerScn [%d] ucNumScnToCache [%d]\n",
  1737. rCmdGscnScnConfig.u4BufferThreshold, rCmdGscnScnConfig.ucNumApPerScn, rCmdGscnScnConfig.u4NumScnToCache);
  1738. scnPSCNFsm(prAdapter, PSCN_RESET, NULL, NULL, NULL, &rCmdGscnScnConfig, FALSE, FALSE, FALSE, FALSE);
  1739. return TRUE;
  1740. }
  1741. /*----------------------------------------------------------------------------*/
  1742. /*!
  1743. * \brief handler for Set CMD_ID_SET_PSCN_MAC_ADDR
  1744. *
  1745. * \param[in]
  1746. *
  1747. * \return none
  1748. */
  1749. /*----------------------------------------------------------------------------*/
  1750. BOOLEAN scnFsmGetGSCNResult(IN P_ADAPTER_T prAdapter, IN P_CMD_GET_GSCAN_RESULT_T prGetGscnScnResultCmd)
  1751. {
  1752. CMD_GET_GSCAN_RESULT_T rGetGscnScnResultCmd;
  1753. P_SCAN_INFO_T prScanInfo;
  1754. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1755. memcpy(&rGetGscnScnResultCmd, prGetGscnScnResultCmd, sizeof(CMD_GET_GSCAN_RESULT_T));
  1756. DBGLOG(SCN, INFO, "rGetGscnScnResultCmd: ucGetNum [%d] fgFlush [%d]\n",
  1757. rGetGscnScnResultCmd.u4Num, rGetGscnScnResultCmd.ucFlush);
  1758. ASSERT(prAdapter);
  1759. prScanInfo->fgGscnGetResWaiting = TRUE;
  1760. if (prScanInfo->fgPscnOnnning && prScanInfo->prPscnParam->fgGScnEnable) {
  1761. wlanSendSetQueryCmd(prAdapter,
  1762. CMD_ID_GET_GSCAN_RESULT,
  1763. TRUE,
  1764. FALSE,
  1765. TRUE,
  1766. NULL,
  1767. NULL, sizeof(CMD_GET_GSCAN_RESULT_T), (PUINT_8) (&rGetGscnScnResultCmd), NULL, 0);
  1768. DBGLOG(SCN, INFO,
  1769. "SET to FW !! rGetGscnScnResultCmd: ucGetNum [%d] fgFlush [%d]\n",
  1770. rGetGscnScnResultCmd.u4Num, rGetGscnScnResultCmd.ucFlush);
  1771. } else {
  1772. /* debug msg, No PSCN, Sched SCAN GSCN ongoing ??? */
  1773. return FALSE;
  1774. }
  1775. return FALSE;
  1776. }
  1777. BOOLEAN
  1778. scnPSCNFsm(IN P_ADAPTER_T prAdapter,
  1779. ENUM_PSCAN_STATE_T eNextPSCNState,
  1780. IN P_CMD_NLO_REQ prCmdNloReq,
  1781. IN P_CMD_BATCH_REQ_T prCmdBatchReq,
  1782. IN P_CMD_GSCN_REQ_T prCmdGscnReq,
  1783. IN P_CMD_GSCN_SCN_COFIG_T prNewCmdGscnConfig,
  1784. IN BOOLEAN fgRemoveNLOfromPSCN,
  1785. IN BOOLEAN fgRemoveBatchSCNfromPSCN, IN BOOLEAN fgRemoveGSCNfromPSCN, IN BOOLEAN fgEnableGSCN)
  1786. {
  1787. P_SCAN_INFO_T prScanInfo;
  1788. BOOLEAN fgTransitionState = FALSE;
  1789. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1790. ASSERT(prScanInfo);
  1791. ASSERT(prAdapter);
  1792. do {
  1793. fgTransitionState = FALSE;
  1794. DBGLOG(SCN, INFO, "scnPSCNFsmt eCurrentPSCNState %d\n", prScanInfo->eCurrentPSCNState);
  1795. switch (prScanInfo->eCurrentPSCNState) {
  1796. case PSCN_IDLE:
  1797. DBGLOG(SCN, INFO, "PSCN_IDLE\n");
  1798. if (eNextPSCNState == PSCN_RESET) {
  1799. if (fgRemoveNLOfromPSCN || fgRemoveBatchSCNfromPSCN || fgRemoveGSCNfromPSCN) {
  1800. DBGLOG(SCN, INFO, "Unexpected remove NLO/BATCH/GSCN request\n");
  1801. eNextPSCNState = PSCN_IDLE;
  1802. break;
  1803. }
  1804. if (prCmdNloReq || prCmdBatchReq) { /* */
  1805. DBGLOG(SCN, INFO, "PSCN_IDLE->PSCN_RESET,.... scnFsmPSCNActionDISABLE\n");
  1806. /*TBD check PSCAN is ongoing */
  1807. scnFsmPSCNAction(prAdapter, DISABLE);
  1808. break;
  1809. }
  1810. } else if (eNextPSCNState == PSCN_SCANNING) {
  1811. if (fgEnableGSCN) {
  1812. if (prScanInfo->fgPscnOnnning)
  1813. scnFsmPSCNAction(prAdapter, DISABLE);
  1814. if (prScanInfo->fgGScnParamSet) {
  1815. DBGLOG(SCN, INFO,
  1816. "PSCN_IDLE->PSCN_SCANNING,.... scnFsmPSCNActionENABLE\n");
  1817. prScanInfo->prPscnParam->fgGScnEnable = TRUE;
  1818. scnFsmPSCNSetParam(prAdapter, (P_CMD_SET_PSCAN_PARAM)
  1819. prScanInfo->prPscnParam);
  1820. scnFsmPSCNAction(prAdapter, ENABLE);
  1821. eNextPSCNState = PSCN_SCANNING;
  1822. }
  1823. }
  1824. }
  1825. break;
  1826. case PSCN_RESET:
  1827. DBGLOG(SCN, INFO, "PSCN_RESET\n");
  1828. scnCombineParamsIntoPSCN(prAdapter,
  1829. prCmdNloReq,
  1830. prCmdBatchReq,
  1831. prCmdGscnReq,
  1832. prNewCmdGscnConfig,
  1833. fgRemoveNLOfromPSCN, fgRemoveBatchSCNfromPSCN, fgRemoveGSCNfromPSCN);
  1834. if (!prScanInfo->prPscnParam->fgNLOScnEnable
  1835. && !prScanInfo->prPscnParam->fgBatchScnEnable && !prScanInfo->prPscnParam->fgGScnEnable) {
  1836. DBGLOG(SCN, INFO,
  1837. "PSCN_RESET->PSCN_IDLE,.... fgNLOScnEnable/fgBatchScnEnable/fgGScnEnable false\n");
  1838. eNextPSCNState = PSCN_IDLE;
  1839. } else {
  1840. if (prScanInfo->prPscnParam->fgNLOScnEnable
  1841. || prScanInfo->prPscnParam->fgBatchScnEnable) {
  1842. scnFsmPSCNSetParam(prAdapter, (P_CMD_SET_PSCAN_PARAM) prScanInfo->prPscnParam);
  1843. scnFsmPSCNAction(prAdapter, ENABLE);
  1844. eNextPSCNState = PSCN_SCANNING;
  1845. DBGLOG(SCN, INFO,
  1846. "PSCN_RESET->PSCN_SCANNING,.... fgNLOScnEnable/fgBatchScnEnable ENABLE\n");
  1847. }
  1848. }
  1849. break;
  1850. case PSCN_SCANNING:
  1851. DBGLOG(SCN, INFO, "PSCN_SCANNING\n");
  1852. if (eNextPSCNState == PSCN_RESET) {
  1853. if (fgRemoveNLOfromPSCN || fgRemoveBatchSCNfromPSCN || fgRemoveGSCNfromPSCN) {
  1854. DBGLOG(SCN, INFO,
  1855. "PSCN_SCANNING->PSCN_RESET,.... fgRemoveNLOfromPSCN/fgRemoveBatchSCNfromPSCN/fgRemoveGSCNfromPSCN\n");
  1856. scnFsmPSCNAction(prAdapter, DISABLE);
  1857. break;
  1858. }
  1859. if (prCmdNloReq || prCmdBatchReq || prCmdGscnReq || prNewCmdGscnConfig) {
  1860. DBGLOG(SCN, INFO,
  1861. "PSCN_SCANNING->PSCN_RESET,.... prCmdNloReq/prCmdBatchReq/prCmdGscnReq/prNewCmdGscnConfig\n");
  1862. scnFsmPSCNAction(prAdapter, DISABLE);
  1863. break;
  1864. }
  1865. } else if (eNextPSCNState == PSCN_SCANNING) {
  1866. if (fgEnableGSCN) {
  1867. if (prScanInfo->prPscnParam->fgGScnEnable && (!prScanInfo->fgPscnOnnning)) {
  1868. DBGLOG(SCN, INFO,
  1869. "PSCN_SCANNING->PSCN_SCANNING,.... fgGScnEnable/!fgPscnOnnning\n");
  1870. /* scnFsmPSCNAction(prAdapter, ENABLE); */
  1871. eNextPSCNState = PSCN_SCANNING;
  1872. } else {
  1873. DBGLOG(SCN, INFO,
  1874. "PSCN_SCANNING->PSCN_SCANNING,.... fgGScnEnable/!fgPscnOnnning\n");
  1875. }
  1876. }
  1877. }
  1878. eNextPSCNState = PSCN_SCANNING;
  1879. break;
  1880. default:
  1881. DBGLOG(SCN, INFO, "Unexpected state\n");
  1882. ASSERT(0);
  1883. break;
  1884. }
  1885. DBGLOG(SCN, INFO, "eCurrentState %d , eNextPSCNState %d\n",
  1886. prScanInfo->eCurrentPSCNState, eNextPSCNState);
  1887. if (prScanInfo->eCurrentPSCNState != eNextPSCNState)
  1888. fgTransitionState = TRUE;
  1889. prScanInfo->eCurrentPSCNState = eNextPSCNState;
  1890. } while (fgTransitionState);
  1891. return prScanInfo->eCurrentState;
  1892. }
  1893. VOID scnGscnGetResultReplyCheck(P_ADAPTER_T prAdapter)
  1894. {
  1895. P_SCAN_INFO_T prScanInfo;
  1896. UINT_32 ucCounter = 0;
  1897. ASSERT(prAdapter);
  1898. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1899. cnmTimerStartTimer(prAdapter, &prScanInfo->rWaitForGscanResutsTimer, SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
  1900. while (prScanInfo->fgGscnGetResWaiting) {
  1901. if (ucCounter > 1000)
  1902. DBGLOG(SCN, INFO, "%s wait for Results are replyed \r\n", __func__);
  1903. ucCounter++;
  1904. }
  1905. }
  1906. VOID scnGscnGetResultReplyCheckTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr)
  1907. {
  1908. P_SCAN_INFO_T prScanInfo;
  1909. ASSERT(prAdapter);
  1910. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1911. prScanInfo->fgGscnGetResWaiting = FALSE;
  1912. DBGLOG(SCN, INFO, "%s wait for Results are replyed timeout\r\n", __func__);
  1913. }
  1914. #endif
  1915. VOID scnScanDoneTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr)
  1916. {
  1917. P_SCAN_INFO_T prScanInfo;
  1918. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  1919. DBGLOG(SCN, WARN, "scnScanDoneTimeout %d \r\n", prScanInfo->ucScanDoneTimeoutCnt);
  1920. prScanInfo->ucScanDoneTimeoutCnt++;
  1921. /* whole chip reset check */
  1922. if (prScanInfo->ucScanDoneTimeoutCnt > SCAN_DONE_TIMEOUT_THRESHOLD) {
  1923. DBGLOG(SCN, ERROR,
  1924. " meet SCAN_DONE_TIMEOUT_THRESHOLD %d, trigger whole chip reset !! \r\n",
  1925. SCAN_DONE_TIMEOUT_THRESHOLD);
  1926. #if CFG_CHIP_RESET_SUPPORT
  1927. glResetTrigger(prAdapter);
  1928. #endif
  1929. }
  1930. }