ais_fsm.c 166 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109
  1. /*
  2. ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/ais_fsm.c#4
  3. */
  4. /*! \file "aa_fsm.c"
  5. \brief This file defines the FSM for SAA and AAA MODULE.
  6. This file defines the FSM for SAA and AAA MODULE.
  7. */
  8. /*
  9. ** Log: ais_fsm.c
  10. **
  11. ** 08 20 2013 cp.wu
  12. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  13. ** add option to support passive scan for AIS network, default off
  14. **
  15. ** 08 16 2013 cp.wu
  16. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  17. ** for passive scan, specify SSID num as zero
  18. **
  19. ** 08 12 2013 cp.wu
  20. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  21. ** use separate SSID container for roaming scan requests
  22. **
  23. ** 08 12 2013 cp.wu
  24. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  25. ** support passive scan via cfg80211_ops.scan() callback
  26. **
  27. ** 08 09 2013 cp.wu
  28. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  29. ** 1. integrate scheduled scan functionality
  30. ** 2. condition compilation for linux-3.4 & linux-3.8 compatibility
  31. ** 3. correct CMD queue access to reduce lock scope
  32. **
  33. ** 08 05 2013 terry.wu
  34. ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
  35. ** 1. Add SW rate definition
  36. ** 2. Add HW default rate selection logic from FW
  37. **
  38. ** 07 31 2013 terry.wu
  39. ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
  40. ** 1. Fix NetDev binding issue
  41. **
  42. ** 07 31 2013 yuche.tsai
  43. ** [BORA00002398] [MT6630][Volunteer Patch] P2P Driver Re-Design for Multiple BSS support
  44. ** Change private data of net device.
  45. **
  46. ** 07 29 2013 cp.wu
  47. ** [BORA00002725] [MT6630][Wi-Fi] Add MGMT TX/RX support for Linux port
  48. ** Preparation for porting remain_on_channel support
  49. **
  50. ** 07 26 2013 terry.wu
  51. ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
  52. ** 1. Reduce extra Tx frame header parsing
  53. ** 2. Add TX port control
  54. ** 3. Add net interface to BSS binding
  55. **
  56. ** 07 23 2013 wh.su
  57. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  58. ** Sync the latest jb2.mp 11w code as draft version
  59. ** Not the CM bit for avoid wapi 1x drop at re-key
  60. **
  61. ** 07 12 2013 terry.wu
  62. ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
  63. ** 1. Add 11ac to AIS desired PHY config
  64. ** 2. Extend PHY type set to 11ac/11anac/11abgnac
  65. **
  66. ** 07 12 2013 terry.wu
  67. ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
  68. ** 1. Update VHT IE composing function
  69. ** 2. disable bow
  70. ** 3. Exchange bss/sta rec update sequence for temp solution
  71. **
  72. ** 07 02 2013 wh.su
  73. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  74. ** Refine security BMC wlan index assign
  75. ** Fix some compiling warning
  76. **
  77. ** 06 25 2013 terry.wu
  78. ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
  79. ** Update for 1st connection
  80. **
  81. ** 06 19 2013 cp.wu
  82. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  83. ** update MAC address handling logic
  84. **
  85. ** 04 30 2013 eason.tsai
  86. ** [BORA00002255] [MT6630 Wi-Fi][Driver] develop
  87. ** update 11ac channel setting
  88. **
  89. ** 03 29 2013 wh.su
  90. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  91. ** Do more sta record free mechanism check
  92. ** remove non-used code
  93. **
  94. ** 03 14 2013 wh.su
  95. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  96. ** .modify some code define and flow
  97. **
  98. ** 03 12 2013 wh.su
  99. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  100. ** .
  101. **
  102. ** 03 08 2013 wh.su
  103. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  104. ** Remove non-used compiling flag and code
  105. **
  106. ** 02 18 2013 cm.chang
  107. ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
  108. ** New feature to remove all sta records by BssIndex
  109. **
  110. ** 02 18 2013 cp.wu
  111. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  112. ** modify bssClearClientList() to bssInitializeClientList()
  113. **
  114. ** 02 07 2013 cp.wu
  115. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  116. ** add join timeout check for retrying
  117. **
  118. ** 02 06 2013 cp.wu
  119. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  120. ** change BSS-INFO/STA-REC update sequence:
  121. ** always update STA-REC then BSS-INFO
  122. **
  123. ** 01 23 2013 cp.wu
  124. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  125. ** modify AIS behavior: stop join trial if failed
  126. **
  127. ** 01 22 2013 cp.wu
  128. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  129. ** modification for ucBssIndex migration
  130. **
  131. ** 01 21 2013 cm.chang
  132. ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
  133. ** 1. Create rP2pDevInfo structure
  134. ** 2. Support 80/160 MHz channel bandwidth for channel privilege
  135. **
  136. ** 01 17 2013 cm.chang
  137. ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
  138. ** Use ucBssIndex to replace eNetworkTypeIndex
  139. **
  140. ** 01 03 2013 cp.wu
  141. ** [BORA00002253] [MT6630 Wi-Fi][Driver][Firmware] Add NLO and timeout mechanism to SCN module
  142. ** carry timeout value and channel dwell time value to scan module
  143. **
  144. ** 10 31 2012 cp.wu
  145. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  146. ** code sync..
  147. **
  148. ** 09 17 2012 cm.chang
  149. ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
  150. ** Duplicate source from MT6620 v2.3 driver branch
  151. ** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base)
  152. **
  153. ** 08 24 2012 cp.wu
  154. ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
  155. ** .
  156. **
  157. ** 08 24 2012 cp.wu
  158. ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
  159. ** cfg80211 support merge back from ALPS.JB to DaVinci - MT6620 Driver v2.3 branch.
  160. **
  161. ** 08 07 2012 cp.wu
  162. ** [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android,
  163. ** indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
  164. ** remove unnecessary driver workaround for WEP key change detection - it should be done by framework instead
  165. *
  166. * 04 20 2012 cp.wu
  167. * [WCXRP00000913] [MT6620 Wi-Fi] create repository of source code dedicated for MT6620 E6 ASIC
  168. * correct macro
  169. *
  170. * 01 16 2012 cp.wu
  171. * [MT6620 Wi-Fi][Driver] API and behavior modification for preferred band configuration
  172. * with corresponding network configuration
  173. * add wlanSetPreferBandByNetwork() for glue layer to invoke for setting preferred band configuration
  174. * corresponding to network type.
  175. *
  176. * 11 24 2011 wh.su
  177. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  178. * Adjust code for DBG and CONFIG_XLOG.
  179. *
  180. * 11 22 2011 cp.wu
  181. * [WCXRP00001120] [MT6620 Wi-Fi][Driver] Modify roaming to AIS state transition from synchronous to asynchronous
  182. * approach to avoid incomplete state termination
  183. * 1. change RDD related compile option brace position.
  184. * 2. when roaming is triggered, ask AIS to transit immediately only when AIS is in Normal TR state without
  185. * join timeout timer ticking
  186. * 3. otherwise, insert AIS_REQUEST into pending request queue
  187. *
  188. * 11 11 2011 wh.su
  189. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  190. * modify the xlog related code.
  191. *
  192. * 11 04 2011 cp.wu
  193. * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for
  194. * REASSOCIATED cases as an explicit trigger for Android framework
  195. * correct reference to BSSID field in Association-Response frame.
  196. *
  197. * 11 04 2011 cp.wu
  198. * [WCXRP00001086] [MT6620 Wi-Fi][Driver]
  199. * 1. for DEAUTH/DISASSOC cases, indicate for DISCONNECTION immediately.
  200. * 2. (Android only)
  201. *
  202. * 11 02 2011 wh.su
  203. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  204. * adding the code for XLOG.
  205. *
  206. * 10 26 2011 tsaiyuan.hsu
  207. * [WCXRP00001064] [MT6620 Wi-Fi][DRV]] add code with roaming awareness when disconnecting AIS network
  208. * be aware roaming when disconnecting AIS network.
  209. *
  210. * 10 25 2011 cm.chang
  211. * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
  212. * STA_REC shall be NULL for Beacon's MSDU
  213. *
  214. * 10 13 2011 cp.wu
  215. * [MT6620 Wi-Fi][Driver] Reduce join failure count limit to 2 for faster re-join for other BSS
  216. * 1. short join failure count limit to 2
  217. * 2. treat join timeout as kind of join failure as well
  218. *
  219. * 10 12 2011 wh.su
  220. * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
  221. * adding the 802.11w related function and define .
  222. *
  223. * 09 30 2011 cm.chang
  224. * [WCXRP00001020] [MT6620 Wi-Fi][Driver] Handle secondary channel offset of AP in 5GHz band
  225. * .
  226. *
  227. * 09 20 2011 tsaiyuan.hsu
  228. * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
  229. * change window registry of driver for roaming.
  230. *
  231. * 09 20 2011 cm.chang
  232. * [WCXRP00000997] [MT6620 Wi-Fi][Driver][FW] Handle change of BSS preamble type and slot time
  233. * Handle client mode about preamble type and slot time
  234. *
  235. * 09 08 2011 tsaiyuan.hsu
  236. * [WCXRP00000972] [MT6620 Wi-Fi][DRV]] check if roaming occurs after join failure to avoid state incosistence.
  237. * check if roaming occurs after join failure to avoid deactivation of network.
  238. *
  239. * 08 24 2011 chinghwa.yu
  240. * [WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
  241. * Update RDD test mode cases.
  242. *
  243. * 08 16 2011 tsaiyuan.hsu
  244. * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
  245. * EnableRoaming in registry is deprecated.
  246. *
  247. * 08 16 2011 tsaiyuan.hsu
  248. * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
  249. * use registry to enable or disable roaming.
  250. *
  251. * 07 07 2011 cp.wu
  252. * [WCXRP00000840] [MT6620 Wi-Fi][Driver][AIS]
  253. * stop timer when joining operation is failed due to try count exceeds limitation
  254. *
  255. * 06 28 2011 cp.wu
  256. * [WCXRP00000815] [MT6620 Wi-Fi][Driver]
  257. * do not handle SCAN request immediately after connected to increase the probability of receiving 1st beacon frame.
  258. *
  259. * 06 23 2011 cp.wu
  260. * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
  261. * change parameter name from PeerAddr to BSSID
  262. *
  263. * 06 20 2011 cp.wu
  264. * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
  265. * 1. specify target's BSSID when requesting channel privilege.
  266. * 2. pass BSSID information to firmware domain
  267. *
  268. * 06 16 2011 cp.wu
  269. * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
  270. * ensure DEAUTH is always sent before establish a new connection
  271. *
  272. * 06 16 2011 cp.wu
  273. * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
  274. * typo fix: a right brace is missed.
  275. *
  276. * 06 16 2011 cp.wu
  277. * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
  278. * When RECONNECT request is identified as disconnected, it is necessary to check for pending scan request.
  279. *
  280. * 06 16 2011 cp.wu
  281. * [WCXRP00000757] [MT6620 Wi-Fi][Driver][SCN] take use of RLM API to filter out BSS in disallowed channels
  282. * mark fgIsTransition as TRUE for state rolling.
  283. *
  284. * 06 16 2011 cp.wu
  285. * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
  286. * always check for pending scan after switched into NORMAL_TR state.
  287. *
  288. * 06 14 2011 cp.wu
  289. * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
  290. * always treat connection request at higher priority over scanning request
  291. *
  292. * 06 09 2011 tsaiyuan.hsu
  293. * [WCXRP00000760] [MT5931 Wi-Fi][FW] Refine rxmHandleMacRxDone to reduce code size
  294. * move send_auth at rxmHandleMacRxDone in firmware to driver to reduce code size.
  295. *
  296. * 06 02 2011 cp.wu
  297. * [WCXRP00000681] [MT5931][Firmware] HIF code size reduction
  298. * eliminate unused parameters for SAA-FSM
  299. *
  300. * 05 18 2011 cp.wu
  301. * [WCXRP00000732] [MT6620 Wi-Fi][AIS]
  302. * change SCAN handling behavior when followed by a CONNECT/DISCONNECT requests by pending instead of dropping.
  303. *
  304. * 05 17 2011 cp.wu
  305. * [WCXRP00000732] [MT6620 Wi-Fi][AIS]
  306. * when TX DONE status is TX_RESULT_DROPPED_IN_DRIVER, no need to switch back to IDLE state.
  307. *
  308. * 04 14 2011 cm.chang
  309. * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
  310. * .
  311. *
  312. * 04 13 2011 george.huang
  313. * [WCXRP00000628] [MT6620 Wi-Fi][FW][Driver] Modify U-APSD setting to default OFF
  314. * remove assert
  315. *
  316. * 03 18 2011 cp.wu
  317. * [WCXRP00000575] [MT6620 Wi-Fi][Driver][AIS] reduce memory usage when generating mailbox message for scan request
  318. * when there is no IE needed for probe request, then request a smaller memory for mailbox message
  319. *
  320. * 03 17 2011 chinglan.wang
  321. * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
  322. * .
  323. *
  324. * 03 17 2011 chinglan.wang
  325. * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
  326. * .
  327. *
  328. * 03 16 2011 tsaiyuan.hsu
  329. * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
  330. * remove obsolete definition and unused variables.
  331. *
  332. * 03 11 2011 cp.wu
  333. * [WCXRP00000535] [MT6620 Wi-Fi][Driver] Fixed channel operation when AIS and Tethering are operating concurrently
  334. * When fixed channel operation is necessary, AIS-FSM would scan and only connect for BSS on the specific channel
  335. *
  336. * 03 09 2011 tsaiyuan.hsu
  337. * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
  338. * avoid clearing fgIsScanReqIssued so as to add scan results.
  339. *
  340. * 03 07 2011 terry.wu
  341. * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
  342. * Toggle non-standard debug messages to comments.
  343. *
  344. * 03 04 2011 tsaiyuan.hsu
  345. * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
  346. * reset retry conter of attemp to connect to ap after completion of join.
  347. *
  348. * 03 04 2011 cp.wu
  349. * [WCXRP00000515] [MT6620 Wi-Fi][Driver] Surpress compiler warning which is identified by GNU compiler collection
  350. * surpress compile warning occurred when compiled by GNU compiler collection.
  351. *
  352. * 03 02 2011 cp.wu
  353. * [WCXRP00000503] [MT6620 Wi-Fi][Driver]
  354. * use RCPI brought by ASSOC-RESP after connection is built as initial RCPI to avoid using a uninitialized MAC-RX RCPI.
  355. *
  356. * 02 26 2011 tsaiyuan.hsu
  357. * [WCXRP00000391] [MT6620 Wi-Fi][FW] Add Roaming Support
  358. * not send disassoc or deauth to leaving AP so as to improve performace of roaming.
  359. *
  360. * 02 23 2011 cp.wu
  361. * [WCXRP00000487] [MT6620 Wi-Fi][Driver][AIS]
  362. * when handling reconnect request, set fgTryScan as TRUE
  363. *
  364. * 02 22 2011 cp.wu
  365. * [WCXRP00000487] [MT6620 Wi-Fi][Driver][AIS]
  366. * handle SCAN and RECONNECT with a FIFO approach.
  367. *
  368. * 02 09 2011 tsaiyuan.hsu
  369. * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
  370. * Check if prRegInfo is null or not before initializing roaming parameters.
  371. *
  372. * 02 01 2011 cp.wu
  373. * [WCXRP00000416] [MT6620 Wi-Fi][Driver]
  374. * treat "unable to find BSS" as connection trial to prevent infinite reconnection trials.
  375. *
  376. * 01 27 2011 tsaiyuan.hsu
  377. * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
  378. * add roaming fsm
  379. * 1. not support 11r, only use strength of signal to determine roaming.
  380. * 2. not enable CFG_SUPPORT_ROAMING until completion of full test.
  381. * 3. in 6620, adopt work-around to avoid sign extension problem of cck of hw
  382. * 4. assume that change of link quality in smooth way.
  383. *
  384. * 01 26 2011 yuche.tsai
  385. * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
  386. * .
  387. *
  388. * 01 25 2011 yuche.tsai
  389. * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
  390. * Fix Compile Error when DBG is disabled.
  391. *
  392. * 01 25 2011 yuche.tsai
  393. * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
  394. * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
  395. *
  396. * 01 14 2011 cp.wu
  397. * [WCXRP00000359] [MT6620 Wi-Fi][Driver] add an extra state to ensure DEAUTH frame is always sent
  398. * Add an extra state to guarantee DEAUTH frame is sent then connect to new BSS.
  399. * This change is due to WAPI AP needs DEAUTH frame as a necessary step in handshaking protocol.
  400. *
  401. * 01 11 2011 cp.wu
  402. * [WCXRP00000307] [MT6620 Wi-Fi][SQA]WHQL test .2c_wlan_adhoc case fail.
  403. * [IBSS] when merged in, the bss state should be updated to firmware to pass WHQL adhoc failed item
  404. *
  405. * 01 10 2011 cp.wu
  406. * [WCXRP00000351] [MT6620 Wi-Fi][Driver]
  407. * remove from scanning result when the BSS is disconnected due to beacon timeout.
  408. *
  409. * 01 03 2011 cp.wu
  410. * [WCXRP00000337] [MT6620 Wi-FI][Driver]
  411. * do not invoke cnmStaRecResetStatus() directly, nicUpdateBss will do the things after bss is disconnected
  412. *
  413. * 12 30 2010 cp.wu
  414. * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
  415. *
  416. *
  417. * 12 27 2010 cp.wu
  418. * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
  419. * add DEBUGFUNC() macro invoking for more detailed debugging information
  420. *
  421. * 12 23 2010 george.huang
  422. * [WCXRP00000152] [MT6620 Wi-Fi] AP mode power saving function
  423. * 1. update WMM IE parsing, with ASSOC REQ handling
  424. * 2. extend U-APSD parameter passing from driver to FW
  425. *
  426. * 12 17 2010 cp.wu
  427. * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
  428. * before BSS disconnection is indicated to firmware, all correlated peer should be cleared and freed
  429. *
  430. * 12 07 2010 cm.chang
  431. * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
  432. * 1. BSSINFO include RLM parameter
  433. * 2. free all sta records when network is disconnected
  434. *
  435. * 11 25 2010 yuche.tsai
  436. * NULL
  437. * Update SLT Function for QoS Support and not be affected by fixed rate function.
  438. *
  439. * 11 25 2010 cp.wu
  440. * [WCXRP00000208] [MT6620 Wi-Fi][Driver] Add scanning with specified SSID to AIS FSM
  441. * add scanning with specified SSID facility to AIS-FSM
  442. *
  443. * 11 01 2010 cp.wu
  444. * [WCXRP00000056] [MT6620 Wi-Fi][Driver]
  445. * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
  446. * 2) Remove CNM CH-RECOVER event handling
  447. * 3) cfg read/write API renamed with kal prefix for unified naming rules.
  448. *
  449. * 10 26 2010 cp.wu
  450. * [WCXRP00000056] [MT6620 Wi-Fi][Driver]
  451. * 1) update NVRAM content template to ver 1.02
  452. * 2) add compile option for querying NIC capability (default: off)
  453. * 3) modify AIS 5GHz support to run-time option, which could be turned on by registry or NVRAM setting
  454. * 4) correct auto-rate compiler error under linux (treat warning as error)
  455. * 5) simplify usage of NVRAM and REG_INFO_T
  456. * 6) add version checking between driver and firmware
  457. *
  458. * 10 14 2010 wh.su
  459. * [WCXRP00000097] [MT6620 Wi-Fi] [Driver] Fixed the P2P not setting the fgIsChannelExt value make scan not abort
  460. * initial the fgIsChannelExt value.
  461. *
  462. * 10 08 2010 cp.wu
  463. * [WCXRP00000087] [MT6620 Wi-Fi][Driver] Cannot connect to 5GHz AP, driver will cause FW assert.
  464. * correct erroneous logic: specifying eBand with incompatible eSco
  465. *
  466. * 10 04 2010 cp.wu
  467. * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW]
  468. * remove ENUM_NETWORK_TYPE_T definitions
  469. *
  470. * 09 27 2010 chinghwa.yu
  471. * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000065] Update BoW design and settings
  472. * Update BCM/BoW design and settings.
  473. *
  474. * 09 23 2010 cp.wu
  475. * [WCXRP00000049] [MT6620 Wi-Fi][Driver] Adhoc cannot be created successfully.
  476. * keep IBSS-ALONE state retrying until further instruction is received
  477. *
  478. * 09 21 2010 cp.wu
  479. * [WCXRP00000053] [MT6620 Wi-Fi][Driver]
  480. * Do a complete reset with STA-REC null checking for RF test re-entry
  481. *
  482. * 09 09 2010 yuche.tsai
  483. * NULL
  484. * Fix NULL IE Beacon issue. Sync Beacon Content to FW before enable beacon.
  485. * Both in IBSS Create & IBSS Merge
  486. *
  487. * 09 09 2010 cp.wu
  488. * NULL
  489. * frequency is in unit of KHz thus no need to divide 1000 once more.
  490. *
  491. * 09 06 2010 cp.wu
  492. * NULL
  493. * 1) initialize for correct parameter even for disassociation.
  494. * 2) AIS-FSM should have a limit on trials to build connection
  495. *
  496. * 09 03 2010 kevin.huang
  497. * NULL
  498. * Refine #include sequence and solve recursive/nested #include issue
  499. *
  500. * 08 30 2010 cp.wu
  501. * NULL
  502. * eliminate klockwork errors
  503. *
  504. * 08 29 2010 yuche.tsai
  505. * NULL
  506. * Finish SLT TX/RX & Rate Changing Support.
  507. *
  508. * 08 25 2010 cp.wu
  509. * NULL
  510. * add option for enabling AIS 5GHz scan
  511. *
  512. * 08 25 2010 cp.wu
  513. * NULL
  514. * [AIS-FSM]
  515. *
  516. * 08 25 2010 george.huang
  517. * NULL
  518. * update OID/ registry control path for PM related settings
  519. *
  520. * 08 24 2010 cm.chang
  521. * NULL
  522. * Support RLM initail channel of Ad-hoc, P2P and BOW
  523. *
  524. * 08 20 2010 cm.chang
  525. * NULL
  526. * Migrate RLM code to host from FW
  527. *
  528. * 08 12 2010 cp.wu
  529. * NULL
  530. * check-in missed files.
  531. *
  532. * 08 12 2010 kevin.huang
  533. * NULL
  534. * Refine bssProcessProbeRequest() and bssSendBeaconProbeResponse()
  535. *
  536. * 08 09 2010 cp.wu
  537. * NULL
  538. * reset fgIsScanReqIssued when abort request is received right after join completion.
  539. *
  540. * 08 03 2010 cp.wu
  541. * NULL
  542. * surpress compilation warning.
  543. *
  544. * 08 02 2010 cp.wu
  545. * NULL
  546. * comment out deprecated members in BSS_INFO, which are only used by firmware rather than driver.
  547. *
  548. * 07 30 2010 cp.wu
  549. * NULL
  550. * 1) BoW wrapper: use definitions instead of hard-coded constant for error code
  551. * 2) AIS-FSM: eliminate use of desired RF parameters, use prTargetBssDesc instead
  552. * 3) add handling for RX_PKT_DESTINATION_HOST_WITH_FORWARD for GO-broadcast frames
  553. *
  554. * 07 29 2010 cp.wu
  555. * NULL
  556. * eliminate u4FreqInKHz usage, combined into rConnections.ucAdHoc*
  557. *
  558. * 07 29 2010 cp.wu
  559. * NULL
  560. * allocate on MGMT packet for IBSS beaconing.
  561. *
  562. * 07 29 2010 cp.wu
  563. * NULL
  564. * [AIS-FSM] fix: when join failed, release channel privilege as well
  565. *
  566. * 07 28 2010 cp.wu
  567. * NULL
  568. * reuse join-abort sub-procedure to reduce code size.
  569. *
  570. * 07 28 2010 cp.wu
  571. * NULL
  572. * 1) eliminate redundant variable eOPMode in prAdapter->rWlanInfo
  573. * 2) change nicMediaStateChange() API prototype
  574. *
  575. * 07 26 2010 cp.wu
  576. *
  577. * AIS-FSM: when scan request is coming in the 1st 5 seconds of channel privilege period,
  578. * just pend it til 5-sec. period finishes
  579. *
  580. * 07 26 2010 cp.wu
  581. *
  582. * AIS-FSM FIX: return channel privilege even when the privilege is not granted yet
  583. * QM: qmGetFrameAction() won't assert when corresponding STA-REC index is not found
  584. *
  585. * 07 26 2010 cp.wu
  586. *
  587. * re-commit code logic being overwriten.
  588. *
  589. * 07 24 2010 wh.su
  590. *
  591. * .support the Wi-Fi RSN
  592. *
  593. * 07 23 2010 cp.wu
  594. *
  595. * 1) re-enable AIS-FSM beacon timeout handling.
  596. * 2) scan done API revised
  597. *
  598. * 07 23 2010 cp.wu
  599. *
  600. * 1) enable Ad-Hoc
  601. * 2) disable beacon timeout handling temporally due to unexpected beacon timeout event.
  602. *
  603. * 07 23 2010 cp.wu
  604. *
  605. * indicate scan done for linux wireless extension
  606. *
  607. * 07 23 2010 cp.wu
  608. *
  609. * add AIS-FSM handling for beacon timeout event.
  610. *
  611. * 07 22 2010 cp.wu
  612. *
  613. * 1) refine AIS-FSM indent.
  614. * 2) when entering RF Test mode, flush 802.1X frames as well
  615. * 3) when entering D3 state, flush 802.1X frames as well
  616. *
  617. * 07 21 2010 cp.wu
  618. *
  619. * separate AIS-FSM states into different cases of channel request.
  620. *
  621. * 07 21 2010 cp.wu
  622. *
  623. * 1) change BG_SCAN to ONLINE_SCAN for consistent term
  624. * 2) only clear scanning result when scan is permitted to do
  625. *
  626. * 07 20 2010 cp.wu
  627. *
  628. * 1) [AIS] when new scan is issued, clear currently available scanning result except the connected one
  629. * 2) refine disconnection behaviour when issued during BG-SCAN process
  630. *
  631. * 07 20 2010 cp.wu
  632. *
  633. * 1) bugfix: do not stop timer for join after switched into normal_tr state, for providing chance for DHCP handshasking
  634. * 2) modify rsnPerformPolicySelection() invoking
  635. *
  636. * 07 19 2010 cp.wu
  637. *
  638. * 1) init AIS_BSS_INFO as channel number = 1 with band = 2.4GHz
  639. * 2) correct typo
  640. *
  641. * 07 19 2010 wh.su
  642. *
  643. * update for security supporting.
  644. *
  645. * 07 19 2010 cp.wu
  646. *
  647. * [WPD00003833] [MT6620 and MT5931] Driver migration.
  648. * when IBSS is being merged-in, send command packet to PM for connected indication
  649. *
  650. * 07 19 2010 cp.wu
  651. *
  652. * [WPD00003833] [MT6620 and MT5931] Driver migration.
  653. * Add Ad-Hoc support to AIS-FSM
  654. *
  655. * 07 19 2010 jeffrey.chang
  656. *
  657. * Linux port modification
  658. *
  659. * 07 16 2010 cp.wu
  660. *
  661. * [WPD00003833] [MT6620 and MT5931] Driver migration.
  662. * bugfix for SCN migration
  663. * 1) modify QUEUE_CONCATENATE_QUEUES() so it could be used to concatence with an empty queue
  664. * 2) before AIS issues scan request, network(BSS) needs to be activated first
  665. * 3) only invoke COPY_SSID when using specified SSID for scan
  666. *
  667. * 07 15 2010 cp.wu
  668. *
  669. * [WPD00003833] [MT6620 and MT5931] Driver migration.
  670. * for AIS scanning, driver specifies no extra IE for probe request
  671. *
  672. * 07 15 2010 cp.wu
  673. *
  674. * [WPD00003833] [MT6620 and MT5931] Driver migration.
  675. * driver no longer generates probe request frames
  676. *
  677. * 07 14 2010 yarco.yang
  678. *
  679. * Remove CFG_MQM_MIGRATION
  680. *
  681. * 07 14 2010 cp.wu
  682. *
  683. * [WPD00003833] [MT6620 and MT5931] Driver migration.
  684. * Refine AIS-FSM by divided into more states
  685. *
  686. * 07 13 2010 cm.chang
  687. *
  688. * Rename MSG_CH_RELEASE_T to MSG_CH_ABORT_T
  689. *
  690. * 07 09 2010 cp.wu
  691. *
  692. * 1) separate AIS_FSM state for two kinds of scanning. (OID triggered scan, and scan-for-connection)
  693. * 2) eliminate PRE_BSS_DESC_T, Beacon/PrebResp is now parsed in single pass
  694. * 3) implment DRV-SCN module, currently only accepts single scan request,
  695. * other request will be directly dropped by returning BUSY
  696. *
  697. * 07 09 2010 george.huang
  698. *
  699. * [WPD00001556] Migrate PM variables from FW to driver: for composing QoS Info
  700. *
  701. * 07 08 2010 cp.wu
  702. *
  703. * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
  704. *
  705. * 07 08 2010 cp.wu
  706. * [WPD00003833][MT6620 and MT5931] Driver migration
  707. * take use of RLM module for parsing/generating HT IEs for 11n capability
  708. *
  709. * 07 08 2010 cm.chang
  710. * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
  711. * Rename MID_MNY_CNM_CH_RELEASE to MID_MNY_CNM_CH_ABORT
  712. *
  713. * 07 07 2010 cp.wu
  714. * [WPD00003833][MT6620 and MT5931] Driver migration
  715. * for first connection, if connecting failed do not enter into scan state.
  716. *
  717. * 07 06 2010 cp.wu
  718. * [WPD00003833][MT6620 and MT5931] Driver migration
  719. * once STA-REC is allocated and updated, invoke cnmStaRecChangeState() to sync. with firmware.
  720. *
  721. * 07 06 2010 george.huang
  722. * [WPD00001556]Basic power managemenet function
  723. * Update arguments for nicUpdateBeaconIETemplate()
  724. *
  725. * 07 06 2010 cp.wu
  726. * [WPD00003833][MT6620 and MT5931] Driver migration
  727. * STA-REC is maintained by CNM only.
  728. *
  729. * 07 05 2010 cp.wu
  730. * [WPD00003833][MT6620 and MT5931] Driver migration
  731. * remove unused definitions.
  732. *
  733. * 07 01 2010 cp.wu
  734. * [WPD00003833][MT6620 and MT5931] Driver migration
  735. * AIS-FSM integration with CNM channel request messages
  736. *
  737. * 07 01 2010 cp.wu
  738. * [WPD00003833][MT6620 and MT5931] Driver migration
  739. * implementation of DRV-SCN and related mailbox message handling.
  740. *
  741. * 06 30 2010 cp.wu
  742. * [WPD00003833][MT6620 and MT5931] Driver migration
  743. * sync. with CMD/EVENT document ver0.07.
  744. *
  745. * 06 29 2010 cp.wu
  746. * [WPD00003833][MT6620 and MT5931] Driver migration
  747. * 1) sync to. CMD/EVENT document v0.03
  748. * 2) simplify DTIM period parsing in scan.c only, bss.c no longer parses it again.
  749. * 3) send command packet to indicate FW-PM after
  750. * a) 1st beacon is received after AIS has connected to an AP
  751. * b) IBSS-ALONE has been created
  752. * c) IBSS-MERGE has occurred
  753. *
  754. * 06 25 2010 cp.wu
  755. * [WPD00003833][MT6620 and MT5931] Driver migration
  756. * modify Beacon/ProbeResp to complete parsing,
  757. * because host software has looser memory usage restriction
  758. *
  759. * 06 23 2010 cp.wu
  760. * [WPD00003833][MT6620 and MT5931] Driver migration
  761. * integrate .
  762. *
  763. * 06 22 2010 cp.wu
  764. * [WPD00003833][MT6620 and MT5931] Driver migration
  765. * comment out RLM APIs by CFG_RLM_MIGRATION.
  766. *
  767. * 06 22 2010 cp.wu
  768. * [WPD00003833][MT6620 and MT5931] Driver migration
  769. * 1) add command warpper for STA-REC/BSS-INFO sync.
  770. * 2) enhance command packet sending procedure for non-oid part
  771. * 3) add command packet definitions for STA-REC/BSS-INFO sync.
  772. *
  773. * 06 21 2010 yarco.yang
  774. * [WPD00003837][MT6620]Data Path Refine
  775. * Support CFG_MQM_MIGRATION flag
  776. *
  777. * 06 21 2010 cp.wu
  778. * [WPD00003833][MT6620 and MT5931] Driver migration
  779. * add scan_fsm into building.
  780. *
  781. * 06 21 2010 cp.wu
  782. * [WPD00003833][MT6620 and MT5931] Driver migration
  783. * RSN/PRIVACY compilation flag awareness correction
  784. *
  785. * 06 18 2010 cm.chang
  786. * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
  787. * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
  788. *
  789. * 06 18 2010 wh.su
  790. * [WPD00003840][MT6620 5931] Security migration
  791. * migration from MT6620 firmware.
  792. *
  793. * 06 15 2010 cp.wu
  794. * [WPD00003833][MT6620 and MT5931] Driver migration
  795. * add scan.c.
  796. *
  797. * 06 14 2010 cp.wu
  798. * [WPD00003833][MT6620 and MT5931] Driver migration
  799. * restore utility function invoking via hem_mbox to direct calls
  800. *
  801. * 06 11 2010 cp.wu
  802. * [WPD00003833][MT6620 and MT5931] Driver migration
  803. * auth.c is migrated.
  804. *
  805. * 06 11 2010 cp.wu
  806. * [WPD00003833][MT6620 and MT5931] Driver migration
  807. * add bss.c.
  808. *
  809. * 06 11 2010 cp.wu
  810. * [WPD00003833][MT6620 and MT5931] Driver migration
  811. * 1) migrate assoc.c.
  812. * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
  813. * 3) add configuration options for CNM_MEM and RSN modules
  814. * 4) add data path for management frames
  815. * 5) eliminate rPacketInfo of MSDU_INFO_T
  816. *
  817. * 06 10 2010 cp.wu
  818. * [WPD00003833][MT6620 and MT5931] Driver migration
  819. * change to enqueue TX frame infinitely.
  820. *
  821. * 06 10 2010 cp.wu
  822. * [WPD00003833][MT6620 and MT5931] Driver migration
  823. * 1) eliminate CFG_CMD_EVENT_VERSION_0_9
  824. * 2) when disconnected, indicate nic directly (no event is needed)
  825. *
  826. * 06 10 2010 cp.wu
  827. * [WPD00003833][MT6620 and MT5931] Driver migration
  828. * add buildable & linkable ais_fsm.c
  829. *
  830. * related reference are still waiting to be resolved
  831. *
  832. * 06 01 2010 cm.chang
  833. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  834. * Add conditionial compiling flag to choose default available bandwidth
  835. *
  836. * 05 28 2010 kevin.huang
  837. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  838. * Add ClientList handling API - bssClearClientList, bssAddStaRecToClientList
  839. *
  840. * 05 24 2010 kevin.huang
  841. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  842. * Refine authSendAuthFrame() for NULL STA_RECORD_T case and minimum deauth interval.
  843. *
  844. * 05 21 2010 kevin.huang
  845. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  846. * Fix compile error if CFG_CMD_EVENT_VER_009 == 0 for prEventConnStatus->ucNetworkType.
  847. *
  848. * 05 21 2010 kevin.huang
  849. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  850. * Refine txmInitWtblTxRateTable() - set TX initial rate according to AP's operation rate set
  851. *
  852. * 05 17 2010 kevin.huang
  853. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  854. * Call pmAbort() and add ucNetworkType field in EVENT_CONNECTION_STATUS
  855. *
  856. * 05 14 2010 kevin.huang
  857. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  858. * Fix compile warning - define of MQM_WMM_PARSING was removed
  859. *
  860. * 05 12 2010 kevin.huang
  861. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  862. * Add Power Management - Legacy PS-POLL support.
  863. *
  864. * 04 28 2010 tehuang.liu
  865. * [BORA00000605][WIFISYS] Phase3 Integration
  866. * Removed the use of compiling flag MQM_WMM_PARSING
  867. *
  868. * 04 27 2010 kevin.huang
  869. * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
  870. *
  871. * Fix typo
  872. *
  873. * 04 27 2010 kevin.huang
  874. * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
  875. * Add Set Slot Time and Beacon Timeout Support for AdHoc Mode
  876. *
  877. * 04 19 2010 kevin.huang
  878. * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
  879. * Add Send Deauth for Class 3 Error and Leave Network Support
  880. *
  881. * 04 15 2010 wh.su
  882. * [BORA00000680][MT6620] Support the statistic for Microsoft os query
  883. * fixed the protected bit at cap info for ad-hoc.
  884. *
  885. * 04 13 2010 kevin.huang
  886. * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
  887. * Add new HW CH macro support
  888. *
  889. * 04 07 2010 chinghwa.yu
  890. * [BORA00000563]Add WiFi CoEx BCM module
  891. * Add TX Power Control RCPI function.
  892. *
  893. * 03 29 2010 wh.su
  894. * [BORA00000605][WIFISYS] Phase3 Integration
  895. * move the wlan table alloc / free to change state function.
  896. *
  897. * 03 25 2010 wh.su
  898. * [BORA00000676][MT6620] Support the frequency setting and query at build connection / connection event
  899. * modify the build connection and status event structure bu CMD_EVENT doc 0.09 draft, default is disable.
  900. *
  901. * 03 24 2010 wh.su
  902. * [BORA00000605][WIFISYS] Phase3 Integration
  903. * fixed some WHQL testing error.
  904. *
  905. * 03 24 2010 kevin.huang
  906. * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
  907. * Add Set / Unset POWER STATE in AIS Network
  908. *
  909. * 03 16 2010 kevin.huang
  910. * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
  911. * Add AdHoc Mode
  912. *
  913. * 03 10 2010 kevin.huang
  914. * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
  915. * Add Channel Manager for arbitration of JOIN and SCAN Req
  916. *
  917. * 03 03 2010 kevin.huang
  918. * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
  919. * Add PHY_CONFIG to change Phy Type
  920. *
  921. * 03 03 2010 chinghwa.yu
  922. * [BORA00000563]Add WiFi CoEx BCM module
  923. * Use bcmWiFiNotify to replace wifi_send_msg to pass information to BCM module.
  924. *
  925. * 03 03 2010 chinghwa.yu
  926. * [BORA00000563]Add WiFi CoEx BCM module
  927. * Remove wmt_task definition and add PTA function.
  928. *
  929. * 03 02 2010 tehuang.liu
  930. * [BORA00000569][WIFISYS] Phase 2 Integration Test
  931. * Init TXM and MQM testing procedures in aisFsmRunEventJoinComplete()
  932. *
  933. * 03 01 2010 tehuang.liu
  934. * [BORA00000569][WIFISYS] Phase 2 Integration Test
  935. * Modified aisUpdateBssInfo() to call TXM's functions for setting WTBL TX parameters
  936. *
  937. * 03 01 2010 wh.su
  938. * [BORA00000605][WIFISYS] Phase3 Integration
  939. * clear the pmkid cache while indicate media disconnect.
  940. *
  941. * 02 26 2010 tehuang.liu
  942. * [BORA00000569][WIFISYS] Phase 2 Integration Test
  943. * .
  944. *
  945. * 02 26 2010 tehuang.liu
  946. * [BORA00000569][WIFISYS] Phase 2 Integration Test
  947. * Enabled MQM parsing WMM IEs for non-AP mode
  948. *
  949. * 02 26 2010 kevin.huang
  950. * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
  951. * Remove CFG_TEST_VIRTUAL_CMD and add support of Driver STA_RECORD_T activation
  952. *
  953. * 02 25 2010 wh.su
  954. * [BORA00000605][WIFISYS] Phase3 Integration
  955. * use the Rx0 dor event indicate.
  956. *
  957. * 02 23 2010 kevin.huang
  958. * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
  959. * Support dynamic channel selection
  960. *
  961. * 02 23 2010 wh.su
  962. * [BORA00000621][MT6620 Wi-Fi] Add the RSSI indicate to avoid XP stalled for query rssi value
  963. * Adding the RSSI event support, using the HAL function to get the rcpi value and tranlsate to
  964. * RSSI and indicate to driver
  965. *
  966. * 02 12 2010 cm.chang
  967. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  968. * Use bss info array for concurrent handle
  969. *
  970. * 02 05 2010 kevin.huang
  971. * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
  972. * Revise data structure to share the same BSS_INFO_T for avoiding coding error
  973. *
  974. * 02 04 2010 kevin.huang
  975. * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
  976. * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
  977. *
  978. * 01 27 2010 tehuang.liu
  979. * [BORA00000569][WIFISYS] Phase 2 Integration Test
  980. * Set max AMDPU size supported by the peer to 64 KB,
  981. * removed mqmInit() and mqmTxSendAddBaReq() function calls in aisUpdateBssInfo()
  982. *
  983. * 01 27 2010 wh.su
  984. * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
  985. * add and fixed some security function.
  986. *
  987. * 01 22 2010 cm.chang
  988. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  989. * Support protection and bandwidth switch
  990. *
  991. * 01 20 2010 kevin.huang
  992. * [BORA00000569][WIFISYS] Phase 2 Integration Test
  993. * Add PHASE_2_INTEGRATION_WORK_AROUND and CFG_SUPPORT_BCM flags
  994. *
  995. * 01 15 2010 tehuang.liu
  996. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  997. * Configured the AMPDU factor to 3 for the APu1rwduu`wvpghlqg|q`mpdkb+ilp
  998. *
  999. * 01 14 2010 chinghwa.yu
  1000. * [BORA00000563]Add WiFi CoEx BCM module
  1001. * Add WiFi BCM module for the 1st time.
  1002. *
  1003. * 01 11 2010 kevin.huang
  1004. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  1005. * Add Deauth and Disassoc Handler
  1006. *
  1007. * 01 07 2010 kevin.huang
  1008. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  1009. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1010. *
  1011. * Refine JOIN Complete and separate the function of Media State indication
  1012. *
  1013. * 01 04 2010 tehuang.liu
  1014. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  1015. * For working out the first connection Chariot-verified version
  1016. *
  1017. * 12 18 2009 cm.chang
  1018. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  1019. * .
  1020. *
  1021. * Dec 10 2009 mtk01088
  1022. * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
  1023. * adding the sample code to update the wlan table rate,
  1024. *
  1025. * Dec 10 2009 mtk01104
  1026. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1027. * Different function prototype of wifi_send_msg()
  1028. *
  1029. * Dec 9 2009 mtk01104
  1030. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1031. * Call rlm related function to process HT info when join complete
  1032. *
  1033. * Dec 9 2009 mtk01088
  1034. * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
  1035. * default the acquired wlan table entry code off
  1036. *
  1037. * Dec 9 2009 mtk01088
  1038. * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
  1039. * adding the code to acquired the wlan table entry, and a sample code to update the BA bit at table
  1040. *
  1041. * Dec 7 2009 mtk01461
  1042. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1043. * Fix the problem of prSwRfb overwrited by event packet in aisFsmRunEventJoinComplete()
  1044. *
  1045. * Dec 4 2009 mtk01088
  1046. * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
  1047. * adding the code to integrate the security related code
  1048. *
  1049. * Dec 3 2009 mtk01461
  1050. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1051. * Remove redundant declaration
  1052. *
  1053. * Dec 3 2009 mtk01461
  1054. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1055. * Add code for JOIN init and JOIN complete
  1056. *
  1057. * Nov 30 2009 mtk01461
  1058. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1059. * Rename u4RSSI to i4RSSI
  1060. *
  1061. * Nov 30 2009 mtk01461
  1062. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1063. * Revise ENUM_MEDIA_STATE to ENUM_PARAM_MEDIA_STATE
  1064. *
  1065. * Nov 30 2009 mtk01461
  1066. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1067. * Add fgIsScanReqIssued to CONNECTION_SETTINGS_T
  1068. *
  1069. * Nov 26 2009 mtk01461
  1070. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1071. * Revise Virtual CMD handler due to structure changed
  1072. *
  1073. * Nov 25 2009 mtk01461
  1074. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1075. * Add Virtual CMD & RESP for testing CMD PATH
  1076. *
  1077. * Nov 23 2009 mtk01461
  1078. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1079. * Add aisFsmInitializeConnectionSettings()
  1080. *
  1081. * Nov 20 2009 mtk01461
  1082. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1083. * Add CFG_TEST_MGMT_FSM flag for aisFsmTest()
  1084. *
  1085. * Nov 16 2009 mtk01461
  1086. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  1087. *
  1088. */
  1089. /*******************************************************************************
  1090. * C O M P I L E R F L A G S
  1091. ********************************************************************************
  1092. */
  1093. /*******************************************************************************
  1094. * E X T E R N A L R E F E R E N C E S
  1095. ********************************************************************************
  1096. */
  1097. #include "precomp.h"
  1098. /*******************************************************************************
  1099. * C O N S T A N T S
  1100. ********************************************************************************
  1101. */
  1102. #define AIS_ROAMING_CONNECTION_TRIAL_LIMIT 2
  1103. #define AIS_JOIN_TIMEOUT 7
  1104. #define CTIA_MAGIC_SSID "no_use_ctia_ssid" /* "ctia_test_only_*#*#3646633#*#*" */
  1105. #define CTIA_MAGIC_SSID_LEN 30
  1106. #define AIS_FSM_STATE_SEARCH_ACTION_PHASE_0 0
  1107. #define AIS_FSM_STATE_SEARCH_ACTION_PHASE_1 1
  1108. #define AIS_FSM_STATE_SEARCH_ACTION_PHASE_2 2
  1109. /*******************************************************************************
  1110. * D A T A T Y P E S
  1111. ********************************************************************************
  1112. */
  1113. /*******************************************************************************
  1114. * P U B L I C D A T A
  1115. ********************************************************************************
  1116. */
  1117. /*******************************************************************************
  1118. * P R I V A T E D A T A
  1119. ********************************************************************************
  1120. */
  1121. #if DBG
  1122. /*lint -save -e64 Type mismatch */
  1123. static PUINT_8 apucDebugAisState[AIS_STATE_NUM] = {
  1124. (PUINT_8) DISP_STRING("AIS_STATE_IDLE"),
  1125. (PUINT_8) DISP_STRING("AIS_STATE_SEARCH"),
  1126. (PUINT_8) DISP_STRING("AIS_STATE_SCAN"),
  1127. (PUINT_8) DISP_STRING("AIS_STATE_ONLINE_SCAN"),
  1128. (PUINT_8) DISP_STRING("AIS_STATE_LOOKING_FOR"),
  1129. (PUINT_8) DISP_STRING("AIS_STATE_WAIT_FOR_NEXT_SCAN"),
  1130. (PUINT_8) DISP_STRING("AIS_STATE_REQ_CHANNEL_JOIN"),
  1131. (PUINT_8) DISP_STRING("AIS_STATE_JOIN"),
  1132. (PUINT_8) DISP_STRING("AIS_STATE_JOIN_FAILURE"),
  1133. (PUINT_8) DISP_STRING("AIS_STATE_IBSS_ALONE"),
  1134. (PUINT_8) DISP_STRING("AIS_STATE_IBSS_MERGE"),
  1135. (PUINT_8) DISP_STRING("AIS_STATE_NORMAL_TR"),
  1136. (PUINT_8) DISP_STRING("AIS_STATE_DISCONNECTING"),
  1137. (PUINT_8) DISP_STRING("AIS_STATE_REQ_REMAIN_ON_CHANNEL"),
  1138. (PUINT_8) DISP_STRING("AIS_STATE_REMAIN_ON_CHANNEL")
  1139. };
  1140. /*lint -restore */
  1141. #endif /* DBG */
  1142. /*******************************************************************************
  1143. * M A C R O S
  1144. ********************************************************************************
  1145. */
  1146. /*******************************************************************************
  1147. * F U N C T I O N D E C L A R A T I O N S
  1148. ********************************************************************************
  1149. */
  1150. static VOID aisFsmRunEventScanDoneTimeOut(IN P_ADAPTER_T prAdapter, ULONG ulParam);
  1151. /*******************************************************************************
  1152. * F U N C T I O N S
  1153. ********************************************************************************
  1154. */
  1155. /*----------------------------------------------------------------------------*/
  1156. /*!
  1157. * @brief the function is used to initialize the value of the connection settings for
  1158. * AIS network
  1159. *
  1160. * @param (none)
  1161. *
  1162. * @return (none)
  1163. */
  1164. /*----------------------------------------------------------------------------*/
  1165. VOID aisInitializeConnectionSettings(IN P_ADAPTER_T prAdapter, IN P_REG_INFO_T prRegInfo)
  1166. {
  1167. P_CONNECTION_SETTINGS_T prConnSettings;
  1168. UINT_8 aucAnyBSSID[] = BC_BSSID;
  1169. UINT_8 aucZeroMacAddr[] = NULL_MAC_ADDR;
  1170. int i = 0;
  1171. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  1172. /* Setup default values for operation */
  1173. COPY_MAC_ADDR(prConnSettings->aucMacAddress, aucZeroMacAddr);
  1174. prConnSettings->ucDelayTimeOfDisconnectEvent = AIS_DELAY_TIME_OF_DISCONNECT_SEC;
  1175. COPY_MAC_ADDR(prConnSettings->aucBSSID, aucAnyBSSID);
  1176. prConnSettings->fgIsConnByBssidIssued = FALSE;
  1177. prConnSettings->fgIsConnReqIssued = FALSE;
  1178. prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
  1179. prConnSettings->ucSSIDLen = 0;
  1180. prConnSettings->eOPMode = NET_TYPE_INFRA;
  1181. prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
  1182. if (prRegInfo) {
  1183. prConnSettings->ucAdHocChannelNum = (UINT_8) nicFreq2ChannelNum(prRegInfo->u4StartFreq);
  1184. prConnSettings->eAdHocBand = prRegInfo->u4StartFreq < 5000000 ? BAND_2G4 : BAND_5G;
  1185. prConnSettings->eAdHocMode = (ENUM_PARAM_AD_HOC_MODE_T) (prRegInfo->u4AdhocMode);
  1186. }
  1187. prConnSettings->eAuthMode = AUTH_MODE_OPEN;
  1188. prConnSettings->eEncStatus = ENUM_ENCRYPTION_DISABLED;
  1189. prConnSettings->fgIsScanReqIssued = FALSE;
  1190. /* MIB attributes */
  1191. prConnSettings->u2BeaconPeriod = DOT11_BEACON_PERIOD_DEFAULT;
  1192. prConnSettings->u2RTSThreshold = DOT11_RTS_THRESHOLD_DEFAULT;
  1193. prConnSettings->u2DesiredNonHTRateSet = RATE_SET_ALL_ABG;
  1194. /* prConnSettings->u4FreqInKHz; *//* Center frequency */
  1195. /* Set U-APSD AC */
  1196. prConnSettings->bmfgApsdEnAc = PM_UAPSD_NONE;
  1197. secInit(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1198. /* Features */
  1199. prConnSettings->fgIsEnableRoaming = FALSE;
  1200. #if CFG_SUPPORT_ROAMING
  1201. if (prRegInfo)
  1202. prConnSettings->fgIsEnableRoaming = ((prRegInfo->fgDisRoaming > 0) ? (FALSE) : (TRUE));
  1203. #endif /* CFG_SUPPORT_ROAMING */
  1204. prConnSettings->fgIsAdHocQoSEnable = FALSE;
  1205. #if CFG_SUPPORT_802_11AC
  1206. prConnSettings->eDesiredPhyConfig = PHY_CONFIG_802_11ABGNAC;
  1207. #else
  1208. prConnSettings->eDesiredPhyConfig = PHY_CONFIG_802_11ABGN;
  1209. #endif
  1210. /* Set default bandwidth modes */
  1211. prConnSettings->uc2G4BandwidthMode = CONFIG_BW_20M;
  1212. prConnSettings->uc5GBandwidthMode = CONFIG_BW_20_40M;
  1213. prConnSettings->rRsnInfo.ucElemId = 0x30;
  1214. prConnSettings->rRsnInfo.u2Version = 0x0001;
  1215. prConnSettings->rRsnInfo.u4GroupKeyCipherSuite = 0;
  1216. prConnSettings->rRsnInfo.u4PairwiseKeyCipherSuiteCount = 0;
  1217. for (i = 0; i < MAX_NUM_SUPPORTED_CIPHER_SUITES; i++)
  1218. prConnSettings->rRsnInfo.au4PairwiseKeyCipherSuite[i] = 0;
  1219. prConnSettings->rRsnInfo.u4AuthKeyMgtSuiteCount = 0;
  1220. for (i = 0; i < MAX_NUM_SUPPORTED_AKM_SUITES; i++)
  1221. prConnSettings->rRsnInfo.au4AuthKeyMgtSuite[i] = 0;
  1222. prConnSettings->rRsnInfo.u2RsnCap = 0;
  1223. prConnSettings->rRsnInfo.fgRsnCapPresent = FALSE;
  1224. } /* end of aisFsmInitializeConnectionSettings() */
  1225. /*----------------------------------------------------------------------------*/
  1226. /*!
  1227. * @brief the function is used to initialize the value in AIS_FSM_INFO_T for
  1228. * AIS FSM operation
  1229. *
  1230. * @param (none)
  1231. *
  1232. * @return (none)
  1233. */
  1234. /*----------------------------------------------------------------------------*/
  1235. VOID aisFsmInit(IN P_ADAPTER_T prAdapter)
  1236. {
  1237. P_AIS_FSM_INFO_T prAisFsmInfo;
  1238. P_BSS_INFO_T prAisBssInfo;
  1239. P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
  1240. DEBUGFUNC("aisFsmInit()");
  1241. DBGLOG(SW1, INFO, "->aisFsmInit()\n");
  1242. prAdapter->prAisBssInfo = prAisBssInfo = cnmGetBssInfoAndInit(prAdapter, NETWORK_TYPE_AIS, FALSE);
  1243. ASSERT(prAisBssInfo);
  1244. /* update MAC address */
  1245. COPY_MAC_ADDR(prAdapter->prAisBssInfo->aucOwnMacAddr, prAdapter->rMyMacAddr);
  1246. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  1247. prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
  1248. /* 4 <1> Initiate FSM */
  1249. prAisFsmInfo->ePreviousState = AIS_STATE_IDLE;
  1250. prAisFsmInfo->eCurrentState = AIS_STATE_IDLE;
  1251. prAisFsmInfo->ucAvailableAuthTypes = 0;
  1252. prAisFsmInfo->prTargetBssDesc = (P_BSS_DESC_T) NULL;
  1253. prAisFsmInfo->ucSeqNumOfReqMsg = 0;
  1254. prAisFsmInfo->ucSeqNumOfChReq = 0;
  1255. prAisFsmInfo->ucSeqNumOfScanReq = 0;
  1256. prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
  1257. #if CFG_SUPPORT_ROAMING
  1258. prAisFsmInfo->fgIsRoamingScanPending = FALSE;
  1259. #endif /* CFG_SUPPORT_ROAMING */
  1260. prAisFsmInfo->fgIsChannelRequested = FALSE;
  1261. prAisFsmInfo->fgIsChannelGranted = FALSE;
  1262. /* 4 <1.1> Initiate FSM - Timer INIT */
  1263. cnmTimerInitTimer(prAdapter,
  1264. &prAisFsmInfo->rBGScanTimer,
  1265. (PFN_MGMT_TIMEOUT_FUNC) aisFsmRunEventBGSleepTimeOut, (ULONG) NULL);
  1266. cnmTimerInitTimer(prAdapter,
  1267. &prAisFsmInfo->rIbssAloneTimer,
  1268. (PFN_MGMT_TIMEOUT_FUNC) aisFsmRunEventIbssAloneTimeOut, (ULONG) NULL);
  1269. cnmTimerInitTimer(prAdapter,
  1270. &prAisFsmInfo->rIndicationOfDisconnectTimer,
  1271. (PFN_MGMT_TIMEOUT_FUNC) aisPostponedEventOfDisconnTimeout, (ULONG) NULL);
  1272. cnmTimerInitTimer(prAdapter,
  1273. &prAisFsmInfo->rScanDoneTimer,
  1274. (PFN_MGMT_TIMEOUT_FUNC) aisFsmRunEventScanDoneTimeOut, (ULONG) NULL);
  1275. cnmTimerInitTimer(prAdapter,
  1276. &prAisFsmInfo->rJoinTimeoutTimer,
  1277. (PFN_MGMT_TIMEOUT_FUNC) aisFsmRunEventJoinTimeout, (ULONG) NULL);
  1278. cnmTimerInitTimer(prAdapter,
  1279. &prAisFsmInfo->rDeauthDoneTimer,
  1280. (PFN_MGMT_TIMEOUT_FUNC) aisFsmRunEventDeauthTimeout, (ULONG) NULL);
  1281. /* 4 <1.2> Initiate PWR STATE */
  1282. SET_NET_PWR_STATE_IDLE(prAdapter, prAisBssInfo->ucBssIndex);
  1283. /* 4 <2> Initiate BSS_INFO_T - common part */
  1284. BSS_INFO_INIT(prAdapter, prAisBssInfo);
  1285. COPY_MAC_ADDR(prAisBssInfo->aucOwnMacAddr, prAdapter->rWifiVar.aucMacAddress);
  1286. /* 4 <3> Initiate BSS_INFO_T - private part */
  1287. /* TODO */
  1288. prAisBssInfo->eBand = BAND_2G4;
  1289. prAisBssInfo->ucPrimaryChannel = 1;
  1290. prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T) NULL;
  1291. /* 4 <4> Allocate MSDU_INFO_T for Beacon */
  1292. prAisBssInfo->prBeacon = cnmMgtPktAlloc(prAdapter,
  1293. OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem[0]) + MAX_IE_LENGTH);
  1294. if (prAisBssInfo->prBeacon) {
  1295. prAisBssInfo->prBeacon->eSrc = TX_PACKET_MGMT;
  1296. prAisBssInfo->prBeacon->ucStaRecIndex = 0xFF; /* NULL STA_REC */
  1297. } else {
  1298. ASSERT(0);
  1299. }
  1300. /* secGetBmcWlanIndex(prAdapter, NETWORK_TYPE_AIS, prAisBssInfo->ucBssIndex); */
  1301. prAisBssInfo->ucBMCWlanIndex = WTBL_RESERVED_ENTRY;
  1302. #if 0
  1303. prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = PM_UAPSD_ALL;
  1304. prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC = PM_UAPSD_ALL;
  1305. prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = WMM_MAX_SP_LENGTH_2;
  1306. #else
  1307. if (prAdapter->u4UapsdAcBmp == 0) {
  1308. prAdapter->u4UapsdAcBmp = CFG_INIT_UAPSD_AC_BMP;
  1309. /* ASSERT(prAdapter->u4UapsdAcBmp); */
  1310. }
  1311. prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = (UINT_8) prAdapter->u4UapsdAcBmp;
  1312. prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC = (UINT_8) prAdapter->u4UapsdAcBmp;
  1313. prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = (UINT_8) prAdapter->u4MaxSpLen;
  1314. #endif
  1315. /* request list initialization */
  1316. LINK_INITIALIZE(&prAisFsmInfo->rPendingReqList);
  1317. /* DBGPRINTF("[2] ucBmpDeliveryAC:0x%x, ucBmpTriggerAC:0x%x, ucUapsdSp:0x%x", */
  1318. /* prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC, */
  1319. /* prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC, */
  1320. /* prAisBssInfo->rPmProfSetupInfo.ucUapsdSp); */
  1321. /* Bind NetDev & BssInfo */
  1322. /* wlanBindBssIdxToNetInterface(prAdapter->prGlueInfo, NET_DEV_WLAN_IDX, prAisBssInfo->ucBssIndex); */
  1323. } /* end of aisFsmInit() */
  1324. /*----------------------------------------------------------------------------*/
  1325. /*!
  1326. * @brief the function is used to uninitialize the value in AIS_FSM_INFO_T for
  1327. * AIS FSM operation
  1328. *
  1329. * @param (none)
  1330. *
  1331. * @return (none)
  1332. */
  1333. /*----------------------------------------------------------------------------*/
  1334. VOID aisFsmUninit(IN P_ADAPTER_T prAdapter)
  1335. {
  1336. P_AIS_FSM_INFO_T prAisFsmInfo;
  1337. P_BSS_INFO_T prAisBssInfo;
  1338. P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
  1339. DEBUGFUNC("aisFsmUninit()");
  1340. DBGLOG(SW1, INFO, "->aisFsmUninit()\n");
  1341. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  1342. prAisBssInfo = prAdapter->prAisBssInfo;
  1343. prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
  1344. /* 4 <1> Stop all timers */
  1345. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
  1346. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
  1347. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
  1348. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
  1349. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rScanDoneTimer);
  1350. /* 4 <2> flush pending request */
  1351. aisFsmFlushRequest(prAdapter);
  1352. /* 4 <3> Reset driver-domain BSS-INFO */
  1353. if ((prAisBssInfo != NULL) && (prAisBssInfo->prBeacon != NULL)) {
  1354. cnmMgtPktFree(prAdapter, prAisBssInfo->prBeacon);
  1355. prAisBssInfo->prBeacon = NULL;
  1356. }
  1357. #if CFG_SUPPORT_802_11W
  1358. rsnStopSaQuery(prAdapter);
  1359. #endif
  1360. if (prAisBssInfo) {
  1361. cnmFreeBssInfo(prAdapter, prAisBssInfo);
  1362. prAdapter->prAisBssInfo = NULL;
  1363. }
  1364. } /* end of aisFsmUninit() */
  1365. /*----------------------------------------------------------------------------*/
  1366. /*!
  1367. * @brief Initialization of JOIN STATE
  1368. *
  1369. * @param[in] prBssDesc The pointer of BSS_DESC_T which is the BSS we will try to join with.
  1370. *
  1371. * @return (none)
  1372. */
  1373. /*----------------------------------------------------------------------------*/
  1374. VOID aisFsmStateInit_JOIN(IN P_ADAPTER_T prAdapter, P_BSS_DESC_T prBssDesc)
  1375. {
  1376. P_AIS_FSM_INFO_T prAisFsmInfo;
  1377. P_BSS_INFO_T prAisBssInfo;
  1378. P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
  1379. P_CONNECTION_SETTINGS_T prConnSettings;
  1380. P_STA_RECORD_T prStaRec;
  1381. P_MSG_JOIN_REQ_T prJoinReqMsg;
  1382. DEBUGFUNC("aisFsmStateInit_JOIN()");
  1383. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  1384. prAisBssInfo = prAdapter->prAisBssInfo;
  1385. prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
  1386. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  1387. ASSERT(prBssDesc);
  1388. /* 4 <1> We are going to connect to this BSS. */
  1389. prBssDesc->fgIsConnecting = TRUE;
  1390. /* 4 <2> Setup corresponding STA_RECORD_T */
  1391. prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
  1392. STA_TYPE_LEGACY_AP, prAdapter->prAisBssInfo->ucBssIndex, prBssDesc);
  1393. prAisFsmInfo->prTargetStaRec = prStaRec;
  1394. /* 4 <2.1> sync. to firmware domain */
  1395. if (prStaRec->ucStaState == STA_STATE_1)
  1396. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  1397. /* 4 <3> Update ucAvailableAuthTypes which we can choice during SAA */
  1398. if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
  1399. prStaRec->fgIsReAssoc = FALSE;
  1400. switch (prConnSettings->eAuthMode) {
  1401. case AUTH_MODE_OPEN: /* Note: Omit break here. */
  1402. case AUTH_MODE_WPA:
  1403. case AUTH_MODE_WPA_PSK:
  1404. case AUTH_MODE_WPA2:
  1405. case AUTH_MODE_WPA2_PSK:
  1406. prAisFsmInfo->ucAvailableAuthTypes = (UINT_8) AUTH_TYPE_OPEN_SYSTEM;
  1407. break;
  1408. case AUTH_MODE_SHARED:
  1409. prAisFsmInfo->ucAvailableAuthTypes = (UINT_8) AUTH_TYPE_SHARED_KEY;
  1410. break;
  1411. case AUTH_MODE_AUTO_SWITCH:
  1412. DBGLOG(AIS, LOUD, "JOIN INIT: eAuthMode == AUTH_MODE_AUTO_SWITCH\n");
  1413. prAisFsmInfo->ucAvailableAuthTypes = (UINT_8) (AUTH_TYPE_OPEN_SYSTEM | AUTH_TYPE_SHARED_KEY);
  1414. break;
  1415. default:
  1416. ASSERT(!(prConnSettings->eAuthMode == AUTH_MODE_WPA_NONE));
  1417. DBGLOG(AIS, ERROR,
  1418. "JOIN INIT: Auth Algorithm : %d was not supported by JOIN\n",
  1419. prConnSettings->eAuthMode);
  1420. /* TODO(Kevin): error handling ? */
  1421. return;
  1422. }
  1423. /* TODO(tyhsu): Assume that Roaming Auth Type is equal to ConnSettings eAuthMode */
  1424. prAisSpecificBssInfo->ucRoamingAuthTypes = prAisFsmInfo->ucAvailableAuthTypes;
  1425. prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT;
  1426. } else {
  1427. ASSERT(prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE);
  1428. ASSERT(!prBssDesc->fgIsConnected);
  1429. DBGLOG(AIS, LOUD, "JOIN INIT: AUTH TYPE = %d for Roaming\n",
  1430. prAisSpecificBssInfo->ucRoamingAuthTypes);
  1431. prStaRec->fgIsReAssoc = TRUE; /* We do roaming while the medium is connected */
  1432. /* TODO(Kevin): We may call a sub function to acquire the Roaming Auth Type */
  1433. prAisFsmInfo->ucAvailableAuthTypes = prAisSpecificBssInfo->ucRoamingAuthTypes;
  1434. prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT_FOR_ROAMING;
  1435. }
  1436. /* 4 <4> Use an appropriate Authentication Algorithm Number among the ucAvailableAuthTypes */
  1437. if (prAisFsmInfo->ucAvailableAuthTypes & (UINT_8) AUTH_TYPE_OPEN_SYSTEM) {
  1438. DBGLOG(AIS, LOUD, "JOIN INIT: Try to do Authentication with AuthType == OPEN_SYSTEM.\n");
  1439. prAisFsmInfo->ucAvailableAuthTypes &= ~(UINT_8) AUTH_TYPE_OPEN_SYSTEM;
  1440. prStaRec->ucAuthAlgNum = (UINT_8) AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
  1441. } else if (prAisFsmInfo->ucAvailableAuthTypes & (UINT_8) AUTH_TYPE_SHARED_KEY) {
  1442. DBGLOG(AIS, LOUD, "JOIN INIT: Try to do Authentication with AuthType == SHARED_KEY.\n");
  1443. prAisFsmInfo->ucAvailableAuthTypes &= ~(UINT_8) AUTH_TYPE_SHARED_KEY;
  1444. prStaRec->ucAuthAlgNum = (UINT_8) AUTH_ALGORITHM_NUM_SHARED_KEY;
  1445. } else if (prAisFsmInfo->ucAvailableAuthTypes & (UINT_8) AUTH_TYPE_FAST_BSS_TRANSITION) {
  1446. DBGLOG(AIS, LOUD, "JOIN INIT: Try to do Authentication with AuthType == FAST_BSS_TRANSITION.\n");
  1447. prAisFsmInfo->ucAvailableAuthTypes &= ~(UINT_8) AUTH_TYPE_FAST_BSS_TRANSITION;
  1448. prStaRec->ucAuthAlgNum = (UINT_8) AUTH_ALGORITHM_NUM_FAST_BSS_TRANSITION;
  1449. } else {
  1450. ASSERT(0);
  1451. }
  1452. /* 4 <5> Overwrite Connection Setting for eConnectionPolicy == ANY (Used by Assoc Req) */
  1453. if (prBssDesc->ucSSIDLen)
  1454. COPY_SSID(prConnSettings->aucSSID, prConnSettings->ucSSIDLen, prBssDesc->aucSSID, prBssDesc->ucSSIDLen);
  1455. /* 4 <6> Send a Msg to trigger SAA to start JOIN process. */
  1456. prJoinReqMsg = (P_MSG_JOIN_REQ_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
  1457. if (!prJoinReqMsg) {
  1458. ASSERT(0); /* Can't trigger SAA FSM */
  1459. return;
  1460. }
  1461. prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
  1462. prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
  1463. prJoinReqMsg->prStaRec = prStaRec;
  1464. if (1) {
  1465. int j;
  1466. P_FRAG_INFO_T prFragInfo;
  1467. for (j = 0; j < MAX_NUM_CONCURRENT_FRAGMENTED_MSDUS; j++) {
  1468. prFragInfo = &prStaRec->rFragInfo[j];
  1469. if (prFragInfo->pr1stFrag) {
  1470. /* nicRxReturnRFB(prAdapter, prFragInfo->pr1stFrag); */
  1471. prFragInfo->pr1stFrag = (P_SW_RFB_T) NULL;
  1472. }
  1473. }
  1474. }
  1475. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prJoinReqMsg, MSG_SEND_METHOD_BUF);
  1476. } /* end of aisFsmInit_JOIN() */
  1477. /*----------------------------------------------------------------------------*/
  1478. /*!
  1479. * @brief Retry JOIN for AUTH_MODE_AUTO_SWITCH
  1480. *
  1481. * @param[in] prStaRec Pointer to the STA_RECORD_T
  1482. *
  1483. * @retval TRUE We will retry JOIN
  1484. * @retval FALSE We will not retry JOIN
  1485. */
  1486. /*----------------------------------------------------------------------------*/
  1487. BOOLEAN aisFsmStateInit_RetryJOIN(IN P_ADAPTER_T prAdapter, P_STA_RECORD_T prStaRec)
  1488. {
  1489. P_AIS_FSM_INFO_T prAisFsmInfo;
  1490. P_MSG_JOIN_REQ_T prJoinReqMsg;
  1491. DEBUGFUNC("aisFsmStateInit_RetryJOIN()");
  1492. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  1493. /* Retry other AuthType if possible */
  1494. if (!prAisFsmInfo->ucAvailableAuthTypes)
  1495. return FALSE;
  1496. if (prAisFsmInfo->ucAvailableAuthTypes & (UINT_8) AUTH_TYPE_SHARED_KEY) {
  1497. DBGLOG(AIS, INFO, "RETRY JOIN INIT: Retry Authentication with AuthType == SHARED_KEY.\n");
  1498. prAisFsmInfo->ucAvailableAuthTypes &= ~(UINT_8) AUTH_TYPE_SHARED_KEY;
  1499. prStaRec->ucAuthAlgNum = (UINT_8) AUTH_ALGORITHM_NUM_SHARED_KEY;
  1500. } else {
  1501. DBGLOG(AIS, ERROR, "RETRY JOIN INIT: Retry Authentication with Unexpected AuthType.\n");
  1502. ASSERT(0);
  1503. }
  1504. prAisFsmInfo->ucAvailableAuthTypes = 0; /* No more available Auth Types */
  1505. /* Trigger SAA to start JOIN process. */
  1506. prJoinReqMsg = (P_MSG_JOIN_REQ_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
  1507. if (!prJoinReqMsg) {
  1508. ASSERT(0); /* Can't trigger SAA FSM */
  1509. return FALSE;
  1510. }
  1511. prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
  1512. prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
  1513. prJoinReqMsg->prStaRec = prStaRec;
  1514. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prJoinReqMsg, MSG_SEND_METHOD_BUF);
  1515. return TRUE;
  1516. } /* end of aisFsmRetryJOIN() */
  1517. #if CFG_SUPPORT_ADHOC
  1518. /*----------------------------------------------------------------------------*/
  1519. /*!
  1520. * @brief State Initialization of AIS_STATE_IBSS_ALONE
  1521. *
  1522. * @param (none)
  1523. *
  1524. * @return (none)
  1525. */
  1526. /*----------------------------------------------------------------------------*/
  1527. VOID aisFsmStateInit_IBSS_ALONE(IN P_ADAPTER_T prAdapter)
  1528. {
  1529. P_AIS_FSM_INFO_T prAisFsmInfo;
  1530. P_CONNECTION_SETTINGS_T prConnSettings;
  1531. P_BSS_INFO_T prAisBssInfo;
  1532. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  1533. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  1534. prAisBssInfo = prAdapter->prAisBssInfo;
  1535. /* 4 <1> Check if IBSS was created before ? */
  1536. if (prAisBssInfo->fgIsBeaconActivated) {
  1537. /* 4 <2> Start IBSS Alone Timer for periodic SCAN and then SEARCH */
  1538. #if !CFG_SLT_SUPPORT
  1539. cnmTimerStartTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer, SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
  1540. #endif
  1541. }
  1542. aisFsmCreateIBSS(prAdapter);
  1543. } /* end of aisFsmStateInit_IBSS_ALONE() */
  1544. /*----------------------------------------------------------------------------*/
  1545. /*!
  1546. * @brief State Initialization of AIS_STATE_IBSS_MERGE
  1547. *
  1548. * @param[in] prBssDesc The pointer of BSS_DESC_T which is the IBSS we will try to merge with.
  1549. *
  1550. * @return (none)
  1551. */
  1552. /*----------------------------------------------------------------------------*/
  1553. VOID aisFsmStateInit_IBSS_MERGE(IN P_ADAPTER_T prAdapter, P_BSS_DESC_T prBssDesc)
  1554. {
  1555. P_AIS_FSM_INFO_T prAisFsmInfo;
  1556. P_CONNECTION_SETTINGS_T prConnSettings;
  1557. P_BSS_INFO_T prAisBssInfo;
  1558. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  1559. ASSERT(prBssDesc);
  1560. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  1561. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  1562. prAisBssInfo = prAdapter->prAisBssInfo;
  1563. /* 4 <1> We will merge with to this BSS immediately. */
  1564. prBssDesc->fgIsConnecting = FALSE;
  1565. prBssDesc->fgIsConnected = TRUE;
  1566. /* 4 <2> Setup corresponding STA_RECORD_T */
  1567. prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
  1568. STA_TYPE_ADHOC_PEER, prAdapter->prAisBssInfo->ucBssIndex, prBssDesc);
  1569. prStaRec->fgIsMerging = TRUE;
  1570. prAisFsmInfo->prTargetStaRec = prStaRec;
  1571. /* 4 <2.1> sync. to firmware domain */
  1572. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  1573. /* 4 <3> IBSS-Merge */
  1574. aisFsmMergeIBSS(prAdapter, prStaRec);
  1575. } /* end of aisFsmStateInit_IBSS_MERGE() */
  1576. #endif /* CFG_SUPPORT_ADHOC */
  1577. /*----------------------------------------------------------------------------*/
  1578. /*!
  1579. * @brief Process of JOIN Abort
  1580. *
  1581. * @param (none)
  1582. *
  1583. * @return (none)
  1584. */
  1585. /*----------------------------------------------------------------------------*/
  1586. VOID aisFsmStateAbort_JOIN(IN P_ADAPTER_T prAdapter)
  1587. {
  1588. P_AIS_FSM_INFO_T prAisFsmInfo;
  1589. P_MSG_JOIN_ABORT_T prJoinAbortMsg;
  1590. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  1591. /* 1. Abort JOIN process */
  1592. prJoinAbortMsg = (P_MSG_JOIN_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_ABORT_T));
  1593. if (!prJoinAbortMsg) {
  1594. ASSERT(0); /* Can't abort SAA FSM */
  1595. return;
  1596. }
  1597. prJoinAbortMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_ABORT;
  1598. prJoinAbortMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfReqMsg;
  1599. prJoinAbortMsg->prStaRec = prAisFsmInfo->prTargetStaRec;
  1600. scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisFsmInfo->prTargetStaRec->aucMacAddr);
  1601. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prJoinAbortMsg, MSG_SEND_METHOD_BUF);
  1602. /* 2. Return channel privilege */
  1603. aisFsmReleaseCh(prAdapter);
  1604. /* 3.1 stop join timeout timer */
  1605. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
  1606. /* 3.2 reset local variable */
  1607. prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
  1608. } /* end of aisFsmAbortJOIN() */
  1609. /*----------------------------------------------------------------------------*/
  1610. /*!
  1611. * @brief Process of SCAN Abort
  1612. *
  1613. * @param (none)
  1614. *
  1615. * @return (none)
  1616. */
  1617. /*----------------------------------------------------------------------------*/
  1618. VOID aisFsmStateAbort_SCAN(IN P_ADAPTER_T prAdapter)
  1619. {
  1620. P_AIS_FSM_INFO_T prAisFsmInfo;
  1621. P_MSG_SCN_SCAN_CANCEL prScanCancelMsg;
  1622. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  1623. DBGLOG(AIS, STATE, "aisFsmStateAbort_SCAN\n");
  1624. /* Abort JOIN process. */
  1625. prScanCancelMsg = (P_MSG_SCN_SCAN_CANCEL) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_CANCEL));
  1626. if (!prScanCancelMsg) {
  1627. ASSERT(0); /* Can't abort SCN FSM */
  1628. return;
  1629. }
  1630. prScanCancelMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_CANCEL;
  1631. prScanCancelMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfScanReq;
  1632. prScanCancelMsg->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  1633. prScanCancelMsg->fgIsChannelExt = FALSE;
  1634. /* unbuffered message to guarantee scan is cancelled in sequence */
  1635. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prScanCancelMsg, MSG_SEND_METHOD_UNBUF);
  1636. } /* end of aisFsmAbortSCAN() */
  1637. /*----------------------------------------------------------------------------*/
  1638. /*!
  1639. * @brief Process of NORMAL_TR Abort
  1640. *
  1641. * @param (none)
  1642. *
  1643. * @return (none)
  1644. */
  1645. /*----------------------------------------------------------------------------*/
  1646. VOID aisFsmStateAbort_NORMAL_TR(IN P_ADAPTER_T prAdapter)
  1647. {
  1648. P_AIS_FSM_INFO_T prAisFsmInfo;
  1649. ASSERT(prAdapter);
  1650. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  1651. /* TODO(Kevin): Do abort other MGMT func */
  1652. /* 1. Release channel to CNM */
  1653. aisFsmReleaseCh(prAdapter);
  1654. /* 2.1 stop join timeout timer */
  1655. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
  1656. /* 2.2 reset local variable */
  1657. prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
  1658. } /* end of aisFsmAbortNORMAL_TR() */
  1659. #if CFG_SUPPORT_ADHOC
  1660. /*----------------------------------------------------------------------------*/
  1661. /*!
  1662. * @brief Process of NORMAL_TR Abort
  1663. *
  1664. * @param (none)
  1665. *
  1666. * @return (none)
  1667. */
  1668. /*----------------------------------------------------------------------------*/
  1669. VOID aisFsmStateAbort_IBSS(IN P_ADAPTER_T prAdapter)
  1670. {
  1671. P_AIS_FSM_INFO_T prAisFsmInfo;
  1672. P_BSS_DESC_T prBssDesc;
  1673. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  1674. /* reset BSS-DESC */
  1675. if (prAisFsmInfo->prTargetStaRec) {
  1676. prBssDesc = scanSearchBssDescByTA(prAdapter, prAisFsmInfo->prTargetStaRec->aucMacAddr);
  1677. if (prBssDesc) {
  1678. prBssDesc->fgIsConnected = FALSE;
  1679. prBssDesc->fgIsConnecting = FALSE;
  1680. }
  1681. }
  1682. /* release channel privilege */
  1683. aisFsmReleaseCh(prAdapter);
  1684. }
  1685. #endif /* CFG_SUPPORT_ADHOC */
  1686. /*----------------------------------------------------------------------------*/
  1687. /*!
  1688. * @brief The Core FSM engine of AIS(Ad-hoc, Infra STA)
  1689. *
  1690. * @param[in] eNextState Enum value of next AIS STATE
  1691. *
  1692. * @return (none)
  1693. */
  1694. /*----------------------------------------------------------------------------*/
  1695. VOID aisFsmSteps(IN P_ADAPTER_T prAdapter, ENUM_AIS_STATE_T eNextState)
  1696. {
  1697. P_AIS_FSM_INFO_T prAisFsmInfo;
  1698. P_BSS_INFO_T prAisBssInfo;
  1699. P_CONNECTION_SETTINGS_T prConnSettings;
  1700. P_BSS_DESC_T prBssDesc;
  1701. P_MSG_CH_REQ_T prMsgChReq;
  1702. P_MSG_SCN_SCAN_REQ_V2 prScanReqMsg;
  1703. P_AIS_REQ_HDR_T prAisReq;
  1704. ENUM_BAND_T eBand;
  1705. UINT_8 ucChannel;
  1706. UINT_16 u2ScanIELen;
  1707. ENUM_AIS_STATE_T eOriPreState;
  1708. BOOLEAN fgIsTransition = (BOOLEAN) FALSE;
  1709. DEBUGFUNC("aisFsmSteps()");
  1710. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  1711. prAisBssInfo = prAdapter->prAisBssInfo;
  1712. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  1713. eOriPreState = prAisFsmInfo->ePreviousState;
  1714. do {
  1715. /* Do entering Next State */
  1716. prAisFsmInfo->ePreviousState = prAisFsmInfo->eCurrentState;
  1717. #if DBG
  1718. DBGLOG(AIS, STATE, "TRANSITION: [%s] -> [%s]\n",
  1719. apucDebugAisState[prAisFsmInfo->eCurrentState], apucDebugAisState[eNextState]);
  1720. #else
  1721. DBGLOG(AIS, STATE, "[%d] TRANSITION: [%d] -> [%d]\n",
  1722. DBG_AIS_IDX, prAisFsmInfo->eCurrentState, eNextState);
  1723. #endif
  1724. /* NOTE(Kevin): This is the only place to change the eCurrentState(except initial) */
  1725. prAisFsmInfo->eCurrentState = eNextState;
  1726. fgIsTransition = (BOOLEAN) FALSE;
  1727. /* Do tasks of the State that we just entered */
  1728. switch (prAisFsmInfo->eCurrentState) {
  1729. /* NOTE(Kevin): we don't have to rearrange the sequence of following
  1730. * switch case. Instead I would like to use a common lookup table of array
  1731. * of function pointer to speed up state search.
  1732. */
  1733. case AIS_STATE_IDLE:
  1734. prAisReq = aisFsmGetNextRequest(prAdapter);
  1735. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rScanDoneTimer);
  1736. if (prAisReq == NULL || prAisReq->eReqType == AIS_REQUEST_RECONNECT) {
  1737. if (prConnSettings->fgIsConnReqIssued == TRUE &&
  1738. prConnSettings->fgIsDisconnectedByNonRequest == FALSE) {
  1739. prAisFsmInfo->fgTryScan = TRUE;
  1740. SET_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1741. SET_NET_PWR_STATE_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1742. /* sync with firmware */
  1743. nicActivateNetwork(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1744. prAisBssInfo->fgIsNetRequestInActive = FALSE;
  1745. /* reset trial count */
  1746. prAisFsmInfo->ucConnTrialCount = 0;
  1747. eNextState = AIS_STATE_SEARCH;
  1748. fgIsTransition = TRUE;
  1749. } else {
  1750. SET_NET_PWR_STATE_IDLE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1751. /* sync with firmware */
  1752. #if CFG_SUPPORT_PNO
  1753. prAisBssInfo->fgIsNetRequestInActive = TRUE;
  1754. if (prAisBssInfo->fgIsPNOEnable) {
  1755. DBGLOG(BSS, INFO,
  1756. "[BSSidx][Network]=%d PNOEnable&&OP_MODE_INFRASTRUCTURE,KEEP ACTIVE\n",
  1757. prAisBssInfo->ucBssIndex);
  1758. } else
  1759. #endif
  1760. {
  1761. UNSET_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1762. nicDeactivateNetwork(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1763. }
  1764. /* check for other pending request */
  1765. if (prAisReq && (aisFsmIsRequestPending
  1766. (prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE)) {
  1767. wlanClearScanningResult(prAdapter);
  1768. eNextState = AIS_STATE_SCAN;
  1769. fgIsTransition = TRUE;
  1770. }
  1771. }
  1772. if (prAisReq) {
  1773. /* free the message */
  1774. cnmMemFree(prAdapter, prAisReq);
  1775. }
  1776. } else if (prAisReq->eReqType == AIS_REQUEST_SCAN) {
  1777. #if CFG_SUPPORT_ROAMING
  1778. prAisFsmInfo->fgIsRoamingScanPending = FALSE;
  1779. #endif /* CFG_SUPPORT_ROAMING */
  1780. wlanClearScanningResult(prAdapter);
  1781. eNextState = AIS_STATE_SCAN;
  1782. fgIsTransition = TRUE;
  1783. /* free the message */
  1784. cnmMemFree(prAdapter, prAisReq);
  1785. } else if (prAisReq->eReqType == AIS_REQUEST_ROAMING_CONNECT
  1786. || prAisReq->eReqType == AIS_REQUEST_ROAMING_SEARCH) {
  1787. /* ignore */
  1788. /* free the message */
  1789. cnmMemFree(prAdapter, prAisReq);
  1790. } else if (prAisReq->eReqType == AIS_REQUEST_REMAIN_ON_CHANNEL) {
  1791. eNextState = AIS_STATE_REQ_REMAIN_ON_CHANNEL;
  1792. fgIsTransition = TRUE;
  1793. /* free the message */
  1794. cnmMemFree(prAdapter, prAisReq);
  1795. }
  1796. prAisFsmInfo->u4SleepInterval = AIS_BG_SCAN_INTERVAL_MIN_SEC;
  1797. break;
  1798. case AIS_STATE_SEARCH:
  1799. /* 4 <1> Search for a matched candidate and save it to prTargetBssDesc. */
  1800. #if CFG_SLT_SUPPORT
  1801. prBssDesc = prAdapter->rWifiVar.rSltInfo.prPseudoBssDesc;
  1802. #else
  1803. prBssDesc = scanSearchBssDescByPolicy(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1804. #endif
  1805. /* every time BSS join failure count is integral multiples of SCN_BSS_JOIN_FAIL_THRESOLD,
  1806. we need to scan again to find if a new BSS is here in the ESS,
  1807. this can also avoid too frequency to retry the rejected AP */
  1808. if (prAisFsmInfo->ePreviousState == AIS_STATE_LOOKING_FOR ||
  1809. ((eOriPreState == AIS_STATE_ONLINE_SCAN ||
  1810. eOriPreState == AIS_STATE_SCAN) && prAisFsmInfo->ePreviousState != eOriPreState)) {
  1811. /* if previous state is scan/online scan/looking for, don't try to scan again */
  1812. } else if (prBssDesc && prBssDesc->ucJoinFailureCount >= SCN_BSS_JOIN_FAIL_THRESOLD &&
  1813. ((prBssDesc->ucJoinFailureCount - SCN_BSS_JOIN_FAIL_THRESOLD) %
  1814. SCN_BSS_JOIN_FAIL_THRESOLD) == 0)
  1815. prBssDesc = NULL;
  1816. /* we are under Roaming Condition. */
  1817. if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
  1818. if (prAisFsmInfo->ucConnTrialCount > AIS_ROAMING_CONNECTION_TRIAL_LIMIT) {
  1819. #if CFG_SUPPORT_ROAMING
  1820. roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_CONNLIMIT);
  1821. #endif /* CFG_SUPPORT_ROAMING */
  1822. /* reset retry count */
  1823. prAisFsmInfo->ucConnTrialCount = 0;
  1824. /* abort connection trial */
  1825. prConnSettings->fgIsConnReqIssued = FALSE;
  1826. eNextState = AIS_STATE_NORMAL_TR;
  1827. fgIsTransition = TRUE;
  1828. break;
  1829. }
  1830. }
  1831. /* 4 <2> We are not under Roaming Condition. */
  1832. if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
  1833. /* 4 <2.a> If we have the matched one */
  1834. if (prBssDesc) {
  1835. /* 4 <A> Stored the Selected BSS security cipher. */
  1836. /* or later asoc req compose IE */
  1837. prAisBssInfo->u4RsnSelectedGroupCipher = prBssDesc->u4RsnSelectedGroupCipher;
  1838. prAisBssInfo->u4RsnSelectedPairwiseCipher =
  1839. prBssDesc->u4RsnSelectedPairwiseCipher;
  1840. prAisBssInfo->u4RsnSelectedAKMSuite = prBssDesc->u4RsnSelectedAKMSuite;
  1841. /* 4 <B> Do STATE transition and update current Operation Mode. */
  1842. if (prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE) {
  1843. prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
  1844. /* Record the target BSS_DESC_T for next STATE. */
  1845. prAisFsmInfo->prTargetBssDesc = prBssDesc;
  1846. /* Transit to channel acquire */
  1847. eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
  1848. fgIsTransition = TRUE;
  1849. /* increase connection trial count */
  1850. prAisFsmInfo->ucConnTrialCount++;
  1851. }
  1852. #if CFG_SUPPORT_ADHOC
  1853. else if (prBssDesc->eBSSType == BSS_TYPE_IBSS) {
  1854. prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
  1855. /* Record the target BSS_DESC_T for next STATE. */
  1856. prAisFsmInfo->prTargetBssDesc = prBssDesc;
  1857. eNextState = AIS_STATE_IBSS_MERGE;
  1858. fgIsTransition = TRUE;
  1859. }
  1860. #endif /* CFG_SUPPORT_ADHOC */
  1861. else {
  1862. ASSERT(0);
  1863. eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
  1864. fgIsTransition = TRUE;
  1865. }
  1866. }
  1867. /* 4 <2.b> If we don't have the matched one */
  1868. else {
  1869. /* increase connection trial count for infrastructure connection */
  1870. if (prConnSettings->eOPMode == NET_TYPE_INFRA)
  1871. prAisFsmInfo->ucConnTrialCount++;
  1872. /* 4 <A> Try to SCAN */
  1873. if (prAisFsmInfo->fgTryScan) {
  1874. eNextState = AIS_STATE_LOOKING_FOR;
  1875. fgIsTransition = TRUE;
  1876. }
  1877. /* 4 <B> We've do SCAN already, now wait in some STATE. */
  1878. else {
  1879. eNextState = aisFsmStateSearchAction(prAdapter,
  1880. AIS_FSM_STATE_SEARCH_ACTION_PHASE_0);
  1881. fgIsTransition = TRUE;
  1882. }
  1883. }
  1884. }
  1885. /* 4 <3> We are under Roaming Condition. */
  1886. else { /* prAdapter->eConnectionState == MEDIA_STATE_CONNECTED. */
  1887. /* 4 <3.a> This BSS_DESC_T is our AP. */
  1888. /* NOTE(Kevin 2008/05/16): Following cases will go back to NORMAL_TR.
  1889. * CASE I: During Roaming, APP(WZC/NDISTEST) change the connection
  1890. * settings. That make we can NOT match the original AP, so the
  1891. * prBssDesc is NULL.
  1892. * CASE II: The same reason as CASE I. Because APP change the
  1893. * eOPMode to other network type in connection setting
  1894. * (e.g. NET_TYPE_IBSS), so the BssDesc become the IBSS node.
  1895. * (For CASE I/II, before WZC/NDISTEST set the OID_SSID, it will change
  1896. * other parameters in connection setting first. So if we do roaming
  1897. * at the same time, it will hit these cases.)
  1898. *
  1899. * CASE III: Normal case, we can't find other candidate to roam
  1900. * out, so only the current AP will be matched.
  1901. *
  1902. * CASE VI: Timestamp of the current AP might be reset
  1903. */
  1904. if (prAisBssInfo->ucReasonOfDisconnect != DISCONNECT_REASON_CODE_REASSOCIATION &&
  1905. ((!prBssDesc) || /* CASE I */
  1906. (prBssDesc->eBSSType != BSS_TYPE_INFRASTRUCTURE) || /* CASE II */
  1907. (prBssDesc->fgIsConnected) || /* CASE III */
  1908. (EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID))) /* CASE VI */) {
  1909. #if DBG
  1910. if ((prBssDesc) && (prBssDesc->fgIsConnected))
  1911. ASSERT(EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
  1912. #endif /* DBG */
  1913. /* We already associated with it, go back to NORMAL_TR */
  1914. /* TODO(Kevin): Roaming Fail */
  1915. #if CFG_SUPPORT_ROAMING
  1916. roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_NOCANDIDATE);
  1917. #endif /* CFG_SUPPORT_ROAMING */
  1918. /* Retreat to NORMAL_TR state */
  1919. eNextState = AIS_STATE_NORMAL_TR;
  1920. fgIsTransition = TRUE;
  1921. }
  1922. /* 4 <3.b> Try to roam out for JOIN this BSS_DESC_T. */
  1923. else {
  1924. if (prBssDesc == NULL) {
  1925. fgIsTransition = TRUE;
  1926. eNextState = aisFsmStateSearchAction(prAdapter,
  1927. AIS_FSM_STATE_SEARCH_ACTION_PHASE_1);
  1928. } else {
  1929. aisFsmStateSearchAction(prAdapter, AIS_FSM_STATE_SEARCH_ACTION_PHASE_2);
  1930. /* 4 <A> Record the target BSS_DESC_T for next STATE. */
  1931. prAisFsmInfo->prTargetBssDesc = prBssDesc;
  1932. /* tyhsu: increase connection trial count */
  1933. prAisFsmInfo->ucConnTrialCount++;
  1934. /* Transit to channel acquire */
  1935. eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
  1936. fgIsTransition = TRUE;
  1937. }
  1938. }
  1939. }
  1940. break;
  1941. case AIS_STATE_WAIT_FOR_NEXT_SCAN:
  1942. DBGLOG(AIS, LOUD, "SCAN: Idle Begin - Current Time = %u\n", kalGetTimeTick());
  1943. cnmTimerStartTimer(prAdapter,
  1944. &prAisFsmInfo->rBGScanTimer, SEC_TO_MSEC(prAisFsmInfo->u4SleepInterval));
  1945. SET_NET_PWR_STATE_IDLE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1946. if (prAisFsmInfo->u4SleepInterval < AIS_BG_SCAN_INTERVAL_MAX_SEC)
  1947. prAisFsmInfo->u4SleepInterval <<= 1;
  1948. break;
  1949. case AIS_STATE_SCAN:
  1950. case AIS_STATE_ONLINE_SCAN:
  1951. case AIS_STATE_LOOKING_FOR:
  1952. if (!IS_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex)) {
  1953. SET_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1954. /* sync with firmware */
  1955. nicActivateNetwork(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  1956. prAisBssInfo->fgIsNetRequestInActive = FALSE;
  1957. }
  1958. /* IE length decision */
  1959. if (prAisFsmInfo->u4ScanIELength > 0) {
  1960. u2ScanIELen = (UINT_16) prAisFsmInfo->u4ScanIELength;
  1961. } else {
  1962. #if CFG_SUPPORT_WPS2
  1963. u2ScanIELen = prAdapter->prGlueInfo->u2WSCIELen;
  1964. #else
  1965. u2ScanIELen = 0;
  1966. #endif
  1967. }
  1968. prScanReqMsg = (P_MSG_SCN_SCAN_REQ_V2) cnmMemAlloc(prAdapter,
  1969. RAM_TYPE_MSG,
  1970. OFFSET_OF
  1971. (MSG_SCN_SCAN_REQ_V2, aucIE) + u2ScanIELen);
  1972. if (!prScanReqMsg) {
  1973. ASSERT(0); /* Can't trigger SCAN FSM */
  1974. return;
  1975. }
  1976. prScanReqMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_REQ_V2;
  1977. prScanReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfScanReq;
  1978. prScanReqMsg->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  1979. #if CFG_SUPPORT_RDD_TEST_MODE
  1980. prScanReqMsg->eScanType = SCAN_TYPE_PASSIVE_SCAN;
  1981. #else
  1982. if (prAisFsmInfo->eCurrentState == AIS_STATE_SCAN
  1983. || prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
  1984. if (prAisFsmInfo->ucScanSSIDNum == 0) {
  1985. #if CFG_SUPPORT_AIS_PASSIVE_SCAN
  1986. prScanReqMsg->eScanType = SCAN_TYPE_PASSIVE_SCAN;
  1987. prScanReqMsg->ucSSIDType = 0;
  1988. prScanReqMsg->ucSSIDNum = 0;
  1989. #else
  1990. prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN;
  1991. prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_WILDCARD;
  1992. prScanReqMsg->ucSSIDNum = 0;
  1993. #endif
  1994. } else if (prAisFsmInfo->ucScanSSIDNum == 1
  1995. && prAisFsmInfo->arScanSSID[0].u4SsidLen == 0) {
  1996. prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN;
  1997. prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_WILDCARD;
  1998. prScanReqMsg->ucSSIDNum = 0;
  1999. } else {
  2000. prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN;
  2001. prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
  2002. prScanReqMsg->ucSSIDNum = prAisFsmInfo->ucScanSSIDNum;
  2003. prScanReqMsg->prSsid = prAisFsmInfo->arScanSSID;
  2004. }
  2005. } else {
  2006. prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN;
  2007. COPY_SSID(prAisFsmInfo->rRoamingSSID.aucSsid,
  2008. prAisFsmInfo->rRoamingSSID.u4SsidLen,
  2009. prConnSettings->aucSSID, prConnSettings->ucSSIDLen);
  2010. /* Scan for determined SSID */
  2011. prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
  2012. prScanReqMsg->ucSSIDNum = 1;
  2013. prScanReqMsg->prSsid = &(prAisFsmInfo->rRoamingSSID);
  2014. }
  2015. #endif
  2016. /* using default channel dwell time/timeout value */
  2017. prScanReqMsg->u2ProbeDelay = 0;
  2018. prScanReqMsg->u2ChannelDwellTime = 0;
  2019. prScanReqMsg->u2TimeoutValue = 0;
  2020. /* check if tethering is running and need to fix on specific channel */
  2021. if (cnmAisInfraChannelFixed(prAdapter, &eBand, &ucChannel) == TRUE) {
  2022. prScanReqMsg->eScanChannel = SCAN_CHANNEL_SPECIFIED;
  2023. prScanReqMsg->ucChannelListNum = 1;
  2024. prScanReqMsg->arChnlInfoList[0].eBand = eBand;
  2025. prScanReqMsg->arChnlInfoList[0].ucChannelNum = ucChannel;
  2026. } else if (prAdapter->aePreferBand[prAdapter->prAisBssInfo->ucBssIndex] == BAND_NULL) {
  2027. if (prAdapter->fgEnable5GBand == TRUE)
  2028. prScanReqMsg->eScanChannel = SCAN_CHANNEL_FULL;
  2029. else
  2030. prScanReqMsg->eScanChannel = SCAN_CHANNEL_2G4;
  2031. } else if (prAdapter->aePreferBand[prAdapter->prAisBssInfo->ucBssIndex] == BAND_2G4) {
  2032. prScanReqMsg->eScanChannel = SCAN_CHANNEL_2G4;
  2033. } else if (prAdapter->aePreferBand[prAdapter->prAisBssInfo->ucBssIndex] == BAND_5G) {
  2034. prScanReqMsg->eScanChannel = SCAN_CHANNEL_5G;
  2035. } else {
  2036. prScanReqMsg->eScanChannel = SCAN_CHANNEL_FULL;
  2037. ASSERT(0);
  2038. }
  2039. if (prAisFsmInfo->u4ScanIELength > 0) {
  2040. kalMemCopy(prScanReqMsg->aucIE, prAisFsmInfo->aucScanIEBuf,
  2041. prAisFsmInfo->u4ScanIELength);
  2042. } else {
  2043. #if CFG_SUPPORT_WPS2
  2044. if (prAdapter->prGlueInfo->u2WSCIELen > 0) {
  2045. kalMemCopy(prScanReqMsg->aucIE,
  2046. &prAdapter->prGlueInfo->aucWSCIE, prAdapter->prGlueInfo->u2WSCIELen);
  2047. }
  2048. }
  2049. #endif
  2050. prScanReqMsg->u2IELen = u2ScanIELen;
  2051. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prScanReqMsg, MSG_SEND_METHOD_BUF);
  2052. prAisFsmInfo->fgTryScan = FALSE; /* Will enable background sleep for infrastructure */
  2053. break;
  2054. case AIS_STATE_REQ_CHANNEL_JOIN:
  2055. /* send message to CNM for acquiring channel */
  2056. prMsgChReq = (P_MSG_CH_REQ_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_REQ_T));
  2057. if (!prMsgChReq) {
  2058. ASSERT(0); /* Can't indicate CNM for channel acquiring */
  2059. return;
  2060. }
  2061. prMsgChReq->rMsgHdr.eMsgId = MID_MNY_CNM_CH_REQ;
  2062. prMsgChReq->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  2063. prMsgChReq->ucTokenID = ++prAisFsmInfo->ucSeqNumOfChReq;
  2064. prMsgChReq->eReqType = CH_REQ_TYPE_JOIN;
  2065. prMsgChReq->u4MaxInterval = AIS_JOIN_CH_REQUEST_INTERVAL;
  2066. prMsgChReq->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
  2067. prMsgChReq->eRfSco = prAisFsmInfo->prTargetBssDesc->eSco;
  2068. prMsgChReq->eRfBand = prAisFsmInfo->prTargetBssDesc->eBand;
  2069. /* To do: check if 80/160MHz bandwidth is needed here */
  2070. prMsgChReq->eRfChannelWidth = prAisFsmInfo->prTargetBssDesc->eChannelWidth;
  2071. prMsgChReq->ucRfCenterFreqSeg1 = prAisFsmInfo->prTargetBssDesc->ucCenterFreqS1;
  2072. prMsgChReq->ucRfCenterFreqSeg2 = prAisFsmInfo->prTargetBssDesc->ucCenterFreqS2;
  2073. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prMsgChReq, MSG_SEND_METHOD_BUF);
  2074. prAisFsmInfo->fgIsChannelRequested = TRUE;
  2075. break;
  2076. case AIS_STATE_JOIN:
  2077. aisFsmStateInit_JOIN(prAdapter, prAisFsmInfo->prTargetBssDesc);
  2078. break;
  2079. case AIS_STATE_JOIN_FAILURE:
  2080. prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
  2081. nicMediaJoinFailure(prAdapter, prAdapter->prAisBssInfo->ucBssIndex, WLAN_STATUS_JOIN_TIMEOUT);
  2082. eNextState = AIS_STATE_IDLE;
  2083. fgIsTransition = TRUE;
  2084. break;
  2085. #if CFG_SUPPORT_ADHOC
  2086. case AIS_STATE_IBSS_ALONE:
  2087. aisFsmStateInit_IBSS_ALONE(prAdapter);
  2088. break;
  2089. case AIS_STATE_IBSS_MERGE:
  2090. aisFsmStateInit_IBSS_MERGE(prAdapter, prAisFsmInfo->prTargetBssDesc);
  2091. break;
  2092. #endif /* CFG_SUPPORT_ADHOC */
  2093. case AIS_STATE_NORMAL_TR:
  2094. if (prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
  2095. /* Don't do anything when rJoinTimeoutTimer is still ticking */
  2096. } else {
  2097. /* 1. Process for pending scan */
  2098. if (aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
  2099. wlanClearScanningResult(prAdapter);
  2100. eNextState = AIS_STATE_ONLINE_SCAN;
  2101. fgIsTransition = TRUE;
  2102. }
  2103. /* 2. Process for pending roaming scan */
  2104. else if (aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE) == TRUE) {
  2105. eNextState = AIS_STATE_LOOKING_FOR;
  2106. fgIsTransition = TRUE;
  2107. }
  2108. /* 3. Process for pending roaming scan */
  2109. else if (aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE) == TRUE) {
  2110. eNextState = AIS_STATE_SEARCH;
  2111. fgIsTransition = TRUE;
  2112. } else
  2113. if (aisFsmIsRequestPending
  2114. (prAdapter, AIS_REQUEST_REMAIN_ON_CHANNEL, TRUE) == TRUE) {
  2115. eNextState = AIS_STATE_REQ_REMAIN_ON_CHANNEL;
  2116. fgIsTransition = TRUE;
  2117. }
  2118. }
  2119. break;
  2120. case AIS_STATE_DISCONNECTING:
  2121. /* send for deauth frame for disconnection */
  2122. authSendDeauthFrame(prAdapter,
  2123. prAisBssInfo,
  2124. prAisBssInfo->prStaRecOfAP,
  2125. (P_SW_RFB_T) NULL, REASON_CODE_DEAUTH_LEAVING_BSS, aisDeauthXmitComplete);
  2126. cnmTimerStartTimer(prAdapter, &prAisFsmInfo->rDeauthDoneTimer, 100);
  2127. break;
  2128. case AIS_STATE_REQ_REMAIN_ON_CHANNEL:
  2129. /* send message to CNM for acquiring channel */
  2130. prMsgChReq = (P_MSG_CH_REQ_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_REQ_T));
  2131. if (!prMsgChReq) {
  2132. ASSERT(0); /* Can't indicate CNM for channel acquiring */
  2133. return;
  2134. }
  2135. /* release channel */
  2136. aisFsmReleaseCh(prAdapter);
  2137. /* zero-ize */
  2138. kalMemZero(prMsgChReq, sizeof(MSG_CH_REQ_T));
  2139. /* filling */
  2140. prMsgChReq->rMsgHdr.eMsgId = MID_MNY_CNM_CH_REQ;
  2141. prMsgChReq->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  2142. prMsgChReq->ucTokenID = ++prAisFsmInfo->ucSeqNumOfChReq;
  2143. prMsgChReq->eReqType = CH_REQ_TYPE_JOIN;
  2144. prMsgChReq->u4MaxInterval = prAisFsmInfo->rChReqInfo.u4DurationMs;
  2145. prMsgChReq->ucPrimaryChannel = prAisFsmInfo->rChReqInfo.ucChannelNum;
  2146. prMsgChReq->eRfSco = prAisFsmInfo->rChReqInfo.eSco;
  2147. prMsgChReq->eRfBand = prAisFsmInfo->rChReqInfo.eBand;
  2148. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prMsgChReq, MSG_SEND_METHOD_BUF);
  2149. prAisFsmInfo->fgIsChannelRequested = TRUE;
  2150. break;
  2151. case AIS_STATE_REMAIN_ON_CHANNEL:
  2152. SET_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  2153. /* sync with firmware */
  2154. nicActivateNetwork(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  2155. prAisBssInfo->fgIsNetRequestInActive = FALSE;
  2156. break;
  2157. default:
  2158. ASSERT(0); /* Make sure we have handle all STATEs */
  2159. break;
  2160. }
  2161. } while (fgIsTransition);
  2162. return;
  2163. } /* end of aisFsmSteps() */
  2164. enum _ENUM_AIS_STATE_T aisFsmStateSearchAction(IN struct _ADAPTER_T *prAdapter, UINT_8 ucPhase)
  2165. {
  2166. struct _CONNECTION_SETTINGS_T *prConnSettings;
  2167. struct _BSS_INFO_T *prAisBssInfo;
  2168. struct _AIS_FSM_INFO_T *prAisFsmInfo;
  2169. struct _BSS_DESC_T *prBssDesc;
  2170. enum _ENUM_AIS_STATE_T eState = AIS_STATE_IDLE;
  2171. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  2172. prAisBssInfo = prAdapter->prAisBssInfo;
  2173. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  2174. #if CFG_SLT_SUPPORT
  2175. prBssDesc = prAdapter->rWifiVar.rSltInfo.prPseudoBssDesc;
  2176. #else
  2177. prBssDesc = scanSearchBssDescByPolicy(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  2178. #endif
  2179. if (ucPhase == AIS_FSM_STATE_SEARCH_ACTION_PHASE_0) {
  2180. if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
  2181. /* issue reconnect request, */
  2182. /*and retreat to idle state for scheduling */
  2183. aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
  2184. eState = AIS_STATE_IDLE;
  2185. }
  2186. #if CFG_SUPPORT_ADHOC
  2187. else if ((prConnSettings->eOPMode == NET_TYPE_IBSS)
  2188. || (prConnSettings->eOPMode == NET_TYPE_AUTO_SWITCH)
  2189. || (prConnSettings->eOPMode == NET_TYPE_DEDICATED_IBSS)) {
  2190. prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
  2191. prAisFsmInfo->prTargetBssDesc = NULL;
  2192. eState = AIS_STATE_IBSS_ALONE;
  2193. }
  2194. #endif /* CFG_SUPPORT_ADHOC */
  2195. else {
  2196. ASSERT(0);
  2197. eState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
  2198. }
  2199. } else if (ucPhase == AIS_FSM_STATE_SEARCH_ACTION_PHASE_1) {
  2200. /* increase connection trial count for infrastructure connection */
  2201. if (prConnSettings->eOPMode == NET_TYPE_INFRA)
  2202. prAisFsmInfo->ucConnTrialCount++;
  2203. /* 4 <A> Try to SCAN */
  2204. if (prAisFsmInfo->fgTryScan)
  2205. eState = AIS_STATE_LOOKING_FOR;
  2206. /* 4 <B> We've do SCAN already, now wait in some STATE. */
  2207. else {
  2208. if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
  2209. /* issue reconnect request, and */
  2210. /* retreat to idle state for scheduling */
  2211. aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
  2212. eState = AIS_STATE_IDLE;
  2213. }
  2214. #if CFG_SUPPORT_ADHOC
  2215. else if ((prConnSettings->eOPMode == NET_TYPE_IBSS)
  2216. || (prConnSettings->eOPMode == NET_TYPE_AUTO_SWITCH)
  2217. || (prConnSettings->eOPMode == NET_TYPE_DEDICATED_IBSS)) {
  2218. prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
  2219. prAisFsmInfo->prTargetBssDesc = NULL;
  2220. eState = AIS_STATE_IBSS_ALONE;
  2221. }
  2222. #endif /* CFG_SUPPORT_ADHOC */
  2223. else {
  2224. ASSERT(0);
  2225. eState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
  2226. }
  2227. }
  2228. } else {
  2229. #if DBG
  2230. if (prAisBssInfo->ucReasonOfDisconnect != DISCONNECT_REASON_CODE_REASSOCIATION)
  2231. ASSERT(UNEQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
  2232. #endif /* DBG */
  2233. }
  2234. return eState;
  2235. }
  2236. /*----------------------------------------------------------------------------*/
  2237. /*!
  2238. * \brief
  2239. *
  2240. * \param[in]
  2241. *
  2242. * \return none
  2243. */
  2244. /*----------------------------------------------------------------------------*/
  2245. VOID aisFsmRunEventScanDone(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  2246. {
  2247. P_MSG_SCN_SCAN_DONE prScanDoneMsg;
  2248. P_AIS_FSM_INFO_T prAisFsmInfo;
  2249. ENUM_AIS_STATE_T eNextState;
  2250. UINT_8 ucSeqNumOfCompMsg;
  2251. P_CONNECTION_SETTINGS_T prConnSettings;
  2252. DEBUGFUNC("aisFsmRunEventScanDone()");
  2253. ASSERT(prAdapter);
  2254. ASSERT(prMsgHdr);
  2255. DBGLOG(AIS, INFO, "ScanDone\n");
  2256. DBGLOG(AIS, LOUD, "EVENT-SCAN DONE: Current Time = %u\n", kalGetTimeTick());
  2257. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  2258. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  2259. prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) prMsgHdr;
  2260. ASSERT(prScanDoneMsg->ucBssIndex == prAdapter->prAisBssInfo->ucBssIndex);
  2261. ucSeqNumOfCompMsg = prScanDoneMsg->ucSeqNum;
  2262. cnmMemFree(prAdapter, prMsgHdr);
  2263. eNextState = prAisFsmInfo->eCurrentState;
  2264. if (ucSeqNumOfCompMsg != prAisFsmInfo->ucSeqNumOfScanReq) {
  2265. DBGLOG(AIS, WARN, "SEQ NO of AIS SCN DONE MSG is not matched.\n");
  2266. } else {
  2267. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rScanDoneTimer);
  2268. switch (prAisFsmInfo->eCurrentState) {
  2269. case AIS_STATE_SCAN:
  2270. prConnSettings->fgIsScanReqIssued = FALSE;
  2271. /* reset scan IE buffer */
  2272. prAisFsmInfo->u4ScanIELength = 0;
  2273. kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
  2274. eNextState = AIS_STATE_IDLE;
  2275. #if CFG_SUPPORT_AGPS_ASSIST
  2276. scanReportScanResultToAgps(prAdapter);
  2277. #endif
  2278. break;
  2279. case AIS_STATE_ONLINE_SCAN:
  2280. prConnSettings->fgIsScanReqIssued = FALSE;
  2281. /* reset scan IE buffer */
  2282. prAisFsmInfo->u4ScanIELength = 0;
  2283. kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
  2284. #if CFG_SUPPORT_ROAMING
  2285. eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
  2286. #else
  2287. eNextState = AIS_STATE_NORMAL_TR;
  2288. #endif /* CFG_SUPPORT_ROAMING */
  2289. #if CFG_SUPPORT_AGPS_ASSIST
  2290. scanReportScanResultToAgps(prAdapter);
  2291. #endif
  2292. break;
  2293. case AIS_STATE_LOOKING_FOR:
  2294. #if CFG_SUPPORT_ROAMING
  2295. eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
  2296. #else
  2297. eNextState = AIS_STATE_SEARCH;
  2298. #endif /* CFG_SUPPORT_ROAMING */
  2299. break;
  2300. default:
  2301. break;
  2302. }
  2303. }
  2304. if (eNextState != prAisFsmInfo->eCurrentState)
  2305. aisFsmSteps(prAdapter, eNextState);
  2306. } /* end of aisFsmRunEventScanDone() */
  2307. /*----------------------------------------------------------------------------*/
  2308. /*!
  2309. * \brief
  2310. *
  2311. * \param[in]
  2312. *
  2313. * \return none
  2314. */
  2315. /*----------------------------------------------------------------------------*/
  2316. VOID aisFsmRunEventAbort(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  2317. {
  2318. P_MSG_AIS_ABORT_T prAisAbortMsg;
  2319. P_AIS_FSM_INFO_T prAisFsmInfo;
  2320. UINT_8 ucReasonOfDisconnect;
  2321. BOOLEAN fgDelayIndication;
  2322. P_CONNECTION_SETTINGS_T prConnSettings;
  2323. DEBUGFUNC("aisFsmRunEventAbort()");
  2324. ASSERT(prAdapter);
  2325. ASSERT(prMsgHdr);
  2326. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  2327. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  2328. /* 4 <1> Extract information of Abort Message and then free memory. */
  2329. prAisAbortMsg = (P_MSG_AIS_ABORT_T) prMsgHdr;
  2330. ucReasonOfDisconnect = prAisAbortMsg->ucReasonOfDisconnect;
  2331. fgDelayIndication = prAisAbortMsg->fgDelayIndication;
  2332. cnmMemFree(prAdapter, prMsgHdr);
  2333. #if DBG
  2334. DBGLOG(AIS, LOUD, "EVENT-ABORT: Current State %s\n", apucDebugAisState[prAisFsmInfo->eCurrentState]);
  2335. #else
  2336. DBGLOG(AIS, LOUD, "[%d] EVENT-ABORT: Current State [%d]\n", DBG_AIS_IDX, prAisFsmInfo->eCurrentState);
  2337. #endif
  2338. /* record join request time */
  2339. GET_CURRENT_SYSTIME(&(prAisFsmInfo->rJoinReqTime));
  2340. /* 4 <2> clear previous pending connection request and insert new one */
  2341. if (ucReasonOfDisconnect == DISCONNECT_REASON_CODE_DEAUTHENTICATED
  2342. || ucReasonOfDisconnect == DISCONNECT_REASON_CODE_DISASSOCIATED) {
  2343. prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
  2344. } else {
  2345. prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
  2346. }
  2347. /* to support user space triggered roaming */
  2348. if (ucReasonOfDisconnect == DISCONNECT_REASON_CODE_REASSOCIATION &&
  2349. prAisFsmInfo->eCurrentState != AIS_STATE_DISCONNECTING) {
  2350. if (prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR &&
  2351. prAisFsmInfo->fgIsInfraChannelFinished == TRUE) {
  2352. aisFsmSteps(prAdapter, AIS_STATE_SEARCH);
  2353. } else {
  2354. aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
  2355. aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
  2356. aisFsmInsertRequest(prAdapter, AIS_REQUEST_ROAMING_CONNECT);
  2357. }
  2358. return;
  2359. }
  2360. aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
  2361. aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
  2362. if (prAisFsmInfo->eCurrentState != AIS_STATE_DISCONNECTING) {
  2363. /* 4 <3> invoke abort handler */
  2364. aisFsmStateAbort(prAdapter, ucReasonOfDisconnect, fgDelayIndication);
  2365. }
  2366. } /* end of aisFsmRunEventAbort() */
  2367. /*----------------------------------------------------------------------------*/
  2368. /*!
  2369. * \brief This function handles AIS-FSM abort event/command
  2370. *
  2371. * \param[in] prAdapter Pointer of ADAPTER_T
  2372. * ucReasonOfDisconnect Reason for disonnection
  2373. * fgDelayIndication Option to delay disconnection indication
  2374. *
  2375. * \return none
  2376. */
  2377. /*----------------------------------------------------------------------------*/
  2378. VOID aisFsmStateAbort(IN P_ADAPTER_T prAdapter, UINT_8 ucReasonOfDisconnect, BOOLEAN fgDelayIndication)
  2379. {
  2380. P_AIS_FSM_INFO_T prAisFsmInfo;
  2381. P_BSS_INFO_T prAisBssInfo;
  2382. P_CONNECTION_SETTINGS_T prConnSettings;
  2383. BOOLEAN fgIsCheckConnected;
  2384. ASSERT(prAdapter);
  2385. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  2386. prAisBssInfo = prAdapter->prAisBssInfo;
  2387. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  2388. fgIsCheckConnected = FALSE;
  2389. /* 4 <1> Save information of Abort Message and then free memory. */
  2390. prAisBssInfo->ucReasonOfDisconnect = ucReasonOfDisconnect;
  2391. /* 4 <2> Abort current job. */
  2392. switch (prAisFsmInfo->eCurrentState) {
  2393. case AIS_STATE_IDLE:
  2394. case AIS_STATE_SEARCH:
  2395. case AIS_STATE_JOIN_FAILURE:
  2396. break;
  2397. case AIS_STATE_WAIT_FOR_NEXT_SCAN:
  2398. /* Do cancel timer */
  2399. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
  2400. /* in case roaming is triggered */
  2401. fgIsCheckConnected = TRUE;
  2402. break;
  2403. case AIS_STATE_SCAN:
  2404. /* Do abort SCAN */
  2405. aisFsmStateAbort_SCAN(prAdapter);
  2406. /* queue for later handling */
  2407. if (aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE)
  2408. aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
  2409. break;
  2410. case AIS_STATE_LOOKING_FOR:
  2411. /* Do abort SCAN */
  2412. aisFsmStateAbort_SCAN(prAdapter);
  2413. /* in case roaming is triggered */
  2414. fgIsCheckConnected = TRUE;
  2415. break;
  2416. case AIS_STATE_REQ_CHANNEL_JOIN:
  2417. /* Release channel to CNM */
  2418. aisFsmReleaseCh(prAdapter);
  2419. /* in case roaming is triggered */
  2420. fgIsCheckConnected = TRUE;
  2421. break;
  2422. case AIS_STATE_JOIN:
  2423. /* Do abort JOIN */
  2424. aisFsmStateAbort_JOIN(prAdapter);
  2425. /* in case roaming is triggered */
  2426. fgIsCheckConnected = TRUE;
  2427. break;
  2428. #if CFG_SUPPORT_ADHOC
  2429. case AIS_STATE_IBSS_ALONE:
  2430. case AIS_STATE_IBSS_MERGE:
  2431. aisFsmStateAbort_IBSS(prAdapter);
  2432. break;
  2433. #endif /* CFG_SUPPORT_ADHOC */
  2434. case AIS_STATE_ONLINE_SCAN:
  2435. /* Do abort SCAN */
  2436. aisFsmStateAbort_SCAN(prAdapter);
  2437. /* queue for later handling */
  2438. if (aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE)
  2439. aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
  2440. fgIsCheckConnected = TRUE;
  2441. break;
  2442. case AIS_STATE_NORMAL_TR:
  2443. fgIsCheckConnected = TRUE;
  2444. break;
  2445. case AIS_STATE_DISCONNECTING:
  2446. /* Do abort NORMAL_TR */
  2447. aisFsmStateAbort_NORMAL_TR(prAdapter);
  2448. break;
  2449. case AIS_STATE_REQ_REMAIN_ON_CHANNEL:
  2450. /* release channel */
  2451. aisFsmReleaseCh(prAdapter);
  2452. break;
  2453. case AIS_STATE_REMAIN_ON_CHANNEL:
  2454. /* 1. release channel */
  2455. aisFsmReleaseCh(prAdapter);
  2456. /* 2. stop channel timeout timer */
  2457. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rChannelTimeoutTimer);
  2458. break;
  2459. default:
  2460. break;
  2461. }
  2462. if (fgIsCheckConnected && (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState)) {
  2463. /* switch into DISCONNECTING state for sending DEAUTH if necessary */
  2464. if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE &&
  2465. prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_NEW_CONNECTION &&
  2466. prAisBssInfo->prStaRecOfAP && prAisBssInfo->prStaRecOfAP->fgIsInUse) {
  2467. aisFsmSteps(prAdapter, AIS_STATE_DISCONNECTING);
  2468. return;
  2469. }
  2470. /* Do abort NORMAL_TR */
  2471. aisFsmStateAbort_NORMAL_TR(prAdapter);
  2472. }
  2473. aisFsmDisconnect(prAdapter, fgDelayIndication);
  2474. } /* end of aisFsmStateAbort() */
  2475. /*----------------------------------------------------------------------------*/
  2476. /*!
  2477. * @brief This function will handle the Join Complete Event from SAA FSM for AIS FSM
  2478. *
  2479. * @param[in] prMsgHdr Message of Join Complete of SAA FSM.
  2480. *
  2481. * @return (none)
  2482. */
  2483. /*----------------------------------------------------------------------------*/
  2484. VOID aisFsmRunEventJoinComplete(IN struct _ADAPTER_T *prAdapter, IN struct _MSG_HDR_T *prMsgHdr)
  2485. {
  2486. struct _MSG_SAA_FSM_COMP_T *prJoinCompMsg;
  2487. struct _AIS_FSM_INFO_T *prAisFsmInfo;
  2488. enum _ENUM_AIS_STATE_T eNextState;
  2489. struct _SW_RFB_T *prAssocRspSwRfb;
  2490. DEBUGFUNC("aisFsmRunEventJoinComplete()");
  2491. ASSERT(prMsgHdr);
  2492. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  2493. prJoinCompMsg = (struct _MSG_SAA_FSM_COMP_T *)prMsgHdr;
  2494. prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
  2495. eNextState = prAisFsmInfo->eCurrentState;
  2496. /* Check State and SEQ NUM */
  2497. if (prAisFsmInfo->eCurrentState == AIS_STATE_JOIN) {
  2498. /* Check SEQ NUM */
  2499. if (prJoinCompMsg->ucSeqNum == prAisFsmInfo->ucSeqNumOfReqMsg)
  2500. eNextState = aisFsmJoinCompleteAction(prAdapter, prMsgHdr);
  2501. #if DBG
  2502. else
  2503. DBGLOG(AIS, WARN, "SEQ NO of AIS JOIN COMP MSG is not matched.\n");
  2504. #endif /* DBG */
  2505. }
  2506. if (eNextState != prAisFsmInfo->eCurrentState)
  2507. aisFsmSteps(prAdapter, eNextState);
  2508. if (prAssocRspSwRfb)
  2509. nicRxReturnRFB(prAdapter, prAssocRspSwRfb);
  2510. cnmMemFree(prAdapter, prMsgHdr);
  2511. } /* end of aisFsmRunEventJoinComplete() */
  2512. enum _ENUM_AIS_STATE_T aisFsmJoinCompleteAction(IN struct _ADAPTER_T *prAdapter, IN struct _MSG_HDR_T *prMsgHdr)
  2513. {
  2514. struct _MSG_SAA_FSM_COMP_T *prJoinCompMsg;
  2515. struct _AIS_FSM_INFO_T *prAisFsmInfo;
  2516. enum _ENUM_AIS_STATE_T eNextState;
  2517. struct _STA_RECORD_T *prStaRec;
  2518. struct _SW_RFB_T *prAssocRspSwRfb;
  2519. struct _BSS_INFO_T *prAisBssInfo;
  2520. OS_SYSTIME rCurrentTime;
  2521. UINT_8 aucP2pSsid[] = CTIA_MAGIC_SSID;
  2522. DEBUGFUNC("aisFsmJoinCompleteAction()");
  2523. ASSERT(prMsgHdr);
  2524. GET_CURRENT_SYSTIME(&rCurrentTime);
  2525. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  2526. prJoinCompMsg = (struct _MSG_SAA_FSM_COMP_T *)prMsgHdr;
  2527. prStaRec = prJoinCompMsg->prStaRec;
  2528. prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
  2529. prAisBssInfo = prAdapter->prAisBssInfo;
  2530. eNextState = prAisFsmInfo->eCurrentState;
  2531. do {
  2532. /* 4 <1> JOIN was successful */
  2533. if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
  2534. /* 1. Reset retry count */
  2535. prAisFsmInfo->ucConnTrialCount = 0;
  2536. /* Completion of roaming */
  2537. if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
  2538. #if CFG_SUPPORT_ROAMING
  2539. /* 2. Deactivate previous BSS */
  2540. aisFsmRoamingDisconnectPrevAP(prAdapter, prStaRec);
  2541. /* 3. Update bss based on roaming staRec */
  2542. aisUpdateBssInfoForRoamingAP(prAdapter, prStaRec, prAssocRspSwRfb);
  2543. #endif /* CFG_SUPPORT_ROAMING */
  2544. } else {
  2545. /* 4 <1.1> Change FW's Media State immediately. */
  2546. aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
  2547. /* 4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have. */
  2548. if ((prAisBssInfo->prStaRecOfAP) &&
  2549. (prAisBssInfo->prStaRecOfAP != prStaRec) &&
  2550. (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
  2551. cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
  2552. cnmStaRecFree(prAdapter, prAisBssInfo->prStaRecOfAP);
  2553. }
  2554. /* For temp solution, need to refine */
  2555. /* 4 <1.4> Update BSS_INFO_T */
  2556. aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
  2557. /* 4 <1.3> Activate current AP's STA_RECORD_T in Driver. */
  2558. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
  2559. /* 4 <1.5> Update RSSI if necessary */
  2560. nicUpdateRSSI(prAdapter,
  2561. prAdapter->prAisBssInfo->ucBssIndex,
  2562. (INT_8) (RCPI_TO_dBm(prStaRec->ucRCPI)), 0);
  2563. /* 4 <1.6> Indicate Connected Event to Host immediately. */
  2564. /* Require BSSID, Association ID, Beacon Interval */
  2565. /* .. from AIS_BSS_INFO_T */
  2566. aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
  2567. if (EQUAL_SSID
  2568. (aucP2pSsid, CTIA_MAGIC_SSID_LEN, prAisBssInfo->aucSSID, prAisBssInfo->ucSSIDLen)) {
  2569. nicEnterCtiaMode(prAdapter, TRUE, FALSE);
  2570. }
  2571. }
  2572. #if CFG_SUPPORT_ROAMING
  2573. /* if user space roaming is enabled, we should disable driver/fw roaming */
  2574. #ifdef CONFIG_CFG80211_ALLOW_RECONNECT
  2575. if (prAdapter->rWifiVar.rConnSettings.eConnectionPolicy != CONNECT_BY_BSSID)
  2576. #endif
  2577. roamingFsmRunEventStart(prAdapter);
  2578. #endif /* CFG_SUPPORT_ROAMING */
  2579. /* 4 <1.7> Set the Next State of AIS FSM */
  2580. eNextState = AIS_STATE_NORMAL_TR;
  2581. }
  2582. /* 4 <2> JOIN was not successful */
  2583. else {
  2584. /* 4 <2.1> Redo JOIN process with other Auth Type if possible */
  2585. if (aisFsmStateInit_RetryJOIN(prAdapter, prStaRec) == FALSE) {
  2586. struct _BSS_DESC_T *prBssDesc;
  2587. /* 1. Increase Failure Count */
  2588. prStaRec->ucJoinFailureCount++;
  2589. /* 2. release channel */
  2590. aisFsmReleaseCh(prAdapter);
  2591. /* 3.1 stop join timeout timer */
  2592. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
  2593. /* 3.2 reset local variable */
  2594. prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
  2595. prBssDesc = scanSearchBssDescByBssid(prAdapter, prStaRec->aucMacAddr);
  2596. if (prBssDesc == NULL)
  2597. break;
  2598. /* ASSERT(prBssDesc); */
  2599. /* ASSERT(prBssDesc->fgIsConnecting); */
  2600. prBssDesc->ucJoinFailureCount++;
  2601. if (prBssDesc->ucJoinFailureCount >= SCN_BSS_JOIN_FAIL_THRESOLD) {
  2602. GET_CURRENT_SYSTIME(&prBssDesc->rJoinFailTime);
  2603. DBGLOG(AIS, INFO,
  2604. "Bss " MACSTR " join fail %d times, temp disable it at time: %u\n",
  2605. MAC2STR(prBssDesc->aucBSSID),
  2606. SCN_BSS_JOIN_FAIL_THRESOLD,
  2607. prBssDesc->rJoinFailTime);
  2608. }
  2609. if (prBssDesc)
  2610. prBssDesc->fgIsConnecting = FALSE;
  2611. /* 3.3 Free STA-REC */
  2612. if (prStaRec != prAisBssInfo->prStaRecOfAP)
  2613. cnmStaRecFree(prAdapter, prStaRec);
  2614. if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
  2615. #if CFG_SUPPORT_ROAMING
  2616. eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
  2617. #endif /* CFG_SUPPORT_ROAMING */
  2618. } else
  2619. if (CHECK_FOR_TIMEOUT
  2620. (rCurrentTime, prAisFsmInfo->rJoinReqTime, SEC_TO_SYSTIME(AIS_JOIN_TIMEOUT))) {
  2621. /* 4.a temrminate join operation */
  2622. eNextState = AIS_STATE_JOIN_FAILURE;
  2623. } else {
  2624. /* 4.b send reconnect request */
  2625. aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
  2626. eNextState = AIS_STATE_IDLE;
  2627. }
  2628. }
  2629. }
  2630. } while (0);
  2631. return eNextState;
  2632. }
  2633. #if CFG_SUPPORT_ADHOC
  2634. /*----------------------------------------------------------------------------*/
  2635. /*!
  2636. * @brief This function will handle the Grant Msg of IBSS Create which was sent by
  2637. * CNM to indicate that channel was changed for creating IBSS.
  2638. *
  2639. * @param[in] prAdapter Pointer of ADAPTER_T
  2640. *
  2641. * @return (none)
  2642. */
  2643. /*----------------------------------------------------------------------------*/
  2644. VOID aisFsmCreateIBSS(IN P_ADAPTER_T prAdapter)
  2645. {
  2646. P_AIS_FSM_INFO_T prAisFsmInfo;
  2647. ASSERT(prAdapter);
  2648. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  2649. do {
  2650. /* Check State */
  2651. if (prAisFsmInfo->eCurrentState == AIS_STATE_IBSS_ALONE)
  2652. aisUpdateBssInfoForCreateIBSS(prAdapter);
  2653. } while (FALSE);
  2654. } /* end of aisFsmCreateIBSS() */
  2655. /*----------------------------------------------------------------------------*/
  2656. /*!
  2657. * @brief This function will handle the Grant Msg of IBSS Merge which was sent by
  2658. * CNM to indicate that channel was changed for merging IBSS.
  2659. *
  2660. * @param[in] prAdapter Pointer of ADAPTER_T
  2661. * @param[in] prStaRec Pointer of STA_RECORD_T for merge
  2662. *
  2663. * @return (none)
  2664. */
  2665. /*----------------------------------------------------------------------------*/
  2666. VOID aisFsmMergeIBSS(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec)
  2667. {
  2668. P_AIS_FSM_INFO_T prAisFsmInfo;
  2669. ENUM_AIS_STATE_T eNextState;
  2670. P_BSS_INFO_T prAisBssInfo;
  2671. ASSERT(prAdapter);
  2672. ASSERT(prStaRec);
  2673. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  2674. prAisBssInfo = prAdapter->prAisBssInfo;
  2675. do {
  2676. eNextState = prAisFsmInfo->eCurrentState;
  2677. switch (prAisFsmInfo->eCurrentState) {
  2678. case AIS_STATE_IBSS_MERGE:
  2679. {
  2680. P_BSS_DESC_T prBssDesc;
  2681. /* 4 <1.1> Change FW's Media State immediately. */
  2682. aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
  2683. /* 4 <1.2> Deactivate previous Peers' STA_RECORD_T in Driver if have. */
  2684. bssInitializeClientList(prAdapter, prAisBssInfo);
  2685. /* 4 <1.3> Unmark connection flag of previous BSS_DESC_T. */
  2686. prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
  2687. if (prBssDesc != NULL) {
  2688. prBssDesc->fgIsConnecting = FALSE;
  2689. prBssDesc->fgIsConnected = FALSE;
  2690. }
  2691. /* 4 <1.4> Add Peers' STA_RECORD_T to Client List */
  2692. bssAddClient(prAdapter, prAisBssInfo, prStaRec);
  2693. /* 4 <1.5> Activate current Peer's STA_RECORD_T in Driver. */
  2694. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
  2695. prStaRec->fgIsMerging = FALSE;
  2696. /* 4 <1.6> Update BSS_INFO_T */
  2697. aisUpdateBssInfoForMergeIBSS(prAdapter, prStaRec);
  2698. /* 4 <1.7> Enable other features */
  2699. /* 4 <1.8> Indicate Connected Event to Host immediately. */
  2700. aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
  2701. /* 4 <1.9> Set the Next State of AIS FSM */
  2702. eNextState = AIS_STATE_NORMAL_TR;
  2703. /* 4 <1.10> Release channel privilege */
  2704. aisFsmReleaseCh(prAdapter);
  2705. #if CFG_SLT_SUPPORT
  2706. prAdapter->rWifiVar.rSltInfo.prPseudoStaRec = prStaRec;
  2707. #endif
  2708. }
  2709. break;
  2710. default:
  2711. break;
  2712. }
  2713. if (eNextState != prAisFsmInfo->eCurrentState)
  2714. aisFsmSteps(prAdapter, eNextState);
  2715. } while (FALSE);
  2716. } /* end of aisFsmMergeIBSS() */
  2717. /*----------------------------------------------------------------------------*/
  2718. /*!
  2719. * @brief This function will handle the Notification of existing IBSS was found
  2720. * from SCN.
  2721. *
  2722. * @param[in] prMsgHdr Message of Notification of an IBSS was present.
  2723. *
  2724. * @return (none)
  2725. */
  2726. /*----------------------------------------------------------------------------*/
  2727. VOID aisFsmRunEventFoundIBSSPeer(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  2728. {
  2729. P_MSG_AIS_IBSS_PEER_FOUND_T prAisIbssPeerFoundMsg;
  2730. P_AIS_FSM_INFO_T prAisFsmInfo;
  2731. ENUM_AIS_STATE_T eNextState;
  2732. P_STA_RECORD_T prStaRec;
  2733. P_BSS_INFO_T prAisBssInfo;
  2734. P_BSS_DESC_T prBssDesc;
  2735. BOOLEAN fgIsMergeIn;
  2736. ASSERT(prMsgHdr);
  2737. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  2738. prAisBssInfo = prAdapter->prAisBssInfo;
  2739. prAisIbssPeerFoundMsg = (P_MSG_AIS_IBSS_PEER_FOUND_T) prMsgHdr;
  2740. ASSERT(prAisIbssPeerFoundMsg->ucBssIndex == prAdapter->prAisBssInfo->ucBssIndex);
  2741. prStaRec = prAisIbssPeerFoundMsg->prStaRec;
  2742. ASSERT(prStaRec);
  2743. fgIsMergeIn = prAisIbssPeerFoundMsg->fgIsMergeIn;
  2744. cnmMemFree(prAdapter, prMsgHdr);
  2745. eNextState = prAisFsmInfo->eCurrentState;
  2746. switch (prAisFsmInfo->eCurrentState) {
  2747. case AIS_STATE_IBSS_ALONE:
  2748. {
  2749. /* 4 <1> An IBSS Peer 'merged in'. */
  2750. if (fgIsMergeIn) {
  2751. /* 4 <1.1> Change FW's Media State immediately. */
  2752. aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
  2753. /* 4 <1.2> Add Peers' STA_RECORD_T to Client List */
  2754. bssAddClient(prAdapter, prAisBssInfo, prStaRec);
  2755. #if CFG_SLT_SUPPORT
  2756. /* 4 <1.3> Mark connection flag of BSS_DESC_T. */
  2757. prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
  2758. if (prBssDesc != NULL) {
  2759. prBssDesc->fgIsConnecting = FALSE;
  2760. prBssDesc->fgIsConnected = TRUE;
  2761. } else {
  2762. ASSERT(0); /* Should be able to find a BSS_DESC_T here. */
  2763. }
  2764. /* 4 <1.4> Activate current Peer's STA_RECORD_T in Driver. */
  2765. prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
  2766. #else
  2767. /* 4 <1.3> Mark connection flag of BSS_DESC_T. */
  2768. prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
  2769. if (prBssDesc != NULL) {
  2770. prBssDesc->fgIsConnecting = FALSE;
  2771. prBssDesc->fgIsConnected = TRUE;
  2772. } else {
  2773. ASSERT(0); /* Should be able to find a BSS_DESC_T here. */
  2774. }
  2775. /* 4 <1.4> Activate current Peer's STA_RECORD_T in Driver. */
  2776. prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
  2777. #endif
  2778. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
  2779. prStaRec->fgIsMerging = FALSE;
  2780. /* 4 <1.6> sync. to firmware */
  2781. nicUpdateBss(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  2782. /* 4 <1.7> Indicate Connected Event to Host immediately. */
  2783. aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
  2784. /* 4 <1.8> indicate PM for connected */
  2785. nicPmIndicateBssConnected(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  2786. /* 4 <1.9> Set the Next State of AIS FSM */
  2787. eNextState = AIS_STATE_NORMAL_TR;
  2788. /* 4 <1.10> Release channel privilege */
  2789. aisFsmReleaseCh(prAdapter);
  2790. }
  2791. /* 4 <2> We need 'merge out' to this IBSS */
  2792. else {
  2793. /* 4 <2.1> Get corresponding BSS_DESC_T */
  2794. prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
  2795. prAisFsmInfo->prTargetBssDesc = prBssDesc;
  2796. /* 4 <2.2> Set the Next State of AIS FSM */
  2797. eNextState = AIS_STATE_IBSS_MERGE;
  2798. }
  2799. }
  2800. break;
  2801. case AIS_STATE_NORMAL_TR:
  2802. {
  2803. /* 4 <3> An IBSS Peer 'merged in'. */
  2804. if (fgIsMergeIn) {
  2805. /* 4 <3.1> Add Peers' STA_RECORD_T to Client List */
  2806. bssAddClient(prAdapter, prAisBssInfo, prStaRec);
  2807. #if CFG_SLT_SUPPORT
  2808. /* 4 <3.2> Activate current Peer's STA_RECORD_T in Driver. */
  2809. prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
  2810. #else
  2811. /* 4 <3.2> Activate current Peer's STA_RECORD_T in Driver. */
  2812. prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
  2813. #endif
  2814. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
  2815. prStaRec->fgIsMerging = FALSE;
  2816. }
  2817. /* 4 <4> We need 'merge out' to this IBSS */
  2818. else {
  2819. /* 4 <4.1> Get corresponding BSS_DESC_T */
  2820. prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
  2821. prAisFsmInfo->prTargetBssDesc = prBssDesc;
  2822. /* 4 <4.2> Set the Next State of AIS FSM */
  2823. eNextState = AIS_STATE_IBSS_MERGE;
  2824. }
  2825. }
  2826. break;
  2827. default:
  2828. break;
  2829. }
  2830. if (eNextState != prAisFsmInfo->eCurrentState)
  2831. aisFsmSteps(prAdapter, eNextState);
  2832. } /* end of aisFsmRunEventFoundIBSSPeer() */
  2833. #endif /* CFG_SUPPORT_ADHOC */
  2834. /*----------------------------------------------------------------------------*/
  2835. /*!
  2836. * @brief This function will indicate the Media State to HOST
  2837. *
  2838. * @param[in] eConnectionState Current Media State
  2839. * @param[in] fgDelayIndication Set TRUE for postponing the Disconnect Indication.
  2840. *
  2841. * @return (none)
  2842. */
  2843. /*----------------------------------------------------------------------------*/
  2844. VOID
  2845. aisIndicationOfMediaStateToHost(IN P_ADAPTER_T prAdapter,
  2846. ENUM_PARAM_MEDIA_STATE_T eConnectionState, BOOLEAN fgDelayIndication)
  2847. {
  2848. EVENT_CONNECTION_STATUS rEventConnStatus;
  2849. P_CONNECTION_SETTINGS_T prConnSettings;
  2850. P_BSS_INFO_T prAisBssInfo;
  2851. P_AIS_FSM_INFO_T prAisFsmInfo;
  2852. DEBUGFUNC("aisIndicationOfMediaStateToHost()");
  2853. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  2854. prAisBssInfo = prAdapter->prAisBssInfo;
  2855. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  2856. /* NOTE(Kevin): Move following line to aisChangeMediaState() macro per CM's request. */
  2857. /* prAisBssInfo->eConnectionState = eConnectionState; */
  2858. /* For indicating the Disconnect Event only if current media state is
  2859. * disconnected and we didn't do indication yet.
  2860. */
  2861. if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
  2862. if (prAisBssInfo->eConnectionStateIndicated == eConnectionState)
  2863. return;
  2864. }
  2865. if (!fgDelayIndication) {
  2866. /* 4 <0> Cancel Delay Timer */
  2867. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
  2868. /* 4 <1> Fill EVENT_CONNECTION_STATUS */
  2869. rEventConnStatus.ucMediaStatus = (UINT_8) eConnectionState;
  2870. if (eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
  2871. rEventConnStatus.ucReasonOfDisconnect = DISCONNECT_REASON_CODE_RESERVED;
  2872. if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) {
  2873. rEventConnStatus.ucInfraMode = (UINT_8) NET_TYPE_INFRA;
  2874. rEventConnStatus.u2AID = prAisBssInfo->u2AssocId;
  2875. rEventConnStatus.u2ATIMWindow = 0;
  2876. } else if (prAisBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
  2877. rEventConnStatus.ucInfraMode = (UINT_8) NET_TYPE_IBSS;
  2878. rEventConnStatus.u2AID = 0;
  2879. rEventConnStatus.u2ATIMWindow = prAisBssInfo->u2ATIMWindow;
  2880. } else {
  2881. ASSERT(0);
  2882. }
  2883. COPY_SSID(rEventConnStatus.aucSsid,
  2884. rEventConnStatus.ucSsidLen, prConnSettings->aucSSID, prConnSettings->ucSSIDLen);
  2885. COPY_MAC_ADDR(rEventConnStatus.aucBssid, prAisBssInfo->aucBSSID);
  2886. rEventConnStatus.u2BeaconPeriod = prAisBssInfo->u2BeaconInterval;
  2887. rEventConnStatus.u4FreqInKHz = nicChannelNum2Freq(prAisBssInfo->ucPrimaryChannel);
  2888. switch (prAisBssInfo->ucNonHTBasicPhyType) {
  2889. case PHY_TYPE_HR_DSSS_INDEX:
  2890. rEventConnStatus.ucNetworkType = (UINT_8) PARAM_NETWORK_TYPE_DS;
  2891. break;
  2892. case PHY_TYPE_ERP_INDEX:
  2893. rEventConnStatus.ucNetworkType = (UINT_8) PARAM_NETWORK_TYPE_OFDM24;
  2894. break;
  2895. case PHY_TYPE_OFDM_INDEX:
  2896. rEventConnStatus.ucNetworkType = (UINT_8) PARAM_NETWORK_TYPE_OFDM5;
  2897. break;
  2898. default:
  2899. ASSERT(0);
  2900. rEventConnStatus.ucNetworkType = (UINT_8) PARAM_NETWORK_TYPE_DS;
  2901. break;
  2902. }
  2903. } else {
  2904. /* Clear the pmkid cache while media disconnect */
  2905. secClearPmkid(prAdapter);
  2906. rEventConnStatus.ucReasonOfDisconnect = prAisBssInfo->ucReasonOfDisconnect;
  2907. }
  2908. /* 4 <2> Indication */
  2909. nicMediaStateChange(prAdapter, prAdapter->prAisBssInfo->ucBssIndex, &rEventConnStatus);
  2910. prAisBssInfo->eConnectionStateIndicated = eConnectionState;
  2911. } else {
  2912. /* NOTE: Only delay the Indication of Disconnect Event */
  2913. ASSERT(eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED);
  2914. DBGLOG(AIS, INFO, "Postpone the indication of Disconnect for %d seconds\n",
  2915. prConnSettings->ucDelayTimeOfDisconnectEvent);
  2916. cnmTimerStartTimer(prAdapter,
  2917. &prAisFsmInfo->rIndicationOfDisconnectTimer,
  2918. SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent));
  2919. }
  2920. } /* end of aisIndicationOfMediaStateToHost() */
  2921. /*----------------------------------------------------------------------------*/
  2922. /*!
  2923. * @brief This function will indicate an Event of "Media Disconnect" to HOST
  2924. *
  2925. * @param[in] u4Param Unused timer parameter
  2926. *
  2927. * @return (none)
  2928. */
  2929. /*----------------------------------------------------------------------------*/
  2930. VOID aisPostponedEventOfDisconnTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr)
  2931. {
  2932. P_BSS_INFO_T prAisBssInfo;
  2933. P_CONNECTION_SETTINGS_T prConnSettings;
  2934. prAisBssInfo = prAdapter->prAisBssInfo;
  2935. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  2936. /* 4 <1> Deactivate previous AP's STA_RECORD_T in Driver if have. */
  2937. if (prAisBssInfo->prStaRecOfAP) {
  2938. /* cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1); */
  2939. prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T) NULL;
  2940. }
  2941. /* 4 <2> Remove pending connection request */
  2942. aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
  2943. prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
  2944. prAisBssInfo->u2DeauthReason = REASON_CODE_BEACON_TIMEOUT;
  2945. /* 4 <3> Indicate Disconnected Event to Host immediately. */
  2946. aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED, FALSE);
  2947. } /* end of aisPostponedEventOfDisconnTimeout() */
  2948. /*----------------------------------------------------------------------------*/
  2949. /*!
  2950. * @brief This function will update the contain of BSS_INFO_T for AIS network once
  2951. * the association was completed.
  2952. *
  2953. * @param[in] prStaRec Pointer to the STA_RECORD_T
  2954. * @param[in] prAssocRspSwRfb Pointer to SW RFB of ASSOC RESP FRAME.
  2955. *
  2956. * @return (none)
  2957. */
  2958. /*----------------------------------------------------------------------------*/
  2959. VOID aisUpdateBssInfoForJOIN(IN P_ADAPTER_T prAdapter, P_STA_RECORD_T prStaRec, P_SW_RFB_T prAssocRspSwRfb)
  2960. {
  2961. P_AIS_FSM_INFO_T prAisFsmInfo;
  2962. P_BSS_INFO_T prAisBssInfo;
  2963. P_CONNECTION_SETTINGS_T prConnSettings;
  2964. P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
  2965. P_BSS_DESC_T prBssDesc;
  2966. UINT_16 u2IELength;
  2967. PUINT_8 pucIE;
  2968. DEBUGFUNC("aisUpdateBssInfoForJOIN()");
  2969. ASSERT(prStaRec);
  2970. ASSERT(prAssocRspSwRfb);
  2971. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  2972. prAisBssInfo = prAdapter->prAisBssInfo;
  2973. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  2974. prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prAssocRspSwRfb->pvHeader;
  2975. DBGLOG(AIS, TRACE, "Update AIS_BSS_INFO_T and apply settings to MAC\n");
  2976. /* 3 <1> Update BSS_INFO_T from AIS_FSM_INFO_T or User Settings */
  2977. /* 4 <1.1> Setup Operation Mode */
  2978. prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
  2979. /* 4 <1.2> Setup SSID */
  2980. COPY_SSID(prAisBssInfo->aucSSID, prAisBssInfo->ucSSIDLen, prConnSettings->aucSSID, prConnSettings->ucSSIDLen);
  2981. /* 4 <1.3> Setup Channel, Band */
  2982. prAisBssInfo->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
  2983. prAisBssInfo->eBand = prAisFsmInfo->prTargetBssDesc->eBand;
  2984. /* 3 <2> Update BSS_INFO_T from STA_RECORD_T */
  2985. /* 4 <2.1> Save current AP's STA_RECORD_T and current AID */
  2986. prAisBssInfo->prStaRecOfAP = prStaRec;
  2987. prAisBssInfo->u2AssocId = prStaRec->u2AssocId;
  2988. /* 4 <2.2> Setup Capability */
  2989. prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use AP's Cap Info as BSS Cap Info */
  2990. if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE)
  2991. prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
  2992. else
  2993. prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
  2994. #if CFG_SUPPORT_TDLS
  2995. prAisBssInfo->fgTdlsIsProhibited = prStaRec->fgTdlsIsProhibited;
  2996. prAisBssInfo->fgTdlsIsChSwProhibited = prStaRec->fgTdlsIsChSwProhibited;
  2997. #endif /* CFG_SUPPORT_TDLS */
  2998. /* 4 <2.3> Setup PHY Attributes and Basic Rate Set/Operational Rate Set */
  2999. prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
  3000. prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
  3001. prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
  3002. prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
  3003. nicTxUpdateBssDefaultRate(prAisBssInfo);
  3004. /* 3 <3> Update BSS_INFO_T from SW_RFB_T (Association Resp Frame) */
  3005. /* 4 <3.1> Setup BSSID */
  3006. COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prAssocRspFrame->aucBSSID);
  3007. u2IELength = (UINT_16) ((prAssocRspSwRfb->u2PacketLen - prAssocRspSwRfb->u2HeaderLen) -
  3008. (OFFSET_OF(WLAN_ASSOC_RSP_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN));
  3009. pucIE = prAssocRspFrame->aucInfoElem;
  3010. /* 4 <3.2> Parse WMM and setup QBSS flag */
  3011. /* Parse WMM related IEs and configure HW CRs accordingly */
  3012. mqmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
  3013. prAisBssInfo->fgIsQBSS = prStaRec->fgIsQoS;
  3014. /* 3 <4> Update BSS_INFO_T from BSS_DESC_T */
  3015. prBssDesc = scanSearchBssDescByBssid(prAdapter, prAssocRspFrame->aucBSSID);
  3016. if (prBssDesc) {
  3017. prBssDesc->fgIsConnecting = FALSE;
  3018. prBssDesc->fgIsConnected = TRUE;
  3019. prBssDesc->ucJoinFailureCount = 0;
  3020. /* 4 <4.1> Setup MIB for current BSS */
  3021. prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
  3022. } else {
  3023. /* should never happen */
  3024. ASSERT(0);
  3025. }
  3026. /* NOTE: Defer ucDTIMPeriod updating to when beacon is received after connection */
  3027. prAisBssInfo->ucDTIMPeriod = 0;
  3028. prAisBssInfo->u2ATIMWindow = 0;
  3029. prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_INFRA;
  3030. /* 4 <4.2> Update HT information and set channel */
  3031. /* Record HT related parameters in rStaRec and rBssInfo
  3032. * Note: it shall be called before nicUpdateBss()
  3033. */
  3034. rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
  3035. /* 4 <4.3> Sync with firmware for BSS-INFO */
  3036. nicUpdateBss(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  3037. /* 4 <4.4> *DEFER OPERATION* nicPmIndicateBssConnected() will be invoked */
  3038. /* inside scanProcessBeaconAndProbeResp() after 1st beacon is received */
  3039. } /* end of aisUpdateBssInfoForJOIN() */
  3040. #if CFG_SUPPORT_ADHOC
  3041. /*----------------------------------------------------------------------------*/
  3042. /*!
  3043. * @brief This function will create an Ad-Hoc network and start sending Beacon Frames.
  3044. *
  3045. * @param (none)
  3046. *
  3047. * @return (none)
  3048. */
  3049. /*----------------------------------------------------------------------------*/
  3050. VOID aisUpdateBssInfoForCreateIBSS(IN P_ADAPTER_T prAdapter)
  3051. {
  3052. P_AIS_FSM_INFO_T prAisFsmInfo;
  3053. P_BSS_INFO_T prAisBssInfo;
  3054. P_CONNECTION_SETTINGS_T prConnSettings;
  3055. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3056. prAisBssInfo = prAdapter->prAisBssInfo;
  3057. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  3058. if (prAisBssInfo->fgIsBeaconActivated)
  3059. return;
  3060. /* 3 <1> Update BSS_INFO_T per Network Basis */
  3061. /* 4 <1.1> Setup Operation Mode */
  3062. prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
  3063. /* 4 <1.2> Setup SSID */
  3064. COPY_SSID(prAisBssInfo->aucSSID, prAisBssInfo->ucSSIDLen, prConnSettings->aucSSID, prConnSettings->ucSSIDLen);
  3065. /* 4 <1.3> Clear current AP's STA_RECORD_T and current AID */
  3066. prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T) NULL;
  3067. prAisBssInfo->u2AssocId = 0;
  3068. /* 4 <1.4> Setup Channel, Band and Phy Attributes */
  3069. prAisBssInfo->ucPrimaryChannel = prConnSettings->ucAdHocChannelNum;
  3070. prAisBssInfo->eBand = prConnSettings->eAdHocBand;
  3071. if (prAisBssInfo->eBand == BAND_2G4) {
  3072. /* Depend on eBand */
  3073. prAisBssInfo->ucPhyTypeSet = prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11BGN;
  3074. /* Depend on eCurrentOPMode and ucPhyTypeSet */
  3075. prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_MIXED_11BG;
  3076. } else {
  3077. /* Depend on eBand */
  3078. prAisBssInfo->ucPhyTypeSet = prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11ANAC;
  3079. /* Depend on eCurrentOPMode and ucPhyTypeSet */
  3080. prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_11A;
  3081. }
  3082. /* 4 <1.5> Setup MIB for current BSS */
  3083. prAisBssInfo->u2BeaconInterval = prConnSettings->u2BeaconPeriod;
  3084. prAisBssInfo->ucDTIMPeriod = 0;
  3085. prAisBssInfo->u2ATIMWindow = prConnSettings->u2AtimWindow;
  3086. prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
  3087. if (prConnSettings->eEncStatus == ENUM_ENCRYPTION1_ENABLED ||
  3088. prConnSettings->eEncStatus == ENUM_ENCRYPTION2_ENABLED ||
  3089. prConnSettings->eEncStatus == ENUM_ENCRYPTION3_ENABLED) {
  3090. prAisBssInfo->fgIsProtection = TRUE;
  3091. } else {
  3092. prAisBssInfo->fgIsProtection = FALSE;
  3093. }
  3094. /* 3 <2> Update BSS_INFO_T common part */
  3095. ibssInitForAdHoc(prAdapter, prAisBssInfo);
  3096. /* 4 <2.1> Initialize client list */
  3097. bssInitializeClientList(prAdapter, prAisBssInfo);
  3098. /* 3 <3> Set MAC HW */
  3099. /* 4 <3.1> Setup channel and bandwidth */
  3100. rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
  3101. /* 4 <3.2> use command packets to inform firmware */
  3102. nicUpdateBss(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  3103. /* 4 <3.3> enable beaconing */
  3104. bssUpdateBeaconContent(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  3105. /* 4 <3.4> Update AdHoc PM parameter */
  3106. nicPmIndicateBssCreated(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  3107. /* 3 <4> Set ACTIVE flag. */
  3108. prAisBssInfo->fgIsBeaconActivated = TRUE;
  3109. prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
  3110. /* 3 <5> Start IBSS Alone Timer */
  3111. cnmTimerStartTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer, SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
  3112. return;
  3113. } /* end of aisCreateIBSS() */
  3114. /*----------------------------------------------------------------------------*/
  3115. /*!
  3116. * @brief This function will update the contain of BSS_INFO_T for AIS network once
  3117. * the existing IBSS was found.
  3118. *
  3119. * @param[in] prStaRec Pointer to the STA_RECORD_T
  3120. *
  3121. * @return (none)
  3122. */
  3123. /*----------------------------------------------------------------------------*/
  3124. VOID aisUpdateBssInfoForMergeIBSS(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec)
  3125. {
  3126. P_AIS_FSM_INFO_T prAisFsmInfo;
  3127. P_BSS_INFO_T prAisBssInfo;
  3128. P_CONNECTION_SETTINGS_T prConnSettings;
  3129. P_BSS_DESC_T prBssDesc;
  3130. /* UINT_16 u2IELength; */
  3131. /* PUINT_8 pucIE; */
  3132. ASSERT(prStaRec);
  3133. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3134. prAisBssInfo = prAdapter->prAisBssInfo;
  3135. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  3136. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
  3137. if (!prAisBssInfo->fgIsBeaconActivated) {
  3138. /* 3 <1> Update BSS_INFO_T per Network Basis */
  3139. /* 4 <1.1> Setup Operation Mode */
  3140. prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
  3141. /* 4 <1.2> Setup SSID */
  3142. COPY_SSID(prAisBssInfo->aucSSID,
  3143. prAisBssInfo->ucSSIDLen, prConnSettings->aucSSID, prConnSettings->ucSSIDLen);
  3144. /* 4 <1.3> Clear current AP's STA_RECORD_T and current AID */
  3145. prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T) NULL;
  3146. prAisBssInfo->u2AssocId = 0;
  3147. }
  3148. /* 3 <2> Update BSS_INFO_T from STA_RECORD_T */
  3149. /* 4 <2.1> Setup Capability */
  3150. prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use Peer's Cap Info as IBSS Cap Info */
  3151. if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
  3152. prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
  3153. prAisBssInfo->fgUseShortPreamble = TRUE;
  3154. } else {
  3155. prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
  3156. prAisBssInfo->fgUseShortPreamble = FALSE;
  3157. }
  3158. /* 7.3.1.4 For IBSS, the Short Slot Time subfield shall be set to 0. */
  3159. prAisBssInfo->fgUseShortSlotTime = FALSE; /* Set to FALSE for AdHoc */
  3160. prAisBssInfo->u2CapInfo &= ~CAP_INFO_SHORT_SLOT_TIME;
  3161. if (prAisBssInfo->u2CapInfo & CAP_INFO_PRIVACY)
  3162. prAisBssInfo->fgIsProtection = TRUE;
  3163. else
  3164. prAisBssInfo->fgIsProtection = FALSE;
  3165. /* 4 <2.2> Setup PHY Attributes and Basic Rate Set/Operational Rate Set */
  3166. prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
  3167. prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
  3168. prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
  3169. prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
  3170. rateGetDataRatesFromRateSet(prAisBssInfo->u2OperationalRateSet,
  3171. prAisBssInfo->u2BSSBasicRateSet,
  3172. prAisBssInfo->aucAllSupportedRates, &prAisBssInfo->ucAllSupportedRatesLen);
  3173. /* 3 <3> X Update BSS_INFO_T from SW_RFB_T (Association Resp Frame) */
  3174. /* 3 <4> Update BSS_INFO_T from BSS_DESC_T */
  3175. prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
  3176. if (prBssDesc) {
  3177. prBssDesc->fgIsConnecting = FALSE;
  3178. prBssDesc->fgIsConnected = TRUE;
  3179. /* 4 <4.1> Setup BSSID */
  3180. COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prBssDesc->aucBSSID);
  3181. /* 4 <4.2> Setup Channel, Band */
  3182. prAisBssInfo->ucPrimaryChannel = prBssDesc->ucChannelNum;
  3183. prAisBssInfo->eBand = prBssDesc->eBand;
  3184. /* 4 <4.3> Setup MIB for current BSS */
  3185. prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
  3186. prAisBssInfo->ucDTIMPeriod = 0;
  3187. prAisBssInfo->u2ATIMWindow = 0; /* TBD(Kevin) */
  3188. prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
  3189. } else {
  3190. /* should never happen */
  3191. ASSERT(0);
  3192. }
  3193. /* 3 <5> Set MAC HW */
  3194. /* 4 <5.1> Find Lowest Basic Rate Index for default TX Rate of MMPDU */
  3195. nicTxUpdateBssDefaultRate(prAisBssInfo);
  3196. /* 4 <5.2> Setup channel and bandwidth */
  3197. rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
  3198. /* 4 <5.3> use command packets to inform firmware */
  3199. nicUpdateBss(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  3200. /* 4 <5.4> enable beaconing */
  3201. bssUpdateBeaconContent(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  3202. /* 4 <5.5> Update AdHoc PM parameter */
  3203. nicPmIndicateBssConnected(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  3204. /* 3 <6> Set ACTIVE flag. */
  3205. prAisBssInfo->fgIsBeaconActivated = TRUE;
  3206. prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
  3207. } /* end of aisUpdateBssInfoForMergeIBSS() */
  3208. /*----------------------------------------------------------------------------*/
  3209. /*!
  3210. * @brief This function will validate the Rx Probe Request Frame and then return
  3211. * result to BSS to indicate if need to send the corresponding Probe Response
  3212. * Frame if the specified conditions were matched.
  3213. *
  3214. * @param[in] prAdapter Pointer to the Adapter structure.
  3215. * @param[in] prSwRfb Pointer to SW RFB data structure.
  3216. * @param[out] pu4ControlFlags Control flags for replying the Probe Response
  3217. *
  3218. * @retval TRUE Reply the Probe Response
  3219. * @retval FALSE Don't reply the Probe Response
  3220. */
  3221. /*----------------------------------------------------------------------------*/
  3222. BOOLEAN aisValidateProbeReq(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb, OUT PUINT_32 pu4ControlFlags)
  3223. {
  3224. P_WLAN_MAC_MGMT_HEADER_T prMgtHdr;
  3225. P_BSS_INFO_T prBssInfo;
  3226. P_IE_SSID_T prIeSsid = (P_IE_SSID_T) NULL;
  3227. PUINT_8 pucIE;
  3228. UINT_16 u2IELength;
  3229. UINT_16 u2Offset = 0;
  3230. BOOLEAN fgReplyProbeResp = FALSE;
  3231. ASSERT(prSwRfb);
  3232. ASSERT(pu4ControlFlags);
  3233. prBssInfo = prAdapter->prAisBssInfo;
  3234. /* 4 <1> Parse Probe Req IE and Get IE ptr (SSID, Supported Rate IE, ...) */
  3235. prMgtHdr = (P_WLAN_MAC_MGMT_HEADER_T) prSwRfb->pvHeader;
  3236. u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
  3237. pucIE = (PUINT_8) ((ULONG) prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
  3238. IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
  3239. if (ELEM_ID_SSID == IE_ID(pucIE)) {
  3240. if ((!prIeSsid) && (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID))
  3241. prIeSsid = (P_IE_SSID_T) pucIE;
  3242. break;
  3243. }
  3244. } /* end of IE_FOR_EACH */
  3245. /* 4 <2> Check network conditions */
  3246. if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
  3247. if ((prIeSsid) && ((prIeSsid->ucLength == BC_SSID_LEN) || /* WILDCARD SSID */
  3248. EQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen, /* CURRENT SSID */
  3249. prIeSsid->aucSSID, prIeSsid->ucLength))) {
  3250. fgReplyProbeResp = TRUE;
  3251. }
  3252. }
  3253. return fgReplyProbeResp;
  3254. } /* end of aisValidateProbeReq() */
  3255. #endif /* CFG_SUPPORT_ADHOC */
  3256. /*----------------------------------------------------------------------------*/
  3257. /*!
  3258. * @brief This function will modify and update necessary information to firmware
  3259. * for disconnection handling
  3260. *
  3261. * @param[in] prAdapter Pointer to the Adapter structure.
  3262. *
  3263. * @retval None
  3264. */
  3265. /*----------------------------------------------------------------------------*/
  3266. VOID aisFsmDisconnect(IN P_ADAPTER_T prAdapter, IN BOOLEAN fgDelayIndication)
  3267. {
  3268. P_BSS_INFO_T prAisBssInfo;
  3269. UINT_8 aucP2pSsid[] = CTIA_MAGIC_SSID;
  3270. ASSERT(prAdapter);
  3271. prAisBssInfo = prAdapter->prAisBssInfo;
  3272. nicPmIndicateBssAbort(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  3273. #if CFG_SUPPORT_ADHOC
  3274. if (prAisBssInfo->fgIsBeaconActivated) {
  3275. nicUpdateBeaconIETemplate(prAdapter,
  3276. IE_UPD_METHOD_DELETE_ALL, prAdapter->prAisBssInfo->ucBssIndex, 0, NULL, 0);
  3277. prAisBssInfo->fgIsBeaconActivated = FALSE;
  3278. }
  3279. #endif
  3280. rlmBssAborted(prAdapter, prAisBssInfo);
  3281. /* 4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed. */
  3282. if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
  3283. /* add for ctia mode */
  3284. {
  3285. if (EQUAL_SSID(aucP2pSsid, CTIA_MAGIC_SSID_LEN, prAisBssInfo->aucSSID, prAisBssInfo->ucSSIDLen))
  3286. nicEnterCtiaMode(prAdapter, FALSE, FALSE);
  3287. }
  3288. if (prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_RADIO_LOST) {
  3289. scanRemoveBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
  3290. /* remove from scanning results as well */
  3291. wlanClearBssInScanningResult(prAdapter, prAisBssInfo->aucBSSID);
  3292. /* trials for re-association */
  3293. if (fgDelayIndication) {
  3294. aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
  3295. aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
  3296. }
  3297. } else {
  3298. scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
  3299. }
  3300. if (fgDelayIndication) {
  3301. if (OP_MODE_IBSS != prAisBssInfo->eCurrentOPMode)
  3302. prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
  3303. } else {
  3304. prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
  3305. }
  3306. } else {
  3307. prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
  3308. }
  3309. /* 4 <4> Change Media State immediately. */
  3310. if (prAisBssInfo->ucReasonOfDisconnect != DISCONNECT_REASON_CODE_REASSOCIATION) {
  3311. aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
  3312. /* 4 <4.1> sync. with firmware */
  3313. nicUpdateBss(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  3314. }
  3315. if (!fgDelayIndication) {
  3316. /* 4 <5> Deactivate previous AP's STA_RECORD_T or all Clients in Driver if have. */
  3317. if (prAisBssInfo->prStaRecOfAP) {
  3318. /* cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1); */
  3319. prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T) NULL;
  3320. }
  3321. }
  3322. #if CFG_SUPPORT_ROAMING
  3323. roamingFsmRunEventAbort(prAdapter);
  3324. /* clear pending roaming connection request */
  3325. aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
  3326. aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
  3327. #endif /* CFG_SUPPORT_ROAMING */
  3328. /* 4 <6> Indicate Disconnected Event to Host */
  3329. aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED, fgDelayIndication);
  3330. /* 4 <7> Trigger AIS FSM */
  3331. aisFsmSteps(prAdapter, AIS_STATE_IDLE);
  3332. } /* end of aisFsmDisconnect() */
  3333. static VOID aisFsmRunEventScanDoneTimeOut(IN P_ADAPTER_T prAdapter, ULONG ulParam)
  3334. {
  3335. P_AIS_FSM_INFO_T prAisFsmInfo;
  3336. ENUM_AIS_STATE_T eNextState;
  3337. P_CONNECTION_SETTINGS_T prConnSettings;
  3338. DEBUGFUNC("aisFsmRunEventScanDoneTimeOut()");
  3339. ASSERT(prAdapter);
  3340. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3341. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  3342. DBGLOG(AIS, STATE, "aisFsmRunEventScanDoneTimeOut Current[%d]\n", prAisFsmInfo->eCurrentState);
  3343. /* report all scanned frames to upper layer to avoid scanned frame is timeout */
  3344. /* must be put before kalScanDone */
  3345. /* scanReportBss2Cfg80211(prAdapter,BSS_TYPE_INFRASTRUCTURE,NULL); */
  3346. prConnSettings->fgIsScanReqIssued = FALSE;
  3347. kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
  3348. eNextState = prAisFsmInfo->eCurrentState;
  3349. switch (prAisFsmInfo->eCurrentState) {
  3350. case AIS_STATE_SCAN:
  3351. prAisFsmInfo->u4ScanIELength = 0;
  3352. eNextState = AIS_STATE_IDLE;
  3353. break;
  3354. case AIS_STATE_ONLINE_SCAN:
  3355. /* reset scan IE buffer */
  3356. prAisFsmInfo->u4ScanIELength = 0;
  3357. #if CFG_SUPPORT_ROAMING
  3358. eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
  3359. #else
  3360. eNextState = AIS_STATE_NORMAL_TR;
  3361. #endif /* CFG_SUPPORT_ROAMING */
  3362. break;
  3363. default:
  3364. break;
  3365. }
  3366. /* try to stop scan in CONNSYS */
  3367. aisFsmStateAbort_SCAN(prAdapter);
  3368. /* wlanQueryDebugCode(prAdapter); */ /* display current SCAN FSM in FW, debug use */
  3369. if (eNextState != prAisFsmInfo->eCurrentState)
  3370. aisFsmSteps(prAdapter, eNextState);
  3371. } /* end of aisFsmBGSleepTimeout() */
  3372. /*----------------------------------------------------------------------------*/
  3373. /*!
  3374. * @brief This function will indicate an Event of "Background Scan Time-Out" to AIS FSM.
  3375. *
  3376. * @param[in] u4Param Unused timer parameter
  3377. *
  3378. * @return (none)
  3379. */
  3380. /*----------------------------------------------------------------------------*/
  3381. VOID aisFsmRunEventBGSleepTimeOut(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr)
  3382. {
  3383. P_AIS_FSM_INFO_T prAisFsmInfo;
  3384. ENUM_AIS_STATE_T eNextState;
  3385. DEBUGFUNC("aisFsmRunEventBGSleepTimeOut()");
  3386. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3387. eNextState = prAisFsmInfo->eCurrentState;
  3388. switch (prAisFsmInfo->eCurrentState) {
  3389. case AIS_STATE_WAIT_FOR_NEXT_SCAN:
  3390. DBGLOG(AIS, LOUD, "EVENT - SCAN TIMER: Idle End - Current Time = %u\n", kalGetTimeTick());
  3391. eNextState = AIS_STATE_LOOKING_FOR;
  3392. SET_NET_PWR_STATE_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  3393. break;
  3394. default:
  3395. break;
  3396. }
  3397. /* Call aisFsmSteps() when we are going to change AIS STATE */
  3398. if (eNextState != prAisFsmInfo->eCurrentState)
  3399. aisFsmSteps(prAdapter, eNextState);
  3400. } /* end of aisFsmBGSleepTimeout() */
  3401. /*----------------------------------------------------------------------------*/
  3402. /*!
  3403. * @brief This function will indicate an Event of "IBSS ALONE Time-Out" to AIS FSM.
  3404. *
  3405. * @param[in] u4Param Unused timer parameter
  3406. *
  3407. * @return (none)
  3408. */
  3409. /*----------------------------------------------------------------------------*/
  3410. VOID aisFsmRunEventIbssAloneTimeOut(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr)
  3411. {
  3412. P_AIS_FSM_INFO_T prAisFsmInfo;
  3413. ENUM_AIS_STATE_T eNextState;
  3414. DEBUGFUNC("aisFsmRunEventIbssAloneTimeOut()");
  3415. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3416. eNextState = prAisFsmInfo->eCurrentState;
  3417. switch (prAisFsmInfo->eCurrentState) {
  3418. case AIS_STATE_IBSS_ALONE:
  3419. /* There is no one participate in our AdHoc during this TIMEOUT Interval
  3420. * so go back to search for a valid IBSS again.
  3421. */
  3422. DBGLOG(AIS, LOUD, "EVENT-IBSS ALONE TIMER: Start pairing\n");
  3423. prAisFsmInfo->fgTryScan = TRUE;
  3424. /* abort timer */
  3425. aisFsmReleaseCh(prAdapter);
  3426. /* Pull back to SEARCH to find candidate again */
  3427. eNextState = AIS_STATE_SEARCH;
  3428. break;
  3429. default:
  3430. break;
  3431. }
  3432. /* Call aisFsmSteps() when we are going to change AIS STATE */
  3433. if (eNextState != prAisFsmInfo->eCurrentState)
  3434. aisFsmSteps(prAdapter, eNextState);
  3435. } /* end of aisIbssAloneTimeOut() */
  3436. /*----------------------------------------------------------------------------*/
  3437. /*!
  3438. * @brief This function will indicate an Event of "Join Time-Out" to AIS FSM.
  3439. *
  3440. * @param[in] u4Param Unused timer parameter
  3441. *
  3442. * @return (none)
  3443. */
  3444. /*----------------------------------------------------------------------------*/
  3445. VOID aisFsmRunEventJoinTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr)
  3446. {
  3447. P_BSS_INFO_T prAisBssInfo;
  3448. P_AIS_FSM_INFO_T prAisFsmInfo;
  3449. ENUM_AIS_STATE_T eNextState;
  3450. OS_SYSTIME rCurrentTime;
  3451. DEBUGFUNC("aisFsmRunEventJoinTimeout()");
  3452. prAisBssInfo = prAdapter->prAisBssInfo;
  3453. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3454. eNextState = prAisFsmInfo->eCurrentState;
  3455. GET_CURRENT_SYSTIME(&rCurrentTime);
  3456. switch (prAisFsmInfo->eCurrentState) {
  3457. case AIS_STATE_JOIN:
  3458. DBGLOG(AIS, LOUD, "EVENT- JOIN TIMEOUT\n");
  3459. /* 1. Do abort JOIN */
  3460. aisFsmStateAbort_JOIN(prAdapter);
  3461. /* 2. Increase Join Failure Count */
  3462. prAisFsmInfo->prTargetStaRec->ucJoinFailureCount++;
  3463. if (prAisFsmInfo->prTargetStaRec->ucJoinFailureCount < JOIN_MAX_RETRY_FAILURE_COUNT) {
  3464. /* 3.1 Retreat to AIS_STATE_SEARCH state for next try */
  3465. eNextState = AIS_STATE_SEARCH;
  3466. } else if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
  3467. /* roaming cases */
  3468. /* 3.2 Retreat to AIS_STATE_WAIT_FOR_NEXT_SCAN state for next try */
  3469. eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
  3470. } else
  3471. if (!CHECK_FOR_TIMEOUT
  3472. (rCurrentTime, prAisFsmInfo->rJoinReqTime, SEC_TO_SYSTIME(AIS_JOIN_TIMEOUT))) {
  3473. /* 3.3 Retreat to AIS_STATE_WAIT_FOR_NEXT_SCAN state for next try */
  3474. eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
  3475. } else {
  3476. /* 3.4 Retreat to AIS_STATE_JOIN_FAILURE to terminate join operation */
  3477. eNextState = AIS_STATE_JOIN_FAILURE;
  3478. }
  3479. break;
  3480. case AIS_STATE_NORMAL_TR:
  3481. /* 1. release channel */
  3482. aisFsmReleaseCh(prAdapter);
  3483. prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
  3484. /* 2. process if there is pending scan */
  3485. if (aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
  3486. wlanClearScanningResult(prAdapter);
  3487. eNextState = AIS_STATE_ONLINE_SCAN;
  3488. }
  3489. break;
  3490. default:
  3491. /* release channel */
  3492. aisFsmReleaseCh(prAdapter);
  3493. break;
  3494. }
  3495. /* Call aisFsmSteps() when we are going to change AIS STATE */
  3496. if (eNextState != prAisFsmInfo->eCurrentState)
  3497. aisFsmSteps(prAdapter, eNextState);
  3498. } /* end of aisFsmRunEventJoinTimeout() */
  3499. VOID aisFsmRunEventDeauthTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr)
  3500. {
  3501. aisDeauthXmitComplete(prAdapter, NULL, TX_RESULT_LIFE_TIMEOUT);
  3502. }
  3503. #if defined(CFG_TEST_MGMT_FSM) && (CFG_TEST_MGMT_FSM != 0)
  3504. /*----------------------------------------------------------------------------*/
  3505. /*!
  3506. * \brief
  3507. *
  3508. * \param[in]
  3509. *
  3510. * \return none
  3511. */
  3512. /*----------------------------------------------------------------------------*/
  3513. VOID aisTest(VOID)
  3514. {
  3515. P_MSG_AIS_ABORT_T prAisAbortMsg;
  3516. P_CONNECTION_SETTINGS_T prConnSettings;
  3517. UINT_8 aucSSID[] = "pci-11n";
  3518. UINT_8 ucSSIDLen = 7;
  3519. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  3520. /* Set Connection Request Issued Flag */
  3521. prConnSettings->fgIsConnReqIssued = TRUE;
  3522. prConnSettings->ucSSIDLen = ucSSIDLen;
  3523. kalMemCopy(prConnSettings->aucSSID, aucSSID, ucSSIDLen);
  3524. prAisAbortMsg = (P_MSG_AIS_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
  3525. if (!prAisAbortMsg) {
  3526. ASSERT(0); /* Can't trigger SCAN FSM */
  3527. return;
  3528. }
  3529. prAisAbortMsg->rMsgHdr.eMsgId = MID_HEM_AIS_FSM_ABORT;
  3530. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF);
  3531. wifi_send_msg(INDX_WIFI, MSG_ID_WIFI_IST, 0);
  3532. }
  3533. #endif /* CFG_TEST_MGMT_FSM */
  3534. /*----------------------------------------------------------------------------*/
  3535. /*!
  3536. * \brief This function is used to handle OID_802_11_BSSID_LIST_SCAN
  3537. *
  3538. * \param[in] prAdapter Pointer of ADAPTER_T
  3539. * \param[in] prSsid Pointer of SSID_T if specified
  3540. * \param[in] pucIe Pointer to buffer of extra information elements to be attached
  3541. * \param[in] u4IeLength Length of information elements
  3542. *
  3543. * \return none
  3544. */
  3545. /*----------------------------------------------------------------------------*/
  3546. VOID aisFsmScanRequest(IN P_ADAPTER_T prAdapter, IN P_PARAM_SSID_T prSsid, IN PUINT_8 pucIe, IN UINT_32 u4IeLength)
  3547. {
  3548. P_CONNECTION_SETTINGS_T prConnSettings;
  3549. P_BSS_INFO_T prAisBssInfo;
  3550. P_AIS_FSM_INFO_T prAisFsmInfo;
  3551. DEBUGFUNC("aisFsmScanRequest()");
  3552. ASSERT(prAdapter);
  3553. ASSERT(u4IeLength <= MAX_IE_LENGTH);
  3554. prAisBssInfo = prAdapter->prAisBssInfo;
  3555. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3556. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  3557. if (!prConnSettings->fgIsScanReqIssued) {
  3558. prConnSettings->fgIsScanReqIssued = TRUE;
  3559. if (prSsid == NULL) {
  3560. prAisFsmInfo->ucScanSSIDNum = 0;
  3561. } else {
  3562. prAisFsmInfo->ucScanSSIDNum = 1;
  3563. COPY_SSID(prAisFsmInfo->arScanSSID[0].aucSsid,
  3564. prAisFsmInfo->arScanSSID[0].u4SsidLen, prSsid->aucSsid, prSsid->u4SsidLen);
  3565. }
  3566. if (u4IeLength > 0) {
  3567. prAisFsmInfo->u4ScanIELength = u4IeLength;
  3568. kalMemCopy(prAisFsmInfo->aucScanIEBuf, pucIe, u4IeLength);
  3569. } else {
  3570. prAisFsmInfo->u4ScanIELength = 0;
  3571. }
  3572. if (prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR) {
  3573. if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE
  3574. && prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
  3575. /* 802.1x might not finished yet, pend it for later handling .. */
  3576. aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
  3577. } else {
  3578. if (prAisFsmInfo->fgIsChannelGranted == TRUE) {
  3579. DBGLOG(AIS, WARN,
  3580. "Scan Request with channel granted for join operation: %d, %d",
  3581. prAisFsmInfo->fgIsChannelGranted, prAisFsmInfo->fgIsChannelRequested);
  3582. }
  3583. /* start online scan */
  3584. wlanClearScanningResult(prAdapter);
  3585. aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN);
  3586. }
  3587. } else if (prAisFsmInfo->eCurrentState == AIS_STATE_IDLE) {
  3588. wlanClearScanningResult(prAdapter);
  3589. aisFsmSteps(prAdapter, AIS_STATE_SCAN);
  3590. } else {
  3591. aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
  3592. }
  3593. } else {
  3594. DBGLOG(AIS, WARN, "Scan Request dropped. (state: %d)\n", prAisFsmInfo->eCurrentState);
  3595. }
  3596. } /* end of aisFsmScanRequest() */
  3597. /*----------------------------------------------------------------------------*/
  3598. /*!
  3599. * \brief This function is used to handle OID_802_11_BSSID_LIST_SCAN
  3600. *
  3601. * \param[in] prAdapter Pointer of ADAPTER_T
  3602. * \param[in] ucSsidNum Number of SSID
  3603. * \param[in] prSsid Pointer to the array of SSID_T if specified
  3604. * \param[in] pucIe Pointer to buffer of extra information elements to be attached
  3605. * \param[in] u4IeLength Length of information elements
  3606. *
  3607. * \return none
  3608. */
  3609. /*----------------------------------------------------------------------------*/
  3610. VOID
  3611. aisFsmScanRequestAdv(IN P_ADAPTER_T prAdapter,
  3612. IN UINT_8 ucSsidNum, IN P_PARAM_SSID_T prSsid, IN PUINT_8 pucIe, IN UINT_32 u4IeLength)
  3613. {
  3614. UINT_32 i;
  3615. P_CONNECTION_SETTINGS_T prConnSettings;
  3616. P_BSS_INFO_T prAisBssInfo;
  3617. P_AIS_FSM_INFO_T prAisFsmInfo;
  3618. DEBUGFUNC("aisFsmScanRequestAdv()");
  3619. ASSERT(prAdapter);
  3620. ASSERT(ucSsidNum <= SCN_SSID_MAX_NUM);
  3621. ASSERT(u4IeLength <= MAX_IE_LENGTH);
  3622. prAisBssInfo = prAdapter->prAisBssInfo;
  3623. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3624. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  3625. if (!prConnSettings->fgIsScanReqIssued) {
  3626. prConnSettings->fgIsScanReqIssued = TRUE;
  3627. if (ucSsidNum == 0) {
  3628. prAisFsmInfo->ucScanSSIDNum = 0;
  3629. } else {
  3630. prAisFsmInfo->ucScanSSIDNum = ucSsidNum;
  3631. for (i = 0; i < ucSsidNum; i++) {
  3632. COPY_SSID(prAisFsmInfo->arScanSSID[i].aucSsid,
  3633. prAisFsmInfo->arScanSSID[i].u4SsidLen,
  3634. prSsid[i].aucSsid, prSsid[i].u4SsidLen);
  3635. }
  3636. }
  3637. if (u4IeLength > 0) {
  3638. prAisFsmInfo->u4ScanIELength = u4IeLength;
  3639. kalMemCopy(prAisFsmInfo->aucScanIEBuf, pucIe, u4IeLength);
  3640. } else {
  3641. prAisFsmInfo->u4ScanIELength = 0;
  3642. }
  3643. if (prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR) {
  3644. if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE
  3645. && prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
  3646. /* 802.1x might not finished yet, pend it for later handling .. */
  3647. aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
  3648. } else {
  3649. if (prAisFsmInfo->fgIsChannelGranted == TRUE) {
  3650. DBGLOG(AIS, WARN,
  3651. "Scan Request with channel granted for join operation: %d, %d",
  3652. prAisFsmInfo->fgIsChannelGranted, prAisFsmInfo->fgIsChannelRequested);
  3653. }
  3654. /* start online scan */
  3655. wlanClearScanningResult(prAdapter);
  3656. aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN);
  3657. }
  3658. } else if (prAisFsmInfo->eCurrentState == AIS_STATE_IDLE) {
  3659. wlanClearScanningResult(prAdapter);
  3660. aisFsmSteps(prAdapter, AIS_STATE_SCAN);
  3661. } else {
  3662. aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
  3663. }
  3664. } else {
  3665. DBGLOG(AIS, WARN, "Scan Request dropped. (state: %d)\n", prAisFsmInfo->eCurrentState);
  3666. }
  3667. } /* end of aisFsmScanRequestAdv() */
  3668. /*----------------------------------------------------------------------------*/
  3669. /*!
  3670. * \brief This function is invoked when CNM granted channel privilege
  3671. *
  3672. * \param[in] prAdapter Pointer of ADAPTER_T
  3673. *
  3674. * \return none
  3675. */
  3676. /*----------------------------------------------------------------------------*/
  3677. VOID aisFsmRunEventChGrant(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  3678. {
  3679. P_BSS_INFO_T prAisBssInfo;
  3680. P_AIS_FSM_INFO_T prAisFsmInfo;
  3681. P_MSG_CH_GRANT_T prMsgChGrant;
  3682. UINT_8 ucTokenID;
  3683. UINT_32 u4GrantInterval;
  3684. ASSERT(prAdapter);
  3685. ASSERT(prMsgHdr);
  3686. prAisBssInfo = prAdapter->prAisBssInfo;
  3687. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3688. prMsgChGrant = (P_MSG_CH_GRANT_T) prMsgHdr;
  3689. ucTokenID = prMsgChGrant->ucTokenID;
  3690. u4GrantInterval = prMsgChGrant->u4GrantInterval;
  3691. /* 1. free message */
  3692. cnmMemFree(prAdapter, prMsgHdr);
  3693. if (prAisFsmInfo->eCurrentState == AIS_STATE_REQ_CHANNEL_JOIN && prAisFsmInfo->ucSeqNumOfChReq == ucTokenID) {
  3694. /* 2. channel privilege has been approved */
  3695. prAisFsmInfo->u4ChGrantedInterval = u4GrantInterval;
  3696. /* 3. state transition to join/ibss-alone/ibss-merge */
  3697. /* 3.1 set timeout timer in cases join could not be completed */
  3698. cnmTimerStartTimer(prAdapter,
  3699. &prAisFsmInfo->rJoinTimeoutTimer,
  3700. prAisFsmInfo->u4ChGrantedInterval - AIS_JOIN_CH_GRANT_THRESHOLD);
  3701. /* 3.2 set local variable to indicate join timer is ticking */
  3702. prAisFsmInfo->fgIsInfraChannelFinished = FALSE;
  3703. /* 3.3 switch to join state */
  3704. aisFsmSteps(prAdapter, AIS_STATE_JOIN);
  3705. prAisFsmInfo->fgIsChannelGranted = TRUE;
  3706. } else if (prAisFsmInfo->eCurrentState == AIS_STATE_REQ_REMAIN_ON_CHANNEL &&
  3707. prAisFsmInfo->ucSeqNumOfChReq == ucTokenID) {
  3708. /* 2. channel privilege has been approved */
  3709. prAisFsmInfo->u4ChGrantedInterval = u4GrantInterval;
  3710. /* 3.1 set timeout timer in cases upper layer cancel_remain_on_channel never comes */
  3711. cnmTimerStartTimer(prAdapter, &prAisFsmInfo->rChannelTimeoutTimer, prAisFsmInfo->u4ChGrantedInterval);
  3712. /* 3.2 switch to remain_on_channel state */
  3713. aisFsmSteps(prAdapter, AIS_STATE_REMAIN_ON_CHANNEL);
  3714. /* 3.3. indicate upper layer for channel ready */
  3715. kalReadyOnChannel(prAdapter->prGlueInfo,
  3716. prAisFsmInfo->rChReqInfo.u8Cookie,
  3717. prAisFsmInfo->rChReqInfo.eBand,
  3718. prAisFsmInfo->rChReqInfo.eSco,
  3719. prAisFsmInfo->rChReqInfo.ucChannelNum, prAisFsmInfo->rChReqInfo.u4DurationMs);
  3720. prAisFsmInfo->fgIsChannelGranted = TRUE;
  3721. } else { /* mismatched grant */
  3722. /* 2. return channel privilege to CNM immediately */
  3723. aisFsmReleaseCh(prAdapter);
  3724. }
  3725. } /* end of aisFsmRunEventChGrant() */
  3726. /*----------------------------------------------------------------------------*/
  3727. /*!
  3728. * \brief This function is to inform CNM that channel privilege
  3729. * has been released
  3730. *
  3731. * \param[in] prAdapter Pointer of ADAPTER_T
  3732. *
  3733. * \return none
  3734. */
  3735. /*----------------------------------------------------------------------------*/
  3736. VOID aisFsmReleaseCh(IN P_ADAPTER_T prAdapter)
  3737. {
  3738. P_AIS_FSM_INFO_T prAisFsmInfo;
  3739. P_MSG_CH_ABORT_T prMsgChAbort;
  3740. ASSERT(prAdapter);
  3741. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3742. if (prAisFsmInfo->fgIsChannelGranted == TRUE || prAisFsmInfo->fgIsChannelRequested == TRUE) {
  3743. prAisFsmInfo->fgIsChannelRequested = FALSE;
  3744. prAisFsmInfo->fgIsChannelGranted = FALSE;
  3745. /* 1. return channel privilege to CNM immediately */
  3746. prMsgChAbort = (P_MSG_CH_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_ABORT_T));
  3747. if (!prMsgChAbort) {
  3748. ASSERT(0); /* Can't release Channel to CNM */
  3749. return;
  3750. }
  3751. prMsgChAbort->rMsgHdr.eMsgId = MID_MNY_CNM_CH_ABORT;
  3752. prMsgChAbort->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  3753. prMsgChAbort->ucTokenID = prAisFsmInfo->ucSeqNumOfChReq;
  3754. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prMsgChAbort, MSG_SEND_METHOD_BUF);
  3755. }
  3756. } /* end of aisFsmReleaseCh() */
  3757. /*----------------------------------------------------------------------------*/
  3758. /*!
  3759. * \brief This function is to inform AIS that corresponding beacon has not
  3760. * been received for a while and probing is not successful
  3761. *
  3762. * \param[in] prAdapter Pointer of ADAPTER_T
  3763. *
  3764. * \return none
  3765. */
  3766. /*----------------------------------------------------------------------------*/
  3767. VOID aisBssBeaconTimeout(IN P_ADAPTER_T prAdapter)
  3768. {
  3769. P_BSS_INFO_T prAisBssInfo;
  3770. BOOLEAN fgDoAbortIndication = FALSE;
  3771. P_CONNECTION_SETTINGS_T prConnSettings;
  3772. ASSERT(prAdapter);
  3773. prAisBssInfo = prAdapter->prAisBssInfo;
  3774. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  3775. /* 4 <1> Diagnose Connection for Beacon Timeout Event */
  3776. if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
  3777. if (OP_MODE_INFRASTRUCTURE == prAisBssInfo->eCurrentOPMode) {
  3778. P_STA_RECORD_T prStaRec = prAisBssInfo->prStaRecOfAP;
  3779. if (prStaRec)
  3780. fgDoAbortIndication = TRUE;
  3781. } else if (OP_MODE_IBSS == prAisBssInfo->eCurrentOPMode) {
  3782. fgDoAbortIndication = TRUE;
  3783. }
  3784. }
  3785. /* 4 <2> invoke abort handler */
  3786. if (fgDoAbortIndication) {
  3787. prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
  3788. aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_RADIO_LOST, TRUE);
  3789. }
  3790. } /* end of aisBssBeaconTimeout() */
  3791. /*----------------------------------------------------------------------------*/
  3792. /*!
  3793. * \brief This function is to inform AIS that DEAUTH frame has been
  3794. * sent and thus state machine could go ahead
  3795. *
  3796. * \param[in] prAdapter Pointer of ADAPTER_T
  3797. * \param[in] prMsduInfo Pointer of MSDU_INFO_T for DEAUTH frame
  3798. * \param[in] prAdapter Pointer of ADAPTER_T
  3799. *
  3800. * \return WLAN_STATUS_SUCCESS
  3801. */
  3802. /*----------------------------------------------------------------------------*/
  3803. WLAN_STATUS
  3804. aisDeauthXmitComplete(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus)
  3805. {
  3806. P_AIS_FSM_INFO_T prAisFsmInfo;
  3807. ASSERT(prAdapter);
  3808. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3809. if (rTxDoneStatus == TX_RESULT_SUCCESS)
  3810. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rDeauthDoneTimer);
  3811. if (prAisFsmInfo->eCurrentState == AIS_STATE_DISCONNECTING) {
  3812. if (rTxDoneStatus != TX_RESULT_DROPPED_IN_DRIVER && rTxDoneStatus != TX_RESULT_QUEUE_CLEARANCE)
  3813. aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_NEW_CONNECTION, FALSE);
  3814. } else {
  3815. DBGLOG(AIS, WARN, "DEAUTH frame transmitted without further handling");
  3816. }
  3817. return WLAN_STATUS_SUCCESS;
  3818. } /* end of aisDeauthXmitComplete() */
  3819. #if CFG_SUPPORT_ROAMING
  3820. /*----------------------------------------------------------------------------*/
  3821. /*!
  3822. * @brief This function will indicate an Event of "Looking for a candidate due to weak signal" to AIS FSM.
  3823. *
  3824. * @param[in] u4ReqScan Requesting Scan or not
  3825. *
  3826. * @return (none)
  3827. */
  3828. /*----------------------------------------------------------------------------*/
  3829. VOID aisFsmRunEventRoamingDiscovery(IN P_ADAPTER_T prAdapter, UINT_32 u4ReqScan)
  3830. {
  3831. P_AIS_FSM_INFO_T prAisFsmInfo;
  3832. P_CONNECTION_SETTINGS_T prConnSettings;
  3833. ENUM_AIS_REQUEST_TYPE_T eAisRequest;
  3834. DBGLOG(AIS, LOUD, "aisFsmRunEventRoamingDiscovery()\n");
  3835. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3836. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  3837. /* search candidates by best rssi */
  3838. prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
  3839. /* TODO: Stop roaming event in FW */
  3840. #if CFG_SUPPORT_WFD
  3841. #if CFG_ENABLE_WIFI_DIRECT
  3842. {
  3843. /* Check WFD is running */
  3844. P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL;
  3845. prWfdCfgSettings = &(prAdapter->rWifiVar.rWfdConfigureSettings);
  3846. if ((prWfdCfgSettings->ucWfdEnable != 0)) {
  3847. DBGLOG(ROAMING, INFO, "WFD is running. Stop roaming.\n");
  3848. roamingFsmRunEventRoam(prAdapter);
  3849. roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_NOCANDIDATE);
  3850. return;
  3851. }
  3852. }
  3853. #endif
  3854. #endif
  3855. /* results are still new */
  3856. if (!u4ReqScan) {
  3857. roamingFsmRunEventRoam(prAdapter);
  3858. eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
  3859. } else {
  3860. if (prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN
  3861. || prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
  3862. eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
  3863. } else {
  3864. eAisRequest = AIS_REQUEST_ROAMING_SEARCH;
  3865. }
  3866. }
  3867. if (prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR && prAisFsmInfo->fgIsInfraChannelFinished == TRUE) {
  3868. if (eAisRequest == AIS_REQUEST_ROAMING_SEARCH)
  3869. aisFsmSteps(prAdapter, AIS_STATE_LOOKING_FOR);
  3870. else
  3871. aisFsmSteps(prAdapter, AIS_STATE_SEARCH);
  3872. } else {
  3873. aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
  3874. aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
  3875. aisFsmInsertRequest(prAdapter, eAisRequest);
  3876. }
  3877. } /* end of aisFsmRunEventRoamingDiscovery() */
  3878. /*----------------------------------------------------------------------------*/
  3879. /*!
  3880. * @brief Update the time of ScanDone for roaming and transit to Roam state.
  3881. *
  3882. * @param (none)
  3883. *
  3884. * @return (none)
  3885. */
  3886. /*----------------------------------------------------------------------------*/
  3887. ENUM_AIS_STATE_T aisFsmRoamingScanResultsUpdate(IN P_ADAPTER_T prAdapter)
  3888. {
  3889. P_AIS_FSM_INFO_T prAisFsmInfo;
  3890. P_ROAMING_INFO_T prRoamingFsmInfo;
  3891. ENUM_AIS_STATE_T eNextState;
  3892. DBGLOG(AIS, LOUD, "->aisFsmRoamingScanResultsUpdate()\n");
  3893. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3894. prRoamingFsmInfo = (P_ROAMING_INFO_T) &(prAdapter->rWifiVar.rRoamingInfo);
  3895. roamingFsmScanResultsUpdate(prAdapter);
  3896. eNextState = prAisFsmInfo->eCurrentState;
  3897. if (prRoamingFsmInfo->eCurrentState == ROAMING_STATE_DISCOVERY) {
  3898. roamingFsmRunEventRoam(prAdapter);
  3899. eNextState = AIS_STATE_SEARCH;
  3900. } else if (prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
  3901. eNextState = AIS_STATE_SEARCH;
  3902. } else if (prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
  3903. eNextState = AIS_STATE_NORMAL_TR;
  3904. }
  3905. return eNextState;
  3906. } /* end of aisFsmRoamingScanResultsUpdate() */
  3907. /*----------------------------------------------------------------------------*/
  3908. /*!
  3909. * @brief This function will modify and update necessary information to firmware
  3910. * for disconnection of last AP before switching to roaming bss.
  3911. *
  3912. * @param IN prAdapter Pointer to the Adapter structure.
  3913. * prTargetStaRec Target of StaRec of roaming
  3914. *
  3915. * @retval None
  3916. */
  3917. /*----------------------------------------------------------------------------*/
  3918. VOID aisFsmRoamingDisconnectPrevAP(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prTargetStaRec)
  3919. {
  3920. P_BSS_INFO_T prAisBssInfo;
  3921. DBGLOG(AIS, LOUD, "aisFsmRoamingDisconnectPrevAP()");
  3922. ASSERT(prAdapter);
  3923. prAisBssInfo = prAdapter->prAisBssInfo;
  3924. nicPmIndicateBssAbort(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  3925. /* Not invoke rlmBssAborted() here to avoid prAisBssInfo->fg40mBwAllowed
  3926. * to be reset. RLM related parameters will be reset again when handling
  3927. * association response in rlmProcessAssocRsp(). 20110413
  3928. */
  3929. /* rlmBssAborted(prAdapter, prAisBssInfo); */
  3930. /* 4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed. */
  3931. if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState)
  3932. scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
  3933. /* 4 <4> Change Media State immediately. */
  3934. aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
  3935. /* 4 <4.1> sync. with firmware */
  3936. prTargetStaRec->ucBssIndex = (MAX_BSS_INDEX + 1); /* Virtial BSSID */
  3937. nicUpdateBss(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
  3938. prTargetStaRec->ucBssIndex = prAdapter->prAisBssInfo->ucBssIndex;
  3939. } /* end of aisFsmRoamingDisconnectPrevAP() */
  3940. /*----------------------------------------------------------------------------*/
  3941. /*!
  3942. * @brief This function will update the contain of BSS_INFO_T for AIS network once
  3943. * the roaming was completed.
  3944. *
  3945. * @param IN prAdapter Pointer to the Adapter structure.
  3946. * prStaRec StaRec of roaming AP
  3947. * prAssocRspSwRfb
  3948. *
  3949. * @retval None
  3950. */
  3951. /*----------------------------------------------------------------------------*/
  3952. VOID aisUpdateBssInfoForRoamingAP(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN P_SW_RFB_T prAssocRspSwRfb)
  3953. {
  3954. P_BSS_INFO_T prAisBssInfo;
  3955. DBGLOG(AIS, LOUD, "aisUpdateBssInfoForRoamingAP()");
  3956. ASSERT(prAdapter);
  3957. prAisBssInfo = prAdapter->prAisBssInfo;
  3958. /* 4 <1.1> Change FW's Media State immediately. */
  3959. aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
  3960. /* 4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have. */
  3961. if ((prAisBssInfo->prStaRecOfAP) &&
  3962. (prAisBssInfo->prStaRecOfAP != prStaRec) && (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
  3963. /* cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1); */
  3964. cnmStaRecFree(prAdapter, prAisBssInfo->prStaRecOfAP);
  3965. }
  3966. /* 4 <1.4> Update BSS_INFO_T */
  3967. aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
  3968. /* 4 <1.3> Activate current AP's STA_RECORD_T in Driver. */
  3969. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
  3970. /* 4 <1.6> Indicate Connected Event to Host immediately. */
  3971. /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
  3972. aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
  3973. } /* end of aisFsmRoamingUpdateBss() */
  3974. #endif /* CFG_SUPPORT_ROAMING */
  3975. /*----------------------------------------------------------------------------*/
  3976. /*!
  3977. * @brief Check if there is any pending request and remove it (optional)
  3978. *
  3979. * @param prAdapter
  3980. * eReqType
  3981. * bRemove
  3982. *
  3983. * @return TRUE
  3984. * FALSE
  3985. */
  3986. /*----------------------------------------------------------------------------*/
  3987. BOOLEAN aisFsmIsRequestPending(IN P_ADAPTER_T prAdapter, IN ENUM_AIS_REQUEST_TYPE_T eReqType, IN BOOLEAN bRemove)
  3988. {
  3989. P_AIS_FSM_INFO_T prAisFsmInfo;
  3990. P_AIS_REQ_HDR_T prPendingReqHdr, prPendingReqHdrNext;
  3991. ASSERT(prAdapter);
  3992. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  3993. /* traverse through pending request list */
  3994. LINK_FOR_EACH_ENTRY_SAFE(prPendingReqHdr,
  3995. prPendingReqHdrNext, &(prAisFsmInfo->rPendingReqList), rLinkEntry, AIS_REQ_HDR_T) {
  3996. /* check for specified type */
  3997. if (prPendingReqHdr->eReqType == eReqType) {
  3998. /* check if need to remove */
  3999. if (bRemove == TRUE) {
  4000. LINK_REMOVE_KNOWN_ENTRY(&(prAisFsmInfo->rPendingReqList),
  4001. &(prPendingReqHdr->rLinkEntry));
  4002. cnmMemFree(prAdapter, prPendingReqHdr);
  4003. }
  4004. return TRUE;
  4005. }
  4006. }
  4007. return FALSE;
  4008. }
  4009. /*----------------------------------------------------------------------------*/
  4010. /*!
  4011. * @brief Get next pending request
  4012. *
  4013. * @param prAdapter
  4014. *
  4015. * @return P_AIS_REQ_HDR_T
  4016. */
  4017. /*----------------------------------------------------------------------------*/
  4018. P_AIS_REQ_HDR_T aisFsmGetNextRequest(IN P_ADAPTER_T prAdapter)
  4019. {
  4020. P_AIS_FSM_INFO_T prAisFsmInfo;
  4021. P_AIS_REQ_HDR_T prPendingReqHdr;
  4022. ASSERT(prAdapter);
  4023. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  4024. LINK_REMOVE_HEAD(&(prAisFsmInfo->rPendingReqList), prPendingReqHdr, P_AIS_REQ_HDR_T);
  4025. return prPendingReqHdr;
  4026. }
  4027. /*----------------------------------------------------------------------------*/
  4028. /*!
  4029. * @brief Insert a new request
  4030. *
  4031. * @param prAdapter
  4032. * eReqType
  4033. *
  4034. * @return TRUE
  4035. * FALSE
  4036. */
  4037. /*----------------------------------------------------------------------------*/
  4038. BOOLEAN aisFsmInsertRequest(IN P_ADAPTER_T prAdapter, IN ENUM_AIS_REQUEST_TYPE_T eReqType)
  4039. {
  4040. P_AIS_REQ_HDR_T prAisReq;
  4041. P_AIS_FSM_INFO_T prAisFsmInfo;
  4042. ASSERT(prAdapter);
  4043. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  4044. prAisReq = (P_AIS_REQ_HDR_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(AIS_REQ_HDR_T));
  4045. if (!prAisReq) {
  4046. ASSERT(0); /* Can't generate new message */
  4047. return FALSE;
  4048. }
  4049. prAisReq->eReqType = eReqType;
  4050. /* attach request into pending request list */
  4051. LINK_INSERT_TAIL(&prAisFsmInfo->rPendingReqList, &prAisReq->rLinkEntry);
  4052. return TRUE;
  4053. }
  4054. /*----------------------------------------------------------------------------*/
  4055. /*!
  4056. * @brief Flush all pending requests
  4057. *
  4058. * @param prAdapter
  4059. *
  4060. * @return (none)
  4061. */
  4062. /*----------------------------------------------------------------------------*/
  4063. VOID aisFsmFlushRequest(IN P_ADAPTER_T prAdapter)
  4064. {
  4065. P_AIS_REQ_HDR_T prAisReq;
  4066. ASSERT(prAdapter);
  4067. while ((prAisReq = aisFsmGetNextRequest(prAdapter)) != NULL)
  4068. cnmMemFree(prAdapter, prAisReq);
  4069. }
  4070. VOID aisFsmRunEventRemainOnChannel(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  4071. {
  4072. P_MSG_REMAIN_ON_CHANNEL_T prRemainOnChannel;
  4073. P_AIS_FSM_INFO_T prAisFsmInfo;
  4074. P_CONNECTION_SETTINGS_T prConnSettings;
  4075. DEBUGFUNC("aisFsmRunEventRemainOnChannel()");
  4076. ASSERT(prAdapter);
  4077. ASSERT(prMsgHdr);
  4078. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  4079. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  4080. prRemainOnChannel = (P_MSG_REMAIN_ON_CHANNEL_T) prMsgHdr;
  4081. /* record parameters */
  4082. prAisFsmInfo->rChReqInfo.eBand = prRemainOnChannel->eBand;
  4083. prAisFsmInfo->rChReqInfo.eSco = prRemainOnChannel->eSco;
  4084. prAisFsmInfo->rChReqInfo.ucChannelNum = prRemainOnChannel->ucChannelNum;
  4085. prAisFsmInfo->rChReqInfo.u4DurationMs = prRemainOnChannel->u4DurationMs;
  4086. prAisFsmInfo->rChReqInfo.u8Cookie = prRemainOnChannel->u8Cookie;
  4087. if (prAisFsmInfo->eCurrentState == AIS_STATE_IDLE || prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR) {
  4088. /* transit to next state */
  4089. aisFsmSteps(prAdapter, AIS_STATE_REQ_REMAIN_ON_CHANNEL);
  4090. } else {
  4091. aisFsmInsertRequest(prAdapter, AIS_REQUEST_REMAIN_ON_CHANNEL);
  4092. }
  4093. /* free messages */
  4094. cnmMemFree(prAdapter, prMsgHdr);
  4095. }
  4096. VOID aisFsmRunEventCancelRemainOnChannel(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  4097. {
  4098. P_AIS_FSM_INFO_T prAisFsmInfo;
  4099. P_BSS_INFO_T prAisBssInfo;
  4100. P_MSG_CANCEL_REMAIN_ON_CHANNEL_T prCancelRemainOnChannel;
  4101. ASSERT(prAdapter);
  4102. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  4103. prAisBssInfo = prAdapter->prAisBssInfo;
  4104. prCancelRemainOnChannel = (P_MSG_CANCEL_REMAIN_ON_CHANNEL_T) prMsgHdr;
  4105. /* 1. Check the cookie first */
  4106. if (prCancelRemainOnChannel->u8Cookie == prAisFsmInfo->rChReqInfo.u8Cookie) {
  4107. /* 2. release channel privilege/request */
  4108. if (prAisFsmInfo->eCurrentState == AIS_STATE_REQ_REMAIN_ON_CHANNEL) {
  4109. /* 2.1 elease channel */
  4110. aisFsmReleaseCh(prAdapter);
  4111. } else if (prAisFsmInfo->eCurrentState == AIS_STATE_REMAIN_ON_CHANNEL) {
  4112. /* 2.1 release channel */
  4113. aisFsmReleaseCh(prAdapter);
  4114. /* 2.2 stop channel timeout timer */
  4115. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rChannelTimeoutTimer);
  4116. }
  4117. /* 3. clear pending request of remain_on_channel */
  4118. aisFsmIsRequestPending(prAdapter, AIS_REQUEST_REMAIN_ON_CHANNEL, TRUE);
  4119. /* 4. decide which state to retreat */
  4120. if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED)
  4121. aisFsmSteps(prAdapter, AIS_STATE_NORMAL_TR);
  4122. else
  4123. aisFsmSteps(prAdapter, AIS_STATE_IDLE);
  4124. }
  4125. /* 5. free message */
  4126. cnmMemFree(prAdapter, prMsgHdr);
  4127. }
  4128. VOID aisFsmRunEventMgmtFrameTx(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  4129. {
  4130. P_AIS_FSM_INFO_T prAisFsmInfo;
  4131. P_MSG_MGMT_TX_REQUEST_T prMgmtTxMsg = (P_MSG_MGMT_TX_REQUEST_T) NULL;
  4132. do {
  4133. ASSERT((prAdapter != NULL) && (prMsgHdr != NULL));
  4134. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  4135. if (prAisFsmInfo == NULL)
  4136. break;
  4137. prMgmtTxMsg = (P_MSG_MGMT_TX_REQUEST_T) prMsgHdr;
  4138. aisFuncTxMgmtFrame(prAdapter,
  4139. &prAisFsmInfo->rMgmtTxInfo, prMgmtTxMsg->prMgmtMsduInfo, prMgmtTxMsg->u8Cookie);
  4140. } while (FALSE);
  4141. if (prMsgHdr)
  4142. cnmMemFree(prAdapter, prMsgHdr);
  4143. } /* aisFsmRunEventMgmtFrameTx */
  4144. VOID aisFsmRunEventChannelTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr)
  4145. {
  4146. P_AIS_FSM_INFO_T prAisFsmInfo;
  4147. P_BSS_INFO_T prAisBssInfo;
  4148. DEBUGFUNC("aisFsmRunEventRemainOnChannel()");
  4149. ASSERT(prAdapter);
  4150. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  4151. prAisBssInfo = prAdapter->prAisBssInfo;
  4152. if (prAisFsmInfo->eCurrentState == AIS_STATE_REMAIN_ON_CHANNEL) {
  4153. /* 1. release channel */
  4154. aisFsmReleaseCh(prAdapter);
  4155. /* 2. stop channel timeout timer */
  4156. cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rChannelTimeoutTimer);
  4157. /* 3. expiration indication to upper layer */
  4158. kalRemainOnChannelExpired(prAdapter->prGlueInfo,
  4159. prAisFsmInfo->rChReqInfo.u8Cookie,
  4160. prAisFsmInfo->rChReqInfo.eBand,
  4161. prAisFsmInfo->rChReqInfo.eSco, prAisFsmInfo->rChReqInfo.ucChannelNum);
  4162. /* 4. decide which state to retreat */
  4163. if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED)
  4164. aisFsmSteps(prAdapter, AIS_STATE_NORMAL_TR);
  4165. else
  4166. aisFsmSteps(prAdapter, AIS_STATE_IDLE);
  4167. } else {
  4168. DBGLOG(AIS, WARN, "Unexpected remain_on_channel timeout event\n");
  4169. #if DBG
  4170. DBGLOG(AIS, STATE, "CURRENT State: [%s]\n", apucDebugAisState[prAisFsmInfo->eCurrentState]);
  4171. #else
  4172. DBGLOG(AIS, STATE, "[%d] CURRENT State: [%d]\n", DBG_AIS_IDX, prAisFsmInfo->eCurrentState);
  4173. #endif
  4174. }
  4175. }
  4176. WLAN_STATUS
  4177. aisFsmRunEventMgmtFrameTxDone(IN P_ADAPTER_T prAdapter,
  4178. IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus)
  4179. {
  4180. P_AIS_FSM_INFO_T prAisFsmInfo;
  4181. P_AIS_MGMT_TX_REQ_INFO_T prMgmtTxReqInfo = (P_AIS_MGMT_TX_REQ_INFO_T) NULL;
  4182. BOOLEAN fgIsSuccess = FALSE;
  4183. do {
  4184. ASSERT((prAdapter != NULL) && (prMsduInfo != NULL));
  4185. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  4186. prMgmtTxReqInfo = &(prAisFsmInfo->rMgmtTxInfo);
  4187. if (rTxDoneStatus == TX_RESULT_SUCCESS)
  4188. fgIsSuccess = TRUE;
  4189. if (prMgmtTxReqInfo->prMgmtTxMsdu == prMsduInfo) {
  4190. kalIndicateMgmtTxStatus(prAdapter->prGlueInfo,
  4191. prMgmtTxReqInfo->u8Cookie,
  4192. fgIsSuccess, prMsduInfo->prPacket, (UINT_32) prMsduInfo->u2FrameLength);
  4193. prMgmtTxReqInfo->prMgmtTxMsdu = NULL;
  4194. }
  4195. } while (FALSE);
  4196. return WLAN_STATUS_SUCCESS;
  4197. } /* aisFsmRunEventMgmtFrameTxDone */
  4198. WLAN_STATUS
  4199. aisFuncTxMgmtFrame(IN P_ADAPTER_T prAdapter,
  4200. IN P_AIS_MGMT_TX_REQ_INFO_T prMgmtTxReqInfo, IN P_MSDU_INFO_T prMgmtTxMsdu, IN UINT_64 u8Cookie)
  4201. {
  4202. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  4203. P_MSDU_INFO_T prTxMsduInfo = (P_MSDU_INFO_T) NULL;
  4204. P_WLAN_MAC_HEADER_T prWlanHdr = (P_WLAN_MAC_HEADER_T) NULL;
  4205. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  4206. do {
  4207. ASSERT((prAdapter != NULL) && (prMgmtTxReqInfo != NULL));
  4208. if (prMgmtTxReqInfo->fgIsMgmtTxRequested) {
  4209. /* 1. prMgmtTxReqInfo->prMgmtTxMsdu != NULL */
  4210. /* Packet on driver, not done yet, drop it. */
  4211. prTxMsduInfo = prMgmtTxReqInfo->prMgmtTxMsdu;
  4212. if (prTxMsduInfo != NULL) {
  4213. kalIndicateMgmtTxStatus(prAdapter->prGlueInfo,
  4214. prMgmtTxReqInfo->u8Cookie,
  4215. FALSE,
  4216. prTxMsduInfo->prPacket, (UINT_32) prTxMsduInfo->u2FrameLength);
  4217. /* Leave it to TX Done handler. */
  4218. /* cnmMgtPktFree(prAdapter, prTxMsduInfo); */
  4219. prMgmtTxReqInfo->prMgmtTxMsdu = NULL;
  4220. }
  4221. /* 2. prMgmtTxReqInfo->prMgmtTxMsdu == NULL */
  4222. /* Packet transmitted, wait tx done. (cookie issue) */
  4223. }
  4224. ASSERT(prMgmtTxReqInfo->prMgmtTxMsdu == NULL);
  4225. prWlanHdr = (P_WLAN_MAC_HEADER_T) ((ULONG) prMgmtTxMsdu->prPacket + MAC_TX_RESERVED_FIELD);
  4226. prStaRec = cnmGetStaRecByAddress(prAdapter, prAdapter->prAisBssInfo->ucBssIndex, prWlanHdr->aucAddr1);
  4227. TX_SET_MMPDU(prAdapter,
  4228. prMgmtTxMsdu,
  4229. (prStaRec !=
  4230. NULL) ? (prStaRec->ucBssIndex) : (prAdapter->prAisBssInfo->ucBssIndex),
  4231. (prStaRec != NULL) ? (prStaRec->ucIndex) : (STA_REC_INDEX_NOT_FOUND),
  4232. WLAN_MAC_MGMT_HEADER_LEN, prMgmtTxMsdu->u2FrameLength,
  4233. aisFsmRunEventMgmtFrameTxDone, MSDU_RATE_MODE_AUTO);
  4234. prMgmtTxReqInfo->u8Cookie = u8Cookie;
  4235. prMgmtTxReqInfo->prMgmtTxMsdu = prMgmtTxMsdu;
  4236. prMgmtTxReqInfo->fgIsMgmtTxRequested = TRUE;
  4237. nicTxConfigPktControlFlag(prMgmtTxMsdu, MSDU_CONTROL_FLAG_FORCE_TX, TRUE);
  4238. /* send to TX queue */
  4239. nicTxEnqueueMsdu(prAdapter, prMgmtTxMsdu);
  4240. } while (FALSE);
  4241. return rWlanStatus;
  4242. } /* aisFuncTxMgmtFrame */
  4243. /*----------------------------------------------------------------------------*/
  4244. /*!
  4245. * @brief This function will validate the Rx Action Frame and indicate to uppoer layer
  4246. * if the specified conditions were matched.
  4247. *
  4248. * @param[in] prAdapter Pointer to the Adapter structure.
  4249. * @param[in] prSwRfb Pointer to SW RFB data structure.
  4250. * @param[out] pu4ControlFlags Control flags for replying the Probe Response
  4251. *
  4252. * @retval none
  4253. */
  4254. /*----------------------------------------------------------------------------*/
  4255. VOID aisFuncValidateRxActionFrame(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  4256. {
  4257. P_AIS_FSM_INFO_T prAisFsmInfo = (P_AIS_FSM_INFO_T) NULL;
  4258. DEBUGFUNC("aisFuncValidateRxActionFrame");
  4259. do {
  4260. ASSERT((prAdapter != NULL) && (prSwRfb != NULL));
  4261. prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
  4262. if (1 /* prAisFsmInfo->u4AisPacketFilter & PARAM_PACKET_FILTER_ACTION_FRAME */) {
  4263. /* Leave the action frame to wpa_supplicant. */
  4264. kalIndicateRxMgmtFrame(prAdapter->prGlueInfo, prSwRfb);
  4265. }
  4266. } while (FALSE);
  4267. return;
  4268. } /* aisFuncValidateRxActionFrame */