scan_fsm.c 67 KB

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