wlan_bow.c 122 KB

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