wlan_bow.c 119 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441
  1. /*
  2. ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/common/wlan_bow.c#1
  3. */
  4. /*! \file wlan_bow.c
  5. \brief This file contains the 802.11 PAL commands processing routines for
  6. MediaTek Inc. 802.11 Wireless LAN Adapters.
  7. */
  8. /*
  9. ** Log: wlan_bow.c
  10. *
  11. * 03 02 2012 terry.wu
  12. * NULL
  13. * Sync CFG80211 modification from branch 2,2.
  14. *
  15. * 01 16 2012 chinghwa.yu
  16. * [WCXRP00000065] Update BoW design and settings
  17. * Support BOW for 5GHz band.
  18. *
  19. * 01 09 2012 chinghwa.yu
  20. * [WCXRP00000065] Update BoW design and settings
  21. * [ALPS00110632] [Rose][LCA42][Cross Feature][Bluetooth]The "KE" pops up after the device reboots automatically.(once)
  22. *
  23. * Fix bow link disconnected event dereference.
  24. *
  25. * 09 29 2011 cm.chang
  26. * NULL
  27. * Change the function prototype of rlmDomainGetChnlList()
  28. *
  29. * 07 06 2011 terry.wu
  30. * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
  31. * Improve BoW connection establishment speed.
  32. *
  33. * 06 23 2011 cp.wu
  34. * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
  35. * change parameter name from PeerAddr to BSSID
  36. *
  37. * 06 21 2011 terry.wu
  38. * NULL
  39. * Fix BoW KE.
  40. *
  41. * 06 20 2011 terry.wu
  42. * NULL
  43. * Add BoW Rate Limitation.
  44. *
  45. * 06 20 2011 cp.wu
  46. * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
  47. * 1. specify target's BSSID when requesting channel privilege.
  48. * 2. pass BSSID information to firmware domain
  49. *
  50. * 06 17 2011 terry.wu
  51. * NULL
  52. * Add BoW 11N support.
  53. *
  54. * 06 07 2011 cp.wu
  55. * [WCXRP00000681] [MT5931][Firmware] HIF code size reduction
  56. * aware more compile options.
  57. *
  58. * 05 25 2011 terry.wu
  59. * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
  60. * Add BoW Cancel Scan Request and Turn On deactive network function.
  61. *
  62. * 05 23 2011 terry.wu
  63. * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
  64. * Add some BoW error handling.
  65. *
  66. * 05 22 2011 terry.wu
  67. * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
  68. * .
  69. *
  70. * 05 22 2011 terry.wu
  71. * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
  72. * Only reply probe response to its peer or mached SSID for BoW AP.
  73. *
  74. * 05 22 2011 terry.wu
  75. * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
  76. * Add BoW SAA retry and disable disconnect event when AAA fail .
  77. *
  78. * 05 21 2011 terry.wu
  79. * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
  80. * Protect BoW connection establishment.
  81. *
  82. * 05 17 2011 terry.wu
  83. * [WCXRP00000730] [MT6620 Wi-Fi][BoW] Send deauth while disconnecting
  84. * Send deauth while disconnecting BoW link.
  85. *
  86. * 05 17 2011 terry.wu
  87. * [WCXRP00000707] [MT6620 Wi-Fi][Driver] Fix BoW Multiple Physical Link connect/disconnect issue
  88. * Fix wrong StaRec state of BoW .
  89. *
  90. * 05 06 2011 terry.wu
  91. * [WCXRP00000707] [MT6620 Wi-Fi][Driver] Fix BoW Multiple Physical Link connect/disconnect issue
  92. * Fix BoW Multiple Physical Link connect/disconnect issue.
  93. *
  94. * 05 03 2011 chinghwa.yu
  95. * [WCXRP00000065] Update BoW design and settings
  96. * Use kalMemAlloc to allocate event buffer for kalIndicateBOWEvent.
  97. *
  98. * 04 15 2011 chinghwa.yu
  99. * [WCXRP00000065] Update BoW design and settings
  100. * Fix prAssocRspSwRfb casting.
  101. *
  102. * 04 15 2011 chinghwa.yu
  103. * [WCXRP00000065] Update BoW design and settings
  104. * Add BOW short range mode.
  105. *
  106. * 04 12 2011 chinghwa.yu
  107. * [WCXRP00000065] Update BoW design and settings
  108. * Add WMM IE for BOW initiator data.
  109. *
  110. * 04 10 2011 chinghwa.yu
  111. * [WCXRP00000065] Update BoW design and settings
  112. * Change Link disconnection event procedure for hotspot and change skb length check to 1514 bytes.
  113. *
  114. * 04 09 2011 chinghwa.yu
  115. * [WCXRP00000065] Update BoW design and settings
  116. * Change Link connection event procedure and change skb length check to 1512 bytes.
  117. *
  118. * 03 28 2011 chinghwa.yu
  119. * [WCXRP00000065] Update BoW design and settings
  120. * Simplify link disconnected routine, remove link disconnected other routine.
  121. *
  122. * 03 27 2011 chinghwa.yu
  123. * [WCXRP00000065] Update BoW design and settings
  124. * Support multiple physical link.
  125. *
  126. * 03 27 2011 chinghwa.yu
  127. * [WCXRP00000065] Update BoW design and settings
  128. * Add new feature - multiple physical link support.
  129. *
  130. * 02 22 2011 wh.su
  131. * [WCXRP00000486] [MT6620 Wi-Fi][BOW] Fixed the bow send frame but not encrypted issue
  132. * fixed the BOW packet sending without encrypted issue.
  133. *
  134. * 02 21 2011 chinghwa.yu
  135. * [WCXRP00000065] Update BoW design and settings
  136. * Fix BOW link disconnection bug.
  137. *
  138. * 02 16 2011 chinghwa.yu
  139. * [WCXRP00000065] Update BoW design and settings
  140. * Add bowNotifyAllLinkDisconnected interface and change channel grant procedure for bow starting.
  141. *
  142. * 02 11 2011 chinghwa.yu
  143. * [WCXRP00000065] Update BoW design and settings
  144. * Update BOW channel granted function.
  145. *
  146. * 02 10 2011 chinghwa.yu
  147. * [WCXRP00000065] Update BoW design and settings
  148. * Fix kernel API change issue.
  149. * Before ALPS 2.2 (2.2 included), kfifo_alloc() is
  150. * struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask, spinlock_t *lock);
  151. * After ALPS 2.3, kfifo_alloc() is changed to
  152. * int kfifo_alloc(struct kfifo *fifo, unsigned int size, gfp_t gfp_mask);
  153. *
  154. * 02 09 2011 cp.wu
  155. * [WCXRP00000430] [MT6620 Wi-Fi][Firmware][Driver] Create V1.2 branch for MT6620E1 and MT6620E3
  156. * create V1.2 driver branch based on label MT6620_WIFI_DRIVER_V1_2_110209_1031
  157. * with BOW and P2P enabled as default
  158. *
  159. * 02 08 2011 chinghwa.yu
  160. * [WCXRP00000065] Update BoW design and settings
  161. * Replace kfifo_get and kfifo_put with kfifo_out and kfifo_in.
  162. * Update BOW get MAC status, remove returning event for AIS network type.
  163. *
  164. * 01 26 2011 cm.chang
  165. * [WCXRP00000395] [MT6620 Wi-Fi][Driver][FW] Search STA_REC with additional net type index argument
  166. * .
  167. *
  168. * 01 11 2011 chinghwa.yu
  169. * [WCXRP00000065] Update BoW design and settings
  170. * Update BOW Activity Report structure and bug fix.
  171. *
  172. * 01 10 2011 chinghwa.yu
  173. * [WCXRP00000065] Update BoW design and settings
  174. * Update BOW to support multiple physical link.
  175. *
  176. * 12 08 2010 chinghwa.yu
  177. * [WCXRP00000065] Update BoW design and settings
  178. * Support concurrent networks.
  179. *
  180. * 12 07 2010 cm.chang
  181. * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
  182. * 1. BSSINFO include RLM parameter
  183. * 2. free all sta records when network is disconnected
  184. *
  185. * 11 11 2010 chinghwa.yu
  186. * [WCXRP00000065] Update BoW design and settings
  187. * Fix BoW timer assert issue.
  188. *
  189. * 10 18 2010 chinghwa.yu
  190. * [WCXRP00000110] [MT6620 Wi-Fi] [Driver] Fix BoW Connected event size
  191. * Fix for event returnning Band.
  192. *
  193. * 10 18 2010 chinghwa.yu
  194. * [WCXRP00000110] [MT6620 Wi-Fi] [Driver] Fix BoW Connected event size
  195. * Fix wrong BoW event size.
  196. *
  197. * 10 04 2010 cp.wu
  198. * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced
  199. * by ENUM_NETWORK_TYPE_INDEX_T only remove ENUM_NETWORK_TYPE_T definitions
  200. *
  201. * 09 27 2010 chinghwa.yu
  202. * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000065] Update BoW design and settings
  203. * Update BCM/BoW design and settings.
  204. *
  205. * 09 16 2010 chinghwa.yu
  206. * NULL
  207. * Fix bowResponderScanDone error when prBssDesc is NULL.
  208. *
  209. * 09 14 2010 chinghwa.yu
  210. * NULL
  211. * Add bowRunEventAAAComplete.
  212. *
  213. * 09 14 2010 cp.wu
  214. * NULL
  215. * indicate correct AIS network information for PAL.
  216. *
  217. * 09 03 2010 kevin.huang
  218. * NULL
  219. * Refine #include sequence and solve recursive/nested #include issue
  220. *
  221. * 08 24 2010 cm.chang
  222. * NULL
  223. * Support RLM initail channel of Ad-hoc, P2P and BOW
  224. *
  225. * 08 24 2010 chinghwa.yu
  226. * NULL
  227. * Initialize nicActivateNetwork(prAdapter as soon as bow is starting..
  228. *
  229. * 08 24 2010 chinghwa.yu
  230. * NULL
  231. * Update BOW for the 1st time.
  232. *
  233. * 08 23 2010 cp.wu
  234. * NULL
  235. * revise constant definitions to be matched with implementation (original cmd-event definition is deprecated)
  236. *
  237. * 07 30 2010 cp.wu
  238. * NULL
  239. * 1) BoW wrapper: use definitions instead of hard-coded constant for error code
  240. * 2) AIS-FSM: eliminate use of desired RF parameters, use prTargetBssDesc instead
  241. * 3) add handling for RX_PKT_DESTINATION_HOST_WITH_FORWARD for GO-broadcast frames
  242. *
  243. * 07 15 2010 cp.wu
  244. *
  245. * sync. bluetooth-over-Wi-Fi interface to driver interface document v0.2.6.
  246. *
  247. * 07 08 2010 cp.wu
  248. *
  249. * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
  250. *
  251. * 06 25 2010 cp.wu
  252. * [WPD00003833][MT6620 and MT5931] Driver migration
  253. * add API in que_mgt to retrieve sta-rec index for security frames.
  254. *
  255. * 06 24 2010 cp.wu
  256. * [WPD00003833][MT6620 and MT5931] Driver migration
  257. * 802.1x and bluetooth-over-Wi-Fi security frames are now delievered to firmware via command path instead of data path.
  258. *
  259. * 06 11 2010 cp.wu
  260. * [WPD00003833][MT6620 and MT5931] Driver migration
  261. * 1) migrate assoc.c.
  262. * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
  263. * 3) add configuration options for CNM_MEM and RSN modules
  264. * 4) add data path for management frames
  265. * 5) eliminate rPacketInfo of MSDU_INFO_T
  266. *
  267. * 06 06 2010 kevin.huang
  268. * [WPD00003832][MT6620 5931] Create driver base
  269. * [MT6620 5931] Create driver base
  270. *
  271. * 05 17 2010 cp.wu
  272. * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
  273. * 1) add timeout handler mechanism for pending command packets
  274. * 2) add p2p add/removal key
  275. *
  276. * 05 13 2010 cp.wu
  277. * [WPD00001943]Create WiFi test driver framework on WinXP
  278. * add NULL OID implementation for WOL-related OIDs.
  279. *
  280. * 05 13 2010 cp.wu
  281. * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
  282. * 1) all BT physical handles shares the same RSSI/Link Quality.
  283. * 2) simplify BT command composing
  284. *
  285. * 04 28 2010 cp.wu
  286. * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
  287. * change prefix for data structure used to communicate with 802.11 PAL
  288. * to avoid ambiguous naming with firmware interface
  289. *
  290. * 04 27 2010 cp.wu
  291. * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
  292. * add multiple physical link support
  293. *
  294. * 04 14 2010 cp.wu
  295. * [WPD00001943]Create WiFi test driver framework on WinXP
  296. * information buffer for query oid/ioctl is now buffered in prCmdInfo
  297. * instead of glue-layer variable to improve multiple oid/ioctl capability
  298. *
  299. * 04 13 2010 cp.wu
  300. * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
  301. * add framework for BT-over-Wi-Fi support.
  302. * * 1) prPendingCmdInfo is replaced by queue for multiple handler capability
  303. * * 2) command sequence number is now increased atomically
  304. * * 3) private data could be hold and taken use for other purpose
  305. **
  306. */
  307. /******************************************************************************
  308. * C O M P I L E R F L A G S
  309. *******************************************************************************
  310. */
  311. /******************************************************************************
  312. * E X T E R N A L R E F E R E N C E S
  313. *******************************************************************************
  314. */
  315. #include "precomp.h"
  316. #if CFG_ENABLE_BT_OVER_WIFI
  317. /******************************************************************************
  318. * C O N S T A N T S
  319. *******************************************************************************
  320. */
  321. /******************************************************************************
  322. * D A T A T Y P E S
  323. *******************************************************************************
  324. */
  325. /******************************************************************************
  326. * P U B L I C D A T A
  327. *******************************************************************************
  328. */
  329. static UINT_32 g_u4LinkCount;
  330. static UINT_32 g_u4Beaconing;
  331. static BOW_TABLE_T arBowTable[CFG_BOW_PHYSICAL_LINK_NUM];
  332. /******************************************************************************
  333. * P R I V A T E D A T A
  334. *******************************************************************************
  335. */
  336. const BOW_CMD_T arBowCmdTable[] = {
  337. {BOW_CMD_ID_GET_MAC_STATUS, bowCmdGetMacStatus},
  338. {BOW_CMD_ID_SETUP_CONNECTION, bowCmdSetupConnection},
  339. {BOW_CMD_ID_DESTROY_CONNECTION, bowCmdDestroyConnection},
  340. {BOW_CMD_ID_SET_PTK, bowCmdSetPTK},
  341. {BOW_CMD_ID_READ_RSSI, bowCmdReadRSSI},
  342. {BOW_CMD_ID_READ_LINK_QUALITY, bowCmdReadLinkQuality},
  343. {BOW_CMD_ID_SHORT_RANGE_MODE, bowCmdShortRangeMode},
  344. {BOW_CMD_ID_GET_CHANNEL_LIST, bowCmdGetChannelList},
  345. };
  346. /******************************************************************************
  347. * M A C R O S
  348. *******************************************************************************
  349. */
  350. /******************************************************************************
  351. * F U N C T I O N D E C L A R A T I O N S
  352. *******************************************************************************
  353. */
  354. /******************************************************************************
  355. * F U N C T I O N S
  356. *******************************************************************************
  357. */
  358. /*----------------------------------------------------------------------------*/
  359. /*!
  360. * \brief command packet generation utility
  361. *
  362. * \param[in] prAdapter Pointer to the Adapter structure.
  363. * \param[in] ucCID Command ID
  364. * \param[in] fgSetQuery Set or Query
  365. * \param[in] fgNeedResp Need for response
  366. * \param[in] pfCmdDoneHandler Function pointer when command is done
  367. * \param[in] u4SetQueryInfoLen The length of the set/query buffer
  368. * \param[in] pucInfoBuffer Pointer to set/query buffer
  369. *
  370. *
  371. * \retval WLAN_STATUS_PENDING
  372. * \retval WLAN_STATUS_FAILURE
  373. */
  374. /*----------------------------------------------------------------------------*/
  375. WLAN_STATUS
  376. wlanoidSendSetQueryBowCmd(IN P_ADAPTER_T prAdapter,
  377. IN UINT_8 ucCID,
  378. IN BOOLEAN fgSetQuery,
  379. IN BOOLEAN fgNeedResp,
  380. IN PFN_CMD_DONE_HANDLER pfCmdDoneHandler,
  381. IN PFN_CMD_TIMEOUT_HANDLER pfCmdTimeoutHandler,
  382. IN UINT_32 u4SetQueryInfoLen, IN PUINT_8 pucInfoBuffer, IN UINT_8 ucSeqNumber)
  383. {
  384. P_GLUE_INFO_T prGlueInfo;
  385. P_CMD_INFO_T prCmdInfo;
  386. P_WIFI_CMD_T prWifiCmd;
  387. UINT_8 ucCmdSeqNum;
  388. ASSERT(prAdapter);
  389. prGlueInfo = prAdapter->prGlueInfo;
  390. ASSERT(prGlueInfo);
  391. DBGLOG(REQ, TRACE, "Command ID = 0x%08X\n", ucCID);
  392. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetQueryInfoLen));
  393. if (!prCmdInfo) {
  394. DBGLOG(INIT, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  395. return WLAN_STATUS_FAILURE;
  396. }
  397. /* increase command sequence number */
  398. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  399. DBGLOG(REQ, TRACE, "ucCmdSeqNum =%d\n", ucCmdSeqNum);
  400. /* Setup common CMD Info Packet */
  401. prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
  402. prCmdInfo->eNetworkType = NETWORK_TYPE_BOW_INDEX;
  403. prCmdInfo->u2InfoBufLen = (UINT_16) (CMD_HDR_SIZE + u4SetQueryInfoLen);
  404. prCmdInfo->pfCmdDoneHandler = pfCmdDoneHandler;
  405. prCmdInfo->pfCmdTimeoutHandler = pfCmdTimeoutHandler;
  406. prCmdInfo->fgIsOid = FALSE;
  407. prCmdInfo->ucCID = ucCID;
  408. prCmdInfo->fgSetQuery = fgSetQuery;
  409. prCmdInfo->fgNeedResp = fgNeedResp;
  410. prCmdInfo->fgDriverDomainMCR = FALSE;
  411. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  412. prCmdInfo->u4SetInfoLen = u4SetQueryInfoLen;
  413. prCmdInfo->pvInformationBuffer = NULL;
  414. prCmdInfo->u4InformationBufferLength = 0;
  415. prCmdInfo->u4PrivateData = (UINT_32) ucSeqNumber;
  416. /* Setup WIFI_CMD_T (no payload) */
  417. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  418. prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
  419. prWifiCmd->ucCID = prCmdInfo->ucCID;
  420. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  421. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  422. if (u4SetQueryInfoLen > 0 && pucInfoBuffer != NULL)
  423. kalMemCopy(prWifiCmd->aucBuffer, pucInfoBuffer, u4SetQueryInfoLen);
  424. /* insert into prCmdQueue */
  425. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  426. /* wakeup txServiceThread later */
  427. GLUE_SET_EVENT(prGlueInfo);
  428. return WLAN_STATUS_PENDING;
  429. }
  430. /*----------------------------------------------------------------------------*/
  431. /*!
  432. * \brief This routine is called to dispatch command coming from 802.11 PAL
  433. *
  434. * \param[in] prAdapter Pointer to the Adapter structure.
  435. * \param[in] prCmd Pointer to the buffer that holds the command
  436. *
  437. * \retval WLAN_STATUS_SUCCESS
  438. * \retval WLAN_STATUS_INVALID_LENGTH
  439. */
  440. /*----------------------------------------------------------------------------*/
  441. WLAN_STATUS wlanbowHandleCommand(IN P_ADAPTER_T prAdapter, IN P_AMPC_COMMAND prCmd)
  442. {
  443. WLAN_STATUS retval = WLAN_STATUS_FAILURE;
  444. UINT_16 i;
  445. ASSERT(prAdapter);
  446. for (i = 0; i < sizeof(arBowCmdTable) / sizeof(BOW_CMD_T); i++) {
  447. if ((arBowCmdTable[i].uCmdID == prCmd->rHeader.ucCommandId) && arBowCmdTable[i].pfCmdHandle) {
  448. retval = arBowCmdTable[i].pfCmdHandle(prAdapter, prCmd);
  449. break;
  450. }
  451. }
  452. return retval;
  453. }
  454. /*----------------------------------------------------------------------------*/
  455. /*!
  456. * \brief This is command handler for BOW_CMD_ID_GET_MAC_STATUS
  457. * coming from 802.11 PAL
  458. *
  459. * \param[in] prAdapter Pointer to the Adapter structure.
  460. * \param[in] prCmd Pointer to the buffer that holds the command
  461. *
  462. * \retval WLAN_STATUS_SUCCESS
  463. * \retval WLAN_STATUS_INVALID_LENGTH
  464. */
  465. /*----------------------------------------------------------------------------*/
  466. WLAN_STATUS bowCmdGetMacStatus(IN P_ADAPTER_T prAdapter, IN P_AMPC_COMMAND prCmd)
  467. {
  468. P_AMPC_EVENT prEvent;
  469. P_BOW_MAC_STATUS prMacStatus;
  470. UINT_8 idx = 0;
  471. UINT_8 ucPrimaryChannel;
  472. ENUM_BAND_T eBand;
  473. ENUM_CHNL_EXT_T eBssSCO;
  474. UINT_8 ucNumOfChannel = 0; /* MAX_BOW_NUMBER_OF_CHANNEL; */
  475. RF_CHANNEL_INFO_T aucChannelList[MAX_BOW_NUMBER_OF_CHANNEL];
  476. ASSERT(prAdapter);
  477. /* 3 <1> If LinkCount != 0 -> OK (optional) */
  478. eBand = BAND_2G4;
  479. eBssSCO = CHNL_EXT_SCN;
  480. /* fill event header */
  481. prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_MAC_STATUS)), VIR_MEM_TYPE);
  482. if (!prEvent) {
  483. ASSERT(FALSE);
  484. return WLAN_STATUS_FAILURE;
  485. }
  486. prEvent->rHeader.ucEventId = BOW_EVENT_ID_MAC_STATUS;
  487. prEvent->rHeader.ucSeqNumber = prCmd->rHeader.ucSeqNumber;
  488. prEvent->rHeader.u2PayloadLength = sizeof(BOW_MAC_STATUS);
  489. /* fill event body */
  490. prMacStatus = (P_BOW_MAC_STATUS) (prEvent->aucPayload);
  491. kalMemZero(prMacStatus, sizeof(BOW_MAC_STATUS));
  492. /* 3 <2> Call CNM to decide if BOW available. */
  493. if (cnmBowIsPermitted(prAdapter))
  494. prMacStatus->ucAvailability = TRUE;
  495. else
  496. prMacStatus->ucAvailability = FALSE;
  497. memcpy(prMacStatus->aucMacAddr, prAdapter->rWifiVar.aucDeviceAddress, PARAM_MAC_ADDR_LEN);
  498. if (cnmPreferredChannel(prAdapter, &eBand, &ucPrimaryChannel, &eBssSCO)) {
  499. #if CFG_BOW_TEST
  500. DBGLOG(BOW, TRACE, "bowCmdGetMacStatus, Get preferred channel.\n");
  501. #endif
  502. prMacStatus->ucNumOfChannel = 1;
  503. prMacStatus->arChannelList[0].ucChannelBand = eBand;
  504. prMacStatus->arChannelList[0].ucChannelNum = ucPrimaryChannel;
  505. } else {
  506. #if CFG_BOW_TEST
  507. DBGLOG(BOW, TRACE,
  508. "bowCmdGetMacStatus, Get channel list. Current number of channel, %d.\n", ucNumOfChannel);
  509. #endif
  510. rlmDomainGetChnlList(prAdapter, BAND_2G4, MAX_BOW_NUMBER_OF_CHANNEL_2G4, &ucNumOfChannel,
  511. aucChannelList);
  512. if (ucNumOfChannel > 0) {
  513. for (idx = 0; idx < ucNumOfChannel /*MAX_BOW_NUMBER_OF_CHANNEL_2G4 */; idx++) {
  514. prMacStatus->arChannelList[idx].ucChannelBand = aucChannelList[idx].eBand;
  515. prMacStatus->arChannelList[idx].ucChannelNum = aucChannelList[idx].ucChannelNum;
  516. }
  517. prMacStatus->ucNumOfChannel = ucNumOfChannel;
  518. }
  519. rlmDomainGetChnlList(prAdapter, BAND_5G, MAX_BOW_NUMBER_OF_CHANNEL_5G, &ucNumOfChannel, aucChannelList);
  520. if (ucNumOfChannel > 0) {
  521. for (idx = 0; idx < ucNumOfChannel /*MAX_BOW_NUMBER_OF_CHANNEL_5G */; idx++) {
  522. prMacStatus->arChannelList[prMacStatus->ucNumOfChannel + idx].ucChannelBand =
  523. aucChannelList[idx].eBand;
  524. prMacStatus->arChannelList[prMacStatus->ucNumOfChannel + idx].ucChannelNum =
  525. aucChannelList[idx].ucChannelNum;
  526. }
  527. prMacStatus->ucNumOfChannel = prMacStatus->ucNumOfChannel + ucNumOfChannel;
  528. }
  529. }
  530. #if CFG_BOW_TEST
  531. DBGLOG(BOW, TRACE,
  532. "ucNumOfChannel,eBand,aucChannelList,%x,%x,%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x.\n",
  533. ucNumOfChannel, aucChannelList[0].eBand, aucChannelList[0].ucChannelNum, aucChannelList[1].ucChannelNum,
  534. aucChannelList[2].ucChannelNum, aucChannelList[3].ucChannelNum, aucChannelList[4].ucChannelNum,
  535. aucChannelList[5].ucChannelNum, aucChannelList[6].ucChannelNum, aucChannelList[7].ucChannelNum,
  536. aucChannelList[8].ucChannelNum, aucChannelList[9].ucChannelNum, aucChannelList[10].ucChannelNum,
  537. aucChannelList[11].ucChannelNum, aucChannelList[12].ucChannelNum, aucChannelList[13].ucChannelNum,
  538. aucChannelList[14].ucChannelNum, aucChannelList[15].ucChannelNum, aucChannelList[16].ucChannelNum,
  539. aucChannelList[17].ucChannelNum));
  540. DBGLOG(BOW, TRACE,
  541. "prMacStatus->ucNumOfChannel, eBand, %x, %x.\n",
  542. prMacStatus->ucNumOfChannel, prMacStatus->arChannelList[0].ucChannelBand);
  543. DBGLOG(BOW, TRACE,
  544. "prMacStatus->arChannelList, %x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x.\n",
  545. prMacStatus->arChannelList[0].ucChannelNum, prMacStatus->arChannelList[1].ucChannelNum,
  546. prMacStatus->arChannelList[2].ucChannelNum, prMacStatus->arChannelList[3].ucChannelNum,
  547. prMacStatus->arChannelList[4].ucChannelNum, prMacStatus->arChannelList[5].ucChannelNum,
  548. prMacStatus->arChannelList[6].ucChannelNum, prMacStatus->arChannelList[7].ucChannelNum,
  549. prMacStatus->arChannelList[8].ucChannelNum, prMacStatus->arChannelList[9].ucChannelNum,
  550. prMacStatus->arChannelList[10].ucChannelNum, prMacStatus->arChannelList[11].ucChannelNum,
  551. prMacStatus->arChannelList[12].ucChannelNum, prMacStatus->arChannelList[13].ucChannelNum,
  552. prMacStatus->arChannelList[14].ucChannelNum, prMacStatus->arChannelList[15].ucChannelNum,
  553. prMacStatus->arChannelList[16].ucChannelNum, prMacStatus->arChannelList[17].ucChannelNum));
  554. DBGLOG(BOW, TRACE, "prMacStatus->ucNumOfChannel, %x.\n", prMacStatus->ucNumOfChannel);
  555. DBGLOG(BOW, TRACE,
  556. "prMacStatus->arChannelList[0].ucChannelBand, %x.\n", prMacStatus->arChannelList[0].ucChannelBand);
  557. DBGLOG(BOW, TRACE,
  558. "prMacStatus->arChannelList[0].ucChannelNum, %x.\n", prMacStatus->arChannelList[0].ucChannelNum);
  559. DBGLOG(BOW, TRACE, "prMacStatus->ucAvailability, %x.\n", prMacStatus->ucAvailability);
  560. DBGLOG(BOW, TRACE, "prMacStatus->aucMacAddr, %x:%x:%x:%x:%x:%x.\n",
  561. prMacStatus->aucMacAddr[0],
  562. prMacStatus->aucMacAddr[1],
  563. prMacStatus->aucMacAddr[2],
  564. prMacStatus->aucMacAddr[3], prMacStatus->aucMacAddr[4], prMacStatus->aucMacAddr[5]));
  565. #endif
  566. kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
  567. kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_MAC_STATUS)));
  568. return WLAN_STATUS_SUCCESS;
  569. }
  570. /*----------------------------------------------------------------------------*/
  571. /*!
  572. * \brief This is command handler for BOW_CMD_ID_SETUP_CONNECTION
  573. * coming from 802.11 PAL
  574. *
  575. * \param[in] prAdapter Pointer to the Adapter structure.
  576. * \param[in] prCmd Pointer to the buffer that holds the command
  577. *
  578. * \retval WLAN_STATUS_SUCCESS
  579. * \retval WLAN_STATUS_INVALID_LENGTH
  580. */
  581. /*----------------------------------------------------------------------------*/
  582. WLAN_STATUS bowCmdSetupConnection(IN P_ADAPTER_T prAdapter, IN P_AMPC_COMMAND prCmd)
  583. {
  584. P_BOW_SETUP_CONNECTION prBowSetupConnection;
  585. CMD_BT_OVER_WIFI rCmdBtOverWifi;
  586. P_BOW_FSM_INFO_T prBowFsmInfo;
  587. BOW_TABLE_T rBowTable;
  588. UINT_8 ucBowTableIdx = 0;
  589. ASSERT(prAdapter);
  590. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  591. prBowSetupConnection = (P_BOW_SETUP_CONNECTION) &(prCmd->aucPayload[0]);
  592. /* parameter size check */
  593. if (prCmd->rHeader.u2PayloadLength != sizeof(BOW_SETUP_CONNECTION)) {
  594. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_INVALID);
  595. return WLAN_STATUS_INVALID_LENGTH;
  596. }
  597. /* 3 <1> If ucLinkCount >= 4 -> Fail. */
  598. if (g_u4LinkCount >= CFG_BOW_PHYSICAL_LINK_NUM) {
  599. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
  600. return WLAN_STATUS_NOT_ACCEPTED;
  601. }
  602. /* 3 <2> Call CNM, check if BOW is available. */
  603. if (!cnmBowIsPermitted(prAdapter)) {
  604. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
  605. return WLAN_STATUS_NOT_ACCEPTED;
  606. }
  607. /* 3 <3> Lookup BOW Table, if Peer MAC address exist and valid -> Fail. */
  608. if (bowCheckBowTableIfVaild(prAdapter, prBowSetupConnection->aucPeerAddress)) {
  609. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
  610. return WLAN_STATUS_NOT_ACCEPTED;
  611. }
  612. if (EQUAL_MAC_ADDR(prBowSetupConnection->aucPeerAddress, prAdapter->rWifiVar.aucDeviceAddress)) {
  613. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_INVALID);
  614. return WLAN_STATUS_NOT_ACCEPTED;
  615. }
  616. /* fill CMD_BT_OVER_WIFI */
  617. rCmdBtOverWifi.ucAction = BOW_SETUP_CMD;
  618. rCmdBtOverWifi.ucChannelNum = prBowSetupConnection->ucChannelNum;
  619. COPY_MAC_ADDR(rCmdBtOverWifi.rPeerAddr, prBowSetupConnection->aucPeerAddress);
  620. rCmdBtOverWifi.u2BeaconInterval = prBowSetupConnection->u2BeaconInterval;
  621. rCmdBtOverWifi.ucTimeoutDiscovery = prBowSetupConnection->ucTimeoutDiscovery;
  622. rCmdBtOverWifi.ucTimeoutInactivity = prBowSetupConnection->ucTimeoutInactivity;
  623. rCmdBtOverWifi.ucRole = prBowSetupConnection->ucRole;
  624. rCmdBtOverWifi.PAL_Capabilities = prBowSetupConnection->ucPAL_Capabilities;
  625. rCmdBtOverWifi.cMaxTxPower = prBowSetupConnection->cMaxTxPower;
  626. if (prBowSetupConnection->ucChannelNum > 14)
  627. rCmdBtOverWifi.ucChannelBand = BAND_5G;
  628. else
  629. rCmdBtOverWifi.ucChannelBand = BAND_2G4;
  630. COPY_MAC_ADDR(prBowFsmInfo->aucPeerAddress, prBowSetupConnection->aucPeerAddress);
  631. #if CFG_BOW_PHYSICAL_LINK_NUM > 1
  632. /*Channel check for supporting multiple physical link */
  633. if (g_u4LinkCount > 0) {
  634. if (prBowSetupConnection->ucChannelNum != prBowFsmInfo->ucPrimaryChannel) {
  635. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
  636. return WLAN_STATUS_NOT_ACCEPTED;
  637. }
  638. }
  639. #endif
  640. prBowFsmInfo->ucPrimaryChannel = prBowSetupConnection->ucChannelNum;
  641. prBowFsmInfo->eBand = rCmdBtOverWifi.ucChannelBand;
  642. prBowFsmInfo->u2BeaconInterval = prBowSetupConnection->u2BeaconInterval;
  643. prBowFsmInfo->ucRole = prBowSetupConnection->ucRole;
  644. if (prBowSetupConnection->ucPAL_Capabilities > 0)
  645. prBowFsmInfo->fgSupportQoS = TRUE;
  646. #if CFG_BOW_TEST
  647. DBGLOG(BOW, EVENT, "bowCmdSetupConnection.\n");
  648. DBGLOG(BOW, EVENT, "rCmdBtOverWifi Channel Number - 0x%x.\n", rCmdBtOverWifi.ucChannelNum);
  649. DBGLOG(BOW, EVENT, "rCmdBtOverWifi Peer address - %x:%x:%x:%x:%x:%x.\n", rCmdBtOverWifi.rPeerAddr[0],
  650. rCmdBtOverWifi.rPeerAddr[1],
  651. rCmdBtOverWifi.rPeerAddr[2],
  652. rCmdBtOverWifi.rPeerAddr[3], rCmdBtOverWifi.rPeerAddr[4], rCmdBtOverWifi.rPeerAddr[5]);
  653. DBGLOG(BOW, EVENT, "rCmdBtOverWifi Beacon interval - 0x%x.\n", rCmdBtOverWifi.u2BeaconInterval);
  654. DBGLOG(BOW, EVENT, "rCmdBtOverWifi Timeout activity - 0x%x.\n", rCmdBtOverWifi.ucTimeoutDiscovery);
  655. DBGLOG(BOW, EVENT, "rCmdBtOverWifi Timeout inactivity - 0x%x.\n", rCmdBtOverWifi.ucTimeoutInactivity);
  656. DBGLOG(BOW, EVENT, "rCmdBtOverWifi Role - 0x%x.\n", rCmdBtOverWifi.ucRole);
  657. DBGLOG(BOW, EVENT, "rCmdBtOverWifi PAL capability - 0x%x.\n", rCmdBtOverWifi.PAL_Capabilities);
  658. DBGLOG(BOW, EVENT, "rCmdBtOverWifi Max Tx power - 0x%x.\n", rCmdBtOverWifi.cMaxTxPower);
  659. #endif
  660. /* 3 <4> Get a free BOW entry, mark as Valid, fill in Peer MAC address, LinkCount += 1, state == Starting. */
  661. if (!bowGetBowTableFreeEntry(prAdapter, &ucBowTableIdx)) {
  662. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
  663. return WLAN_STATUS_NOT_ACCEPTED;
  664. }
  665. prBowFsmInfo->prTargetBssDesc = NULL;
  666. kalMemZero(&rBowTable, sizeof(BOW_TABLE_T));
  667. COPY_MAC_ADDR(rBowTable.aucPeerAddress, prBowSetupConnection->aucPeerAddress);
  668. /* owTable.eState = BOW_DEVICE_STATE_ACQUIRING_CHANNEL; */
  669. rBowTable.fgIsValid = TRUE;
  670. rBowTable.ucAcquireID = prBowFsmInfo->ucSeqNumOfChReq;
  671. /* rBowTable.ucRole = prBowSetupConnection->ucRole; */
  672. /* rBowTable.ucChannelNum = prBowSetupConnection->ucChannelNum; */
  673. bowSetBowTableContent(prAdapter, ucBowTableIdx, &rBowTable);
  674. kalSetBowRole(prAdapter->prGlueInfo, rCmdBtOverWifi.ucRole, prBowSetupConnection->aucPeerAddress);
  675. GLUE_INC_REF_CNT(g_u4LinkCount);
  676. #if CFG_BOW_TEST
  677. DBGLOG(BOW, EVENT, "bowStarting, g_u4LinkCount, %x.\n", g_u4LinkCount);
  678. #endif
  679. if (g_u4LinkCount == 1) {
  680. #if CFG_BOW_TEST
  681. DBGLOG(BOW, EVENT, "bowStarting, cnmTimerInitTimer.\n");
  682. DBGLOG(BOW, EVENT, "prBowFsmInfo->u2BeaconInterval, %d.\n", prBowFsmInfo->u2BeaconInterval);
  683. #endif
  684. cnmTimerInitTimer(prAdapter,
  685. &prBowFsmInfo->rStartingBeaconTimer,
  686. (PFN_MGMT_TIMEOUT_FUNC) bowSendBeacon, (ULONG) NULL);
  687. cnmTimerInitTimer(prAdapter,
  688. &prBowFsmInfo->rChGrantedTimer,
  689. (PFN_MGMT_TIMEOUT_FUNC) bowChGrantedTimeout, (ULONG) NULL);
  690. /* Reset Global Variable */
  691. g_u4Beaconing = 0;
  692. #if CFG_BOW_TEST
  693. DBGLOG(BOW, EVENT, "bowCmdSetupConnection, g_u4LinkCount, %x.\n", g_u4LinkCount);
  694. DBGLOG(BOW, EVENT, "kalInitBowDevice, bow0\n");
  695. #endif
  696. #if CFG_BOW_SEPARATE_DATA_PATH
  697. kalInitBowDevice(prAdapter->prGlueInfo, BOWDEVNAME);
  698. #endif
  699. /*Active BoW Network */
  700. SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
  701. SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
  702. nicActivateNetwork(prAdapter, NETWORK_TYPE_BOW_INDEX);
  703. }
  704. if (rCmdBtOverWifi.ucRole == BOW_INITIATOR) {
  705. bowSetBowTableState(prAdapter, prBowSetupConnection->aucPeerAddress,
  706. BOW_DEVICE_STATE_ACQUIRING_CHANNEL);
  707. bowRequestCh(prAdapter);
  708. } else {
  709. bowSetBowTableState(prAdapter, prBowSetupConnection->aucPeerAddress, BOW_DEVICE_STATE_SCANNING);
  710. bowResponderScan(prAdapter);
  711. }
  712. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_SUCCESS);
  713. return WLAN_STATUS_SUCCESS;
  714. }
  715. /*----------------------------------------------------------------------------*/
  716. /*!
  717. * \brief This is command handler for BOW_CMD_ID_DESTROY_CONNECTION
  718. * coming from 802.11 PAL
  719. *
  720. * \param[in] prAdapter Pointer to the Adapter structure.
  721. * \param[in] prCmd Pointer to the buffer that holds the command
  722. *
  723. * \retval WLAN_STATUS_SUCCESS
  724. * \retval WLAN_STATUS_INVALID_LENGTH
  725. */
  726. /*----------------------------------------------------------------------------*/
  727. WLAN_STATUS bowCmdDestroyConnection(IN P_ADAPTER_T prAdapter, IN P_AMPC_COMMAND prCmd)
  728. {
  729. P_BOW_DESTROY_CONNECTION prBowDestroyConnection;
  730. CMD_BT_OVER_WIFI rCmdBtOverWifi;
  731. P_BOW_FSM_INFO_T prBowFsmInfo;
  732. #if CFG_BOW_TEST
  733. UINT_8 ucIdx;
  734. #endif
  735. ASSERT(prAdapter);
  736. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  737. /* 3 <1> If LinkCount == 0 ->Fail (Optional) */
  738. if (g_u4LinkCount == 0) {
  739. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
  740. return WLAN_STATUS_NOT_ACCEPTED;
  741. }
  742. /* parameter size check */
  743. if (prCmd->rHeader.u2PayloadLength != sizeof(BOW_DESTROY_CONNECTION)) {
  744. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
  745. return WLAN_STATUS_INVALID_LENGTH;
  746. }
  747. /* 3 <2> Lookup BOW table, check if is not exist (Valid and Peer MAC address) -> Fail */
  748. prBowDestroyConnection = (P_BOW_DESTROY_CONNECTION) &(prCmd->aucPayload[0]);
  749. if (!bowCheckBowTableIfVaild(prAdapter, prBowDestroyConnection->aucPeerAddress)) {
  750. #if CFG_BOW_TEST
  751. DBGLOG(BOW, EVENT, "bowCmdDestroyConnection, bowCheckIfVaild, not accepted.\n");
  752. #endif
  753. return WLAN_STATUS_NOT_ACCEPTED;
  754. }
  755. #if CFG_BOW_TEST
  756. DBGLOG(BOW, EVENT,
  757. "bowCmdDestroyConnection, destroy Peer address - %x:%x:%x:%x:%x:%x.\n",
  758. prBowDestroyConnection->aucPeerAddress[0], prBowDestroyConnection->aucPeerAddress[1],
  759. prBowDestroyConnection->aucPeerAddress[2], prBowDestroyConnection->aucPeerAddress[3],
  760. prBowDestroyConnection->aucPeerAddress[4], prBowDestroyConnection->aucPeerAddress[5]));
  761. #endif
  762. /* fill CMD_BT_OVER_WIFI */
  763. rCmdBtOverWifi.ucAction = 2;
  764. COPY_MAC_ADDR(rCmdBtOverWifi.rPeerAddr, prBowDestroyConnection->aucPeerAddress);
  765. COPY_MAC_ADDR(prBowFsmInfo->aucPeerAddress, prBowDestroyConnection->aucPeerAddress);
  766. #if CFG_BOW_TEST
  767. DBGLOG(BOW, EVENT,
  768. "bowCmdDestroyConnection, rCmdBtOverWifi.rPeerAddr - %x:%x:%x:%x:%x:%x.\n", rCmdBtOverWifi.rPeerAddr[0],
  769. rCmdBtOverWifi.rPeerAddr[1], rCmdBtOverWifi.rPeerAddr[2], rCmdBtOverWifi.rPeerAddr[3],
  770. rCmdBtOverWifi.rPeerAddr[4], rCmdBtOverWifi.rPeerAddr[5]);
  771. #endif
  772. #if CFG_BOW_TEST
  773. for (ucIdx = 0; ucIdx < 11; ucIdx++) {
  774. DBGLOG(BOW, EVENT,
  775. "BoW receiving PAL packet delta time vs packet number -- %d ms vs %x.\n", ucIdx,
  776. g_arBowRevPalPacketTime[ucIdx]);
  777. }
  778. #endif
  779. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_SUCCESS);
  780. return wlanoidSendSetQueryBowCmd(prAdapter,
  781. CMD_ID_CMD_BT_OVER_WIFI,
  782. TRUE,
  783. FALSE,
  784. wlanbowCmdEventLinkDisconnected,
  785. wlanbowCmdTimeoutHandler,
  786. sizeof(CMD_BT_OVER_WIFI),
  787. (PUINT_8)&rCmdBtOverWifi, prCmd->rHeader.ucSeqNumber);
  788. }
  789. /*----------------------------------------------------------------------------*/
  790. /*!
  791. * \brief This is command handler for BOW_CMD_ID_SET_PTK
  792. * coming from 802.11 PAL
  793. *
  794. * \param[in] prAdapter Pointer to the Adapter structure.
  795. * \param[in] prCmd Pointer to the buffer that holds the command
  796. *
  797. * \retval WLAN_STATUS_SUCCESS
  798. * \retval WLAN_STATUS_INVALID_LENGTH
  799. */
  800. /*----------------------------------------------------------------------------*/
  801. WLAN_STATUS bowCmdSetPTK(IN P_ADAPTER_T prAdapter, IN P_AMPC_COMMAND prCmd)
  802. {
  803. P_BOW_SET_PTK prBowSetPTK;
  804. CMD_802_11_KEY rCmdKey;
  805. ASSERT(prAdapter);
  806. /* parameter size check */
  807. if (prCmd->rHeader.u2PayloadLength != sizeof(BOW_SET_PTK))
  808. return WLAN_STATUS_INVALID_LENGTH;
  809. prBowSetPTK = (P_BOW_SET_PTK) &(prCmd->aucPayload[0]);
  810. #if CFG_BOW_TEST
  811. DBGLOG(BOW, EVENT, "prBowSetPTK->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
  812. prBowSetPTK->aucPeerAddress[0],
  813. prBowSetPTK->aucPeerAddress[1],
  814. prBowSetPTK->aucPeerAddress[2],
  815. prBowSetPTK->aucPeerAddress[3],
  816. prBowSetPTK->aucPeerAddress[4], prBowSetPTK->aucPeerAddress[5]));
  817. DBGLOG(BOW, EVENT,
  818. "rCmdKey.ucIsAuthenticator, %x.\n", kalGetBowRole(prAdapter->prGlueInfo, prBowSetPTK->aucPeerAddress));
  819. #endif
  820. if (!bowCheckBowTableIfVaild(prAdapter, prBowSetPTK->aucPeerAddress)) {
  821. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
  822. return WLAN_STATUS_NOT_ACCEPTED;
  823. }
  824. if (bowGetBowTableState(prAdapter, prBowSetPTK->aucPeerAddress) != BOW_DEVICE_STATE_CONNECTED) {
  825. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_FAILURE);
  826. return WLAN_STATUS_NOT_ACCEPTED;
  827. }
  828. /* fill CMD_802_11_KEY */
  829. rCmdKey.ucAddRemove = 1; /* add */
  830. rCmdKey.ucTxKey = 1;
  831. rCmdKey.ucKeyType = 1;
  832. rCmdKey.ucIsAuthenticator = kalGetBowRole(prAdapter->prGlueInfo, prBowSetPTK->aucPeerAddress);
  833. COPY_MAC_ADDR(rCmdKey.aucPeerAddr, prBowSetPTK->aucPeerAddress);
  834. rCmdKey.ucNetType = NETWORK_TYPE_BOW_INDEX; /* BT Over Wi-Fi */
  835. rCmdKey.ucAlgorithmId = CIPHER_SUITE_CCMP; /* AES */
  836. rCmdKey.ucKeyId = 0;
  837. rCmdKey.ucKeyLen = 16; /* AES = 128bit */
  838. kalMemCopy(rCmdKey.aucKeyMaterial, prBowSetPTK->aucTemporalKey, 16);
  839. #if CFG_BOW_TEST
  840. DBGLOG(BOW, EVENT, "prBowSetPTK->aucTemporalKey, %x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x.\n",
  841. prBowSetPTK->aucTemporalKey[0],
  842. prBowSetPTK->aucTemporalKey[1],
  843. prBowSetPTK->aucTemporalKey[2],
  844. prBowSetPTK->aucTemporalKey[3],
  845. prBowSetPTK->aucTemporalKey[4],
  846. prBowSetPTK->aucTemporalKey[5],
  847. prBowSetPTK->aucTemporalKey[6],
  848. prBowSetPTK->aucTemporalKey[7],
  849. prBowSetPTK->aucTemporalKey[8],
  850. prBowSetPTK->aucTemporalKey[9],
  851. prBowSetPTK->aucTemporalKey[10],
  852. prBowSetPTK->aucTemporalKey[11],
  853. prBowSetPTK->aucTemporalKey[12],
  854. prBowSetPTK->aucTemporalKey[13],
  855. prBowSetPTK->aucTemporalKey[14], prBowSetPTK->aucTemporalKey[15]));
  856. DBGLOG(BOW, EVENT, "rCmdKey.aucKeyMaterial, %x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x.\n",
  857. rCmdKey.aucKeyMaterial[0],
  858. rCmdKey.aucKeyMaterial[1],
  859. rCmdKey.aucKeyMaterial[2],
  860. rCmdKey.aucKeyMaterial[3],
  861. rCmdKey.aucKeyMaterial[4],
  862. rCmdKey.aucKeyMaterial[5],
  863. rCmdKey.aucKeyMaterial[6],
  864. rCmdKey.aucKeyMaterial[7],
  865. rCmdKey.aucKeyMaterial[8],
  866. rCmdKey.aucKeyMaterial[9],
  867. rCmdKey.aucKeyMaterial[10],
  868. rCmdKey.aucKeyMaterial[11],
  869. rCmdKey.aucKeyMaterial[12],
  870. rCmdKey.aucKeyMaterial[13], rCmdKey.aucKeyMaterial[14], rCmdKey.aucKeyMaterial[15]));
  871. #endif
  872. return wlanoidSendSetQueryBowCmd(prAdapter,
  873. CMD_ID_ADD_REMOVE_KEY,
  874. TRUE,
  875. FALSE,
  876. wlanbowCmdEventSetCommon,
  877. wlanbowCmdTimeoutHandler,
  878. sizeof(CMD_802_11_KEY), (PUINT_8)&rCmdKey, prCmd->rHeader.ucSeqNumber);
  879. }
  880. /*----------------------------------------------------------------------------*/
  881. /*!
  882. * \brief This is command handler for BOW_CMD_ID_READ_RSSI
  883. * coming from 802.11 PAL
  884. *
  885. * \param[in] prAdapter Pointer to the Adapter structure.
  886. * \param[in] prCmd Pointer to the buffer that holds the command
  887. *
  888. * \retval WLAN_STATUS_SUCCESS
  889. * \retval WLAN_STATUS_INVALID_LENGTH
  890. */
  891. /*----------------------------------------------------------------------------*/
  892. WLAN_STATUS bowCmdReadRSSI(IN P_ADAPTER_T prAdapter, IN P_AMPC_COMMAND prCmd)
  893. {
  894. P_BOW_READ_RSSI prBowReadRSSI;
  895. ASSERT(prAdapter);
  896. /* parameter size check */
  897. if (prCmd->rHeader.u2PayloadLength != sizeof(BOW_READ_RSSI))
  898. return WLAN_STATUS_INVALID_LENGTH;
  899. prBowReadRSSI = (P_BOW_READ_RSSI) &(prCmd->aucPayload[0]);
  900. return wlanoidSendSetQueryBowCmd(prAdapter,
  901. CMD_ID_GET_LINK_QUALITY,
  902. FALSE,
  903. TRUE,
  904. wlanbowCmdEventReadRssi,
  905. wlanbowCmdTimeoutHandler, 0, NULL, prCmd->rHeader.ucSeqNumber);
  906. }
  907. /*----------------------------------------------------------------------------*/
  908. /*!
  909. * \brief This is command handler for BOW_CMD_ID_READ_LINK_QUALITY
  910. * coming from 802.11 PAL
  911. *
  912. * \param[in] prAdapter Pointer to the Adapter structure.
  913. * \param[in] prCmd Pointer to the buffer that holds the command
  914. *
  915. * \retval WLAN_STATUS_SUCCESS
  916. * \retval WLAN_STATUS_INVALID_LENGTH
  917. */
  918. /*----------------------------------------------------------------------------*/
  919. WLAN_STATUS bowCmdReadLinkQuality(IN P_ADAPTER_T prAdapter, IN P_AMPC_COMMAND prCmd)
  920. {
  921. P_BOW_READ_LINK_QUALITY prBowReadLinkQuality;
  922. ASSERT(prAdapter);
  923. /* parameter size check */
  924. if (prCmd->rHeader.u2PayloadLength != sizeof(P_BOW_READ_LINK_QUALITY))
  925. return WLAN_STATUS_INVALID_LENGTH;
  926. prBowReadLinkQuality = (P_BOW_READ_LINK_QUALITY) &(prCmd->aucPayload[0]);
  927. return wlanoidSendSetQueryBowCmd(prAdapter,
  928. CMD_ID_GET_LINK_QUALITY,
  929. FALSE,
  930. TRUE,
  931. wlanbowCmdEventReadLinkQuality,
  932. wlanbowCmdTimeoutHandler, 0, NULL, prCmd->rHeader.ucSeqNumber);
  933. }
  934. /*----------------------------------------------------------------------------*/
  935. /*!
  936. * \brief This is command handler for BOW_CMD_ID_SHORT_RANGE_MODE
  937. * coming from 802.11 PAL
  938. *
  939. * \param[in] prAdapter Pointer to the Adapter structure.
  940. * \param[in] prCmd Pointer to the buffer that holds the command
  941. *
  942. * \retval WLAN_STATUS_SUCCESS
  943. * \retval WLAN_STATUS_INVALID_LENGTH
  944. */
  945. /*----------------------------------------------------------------------------*/
  946. WLAN_STATUS bowCmdShortRangeMode(IN P_ADAPTER_T prAdapter, IN P_AMPC_COMMAND prCmd)
  947. {
  948. P_BOW_SHORT_RANGE_MODE prBowShortRangeMode;
  949. CMD_TX_PWR_T rTxPwrParam;
  950. ASSERT(prAdapter);
  951. #if CFG_BOW_TEST
  952. DBGLOG(BOW, EVENT, "bowCmdShortRangeMode.\n");
  953. #endif
  954. prBowShortRangeMode = (P_BOW_SHORT_RANGE_MODE) &(prCmd->aucPayload[0]);
  955. /* parameter size check */
  956. if (prCmd->rHeader.u2PayloadLength != sizeof(BOW_SHORT_RANGE_MODE)) {
  957. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
  958. return WLAN_STATUS_INVALID_LENGTH;
  959. }
  960. if (!bowCheckBowTableIfVaild(prAdapter, prBowShortRangeMode->aucPeerAddress)) {
  961. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
  962. return WLAN_STATUS_NOT_ACCEPTED;
  963. }
  964. if (bowGetBowTableState(prAdapter, prBowShortRangeMode->aucPeerAddress) != BOW_DEVICE_STATE_CONNECTED) {
  965. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_FAILURE);
  966. return WLAN_STATUS_NOT_ACCEPTED;
  967. }
  968. #if CFG_BOW_TEST
  969. DBGLOG(BOW, EVENT, "prBowShortRangeMode->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
  970. prBowShortRangeMode->aucPeerAddress[0],
  971. prBowShortRangeMode->aucPeerAddress[1],
  972. prBowShortRangeMode->aucPeerAddress[2],
  973. prBowShortRangeMode->aucPeerAddress[3],
  974. prBowShortRangeMode->aucPeerAddress[4], prBowShortRangeMode->aucPeerAddress[5]));
  975. #endif
  976. rTxPwrParam.cTxPwr2G4Cck = (prBowShortRangeMode->cTxPower << 1);
  977. rTxPwrParam.cTxPwr2G4OFDM_BPSK = (prBowShortRangeMode->cTxPower << 1);
  978. rTxPwrParam.cTxPwr2G4OFDM_QPSK = (prBowShortRangeMode->cTxPower << 1);
  979. rTxPwrParam.cTxPwr2G4OFDM_16QAM = (prBowShortRangeMode->cTxPower << 1);
  980. rTxPwrParam.cTxPwr2G4OFDM_48Mbps = (prBowShortRangeMode->cTxPower << 1);
  981. rTxPwrParam.cTxPwr2G4OFDM_54Mbps = (prBowShortRangeMode->cTxPower << 1);
  982. rTxPwrParam.cTxPwr2G4HT20_BPSK = (prBowShortRangeMode->cTxPower << 1);
  983. rTxPwrParam.cTxPwr2G4HT20_QPSK = (prBowShortRangeMode->cTxPower << 1);
  984. rTxPwrParam.cTxPwr2G4HT20_16QAM = (prBowShortRangeMode->cTxPower << 1);
  985. rTxPwrParam.cTxPwr2G4HT20_MCS5 = (prBowShortRangeMode->cTxPower << 1);
  986. rTxPwrParam.cTxPwr2G4HT20_MCS6 = (prBowShortRangeMode->cTxPower << 1);
  987. rTxPwrParam.cTxPwr2G4HT20_MCS7 = (prBowShortRangeMode->cTxPower << 1);
  988. rTxPwrParam.cTxPwr2G4HT40_BPSK = (prBowShortRangeMode->cTxPower << 1);
  989. rTxPwrParam.cTxPwr2G4HT40_QPSK = (prBowShortRangeMode->cTxPower << 1);
  990. rTxPwrParam.cTxPwr2G4HT40_16QAM = (prBowShortRangeMode->cTxPower << 1);
  991. rTxPwrParam.cTxPwr2G4HT40_MCS5 = (prBowShortRangeMode->cTxPower << 1);
  992. rTxPwrParam.cTxPwr2G4HT40_MCS6 = (prBowShortRangeMode->cTxPower << 1);
  993. rTxPwrParam.cTxPwr2G4HT40_MCS7 = (prBowShortRangeMode->cTxPower << 1);
  994. rTxPwrParam.cTxPwr5GOFDM_BPSK = (prBowShortRangeMode->cTxPower << 1);
  995. rTxPwrParam.cTxPwr5GOFDM_QPSK = (prBowShortRangeMode->cTxPower << 1);
  996. rTxPwrParam.cTxPwr5GOFDM_16QAM = (prBowShortRangeMode->cTxPower << 1);
  997. rTxPwrParam.cTxPwr5GOFDM_48Mbps = (prBowShortRangeMode->cTxPower << 1);
  998. rTxPwrParam.cTxPwr5GOFDM_54Mbps = (prBowShortRangeMode->cTxPower << 1);
  999. rTxPwrParam.cTxPwr5GHT20_BPSK = (prBowShortRangeMode->cTxPower << 1);
  1000. rTxPwrParam.cTxPwr5GHT20_QPSK = (prBowShortRangeMode->cTxPower << 1);
  1001. rTxPwrParam.cTxPwr5GHT20_16QAM = (prBowShortRangeMode->cTxPower << 1);
  1002. rTxPwrParam.cTxPwr5GHT20_MCS5 = (prBowShortRangeMode->cTxPower << 1);
  1003. rTxPwrParam.cTxPwr5GHT20_MCS6 = (prBowShortRangeMode->cTxPower << 1);
  1004. rTxPwrParam.cTxPwr5GHT20_MCS7 = (prBowShortRangeMode->cTxPower << 1);
  1005. rTxPwrParam.cTxPwr5GHT40_BPSK = (prBowShortRangeMode->cTxPower << 1);
  1006. rTxPwrParam.cTxPwr5GHT40_QPSK = (prBowShortRangeMode->cTxPower << 1);
  1007. rTxPwrParam.cTxPwr5GHT40_16QAM = (prBowShortRangeMode->cTxPower << 1);
  1008. rTxPwrParam.cTxPwr5GHT40_MCS5 = (prBowShortRangeMode->cTxPower << 1);
  1009. rTxPwrParam.cTxPwr5GHT40_MCS6 = (prBowShortRangeMode->cTxPower << 1);
  1010. rTxPwrParam.cTxPwr5GHT40_MCS7 = (prBowShortRangeMode->cTxPower << 1);
  1011. if (nicUpdateTxPower(prAdapter, &rTxPwrParam) == WLAN_STATUS_SUCCESS) {
  1012. #if CFG_BOW_TEST
  1013. DBGLOG(BOW, EVENT, "bowCmdShortRangeMode, %x.\n", WLAN_STATUS_SUCCESS);
  1014. #endif
  1015. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_SUCCESS);
  1016. return WLAN_STATUS_SUCCESS;
  1017. }
  1018. wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_FAILURE);
  1019. return WLAN_STATUS_FAILURE;
  1020. }
  1021. /*----------------------------------------------------------------------------*/
  1022. /*!
  1023. * \brief This is command handler for BOW_CMD_ID_GET_CHANNEL_LIST
  1024. * coming from 802.11 PAL
  1025. *
  1026. * \param[in] prAdapter Pointer to the Adapter structure.
  1027. * \param[in] prCmd Pointer to the buffer that holds the command
  1028. *
  1029. * \retval WLAN_STATUS_SUCCESS
  1030. * \retval WLAN_STATUS_INVALID_LENGTH
  1031. */
  1032. /*----------------------------------------------------------------------------*/
  1033. WLAN_STATUS bowCmdGetChannelList(IN P_ADAPTER_T prAdapter, IN P_AMPC_COMMAND prCmd)
  1034. {
  1035. ASSERT(prAdapter);
  1036. /* not supported yet */
  1037. return WLAN_STATUS_FAILURE;
  1038. }
  1039. /*----------------------------------------------------------------------------*/
  1040. /*!
  1041. * \brief This is generic command done handler
  1042. *
  1043. * \param[in] prAdapter Pointer to the Adapter structure.
  1044. * \param[in] prCmdInfo Pointer to the buffer that holds the command info
  1045. * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
  1046. *
  1047. * \retval none
  1048. */
  1049. /*----------------------------------------------------------------------------*/
  1050. VOID wlanbowCmdEventSetStatus(IN P_ADAPTER_T prAdapter, IN P_AMPC_COMMAND prCmd, IN UINT_8 ucEventBuf)
  1051. {
  1052. P_AMPC_EVENT prEvent;
  1053. P_BOW_COMMAND_STATUS prBowCmdStatus;
  1054. ASSERT(prAdapter);
  1055. /* fill event header */
  1056. prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)), VIR_MEM_TYPE);
  1057. if (!prEvent) {
  1058. ASSERT(FALSE);
  1059. return;
  1060. }
  1061. prEvent->rHeader.ucEventId = BOW_EVENT_ID_COMMAND_STATUS;
  1062. prEvent->rHeader.ucSeqNumber = prCmd->rHeader.ucSeqNumber;
  1063. prEvent->rHeader.u2PayloadLength = sizeof(BOW_COMMAND_STATUS);
  1064. /* fill event body */
  1065. prBowCmdStatus = (P_BOW_COMMAND_STATUS) (prEvent->aucPayload);
  1066. kalMemZero(prBowCmdStatus, sizeof(BOW_COMMAND_STATUS));
  1067. prBowCmdStatus->ucStatus = ucEventBuf;
  1068. kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
  1069. kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)));
  1070. }
  1071. /*----------------------------------------------------------------------------*/
  1072. /*!
  1073. * \brief This is generic command done handler
  1074. *
  1075. * \param[in] prAdapter Pointer to the Adapter structure.
  1076. * \param[in] prCmdInfo Pointer to the buffer that holds the command info
  1077. * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
  1078. *
  1079. * \retval none
  1080. */
  1081. /*----------------------------------------------------------------------------*/
  1082. VOID wlanbowCmdEventSetCommon(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1083. {
  1084. P_AMPC_EVENT prEvent;
  1085. P_BOW_COMMAND_STATUS prBowCmdStatus;
  1086. ASSERT(prAdapter);
  1087. /* fill event header */
  1088. prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)), VIR_MEM_TYPE);
  1089. if (!prEvent) {
  1090. ASSERT(FALSE);
  1091. return;
  1092. }
  1093. prEvent->rHeader.ucEventId = BOW_EVENT_ID_COMMAND_STATUS;
  1094. prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
  1095. prEvent->rHeader.u2PayloadLength = sizeof(BOW_COMMAND_STATUS);
  1096. /* fill event body */
  1097. prBowCmdStatus = (P_BOW_COMMAND_STATUS) (prEvent->aucPayload);
  1098. kalMemZero(prBowCmdStatus, sizeof(BOW_COMMAND_STATUS));
  1099. prBowCmdStatus->ucStatus = BOWCMD_STATUS_SUCCESS;
  1100. kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
  1101. kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)));
  1102. }
  1103. /*----------------------------------------------------------------------------*/
  1104. /*!
  1105. * \brief command done handler for CMD_ID_CMD_BT_OVER_WIFI
  1106. *
  1107. * \param[in] prAdapter Pointer to the Adapter structure.
  1108. * \param[in] prCmdInfo Pointer to the buffer that holds the command info
  1109. * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
  1110. *
  1111. * \retval none
  1112. */
  1113. /*----------------------------------------------------------------------------*/
  1114. VOID wlanbowCmdEventLinkConnected(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1115. {
  1116. P_AMPC_EVENT prEvent;
  1117. P_BOW_LINK_CONNECTED prBowLinkConnected;
  1118. P_BOW_FSM_INFO_T prBowFsmInfo;
  1119. P_BSS_INFO_T prBssInfo;
  1120. ASSERT(prAdapter);
  1121. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  1122. prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
  1123. /* fill event header */
  1124. prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_LINK_CONNECTED)), VIR_MEM_TYPE);
  1125. if (!prEvent) {
  1126. ASSERT(FALSE);
  1127. return;
  1128. }
  1129. prEvent->rHeader.ucEventId = BOW_EVENT_ID_LINK_CONNECTED;
  1130. prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
  1131. prEvent->rHeader.u2PayloadLength = sizeof(BOW_LINK_CONNECTED);
  1132. /* fill event body */
  1133. prBowLinkConnected = (P_BOW_LINK_CONNECTED) (prEvent->aucPayload);
  1134. kalMemZero(prBowLinkConnected, sizeof(BOW_LINK_CONNECTED));
  1135. prBowLinkConnected->rChannel.ucChannelNum = prBssInfo->ucPrimaryChannel;
  1136. prBowLinkConnected->rChannel.ucChannelBand = prBssInfo->eBand;
  1137. COPY_MAC_ADDR(prBowLinkConnected->aucPeerAddress, prBowFsmInfo->aucPeerAddress);
  1138. #if CFG_BOW_TEST
  1139. DBGLOG(BOW, EVENT, "prEvent->rHeader.ucEventId, 0x%x\n", prEvent->rHeader.ucEventId);
  1140. DBGLOG(BOW, EVENT, "prEvent->rHeader.ucSeqNumber, 0x%x\n", prEvent->rHeader.ucSeqNumber);
  1141. DBGLOG(BOW, EVENT, "prEvent->rHeader.u2PayloadLength, 0x%x\n", prEvent->rHeader.u2PayloadLength);
  1142. DBGLOG(BOW, EVENT,
  1143. "prBowLinkConnected->rChannel.ucChannelNum, 0x%x\n", prBowLinkConnected->rChannel.ucChannelNum);
  1144. DBGLOG(BOW, EVENT,
  1145. "prBowLinkConnected->rChannel.ucChannelBand, 0x%x\n", prBowLinkConnected->rChannel.ucChannelBand);
  1146. DBGLOG(BOW, EVENT,
  1147. "wlanbowCmdEventLinkConnected, prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
  1148. prBowFsmInfo->aucPeerAddress[0], prBowFsmInfo->aucPeerAddress[1], prBowFsmInfo->aucPeerAddress[2],
  1149. prBowFsmInfo->aucPeerAddress[3], prBowFsmInfo->aucPeerAddress[4], prBowFsmInfo->aucPeerAddress[5]);
  1150. DBGLOG(BOW, EVENT,
  1151. "wlanbowCmdEventLinkConnected, prBowLinkConnected->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
  1152. prBowLinkConnected->aucPeerAddress[0], prBowLinkConnected->aucPeerAddress[1],
  1153. prBowLinkConnected->aucPeerAddress[2], prBowLinkConnected->aucPeerAddress[3],
  1154. prBowLinkConnected->aucPeerAddress[4], prBowLinkConnected->aucPeerAddress[5]));
  1155. DBGLOG(BOW, EVENT, "wlanbowCmdEventLinkConnected, g_u4LinkCount, %x.\n", g_u4LinkCount);
  1156. #endif
  1157. /*Indicate Event to PAL */
  1158. kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
  1159. kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_CONNECTED)));
  1160. /*Release channel if granted */
  1161. if (prBowFsmInfo->fgIsChannelGranted) {
  1162. cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rChGrantedTimer);
  1163. /* bowReleaseCh(prAdapter); */
  1164. /*Requested, not granted yet */
  1165. } else if (prBowFsmInfo->fgIsChannelRequested) {
  1166. prBowFsmInfo->fgIsChannelRequested = FALSE;
  1167. }
  1168. /* set to connected status */
  1169. bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_CONNECTED);
  1170. }
  1171. /*----------------------------------------------------------------------------*/
  1172. /*!
  1173. * \brief command done handler for CMD_ID_CMD_BT_OVER_WIFI
  1174. *
  1175. * \param[in] prAdapter Pointer to the Adapter structure.
  1176. * \param[in] prCmdInfo Pointer to the buffer that holds the command info
  1177. * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
  1178. *
  1179. * \retval none
  1180. */
  1181. /*----------------------------------------------------------------------------*/
  1182. VOID wlanbowCmdEventLinkDisconnected(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1183. {
  1184. P_AMPC_EVENT prEvent;
  1185. P_BOW_LINK_DISCONNECTED prBowLinkDisconnected;
  1186. P_BOW_FSM_INFO_T prBowFsmInfo;
  1187. BOW_TABLE_T rBowTable;
  1188. UINT_8 ucBowTableIdx;
  1189. ENUM_BOW_DEVICE_STATE eFsmState;
  1190. BOOLEAN fgSendDeauth = FALSE;
  1191. ASSERT(prAdapter);
  1192. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  1193. eFsmState = bowGetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress);
  1194. if (eFsmState == BOW_DEVICE_STATE_DISCONNECTED) {
  1195. /*do nothing */
  1196. return;
  1197. }
  1198. /*Cancel scan */
  1199. else if (eFsmState == BOW_DEVICE_STATE_SCANNING && !(prBowFsmInfo->fgIsChannelRequested)) {
  1200. bowResponderCancelScan(prAdapter, FALSE);
  1201. bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_DISCONNECTING);
  1202. return;
  1203. }
  1204. /* fill event header */
  1205. prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_LINK_DISCONNECTED)), VIR_MEM_TYPE);
  1206. if (!prEvent) {
  1207. ASSERT(FALSE);
  1208. return;
  1209. }
  1210. prEvent->rHeader.ucEventId = BOW_EVENT_ID_LINK_DISCONNECTED;
  1211. if ((prCmdInfo->u4PrivateData))
  1212. prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
  1213. else
  1214. prEvent->rHeader.ucSeqNumber = 0;
  1215. prEvent->rHeader.u2PayloadLength = sizeof(BOW_LINK_DISCONNECTED);
  1216. /* fill event body */
  1217. prBowLinkDisconnected = (P_BOW_LINK_DISCONNECTED) (prEvent->aucPayload);
  1218. kalMemZero(prBowLinkDisconnected, sizeof(BOW_LINK_DISCONNECTED));
  1219. prBowLinkDisconnected->ucReason = 0x0;
  1220. COPY_MAC_ADDR(prBowLinkDisconnected->aucPeerAddress, prBowFsmInfo->aucPeerAddress);
  1221. #if CFG_BOW_TEST
  1222. DBGLOG(BOW, EVENT, "prEvent->rHeader.ucEventId, 0x%x\n", prEvent->rHeader.ucEventId);
  1223. DBGLOG(BOW, EVENT, "prEvent->rHeader.ucSeqNumber, 0x%x\n", prEvent->rHeader.ucSeqNumber);
  1224. DBGLOG(BOW, EVENT, "prEvent->rHeader.u2PayloadLength, 0x%x\n", prEvent->rHeader.u2PayloadLength);
  1225. DBGLOG(BOW, EVENT, "wlanbowCmdEventLinkDisconnected, prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
  1226. prBowFsmInfo->aucPeerAddress[0],
  1227. prBowFsmInfo->aucPeerAddress[1],
  1228. prBowFsmInfo->aucPeerAddress[2],
  1229. prBowFsmInfo->aucPeerAddress[3],
  1230. prBowFsmInfo->aucPeerAddress[4], prBowFsmInfo->aucPeerAddress[5]));
  1231. DBGLOG(BOW, EVENT,
  1232. "wlanbowCmdEventLinkDisconnected, prBowLinkDisconnected->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
  1233. prBowLinkDisconnected->aucPeerAddress[0], prBowLinkDisconnected->aucPeerAddress[1],
  1234. prBowLinkDisconnected->aucPeerAddress[2], prBowLinkDisconnected->aucPeerAddress[3],
  1235. prBowLinkDisconnected->aucPeerAddress[4], prBowLinkDisconnected->aucPeerAddress[5]));
  1236. DBGLOG(BOW, EVENT, "wlanbowCmdEventLinkDisconnected, g_u4LinkCount, %x.\n", g_u4LinkCount);
  1237. #endif
  1238. /*Indicate BoW event to PAL */
  1239. #if 0
  1240. kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
  1241. kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_DISCONNECTED)));
  1242. #endif
  1243. /* set to disconnected status */
  1244. prBowFsmInfo->prTargetStaRec =
  1245. cnmGetStaRecByAddress(prAdapter, NETWORK_TYPE_BOW_INDEX, prBowLinkDisconnected->aucPeerAddress);
  1246. if (!(prBowFsmInfo->prTargetStaRec)) {
  1247. kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_DISCONNECTED)));
  1248. ASSERT(FALSE);
  1249. return;
  1250. }
  1251. /*Release channel if granted */
  1252. if (prBowFsmInfo->fgIsChannelGranted) {
  1253. cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rChGrantedTimer);
  1254. bowReleaseCh(prAdapter);
  1255. /*Requested, not granted yet */
  1256. } else if (prBowFsmInfo->fgIsChannelRequested) {
  1257. prBowFsmInfo->fgIsChannelRequested = FALSE;
  1258. /* bowReleaseCh(prAdapter); */
  1259. }
  1260. #if 1
  1261. /*Send Deauth to connected peer */
  1262. if (eFsmState == BOW_DEVICE_STATE_CONNECTED && (prBowFsmInfo->prTargetStaRec->ucStaState == STA_STATE_3)) {
  1263. fgSendDeauth = TRUE;
  1264. #if CFG_BOW_TEST
  1265. DBGLOG(BOW, EVENT,
  1266. "wlanbowCmdEventLinkDisconnected, bowGetBowTableState, %x.\n",
  1267. bowGetBowTableState(prAdapter, prBowLinkDisconnected->aucPeerAddress));
  1268. #endif
  1269. authSendDeauthFrame(prAdapter,
  1270. prBowFsmInfo->prTargetStaRec,
  1271. (P_SW_RFB_T) NULL,
  1272. REASON_CODE_DEAUTH_LEAVING_BSS, (PFN_TX_DONE_HANDLER) bowDisconnectLink);
  1273. }
  1274. #endif
  1275. #if 0
  1276. /* 3 <3>Stop this link; flush Tx;
  1277. * send deAuthentication -> abort. SAA, AAA. need to check BOW table state == Connected.
  1278. */
  1279. if (prAdapter->prGlueInfo->i4TxPendingFrameNum > 0)
  1280. kalFlushPendingTxPackets(prAdapter->prGlueInfo);
  1281. /* flush pending security frames */
  1282. if (prAdapter->prGlueInfo->i4TxPendingSecurityFrameNum > 0)
  1283. kalClearSecurityFrames(prAdapter->prGlueInfo);
  1284. #endif
  1285. /*Update BoW table */
  1286. bowGetBowTableEntryByPeerAddress(prAdapter, prBowLinkDisconnected->aucPeerAddress, &ucBowTableIdx);
  1287. rBowTable.fgIsValid = FALSE;
  1288. rBowTable.eState = BOW_DEVICE_STATE_DISCONNECTED;
  1289. kalMemZero(rBowTable.aucPeerAddress, sizeof(rBowTable.aucPeerAddress));
  1290. bowSetBowTableContent(prAdapter, ucBowTableIdx, &rBowTable);
  1291. /*Indicate BoW event to PAL */
  1292. kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
  1293. kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_DISCONNECTED)));
  1294. /*Decrease link count */
  1295. GLUE_DEC_REF_CNT(g_u4LinkCount);
  1296. /*If no need to send deauth, DO disconnect now */
  1297. /*If need to send deauth, DO disconnect at deauth Tx done */
  1298. if (!fgSendDeauth)
  1299. bowDisconnectLink(prAdapter, NULL, TX_RESULT_SUCCESS);
  1300. }
  1301. /*----------------------------------------------------------------------------*/
  1302. /*!
  1303. * \brief command done handler for CMD_ID_CMD_BT_OVER_WIFI
  1304. *
  1305. * \param[in] prAdapter Pointer to the Adapter structure.
  1306. * \param[in] prCmdInfo Pointer to the buffer that holds the command info
  1307. * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
  1308. *
  1309. * \retval none
  1310. */
  1311. /*----------------------------------------------------------------------------*/
  1312. VOID wlanbowCmdEventSetSetupConnection(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1313. {
  1314. P_AMPC_EVENT prEvent;
  1315. P_BOW_COMMAND_STATUS prBowCmdStatus;
  1316. P_WIFI_CMD_T prWifiCmd;
  1317. P_CMD_BT_OVER_WIFI prCmdBtOverWifi;
  1318. P_BOW_FSM_INFO_T prBowFsmInfo;
  1319. ASSERT(prAdapter);
  1320. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  1321. /* restore original command for rPeerAddr */
  1322. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  1323. prCmdBtOverWifi = (P_CMD_BT_OVER_WIFI) (prWifiCmd->aucBuffer);
  1324. /* fill event header */
  1325. prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)), VIR_MEM_TYPE);
  1326. if (!prEvent) {
  1327. ASSERT(FALSE);
  1328. return;
  1329. }
  1330. prEvent->rHeader.ucEventId = BOW_EVENT_ID_COMMAND_STATUS;
  1331. prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
  1332. prEvent->rHeader.u2PayloadLength = sizeof(BOW_COMMAND_STATUS);
  1333. /* fill event body */
  1334. prBowCmdStatus = (P_BOW_COMMAND_STATUS) (prEvent->aucPayload);
  1335. kalMemZero(prBowCmdStatus, sizeof(BOW_COMMAND_STATUS));
  1336. prBowCmdStatus->ucStatus = BOWCMD_STATUS_SUCCESS;
  1337. /*Indicate BoW event to PAL */
  1338. kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
  1339. kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)));
  1340. /* set to starting status */
  1341. kalSetBowState(prAdapter->prGlueInfo, BOW_DEVICE_STATE_STARTING, prCmdBtOverWifi->rPeerAddr);
  1342. }
  1343. /*----------------------------------------------------------------------------*/
  1344. /*!
  1345. * \brief This is the command done handler for BOW_CMD_ID_READ_LINK_QUALITY
  1346. *
  1347. * \param[in] prAdapter Pointer to the Adapter structure.
  1348. * \param[in] prCmdInfo Pointer to the buffer that holds the command info
  1349. * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
  1350. *
  1351. * \retval none
  1352. */
  1353. /*----------------------------------------------------------------------------*/
  1354. VOID wlanbowCmdEventReadLinkQuality(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1355. {
  1356. P_EVENT_LINK_QUALITY prLinkQuality;
  1357. P_AMPC_EVENT prEvent;
  1358. P_BOW_LINK_QUALITY prBowLinkQuality;
  1359. ASSERT(prAdapter);
  1360. prLinkQuality = (P_EVENT_LINK_QUALITY) pucEventBuf;
  1361. /* fill event header */
  1362. prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_LINK_QUALITY)), VIR_MEM_TYPE);
  1363. if (!prEvent) {
  1364. ASSERT(FALSE);
  1365. return;
  1366. }
  1367. prEvent->rHeader.ucEventId = BOW_EVENT_ID_LINK_QUALITY;
  1368. prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
  1369. prEvent->rHeader.u2PayloadLength = sizeof(BOW_LINK_QUALITY);
  1370. /* fill event body */
  1371. prBowLinkQuality = (P_BOW_LINK_QUALITY) (prEvent->aucPayload);
  1372. kalMemZero(prBowLinkQuality, sizeof(BOW_LINK_QUALITY));
  1373. prBowLinkQuality->ucLinkQuality = (UINT_8) prLinkQuality->cLinkQuality;
  1374. kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
  1375. kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_QUALITY)));
  1376. }
  1377. /*----------------------------------------------------------------------------*/
  1378. /*!
  1379. * \brief This is the command done handler for BOW_CMD_ID_READ_RSSI
  1380. *
  1381. * \param[in] prAdapter Pointer to the Adapter structure.
  1382. * \param[in] prCmdInfo Pointer to the buffer that holds the command info
  1383. * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
  1384. *
  1385. * \retval none
  1386. */
  1387. /*----------------------------------------------------------------------------*/
  1388. VOID wlanbowCmdEventReadRssi(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
  1389. {
  1390. P_EVENT_LINK_QUALITY prLinkQuality;
  1391. P_AMPC_EVENT prEvent;
  1392. P_BOW_RSSI prBowRssi;
  1393. ASSERT(prAdapter);
  1394. prLinkQuality = (P_EVENT_LINK_QUALITY) pucEventBuf;
  1395. /* fill event header */
  1396. prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_LINK_QUALITY)), VIR_MEM_TYPE);
  1397. if (!prEvent) {
  1398. ASSERT(FALSE);
  1399. return;
  1400. }
  1401. prEvent->rHeader.ucEventId = BOW_EVENT_ID_RSSI;
  1402. prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
  1403. prEvent->rHeader.u2PayloadLength = sizeof(BOW_RSSI);
  1404. /* fill event body */
  1405. prBowRssi = (P_BOW_RSSI) (prEvent->aucPayload);
  1406. kalMemZero(prBowRssi, sizeof(BOW_RSSI));
  1407. prBowRssi->cRssi = (INT_8) prLinkQuality->cRssi;
  1408. kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
  1409. kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_QUALITY)));
  1410. }
  1411. /*----------------------------------------------------------------------------*/
  1412. /*!
  1413. * \brief This is the default command timeout handler
  1414. *
  1415. * \param[in] prAdapter Pointer to the Adapter structure.
  1416. * \param[in] prCmdInfo Pointer to the buffer that holds the command info
  1417. *
  1418. * \retval none
  1419. */
  1420. /*----------------------------------------------------------------------------*/
  1421. VOID wlanbowCmdTimeoutHandler(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo)
  1422. {
  1423. P_AMPC_EVENT prEvent;
  1424. P_BOW_COMMAND_STATUS prBowCmdStatus;
  1425. ASSERT(prAdapter);
  1426. /* fill event header */
  1427. prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)), VIR_MEM_TYPE);
  1428. if (!prEvent) {
  1429. ASSERT(FALSE);
  1430. return;
  1431. }
  1432. prEvent->rHeader.ucEventId = BOW_EVENT_ID_COMMAND_STATUS;
  1433. prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
  1434. prEvent->rHeader.u2PayloadLength = sizeof(BOW_COMMAND_STATUS);
  1435. /* fill event body */
  1436. prBowCmdStatus = (P_BOW_COMMAND_STATUS) (prEvent->aucPayload);
  1437. kalMemZero(prBowCmdStatus, sizeof(BOW_COMMAND_STATUS));
  1438. prBowCmdStatus->ucStatus = BOWCMD_STATUS_TIMEOUT; /* timeout */
  1439. kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
  1440. kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)));
  1441. }
  1442. VOID bowStopping(IN P_ADAPTER_T prAdapter)
  1443. {
  1444. P_BOW_FSM_INFO_T prBowFsmInfo;
  1445. P_BSS_INFO_T prBowBssInfo;
  1446. ASSERT(prAdapter);
  1447. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  1448. prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
  1449. #if CFG_BOW_TEST
  1450. DBGLOG(BOW, EVENT, "bowStoping.\n");
  1451. DBGLOG(BOW, EVENT, "bowStoping, SSID %s.\n", prBowBssInfo->aucSSID);
  1452. DBGLOG(BOW, EVENT, "bowStoping, prBowBssInfo->aucBSSID, %x:%x:%x:%x:%x:%x.\n",
  1453. prBowBssInfo->aucBSSID[0],
  1454. prBowBssInfo->aucBSSID[1],
  1455. prBowBssInfo->aucBSSID[2],
  1456. prBowBssInfo->aucBSSID[3], prBowBssInfo->aucBSSID[4], prBowBssInfo->aucBSSID[5]));
  1457. DBGLOG(BOW, EVENT, "bowStoping, prBssInfo->aucOwnMacAddr, %x:%x:%x:%x:%x:%x.\n",
  1458. prBowBssInfo->aucOwnMacAddr[0],
  1459. prBowBssInfo->aucOwnMacAddr[1],
  1460. prBowBssInfo->aucOwnMacAddr[2],
  1461. prBowBssInfo->aucOwnMacAddr[3],
  1462. prBowBssInfo->aucOwnMacAddr[4], prBowBssInfo->aucOwnMacAddr[5]));
  1463. DBGLOG(BOW, EVENT, "bowStoping, prAdapter->rWifiVar.aucDeviceAddress, %x:%x:%x:%x:%x:%x.\n",
  1464. prAdapter->rWifiVar.aucDeviceAddress[0],
  1465. prAdapter->rWifiVar.aucDeviceAddress[1],
  1466. prAdapter->rWifiVar.aucDeviceAddress[2],
  1467. prAdapter->rWifiVar.aucDeviceAddress[3],
  1468. prAdapter->rWifiVar.aucDeviceAddress[4], prAdapter->rWifiVar.aucDeviceAddress[5]));
  1469. DBGLOG(BOW, EVENT, "bowStopping, g_u4LinkCount, %x.\n", g_u4LinkCount);
  1470. DBGLOG(BOW, EVENT, "prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n", prBowFsmInfo->aucPeerAddress[0],
  1471. prBowFsmInfo->aucPeerAddress[1],
  1472. prBowFsmInfo->aucPeerAddress[2],
  1473. prBowFsmInfo->aucPeerAddress[3],
  1474. prBowFsmInfo->aucPeerAddress[4], prBowFsmInfo->aucPeerAddress[5]));
  1475. kalPrint("BoW Stoping,[%d,%d]\n", g_u4LinkCount, g_u4Beaconing);
  1476. #endif
  1477. if (g_u4LinkCount == 0) {
  1478. /*Stop beaconing */
  1479. GLUE_DEC_REF_CNT(g_u4Beaconing);
  1480. /*Deactive BoW network */
  1481. /* prBowBssInfo->fgIsNetActive = FALSE; */
  1482. /* prBowBssInfo->fgIsBeaconActivated = FALSE; */
  1483. nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_BOW_INDEX);
  1484. bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
  1485. nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
  1486. /*temp solution for FW hal_pwr_mgt.c#3037 ASSERT */
  1487. nicDeactivateNetwork(prAdapter, NETWORK_TYPE_BOW_INDEX);
  1488. SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_BOW_INDEX);
  1489. UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
  1490. }
  1491. }
  1492. VOID bowStarting(IN P_ADAPTER_T prAdapter)
  1493. {
  1494. P_BOW_FSM_INFO_T prBowFsmInfo;
  1495. P_BSS_INFO_T prBssInfo;
  1496. ASSERT(prAdapter);
  1497. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  1498. if (g_u4LinkCount == 1) {
  1499. #if CFG_BOW_TEST
  1500. DBGLOG(BOW, EVENT, "BoW Starting.\n");
  1501. DBGLOG(BOW, EVENT, "BoW channel granted.\n");
  1502. #endif
  1503. #if 0
  1504. /*Active BoW Network */
  1505. SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
  1506. SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
  1507. nicActivateNetwork(prAdapter, NETWORK_TYPE_BOW_INDEX);
  1508. #endif
  1509. /* 3 <1> Update BSS_INFO_T per Network Basis */
  1510. /* 4 <1.1> Setup Operation Mode */
  1511. prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
  1512. prBssInfo->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
  1513. prBssInfo->eCurrentOPMode = OP_MODE_BOW;
  1514. /* 4 <1.2> Setup SSID */
  1515. COPY_MAC_ADDR(prBssInfo->aucOwnMacAddr, prAdapter->rWifiVar.aucDeviceAddress);
  1516. COPY_MAC_ADDR(prBssInfo->aucBSSID, prAdapter->rWifiVar.aucDeviceAddress);
  1517. prBssInfo->ucSSIDLen = BOW_SSID_LEN;
  1518. bowAssignSsid(prBssInfo->aucSSID, prBssInfo->aucOwnMacAddr);
  1519. #if CFG_BOW_TEST
  1520. DBGLOG(BOW, EVENT, "SSID %s.\n", prBssInfo->aucSSID);
  1521. DBGLOG(BOW, EVENT, "prBssInfo->aucBSSID, %x:%x:%x:%x:%x:%x.\n",
  1522. prBssInfo->aucBSSID[0],
  1523. prBssInfo->aucBSSID[1],
  1524. prBssInfo->aucBSSID[2],
  1525. prBssInfo->aucBSSID[3], prBssInfo->aucBSSID[4], prBssInfo->aucBSSID[5]));
  1526. DBGLOG(BOW, EVENT, "prBssInfo->aucOwnMacAddr, %x:%x:%x:%x:%x:%x.\n",
  1527. prBssInfo->aucOwnMacAddr[0],
  1528. prBssInfo->aucOwnMacAddr[1],
  1529. prBssInfo->aucOwnMacAddr[2],
  1530. prBssInfo->aucOwnMacAddr[3],
  1531. prBssInfo->aucOwnMacAddr[4], prBssInfo->aucOwnMacAddr[5]));
  1532. DBGLOG(BOW, EVENT, "prAdapter->rWifiVar.aucDeviceAddress, %x:%x:%x:%x:%x:%x.\n",
  1533. prAdapter->rWifiVar.aucDeviceAddress[0],
  1534. prAdapter->rWifiVar.aucDeviceAddress[1],
  1535. prAdapter->rWifiVar.aucDeviceAddress[2],
  1536. prAdapter->rWifiVar.aucDeviceAddress[3],
  1537. prAdapter->rWifiVar.aucDeviceAddress[4], prAdapter->rWifiVar.aucDeviceAddress[5]));
  1538. #endif
  1539. /* 4 <1.3> Clear current AP's STA_RECORD_T and current AID */
  1540. prBssInfo->prStaRecOfAP = (P_STA_RECORD_T) NULL;
  1541. prBssInfo->u2AssocId = 0;
  1542. /* 4 <1.4> Setup Channel, Band and Phy Attributes */
  1543. prBssInfo->ucPrimaryChannel = prBowFsmInfo->ucPrimaryChannel;
  1544. if (prBowFsmInfo->eBand == BAND_2G4)
  1545. prBssInfo->eBand = BAND_2G4;
  1546. else
  1547. prBssInfo->eBand = BAND_5G;
  1548. #if CFG_BOW_SUPPORT_11N
  1549. /* Depend on eBand */
  1550. prBssInfo->ucPhyTypeSet = prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11BGN;
  1551. /* Depend on eCurrentOPMode and ucPhyTypeSet */
  1552. prBssInfo->ucConfigAdHocAPMode = AP_MODE_MIXED_11BG;
  1553. prBssInfo->ucNonHTBasicPhyType = (UINT_8)
  1554. rNonHTApModeAttributes[prBssInfo->ucConfigAdHocAPMode].ePhyTypeIndex;
  1555. prBssInfo->u2BSSBasicRateSet = rNonHTApModeAttributes[prBssInfo->ucConfigAdHocAPMode].u2BSSBasicRateSet;
  1556. prBssInfo->u2OperationalRateSet =
  1557. rNonHTPhyAttributes[prBssInfo->ucNonHTBasicPhyType].u2SupportedRateSet;
  1558. rateGetDataRatesFromRateSet(prBssInfo->u2OperationalRateSet,
  1559. prBssInfo->u2BSSBasicRateSet,
  1560. prBssInfo->aucAllSupportedRates, &prBssInfo->ucAllSupportedRatesLen);
  1561. #else
  1562. if (prBssInfo->eBand == BAND_2G4) {
  1563. /* Depend on eBand */
  1564. prBssInfo->ucPhyTypeSet = PHY_TYPE_SET_802_11BG;
  1565. /* Depend on eCurrentOPMode and ucPhyTypeSet */
  1566. prBssInfo->ucConfigAdHocAPMode = AP_MODE_MIXED_11BG;
  1567. /* RATE_SET_ERP; */
  1568. prBssInfo->u2BSSBasicRateSet = BASIC_RATE_SET_ERP;
  1569. prBssInfo->u2OperationalRateSet = RATE_SET_ERP;
  1570. prBssInfo->ucNonHTBasicPhyType = PHY_TYPE_ERP_INDEX;
  1571. } else {
  1572. /* Depend on eBand */
  1573. /* prBssInfo->ucPhyTypeSet = PHY_TYPE_SET_802_11BG; */
  1574. /* Depend on eCurrentOPMode and ucPhyTypeSet */
  1575. /* prBssInfo->ucConfigAdHocAPMode = AP_MODE_MIXED_11BG; */
  1576. /* Depend on eBand */
  1577. prBssInfo->ucPhyTypeSet = PHY_TYPE_SET_802_11A;
  1578. /* Depend on eCurrentOPMode and ucPhyTypeSet */
  1579. prBssInfo->ucConfigAdHocAPMode = AP_MODE_11A;
  1580. /* RATE_SET_ERP; */
  1581. /* prBssInfo->u2BSSBasicRateSet = BASIC_RATE_SET_ERP; */
  1582. /* prBssInfo->u2OperationalRateSet = RATE_SET_ERP; */
  1583. /* RATE_SET_ERP; */
  1584. prBssInfo->u2BSSBasicRateSet = BASIC_RATE_SET_OFDM;
  1585. prBssInfo->u2OperationalRateSet = RATE_SET_OFDM;
  1586. prBssInfo->ucNonHTBasicPhyType = PHY_TYPE_OFDM_INDEX;
  1587. }
  1588. #endif
  1589. prBssInfo->fgErpProtectMode = FALSE;
  1590. /* 4 <1.5> Setup MIB for current BSS */
  1591. prBssInfo->u2BeaconInterval = prBowFsmInfo->u2BeaconInterval;
  1592. prBssInfo->ucDTIMPeriod = DOT11_DTIM_PERIOD_DEFAULT;
  1593. prBssInfo->u2ATIMWindow = 0;
  1594. prBssInfo->ucBeaconTimeoutCount = 0;
  1595. if (prBowFsmInfo->fgSupportQoS) {
  1596. prAdapter->rWifiVar.fgSupportQoS = TRUE;
  1597. prBssInfo->fgIsQBSS = TRUE;
  1598. }
  1599. /* 3 <2> Update BSS_INFO_T common part */
  1600. #if CFG_SUPPORT_AAA
  1601. bssInitForAP(prAdapter, prBssInfo, TRUE);
  1602. nicQmUpdateWmmParms(prAdapter, NETWORK_TYPE_BOW_INDEX);
  1603. #endif /* CFG_SUPPORT_AAA */
  1604. prBssInfo->fgIsNetActive = TRUE;
  1605. prBssInfo->fgIsBeaconActivated = TRUE;
  1606. /* 3 <3> Set MAC HW */
  1607. /* 4 <2> Initiate BSS_INFO_T - common part */
  1608. BOW_BSS_INFO_INIT(prAdapter, NETWORK_TYPE_BOW_INDEX);
  1609. #if CFG_BOW_TEST
  1610. DBGLOG(BOW, EVENT,
  1611. "prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n", prBowFsmInfo->aucPeerAddress[0],
  1612. prBowFsmInfo->aucPeerAddress[1], prBowFsmInfo->aucPeerAddress[2],
  1613. prBowFsmInfo->aucPeerAddress[3], prBowFsmInfo->aucPeerAddress[4],
  1614. prBowFsmInfo->aucPeerAddress[5]));
  1615. #endif
  1616. /* 4 <3.1> use command packets to inform firmware */
  1617. rlmBssInitForAPandIbss(prAdapter, prBssInfo);
  1618. nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
  1619. /* 4 <3.2> Update AdHoc PM parameter */
  1620. nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_BOW_INDEX);
  1621. /* 4 <3.1> Reset HW TSF Update Mode and Beacon Mode */
  1622. /* 4 <3.2> Setup BSSID */
  1623. /* TODO: rxmSetRxFilterBSSID0 */
  1624. /* rxmSetRxFilterBSSID0(prBssInfo->ucHwBssidId, prBssInfo->aucBSSID); */
  1625. /* 4 <3.3> Setup RX Filter to accept Probe Request */
  1626. /* TODO: f get/set RX filter. */
  1627. #if 0
  1628. {
  1629. UINT_32 u4RxFilter;
  1630. if (halMacRxGetRxFilters(&u4RxFilter) == HAL_STATUS_SUCCESS) {
  1631. u4RxFilter &= ~BIT(RXFILTER_DROP_PROBE_REQ);
  1632. halMacRxSetRxFilters(u4RxFilter);
  1633. }
  1634. }
  1635. #endif
  1636. }
  1637. /*Update BoW Table */
  1638. bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_STARTING);
  1639. #if CFG_BOW_TEST
  1640. kalPrint("BoW Starting,[%d,%d]\n", g_u4LinkCount, g_u4Beaconing);
  1641. DBGLOG(BOW, EVENT, "bowStarting, g_u4LinkCount, %x.\n", g_u4LinkCount);
  1642. #endif
  1643. /*Start beaconing */
  1644. if (g_u4Beaconing < 1) {
  1645. GLUE_INC_REF_CNT(g_u4Beaconing);
  1646. bssSendBeaconProbeResponse(prAdapter, NETWORK_TYPE_BOW_INDEX, NULL, 0);
  1647. cnmTimerStartTimer(prAdapter, &prBowFsmInfo->rStartingBeaconTimer, prBowFsmInfo->u2BeaconInterval);
  1648. }
  1649. #if 0
  1650. /*Responder: Start to scan Initiator */
  1651. if (prBowFsmInfo->ucRole == BOW_RESPONDER) {
  1652. #if CFG_BOW_TEST
  1653. DBGLOG(BOW, EVENT, "bowStarting responder, start scan result searching.\n");
  1654. #endif
  1655. cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rChGrantedTimer);
  1656. bowReleaseCh(prAdapter);
  1657. bowResponderScan(prAdapter);
  1658. }
  1659. /*Initiator: Request channel, wait for responder */
  1660. else {
  1661. /* Todo:: Nothing*/
  1662. /* bowRequestCh(prAdapter); */
  1663. }
  1664. #endif
  1665. }
  1666. VOID bowAssignSsid(IN PUINT_8 pucSsid, IN PUINT_8 puOwnMacAddr)
  1667. {
  1668. UINT_8 i;
  1669. UINT_8 aucSSID[] = BOW_WILDCARD_SSID;
  1670. kalMemCopy(pucSsid, aucSSID, BOW_WILDCARD_SSID_LEN);
  1671. for (i = 0; i < 6; i++) {
  1672. pucSsid[(3 * i) + 3] = 0x2D;
  1673. if ((*(puOwnMacAddr + i) >> 4) < 0xA)
  1674. *(pucSsid + (3 * i) + 4) = (*(puOwnMacAddr + i) >> 4) + 0x30;
  1675. else
  1676. *(pucSsid + (3 * i) + 4) = (*(puOwnMacAddr + i) >> 4) + 0x57;
  1677. if ((*(puOwnMacAddr + i) & 0x0F) < 0xA)
  1678. pucSsid[(3 * i) + 5] = (*(puOwnMacAddr + i) & 0x0F) + 0x30;
  1679. else
  1680. pucSsid[(3 * i) + 5] = (*(puOwnMacAddr + i) & 0x0F) + 0x57;
  1681. }
  1682. }
  1683. /*----------------------------------------------------------------------------*/
  1684. /*!
  1685. * @brief This function will validate the Rx Probe Request Frame and then return
  1686. * result to BSS to indicate if need to send the corresponding Probe Response
  1687. * Frame if the specified conditions were matched.
  1688. *
  1689. * @param[in] prAdapter Pointer to the Adapter structure.
  1690. * @param[in] prSwRfb Pointer to SW RFB data structure.
  1691. * @param[out] pu4ControlFlags Control flags for replying the Probe Response
  1692. *
  1693. * @retval TRUE Reply the Probe Response
  1694. * @retval FALSE Don't reply the Probe Response
  1695. */
  1696. /*----------------------------------------------------------------------------*/
  1697. BOOLEAN bowValidateProbeReq(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb, OUT PUINT_32 pu4ControlFlags)
  1698. {
  1699. P_WLAN_MAC_MGMT_HEADER_T prMgtHdr;
  1700. P_BOW_FSM_INFO_T prBowFsmInfo;
  1701. P_BSS_INFO_T prBssInfo;
  1702. P_IE_SSID_T prIeSsid = (P_IE_SSID_T) NULL;
  1703. PUINT_8 pucIE;
  1704. UINT_16 u2IELength;
  1705. UINT_16 u2Offset = 0;
  1706. BOOLEAN fgReplyProbeResp = FALSE;
  1707. ASSERT(prSwRfb);
  1708. ASSERT(pu4ControlFlags);
  1709. prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
  1710. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  1711. #if 0 /* CFG_BOW_TEST */
  1712. DBGLOG(BOW, EVENT, "bowValidateProbeReq.\n");
  1713. #endif
  1714. /* 4 <1> Parse Probe Req IE and Get IE ptr (SSID, Supported Rate IE, ...) */
  1715. prMgtHdr = (P_WLAN_MAC_MGMT_HEADER_T) prSwRfb->pvHeader;
  1716. u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
  1717. pucIE = (PUINT_8) ((ULONG) prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
  1718. IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
  1719. if (ELEM_ID_SSID == IE_ID(pucIE)) {
  1720. if ((!prIeSsid) && (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID))
  1721. prIeSsid = (P_IE_SSID_T) pucIE;
  1722. break;
  1723. }
  1724. } /* end of IE_FOR_EACH */
  1725. IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
  1726. if (ELEM_ID_SSID == IE_ID(pucIE)) {
  1727. if ((!prIeSsid) && (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID))
  1728. prIeSsid = (P_IE_SSID_T) pucIE;
  1729. break;
  1730. }
  1731. } /* end of IE_FOR_EACH */
  1732. /* 4 <2> Check network conditions */
  1733. /*If BoW AP is beaconing */
  1734. if (prBssInfo->eCurrentOPMode == OP_MODE_BOW && g_u4Beaconing > 0) {
  1735. /*Check the probe requset sender is our peer */
  1736. if (bowCheckBowTableIfVaild(prAdapter, prMgtHdr->aucSrcAddr))
  1737. fgReplyProbeResp = TRUE;
  1738. /*Check the probe request target SSID is our SSID */
  1739. else if ((prIeSsid) &&
  1740. EQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen, prIeSsid->aucSSID, prIeSsid->ucLength))
  1741. fgReplyProbeResp = TRUE;
  1742. else
  1743. fgReplyProbeResp = FALSE;
  1744. }
  1745. return fgReplyProbeResp;
  1746. }
  1747. /*----------------------------------------------------------------------------*/
  1748. /*!
  1749. * @brief This function will indicate an Event of "Media Disconnect" to HOST
  1750. *
  1751. * @param[in] u4Param Unused timer parameter
  1752. *
  1753. * @return (none)
  1754. */
  1755. /*----------------------------------------------------------------------------*/
  1756. VOID bowSendBeacon(IN P_ADAPTER_T prAdapter, IN ULONG ulParam)
  1757. {
  1758. P_BOW_FSM_INFO_T prBowFsmInfo;
  1759. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  1760. if ((g_u4Beaconing != 0) && (g_u4LinkCount > 0) && (g_u4LinkCount < CFG_BOW_PHYSICAL_LINK_NUM)) {
  1761. /* Send beacon */
  1762. bssSendBeaconProbeResponse(prAdapter, NETWORK_TYPE_BOW_INDEX, NULL, 0);
  1763. cnmTimerStartTimer(prAdapter, &prBowFsmInfo->rStartingBeaconTimer, prBowFsmInfo->u2BeaconInterval);
  1764. }
  1765. #if CFG_BOW_TEST
  1766. else
  1767. kalPrint("BoW Send Beacon,[%d,%d]\n", g_u4LinkCount, g_u4Beaconing);
  1768. #endif
  1769. }
  1770. /*----------------------------------------------------------------------------*/
  1771. /*!
  1772. * @brief This function will indicate an Event of "Media Disconnect" to HOST
  1773. *
  1774. * @param[in] u4Param Unused timer parameter
  1775. *
  1776. * @return (none)
  1777. */
  1778. /*----------------------------------------------------------------------------*/
  1779. VOID bowResponderScan(IN P_ADAPTER_T prAdapter)
  1780. {
  1781. P_BOW_FSM_INFO_T prBowFsmInfo;
  1782. P_MSG_SCN_SCAN_REQ prScanReqMsg;
  1783. P_BSS_INFO_T prBssInfo;
  1784. ASSERT(prAdapter);
  1785. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  1786. prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
  1787. #if CFG_BOW_TEST
  1788. DBGLOG(BOW, EVENT, "bowResponderScan.\n");
  1789. kalPrint("BOW SCAN [REQ:%d]\n", prBowFsmInfo->ucSeqNumOfScanReq + 1);
  1790. #endif
  1791. prScanReqMsg = (P_MSG_SCN_SCAN_REQ) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_REQ));
  1792. if (!prScanReqMsg) {
  1793. ASSERT(0); /* Can't trigger SCAN FSM */
  1794. return;
  1795. }
  1796. /*Fill scan message */
  1797. prScanReqMsg->rMsgHdr.eMsgId = MID_BOW_SCN_SCAN_REQ;
  1798. prScanReqMsg->ucSeqNum = ++prBowFsmInfo->ucSeqNumOfScanReq;
  1799. prScanReqMsg->ucNetTypeIndex = (UINT_8) NETWORK_TYPE_BOW_INDEX;
  1800. prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN;
  1801. prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
  1802. prScanReqMsg->ucSSIDLength = BOW_SSID_LEN;
  1803. bowAssignSsid(prScanReqMsg->aucSSID, prBowFsmInfo->aucPeerAddress);
  1804. prScanReqMsg->ucChannelListNum = 1;
  1805. if (prBowFsmInfo->eBand == BAND_2G4) {
  1806. prScanReqMsg->eScanChannel = SCAN_CHANNEL_SPECIFIED;
  1807. prScanReqMsg->arChnlInfoList[0].eBand = BAND_2G4;
  1808. } else {
  1809. prScanReqMsg->eScanChannel = SCAN_CHANNEL_5G;
  1810. prScanReqMsg->arChnlInfoList[0].eBand = BAND_5G;
  1811. }
  1812. prScanReqMsg->arChnlInfoList[0].ucChannelNum = prBowFsmInfo->ucPrimaryChannel;
  1813. prScanReqMsg->u2IELen = 0;
  1814. /*Send scan message */
  1815. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prScanReqMsg, MSG_SEND_METHOD_BUF);
  1816. /*Change state to SCANNING */
  1817. bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_SCANNING);
  1818. /* prBowFsmInfo->fgTryScan = FALSE; */ /* Will enable background sleep for infrastructure */
  1819. }
  1820. /*----------------------------------------------------------------------------*/
  1821. /*!
  1822. * \brief
  1823. *
  1824. * \param[in]
  1825. *
  1826. * \return none
  1827. */
  1828. /*----------------------------------------------------------------------------*/
  1829. VOID bowResponderScanDone(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  1830. {
  1831. P_MSG_SCN_SCAN_DONE prScanDoneMsg;
  1832. P_BOW_FSM_INFO_T prBowFsmInfo;
  1833. P_BSS_DESC_T prBssDesc;
  1834. UINT_8 ucSeqNumOfCompMsg;
  1835. P_CONNECTION_SETTINGS_T prConnSettings;
  1836. ENUM_BOW_DEVICE_STATE eFsmState;
  1837. ENUM_SCAN_STATUS eScanStatus;
  1838. ASSERT(prAdapter);
  1839. ASSERT(prMsgHdr);
  1840. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  1841. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  1842. prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) prMsgHdr;
  1843. eFsmState = bowGetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress);
  1844. ASSERT(prScanDoneMsg->ucNetTypeIndex == NETWORK_TYPE_BOW_INDEX);
  1845. ucSeqNumOfCompMsg = prScanDoneMsg->ucSeqNum;
  1846. eScanStatus = prScanDoneMsg->eScanStatus;
  1847. cnmMemFree(prAdapter, prMsgHdr);
  1848. #if CFG_BOW_TEST
  1849. DBGLOG(BOW, EVENT, "bowResponderScanDone.\n");
  1850. kalPrint("BOW SCAN [DONE:%d]\n", ucSeqNumOfCompMsg);
  1851. #endif
  1852. if (eScanStatus == SCAN_STATUS_CANCELLED) {
  1853. #if CFG_BOW_TEST
  1854. kalPrint("BOW SCAN [CANCELLED:%d]\n", ucSeqNumOfCompMsg);
  1855. #endif
  1856. if (eFsmState == BOW_DEVICE_STATE_DISCONNECTING) {
  1857. wlanoidSendSetQueryBowCmd(prAdapter,
  1858. CMD_ID_CMD_BT_OVER_WIFI,
  1859. TRUE,
  1860. FALSE,
  1861. wlanbowCmdEventLinkDisconnected,
  1862. wlanbowCmdTimeoutHandler, 0, NULL, 0);
  1863. }
  1864. return;
  1865. } else if (eFsmState == BOW_DEVICE_STATE_DISCONNECTED) {
  1866. /* bowDisconnectLink(prAdapter, NULL, TX_RESULT_SUCCESS); */
  1867. return;
  1868. } else if (ucSeqNumOfCompMsg != prBowFsmInfo->ucSeqNumOfScanReq) {
  1869. DBGLOG(BOW, EVENT, "Sequence no. of BOW Responder scan done is not matched.\n");
  1870. return;
  1871. }
  1872. prConnSettings->fgIsScanReqIssued = FALSE;
  1873. prBssDesc = scanSearchBssDescByBssid(prAdapter, prBowFsmInfo->aucPeerAddress);
  1874. #if CFG_BOW_TEST
  1875. DBGLOG(BOW, EVENT, "End scan result searching.\n");
  1876. #endif
  1877. /* Initiator is FOUND */
  1878. if (prBssDesc != NULL) {
  1879. /* (prBssDesc->aucBSSID != NULL)) */
  1880. #if CFG_BOW_TEST
  1881. DBGLOG(BOW, EVENT, "Search Bow Peer address - %x:%x:%x:%x:%x:%x.\n", prBssDesc->aucBSSID[0],
  1882. prBssDesc->aucBSSID[1],
  1883. prBssDesc->aucBSSID[2],
  1884. prBssDesc->aucBSSID[3], prBssDesc->aucBSSID[4], prBssDesc->aucBSSID[5]);
  1885. DBGLOG(BOW, EVENT, "Starting to join initiator.\n");
  1886. #endif
  1887. /*Set target BssDesc */
  1888. prBowFsmInfo->prTargetBssDesc = prBssDesc;
  1889. /*Request channel to do JOIN */
  1890. bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress,
  1891. BOW_DEVICE_STATE_ACQUIRING_CHANNEL);
  1892. bowRequestCh(prAdapter);
  1893. }
  1894. /*Initiator is NOT FOUND */
  1895. else {
  1896. /*Scan again, until PAL timeout */
  1897. bowResponderScan(prAdapter);
  1898. #if 0
  1899. wlanoidSendSetQueryBowCmd(prAdapter,
  1900. CMD_ID_CMD_BT_OVER_WIFI,
  1901. TRUE,
  1902. FALSE,
  1903. wlanbowCmdEventLinkDisconnected,
  1904. wlanbowCmdTimeoutHandler, 0, NULL, 0);
  1905. #endif
  1906. }
  1907. }
  1908. /*----------------------------------------------------------------------------*/
  1909. /*!
  1910. * @brief Function for cancelling scan request. There is another option to extend channel privilige
  1911. * for another purpose.
  1912. *
  1913. * @param fgIsChannelExtention - Keep the channel previlege, but can cancel scan timer.
  1914. *
  1915. * @return (none)
  1916. */
  1917. /*----------------------------------------------------------------------------*/
  1918. VOID bowResponderCancelScan(IN P_ADAPTER_T prAdapter, IN BOOLEAN fgIsChannelExtention)
  1919. {
  1920. P_MSG_SCN_SCAN_CANCEL prScanCancel = (P_MSG_SCN_SCAN_CANCEL) NULL;
  1921. P_BOW_FSM_INFO_T prBowFsmInfo = (P_BOW_FSM_INFO_T) NULL;
  1922. DEBUGFUNC("bowResponderCancelScan()");
  1923. do {
  1924. ASSERT(prAdapter);
  1925. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  1926. if (TRUE) {
  1927. #if CFG_BOW_TEST
  1928. kalPrint("BOW SCAN [CANCEL:%d]\n", prBowFsmInfo->ucSeqNumOfScanReq);
  1929. #endif
  1930. /* There is a channel privilege on hand. */
  1931. DBGLOG(P2P, TRACE, "BOW Cancel Scan\n");
  1932. prScanCancel =
  1933. (P_MSG_SCN_SCAN_CANCEL) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_CANCEL));
  1934. if (!prScanCancel) {
  1935. /* Buffer not enough, can not cancel scan request. */
  1936. DBGLOG(P2P, TRACE, "Buffer not enough, can not cancel scan.\n");
  1937. ASSERT(FALSE);
  1938. break;
  1939. }
  1940. prScanCancel->rMsgHdr.eMsgId = MID_BOW_SCN_SCAN_CANCEL;
  1941. prScanCancel->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
  1942. prScanCancel->ucSeqNum = prBowFsmInfo->ucSeqNumOfScanReq;
  1943. #if CFG_ENABLE_WIFI_DIRECT
  1944. prScanCancel->fgIsChannelExt = fgIsChannelExtention;
  1945. #endif
  1946. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prScanCancel, MSG_SEND_METHOD_BUF);
  1947. }
  1948. } while (FALSE);
  1949. } /* bowResponderCancelScan */
  1950. /*----------------------------------------------------------------------------*/
  1951. /*!
  1952. * @brief Initialization of JOIN STATE
  1953. *
  1954. * @param[in] prBssDesc The pointer of BSS_DESC_T which is the BSS we will try to join with.
  1955. *
  1956. * @return (none)
  1957. */
  1958. /*----------------------------------------------------------------------------*/
  1959. VOID bowResponderJoin(IN P_ADAPTER_T prAdapter, IN P_BSS_DESC_T prBssDesc)
  1960. {
  1961. P_BOW_FSM_INFO_T prBowFsmInfo;
  1962. P_BSS_INFO_T prBssInfo;
  1963. P_CONNECTION_SETTINGS_T prConnSettings;
  1964. P_STA_RECORD_T prStaRec;
  1965. P_MSG_JOIN_REQ_T prJoinReqMsg;
  1966. ASSERT(prBssDesc);
  1967. ASSERT(prAdapter);
  1968. DBGLOG(BOW, EVENT, "Starting bowResponderJoin.\n");
  1969. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  1970. prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
  1971. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  1972. /* 4 <1> We are going to connect to this BSS. */
  1973. prBssDesc->fgIsConnecting = TRUE;
  1974. bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_CONNECTING);
  1975. /* 4 <2> Setup corresponding STA_RECORD_T */
  1976. /*Support First JOIN and retry */
  1977. prStaRec = bssCreateStaRecFromBssDesc(prAdapter, STA_TYPE_BOW_AP, NETWORK_TYPE_BOW_INDEX, prBssDesc);
  1978. if (!prStaRec)
  1979. return;
  1980. prBowFsmInfo->prTargetStaRec = prStaRec;
  1981. /* 4 <3> Update ucAvailableAuthTypes which we can choice during SAA */
  1982. prStaRec->fgIsReAssoc = FALSE;
  1983. prBowFsmInfo->ucAvailableAuthTypes = (UINT_8) AUTH_TYPE_OPEN_SYSTEM;
  1984. prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT;
  1985. /* 4 <4> Use an appropriate Authentication Algorithm Number among the ucAvailableAuthTypes */
  1986. if (prBowFsmInfo->ucAvailableAuthTypes & (UINT_8) AUTH_TYPE_OPEN_SYSTEM) {
  1987. DBGLOG(BOW, LOUD, "JOIN INIT: Try to do Authentication with AuthType == OPEN_SYSTEM.\n");
  1988. prBowFsmInfo->ucAvailableAuthTypes &= ~(UINT_8) AUTH_TYPE_OPEN_SYSTEM;
  1989. prStaRec->ucAuthAlgNum = (UINT_8) AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
  1990. } else {
  1991. ASSERT(0);
  1992. }
  1993. /* 4 <4.1> sync. to firmware domain */
  1994. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  1995. /* 4 <5> Overwrite Connection Setting for eConnectionPolicy */
  1996. if (prBssDesc->ucSSIDLen) {
  1997. COPY_SSID(prConnSettings->aucSSID, prConnSettings->ucSSIDLen, prBssDesc->aucSSID, prBssDesc->ucSSIDLen);
  1998. #if CFG_BOW_TEST
  1999. DBGLOG(BOW, EVENT, "bowResponderJoin, SSID %s.\n", prBssDesc->aucSSID);
  2000. DBGLOG(BOW, EVENT, "bowResponderJoin, SSID %s.\n", prConnSettings->aucSSID);
  2001. #endif
  2002. }
  2003. /* 4 <6> Send a Msg to trigger SAA to start JOIN process. */
  2004. prJoinReqMsg = (P_MSG_JOIN_REQ_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
  2005. if (!prJoinReqMsg) {
  2006. ASSERT(0); /* Can't trigger SAA FSM */
  2007. return;
  2008. }
  2009. prJoinReqMsg->rMsgHdr.eMsgId = MID_BOW_SAA_FSM_START;
  2010. prJoinReqMsg->ucSeqNum = ++prBowFsmInfo->ucSeqNumOfReqMsg;
  2011. prJoinReqMsg->prStaRec = prStaRec;
  2012. prBssInfo->prStaRecOfAP = prStaRec;
  2013. #if CFG_BOW_TEST
  2014. DBGLOG(BOW, EVENT, "prStaRec->eStaType, %x.\n", prStaRec->eStaType);
  2015. DBGLOG(BOW, INFO, "BoW trigger SAA [%pM]\n", prStaRec->aucMacAddr);
  2016. #endif
  2017. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prJoinReqMsg, MSG_SEND_METHOD_BUF);
  2018. }
  2019. /*----------------------------------------------------------------------------*/
  2020. /*!
  2021. * @brief This function will handle the Join Complete Event from SAA FSM for BOW FSM
  2022. *
  2023. * @param[in] prMsgHdr Message of Join Complete of SAA FSM.
  2024. *
  2025. * @return (none)
  2026. */
  2027. /*----------------------------------------------------------------------------*/
  2028. VOID bowFsmRunEventJoinComplete(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  2029. {
  2030. P_MSG_JOIN_COMP_T prJoinCompMsg;
  2031. P_BOW_FSM_INFO_T prBowFsmInfo;
  2032. P_STA_RECORD_T prStaRec;
  2033. P_SW_RFB_T prAssocRspSwRfb;
  2034. P_BSS_INFO_T prBssInfo;
  2035. P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) NULL;
  2036. UINT_16 u2IELength;
  2037. PUINT_8 pucIE;
  2038. P_BSS_INFO_T prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
  2039. ASSERT(prAdapter);
  2040. ASSERT(prMsgHdr);
  2041. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  2042. prJoinCompMsg = (P_MSG_JOIN_COMP_T) prMsgHdr;
  2043. prStaRec = prJoinCompMsg->prStaRec;
  2044. #if CFG_BOW_TEST
  2045. DBGLOG(BOW, EVENT, "Start bowfsmRunEventJoinComplete.\n");
  2046. DBGLOG(BOW, EVENT, "bowfsmRunEventJoinComplete ptr check\n");
  2047. DBGLOG(BOW, EVENT, "prMsgHdr %x\n", prMsgHdr);
  2048. DBGLOG(BOW, EVENT, "prAdapter %x\n", prAdapter);
  2049. DBGLOG(BOW, EVENT, "prBowFsmInfo %x\n", prBowFsmInfo);
  2050. DBGLOG(BOW, EVENT, "prStaRec %x\n", prStaRec);
  2051. #endif
  2052. ASSERT(prStaRec);
  2053. ASSERT(prBowFsmInfo);
  2054. /* Check SEQ NUM */
  2055. if (prJoinCompMsg->ucSeqNum == prBowFsmInfo->ucSeqNumOfReqMsg) {
  2056. COPY_MAC_ADDR(prBowFsmInfo->aucPeerAddress, prStaRec->aucMacAddr);
  2057. /* 4 <1> JOIN was successful */
  2058. if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
  2059. prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
  2060. prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prAssocRspSwRfb->pvHeader;
  2061. prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
  2062. u2IELength = (UINT_16) ((prAssocRspSwRfb->u2PacketLen - prAssocRspSwRfb->u2HeaderLen) -
  2063. (OFFSET_OF(WLAN_ASSOC_RSP_FRAME_T, aucInfoElem[0]) -
  2064. WLAN_MAC_MGMT_HEADER_LEN));
  2065. pucIE = prAssocRspFrame->aucInfoElem;
  2066. prStaRec->eStaType = STA_TYPE_BOW_AP;
  2067. prStaRec->u2DesiredNonHTRateSet &= prBowBssInfo->u2OperationalRateSet;
  2068. prStaRec->ucDesiredPhyTypeSet = prStaRec->ucPhyTypeSet & prBowBssInfo->ucPhyTypeSet;
  2069. #if CFG_BOW_RATE_LIMITATION
  2070. /* 4 <1.2>Update Rate Set */
  2071. /*Limit Rate Set to 24M, 48M, 54M */
  2072. prStaRec->u2DesiredNonHTRateSet &= (RATE_SET_BIT_24M | RATE_SET_BIT_48M | RATE_SET_BIT_54M);
  2073. /*If peer cannot support the above rate set, fix on the available highest rate */
  2074. if (prStaRec->u2DesiredNonHTRateSet == 0) {
  2075. UINT_8 ucHighestRateIndex;
  2076. if (rateGetHighestRateIndexFromRateSet
  2077. (prBowBssInfo->u2OperationalRateSet, &ucHighestRateIndex)) {
  2078. prStaRec->u2DesiredNonHTRateSet = BIT(ucHighestRateIndex);
  2079. }
  2080. }
  2081. #endif
  2082. /* 4 <1.1> Change FW's Media State immediately. */
  2083. bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
  2084. mqmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
  2085. /* 4 <1.2> Update HT information and set channel */
  2086. /* Record HT related parameters in rStaRec and rBssInfo
  2087. * Note: it shall be called before nicUpdateBss()
  2088. */
  2089. #if CFG_BOW_SUPPORT_11N
  2090. rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
  2091. #endif
  2092. /* 4 <1.3> Update BSS_INFO_T */
  2093. nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
  2094. #if CFG_BOW_TEST
  2095. DBGLOG(BOW, EVENT, "Finish bowUpdateBssInfoForJOIN.\n");
  2096. #endif
  2097. /* 4 <1.4> Activate current AP's STA_RECORD_T in Driver. */
  2098. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
  2099. #if CFG_BOW_TEST
  2100. DBGLOG(BOW, EVENT, "bowFsmRunEventJoinComplete, qmActivateStaRec.\n");
  2101. #endif
  2102. /* 4 <1.7> Set the Next State of BOW FSM */
  2103. wlanoidSendSetQueryBowCmd(prAdapter,
  2104. CMD_ID_CMD_BT_OVER_WIFI,
  2105. TRUE,
  2106. FALSE,
  2107. wlanbowCmdEventLinkConnected, wlanbowCmdTimeoutHandler, 0, NULL, 0);
  2108. }
  2109. /* 4 <2> JOIN was not successful */
  2110. else {
  2111. /*Retry */
  2112. bowResponderJoin(prAdapter, prBowFsmInfo->prTargetBssDesc);
  2113. #if 0
  2114. wlanoidSendSetQueryBowCmd(prAdapter,
  2115. CMD_ID_CMD_BT_OVER_WIFI,
  2116. TRUE,
  2117. FALSE,
  2118. wlanbowCmdEventLinkDisconnected,
  2119. wlanbowCmdTimeoutHandler, 0, NULL, 0);
  2120. #endif
  2121. #if CFG_BOW_TEST
  2122. DBGLOG(BOW, EVENT, "Start bowfsmRunEventJoinComplete -- Join failed.\n");
  2123. DBGLOG(BOW, INFO, "BoW trigger SAA REJOIN\n");
  2124. #endif
  2125. }
  2126. }
  2127. cnmMemFree(prAdapter, prMsgHdr);
  2128. }
  2129. /*----------------------------------------------------------------------------*/
  2130. /*!
  2131. * @brief This function will indicate the Media State to HOST
  2132. *
  2133. * @param[in] eConnectionState Current Media State
  2134. * @param[in] fgDelayIndication Set TRUE for postponing the Disconnect Indication.
  2135. *
  2136. * @return (none)
  2137. */
  2138. /*----------------------------------------------------------------------------*/
  2139. VOID
  2140. bowIndicationOfMediaStateToHost(IN P_ADAPTER_T prAdapter,
  2141. IN ENUM_PARAM_MEDIA_STATE_T eConnectionState, IN BOOLEAN fgDelayIndication)
  2142. {
  2143. EVENT_CONNECTION_STATUS rEventConnStatus;
  2144. P_CONNECTION_SETTINGS_T prConnSettings;
  2145. P_BSS_INFO_T prBssInfo;
  2146. P_BOW_FSM_INFO_T prBowFsmInfo;
  2147. prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
  2148. prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
  2149. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  2150. /* NOTE(Kevin): Move following line to bowChangeMediaState() macro per CM's request. */
  2151. /* prBowBssInfo->eConnectionState = eConnectionState; */
  2152. /* For indicating the Disconnect Event only if current media state is
  2153. * disconnected and we didn't do indication yet.
  2154. */
  2155. if (prBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
  2156. if (prBssInfo->eConnectionStateIndicated == eConnectionState)
  2157. return;
  2158. }
  2159. if (!fgDelayIndication) {
  2160. /* 4 <0> Cancel Delay Timer */
  2161. cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rIndicationOfDisconnectTimer);
  2162. /* 4 <1> Fill EVENT_CONNECTION_STATUS */
  2163. rEventConnStatus.ucMediaStatus = (UINT_8) eConnectionState;
  2164. if (eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
  2165. rEventConnStatus.ucReasonOfDisconnect = DISCONNECT_REASON_CODE_RESERVED;
  2166. if (prBssInfo->eCurrentOPMode == OP_MODE_BOW) {
  2167. rEventConnStatus.ucInfraMode = (UINT_8) NET_TYPE_INFRA;
  2168. rEventConnStatus.u2AID = prBssInfo->u2AssocId;
  2169. rEventConnStatus.u2ATIMWindow = 0;
  2170. } else if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
  2171. rEventConnStatus.ucInfraMode = (UINT_8) NET_TYPE_IBSS;
  2172. rEventConnStatus.u2AID = 0;
  2173. rEventConnStatus.u2ATIMWindow = prBssInfo->u2ATIMWindow;
  2174. } else {
  2175. ASSERT(0);
  2176. }
  2177. COPY_SSID(rEventConnStatus.aucSsid,
  2178. rEventConnStatus.ucSsidLen, prConnSettings->aucSSID, prConnSettings->ucSSIDLen);
  2179. COPY_MAC_ADDR(rEventConnStatus.aucBssid, prBssInfo->aucBSSID);
  2180. rEventConnStatus.u2BeaconPeriod = prBssInfo->u2BeaconInterval;
  2181. rEventConnStatus.u4FreqInKHz = nicChannelNum2Freq(prBssInfo->ucPrimaryChannel);
  2182. switch (prBssInfo->ucNonHTBasicPhyType) {
  2183. case PHY_TYPE_HR_DSSS_INDEX:
  2184. rEventConnStatus.ucNetworkType = (UINT_8) PARAM_NETWORK_TYPE_DS;
  2185. break;
  2186. case PHY_TYPE_ERP_INDEX:
  2187. rEventConnStatus.ucNetworkType = (UINT_8) PARAM_NETWORK_TYPE_OFDM24;
  2188. break;
  2189. case PHY_TYPE_OFDM_INDEX:
  2190. rEventConnStatus.ucNetworkType = (UINT_8) PARAM_NETWORK_TYPE_OFDM5;
  2191. break;
  2192. default:
  2193. ASSERT(0);
  2194. rEventConnStatus.ucNetworkType = (UINT_8) PARAM_NETWORK_TYPE_DS;
  2195. break;
  2196. }
  2197. } else {
  2198. #if CFG_PRIVACY_MIGRATION
  2199. /* Clear the pmkid cache while media disconnect */
  2200. secClearPmkid(prAdapter);
  2201. #endif
  2202. rEventConnStatus.ucReasonOfDisconnect = prBssInfo->ucReasonOfDisconnect;
  2203. }
  2204. /* 4 <2> Indication */
  2205. nicMediaStateChange(prAdapter, NETWORK_TYPE_BOW_INDEX, &rEventConnStatus);
  2206. prBssInfo->eConnectionStateIndicated = eConnectionState;
  2207. } else {
  2208. /* NOTE: Only delay the Indication of Disconnect Event */
  2209. ASSERT(eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED);
  2210. DBGLOG(BOW, INFO, "Postpone the indication of Disconnect for %d seconds\n",
  2211. prConnSettings->ucDelayTimeOfDisconnectEvent);
  2212. cnmTimerStartTimer(prAdapter,
  2213. &prBowFsmInfo->rIndicationOfDisconnectTimer,
  2214. SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent));
  2215. }
  2216. }
  2217. /*----------------------------------------------------------------------------*/
  2218. /*!
  2219. * @brief This function will indicate the Event of Tx Fail of AAA Module.
  2220. *
  2221. * @param[in] prAdapter Pointer to the Adapter structure.
  2222. * @param[in] prStaRec Pointer to the STA_RECORD_T
  2223. *
  2224. * @return (none)
  2225. */
  2226. /*----------------------------------------------------------------------------*/
  2227. VOID bowRunEventAAATxFail(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec)
  2228. {
  2229. P_BSS_INFO_T prBssInfo;
  2230. ASSERT(prAdapter);
  2231. ASSERT(prStaRec);
  2232. #if CFG_BOW_TEST
  2233. DBGLOG(BOW, EVENT, "bowRunEventAAATxFail , bssRemoveStaRecFromClientList.\n");
  2234. DBGLOG(BOW, INFO, "BoW AAA TxFail, target state %d\n", prStaRec->ucStaState + 1);
  2235. #endif
  2236. prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
  2237. bssRemoveStaRecFromClientList(prAdapter, prBssInfo, prStaRec);
  2238. }
  2239. /*----------------------------------------------------------------------------*/
  2240. /*!
  2241. * @brief This function will indicate the Event of Successful Completion of AAA Module.
  2242. *
  2243. * @param[in] prAdapter Pointer to the Adapter structure.
  2244. * @param[in] prStaRec Pointer to the STA_RECORD_T
  2245. *
  2246. * @return (none)
  2247. */
  2248. /*----------------------------------------------------------------------------*/
  2249. WLAN_STATUS bowRunEventAAAComplete(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec)
  2250. {
  2251. P_BOW_FSM_INFO_T prBowFsmInfo;
  2252. ASSERT(prStaRec);
  2253. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  2254. #if CFG_BOW_TEST
  2255. DBGLOG(BOW, EVENT, "bowRunEventAAAComplete, cnmStaRecChangeState, STA_STATE_3.\n");
  2256. DBGLOG(BOW, INFO, "BoW AAA complete [%pM]\n", prStaRec->aucMacAddr);
  2257. #endif
  2258. /*Update BssInfo to connected */
  2259. bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
  2260. nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
  2261. /*Update StaRec to State3 */
  2262. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
  2263. /*Connected */
  2264. wlanoidSendSetQueryBowCmd(prAdapter,
  2265. CMD_ID_CMD_BT_OVER_WIFI,
  2266. TRUE, FALSE, wlanbowCmdEventLinkConnected, wlanbowCmdTimeoutHandler, 0, NULL, 0);
  2267. return WLAN_STATUS_SUCCESS;
  2268. }
  2269. /*----------------------------------------------------------------------------*/
  2270. /*!
  2271. * @brief This function will handle RxDeauth
  2272. *
  2273. * @param[in] prAdapter Pointer to the Adapter structure.
  2274. * @param[in] prStaRec Pointer to the STA_RECORD_T
  2275. *
  2276. * @return (none)
  2277. */
  2278. /*----------------------------------------------------------------------------*/
  2279. WLAN_STATUS bowRunEventRxDeAuth(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN P_SW_RFB_T prSwRfb)
  2280. {
  2281. P_BSS_INFO_T prBowBssInfo;
  2282. P_BOW_FSM_INFO_T prBowFsmInfo;
  2283. ENUM_BOW_DEVICE_STATE eFsmState;
  2284. ASSERT(prAdapter);
  2285. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  2286. prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
  2287. if (!IS_STA_IN_BOW(prStaRec))
  2288. return WLAN_STATUS_NOT_ACCEPTED;
  2289. eFsmState = bowGetBowTableState(prAdapter, prStaRec->aucMacAddr);
  2290. if (eFsmState == BOW_DEVICE_STATE_DISCONNECTED) {
  2291. /*do nothing */
  2292. return WLAN_STATUS_NOT_ACCEPTED;
  2293. }
  2294. if (prStaRec->ucStaState > STA_STATE_1) {
  2295. if (STA_STATE_3 == prStaRec->ucStaState) {
  2296. /* P_MSG_AIS_ABORT_T prAisAbortMsg; */
  2297. /* NOTE(Kevin): Change state immediately to avoid starvation of
  2298. * MSG buffer because of too many deauth frames before changing
  2299. * the STA state.
  2300. */
  2301. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  2302. }
  2303. COPY_MAC_ADDR(prBowFsmInfo->aucPeerAddress, prStaRec->aucMacAddr);
  2304. wlanoidSendSetQueryBowCmd(prAdapter,
  2305. CMD_ID_CMD_BT_OVER_WIFI,
  2306. TRUE,
  2307. FALSE, wlanbowCmdEventLinkDisconnected, wlanbowCmdTimeoutHandler, 0, NULL, 0);
  2308. return WLAN_STATUS_SUCCESS;
  2309. }
  2310. return WLAN_STATUS_NOT_ACCEPTED;
  2311. }
  2312. /*----------------------------------------------------------------------------*/
  2313. /*!
  2314. * \brief This function handle BoW Link disconnect.
  2315. *
  2316. * \param[in] pMsduInfo Pointer to the Msdu Info
  2317. * \param[in] rStatus The Tx done status
  2318. *
  2319. * \return -
  2320. *
  2321. * \note after receive deauth frame, callback function call this
  2322. */
  2323. /*----------------------------------------------------------------------------*/
  2324. VOID bowDisconnectLink(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus)
  2325. {
  2326. P_BOW_FSM_INFO_T prBowFsmInfo;
  2327. P_STA_RECORD_T prStaRec;
  2328. ASSERT(prAdapter);
  2329. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  2330. /*Free target StaRec */
  2331. if (prMsduInfo)
  2332. prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
  2333. else
  2334. prStaRec = prBowFsmInfo->prTargetStaRec;
  2335. if (prStaRec)
  2336. /* cnmStaRecFree(prAdapter, prStaRec, TRUE); */
  2337. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  2338. kalPrint("bowDisconnectLink\n");
  2339. /*No one connected */
  2340. if (g_u4LinkCount == 0 && g_u4Beaconing != 0) {
  2341. cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rStartingBeaconTimer);
  2342. bowStopping(prAdapter);
  2343. kalPrint("bowStopping\n");
  2344. /*Restore TxPower from Short range mode */
  2345. #if CFG_SUPPORT_NVRAM && 0
  2346. wlanLoadManufactureData(prAdapter, kalGetConfiguration(prAdapter->prGlueInfo));
  2347. #endif
  2348. /*Uninit BoW Interface */
  2349. #if CFG_BOW_SEPARATE_DATA_PATH
  2350. kalUninitBowDevice(prAdapter->prGlueInfo);
  2351. #endif
  2352. }
  2353. }
  2354. /*----------------------------------------------------------------------------*/
  2355. /*!
  2356. * @brief This function will validate the Rx Assoc Req Frame and then return
  2357. * the status code to AAA to indicate if need to perform following actions
  2358. * when the specified conditions were matched.
  2359. *
  2360. * @param[in] prAdapter Pointer to the Adapter structure.
  2361. * @param[in] prSwRfb Pointer to SW RFB data structure.
  2362. * @param[out] pu2StatusCode The Status Code of Validation Result
  2363. *
  2364. * @retval TRUE Reply the Assoc Resp
  2365. * @retval FALSE Don't reply the Assoc Resp
  2366. */
  2367. /*----------------------------------------------------------------------------*/
  2368. BOOLEAN bowValidateAssocReq(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb, OUT PUINT_16 pu2StatusCode)
  2369. {
  2370. BOOLEAN fgReplyAssocResp = FALSE;
  2371. P_BSS_INFO_T prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
  2372. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  2373. P_BOW_FSM_INFO_T prBowFsmInfo;
  2374. P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T) NULL;
  2375. OS_SYSTIME rCurrentTime;
  2376. static OS_SYSTIME rLastRejectAssocTime;
  2377. ASSERT(prAdapter);
  2378. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  2379. prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T) prSwRfb->pvHeader;
  2380. *pu2StatusCode = STATUS_CODE_REQ_DECLINED;
  2381. #if CFG_BOW_TEST
  2382. DBGLOG(BOW, EVENT, "bowValidateAssocReq, prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
  2383. prBowFsmInfo->aucPeerAddress[0],
  2384. prBowFsmInfo->aucPeerAddress[1],
  2385. prBowFsmInfo->aucPeerAddress[2],
  2386. prBowFsmInfo->aucPeerAddress[3],
  2387. prBowFsmInfo->aucPeerAddress[4], prBowFsmInfo->aucPeerAddress[5]));
  2388. DBGLOG(BOW, EVENT, "bowValidateAssocReq, prAssocReqFrame->aucSrcAddr, %x:%x:%x:%x:%x:%x.\n",
  2389. prAssocReqFrame->aucSrcAddr[0],
  2390. prAssocReqFrame->aucSrcAddr[1],
  2391. prAssocReqFrame->aucSrcAddr[2],
  2392. prAssocReqFrame->aucSrcAddr[3],
  2393. prAssocReqFrame->aucSrcAddr[4], prAssocReqFrame->aucSrcAddr[5]));
  2394. #endif
  2395. /*Assoc Accept */
  2396. while (EQUAL_MAC_ADDR(prAssocReqFrame->aucSrcAddr, prBowFsmInfo->aucPeerAddress)) {
  2397. #if CFG_BOW_TEST
  2398. DBGLOG(BOW, EVENT, "bowValidateAssocReq, return wlanbowCmdEventLinkConnected.\n");
  2399. #endif
  2400. /*Update StaRec */
  2401. prStaRec = cnmGetStaRecByAddress(prAdapter,
  2402. (UINT_8) NETWORK_TYPE_BOW_INDEX, prAssocReqFrame->aucSrcAddr);
  2403. if (!prStaRec)
  2404. break;
  2405. prStaRec->eStaType = STA_TYPE_BOW_CLIENT;
  2406. prStaRec->u2DesiredNonHTRateSet &= prBowBssInfo->u2OperationalRateSet;
  2407. prStaRec->ucDesiredPhyTypeSet = prStaRec->ucPhyTypeSet & prBowBssInfo->ucPhyTypeSet;
  2408. #if CFG_BOW_RATE_LIMITATION
  2409. /*Limit Rate Set to 24M, 48M, 54M */
  2410. prStaRec->u2DesiredNonHTRateSet &= (RATE_SET_BIT_24M | RATE_SET_BIT_48M | RATE_SET_BIT_54M);
  2411. /*If peer cannot support the above rate set, fix on the available highest rate */
  2412. if (prStaRec->u2DesiredNonHTRateSet == 0) {
  2413. UINT_8 ucHighestRateIndex;
  2414. if (rateGetHighestRateIndexFromRateSet(prBowBssInfo->u2OperationalRateSet, &ucHighestRateIndex))
  2415. prStaRec->u2DesiredNonHTRateSet = BIT(ucHighestRateIndex);
  2416. else {
  2417. /*If no available rate is found, DECLINE the association */
  2418. *pu2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
  2419. break;
  2420. }
  2421. }
  2422. #endif
  2423. prStaRec->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
  2424. /*Undpate BssInfo to FW */
  2425. bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
  2426. nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
  2427. /*reply successful */
  2428. *pu2StatusCode = STATUS_CODE_SUCCESSFUL;
  2429. fgReplyAssocResp = TRUE;
  2430. break;
  2431. }
  2432. /*Reject Assoc */
  2433. if (*pu2StatusCode != STATUS_CODE_SUCCESSFUL) {
  2434. /*Reply Assoc with reject every 5s */
  2435. rCurrentTime = kalGetTimeTick();
  2436. if (CHECK_FOR_TIMEOUT(rCurrentTime, rLastRejectAssocTime, MSEC_TO_SYSTIME(5000)) ||
  2437. rLastRejectAssocTime == 0) {
  2438. fgReplyAssocResp = TRUE;
  2439. rLastRejectAssocTime = rCurrentTime;
  2440. }
  2441. }
  2442. return fgReplyAssocResp;
  2443. }
  2444. /*----------------------------------------------------------------------------*/
  2445. /*!
  2446. * @brief This function will validate the Rx Auth Frame and then return
  2447. * the status code to AAA to indicate if need to perform following actions
  2448. * when the specified conditions were matched.
  2449. *
  2450. * @param[in] prAdapter Pointer to the Adapter structure.
  2451. * @param[in] prSwRfb Pointer to SW RFB data structure.
  2452. * @param[in] pprStaRec Pointer to pointer of STA_RECORD_T structure.
  2453. * @param[out] pu2StatusCode The Status Code of Validation Result
  2454. *
  2455. * @retval TRUE Reply the Auth
  2456. * @retval FALSE Don't reply the Auth
  2457. */
  2458. /*----------------------------------------------------------------------------*/
  2459. BOOLEAN
  2460. bowValidateAuth(IN P_ADAPTER_T prAdapter,
  2461. IN P_SW_RFB_T prSwRfb, IN PP_STA_RECORD_T pprStaRec, OUT PUINT_16 pu2StatusCode)
  2462. {
  2463. BOOLEAN fgReplyAuth = FALSE;
  2464. P_BSS_INFO_T prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
  2465. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  2466. P_BOW_FSM_INFO_T prBowFsmInfo;
  2467. P_WLAN_AUTH_FRAME_T prAuthFrame = (P_WLAN_AUTH_FRAME_T) NULL;
  2468. OS_SYSTIME rCurrentTime;
  2469. static OS_SYSTIME rLastRejectAuthTime;
  2470. /* TODO(Kevin): Call BoW functions to check ..
  2471. 1. Check we are BoW now.
  2472. 2. Check we can accept connection from thsi peer
  2473. 3. Check Black List here.
  2474. */
  2475. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  2476. prAuthFrame = (P_WLAN_AUTH_FRAME_T) prSwRfb->pvHeader;
  2477. #if CFG_BOW_TEST
  2478. DBGLOG(BOW, EVENT, "bowValidateAuth, prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
  2479. prBowFsmInfo->aucPeerAddress[0],
  2480. prBowFsmInfo->aucPeerAddress[1],
  2481. prBowFsmInfo->aucPeerAddress[2],
  2482. prBowFsmInfo->aucPeerAddress[3],
  2483. prBowFsmInfo->aucPeerAddress[4], prBowFsmInfo->aucPeerAddress[5]));
  2484. DBGLOG(BOW, EVENT, "bowValidateAuth, prAuthFrame->aucSrcAddr, %x:%x:%x:%x:%x:%x.\n",
  2485. prAuthFrame->aucSrcAddr[0],
  2486. prAuthFrame->aucSrcAddr[1],
  2487. prAuthFrame->aucSrcAddr[2],
  2488. prAuthFrame->aucSrcAddr[3], prAuthFrame->aucSrcAddr[4], prAuthFrame->aucSrcAddr[5]));
  2489. #endif
  2490. prStaRec = cnmGetStaRecByAddress(prAdapter, (UINT_8) NETWORK_TYPE_BOW_INDEX, prAuthFrame->aucSrcAddr);
  2491. if (!prStaRec) {
  2492. #if CFG_BOW_TEST
  2493. DBGLOG(BOW, EVENT, "bowValidateAuth, cnmStaRecAlloc.\n");
  2494. #endif
  2495. prStaRec = cnmStaRecAlloc(prAdapter, (UINT_8) NETWORK_TYPE_BOW_INDEX);
  2496. /* TODO(Kevin): Error handling of allocation of STA_RECORD_T for
  2497. * exhausted case and do removal of unused STA_RECORD_T.
  2498. */
  2499. if (!prStaRec)
  2500. return fgReplyAuth;
  2501. COPY_MAC_ADDR(prStaRec->aucMacAddr, prAuthFrame->aucSrcAddr);
  2502. prSwRfb->ucStaRecIdx = prStaRec->ucIndex;
  2503. prBowBssInfo->prStaRecOfAP = prStaRec;
  2504. /* NOTE(Kevin): Better to change state here, not at TX Done */
  2505. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  2506. #if CFG_BOW_TEST
  2507. DBGLOG(BOW, EVENT, "bowValidateAuth, cnmStaRecChangeState.\n");
  2508. #endif
  2509. } else {
  2510. prSwRfb->ucStaRecIdx = prStaRec->ucIndex;
  2511. #if CFG_BOW_TEST
  2512. DBGLOG(BOW, EVENT, "bowValidateAuth, prStaRec->ucIndex, %x.\n", prStaRec->ucIndex);
  2513. #endif
  2514. bssRemoveStaRecFromClientList(prAdapter, prBowBssInfo, prStaRec);
  2515. }
  2516. if (EQUAL_MAC_ADDR(prAuthFrame->aucSrcAddr, prBowFsmInfo->aucPeerAddress)) {
  2517. prStaRec->eStaType = STA_TYPE_BOW_CLIENT;
  2518. prStaRec->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
  2519. #if CFG_BOW_TEST
  2520. DBGLOG(BOW, EVENT, "bowValidateAuth, prStaRec->eStaType, %x.\n", prStaRec->eStaType);
  2521. DBGLOG(BOW, EVENT, "bowValidateAuth, prStaRec->ucNetTypeIndex, %x.\n", prStaRec->ucNetTypeIndex);
  2522. #endif
  2523. /* Update Station Record - Status/Reason Code */
  2524. prStaRec->u2StatusCode = STATUS_CODE_SUCCESSFUL;
  2525. prStaRec->ucJoinFailureCount = 0;
  2526. *pprStaRec = prStaRec;
  2527. *pu2StatusCode = STATUS_CODE_SUCCESSFUL;
  2528. fgReplyAuth = TRUE;
  2529. } else {
  2530. cnmStaRecFree(prAdapter, prStaRec, FALSE);
  2531. *pu2StatusCode = STATUS_CODE_REQ_DECLINED;
  2532. /*Reply auth with reject every 5s */
  2533. rCurrentTime = kalGetTimeTick();
  2534. if (CHECK_FOR_TIMEOUT(rCurrentTime, rLastRejectAuthTime, MSEC_TO_SYSTIME(5000)) ||
  2535. rLastRejectAuthTime == 0) {
  2536. fgReplyAuth = TRUE;
  2537. rLastRejectAuthTime = rCurrentTime;
  2538. }
  2539. }
  2540. #if CFG_BOW_TEST
  2541. DBGLOG(BOW, EVENT, "bowValidateAuth, fgReplyAuth, %x.\n", fgReplyAuth);
  2542. #endif
  2543. return fgReplyAuth;
  2544. }
  2545. /*----------------------------------------------------------------------------*/
  2546. /*!
  2547. * \brief This function is invoked when CNM granted channel privilege
  2548. *
  2549. * \param[in] prAdapter Pointer of ADAPTER_T
  2550. *
  2551. * \return none
  2552. */
  2553. /*----------------------------------------------------------------------------*/
  2554. VOID bowRunEventChGrant(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  2555. {
  2556. P_BSS_INFO_T prBowBssInfo;
  2557. P_BOW_FSM_INFO_T prBowFsmInfo;
  2558. P_MSG_CH_GRANT_T prMsgChGrant;
  2559. UINT_8 ucTokenID;
  2560. UINT_32 u4GrantInterval;
  2561. ENUM_BOW_DEVICE_STATE eFsmState;
  2562. ASSERT(prAdapter);
  2563. ASSERT(prMsgHdr);
  2564. prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
  2565. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  2566. prMsgChGrant = (P_MSG_CH_GRANT_T) prMsgHdr;
  2567. ucTokenID = prMsgChGrant->ucTokenID;
  2568. u4GrantInterval = prMsgChGrant->u4GrantInterval;
  2569. /* 1. free message */
  2570. cnmMemFree(prAdapter, prMsgHdr);
  2571. prBowFsmInfo->fgIsChannelGranted = TRUE;
  2572. #if CFG_BOW_TEST
  2573. DBGLOG(BOW, EVENT, "Entering bowRunEventChGrant.\n");
  2574. #endif
  2575. eFsmState = bowGetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress);
  2576. /*Release channel */
  2577. if ((!prBowFsmInfo->fgIsChannelRequested) ||
  2578. (prBowFsmInfo->ucSeqNumOfChReq != ucTokenID) ||
  2579. (eFsmState == BOW_DEVICE_STATE_DISCONNECTED) || (eFsmState == BOW_DEVICE_STATE_DISCONNECTING)) {
  2580. #if CFG_BOW_TEST
  2581. DBGLOG(BOW, INFO, "BoW Channel [GIVE UP:%d]\n", ucTokenID);
  2582. DBGLOG(BOW, INFO, "[Requested:%d][ucSeqNumOfChReq:%d][eFsmState:%d]\n",
  2583. prBowFsmInfo->fgIsChannelRequested, prBowFsmInfo->ucSeqNumOfChReq, eFsmState);
  2584. #endif
  2585. bowReleaseCh(prAdapter);
  2586. return;
  2587. }
  2588. /* 2. channel privilege has been approved */
  2589. prBowFsmInfo->u4ChGrantedInterval = u4GrantInterval;
  2590. #if 0
  2591. cnmTimerStartTimer(prAdapter,
  2592. &prBowFsmInfo->rChGrantedTimer,
  2593. prBowFsmInfo->u4ChGrantedInterval - BOW_JOIN_CH_GRANT_THRESHOLD);
  2594. #else
  2595. cnmTimerStartTimer(prAdapter,
  2596. &prBowFsmInfo->rChGrantedTimer, BOW_JOIN_CH_REQUEST_INTERVAL - BOW_JOIN_CH_GRANT_THRESHOLD);
  2597. #endif
  2598. /* 3.2 set local variable to indicate join timer is ticking */
  2599. prBowFsmInfo->fgIsInfraChannelFinished = FALSE;
  2600. #if CFG_BOW_TEST
  2601. DBGLOG(BOW, INFO, "BoW Channel [GRANTED:%d].\n", ucTokenID);
  2602. #endif
  2603. if (eFsmState == BOW_DEVICE_STATE_ACQUIRING_CHANNEL) {
  2604. bowStarting(prAdapter);
  2605. bowReleaseCh(prAdapter);
  2606. if (prBowFsmInfo->ucRole == BOW_RESPONDER)
  2607. bowResponderJoin(prAdapter, prBowFsmInfo->prTargetBssDesc);
  2608. } else {
  2609. /*update bssinfo */
  2610. nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
  2611. bowReleaseCh(prAdapter);
  2612. }
  2613. } /* end of aisFsmRunEventChGrant() */
  2614. /*----------------------------------------------------------------------------*/
  2615. /*!
  2616. * \brief This function is to inform CNM for channel privilege requesting
  2617. * has been released
  2618. *
  2619. * \param[in] prAdapter Pointer of ADAPTER_T
  2620. *
  2621. * \return none
  2622. */
  2623. /*----------------------------------------------------------------------------*/
  2624. VOID bowRequestCh(IN P_ADAPTER_T prAdapter)
  2625. {
  2626. P_BOW_FSM_INFO_T prBowFsmInfo;
  2627. P_MSG_CH_REQ_T prMsgChReq;
  2628. ASSERT(prAdapter);
  2629. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  2630. if (prBowFsmInfo->fgIsChannelGranted == FALSE) {
  2631. #if CFG_BOW_TEST
  2632. DBGLOG(BOW, INFO, "BoW channel [REQUEST:%d], %d, %d.\n", prBowFsmInfo->ucSeqNumOfChReq + 1,
  2633. prBowFsmInfo->ucPrimaryChannel, prBowFsmInfo->eBand);
  2634. #endif
  2635. prMsgChReq = (P_MSG_CH_REQ_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_REQ_T));
  2636. if (!prMsgChReq) {
  2637. ASSERT(0); /* Can't indicate CNM for channel acquiring */
  2638. return;
  2639. }
  2640. prMsgChReq->rMsgHdr.eMsgId = MID_MNY_CNM_CH_REQ;
  2641. prMsgChReq->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
  2642. prMsgChReq->ucTokenID = ++prBowFsmInfo->ucSeqNumOfChReq;
  2643. prMsgChReq->eReqType = CH_REQ_TYPE_JOIN;
  2644. #if 0
  2645. prMsgChReq->u4MaxInterval = BOW_JOIN_CH_REQUEST_INTERVAL;
  2646. #else
  2647. prMsgChReq->u4MaxInterval = 1;
  2648. #endif
  2649. /* prBowFsmInfo->prTargetBssDesc->ucChannelNum; */
  2650. prMsgChReq->ucPrimaryChannel = prBowFsmInfo->ucPrimaryChannel;
  2651. /* prBowFsmInfo->prTargetBssDesc->eSco; */
  2652. prMsgChReq->eRfSco = CHNL_EXT_SCN;
  2653. /* prBowFsmInfo->prTargetBssDesc->eBand; */
  2654. prMsgChReq->eRfBand = prBowFsmInfo->eBand;
  2655. COPY_MAC_ADDR(prMsgChReq->aucBSSID, prBowFsmInfo->aucPeerAddress);
  2656. prBowFsmInfo->fgIsChannelRequested = TRUE;
  2657. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prMsgChReq, MSG_SEND_METHOD_BUF);
  2658. }
  2659. }
  2660. /*----------------------------------------------------------------------------*/
  2661. /*!
  2662. * \brief This function is to inform BOW that channel privilege is granted
  2663. * has been released
  2664. *
  2665. * \param[in] prAdapter Pointer of ADAPTER_T
  2666. *
  2667. * \return none
  2668. */
  2669. /*----------------------------------------------------------------------------*/
  2670. VOID bowReleaseCh(IN P_ADAPTER_T prAdapter)
  2671. {
  2672. P_BOW_FSM_INFO_T prBowFsmInfo;
  2673. P_MSG_CH_ABORT_T prMsgChAbort;
  2674. ASSERT(prAdapter);
  2675. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  2676. if (prBowFsmInfo->fgIsChannelGranted != FALSE || prBowFsmInfo->fgIsChannelRequested != FALSE) {
  2677. #if CFG_BOW_TEST
  2678. DBGLOG(BOW, INFO, "BoW channel [RELEASE:%d] %d, %d.\n", prBowFsmInfo->ucSeqNumOfChReq,
  2679. prBowFsmInfo->ucPrimaryChannel, prBowFsmInfo->eBand);
  2680. #endif
  2681. prBowFsmInfo->fgIsChannelRequested = FALSE;
  2682. prBowFsmInfo->fgIsChannelGranted = FALSE;
  2683. /* 1. return channel privilege to CNM immediately */
  2684. prMsgChAbort = (P_MSG_CH_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_ABORT_T));
  2685. if (!prMsgChAbort) {
  2686. ASSERT(0); /* Can't release Channel to CNM */
  2687. return;
  2688. }
  2689. prMsgChAbort->rMsgHdr.eMsgId = MID_MNY_CNM_CH_ABORT;
  2690. prMsgChAbort->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
  2691. prMsgChAbort->ucTokenID = prBowFsmInfo->ucSeqNumOfChReq;
  2692. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prMsgChAbort, MSG_SEND_METHOD_BUF);
  2693. }
  2694. } /* end of aisFsmReleaseCh() */
  2695. /*----------------------------------------------------------------------------*/
  2696. /*!
  2697. * @brief This function will indicate an Event of "Media Disconnect" to HOST
  2698. *
  2699. * @param[in] u4Param Unused timer parameter
  2700. *
  2701. * @return (none)
  2702. */
  2703. /*----------------------------------------------------------------------------*/
  2704. VOID bowChGrantedTimeout(IN P_ADAPTER_T prAdapter, IN ULONG ulParam)
  2705. {
  2706. P_BOW_FSM_INFO_T prBowFsmInfo;
  2707. ENUM_BOW_DEVICE_STATE eFsmState;
  2708. ASSERT(prAdapter);
  2709. prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
  2710. #if CFG_BOW_TEST
  2711. DBGLOG(BOW, INFO, "BoW Channel [TIMEOUT]\n");
  2712. #endif
  2713. #if 1
  2714. /* bowReleaseCh(prAdapter); */
  2715. eFsmState = bowGetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress);
  2716. /*If connecting is not completed, request CH again */
  2717. if ((eFsmState == BOW_DEVICE_STATE_CONNECTING) || (eFsmState == BOW_DEVICE_STATE_STARTING))
  2718. bowRequestCh(prAdapter);
  2719. #endif
  2720. }
  2721. BOOLEAN bowNotifyAllLinkDisconnected(IN P_ADAPTER_T prAdapter)
  2722. {
  2723. UINT_8 ucBowTableIdx = 0;
  2724. CMD_INFO_T rCmdInfo;
  2725. ASSERT(prAdapter);
  2726. kalMemZero(&rCmdInfo, sizeof(CMD_INFO_T));
  2727. while (ucBowTableIdx < CFG_BOW_PHYSICAL_LINK_NUM) {
  2728. if (arBowTable[ucBowTableIdx].fgIsValid) {
  2729. COPY_MAC_ADDR(prAdapter->rWifiVar.rBowFsmInfo.aucPeerAddress,
  2730. arBowTable[ucBowTableIdx].aucPeerAddress);
  2731. #if CFG_BOW_TEST
  2732. DBGLOG(BOW, EVENT,
  2733. "bowNotifyAllLinkDisconnected, arBowTable[%x].aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
  2734. ucBowTableIdx, arBowTable[ucBowTableIdx].aucPeerAddress[0],
  2735. arBowTable[ucBowTableIdx].aucPeerAddress[1],
  2736. arBowTable[ucBowTableIdx].aucPeerAddress[2],
  2737. arBowTable[ucBowTableIdx].aucPeerAddress[3],
  2738. arBowTable[ucBowTableIdx].aucPeerAddress[4],
  2739. arBowTable[ucBowTableIdx].aucPeerAddress[5]));
  2740. DBGLOG(BOW, EVENT,
  2741. "bowNotifyAllLinkDisconnected, arBowTable[%x].fgIsValid, %x.\n", ucBowTableIdx,
  2742. arBowTable[ucBowTableIdx].fgIsValid);
  2743. #endif
  2744. #if 1
  2745. wlanoidSendSetQueryBowCmd(prAdapter,
  2746. CMD_ID_CMD_BT_OVER_WIFI,
  2747. TRUE,
  2748. FALSE,
  2749. wlanbowCmdEventLinkDisconnected,
  2750. wlanbowCmdTimeoutHandler, 0, NULL, 0);
  2751. #else
  2752. wlanbowCmdEventLinkDisconnected(prAdapter, &rCmdInfo, NULL);
  2753. #endif
  2754. }
  2755. ucBowTableIdx += 1;
  2756. }
  2757. return TRUE;
  2758. }
  2759. /*----------------------------------------------------------------------------*/
  2760. /*!
  2761. * \brief to retrieve Bluetooth-over-Wi-Fi state from glue layer
  2762. *
  2763. * \param[in]
  2764. * prGlueInfo
  2765. * rPeerAddr
  2766. * \return
  2767. * ENUM_BOW_DEVICE_STATE
  2768. */
  2769. /*----------------------------------------------------------------------------*/
  2770. BOOLEAN bowCheckBowTableIfVaild(IN P_ADAPTER_T prAdapter, IN UINT_8 aucPeerAddress[6])
  2771. {
  2772. UINT_8 idx;
  2773. KAL_SPIN_LOCK_DECLARATION();
  2774. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2775. for (idx = 0; idx < CFG_BOW_PHYSICAL_LINK_NUM; idx++) {
  2776. if (arBowTable[idx].fgIsValid && EQUAL_MAC_ADDR(arBowTable[idx].aucPeerAddress, aucPeerAddress)) {
  2777. #if CFG_BOW_TEST
  2778. DBGLOG(BOW, EVENT, "kalCheckBowifVaild, aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
  2779. aucPeerAddress[0],
  2780. aucPeerAddress[1],
  2781. aucPeerAddress[2],
  2782. aucPeerAddress[3], aucPeerAddress[4], aucPeerAddress[5]));
  2783. DBGLOG(BOW, EVENT,
  2784. "kalCheckBowifVaild, arBowTable[idx].aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
  2785. arBowTable[idx].aucPeerAddress[0], arBowTable[idx].aucPeerAddress[1],
  2786. arBowTable[idx].aucPeerAddress[2], arBowTable[idx].aucPeerAddress[3],
  2787. arBowTable[idx].aucPeerAddress[4], arBowTable[idx].aucPeerAddress[5]));
  2788. DBGLOG(BOW, EVENT,
  2789. "kalCheckBowifVaild, arBowTable[idx].fgIsValid, %x, %x.\n", idx,
  2790. arBowTable[idx].fgIsValid);
  2791. #endif
  2792. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2793. return TRUE;
  2794. }
  2795. }
  2796. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2797. return FALSE;
  2798. }
  2799. BOOLEAN bowGetBowTableContent(IN P_ADAPTER_T prAdapter, IN UINT_8 ucBowTableIdx, OUT P_BOW_TABLE_T prBowTable)
  2800. {
  2801. KAL_SPIN_LOCK_DECLARATION();
  2802. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2803. if (arBowTable[ucBowTableIdx].fgIsValid) {
  2804. #if CFG_BOW_TEST
  2805. DBGLOG(BOW, EVENT,
  2806. "bowGetBowTableContent, arBowTable[idx].fgIsValid, %x, %x.\n", ucBowTableIdx,
  2807. arBowTable[ucBowTableIdx].fgIsValid);
  2808. DBGLOG(BOW, INFO, "GET State [%d]\n", arBowTable[ucBowTableIdx].eState);
  2809. #endif
  2810. prBowTable = &(arBowTable[ucBowTableIdx]);
  2811. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2812. return TRUE;
  2813. }
  2814. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2815. return FALSE;
  2816. }
  2817. BOOLEAN bowSetBowTableContent(IN P_ADAPTER_T prAdapter, IN UINT_8 ucBowTableIdx, IN P_BOW_TABLE_T prBowTable)
  2818. {
  2819. KAL_SPIN_LOCK_DECLARATION();
  2820. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2821. COPY_MAC_ADDR(arBowTable[ucBowTableIdx].aucPeerAddress, prBowTable->aucPeerAddress);
  2822. arBowTable[ucBowTableIdx].eState = prBowTable->eState;
  2823. arBowTable[ucBowTableIdx].fgIsValid = prBowTable->fgIsValid;
  2824. arBowTable[ucBowTableIdx].ucAcquireID = prBowTable->ucAcquireID;
  2825. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2826. kalSetBowState(prAdapter->prGlueInfo, prBowTable->eState, prBowTable->aucPeerAddress);
  2827. /* kalSetBowRole(prAdapter->prGlueInfo, prBowTable->ucRole, prBowTable->aucPeerAddress); */
  2828. #if CFG_BOW_TEST
  2829. DBGLOG(BOW, INFO, "SET State [%d]\n", arBowTable[ucBowTableIdx].eState);
  2830. DBGLOG(BOW, EVENT,
  2831. "kalCheckBowifVaild, arBowTable[ucBowTableIdx].fgIsValid, %x, %x.\n", ucBowTableIdx,
  2832. arBowTable[ucBowTableIdx].fgIsValid);
  2833. #endif
  2834. return TRUE;
  2835. }
  2836. BOOLEAN
  2837. bowGetBowTableEntryByPeerAddress(IN P_ADAPTER_T prAdapter, IN UINT_8 aucPeerAddress[6], OUT PUINT_8 pucBowTableIdx)
  2838. {
  2839. UINT_8 idx;
  2840. KAL_SPIN_LOCK_DECLARATION();
  2841. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2842. for (idx = 0; idx < CFG_BOW_PHYSICAL_LINK_NUM; idx++) {
  2843. if (arBowTable[idx].fgIsValid && EQUAL_MAC_ADDR(arBowTable[idx].aucPeerAddress, aucPeerAddress)) {
  2844. #if CFG_BOW_TEST
  2845. DBGLOG(BOW, EVENT, "kalCheckBowifVaild, aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
  2846. aucPeerAddress[0],
  2847. aucPeerAddress[1],
  2848. aucPeerAddress[2],
  2849. aucPeerAddress[3], aucPeerAddress[4], aucPeerAddress[5]));
  2850. DBGLOG(BOW, EVENT,
  2851. "kalCheckBowifVaild, arBowTable[idx].aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
  2852. arBowTable[idx].aucPeerAddress[0], arBowTable[idx].aucPeerAddress[1],
  2853. arBowTable[idx].aucPeerAddress[2], arBowTable[idx].aucPeerAddress[3],
  2854. arBowTable[idx].aucPeerAddress[4], arBowTable[idx].aucPeerAddress[5]));
  2855. DBGLOG(BOW, EVENT,
  2856. "kalCheckBowifVaild, arBowTable[idx].fgIsValid, %x, %x.\n", idx,
  2857. arBowTable[idx].fgIsValid);
  2858. #endif
  2859. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2860. *pucBowTableIdx = idx;
  2861. return TRUE;
  2862. }
  2863. }
  2864. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2865. return FALSE;
  2866. }
  2867. BOOLEAN bowGetBowTableFreeEntry(IN P_ADAPTER_T prAdapter, OUT PUINT_8 pucBowTableIdx)
  2868. {
  2869. UINT_8 idx;
  2870. KAL_SPIN_LOCK_DECLARATION();
  2871. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2872. for (idx = 0; idx < CFG_BOW_PHYSICAL_LINK_NUM; idx++) {
  2873. if (!arBowTable[idx].fgIsValid) {
  2874. #if CFG_BOW_TEST
  2875. DBGLOG(BOW, EVENT,
  2876. "bowGetBowTableFreeEntry, arBowTable[idx].fgIsValid, %x, %x.\n", idx,
  2877. arBowTable[idx].fgIsValid);
  2878. #endif
  2879. *pucBowTableIdx = idx;
  2880. arBowTable[idx].fgIsValid = TRUE;
  2881. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2882. return TRUE;
  2883. }
  2884. }
  2885. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2886. return FALSE;
  2887. }
  2888. ENUM_BOW_DEVICE_STATE bowGetBowTableState(IN P_ADAPTER_T prAdapter, IN UINT_8 aucPeerAddress[6])
  2889. {
  2890. UINT_8 idx;
  2891. KAL_SPIN_LOCK_DECLARATION();
  2892. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2893. for (idx = 0; idx < CFG_BOW_PHYSICAL_LINK_NUM; idx++) {
  2894. if (arBowTable[idx].fgIsValid && EQUAL_MAC_ADDR(arBowTable[idx].aucPeerAddress, aucPeerAddress)) {
  2895. #if CFG_BOW_TEST
  2896. DBGLOG(BOW, EVENT, "bowGetState, aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
  2897. aucPeerAddress[0],
  2898. aucPeerAddress[1],
  2899. aucPeerAddress[2],
  2900. aucPeerAddress[3], aucPeerAddress[4], aucPeerAddress[5]));
  2901. DBGLOG(BOW, EVENT, "bowGetState, arBowTable[idx].aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
  2902. arBowTable[idx].aucPeerAddress[0],
  2903. arBowTable[idx].aucPeerAddress[1],
  2904. arBowTable[idx].aucPeerAddress[2],
  2905. arBowTable[idx].aucPeerAddress[3],
  2906. arBowTable[idx].aucPeerAddress[4], arBowTable[idx].aucPeerAddress[5]));
  2907. DBGLOG(BOW, EVENT,
  2908. "bowGetState, arBowTable[idx].fgIsValid, %x, %x.\n", idx, arBowTable[idx].fgIsValid);
  2909. DBGLOG(BOW, EVENT,
  2910. "bowGetState, arBowTable[idx].eState;, %x, %x.\n", idx, arBowTable[idx].eState);
  2911. DBGLOG(BOW, INFO, "GET State [%d]\n", arBowTable[idx].eState);
  2912. #endif
  2913. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2914. return arBowTable[idx].eState;
  2915. }
  2916. }
  2917. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2918. return BOW_DEVICE_STATE_DISCONNECTED;
  2919. }
  2920. BOOLEAN bowSetBowTableState(IN P_ADAPTER_T prAdapter, IN UINT_8 aucPeerAddress[6], IN ENUM_BOW_DEVICE_STATE eState)
  2921. {
  2922. UINT_8 ucBowTableIdx;
  2923. if (bowGetBowTableEntryByPeerAddress(prAdapter, aucPeerAddress, &ucBowTableIdx)) {
  2924. KAL_SPIN_LOCK_DECLARATION();
  2925. KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2926. arBowTable[ucBowTableIdx].eState = eState;
  2927. #if CFG_BOW_TEST
  2928. DBGLOG(BOW, INFO, "SET State [%d]\n", eState);
  2929. #endif
  2930. KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
  2931. kalSetBowState(prAdapter->prGlueInfo, eState, aucPeerAddress);
  2932. return TRUE;
  2933. }
  2934. return FALSE;
  2935. }
  2936. #endif