saa_fsm.c 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983
  1. /*
  2. ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/saa_fsm.c#2
  3. */
  4. /*! \file "saa_fsm.c"
  5. \brief This file defines the FSM for SAA MODULE.
  6. This file defines the FSM for SAA MODULE.
  7. */
  8. /*
  9. ** Log: saa_fsm.c
  10. **
  11. ** 07 30 2013 wh.su
  12. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  13. ** update some debug code
  14. **
  15. ** 07 30 2013 yuche.tsai
  16. ** [BORA00002398] [MT6630][Volunteer Patch] P2P Driver Re-Design for Multiple BSS support
  17. ** Driver update for Hot-Spot mode.
  18. **
  19. ** 07 30 2013 yuche.tsai
  20. ** [BORA00002398] [MT6630][Volunteer Patch] P2P Driver Re-Design for Multiple BSS support
  21. ** MT6630 Driver Update for Hot-Spot.
  22. **
  23. ** 07 23 2013 wh.su
  24. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  25. ** fixed compiling error
  26. **
  27. ** 07 23 2013 wh.su
  28. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  29. ** Modify some security code for 11w and p2p
  30. **
  31. ** 04 08 2013 cp.wu
  32. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  33. ** remove unnecessary assertion
  34. **
  35. ** 03 12 2013 tsaiyuan.hsu
  36. ** [BORA00002222] MT6630 unified MAC RXM
  37. ** remove hif_rx_hdr usage.
  38. **
  39. ** 03 08 2013 wh.su
  40. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  41. ** Remove non-used compiling flag and code
  42. **
  43. ** 03 06 2013 wh.su
  44. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  45. ** submit some code related with security.
  46. **
  47. ** 02 27 2013 yuche.tsai
  48. ** [BORA00002398] [MT6630][Volunteer Patch] P2P Driver Re-Design for Multiple BSS support
  49. ** Add aaa_fsm.c, p2p_ie.c, fix compile warning & error.
  50. **
  51. ** 02 19 2013 cp.wu
  52. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  53. ** take use of GET_BSS_INFO_BY_INDEX() and MAX_BSS_INDEX macros
  54. ** for correctly indexing of BSS-INFO pointers
  55. **
  56. ** 02 19 2013 cp.wu
  57. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  58. ** correct typo and fix for compilation pass
  59. **
  60. ** 02 19 2013 cp.wu
  61. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  62. ** enable AIS related management modules building under Android/Linux
  63. **
  64. ** 02 18 2013 cm.chang
  65. ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
  66. ** Different argument for staRecFree()
  67. **
  68. ** 01 22 2013 cp.wu
  69. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  70. ** modification for ucBssIndex migration
  71. **
  72. ** 09 17 2012 cm.chang
  73. ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
  74. ** Duplicate source from MT6620 v2.3 driver branch
  75. ** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base)
  76. *
  77. * 07 17 2012 yuche.tsai
  78. * NULL
  79. * Compile no error before trial run.
  80. *
  81. * 04 20 2012 cp.wu
  82. * [WCXRP00000913] [MT6620 Wi-Fi] create repository of source code dedicated for MT6620 E6 ASIC
  83. * correct macro
  84. *
  85. * 11 24 2011 wh.su
  86. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  87. * Adjust code for DBG and CONFIG_XLOG.
  88. *
  89. * 11 11 2011 wh.su
  90. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  91. * modify the xlog related code.
  92. *
  93. * 11 04 2011 cp.wu
  94. * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT
  95. * for REASSOCIATED cases as an explicit trigger for Android framework
  96. * 1. for DEAUTH/DISASSOC cases, indicate for DISCONNECTION immediately.
  97. * 2. (Android only) when reassociation-and-non-roaming cases happened,
  98. * indicate an extra DISCONNECT indication to Android Wi-Fi framework
  99. *
  100. * 11 02 2011 wh.su
  101. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  102. * adding the code for XLOG.
  103. *
  104. * 09 30 2011 cm.chang
  105. * [WCXRP00001020] [MT6620 Wi-Fi][Driver] Handle secondary channel offset of AP in 5GHz band
  106. * Add debug message about 40MHz bandwidth allowed
  107. *
  108. * 05 12 2011 cp.wu
  109. * [WCXRP00000720] [MT6620 Wi-Fi][Driver] Do not do any further operation in case STA-REC
  110. * has been invalidated before SAA-FSM starts to roll
  111. * check for valid STA-REC before SAA-FSM starts to roll.
  112. *
  113. * 04 21 2011 terry.wu
  114. * [WCXRP00000674] [MT6620 Wi-Fi][Driver] Refine AAA authSendAuthFrame
  115. * Add network type parameter to authSendAuthFrame.
  116. *
  117. * 04 15 2011 chinghwa.yu
  118. * [WCXRP00000065] Update BoW design and settings
  119. * Add BOW short range mode.
  120. *
  121. * 04 14 2011 cm.chang
  122. * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
  123. * .
  124. *
  125. * 03 31 2011 puff.wen
  126. * NULL
  127. * .
  128. *
  129. * 02 10 2011 yuche.tsai
  130. * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode.
  131. * Add RX deauthentication & disassociation process under Hot-Spot mode.
  132. *
  133. * 01 26 2011 yuche.tsai
  134. * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
  135. * .
  136. *
  137. * 01 25 2011 yuche.tsai
  138. * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
  139. * Fix compile error of after Station Type Macro modification.
  140. *
  141. * 01 25 2011 yuche.tsai
  142. * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
  143. * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
  144. *
  145. * 11 29 2010 cp.wu
  146. * [WCXRP00000210] [MT6620 Wi-Fi][Driver][FW] Set RCPI value in STA_REC
  147. * for initial TX rate selection of auto-rate algorithm
  148. * update ucRcpi of STA_RECORD_T for AIS when
  149. * 1) Beacons for IBSS merge is received
  150. * 2) Associate Response for a connecting peer is received
  151. *
  152. * 10 18 2010 cp.wu
  153. * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete
  154. * and might leads to BSOD when entering RF test with AIS associated
  155. * 1. remove redundant variables in STA_REC structure
  156. * 2. add STA-REC uninitialization routine for clearing pending events
  157. *
  158. * 09 03 2010 kevin.huang
  159. * NULL
  160. * Refine #include sequence and solve recursive/nested #include issue
  161. *
  162. * 08 30 2010 cp.wu
  163. * NULL
  164. * eliminate klockwork errors
  165. *
  166. * 08 24 2010 chinghwa.yu
  167. * NULL
  168. * Update for MID_SCN_BOW_SCAN_DONE mboxDummy.
  169. * Update saa_fsm for BOW.
  170. *
  171. * 08 16 2010 cp.wu
  172. * NULL
  173. * Replace CFG_SUPPORT_BOW by CFG_ENABLE_BT_OVER_WIFI.
  174. * There is no CFG_SUPPORT_BOW in driver domain source.
  175. *
  176. * 08 02 2010 yuche.tsai
  177. * NULL
  178. * Add support for P2P join event start.
  179. *
  180. * 07 12 2010 cp.wu
  181. *
  182. * SAA will take a record for tracking request sequence number.
  183. *
  184. * 07 08 2010 cp.wu
  185. *
  186. * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
  187. *
  188. * 07 01 2010 cp.wu
  189. * [WPD00003833][MT6620 and MT5931] Driver migration
  190. * AIS-FSM integration with CNM channel request messages
  191. *
  192. * 06 23 2010 cp.wu
  193. * [WPD00003833][MT6620 and MT5931] Driver migration
  194. * sync. with main branch for resetting to state 1 when associating with another AP
  195. *
  196. * 06 21 2010 cp.wu
  197. * [WPD00003833][MT6620 and MT5931] Driver migration
  198. * refine TX-DONE callback.
  199. *
  200. * 06 21 2010 wh.su
  201. * [WPD00003840][MT6620 5931] Security migration
  202. * remove duplicate variable for migration.
  203. *
  204. * 06 18 2010 cm.chang
  205. * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
  206. * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
  207. *
  208. * 06 18 2010 wh.su
  209. * [WPD00003840][MT6620 5931] Security migration
  210. * migration the security related function from firmware.
  211. *
  212. * 06 17 2010 yuche.tsai
  213. * [WPD00003839][MT6620 5931][P2P] Feature migration
  214. * Fix compile error when enable WiFi Direct function.
  215. *
  216. * 06 14 2010 cp.wu
  217. * [WPD00003833][MT6620 and MT5931] Driver migration
  218. * saa_fsm.c is migrated.
  219. *
  220. * 05 12 2010 kevin.huang
  221. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  222. * Add Power Management - Legacy PS-POLL support.
  223. *
  224. * 04 24 2010 cm.chang
  225. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  226. * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW
  227. *
  228. * 04 19 2010 kevin.huang
  229. * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
  230. *
  231. * * * Add Connection Policy - Any and Rx Burst Deauth Support for WHQL
  232. *
  233. * 03 10 2010 kevin.huang
  234. * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
  235. * Add Channel Manager for arbitration of JOIN and SCAN Req
  236. *
  237. * 02 26 2010 kevin.huang
  238. * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
  239. * Add support of Driver STA_RECORD_T activation
  240. *
  241. * 02 04 2010 kevin.huang
  242. * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
  243. * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
  244. *
  245. * 01 27 2010 wh.su
  246. * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
  247. * add and fixed some security function.
  248. *
  249. * 01 12 2010 kevin.huang
  250. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  251. * Fix compile warning due to declared but not used
  252. *
  253. * 01 11 2010 kevin.huang
  254. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  255. * Add Deauth and Disassoc Handler
  256. *
  257. * 01 08 2010 kevin.huang
  258. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  259. * Refine Debug Label
  260. *
  261. * 12 18 2009 cm.chang
  262. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  263. * .
  264. *
  265. * Dec 3 2009 mtk01461
  266. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  267. * Update comment
  268. *
  269. * Dec 1 2009 mtk01088
  270. * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
  271. * rename the function
  272. *
  273. * Nov 24 2009 mtk01461
  274. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  275. * Revise MGMT Handler with Retain Status
  276. *
  277. * Nov 23 2009 mtk01461
  278. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  279. *
  280. */
  281. /*******************************************************************************
  282. * C O M P I L E R F L A G S
  283. ********************************************************************************
  284. */
  285. /*******************************************************************************
  286. * E X T E R N A L R E F E R E N C E S
  287. ********************************************************************************
  288. */
  289. #include "precomp.h"
  290. /*******************************************************************************
  291. * C O N S T A N T S
  292. ********************************************************************************
  293. */
  294. /*******************************************************************************
  295. * D A T A T Y P E S
  296. ********************************************************************************
  297. */
  298. /*******************************************************************************
  299. * P U B L I C D A T A
  300. ********************************************************************************
  301. */
  302. /*******************************************************************************
  303. * P R I V A T E D A T A
  304. ********************************************************************************
  305. */
  306. #if DBG
  307. /*lint -save -e64 Type mismatch */
  308. static PUINT_8 apucDebugAAState[AA_STATE_NUM] = {
  309. (PUINT_8) DISP_STRING("AA_STATE_IDLE"),
  310. (PUINT_8) DISP_STRING("SAA_STATE_SEND_AUTH1"),
  311. (PUINT_8) DISP_STRING("SAA_STATE_WAIT_AUTH2"),
  312. (PUINT_8) DISP_STRING("SAA_STATE_SEND_AUTH3"),
  313. (PUINT_8) DISP_STRING("SAA_STATE_WAIT_AUTH4"),
  314. (PUINT_8) DISP_STRING("SAA_STATE_SEND_ASSOC1"),
  315. (PUINT_8) DISP_STRING("SAA_STATE_WAIT_ASSOC2"),
  316. (PUINT_8) DISP_STRING("AAA_STATE_SEND_AUTH2"),
  317. (PUINT_8) DISP_STRING("AAA_STATE_SEND_AUTH4"),
  318. (PUINT_8) DISP_STRING("AAA_STATE_SEND_ASSOC2"),
  319. (PUINT_8) DISP_STRING("AA_STATE_RESOURCE")
  320. };
  321. /*lint -restore */
  322. #endif /* DBG */
  323. /*******************************************************************************
  324. * M A C R O S
  325. ********************************************************************************
  326. */
  327. /*******************************************************************************
  328. * F U N C T I O N D E C L A R A T I O N S
  329. ********************************************************************************
  330. */
  331. /*******************************************************************************
  332. * F U N C T I O N S
  333. ********************************************************************************
  334. */
  335. /*----------------------------------------------------------------------------*/
  336. /*!
  337. * @brief The Core FSM engine of SAA Module.
  338. *
  339. * @param[in] prStaRec Pointer to the STA_RECORD_T
  340. * @param[in] eNextState The value of Next State
  341. * @param[in] prRetainedSwRfb Pointer to the retained SW_RFB_T for JOIN Success
  342. *
  343. * @return (none)
  344. */
  345. /*----------------------------------------------------------------------------*/
  346. VOID
  347. saaFsmSteps(IN P_ADAPTER_T prAdapter,
  348. IN P_STA_RECORD_T prStaRec, IN ENUM_AA_STATE_T eNextState, IN P_SW_RFB_T prRetainedSwRfb)
  349. {
  350. ENUM_AA_STATE_T ePreviousState;
  351. BOOLEAN fgIsTransition;
  352. ASSERT(prStaRec);
  353. if (!prStaRec) {
  354. return;
  355. }
  356. do {
  357. #if DBG
  358. DBGLOG(SAA, STATE, "TRANSITION: [%s] -> [%s]\n",
  359. apucDebugAAState[prStaRec->eAuthAssocState], apucDebugAAState[eNextState]);
  360. #else
  361. DBGLOG(SAA, STATE, "[%d] TRANSITION: [%d] -> [%d]\n",
  362. DBG_SAA_IDX, prStaRec->eAuthAssocState, eNextState);
  363. #endif
  364. ePreviousState = prStaRec->eAuthAssocState;
  365. /* NOTE(Kevin): This is the only place to change the eAuthAssocState(except initial) */
  366. prStaRec->eAuthAssocState = eNextState;
  367. fgIsTransition = (BOOLEAN) FALSE;
  368. switch (prStaRec->eAuthAssocState) {
  369. case AA_STATE_IDLE:
  370. if (ePreviousState != prStaRec->eAuthAssocState) { /* Only trigger this event once */
  371. if (prRetainedSwRfb) {
  372. if (saaFsmSendEventJoinComplete(prAdapter,
  373. WLAN_STATUS_SUCCESS,
  374. prStaRec,
  375. prRetainedSwRfb) == WLAN_STATUS_SUCCESS) {
  376. /* ToDo:: Nothing */
  377. } else {
  378. eNextState = AA_STATE_RESOURCE;
  379. fgIsTransition = TRUE;
  380. }
  381. } else {
  382. if (saaFsmSendEventJoinComplete(prAdapter,
  383. WLAN_STATUS_FAILURE,
  384. prStaRec, NULL) == WLAN_STATUS_RESOURCES) {
  385. eNextState = AA_STATE_RESOURCE;
  386. fgIsTransition = TRUE;
  387. }
  388. }
  389. }
  390. /* Free allocated TCM memory */
  391. if (prStaRec->prChallengeText) {
  392. cnmMemFree(prAdapter, prStaRec->prChallengeText);
  393. prStaRec->prChallengeText = (P_IE_CHALLENGE_TEXT_T) NULL;
  394. }
  395. break;
  396. case SAA_STATE_SEND_AUTH1:
  397. /* Do tasks in INIT STATE */
  398. if (prStaRec->ucTxAuthAssocRetryCount >= prStaRec->ucTxAuthAssocRetryLimit) {
  399. /* Record the Status Code of Authentication Request */
  400. prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT;
  401. eNextState = AA_STATE_IDLE;
  402. fgIsTransition = TRUE;
  403. } else {
  404. prStaRec->ucTxAuthAssocRetryCount++;
  405. /* Update Station Record - Class 1 Flag */
  406. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  407. #if !CFG_SUPPORT_AAA
  408. if (authSendAuthFrame(prAdapter,
  409. prStaRec, AUTH_TRANSACTION_SEQ_1) != WLAN_STATUS_SUCCESS) {
  410. #else
  411. if (authSendAuthFrame(prAdapter,
  412. prStaRec,
  413. prStaRec->ucBssIndex,
  414. NULL,
  415. AUTH_TRANSACTION_SEQ_1,
  416. STATUS_CODE_RESERVED) != WLAN_STATUS_SUCCESS) {
  417. #endif /* CFG_SUPPORT_AAA */
  418. cnmTimerInitTimer(prAdapter,
  419. &prStaRec->rTxReqDoneOrRxRespTimer, (PFN_MGMT_TIMEOUT_FUNC)
  420. saaFsmRunEventTxReqTimeOut, (ULONG) prStaRec);
  421. cnmTimerStartTimer(prAdapter,
  422. &prStaRec->rTxReqDoneOrRxRespTimer,
  423. TU_TO_MSEC(TX_AUTHENTICATION_RETRY_TIMEOUT_TU));
  424. }
  425. }
  426. break;
  427. case SAA_STATE_WAIT_AUTH2:
  428. break;
  429. case SAA_STATE_SEND_AUTH3:
  430. /* Do tasks in INIT STATE */
  431. if (prStaRec->ucTxAuthAssocRetryCount >= prStaRec->ucTxAuthAssocRetryLimit) {
  432. /* Record the Status Code of Authentication Request */
  433. prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT;
  434. eNextState = AA_STATE_IDLE;
  435. fgIsTransition = TRUE;
  436. } else {
  437. prStaRec->ucTxAuthAssocRetryCount++;
  438. #if !CFG_SUPPORT_AAA
  439. if (authSendAuthFrame(prAdapter,
  440. prStaRec, AUTH_TRANSACTION_SEQ_3) != WLAN_STATUS_SUCCESS) {
  441. #else
  442. if (authSendAuthFrame(prAdapter,
  443. prStaRec,
  444. prStaRec->ucBssIndex,
  445. NULL,
  446. AUTH_TRANSACTION_SEQ_3,
  447. STATUS_CODE_RESERVED) != WLAN_STATUS_SUCCESS) {
  448. #endif /* CFG_SUPPORT_AAA */
  449. cnmTimerInitTimer(prAdapter,
  450. &prStaRec->rTxReqDoneOrRxRespTimer, (PFN_MGMT_TIMEOUT_FUNC)
  451. saaFsmRunEventTxReqTimeOut, (ULONG) prStaRec);
  452. cnmTimerStartTimer(prAdapter,
  453. &prStaRec->rTxReqDoneOrRxRespTimer,
  454. TU_TO_MSEC(TX_AUTHENTICATION_RETRY_TIMEOUT_TU));
  455. }
  456. }
  457. break;
  458. case SAA_STATE_WAIT_AUTH4:
  459. break;
  460. case SAA_STATE_SEND_ASSOC1:
  461. /* Do tasks in INIT STATE */
  462. if (prStaRec->ucTxAuthAssocRetryCount >= prStaRec->ucTxAuthAssocRetryLimit) {
  463. /* Record the Status Code of Authentication Request */
  464. prStaRec->u2StatusCode = STATUS_CODE_ASSOC_TIMEOUT;
  465. eNextState = AA_STATE_IDLE;
  466. fgIsTransition = TRUE;
  467. } else {
  468. prStaRec->ucTxAuthAssocRetryCount++;
  469. if (assocSendReAssocReqFrame(prAdapter, prStaRec) != WLAN_STATUS_SUCCESS) {
  470. cnmTimerInitTimer(prAdapter,
  471. &prStaRec->rTxReqDoneOrRxRespTimer, (PFN_MGMT_TIMEOUT_FUNC)
  472. saaFsmRunEventTxReqTimeOut, (ULONG) prStaRec);
  473. cnmTimerStartTimer(prAdapter,
  474. &prStaRec->rTxReqDoneOrRxRespTimer,
  475. TU_TO_MSEC(TX_ASSOCIATION_RETRY_TIMEOUT_TU));
  476. }
  477. }
  478. break;
  479. case SAA_STATE_WAIT_ASSOC2:
  480. break;
  481. case AA_STATE_RESOURCE:
  482. /* TODO(Kevin) Can setup a timer and send message later */
  483. break;
  484. default:
  485. DBGLOG(SAA, ERROR, "Unknown AA STATE\n");
  486. ASSERT(0);
  487. break;
  488. }
  489. } while (fgIsTransition);
  490. return;
  491. } /* end of saaFsmSteps() */
  492. /*----------------------------------------------------------------------------*/
  493. /*!
  494. * @brief This function will send Event to AIS/BOW/P2P
  495. *
  496. * @param[in] rJoinStatus To indicate JOIN success or failure.
  497. * @param[in] prStaRec Pointer to the STA_RECORD_T
  498. * @param[in] prSwRfb Pointer to the SW_RFB_T
  499. * @return (none)
  500. */
  501. /*----------------------------------------------------------------------------*/
  502. WLAN_STATUS
  503. saaFsmSendEventJoinComplete(IN P_ADAPTER_T prAdapter,
  504. IN WLAN_STATUS rJoinStatus, IN P_STA_RECORD_T prStaRec, IN P_SW_RFB_T prSwRfb)
  505. {
  506. P_BSS_INFO_T prBssInfo;
  507. ASSERT(prStaRec);
  508. if (!prStaRec) {
  509. DBGLOG(SAA, ERROR, "[%s]prStaRec is NULL\n", __func__);
  510. return WLAN_STATUS_INVALID_PACKET;
  511. }
  512. if (!prAdapter) {
  513. DBGLOG(SAA, ERROR, "[%s]prAdapter is NULL\n", __func__);
  514. return WLAN_STATUS_INVALID_PACKET;
  515. }
  516. if (!prAdapter->prAisBssInfo) {
  517. DBGLOG(SAA, ERROR, "[%s]prAdapter->prAisBssInfo is NULL\n", __func__);
  518. return WLAN_STATUS_INVALID_PACKET;
  519. }
  520. /* Store limitation about 40Mhz bandwidth capability during association */
  521. if (prStaRec->ucBssIndex < BSS_INFO_NUM) {
  522. prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex);
  523. if (rJoinStatus == WLAN_STATUS_SUCCESS)
  524. prBssInfo->fg40mBwAllowed = prBssInfo->fgAssoc40mBwAllowed;
  525. prBssInfo->fgAssoc40mBwAllowed = FALSE;
  526. }
  527. if (prStaRec->ucBssIndex == prAdapter->prAisBssInfo->ucBssIndex) {
  528. P_MSG_SAA_FSM_COMP_T prSaaFsmCompMsg;
  529. prSaaFsmCompMsg = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SAA_FSM_COMP_T));
  530. if (!prSaaFsmCompMsg)
  531. return WLAN_STATUS_RESOURCES;
  532. prSaaFsmCompMsg->rMsgHdr.eMsgId = MID_SAA_AIS_JOIN_COMPLETE;
  533. prSaaFsmCompMsg->ucSeqNum = prStaRec->ucAuthAssocReqSeqNum;
  534. prSaaFsmCompMsg->rJoinStatus = rJoinStatus;
  535. prSaaFsmCompMsg->prStaRec = prStaRec;
  536. prSaaFsmCompMsg->prSwRfb = prSwRfb;
  537. /* NOTE(Kevin): Set to UNBUF for immediately JOIN complete */
  538. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prSaaFsmCompMsg, MSG_SEND_METHOD_UNBUF);
  539. return WLAN_STATUS_SUCCESS;
  540. }
  541. #if CFG_ENABLE_WIFI_DIRECT
  542. else if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) {
  543. P_MSG_SAA_FSM_COMP_T prSaaFsmCompMsg;
  544. prSaaFsmCompMsg = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SAA_FSM_COMP_T));
  545. if (!prSaaFsmCompMsg)
  546. return WLAN_STATUS_RESOURCES;
  547. prSaaFsmCompMsg->rMsgHdr.eMsgId = MID_SAA_P2P_JOIN_COMPLETE;
  548. prSaaFsmCompMsg->ucSeqNum = prStaRec->ucAuthAssocReqSeqNum;
  549. prSaaFsmCompMsg->rJoinStatus = rJoinStatus;
  550. prSaaFsmCompMsg->prStaRec = prStaRec;
  551. prSaaFsmCompMsg->prSwRfb = prSwRfb;
  552. /* NOTE(Kevin): Set to UNBUF for immediately JOIN complete */
  553. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prSaaFsmCompMsg, MSG_SEND_METHOD_UNBUF);
  554. return WLAN_STATUS_SUCCESS;
  555. }
  556. #endif
  557. #if CFG_ENABLE_BT_OVER_WIFI
  558. else if (IS_STA_BOW_TYPE(prStaRec)) {
  559. /* @TODO: BOW handler */
  560. P_MSG_SAA_FSM_COMP_T prSaaFsmCompMsg;
  561. prSaaFsmCompMsg = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SAA_FSM_COMP_T));
  562. if (!prSaaFsmCompMsg)
  563. return WLAN_STATUS_RESOURCES;
  564. prSaaFsmCompMsg->rMsgHdr.eMsgId = MID_SAA_BOW_JOIN_COMPLETE;
  565. prSaaFsmCompMsg->ucSeqNum = prStaRec->ucAuthAssocReqSeqNum;
  566. prSaaFsmCompMsg->rJoinStatus = rJoinStatus;
  567. prSaaFsmCompMsg->prStaRec = prStaRec;
  568. prSaaFsmCompMsg->prSwRfb = prSwRfb;
  569. /* NOTE(Kevin): Set to UNBUF for immediately JOIN complete */
  570. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prSaaFsmCompMsg, MSG_SEND_METHOD_UNBUF);
  571. return WLAN_STATUS_SUCCESS;
  572. }
  573. #endif
  574. else {
  575. ASSERT(0);
  576. return WLAN_STATUS_FAILURE;
  577. }
  578. } /* end of saaFsmSendEventJoinComplete() */
  579. /*----------------------------------------------------------------------------*/
  580. /*!
  581. * @brief This function will handle the Start Event to SAA FSM.
  582. *
  583. * @param[in] prMsgHdr Message of Join Request for a particular STA.
  584. *
  585. * @return (none)
  586. */
  587. /*----------------------------------------------------------------------------*/
  588. VOID saaFsmRunEventStart(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  589. {
  590. P_MSG_SAA_FSM_START_T prSaaFsmStartMsg;
  591. P_STA_RECORD_T prStaRec;
  592. P_BSS_INFO_T prBssInfo;
  593. ASSERT(prAdapter);
  594. ASSERT(prMsgHdr);
  595. prSaaFsmStartMsg = (P_MSG_SAA_FSM_START_T) prMsgHdr;
  596. prStaRec = prSaaFsmStartMsg->prStaRec;
  597. if ((!prStaRec) || (prStaRec->fgIsInUse == FALSE)) {
  598. cnmMemFree(prAdapter, prMsgHdr);
  599. return;
  600. }
  601. ASSERT(prStaRec);
  602. DBGLOG(SAA, LOUD, "EVENT-START: Trigger SAA FSM.\n");
  603. /* record sequence number of request message */
  604. prStaRec->ucAuthAssocReqSeqNum = prSaaFsmStartMsg->ucSeqNum;
  605. cnmMemFree(prAdapter, prMsgHdr);
  606. /* 4 <1> Validation of SAA Start Event */
  607. if (!IS_AP_STA(prStaRec)) {
  608. DBGLOG(SAA, ERROR, "EVENT-START: STA Type - %d was not supported.\n", prStaRec->eStaType);
  609. /* Ignore the return value because don't care the prSwRfb */
  610. saaFsmSendEventJoinComplete(prAdapter, WLAN_STATUS_FAILURE, prStaRec, NULL);
  611. return;
  612. }
  613. /* 4 <2> The previous JOIN process is not completed ? */
  614. if (prStaRec->eAuthAssocState != AA_STATE_IDLE) {
  615. DBGLOG(SAA, ERROR, "EVENT-START: Reentry of SAA Module.\n");
  616. prStaRec->eAuthAssocState = AA_STATE_IDLE;
  617. }
  618. /* 4 <3> Reset Status Code and Time */
  619. /* Update Station Record - Status/Reason Code */
  620. prStaRec->u2StatusCode = STATUS_CODE_SUCCESSFUL;
  621. /* Update the record join time. */
  622. GET_CURRENT_SYSTIME(&prStaRec->rLastJoinTime);
  623. prStaRec->ucTxAuthAssocRetryCount = 0;
  624. if (prStaRec->prChallengeText) {
  625. cnmMemFree(prAdapter, prStaRec->prChallengeText);
  626. prStaRec->prChallengeText = (P_IE_CHALLENGE_TEXT_T) NULL;
  627. }
  628. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  629. /* 4 <4> Init the sec fsm */
  630. /* secFsmInit(prAdapter, prStaRec); */
  631. /* 4 <5> Reset the STA STATE */
  632. /* Update Station Record - Class 1 Flag */
  633. /* NOTE(Kevin): Moved to AIS FSM for Reconnect issue -
  634. * We won't deactivate the same STA_RECORD_T and then activate it again for the
  635. * case of reconnection.
  636. */
  637. /* cnmStaRecChangeState(prStaRec, STA_STATE_1); */
  638. /* 4 <6> Decide if this BSS 20/40M bandwidth is allowed */
  639. if (prStaRec->ucBssIndex < BSS_INFO_NUM) {
  640. prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex);
  641. if ((prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11N)
  642. && (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N)) {
  643. prBssInfo->fgAssoc40mBwAllowed = cnmBss40mBwPermitted(prAdapter, prBssInfo->ucBssIndex);
  644. } else {
  645. prBssInfo->fgAssoc40mBwAllowed = FALSE;
  646. }
  647. DBGLOG(RLM, TRACE, "STA 40mAllowed=%d\n", prBssInfo->fgAssoc40mBwAllowed);
  648. }
  649. /* 4 <7> Trigger SAA FSM */
  650. if (prStaRec->ucStaState == STA_STATE_1)
  651. saaFsmSteps(prAdapter, prStaRec, SAA_STATE_SEND_AUTH1, (P_SW_RFB_T) NULL);
  652. else if (prStaRec->ucStaState == STA_STATE_2 || prStaRec->ucStaState == STA_STATE_3)
  653. saaFsmSteps(prAdapter, prStaRec, SAA_STATE_SEND_ASSOC1, (P_SW_RFB_T) NULL);
  654. } /* end of saaFsmRunEventStart() */
  655. /*----------------------------------------------------------------------------*/
  656. /*!
  657. * @brief This function will handle TxDone(Auth1/Auth3/AssocReq) Event of SAA FSM.
  658. *
  659. * @param[in] prMsduInfo Pointer to the MSDU_INFO_T.
  660. * @param[in] rTxDoneStatus Return TX status of the Auth1/Auth3/AssocReq frame.
  661. *
  662. * @retval WLAN_STATUS_SUCCESS
  663. */
  664. /*----------------------------------------------------------------------------*/
  665. WLAN_STATUS
  666. saaFsmRunEventTxDone(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus)
  667. {
  668. P_STA_RECORD_T prStaRec;
  669. ENUM_AA_STATE_T eNextState;
  670. ASSERT(prMsduInfo);
  671. prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
  672. if (!prStaRec)
  673. return WLAN_STATUS_INVALID_PACKET;
  674. ASSERT(prStaRec);
  675. DBGLOG(SAA, LOUD, "EVENT-TX DONE: Current Time = %d\n", kalGetTimeTick());
  676. /* Trigger statistics log if Auth/Assoc Tx failed */
  677. if (rTxDoneStatus != TX_RESULT_SUCCESS)
  678. wlanTriggerStatsLog(prAdapter, prAdapter->rWifiVar.u4StatsLogDuration);
  679. eNextState = prStaRec->eAuthAssocState;
  680. switch (prStaRec->eAuthAssocState) {
  681. case SAA_STATE_SEND_AUTH1:
  682. {
  683. /* Strictly check the outgoing frame is matched with current AA STATE */
  684. if (authCheckTxAuthFrame(prAdapter, prMsduInfo, AUTH_TRANSACTION_SEQ_1) != WLAN_STATUS_SUCCESS)
  685. break;
  686. if (rTxDoneStatus == TX_RESULT_SUCCESS) {
  687. eNextState = SAA_STATE_WAIT_AUTH2;
  688. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  689. cnmTimerInitTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer, (PFN_MGMT_TIMEOUT_FUNC)
  690. saaFsmRunEventRxRespTimeOut, (ULONG) prStaRec);
  691. cnmTimerStartTimer(prAdapter,
  692. &prStaRec->rTxReqDoneOrRxRespTimer,
  693. TU_TO_MSEC(DOT11_AUTHENTICATION_RESPONSE_TIMEOUT_TU));
  694. }
  695. /* if TX was successful, change to next state.
  696. * if TX was failed, do retry if possible.
  697. */
  698. saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T) NULL);
  699. }
  700. break;
  701. case SAA_STATE_SEND_AUTH3:
  702. {
  703. /* Strictly check the outgoing frame is matched with current JOIN STATE */
  704. if (authCheckTxAuthFrame(prAdapter, prMsduInfo, AUTH_TRANSACTION_SEQ_3) != WLAN_STATUS_SUCCESS)
  705. break;
  706. if (rTxDoneStatus == TX_RESULT_SUCCESS) {
  707. eNextState = SAA_STATE_WAIT_AUTH4;
  708. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  709. cnmTimerInitTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer, (PFN_MGMT_TIMEOUT_FUNC)
  710. saaFsmRunEventRxRespTimeOut, (ULONG) prStaRec);
  711. cnmTimerStartTimer(prAdapter,
  712. &prStaRec->rTxReqDoneOrRxRespTimer,
  713. TU_TO_MSEC(DOT11_AUTHENTICATION_RESPONSE_TIMEOUT_TU));
  714. }
  715. /* if TX was successful, change to next state.
  716. * if TX was failed, do retry if possible.
  717. */
  718. saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T) NULL);
  719. }
  720. break;
  721. case SAA_STATE_SEND_ASSOC1:
  722. {
  723. /* Strictly check the outgoing frame is matched with current SAA STATE */
  724. if (assocCheckTxReAssocReqFrame(prAdapter, prMsduInfo) != WLAN_STATUS_SUCCESS)
  725. break;
  726. if (rTxDoneStatus == TX_RESULT_SUCCESS) {
  727. eNextState = SAA_STATE_WAIT_ASSOC2;
  728. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  729. cnmTimerInitTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer, (PFN_MGMT_TIMEOUT_FUNC)
  730. saaFsmRunEventRxRespTimeOut, (ULONG) prStaRec);
  731. cnmTimerStartTimer(prAdapter,
  732. &(prStaRec->rTxReqDoneOrRxRespTimer),
  733. TU_TO_MSEC(DOT11_ASSOCIATION_RESPONSE_TIMEOUT_TU));
  734. }
  735. /* if TX was successful, change to next state.
  736. * if TX was failed, do retry if possible.
  737. */
  738. saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T) NULL);
  739. }
  740. break;
  741. default:
  742. break; /* Ignore other cases */
  743. }
  744. return WLAN_STATUS_SUCCESS;
  745. } /* end of saaFsmRunEventTxDone() */
  746. /*----------------------------------------------------------------------------*/
  747. /*!
  748. * @brief This function will send Tx Request Timeout Event to SAA FSM.
  749. *
  750. * @param[in] prStaRec Pointer to the STA_RECORD_T
  751. *
  752. * @return (none)
  753. */
  754. /*----------------------------------------------------------------------------*/
  755. VOID saaFsmRunEventTxReqTimeOut(IN P_ADAPTER_T prAdapter, IN ULONG plParamPtr)
  756. {
  757. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) plParamPtr;
  758. ASSERT(prStaRec);
  759. if (!prStaRec)
  760. return;
  761. DBGLOG(SAA, LOUD, "EVENT-TIMER: TX REQ TIMEOUT, Current Time = %d\n", kalGetTimeTick());
  762. /* Trigger statistics log if Auth/Assoc Tx timeout */
  763. wlanTriggerStatsLog(prAdapter, prAdapter->rWifiVar.u4StatsLogDuration);
  764. switch (prStaRec->eAuthAssocState) {
  765. case SAA_STATE_SEND_AUTH1:
  766. case SAA_STATE_SEND_AUTH3:
  767. case SAA_STATE_SEND_ASSOC1:
  768. saaFsmSteps(prAdapter, prStaRec, prStaRec->eAuthAssocState, (P_SW_RFB_T) NULL);
  769. break;
  770. default:
  771. return;
  772. }
  773. } /* end of saaFsmRunEventTxReqTimeOut() */
  774. /*----------------------------------------------------------------------------*/
  775. /*!
  776. * @brief This function will send Rx Response Timeout Event to SAA FSM.
  777. *
  778. * @param[in] prStaRec Pointer to the STA_RECORD_T
  779. *
  780. * @return (none)
  781. */
  782. /*----------------------------------------------------------------------------*/
  783. VOID saaFsmRunEventRxRespTimeOut(IN P_ADAPTER_T prAdapter, IN ULONG ulParamPtr)
  784. {
  785. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) ulParamPtr;
  786. ENUM_AA_STATE_T eNextState;
  787. DBGLOG(SAA, LOUD, "EVENT-TIMER: RX RESP TIMEOUT, Current Time = %d\n", kalGetTimeTick());
  788. ASSERT(prStaRec);
  789. if (!prStaRec)
  790. return;
  791. eNextState = prStaRec->eAuthAssocState;
  792. switch (prStaRec->eAuthAssocState) {
  793. case SAA_STATE_WAIT_AUTH2:
  794. /* Record the Status Code of Authentication Request */
  795. prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT;
  796. /* Pull back to earlier state to do retry */
  797. eNextState = SAA_STATE_SEND_AUTH1;
  798. break;
  799. case SAA_STATE_WAIT_AUTH4:
  800. /* Record the Status Code of Authentication Request */
  801. prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT;
  802. /* Pull back to earlier state to do retry */
  803. eNextState = SAA_STATE_SEND_AUTH3;
  804. break;
  805. case SAA_STATE_WAIT_ASSOC2:
  806. /* Record the Status Code of Authentication Request */
  807. prStaRec->u2StatusCode = STATUS_CODE_ASSOC_TIMEOUT;
  808. /* Pull back to earlier state to do retry */
  809. eNextState = SAA_STATE_SEND_ASSOC1;
  810. break;
  811. default:
  812. break; /* Ignore other cases */
  813. }
  814. if (eNextState != prStaRec->eAuthAssocState)
  815. saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T) NULL);
  816. } /* end of saaFsmRunEventRxRespTimeOut() */
  817. /*----------------------------------------------------------------------------*/
  818. /*!
  819. * @brief This function will process the Rx Auth Response Frame and then
  820. * trigger SAA FSM.
  821. *
  822. * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
  823. *
  824. * @return (none)
  825. */
  826. /*----------------------------------------------------------------------------*/
  827. VOID saaFsmRunEventRxAuth(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  828. {
  829. P_STA_RECORD_T prStaRec;
  830. UINT_16 u2StatusCode;
  831. ENUM_AA_STATE_T eNextState;
  832. ASSERT(prSwRfb);
  833. prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
  834. /* We should have the corresponding Sta Record. */
  835. if (!prStaRec)
  836. return;
  837. if (!IS_AP_STA(prStaRec))
  838. return;
  839. switch (prStaRec->eAuthAssocState) {
  840. case SAA_STATE_SEND_AUTH1:
  841. case SAA_STATE_WAIT_AUTH2:
  842. /* Check if the incoming frame is what we are waiting for */
  843. if (authCheckRxAuthFrameStatus(prAdapter,
  844. prSwRfb, AUTH_TRANSACTION_SEQ_2, &u2StatusCode) == WLAN_STATUS_SUCCESS) {
  845. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  846. /* Record the Status Code of Authentication Request */
  847. prStaRec->u2StatusCode = u2StatusCode;
  848. if (u2StatusCode == STATUS_CODE_SUCCESSFUL) {
  849. authProcessRxAuth2_Auth4Frame(prAdapter, prSwRfb);
  850. if (prStaRec->ucAuthAlgNum == (UINT_8) AUTH_ALGORITHM_NUM_SHARED_KEY) {
  851. eNextState = SAA_STATE_SEND_AUTH3;
  852. } else {
  853. /* Update Station Record - Class 2 Flag */
  854. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
  855. eNextState = SAA_STATE_SEND_ASSOC1;
  856. }
  857. } else {
  858. DBGLOG(SAA, INFO,
  859. "Auth Req was rejected by [" MACSTR "], Status Code = %d\n",
  860. MAC2STR(prStaRec->aucMacAddr),
  861. u2StatusCode);
  862. eNextState = AA_STATE_IDLE;
  863. }
  864. /* Reset Send Auth/(Re)Assoc Frame Count */
  865. prStaRec->ucTxAuthAssocRetryCount = 0;
  866. saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T) NULL);
  867. }
  868. break;
  869. case SAA_STATE_SEND_AUTH3:
  870. case SAA_STATE_WAIT_AUTH4:
  871. /* Check if the incoming frame is what we are waiting for */
  872. if (authCheckRxAuthFrameStatus(prAdapter,
  873. prSwRfb, AUTH_TRANSACTION_SEQ_4, &u2StatusCode) == WLAN_STATUS_SUCCESS) {
  874. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  875. /* Record the Status Code of Authentication Request */
  876. prStaRec->u2StatusCode = u2StatusCode;
  877. if (u2StatusCode == STATUS_CODE_SUCCESSFUL) {
  878. authProcessRxAuth2_Auth4Frame(prAdapter, prSwRfb); /* Add for 802.11r handling */
  879. /* Update Station Record - Class 2 Flag */
  880. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
  881. eNextState = SAA_STATE_SEND_ASSOC1;
  882. } else {
  883. DBGLOG(SAA, INFO,
  884. "Auth Req was rejected by [" MACSTR "], Status Code = %d\n",
  885. MAC2STR(prStaRec->aucMacAddr),
  886. u2StatusCode);
  887. eNextState = AA_STATE_IDLE;
  888. }
  889. /* Reset Send Auth/(Re)Assoc Frame Count */
  890. prStaRec->ucTxAuthAssocRetryCount = 0;
  891. saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T) NULL);
  892. }
  893. break;
  894. default:
  895. break; /* Ignore other cases */
  896. }
  897. } /* end of saaFsmRunEventRxAuth() */
  898. /*----------------------------------------------------------------------------*/
  899. /*!
  900. * @brief This function will process the Rx (Re)Association Response Frame and then
  901. * trigger SAA FSM.
  902. *
  903. * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
  904. *
  905. * @retval WLAN_STATUS_SUCCESS if the status code was not success
  906. * @retval WLAN_STATUS_BUFFER_RETAINED if the status code was success
  907. */
  908. /*----------------------------------------------------------------------------*/
  909. WLAN_STATUS saaFsmRunEventRxAssoc(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  910. {
  911. P_STA_RECORD_T prStaRec;
  912. UINT_16 u2StatusCode;
  913. ENUM_AA_STATE_T eNextState;
  914. P_SW_RFB_T prRetainedSwRfb = (P_SW_RFB_T) NULL;
  915. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  916. ASSERT(prSwRfb);
  917. prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
  918. /* We should have the corresponding Sta Record. */
  919. if (!prStaRec) {
  920. /* ASSERT(0); */
  921. return rStatus;
  922. }
  923. if (!IS_AP_STA(prStaRec))
  924. return rStatus;
  925. switch (prStaRec->eAuthAssocState) {
  926. case SAA_STATE_SEND_ASSOC1:
  927. case SAA_STATE_WAIT_ASSOC2:
  928. /* TRUE if the incoming frame is what we are waiting for */
  929. if (assocCheckRxReAssocRspFrameStatus(prAdapter, prSwRfb, &u2StatusCode) == WLAN_STATUS_SUCCESS) {
  930. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  931. /* Record the Status Code of Authentication Request */
  932. prStaRec->u2StatusCode = u2StatusCode;
  933. if (u2StatusCode == STATUS_CODE_SUCCESSFUL) {
  934. /* Update Station Record - Class 3 Flag */
  935. /* NOTE(Kevin): Moved to AIS FSM for roaming issue -
  936. * We should deactivate the STA_RECORD_T of previous AP before
  937. * activate new one in Driver.
  938. */
  939. /* cnmStaRecChangeState(prStaRec, STA_STATE_3); */
  940. prStaRec->ucJoinFailureCount = 0; /* Clear history. */
  941. prRetainedSwRfb = prSwRfb;
  942. rStatus = WLAN_STATUS_PENDING;
  943. } else {
  944. DBGLOG(SAA, INFO,
  945. "Assoc Req was rejected by [" MACSTR
  946. "], Status Code = %d\n", MAC2STR(prStaRec->aucMacAddr), u2StatusCode);
  947. }
  948. /* Reset Send Auth/(Re)Assoc Frame Count */
  949. prStaRec->ucTxAuthAssocRetryCount = 0;
  950. /* update RCPI */
  951. ASSERT(prSwRfb->prRxStatusGroup3);
  952. prStaRec->ucRCPI = (UINT_8) HAL_RX_STATUS_GET_RCPI(prSwRfb->prRxStatusGroup3);
  953. eNextState = AA_STATE_IDLE;
  954. saaFsmSteps(prAdapter, prStaRec, eNextState, prRetainedSwRfb);
  955. }
  956. break;
  957. default:
  958. break; /* Ignore other cases */
  959. }
  960. return rStatus;
  961. } /* end of saaFsmRunEventRxAssoc() */
  962. /*----------------------------------------------------------------------------*/
  963. /*!
  964. * @brief This function will check the incoming Deauth Frame.
  965. *
  966. * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
  967. *
  968. * @retval WLAN_STATUS_SUCCESS Always not retain deauthentication frames
  969. */
  970. /*----------------------------------------------------------------------------*/
  971. WLAN_STATUS saaFsmRunEventRxDeauth(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  972. {
  973. P_STA_RECORD_T prStaRec;
  974. P_WLAN_DEAUTH_FRAME_T prDeauthFrame;
  975. ASSERT(prSwRfb);
  976. prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
  977. prDeauthFrame = (P_WLAN_DEAUTH_FRAME_T) prSwRfb->pvHeader;
  978. DBGLOG(SAA, INFO, "Rx Deauth frame ,DA[" MACSTR "] SA[" MACSTR "] BSSID[" MACSTR "] ReasonCode[0x%x]\n",
  979. MAC2STR(prDeauthFrame->aucDestAddr),
  980. MAC2STR(prDeauthFrame->aucSrcAddr),
  981. MAC2STR(prDeauthFrame->aucBSSID),
  982. prDeauthFrame->u2ReasonCode);
  983. do {
  984. /* We should have the corresponding Sta Record. */
  985. if (!prStaRec)
  986. break;
  987. if (IS_STA_IN_AIS(prStaRec)) {
  988. P_BSS_INFO_T prAisBssInfo;
  989. if (!IS_AP_STA(prStaRec))
  990. break;
  991. prAisBssInfo = prAdapter->prAisBssInfo;
  992. if (prStaRec->ucStaState > STA_STATE_1) {
  993. /* Check if this is the AP we are associated or associating with */
  994. if (authProcessRxDeauthFrame(prSwRfb,
  995. prStaRec->aucMacAddr,
  996. &prStaRec->u2ReasonCode) == WLAN_STATUS_SUCCESS) {
  997. #if CFG_SUPPORT_802_11W
  998. P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
  999. prAisSpecBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
  1000. DBGLOG(RSN, INFO,
  1001. "QM RX MGT: Deauth frame, P=%d Sec=%d CM=%d BC=%d fc=%02x\n",
  1002. prAisSpecBssInfo->fgMgmtProtection,
  1003. HAL_RX_STATUS_GET_SEC_MODE(prSwRfb->prRxStatus),
  1004. HAL_RX_STATUS_IS_CIPHER_MISMATCH(prSwRfb->prRxStatus),
  1005. IS_BMCAST_MAC_ADDR(prDeauthFrame->aucDestAddr),
  1006. prDeauthFrame->u2FrameCtrl);
  1007. if (prAisSpecBssInfo->fgMgmtProtection
  1008. && HAL_RX_STATUS_IS_CIPHER_MISMATCH(prSwRfb->prRxStatus)
  1009. /* HAL_RX_STATUS_GET_SEC_MODE(prSwRfb->prRxStatus) != CIPHER_SUITE_BIP */
  1010. ) {
  1011. saaChkDeauthfrmParamHandler(prAdapter, prSwRfb, prStaRec);
  1012. return WLAN_STATUS_SUCCESS;
  1013. }
  1014. #endif
  1015. saaSendDisconnectMsgHandler(prAdapter, prStaRec, prAisBssInfo, FRM_DEAUTH);
  1016. }
  1017. }
  1018. }
  1019. #if CFG_ENABLE_WIFI_DIRECT
  1020. else if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
  1021. /* TODO(Kevin) */
  1022. p2pRoleFsmRunEventRxDeauthentication(prAdapter, prStaRec, prSwRfb);
  1023. }
  1024. #endif
  1025. #if CFG_ENABLE_BT_OVER_WIFI
  1026. else if (IS_STA_BOW_TYPE(prStaRec))
  1027. bowRunEventRxDeAuth(prAdapter, prStaRec, prSwRfb);
  1028. #endif
  1029. else
  1030. ASSERT(0);
  1031. } while (FALSE);
  1032. return WLAN_STATUS_SUCCESS;
  1033. } /* end of saaFsmRunEventRxDeauth() */
  1034. /* for AOSP */
  1035. /*----------------------------------------------------------------------------*/
  1036. /*!
  1037. * @brief This function will check param of deauth frame and reson code for deauth
  1038. *
  1039. * @param[in]
  1040. *
  1041. * @retval
  1042. */
  1043. /*----------------------------------------------------------------------------*/
  1044. VOID saaChkDeauthfrmParamHandler(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb, IN P_STA_RECORD_T prStaRec)
  1045. {
  1046. P_WLAN_DEAUTH_FRAME_T prDeauthFrame;
  1047. do {
  1048. prDeauthFrame = (P_WLAN_DEAUTH_FRAME_T) prSwRfb->pvHeader;
  1049. if (!IS_BMCAST_MAC_ADDR(prDeauthFrame->aucDestAddr) &&
  1050. (prStaRec->u2ReasonCode == REASON_CODE_CLASS_2_ERR
  1051. || prStaRec->u2ReasonCode == REASON_CODE_CLASS_3_ERR)) {
  1052. DBGLOG(RSN, INFO, "QM RX MGT: rsnStartSaQuery\n");
  1053. /* MFP test plan 5.3.3.5 */
  1054. rsnStartSaQuery(prAdapter);
  1055. } else {
  1056. DBGLOG(RSN, INFO, "RXM: Drop unprotected Mgmt frame\n");
  1057. DBGLOG(RSN, INFO,
  1058. "RXM: (MAC RX Done) RX (u2StatusFlag=0x%x) (ucKIdxSecMode=0x%x) (ucWlanIdx=0x%x)\n",
  1059. prSwRfb->prRxStatus->u2StatusFlag,
  1060. prSwRfb->prRxStatus->ucTidSecMode, prSwRfb->prRxStatus->ucWlanIdx);
  1061. }
  1062. } while (0);
  1063. }
  1064. /* for AOSP */
  1065. /*----------------------------------------------------------------------------*/
  1066. /*!
  1067. * @brief This function will check and send disconnect message to AIS module
  1068. *
  1069. * @param[in]
  1070. *
  1071. * @retval
  1072. */
  1073. /*----------------------------------------------------------------------------*/
  1074. VOID
  1075. saaSendDisconnectMsgHandler(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN P_BSS_INFO_T prAisBssInfo,
  1076. IN ENUM_AA_FRM_TYPE_T eFrmType)
  1077. {
  1078. do {
  1079. if (eFrmType == FRM_DEAUTH) {
  1080. if (STA_STATE_3 == prStaRec->ucStaState) {
  1081. P_MSG_AIS_ABORT_T prAisAbortMsg;
  1082. /* NOTE(Kevin): Change state immediately to avoid starvation of
  1083. * MSG buffer because of too many deauth frames before changing
  1084. * the STA state.
  1085. */
  1086. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  1087. prAisAbortMsg =
  1088. (P_MSG_AIS_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
  1089. if (!prAisAbortMsg)
  1090. break;
  1091. prAisAbortMsg->rMsgHdr.eMsgId = MID_SAA_AIS_FSM_ABORT;
  1092. prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_DEAUTHENTICATED;
  1093. prAisAbortMsg->fgDelayIndication = FALSE;
  1094. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF);
  1095. } else {
  1096. /* TODO(Kevin): Joining Abort */
  1097. }
  1098. } else { /* FRM_DISASSOC */
  1099. if (STA_STATE_3 == prStaRec->ucStaState) {
  1100. P_MSG_AIS_ABORT_T prAisAbortMsg;
  1101. prAisAbortMsg = (P_MSG_AIS_ABORT_T) cnmMemAlloc(prAdapter,
  1102. RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
  1103. if (!prAisAbortMsg)
  1104. break;
  1105. prAisAbortMsg->rMsgHdr.eMsgId = MID_SAA_AIS_FSM_ABORT;
  1106. prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_DISASSOCIATED;
  1107. prAisAbortMsg->fgDelayIndication = FALSE;
  1108. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF);
  1109. } else {
  1110. /* TODO(Kevin): Joining Abort */
  1111. }
  1112. }
  1113. if (prAisBssInfo)
  1114. prAisBssInfo->u2DeauthReason = prStaRec->u2ReasonCode;
  1115. } while (0);
  1116. }
  1117. /*----------------------------------------------------------------------------*/
  1118. /*!
  1119. * @brief This function will check the incoming Disassociation Frame.
  1120. *
  1121. * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
  1122. *
  1123. * @retval WLAN_STATUS_SUCCESS Always not retain disassociation frames
  1124. */
  1125. /*----------------------------------------------------------------------------*/
  1126. WLAN_STATUS saaFsmRunEventRxDisassoc(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  1127. {
  1128. P_STA_RECORD_T prStaRec;
  1129. P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
  1130. ASSERT(prSwRfb);
  1131. prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
  1132. prDisassocFrame = (P_WLAN_DISASSOC_FRAME_T) prSwRfb->pvHeader;
  1133. DBGLOG(SAA, INFO,
  1134. "Rx Disassoc frame from BSSID[" MACSTR "] DA[" MACSTR "] ReasonCode[0x%x]\n",
  1135. MAC2STR(prDisassocFrame->aucBSSID),
  1136. MAC2STR(prDisassocFrame->aucDestAddr),
  1137. prDisassocFrame->u2ReasonCode);
  1138. do {
  1139. /* We should have the corresponding Sta Record. */
  1140. if (!prStaRec)
  1141. break;
  1142. if (IS_STA_IN_AIS(prStaRec)) {
  1143. P_BSS_INFO_T prAisBssInfo;
  1144. if (!IS_AP_STA(prStaRec))
  1145. break;
  1146. prAisBssInfo = prAdapter->prAisBssInfo;
  1147. if (prStaRec->ucStaState > STA_STATE_1) {
  1148. /* Check if this is the AP we are associated or associating with */
  1149. if (assocProcessRxDisassocFrame(prAdapter,
  1150. prSwRfb,
  1151. prStaRec->aucMacAddr,
  1152. &prStaRec->u2ReasonCode) == WLAN_STATUS_SUCCESS) {
  1153. #if CFG_SUPPORT_802_11W
  1154. P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
  1155. prAisSpecBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
  1156. DBGLOG(RSN, INFO,
  1157. "QM RX MGT: Disassoc frame, P=%d Sec=%d CM=%d BC=%d fc=%02x\n",
  1158. prAisSpecBssInfo->fgMgmtProtection,
  1159. HAL_RX_STATUS_GET_SEC_MODE(prSwRfb->prRxStatus),
  1160. HAL_RX_STATUS_IS_CIPHER_MISMATCH(prSwRfb->prRxStatus),
  1161. IS_BMCAST_MAC_ADDR(prDisassocFrame->aucDestAddr),
  1162. prDisassocFrame->u2FrameCtrl);
  1163. if (IS_STA_IN_AIS(prStaRec)
  1164. && prAisSpecBssInfo->fgMgmtProtection
  1165. && HAL_RX_STATUS_IS_CIPHER_MISMATCH(prSwRfb->prRxStatus)
  1166. /* HAL_RX_STATUS_GET_SEC_MODE(prSwRfb->prRxStatus) != CIPHER_SUITE_CCMP */
  1167. ) {
  1168. /* prDisassocFrame = (P_WLAN_DISASSOC_FRAME_T) prSwRfb->pvHeader; */
  1169. saaChkDisassocfrmParamHandler(prAdapter, prDisassocFrame, prStaRec,
  1170. prSwRfb);
  1171. return WLAN_STATUS_SUCCESS;
  1172. }
  1173. #endif
  1174. saaSendDisconnectMsgHandler(prAdapter, prStaRec, prAisBssInfo, FRM_DISASSOC);
  1175. }
  1176. }
  1177. }
  1178. #if CFG_ENABLE_WIFI_DIRECT
  1179. else if (prAdapter->fgIsP2PRegistered && (IS_STA_IN_P2P(prStaRec))) {
  1180. /* TODO(Kevin) */
  1181. p2pRoleFsmRunEventRxDisassociation(prAdapter, prStaRec, prSwRfb);
  1182. }
  1183. #endif
  1184. #if CFG_ENABLE_BT_OVER_WIFI
  1185. else if (IS_STA_BOW_TYPE(prStaRec)) {
  1186. /* ToDo:: nothing */
  1187. /* TODO(Kevin) */
  1188. }
  1189. #endif
  1190. else
  1191. ASSERT(0);
  1192. } while (FALSE);
  1193. return WLAN_STATUS_SUCCESS;
  1194. } /* end of saaFsmRunEventRxDisassoc() */
  1195. /* for AOSP */
  1196. /*----------------------------------------------------------------------------*/
  1197. /*!
  1198. * @brief This function will check param of Disassoc frame and reson code for Disassoc
  1199. *
  1200. * @param[in]
  1201. *
  1202. * @retval
  1203. */
  1204. /*----------------------------------------------------------------------------*/
  1205. VOID
  1206. saaChkDisassocfrmParamHandler(IN P_ADAPTER_T prAdapter,
  1207. IN P_WLAN_DISASSOC_FRAME_T prDisassocFrame, IN P_STA_RECORD_T prStaRec,
  1208. IN P_SW_RFB_T prSwRfb)
  1209. {
  1210. if (!IS_BMCAST_MAC_ADDR(prDisassocFrame->aucDestAddr) &&
  1211. (prStaRec->u2ReasonCode == REASON_CODE_CLASS_2_ERR || prStaRec->u2ReasonCode == REASON_CODE_CLASS_3_ERR)) {
  1212. /* MFP test plan 5.3.3.5 */
  1213. DBGLOG(RSN, INFO, "QM RX MGT: rsnStartSaQuery\n");
  1214. rsnStartSaQuery(prAdapter);
  1215. } else {
  1216. DBGLOG(RSN, INFO, "RXM: Drop unprotected Mgmt frame\n");
  1217. DBGLOG(RSN, INFO,
  1218. "RXM: (MAC RX Done) RX (u2StatusFlag=0x%x) (ucKIdxSecMode=0x%x) (ucWlanIdx=0x%x)\n",
  1219. prSwRfb->prRxStatus->u2StatusFlag,
  1220. prSwRfb->prRxStatus->ucTidSecMode, prSwRfb->prRxStatus->ucWlanIdx);
  1221. }
  1222. }
  1223. /*----------------------------------------------------------------------------*/
  1224. /*!
  1225. * @brief This function will handle the Abort Event to SAA FSM.
  1226. *
  1227. * @param[in] prMsgHdr Message of Abort Request for a particular STA.
  1228. *
  1229. * @return none
  1230. */
  1231. /*----------------------------------------------------------------------------*/
  1232. VOID saaFsmRunEventAbort(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  1233. {
  1234. P_MSG_SAA_FSM_ABORT_T prSaaFsmAbortMsg;
  1235. P_STA_RECORD_T prStaRec;
  1236. ASSERT(prMsgHdr);
  1237. prSaaFsmAbortMsg = (P_MSG_SAA_FSM_ABORT_T) prMsgHdr;
  1238. prStaRec = prSaaFsmAbortMsg->prStaRec;
  1239. ASSERT(prStaRec);
  1240. if (!prStaRec) {
  1241. cnmMemFree(prAdapter, prMsgHdr);
  1242. return;
  1243. }
  1244. DBGLOG(SAA, LOUD, "EVENT-ABORT: Stop SAA FSM.\n");
  1245. cnmMemFree(prAdapter, prMsgHdr);
  1246. /* Reset Send Auth/(Re)Assoc Frame Count */
  1247. prStaRec->ucTxAuthAssocRetryCount = 0;
  1248. /* Cancel JOIN relative Timer */
  1249. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  1250. if (prStaRec->eAuthAssocState != AA_STATE_IDLE) {
  1251. #if DBG
  1252. DBGLOG(SAA, LOUD, "EVENT-ABORT: Previous Auth/Assoc State == %s.\n",
  1253. apucDebugAAState[prStaRec->eAuthAssocState]);
  1254. #else
  1255. DBGLOG(SAA, LOUD, "EVENT-ABORT: Previous Auth/Assoc State == %d.\n", prStaRec->eAuthAssocState);
  1256. #endif
  1257. }
  1258. #if 0
  1259. /* For the Auth/Assoc State to IDLE */
  1260. prStaRec->eAuthAssocState = AA_STATE_IDLE;
  1261. #else
  1262. /* Free this StaRec */
  1263. cnmStaRecFree(prAdapter, prStaRec);
  1264. #endif
  1265. } /* end of saaFsmRunEventAbort() */
  1266. /* TODO(Kevin): following code will be modified and move to AIS FSM */
  1267. #if 0
  1268. /*----------------------------------------------------------------------------*/
  1269. /*!
  1270. * \brief This function will send Join Timeout Event to JOIN FSM.
  1271. *
  1272. * \param[in] prAdapter Pointer to the Adapter structure.
  1273. *
  1274. * \retval WLAN_STATUS_FAILURE Fail because of Join Timeout
  1275. */
  1276. /*----------------------------------------------------------------------------*/
  1277. WLAN_STATUS joinFsmRunEventJoinTimeOut(IN P_ADAPTER_T prAdapter)
  1278. {
  1279. P_JOIN_INFO_T prJoinInfo;
  1280. P_STA_RECORD_T prStaRec;
  1281. DEBUGFUNC("joinFsmRunEventJoinTimeOut");
  1282. ASSERT(prAdapter);
  1283. prJoinInfo = &prAdapter->rJoinInfo;
  1284. DBGLOG(JOIN, EVENT, "JOIN EVENT: JOIN TIMEOUT\n");
  1285. /* Get a Station Record if possible, TA == BSSID for AP */
  1286. prStaRec = staRecGetStaRecordByAddr(prAdapter, prJoinInfo->prBssDesc->aucBSSID);
  1287. /* We have renew this Sta Record when in JOIN_STATE_INIT */
  1288. ASSERT(prStaRec);
  1289. /* Record the Status Code of Authentication Request */
  1290. prStaRec->u2StatusCode = STATUS_CODE_JOIN_TIMEOUT;
  1291. /* Increase Failure Count */
  1292. prStaRec->ucJoinFailureCount++;
  1293. /* Reset Send Auth/(Re)Assoc Frame Count */
  1294. prJoinInfo->ucTxAuthAssocRetryCount = 0;
  1295. /* Cancel other JOIN relative Timer */
  1296. ARB_CANCEL_TIMER(prAdapter, prJoinInfo->rTxRequestTimer);
  1297. ARB_CANCEL_TIMER(prAdapter, prJoinInfo->rRxResponseTimer);
  1298. /* Restore original setting from current BSS_INFO_T */
  1299. if (prAdapter->eConnectionState == MEDIA_STATE_CONNECTED)
  1300. joinAdoptParametersFromCurrentBss(prAdapter);
  1301. /* Pull back to IDLE */
  1302. joinFsmSteps(prAdapter, JOIN_STATE_IDLE);
  1303. return WLAN_STATUS_FAILURE;
  1304. } /* end of joinFsmRunEventJoinTimeOut() */
  1305. /*----------------------------------------------------------------------------*/
  1306. /*!
  1307. * \brief This function will adopt the parameters from Peer BSS.
  1308. *
  1309. * \param[in] prAdapter Pointer to the Adapter structure.
  1310. *
  1311. * \return (none)
  1312. */
  1313. /*----------------------------------------------------------------------------*/
  1314. VOID joinAdoptParametersFromPeerBss(IN P_ADAPTER_T prAdapter)
  1315. {
  1316. P_JOIN_INFO_T prJoinInfo;
  1317. P_BSS_DESC_T prBssDesc;
  1318. DEBUGFUNC("joinAdoptParametersFromPeerBss");
  1319. ASSERT(prAdapter);
  1320. prJoinInfo = &prAdapter->rJoinInfo;
  1321. prBssDesc = prJoinInfo->prBssDesc;
  1322. /* 4 <1> Adopt Peer BSS' PHY TYPE */
  1323. prAdapter->eCurrentPhyType = prBssDesc->ePhyType;
  1324. DBGLOG(JOIN, INFO, "Target BSS[%s]'s PhyType = %s\n",
  1325. prBssDesc->aucSSID, (prBssDesc->ePhyType == PHY_TYPE_ERP_INDEX) ? "ERP" : "HR_DSSS";
  1326. /* 4 <2> Adopt Peer BSS' Frequency(Band/Channel) */
  1327. DBGLOG(JOIN, INFO, "Target BSS's Channel = %d, Band = %d\n", prBssDesc->ucChannelNum, prBssDesc->eBand;
  1328. nicSwitchChannel(prAdapter, prBssDesc->eBand, prBssDesc->ucChannelNum, 10);
  1329. prJoinInfo->fgIsParameterAdopted = TRUE;
  1330. } /* end of joinAdoptParametersFromPeerBss() */
  1331. /*----------------------------------------------------------------------------*/
  1332. /*!
  1333. * \brief This function will adopt the parameters from current associated BSS.
  1334. *
  1335. * \param[in] prAdapter Pointer to the Adapter structure.
  1336. *
  1337. * \return (none)
  1338. */
  1339. /*----------------------------------------------------------------------------*/
  1340. VOID joinAdoptParametersFromCurrentBss(IN P_ADAPTER_T prAdapter)
  1341. {
  1342. /* P_JOIN_INFO_T prJoinInfo = &prAdapter->rJoinInfo; */
  1343. P_BSS_INFO_T prBssInfo;
  1344. ASSERT(prAdapter);
  1345. prBssInfo = &prAdapter->rBssInfo;
  1346. /* 4 <1> Adopt current BSS' PHY TYPE */
  1347. prAdapter->eCurrentPhyType = prBssInfo->ePhyType;
  1348. /* 4 <2> Adopt current BSS' Frequency(Band/Channel) */
  1349. DBGLOG(JOIN, INFO, "Current BSS's Channel = %d, Band = %d\n", prBssInfo->ucChnl, prBssInfo->eBand);
  1350. nicSwitchChannel(prAdapter, prBssInfo->eBand, prBssInfo->ucChnl, 10);
  1351. } /* end of joinAdoptParametersFromCurrentBss() */
  1352. /*----------------------------------------------------------------------------*/
  1353. /*!
  1354. * \brief This function will update all the SW variables and HW MCR registers after
  1355. * the association with target BSS.
  1356. *
  1357. * \param[in] prAdapter Pointer to the Adapter structure.
  1358. *
  1359. * \return (none)
  1360. */
  1361. /*----------------------------------------------------------------------------*/
  1362. VOID joinComplete(IN P_ADAPTER_T prAdapter)
  1363. {
  1364. P_JOIN_INFO_T prJoinInfo;
  1365. P_BSS_DESC_T prBssDesc;
  1366. P_PEER_BSS_INFO_T prPeerBssInfo;
  1367. P_BSS_INFO_T prBssInfo;
  1368. P_CONNECTION_SETTINGS_T prConnSettings;
  1369. P_STA_RECORD_T prStaRec;
  1370. P_TX_CTRL_T prTxCtrl;
  1371. #if CFG_SUPPORT_802_11D
  1372. P_IE_COUNTRY_T prIECountry;
  1373. #endif
  1374. DEBUGFUNC("joinComplete");
  1375. ASSERT(prAdapter);
  1376. prJoinInfo = &prAdapter->rJoinInfo;
  1377. prBssDesc = prJoinInfo->prBssDesc;
  1378. prPeerBssInfo = &prAdapter->rPeerBssInfo;
  1379. prBssInfo = &prAdapter->rBssInfo;
  1380. prConnSettings = &prAdapter->rConnSettings;
  1381. prTxCtrl = &prAdapter->rTxCtrl;
  1382. /* 4 <1> Update Connecting & Connected Flag of BSS_DESC_T. */
  1383. /* Remove previous AP's Connection Flags if have */
  1384. scanRemoveConnectionFlagOfBssDescByBssid(prAdapter, prBssInfo->aucBSSID);
  1385. prBssDesc->fgIsConnected = TRUE; /* Mask as Connected */
  1386. if (prBssDesc->fgIsHiddenSSID) {
  1387. /* NOTE(Kevin): This is for the case of Passive Scan and the target BSS didn't
  1388. * broadcast SSID on its Beacon Frame.
  1389. */
  1390. COPY_SSID(prBssDesc->aucSSID,
  1391. prBssDesc->ucSSIDLen, prAdapter->rConnSettings.aucSSID, prAdapter->rConnSettings.ucSSIDLen);
  1392. if (prBssDesc->ucSSIDLen)
  1393. prBssDesc->fgIsHiddenSSID = FALSE;
  1394. #if DBG
  1395. else
  1396. ASSERT(0);
  1397. #endif /* DBG */
  1398. DBGLOG(JOIN, INFO, "Hidden SSID! - Update SSID : %s\n", prBssDesc->aucSSID);
  1399. }
  1400. /* 4 <2> Update BSS_INFO_T from BSS_DESC_T */
  1401. /* 4 <2.A> PHY Type */
  1402. prBssInfo->ePhyType = prBssDesc->ePhyType;
  1403. /* 4 <2.B> BSS Type */
  1404. prBssInfo->eBSSType = BSS_TYPE_INFRASTRUCTURE;
  1405. /* 4 <2.C> BSSID */
  1406. COPY_MAC_ADDR(prBssInfo->aucBSSID, prBssDesc->aucBSSID);
  1407. DBGLOG(JOIN, INFO, "JOIN to BSSID: [" MACSTR "]\n", MAC2STR(prBssDesc->aucBSSID));
  1408. /* 4 <2.D> SSID */
  1409. COPY_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen, prBssDesc->aucSSID, prBssDesc->ucSSIDLen);
  1410. /* 4 <2.E> Channel / Band information. */
  1411. prBssInfo->eBand = prBssDesc->eBand;
  1412. prBssInfo->ucChnl = prBssDesc->ucChannelNum;
  1413. /* 4 <2.F> RSN/WPA information. */
  1414. secFsmRunEventStart(prAdapter);
  1415. prBssInfo->u4RsnSelectedPairwiseCipher = prBssDesc->u4RsnSelectedPairwiseCipher;
  1416. prBssInfo->u4RsnSelectedGroupCipher = prBssDesc->u4RsnSelectedGroupCipher;
  1417. prBssInfo->u4RsnSelectedAKMSuite = prBssDesc->u4RsnSelectedAKMSuite;
  1418. if (secRsnKeyHandshakeEnabled())
  1419. prBssInfo->fgIsWPAorWPA2Enabled = TRUE;
  1420. else
  1421. prBssInfo->fgIsWPAorWPA2Enabled = FALSE;
  1422. /* 4 <2.G> Beacon interval. */
  1423. prBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
  1424. /* 4 <2.H> DTIM period. */
  1425. prBssInfo->ucDtimPeriod = prBssDesc->ucDTIMPeriod;
  1426. /* 4 <2.I> ERP Information */
  1427. if ((prBssInfo->ePhyType == PHY_TYPE_ERP_INDEX) && /* Our BSS's PHY_TYPE is ERP now. */
  1428. (prBssDesc->fgIsERPPresent)) {
  1429. prBssInfo->fgIsERPPresent = TRUE;
  1430. prBssInfo->ucERP = prBssDesc->ucERP; /* Save the ERP for later check */
  1431. } else { /* Some AP, may send ProbeResp without ERP IE. Thus prBssDesc->fgIsERPPresent is FALSE. */
  1432. prBssInfo->fgIsERPPresent = FALSE;
  1433. prBssInfo->ucERP = 0;
  1434. }
  1435. #if CFG_SUPPORT_802_11D
  1436. /* 4 <2.J> Country inforamtion of the associated AP */
  1437. if (prConnSettings->fgMultiDomainCapabilityEnabled) {
  1438. DOMAIN_INFO_ENTRY rDomainInfo;
  1439. if (domainGetDomainInfoByScanResult(prAdapter, &rDomainInfo)) {
  1440. if (prBssDesc->prIECountry) {
  1441. prIECountry = prBssDesc->prIECountry;
  1442. domainParseCountryInfoElem(prIECountry, &prBssInfo->rDomainInfo);
  1443. /* use the domain get from the BSS info */
  1444. prBssInfo->fgIsCountryInfoPresent = TRUE;
  1445. nicSetupOpChnlList(prAdapter, prBssInfo->rDomainInfo.u2CountryCode, FALSE);
  1446. } else {
  1447. /* use the domain get from the scan result */
  1448. prBssInfo->fgIsCountryInfoPresent = TRUE;
  1449. nicSetupOpChnlList(prAdapter, rDomainInfo.u2CountryCode, FALSE);
  1450. }
  1451. }
  1452. }
  1453. #endif
  1454. /* 4 <2.K> Signal Power of the associated AP */
  1455. prBssInfo->rRcpi = prBssDesc->rRcpi;
  1456. prBssInfo->rRssi = RCPI_TO_dBm(prBssInfo->rRcpi);
  1457. GET_CURRENT_SYSTIME(&prBssInfo->rRssiLastUpdateTime);
  1458. /* 4 <2.L> Capability Field of the associated AP */
  1459. prBssInfo->u2CapInfo = prBssDesc->u2CapInfo;
  1460. DBGLOG(JOIN, INFO,
  1461. "prBssInfo-> fgIsERPPresent = %d, ucERP = %02x, rRcpi = %d, rRssi = %ld\n",
  1462. prBssInfo->fgIsERPPresent, prBssInfo->ucERP, prBssInfo->rRcpi, prBssInfo->rRssi);
  1463. /* 4 <3> Update BSS_INFO_T from PEER_BSS_INFO_T & NIC RATE FUNC */
  1464. /* 4 <3.A> Association ID */
  1465. prBssInfo->u2AssocId = prPeerBssInfo->u2AssocId;
  1466. /* 4 <3.B> WMM Information */
  1467. if (prAdapter->fgIsEnableWMM && (prPeerBssInfo->rWmmInfo.ucWmmFlag & WMM_FLAG_SUPPORT_WMM)) {
  1468. prBssInfo->fgIsWmmAssoc = TRUE;
  1469. prTxCtrl->rTxQForVoipAccess = TXQ_AC3;
  1470. qosWmmInfoInit(&prBssInfo->rWmmInfo, (prBssInfo->ePhyType == PHY_TYPE_HR_DSSS_INDEX) ? TRUE : FALSE);
  1471. if (prPeerBssInfo->rWmmInfo.ucWmmFlag & WMM_FLAG_AC_PARAM_PRESENT) {
  1472. kalMemCopy(&prBssInfo->rWmmInfo, &prPeerBssInfo->rWmmInfo, sizeof(WMM_INFO_T));
  1473. } else {
  1474. kalMemCopy(&prBssInfo->rWmmInfo,
  1475. &prPeerBssInfo->rWmmInfo,
  1476. sizeof(WMM_INFO_T) - sizeof(prPeerBssInfo->rWmmInfo.arWmmAcParams));
  1477. }
  1478. } else {
  1479. prBssInfo->fgIsWmmAssoc = FALSE;
  1480. prTxCtrl->rTxQForVoipAccess = TXQ_AC1;
  1481. kalMemZero(&prBssInfo->rWmmInfo, sizeof(WMM_INFO_T));
  1482. }
  1483. /* 4 <3.C> Operational Rate Set & BSS Basic Rate Set */
  1484. prBssInfo->u2OperationalRateSet = prPeerBssInfo->u2OperationalRateSet;
  1485. prBssInfo->u2BSSBasicRateSet = prPeerBssInfo->u2BSSBasicRateSet;
  1486. /* 4 <3.D> Short Preamble */
  1487. if (prBssInfo->fgIsERPPresent) {
  1488. /* NOTE(Kevin 2007/12/24): Truth Table.
  1489. * Short Preamble Bit in
  1490. * <AssocReq> <AssocResp w/i ERP> <BARKER(Long)> Final Driver Setting(Short)
  1491. * TRUE FALSE FALSE FALSE(shouldn't have such case, use the AssocResp)
  1492. * TRUE FALSE TRUE FALSE
  1493. * FALSE FALSE FALSE FALSE(shouldn't have such case, use the AssocResp)
  1494. * FALSE FALSE TRUE FALSE
  1495. * TRUE TRUE FALSE TRUE(follow ERP)
  1496. * TRUE TRUE TRUE FALSE(follow ERP)
  1497. * FALSE TRUE FALSE FALSE(shouldn't have such case, and we should set to FALSE)
  1498. * FALSE TRUE TRUE FALSE(we should set to FALSE)
  1499. */
  1500. if ((prPeerBssInfo->fgIsShortPreambleAllowed) &&
  1501. ((prConnSettings->ePreambleType == PREAMBLE_TYPE_SHORT) ||/* Short Preamble Option Enable is TRUE */
  1502. ((prConnSettings->ePreambleType == PREAMBLE_TYPE_AUTO) &&
  1503. (prBssDesc->u2CapInfo & CAP_INFO_SHORT_PREAMBLE)))) {
  1504. prBssInfo->fgIsShortPreambleAllowed = TRUE;
  1505. if (prBssInfo->ucERP & ERP_INFO_BARKER_PREAMBLE_MODE)
  1506. prBssInfo->fgUseShortPreamble = FALSE;
  1507. else
  1508. prBssInfo->fgUseShortPreamble = TRUE;
  1509. } else {
  1510. prBssInfo->fgIsShortPreambleAllowed = FALSE;
  1511. prBssInfo->fgUseShortPreamble = FALSE;
  1512. }
  1513. } else {
  1514. /* NOTE(Kevin 2007/12/24): Truth Table.
  1515. * Short Preamble Bit in
  1516. * <AssocReq> <AssocResp w/o ERP> Final Driver Setting(Short)
  1517. * TRUE FALSE FALSE
  1518. * FALSE FALSE FALSE
  1519. * TRUE TRUE TRUE
  1520. * FALSE TRUE(status success) TRUE
  1521. * --> Honor the result of prPeerBssInfo.
  1522. */
  1523. prBssInfo->fgIsShortPreambleAllowed = prBssInfo->fgUseShortPreamble =
  1524. prPeerBssInfo->fgIsShortPreambleAllowed;
  1525. }
  1526. DBGLOG(JOIN, INFO,
  1527. "prBssInfo->fgIsShortPreambleAllowed = %d, prBssInfo->fgUseShortPreamble = %d\n",
  1528. prBssInfo->fgIsShortPreambleAllowed, prBssInfo->fgUseShortPreamble);
  1529. /* 4 <3.E> Short Slot Time */
  1530. prBssInfo->fgUseShortSlotTime = prPeerBssInfo->fgUseShortSlotTime; /* AP support Short Slot Time */
  1531. DBGLOG(JOIN, INFO, "prBssInfo->fgUseShortSlotTime = %d\n", prBssInfo->fgUseShortSlotTime);
  1532. nicSetSlotTime(prAdapter,
  1533. prBssInfo->ePhyType,
  1534. ((prConnSettings->fgIsShortSlotTimeOptionEnable &&
  1535. prBssInfo->fgUseShortSlotTime) ? TRUE : FALSE));
  1536. /* 4 <3.F> Update Tx Rate for Control Frame */
  1537. bssUpdateTxRateForControlFrame(prAdapter);
  1538. /* 4 <3.G> Save the available Auth Types during Roaming (Design for Fast BSS Transition). */
  1539. /* if (prAdapter->fgIsEnableRoaming) *//* NOTE(Kevin): Always prepare info for roaming */
  1540. {
  1541. if (prJoinInfo->ucCurrAuthAlgNum == AUTH_ALGORITHM_NUM_OPEN_SYSTEM)
  1542. prJoinInfo->ucRoamingAuthTypes |= AUTH_TYPE_OPEN_SYSTEM;
  1543. else if (prJoinInfo->ucCurrAuthAlgNum == AUTH_ALGORITHM_NUM_SHARED_KEY)
  1544. prJoinInfo->ucRoamingAuthTypes |= AUTH_TYPE_SHARED_KEY;
  1545. prBssInfo->ucRoamingAuthTypes = prJoinInfo->ucRoamingAuthTypes;
  1546. /* Set the stable time of the associated BSS. We won't do roaming decision
  1547. * during the stable time.
  1548. */
  1549. SET_EXPIRATION_TIME(prBssInfo->rRoamingStableExpirationTime,
  1550. SEC_TO_SYSTIME(ROAMING_STABLE_TIMEOUT_SEC));
  1551. }
  1552. /* 4 <3.H> Update Parameter for TX Fragmentation Threshold */
  1553. #if CFG_TX_FRAGMENT
  1554. txFragInfoUpdate(prAdapter);
  1555. #endif /* CFG_TX_FRAGMENT */
  1556. /* 4 <4> Update STA_RECORD_T */
  1557. /* Get a Station Record if possible */
  1558. prStaRec = staRecGetStaRecordByAddr(prAdapter, prBssDesc->aucBSSID);
  1559. if (prStaRec) {
  1560. UINT_16 u2OperationalRateSet, u2DesiredRateSet;
  1561. /* 4 <4.A> Desired Rate Set */
  1562. u2OperationalRateSet = (rPhyAttributes[prBssInfo->ePhyType].u2SupportedRateSet &
  1563. prBssInfo->u2OperationalRateSet);
  1564. u2DesiredRateSet = (u2OperationalRateSet & prConnSettings->u2DesiredRateSet);
  1565. if (u2DesiredRateSet) {
  1566. prStaRec->u2DesiredRateSet = u2DesiredRateSet;
  1567. } else {
  1568. /* For Error Handling - The Desired Rate Set is not covered in Operational Rate Set. */
  1569. prStaRec->u2DesiredRateSet = u2OperationalRateSet;
  1570. }
  1571. /* Try to set the best initial rate for this entry */
  1572. if (!rateGetBestInitialRateIndex(prStaRec->u2DesiredRateSet,
  1573. prStaRec->rRcpi, &prStaRec->ucCurrRate1Index)) {
  1574. if (!rateGetLowestRateIndexFromRateSet(prStaRec->u2DesiredRateSet, &prStaRec->ucCurrRate1Index))
  1575. ASSERT(0);
  1576. }
  1577. DBGLOG(JOIN, INFO, "prStaRec->ucCurrRate1Index = %d\n", prStaRec->ucCurrRate1Index);
  1578. /* 4 <4.B> Preamble Mode */
  1579. prStaRec->fgIsShortPreambleOptionEnable = prBssInfo->fgUseShortPreamble;
  1580. /* 4 <4.C> QoS Flag */
  1581. prStaRec->fgIsQoS = prBssInfo->fgIsWmmAssoc;
  1582. }
  1583. #if DBG
  1584. else
  1585. ASSERT(0);
  1586. #endif /* DBG */
  1587. /* 4 <5> Update NIC */
  1588. /* 4 <5.A> Update BSSID & Operation Mode */
  1589. nicSetupBSS(prAdapter, prBssInfo);
  1590. /* 4 <5.B> Update WLAN Table. */
  1591. if (nicSetHwBySta(prAdapter, prStaRec) == FALSE)
  1592. ASSERT(FALSE);
  1593. /* 4 <5.C> Update Desired Rate Set for BT. */
  1594. #if CFG_TX_FRAGMENT
  1595. if (prConnSettings->fgIsEnableTxAutoFragmentForBT)
  1596. txRateSetInitForBT(prAdapter, prStaRec);
  1597. #endif /* CFG_TX_FRAGMENT */
  1598. /* 4 <5.D> TX AC Parameter and TX/RX Queue Control */
  1599. if (prBssInfo->fgIsWmmAssoc) {
  1600. #if CFG_TX_AGGREGATE_HW_FIFO
  1601. nicTxAggregateTXQ(prAdapter, FALSE);
  1602. #endif /* CFG_TX_AGGREGATE_HW_FIFO */
  1603. qosUpdateWMMParametersAndAssignAllowedACI(prAdapter, &prBssInfo->rWmmInfo);
  1604. } else {
  1605. #if CFG_TX_AGGREGATE_HW_FIFO
  1606. nicTxAggregateTXQ(prAdapter, TRUE);
  1607. #endif /* CFG_TX_AGGREGATE_HW_FIFO */
  1608. nicTxNonQoSAssignDefaultAdmittedTXQ(prAdapter);
  1609. nicTxNonQoSUpdateTXQParameters(prAdapter, prBssInfo->ePhyType);
  1610. }
  1611. #if CFG_TX_STOP_WRITE_TX_FIFO_UNTIL_JOIN
  1612. {
  1613. prTxCtrl->fgBlockTxDuringJoin = FALSE;
  1614. #if !CFG_TX_AGGREGATE_HW_FIFO /* TX FIFO AGGREGATE already do flush once */
  1615. nicTxFlushStopQueues(prAdapter, (UINT_8) TXQ_DATA_MASK, (UINT_8) NULL);
  1616. #endif /* CFG_TX_AGGREGATE_HW_FIFO */
  1617. nicTxRetransmitOfSendWaitQue(prAdapter);
  1618. if (prTxCtrl->fgIsPacketInOsSendQueue)
  1619. nicTxRetransmitOfOsSendQue(prAdapter);
  1620. #if CFG_SDIO_TX_ENHANCE
  1621. halTxLeftClusteredMpdu(prAdapter);
  1622. #endif /* CFG_SDIO_TX_ENHANCE */
  1623. }
  1624. #endif /* CFG_TX_STOP_WRITE_TX_FIFO_UNTIL_JOIN */
  1625. /* 4 <6> Setup CONNECTION flag. */
  1626. prAdapter->eConnectionState = MEDIA_STATE_CONNECTED;
  1627. prAdapter->eConnectionStateIndicated = MEDIA_STATE_CONNECTED;
  1628. if (prJoinInfo->fgIsReAssoc)
  1629. prAdapter->fgBypassPortCtrlForRoaming = TRUE;
  1630. else
  1631. prAdapter->fgBypassPortCtrlForRoaming = FALSE;
  1632. kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_MEDIA_CONNECT, (PVOID) NULL, 0);
  1633. } /* end of joinComplete() */
  1634. #endif