cnm_mem.c 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236
  1. /*
  2. ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/cnm_mem.c#2
  3. */
  4. /*! \file "cnm_mem.c"
  5. \brief This file contain the management function of packet buffers and
  6. generic memory alloc/free functioin for mailbox message.
  7. A data packet has a fixed size of buffer, but a management
  8. packet can be equipped with a variable size of buffer.
  9. */
  10. /*
  11. ** Log: cnm_mem.c
  12. *
  13. * 07 17 2012 yuche.tsai
  14. * NULL
  15. * Compile no error before trial run.
  16. *
  17. * 03 14 2012 wh.su
  18. * [WCXRP00001173] [MT6620 Wi-Fi][Driver] Adding the ICS Tethering WPA2-PSK supporting
  19. * Add code from 2.2
  20. *
  21. * 11 17 2011 tsaiyuan.hsu
  22. * [WCXRP00001115] [MT6620 Wi-Fi][DRV] avoid deactivating staRec when changing state 3 to 3.
  23. * initialize fgNeedResp.
  24. *
  25. * 11 17 2011 tsaiyuan.hsu
  26. * [WCXRP00001115] [MT6620 Wi-Fi][DRV] avoid deactivating staRec when changing state 3 to 3.
  27. * avoid deactivating staRec when changing state from 3 to 3.
  28. *
  29. * 02 01 2011 cm.chang
  30. * [WCXRP00000415] [MT6620 Wi-Fi][Driver] Check if any memory leakage happens when uninitializing in DGB mode
  31. * .
  32. *
  33. * 01 26 2011 cm.chang
  34. * [WCXRP00000395] [MT6620 Wi-Fi][Driver][FW] Search STA_REC with additional net type index argument
  35. * Allocate system RAM if fixed message or mgmt buffer is not available
  36. *
  37. * 01 26 2011 cm.chang
  38. * [WCXRP00000395] [MT6620 Wi-Fi][Driver][FW] Search STA_REC with additional net type index argument
  39. * .
  40. *
  41. * 01 25 2011 yuche.tsai
  42. * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
  43. * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
  44. *
  45. * 12 13 2010 cp.wu
  46. * [WCXRP00000260] [MT6620 Wi-Fi][Driver][Firmware] Create V1.1 branch for both firmware and driver
  47. * create branch for Wi-Fi driver v1.1
  48. *
  49. * 12 07 2010 cm.chang
  50. * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
  51. * 1. BSSINFO include RLM parameter
  52. * 2. free all sta records when network is disconnected
  53. *
  54. * 11 29 2010 cm.chang
  55. * [WCXRP00000210] [MT6620 Wi-Fi][Driver][FW] Set RCPI value in STA_REC
  56. * for initial TX rate selection of auto-rate algorithm
  57. * Sync RCPI of STA_REC to FW as reference of initial TX rate
  58. *
  59. * 11 25 2010 yuche.tsai
  60. * NULL
  61. * Update SLT Function for QoS Support and not be affected by fixed rate function.
  62. *
  63. * 10 18 2010 cp.wu
  64. * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete
  65. * and might leads to BSOD when entering RF test with AIS associated
  66. * 1. remove redundant variables in STA_REC structure
  67. * 2. add STA-REC uninitialization routine for clearing pending events
  68. *
  69. * 10 13 2010 cm.chang
  70. * [WCXRP00000094] [MT6620 Wi-Fi][Driver] Connect to 2.4GHz AP, Driver crash.
  71. * Add exception handle when cmd buffer is not available
  72. *
  73. * 10 12 2010 cp.wu
  74. * [WCXRP00000084] [MT6620 Wi-Fi][Driver][FW] Add fixed rate support for distance test
  75. * add HT (802.11n) fixed rate support.
  76. *
  77. * 10 08 2010 cp.wu
  78. * [WCXRP00000084] [MT6620 Wi-Fi][Driver][FW] Add fixed rate support for distance test
  79. * adding fixed rate support for distance test. (from registry setting)
  80. *
  81. * 09 24 2010 wh.su
  82. * NULL
  83. * [WCXRP00005002][MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning.
  84. *
  85. * 09 21 2010 cp.wu
  86. * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD
  87. * when entering RF test with AIS associated
  88. * Do a complete reset with STA-REC null checking for RF test re-entry
  89. *
  90. * 09 16 2010 cm.chang
  91. * NULL
  92. * Change conditional compiling options for BOW
  93. *
  94. * 09 10 2010 cm.chang
  95. * NULL
  96. * Always update Beacon content if FW sync OBSS info
  97. *
  98. * 08 24 2010 cm.chang
  99. * NULL
  100. * Support RLM initail channel of Ad-hoc, P2P and BOW
  101. *
  102. * 08 23 2010 chinghwa.yu
  103. * NULL
  104. * Update for BOW.
  105. *
  106. * 08 20 2010 cm.chang
  107. * NULL
  108. * Migrate RLM code to host from FW
  109. *
  110. * 08 19 2010 wh.su
  111. * NULL
  112. * adding the tx pkt call back handle for countermeasure.
  113. *
  114. * 07 08 2010 cp.wu
  115. *
  116. * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
  117. *
  118. * 07 08 2010 cm.chang
  119. * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
  120. * Check draft RLM code for HT cap
  121. *
  122. * 07 07 2010 cm.chang
  123. * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
  124. * Support state of STA record change from 1 to 1
  125. *
  126. * 07 05 2010 cm.chang
  127. * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
  128. * Fix correct structure size in cnmStaSendDeactivateCmd()
  129. *
  130. * 07 05 2010 cp.wu
  131. * [WPD00003833][MT6620 and MT5931] Driver migration
  132. * 1) ignore RSN checking when RSN is not turned on.
  133. * 2) set STA-REC deactivation callback as NULL
  134. * 3) add variable initialization API based on PHY configuration
  135. *
  136. * 07 02 2010 cp.wu
  137. * [WPD00003833][MT6620 and MT5931] Driver migration
  138. * spin lock target revised
  139. *
  140. * 07 02 2010 cp.wu
  141. * [WPD00003833][MT6620 and MT5931] Driver migration
  142. * change inner loop index from i to k.
  143. *
  144. * 07 01 2010 cm.chang
  145. * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
  146. * Support sync command of STA_REC
  147. *
  148. * 06 23 2010 yarco.yang
  149. * [WPD00003837][MT6620]Data Path Refine
  150. * Merge g_arStaRec[] into adapter->arStaRec[]
  151. *
  152. * 06 18 2010 cm.chang
  153. * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
  154. * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
  155. *
  156. * 05 31 2010 yarco.yang
  157. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  158. * Add RX TSF Log Feature and ADDBA Rsp with DECLINE handling
  159. *
  160. * 05 28 2010 cm.chang
  161. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  162. * Support checking of duplicated buffer free
  163. *
  164. * 05 28 2010 wh.su
  165. * [BORA00000626][MT6620] Refine the remove key flow for WHQL testing
  166. * fixed the ad-hoc wpa-none send non-encrypted frame issue.
  167. *
  168. * 05 28 2010 kevin.huang
  169. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  170. * Move define of STA_REC_NUM to config.h and rename to CFG_STA_REC_NUM
  171. *
  172. * 05 12 2010 kevin.huang
  173. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  174. * Add Power Management - Legacy PS-POLL support.
  175. *
  176. * 04 28 2010 tehuang.liu
  177. * [BORA00000605][WIFISYS] Phase3 Integration
  178. * Modified some MQM-related data structures (SN counter, TX/RX BA table)
  179. *
  180. * 04 27 2010 tehuang.liu
  181. * [BORA00000605][WIFISYS] Phase3 Integration
  182. * Added new TX/RX BA tables in STA_REC
  183. *
  184. * 04 27 2010 tehuang.liu
  185. * [BORA00000605][WIFISYS] Phase3 Integration
  186. * Notify MQM, TXM, and RXM upon disconnection .
  187. *
  188. * 04 26 2010 tehuang.liu
  189. * [BORA00000605][WIFISYS] Phase3 Integration
  190. * Call mqm, txm, rxm functions upon disconnection
  191. *
  192. * 04 24 2010 cm.chang
  193. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  194. * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW
  195. *
  196. * 04 22 2010 cm.chang
  197. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  198. * First draft code to support protection in AP mode
  199. *
  200. * 04 19 2010 kevin.huang
  201. * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
  202. * Add Beacon Timeout Support
  203. * * * * * * * * * * and will send Null frame to diagnose connection
  204. *
  205. * 04 09 2010 tehuang.liu
  206. * [BORA00000605][WIFISYS] Phase3 Integration
  207. * [BORA00000644] WiFi phase 4 integration
  208. * * Added per-TID SN cache in STA_REC
  209. *
  210. * 04 07 2010 cm.chang
  211. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  212. * Different invoking order for WTBL entry of associated AP
  213. *
  214. * 03 29 2010 wh.su
  215. * [BORA00000605][WIFISYS] Phase3 Integration
  216. * move the wlan table alloc / free to change state function.
  217. *
  218. * 03 24 2010 cm.chang
  219. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  220. * Support power control
  221. *
  222. * 03 03 2010 tehuang.liu
  223. * [BORA00000569][WIFISYS] Phase 2 Integration Test
  224. * Initialize StaRec->arStaWaitQueue
  225. *
  226. * 03 03 2010 cm.chang
  227. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  228. * Add debug message when no available pkt buffer
  229. *
  230. * 03 01 2010 tehuang.liu
  231. * [BORA00000569][WIFISYS] Phase 2 Integration Test
  232. * Fixed STA_REC initialization bug: prStaRec->au2CachedSeqCtrl[k]
  233. *
  234. * 02 26 2010 tehuang.liu
  235. * [BORA00000569][WIFISYS] Phase 2 Integration Test
  236. * Added fgIsWmmSupported in STA_RECORD_T.
  237. *
  238. * 02 26 2010 tehuang.liu
  239. * [BORA00000569][WIFISYS] Phase 2 Integration Test
  240. * Added fgIsUapsdSupported in STA_RECORD_T
  241. *
  242. * 02 26 2010 kevin.huang
  243. * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
  244. * add support of Driver STA_RECORD_T activation
  245. *
  246. * 02 13 2010 tehuang.liu
  247. * [BORA00000569][WIFISYS] Phase 2 Integration Test
  248. * Added arTspecTable in STA_REC for TSPEC management
  249. *
  250. * 02 12 2010 cm.chang
  251. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  252. * Enable mgmt buffer debug by default
  253. *
  254. * 02 12 2010 tehuang.liu
  255. * [BORA00000569][WIFISYS] Phase 2 Integration Test
  256. * Added BUFFER_SOURCE_BCN
  257. *
  258. * 02 04 2010 kevin.huang
  259. * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
  260. * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
  261. *
  262. * 01 11 2010 kevin.huang
  263. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  264. * Add Deauth and Disassoc Handler
  265. *
  266. * 01 08 2010 cp.wu
  267. * [BORA00000368]Integrate HIF part into BORA
  268. * 1) separate wifi_var_emu.c/.h from wifi_var.c/.h
  269. * * * * * * * * * 2) eliminate HIF_EMULATION code sections appeared in wifi_var/cnm_mem
  270. * * * * * * * * * 3) use cnmMemAlloc() instead to allocate SRAM buffer
  271. *
  272. * 12 25 2009 tehuang.liu
  273. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  274. * Integrated modifications for 1st connection (mainly on FW modules MQM, TXM, and RXM)
  275. * * * * * * * MQM: BA handling
  276. * * * * * * * TXM: Macros updates
  277. * * * * * * * RXM: Macros/Duplicate Removal updates
  278. *
  279. * 12 24 2009 yarco.yang
  280. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  281. * .
  282. *
  283. * 12 21 2009 cm.chang
  284. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  285. * Support several data buffer banks.
  286. *
  287. * 12 18 2009 cm.chang
  288. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  289. * .For new FPGA memory size
  290. *
  291. * Dec 9 2009 MTK02468
  292. * [BORA00000337] To check in codes for FPGA emulation
  293. * Removed DBGPRINT
  294. *
  295. * Dec 9 2009 mtk02752
  296. * [BORA00000368] Integrate HIF part into BORA
  297. * add cnmDataPktFree() for emulation loopback purpose
  298. *
  299. * Dec 3 2009 mtk01461
  300. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  301. * Fix warning of null pointer
  302. *
  303. * Dec 3 2009 mtk01461
  304. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  305. * Add cnmGetStaRecByAddress() and add fgIsInUse flag in STA_RECORD_T
  306. *
  307. * Nov 23 2009 mtk01104
  308. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  309. * Assign ucBufferSource in function cnmMgtPktAlloc()
  310. *
  311. * Nov 23 2009 mtk02468
  312. * [BORA00000337] To check in codes for FPGA emulation
  313. * Added packet redispatch function calls
  314. *
  315. * Nov 13 2009 mtk01084
  316. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  317. * enable packet re-usable in current emulation driver
  318. *
  319. * Nov 12 2009 mtk01104
  320. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  321. * 1. Add new function cnmGetStaRecByIndex()
  322. * 2. Rename STA_REC_T to STA_RECORD_T
  323. *
  324. * Nov 9 2009 mtk01104
  325. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  326. * Call cnmDataPktDispatch() in cnmPktFree()
  327. *
  328. * Nov 2 2009 mtk01104
  329. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  330. * Remove definition of pragma section code
  331. *
  332. * Oct 28 2009 mtk01104
  333. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  334. *
  335. *
  336. * Oct 23 2009 mtk01461
  337. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  338. * Fix lint warning
  339. *
  340. * Oct 23 2009 mtk01461
  341. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  342. * Fix typo
  343. *
  344. * Oct 12 2009 mtk01104
  345. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  346. *
  347. *
  348. * Oct 8 2009 mtk01104
  349. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  350. *
  351. **
  352. */
  353. /*******************************************************************************
  354. * C O M P I L E R F L A G S
  355. ********************************************************************************
  356. */
  357. /*******************************************************************************
  358. * E X T E R N A L R E F E R E N C E S
  359. ********************************************************************************
  360. */
  361. #include "precomp.h"
  362. /*******************************************************************************
  363. * C O N S T A N T S
  364. ********************************************************************************
  365. */
  366. /*******************************************************************************
  367. * D A T A T Y P E S
  368. ********************************************************************************
  369. */
  370. /*******************************************************************************
  371. * P U B L I C D A T A
  372. ********************************************************************************
  373. */
  374. /*******************************************************************************
  375. * P R I V A T E D A T A
  376. ********************************************************************************
  377. */
  378. /*******************************************************************************
  379. * M A C R O S
  380. ********************************************************************************
  381. */
  382. /*******************************************************************************
  383. * F U N C T I O N D E C L A R A T I O N S
  384. ********************************************************************************
  385. */
  386. static VOID cnmStaRecHandleEventPkt(P_ADAPTER_T prAdapter, P_CMD_INFO_T prCmdInfo, PUINT_8 pucEventBuf);
  387. static VOID cnmStaSendUpdateCmd(P_ADAPTER_T prAdapter, P_STA_RECORD_T prStaRec, BOOLEAN fgNeedResp);
  388. static VOID cnmStaSendRemoveCmd(P_ADAPTER_T prAdapter, P_STA_RECORD_T prStaRec);
  389. /*******************************************************************************
  390. * F U N C T I O N S
  391. ********************************************************************************
  392. */
  393. /*----------------------------------------------------------------------------*/
  394. /*!
  395. * \brief
  396. *
  397. * \param[in]
  398. *
  399. * \return none
  400. */
  401. /*----------------------------------------------------------------------------*/
  402. P_MSDU_INFO_T cnmMgtPktAlloc(P_ADAPTER_T prAdapter, UINT_32 u4Length)
  403. {
  404. P_MSDU_INFO_T prMsduInfo;
  405. P_QUE_T prQueList;
  406. KAL_SPIN_LOCK_DECLARATION();
  407. ASSERT(prAdapter);
  408. prQueList = &prAdapter->rTxCtrl.rFreeMsduInfoList;
  409. /* Get a free MSDU_INFO_T */
  410. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST);
  411. QUEUE_REMOVE_HEAD(prQueList, prMsduInfo, P_MSDU_INFO_T);
  412. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST);
  413. if (prMsduInfo) {
  414. prMsduInfo->prPacket = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, u4Length);
  415. prMsduInfo->eSrc = TX_PACKET_MGMT;
  416. if (prMsduInfo->prPacket == NULL) {
  417. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST);
  418. QUEUE_INSERT_TAIL(prQueList, &prMsduInfo->rQueEntry);
  419. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST);
  420. prMsduInfo = NULL;
  421. }
  422. if (prMsduInfo) {
  423. prMsduInfo->eCmdType = COMMAND_TYPE_NUM;
  424. prMsduInfo->ucCID = 0xff;
  425. prMsduInfo->u4InqueTime = 0;
  426. prMsduInfo->ucPacketType = TX_PACKET_NUM;
  427. }
  428. } else {
  429. P_QUE_T prTxingQue;
  430. P_QUE_ENTRY_T prQueueEntry = (P_QUE_ENTRY_T) NULL;
  431. P_MSDU_INFO_T prMsduInfo = (P_MSDU_INFO_T) NULL;
  432. P_TX_TCQ_STATUS_T pTc = (P_TX_TCQ_STATUS_T) NULL;
  433. prTxingQue = &(prAdapter->rTxCtrl.rTxMgmtTxingQueue);
  434. pTc = &(prAdapter->rTxCtrl.rTc);
  435. DBGLOG(MEM, LOUD, "++dump TxPendingMsdu=%u, Tc0=%d Tc1=%d Tc2=%d Tc3=%d, Tc4=%d Tc5=%d\n",
  436. prTxingQue->u4NumElem, pTc->aucFreeBufferCount[TC0_INDEX],
  437. pTc->aucFreeBufferCount[TC1_INDEX], pTc->aucFreeBufferCount[TC2_INDEX],
  438. pTc->aucFreeBufferCount[TC3_INDEX], pTc->aucFreeBufferCount[TC4_INDEX],
  439. pTc->aucFreeBufferCount[TC5_INDEX]);
  440. prQueueEntry = QUEUE_GET_HEAD(prTxingQue);
  441. while (prQueueEntry) {
  442. prMsduInfo = (P_MSDU_INFO_T) prQueueEntry;
  443. DBGLOG(MEM, LOUD,
  444. "msdu type=%u, ucid=%u, type=%d, time=%u, seq=%u, sta=%u\n",
  445. prMsduInfo->ucPacketType,
  446. prMsduInfo->ucCID,
  447. prMsduInfo->eCmdType,
  448. prMsduInfo->u4InqueTime, prMsduInfo->ucTxSeqNum, prMsduInfo->ucStaRecIndex);
  449. prQueueEntry = QUEUE_GET_NEXT_ENTRY(prQueueEntry);
  450. }
  451. DBGLOG(MEM, LOUD, "--end dump\n");
  452. }
  453. #if DBG
  454. if (prMsduInfo == NULL) {
  455. DBGLOG(MEM, WARN, "MgtDesc#=%u\n", prQueList->u4NumElem);
  456. #if CFG_DBG_MGT_BUF
  457. DBGLOG(MEM, WARN, "rMgtBufInfo: alloc#=%u, free#=%u, null#=%u\n",
  458. prAdapter->rMgtBufInfo.u4AllocCount,
  459. prAdapter->rMgtBufInfo.u4FreeCount, prAdapter->rMgtBufInfo.u4AllocNullCount);
  460. #endif
  461. DBGLOG(MEM, WARN, "\n");
  462. }
  463. #endif
  464. return prMsduInfo;
  465. }
  466. /*----------------------------------------------------------------------------*/
  467. /*!
  468. * \brief
  469. *
  470. * \param[in]
  471. *
  472. * \return none
  473. */
  474. /*----------------------------------------------------------------------------*/
  475. VOID cnmMgtPktFree(P_ADAPTER_T prAdapter, P_MSDU_INFO_T prMsduInfo)
  476. {
  477. P_QUE_T prQueList;
  478. KAL_SPIN_LOCK_DECLARATION();
  479. ASSERT(prAdapter);
  480. ASSERT(prMsduInfo);
  481. prQueList = &prAdapter->rTxCtrl.rFreeMsduInfoList;
  482. ASSERT(prMsduInfo->prPacket);
  483. if (prMsduInfo->prPacket) {
  484. cnmMemFree(prAdapter, prMsduInfo->prPacket);
  485. prMsduInfo->prPacket = NULL;
  486. }
  487. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST);
  488. prMsduInfo->fgIsBasicRate = FALSE;
  489. QUEUE_INSERT_TAIL(prQueList, &prMsduInfo->rQueEntry)
  490. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST);
  491. }
  492. /*----------------------------------------------------------------------------*/
  493. /*!
  494. * \brief This function is used to initial the MGMT/MSG memory pool.
  495. *
  496. * \param (none)
  497. *
  498. * \return (none)
  499. */
  500. /*----------------------------------------------------------------------------*/
  501. VOID cnmMemInit(P_ADAPTER_T prAdapter)
  502. {
  503. P_BUF_INFO_T prBufInfo;
  504. /* Initialize Management buffer pool */
  505. prBufInfo = &prAdapter->rMgtBufInfo;
  506. kalMemZero(prBufInfo, sizeof(prAdapter->rMgtBufInfo));
  507. prBufInfo->pucBuf = prAdapter->pucMgtBufCached;
  508. /* Setup available memory blocks. 1 indicates FREE */
  509. prBufInfo->rFreeBlocksBitmap = (BUF_BITMAP) BITS(0, MAX_NUM_OF_BUF_BLOCKS - 1);
  510. /* Initialize Message buffer pool */
  511. prBufInfo = &prAdapter->rMsgBufInfo;
  512. kalMemZero(prBufInfo, sizeof(prAdapter->rMsgBufInfo));
  513. prBufInfo->pucBuf = &prAdapter->aucMsgBuf[0];
  514. /* Setup available memory blocks. 1 indicates FREE */
  515. prBufInfo->rFreeBlocksBitmap = (BUF_BITMAP) BITS(0, MAX_NUM_OF_BUF_BLOCKS - 1);
  516. return;
  517. } /* end of cnmMemInit() */
  518. /*----------------------------------------------------------------------------*/
  519. /*!
  520. * \brief Allocate MGMT/MSG memory pool.
  521. *
  522. * \param[in] eRamType Target RAM type.
  523. * TCM blk_sz= 16bytes, BUF blk_sz= 256bytes
  524. * \param[in] u4Length Length of the buffer to allocate.
  525. *
  526. * \retval !NULL Pointer to the start address of allocated memory.
  527. * \retval NULL Fail to allocat memory
  528. */
  529. /*----------------------------------------------------------------------------*/
  530. UINT_32 u4MemAllocCnt = 0, u4MemFreeCnt = 0;
  531. PVOID cnmMemAlloc(IN P_ADAPTER_T prAdapter, IN ENUM_RAM_TYPE_T eRamType, IN UINT_32 u4Length)
  532. {
  533. P_BUF_INFO_T prBufInfo;
  534. BUF_BITMAP rRequiredBitmap;
  535. UINT_32 u4BlockNum;
  536. UINT_32 i, u4BlkSzInPower;
  537. PVOID pvMemory;
  538. KAL_SPIN_LOCK_DECLARATION();
  539. ASSERT(prAdapter);
  540. ASSERT(u4Length);
  541. u4MemAllocCnt++;
  542. if (eRamType == RAM_TYPE_MSG && u4Length <= 256) {
  543. prBufInfo = &prAdapter->rMsgBufInfo;
  544. u4BlkSzInPower = MSG_BUF_BLOCK_SIZE_IN_POWER_OF_2;
  545. u4Length += (MSG_BUF_BLOCK_SIZE - 1);
  546. u4BlockNum = u4Length >> MSG_BUF_BLOCK_SIZE_IN_POWER_OF_2;
  547. ASSERT(u4BlockNum <= MAX_NUM_OF_BUF_BLOCKS);
  548. } else {
  549. eRamType = RAM_TYPE_BUF;
  550. prBufInfo = &prAdapter->rMgtBufInfo;
  551. u4BlkSzInPower = MGT_BUF_BLOCK_SIZE_IN_POWER_OF_2;
  552. u4Length += (MGT_BUF_BLOCK_SIZE - 1);
  553. u4BlockNum = u4Length >> MGT_BUF_BLOCK_SIZE_IN_POWER_OF_2;
  554. ASSERT(u4BlockNum <= MAX_NUM_OF_BUF_BLOCKS);
  555. }
  556. #if CFG_DBG_MGT_BUF
  557. prBufInfo->u4AllocCount++;
  558. #endif
  559. KAL_ACQUIRE_SPIN_LOCK(prAdapter, eRamType == RAM_TYPE_MSG ? SPIN_LOCK_MSG_BUF : SPIN_LOCK_MGT_BUF);
  560. if ((u4BlockNum > 0) && (u4BlockNum <= MAX_NUM_OF_BUF_BLOCKS)) {
  561. /* Convert number of block into bit cluster */
  562. rRequiredBitmap = BITS(0, u4BlockNum - 1);
  563. for (i = 0; i <= (MAX_NUM_OF_BUF_BLOCKS - u4BlockNum); i++) {
  564. /* Have available memory blocks */
  565. if ((prBufInfo->rFreeBlocksBitmap & rRequiredBitmap)
  566. == rRequiredBitmap) {
  567. /* Clear corresponding bits of allocated memory blocks */
  568. prBufInfo->rFreeBlocksBitmap &= ~rRequiredBitmap;
  569. /* Store how many blocks be allocated */
  570. prBufInfo->aucAllocatedBlockNum[i] = (UINT_8) u4BlockNum;
  571. KAL_RELEASE_SPIN_LOCK(prAdapter,
  572. eRamType == RAM_TYPE_MSG ? SPIN_LOCK_MSG_BUF : SPIN_LOCK_MGT_BUF);
  573. /* Return the start address of allocated memory */
  574. return (PVOID) (prBufInfo->pucBuf + (i << u4BlkSzInPower));
  575. }
  576. rRequiredBitmap <<= 1;
  577. }
  578. }
  579. KAL_RELEASE_SPIN_LOCK(prAdapter, eRamType == RAM_TYPE_MSG ? SPIN_LOCK_MSG_BUF : SPIN_LOCK_MGT_BUF);
  580. /* cannot move the allocation between spin_lock_irqsave and spin_unlock_irqrestore */
  581. #ifdef LINUX
  582. pvMemory = (PVOID) kalMemAlloc(u4Length, VIR_MEM_TYPE);
  583. if (pvMemory)
  584. kalMemZero(pvMemory, u4Length);
  585. #else
  586. pvMemory = (PVOID) NULL;
  587. #endif
  588. KAL_ACQUIRE_SPIN_LOCK(prAdapter, eRamType == RAM_TYPE_MSG ? SPIN_LOCK_MSG_BUF : SPIN_LOCK_MGT_BUF);
  589. #if CFG_DBG_MGT_BUF
  590. prBufInfo->u4AllocNullCount++;
  591. if (pvMemory)
  592. prAdapter->u4MemAllocDynamicCount++;
  593. #endif
  594. KAL_RELEASE_SPIN_LOCK(prAdapter, eRamType == RAM_TYPE_MSG ? SPIN_LOCK_MSG_BUF : SPIN_LOCK_MGT_BUF);
  595. return pvMemory;
  596. } /* end of cnmMemAlloc() */
  597. /*----------------------------------------------------------------------------*/
  598. /*!
  599. * \brief Release memory to MGT/MSG memory pool.
  600. *
  601. * \param pucMemory Start address of previous allocated memory
  602. *
  603. * \return (none)
  604. */
  605. /*----------------------------------------------------------------------------*/
  606. VOID cnmMemFree(IN P_ADAPTER_T prAdapter, IN PVOID pvMemory)
  607. {
  608. P_BUF_INFO_T prBufInfo;
  609. UINT_32 u4BlockIndex;
  610. BUF_BITMAP rAllocatedBlocksBitmap;
  611. ENUM_RAM_TYPE_T eRamType;
  612. KAL_SPIN_LOCK_DECLARATION();
  613. ASSERT(prAdapter);
  614. ASSERT(pvMemory);
  615. if (!pvMemory)
  616. return;
  617. u4MemFreeCnt++;
  618. /* Judge it belongs to which RAM type */
  619. if (((ULONG) pvMemory >= (ULONG)&prAdapter->aucMsgBuf[0]) &&
  620. ((ULONG) pvMemory <= (ULONG)&prAdapter->aucMsgBuf[MSG_BUFFER_SIZE - 1])) {
  621. prBufInfo = &prAdapter->rMsgBufInfo;
  622. u4BlockIndex = ((ULONG) pvMemory - (ULONG) prBufInfo->pucBuf)
  623. >> MSG_BUF_BLOCK_SIZE_IN_POWER_OF_2;
  624. ASSERT(u4BlockIndex < MAX_NUM_OF_BUF_BLOCKS);
  625. eRamType = RAM_TYPE_MSG;
  626. } else if (((ULONG) pvMemory >= (ULONG) prAdapter->pucMgtBufCached) &&
  627. ((ULONG) pvMemory <= ((ULONG) prAdapter->pucMgtBufCached + MGT_BUFFER_SIZE - 1))) {
  628. prBufInfo = &prAdapter->rMgtBufInfo;
  629. u4BlockIndex = ((ULONG) pvMemory - (ULONG) prBufInfo->pucBuf)
  630. >> MGT_BUF_BLOCK_SIZE_IN_POWER_OF_2;
  631. ASSERT(u4BlockIndex < MAX_NUM_OF_BUF_BLOCKS);
  632. eRamType = RAM_TYPE_BUF;
  633. } else {
  634. #ifdef LINUX
  635. /* For Linux, it is supported because size is not needed */
  636. kalMemFree(pvMemory, VIR_MEM_TYPE, 0);
  637. #else
  638. /* For Windows, it is not supported because of no size argument */
  639. ASSERT(0);
  640. #endif
  641. #if CFG_DBG_MGT_BUF
  642. prAdapter->u4MemFreeDynamicCount++;
  643. #endif
  644. return;
  645. }
  646. KAL_ACQUIRE_SPIN_LOCK(prAdapter, eRamType == RAM_TYPE_MSG ? SPIN_LOCK_MSG_BUF : SPIN_LOCK_MGT_BUF);
  647. #if CFG_DBG_MGT_BUF
  648. prBufInfo->u4FreeCount++;
  649. #endif
  650. /* Convert number of block into bit cluster */
  651. ASSERT(prBufInfo->aucAllocatedBlockNum[u4BlockIndex] > 0);
  652. rAllocatedBlocksBitmap = BITS(0, prBufInfo->aucAllocatedBlockNum[u4BlockIndex] - 1);
  653. rAllocatedBlocksBitmap <<= u4BlockIndex;
  654. /* Clear saved block count for this memory segment */
  655. prBufInfo->aucAllocatedBlockNum[u4BlockIndex] = 0;
  656. /* Set corresponding bit of released memory block */
  657. prBufInfo->rFreeBlocksBitmap |= rAllocatedBlocksBitmap;
  658. KAL_RELEASE_SPIN_LOCK(prAdapter, eRamType == RAM_TYPE_MSG ? SPIN_LOCK_MSG_BUF : SPIN_LOCK_MGT_BUF);
  659. return;
  660. } /* end of cnmMemFree() */
  661. /*----------------------------------------------------------------------------*/
  662. /*!
  663. * \brief
  664. *
  665. * \param[in]
  666. *
  667. * \return none
  668. */
  669. /*----------------------------------------------------------------------------*/
  670. VOID cnmStaRecInit(P_ADAPTER_T prAdapter)
  671. {
  672. P_STA_RECORD_T prStaRec;
  673. UINT_16 i;
  674. for (i = 0; i < CFG_STA_REC_NUM; i++) {
  675. prStaRec = &prAdapter->arStaRec[i];
  676. prStaRec->ucIndex = (UINT_8) i;
  677. prStaRec->fgIsInUse = FALSE;
  678. }
  679. }
  680. /*----------------------------------------------------------------------------*/
  681. /*!
  682. * \brief
  683. *
  684. * \param[in]
  685. *
  686. * \return none
  687. */
  688. /*----------------------------------------------------------------------------*/
  689. VOID cnmStaRecUninit(IN P_ADAPTER_T prAdapter)
  690. {
  691. P_STA_RECORD_T prStaRec;
  692. UINT_16 i;
  693. for (i = 0; i < CFG_STA_REC_NUM; i++) {
  694. prStaRec = &prAdapter->arStaRec[i];
  695. if (prStaRec->fgIsInUse)
  696. cnmStaRecFree(prAdapter, prStaRec, FALSE);
  697. }
  698. }
  699. /*----------------------------------------------------------------------------*/
  700. /*!
  701. * \brief
  702. *
  703. * \param[in]
  704. *
  705. * \return none
  706. */
  707. /*----------------------------------------------------------------------------*/
  708. P_STA_RECORD_T cnmStaRecAlloc(P_ADAPTER_T prAdapter, UINT_8 ucNetTypeIndex)
  709. {
  710. P_STA_RECORD_T prStaRec;
  711. UINT_16 i, k;
  712. ASSERT(prAdapter);
  713. for (i = 0; i < CFG_STA_REC_NUM; i++) {
  714. prStaRec = &prAdapter->arStaRec[i];
  715. if (!prStaRec->fgIsInUse) {
  716. /*---- Initialize STA_REC_T here ----*/
  717. kalMemZero(prStaRec, sizeof(STA_RECORD_T));
  718. prStaRec->ucIndex = (UINT_8) i;
  719. prStaRec->ucNetTypeIndex = ucNetTypeIndex;
  720. prStaRec->fgIsInUse = TRUE;
  721. if (prStaRec->pucAssocReqIe) {
  722. kalMemFree(prStaRec->pucAssocReqIe, VIR_MEM_TYPE, prStaRec->u2AssocReqIeLen);
  723. prStaRec->pucAssocReqIe = NULL;
  724. prStaRec->u2AssocReqIeLen = 0;
  725. }
  726. /* Initialize the SN caches for duplicate detection */
  727. for (k = 0; k < TID_NUM + 1; k++)
  728. prStaRec->au2CachedSeqCtrl[k] = 0xFFFF;
  729. /* Initialize SW TX queues in STA_REC */
  730. for (k = 0; k < STA_WAIT_QUEUE_NUM; k++)
  731. LINK_INITIALIZE(&prStaRec->arStaWaitQueue[k]);
  732. /* Default enable TX/RX AMPDU */
  733. prStaRec->fgTxAmpduEn = TRUE;
  734. prStaRec->fgRxAmpduEn = TRUE;
  735. #if CFG_ENABLE_PER_STA_STATISTICS && CFG_ENABLE_PKT_LIFETIME_PROFILE
  736. prStaRec->u4TotalTxPktsNumber = 0;
  737. prStaRec->u4TotalTxPktsTime = 0;
  738. prStaRec->u4MaxTxPktsTime = 0;
  739. #endif
  740. for (k = 0; k < NUM_OF_PER_STA_TX_QUEUES; k++)
  741. QUEUE_INITIALIZE(&prStaRec->arTxQueue[k]);
  742. break;
  743. }
  744. }
  745. return (i < CFG_STA_REC_NUM) ? prStaRec : NULL;
  746. }
  747. /*----------------------------------------------------------------------------*/
  748. /*!
  749. * \brief
  750. *
  751. * \param[in]
  752. *
  753. * \return none
  754. */
  755. /*----------------------------------------------------------------------------*/
  756. VOID cnmStaRecFree(P_ADAPTER_T prAdapter, P_STA_RECORD_T prStaRec, BOOLEAN fgSyncToChip)
  757. {
  758. ASSERT(prAdapter);
  759. ASSERT(prStaRec);
  760. /* To do: free related resources, e.g. timers, buffers, etc */
  761. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  762. prStaRec->fgTransmitKeyExist = FALSE;
  763. prStaRec->fgSetPwrMgtBit = FALSE;
  764. if (prStaRec->pucAssocReqIe) {
  765. kalMemFree(prStaRec->pucAssocReqIe, VIR_MEM_TYPE, prStaRec->u2AssocReqIeLen);
  766. prStaRec->pucAssocReqIe = NULL;
  767. prStaRec->u2AssocReqIeLen = 0;
  768. }
  769. qmDeactivateStaRec(prAdapter, prStaRec->ucIndex);
  770. if (fgSyncToChip)
  771. cnmStaSendRemoveCmd(prAdapter, prStaRec);
  772. prStaRec->fgIsInUse = FALSE;
  773. }
  774. /*----------------------------------------------------------------------------*/
  775. /*!
  776. * \brief
  777. *
  778. * \param[in]
  779. *
  780. * \return none
  781. */
  782. /*----------------------------------------------------------------------------*/
  783. VOID cnmStaFreeAllStaByNetType(P_ADAPTER_T prAdapter, ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex, BOOLEAN fgSyncToChip)
  784. {
  785. P_STA_RECORD_T prStaRec;
  786. UINT_16 i;
  787. for (i = 0; i < CFG_STA_REC_NUM; i++) {
  788. prStaRec = (P_STA_RECORD_T) &prAdapter->arStaRec[i];
  789. if (prStaRec->fgIsInUse && prStaRec->ucNetTypeIndex == (UINT_8) eNetTypeIndex)
  790. cnmStaRecFree(prAdapter, prStaRec, fgSyncToChip);
  791. } /* end of for loop */
  792. }
  793. /*----------------------------------------------------------------------------*/
  794. /*!
  795. * \brief
  796. *
  797. * \param[in]
  798. *
  799. * \return none
  800. */
  801. /*----------------------------------------------------------------------------*/
  802. P_STA_RECORD_T cnmGetStaRecByIndex(P_ADAPTER_T prAdapter, UINT_8 ucIndex)
  803. {
  804. P_STA_RECORD_T prStaRec;
  805. ASSERT(prAdapter);
  806. prStaRec = (ucIndex < CFG_STA_REC_NUM) ? &prAdapter->arStaRec[ucIndex] : NULL;
  807. if (prStaRec && prStaRec->fgIsInUse == FALSE)
  808. prStaRec = NULL;
  809. return prStaRec;
  810. }
  811. /*----------------------------------------------------------------------------*/
  812. /*!
  813. * @brief Get STA_RECORD_T by Peer MAC Address(Usually TA).
  814. *
  815. * @param[in] pucPeerMacAddr Given Peer MAC Address.
  816. *
  817. * @retval Pointer to STA_RECORD_T, if found. NULL, if not found
  818. */
  819. /*----------------------------------------------------------------------------*/
  820. P_STA_RECORD_T cnmGetStaRecByAddress(P_ADAPTER_T prAdapter, UINT_8 ucNetTypeIndex, PUINT_8 pucPeerMacAddr)
  821. {
  822. P_STA_RECORD_T prStaRec;
  823. UINT_16 i;
  824. ASSERT(prAdapter);
  825. ASSERT(pucPeerMacAddr);
  826. for (i = 0; i < CFG_STA_REC_NUM; i++) {
  827. prStaRec = &prAdapter->arStaRec[i];
  828. if (prStaRec->fgIsInUse &&
  829. prStaRec->ucNetTypeIndex == ucNetTypeIndex &&
  830. EQUAL_MAC_ADDR(prStaRec->aucMacAddr, pucPeerMacAddr)) {
  831. break;
  832. }
  833. }
  834. return (i < CFG_STA_REC_NUM) ? prStaRec : NULL;
  835. }
  836. /*----------------------------------------------------------------------------*/
  837. /*!
  838. * @brief Reset the Status and Reason Code Field to 0 of all Station Records for
  839. * the specified Network Type
  840. *
  841. * @param[in] eNetType Specify Network Type
  842. *
  843. * @return (none)
  844. */
  845. /*----------------------------------------------------------------------------*/
  846. VOID cnmStaRecResetStatus(P_ADAPTER_T prAdapter, ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex)
  847. {
  848. cnmStaFreeAllStaByNetType(prAdapter, eNetTypeIndex, FALSE);
  849. #if 0
  850. P_STA_RECORD_T prStaRec;
  851. UINT_16 i;
  852. ASSERT(prAdapter);
  853. for (i = 0; i < CFG_STA_REC_NUM; i++) {
  854. prStaRec = &prAdapter->arStaRec[i];
  855. if (prStaRec->fgIsInUse) {
  856. if ((NETWORK_TYPE_AIS_INDEX == eNetTypeIndex) && IS_STA_IN_AIS(prStaRec->eStaType)) {
  857. prStaRec->u2StatusCode = STATUS_CODE_SUCCESSFUL;
  858. prStaRec->u2ReasonCode = REASON_CODE_RESERVED;
  859. prStaRec->ucJoinFailureCount = 0;
  860. prStaRec->fgTransmitKeyExist = FALSE;
  861. prStaRec->fgSetPwrMgtBit = FALSE;
  862. }
  863. /* TODO(Kevin): For P2P and BOW */
  864. }
  865. }
  866. return;
  867. #endif
  868. }
  869. /*----------------------------------------------------------------------------*/
  870. /*!
  871. * @brief This function will change the ucStaState of STA_RECORD_T and also do
  872. * event indication to HOST to sync the STA_RECORD_T in driver.
  873. *
  874. * @param[in] prStaRec Pointer to the STA_RECORD_T
  875. * @param[in] u4NewState New STATE to change.
  876. *
  877. * @return (none)
  878. */
  879. /*----------------------------------------------------------------------------*/
  880. VOID cnmStaRecChangeState(P_ADAPTER_T prAdapter, P_STA_RECORD_T prStaRec, UINT_8 ucNewState)
  881. {
  882. BOOLEAN fgNeedResp;
  883. ASSERT(prAdapter);
  884. ASSERT(prStaRec);
  885. ASSERT(prStaRec->fgIsInUse);
  886. /* Do nothing when following state transitions happen,
  887. * other 6 conditions should be sync to FW, including 1-->1, 3-->3
  888. */
  889. if ((ucNewState == STA_STATE_2 && prStaRec->ucStaState != STA_STATE_3) ||
  890. (ucNewState == STA_STATE_1 && prStaRec->ucStaState == STA_STATE_2)) {
  891. prStaRec->ucStaState = ucNewState;
  892. return;
  893. }
  894. fgNeedResp = FALSE;
  895. if (ucNewState == STA_STATE_3) {
  896. secFsmEventStart(prAdapter, prStaRec);
  897. if (ucNewState != prStaRec->ucStaState)
  898. fgNeedResp = TRUE;
  899. } else {
  900. if (ucNewState != prStaRec->ucStaState && prStaRec->ucStaState == STA_STATE_3)
  901. qmDeactivateStaRec(prAdapter, prStaRec->ucIndex);
  902. fgNeedResp = FALSE;
  903. }
  904. prStaRec->ucStaState = ucNewState;
  905. cnmStaSendUpdateCmd(prAdapter, prStaRec, fgNeedResp);
  906. #if CFG_ENABLE_WIFI_DIRECT
  907. /* To do: Confirm if it is invoked here or other location, but it should
  908. * be invoked after state sync of STA_REC
  909. * Update system operation parameters for AP mode
  910. */
  911. if (prAdapter->fgIsP2PRegistered && (IS_STA_IN_P2P(prStaRec))) {
  912. P_BSS_INFO_T prBssInfo;
  913. prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
  914. if (prBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT)
  915. rlmUpdateParamsForAP(prAdapter, prBssInfo, FALSE);
  916. }
  917. #endif
  918. }
  919. P_STA_RECORD_T
  920. cnmStaTheTypeGet(P_ADAPTER_T prAdapter,
  921. ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex, ENUM_STA_TYPE_T eStaType, UINT32 *pu4StartIdx)
  922. {
  923. P_STA_RECORD_T prStaRec = NULL;
  924. UINT_16 i;
  925. for (i = *pu4StartIdx; i < CFG_STA_REC_NUM; i++) {
  926. prStaRec = (P_STA_RECORD_T) &prAdapter->arStaRec[i];
  927. if (prStaRec->fgIsInUse &&
  928. prStaRec->ucNetTypeIndex == (UINT_8) eNetTypeIndex && prStaRec->eStaType == eStaType) {
  929. i++;
  930. break;
  931. }
  932. prStaRec = NULL; /* reset */
  933. } /* end of for loop */
  934. *pu4StartIdx = i;
  935. return prStaRec;
  936. }
  937. /*----------------------------------------------------------------------------*/
  938. /*!
  939. * @brief
  940. *
  941. * @param[in]
  942. *
  943. * @return (none)
  944. */
  945. /*----------------------------------------------------------------------------*/
  946. static VOID cnmStaRecHandleEventPkt(P_ADAPTER_T prAdapter, P_CMD_INFO_T prCmdInfo, PUINT_8 pucEventBuf)
  947. {
  948. P_EVENT_ACTIVATE_STA_REC_T prEventContent;
  949. P_STA_RECORD_T prStaRec;
  950. prEventContent = (P_EVENT_ACTIVATE_STA_REC_T) pucEventBuf;
  951. prStaRec = cnmGetStaRecByIndex(prAdapter, prEventContent->ucStaRecIdx);
  952. if (prStaRec && prStaRec->ucStaState == STA_STATE_3 &&
  953. !kalMemCmp(&prStaRec->aucMacAddr[0], &prEventContent->aucMacAddr[0], MAC_ADDR_LEN)) {
  954. qmActivateStaRec(prAdapter, prStaRec);
  955. }
  956. }
  957. /*----------------------------------------------------------------------------*/
  958. /*!
  959. * @brief
  960. *
  961. * @param[in]
  962. *
  963. * @return (none)
  964. */
  965. /*----------------------------------------------------------------------------*/
  966. static VOID cnmStaSendUpdateCmd(P_ADAPTER_T prAdapter, P_STA_RECORD_T prStaRec, BOOLEAN fgNeedResp)
  967. {
  968. P_CMD_UPDATE_STA_RECORD_T prCmdContent;
  969. WLAN_STATUS rStatus;
  970. ASSERT(prAdapter);
  971. ASSERT(prStaRec);
  972. ASSERT(prStaRec->fgIsInUse);
  973. /* To do: come out a mechanism to limit one STA_REC sync once for AP mode
  974. * to avoid buffer empty case when many STAs are associated
  975. * simultaneously.
  976. */
  977. /* To do: how to avoid 2 times of allocated memory. Use Stack?
  978. * One is here, the other is in wlanSendQueryCmd()
  979. */
  980. prCmdContent = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_UPDATE_STA_RECORD_T));
  981. ASSERT(prCmdContent);
  982. /* To do: exception handle */
  983. if (!prCmdContent)
  984. return;
  985. prCmdContent->ucIndex = prStaRec->ucIndex;
  986. prCmdContent->ucStaType = (UINT_8) prStaRec->eStaType;
  987. kalMemCopy(&prCmdContent->aucMacAddr[0], &prStaRec->aucMacAddr[0], MAC_ADDR_LEN);
  988. prCmdContent->u2AssocId = prStaRec->u2AssocId;
  989. prCmdContent->u2ListenInterval = prStaRec->u2ListenInterval;
  990. prCmdContent->ucNetTypeIndex = prStaRec->ucNetTypeIndex;
  991. prCmdContent->ucDesiredPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
  992. prCmdContent->u2DesiredNonHTRateSet = prStaRec->u2DesiredNonHTRateSet;
  993. prCmdContent->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
  994. prCmdContent->ucMcsSet = prStaRec->ucMcsSet;
  995. prCmdContent->ucSupMcs32 = (UINT_8) prStaRec->fgSupMcs32;
  996. prCmdContent->u2HtCapInfo = prStaRec->u2HtCapInfo;
  997. prCmdContent->ucNeedResp = (UINT_8) fgNeedResp;
  998. #if !CFG_SLT_SUPPORT
  999. if (prAdapter->rWifiVar.eRateSetting != FIXED_RATE_NONE) {
  1000. /* override rate configuration */
  1001. nicUpdateRateParams(prAdapter,
  1002. prAdapter->rWifiVar.eRateSetting,
  1003. &(prCmdContent->ucDesiredPhyTypeSet),
  1004. &(prCmdContent->u2DesiredNonHTRateSet),
  1005. &(prCmdContent->u2BSSBasicRateSet),
  1006. &(prCmdContent->ucMcsSet),
  1007. &(prCmdContent->ucSupMcs32), &(prCmdContent->u2HtCapInfo));
  1008. }
  1009. #endif
  1010. prCmdContent->ucIsQoS = prStaRec->fgIsQoS;
  1011. prCmdContent->ucIsUapsdSupported = prStaRec->fgIsUapsdSupported;
  1012. prCmdContent->ucStaState = prStaRec->ucStaState;
  1013. prCmdContent->ucAmpduParam = prStaRec->ucAmpduParam;
  1014. prCmdContent->u2HtExtendedCap = prStaRec->u2HtExtendedCap;
  1015. prCmdContent->u4TxBeamformingCap = prStaRec->u4TxBeamformingCap;
  1016. prCmdContent->ucAselCap = prStaRec->ucAselCap;
  1017. prCmdContent->ucRCPI = prStaRec->ucRCPI;
  1018. prCmdContent->ucUapsdAc = prStaRec->ucBmpTriggerAC | (prStaRec->ucBmpDeliveryAC << 4);
  1019. prCmdContent->ucUapsdSp = prStaRec->ucUapsdSp;
  1020. rStatus = wlanSendSetQueryCmd(prAdapter, /* prAdapter */
  1021. CMD_ID_UPDATE_STA_RECORD, /* ucCID */
  1022. TRUE, /* fgSetQuery */
  1023. fgNeedResp, /* fgNeedResp */
  1024. FALSE, /* fgIsOid */
  1025. fgNeedResp ? cnmStaRecHandleEventPkt : NULL, NULL, /* pfCmdTimeoutHandler */
  1026. sizeof(CMD_UPDATE_STA_RECORD_T), /* u4SetQueryInfoLen */
  1027. (PUINT_8) prCmdContent, /* pucInfoBuffer */
  1028. NULL, /* pvSetQueryBuffer */
  1029. 0 /* u4SetQueryBufferLen */
  1030. );
  1031. ASSERT(rStatus == WLAN_STATUS_PENDING);
  1032. cnmMemFree(prAdapter, prCmdContent);
  1033. }
  1034. /*----------------------------------------------------------------------------*/
  1035. /*!
  1036. * @brief
  1037. *
  1038. * @param[in]
  1039. *
  1040. * @return (none)
  1041. */
  1042. /*----------------------------------------------------------------------------*/
  1043. static VOID cnmStaSendRemoveCmd(P_ADAPTER_T prAdapter, P_STA_RECORD_T prStaRec)
  1044. {
  1045. CMD_REMOVE_STA_RECORD_T rCmdContent;
  1046. WLAN_STATUS rStatus;
  1047. ASSERT(prAdapter);
  1048. ASSERT(prStaRec);
  1049. rCmdContent.ucIndex = prStaRec->ucIndex;
  1050. kalMemCopy(&rCmdContent.aucMacAddr[0], &prStaRec->aucMacAddr[0], MAC_ADDR_LEN);
  1051. rStatus = wlanSendSetQueryCmd(prAdapter, /* prAdapter */
  1052. CMD_ID_REMOVE_STA_RECORD, /* ucCID */
  1053. TRUE, /* fgSetQuery */
  1054. FALSE, /* fgNeedResp */
  1055. FALSE, /* fgIsOid */
  1056. NULL, /* pfCmdDoneHandler */
  1057. NULL, /* pfCmdTimeoutHandler */
  1058. sizeof(CMD_REMOVE_STA_RECORD_T), /* u4SetQueryInfoLen */
  1059. (PUINT_8) &rCmdContent, /* pucInfoBuffer */
  1060. NULL, /* pvSetQueryBuffer */
  1061. 0 /* u4SetQueryBufferLen */
  1062. );
  1063. ASSERT(rStatus == WLAN_STATUS_PENDING);
  1064. }